From 8a1388608c49f2050be060eb8bfd5c2b175fb455 Mon Sep 17 00:00:00 2001 From: sexygoat <1538832180@qq.com> Date: Fri, 30 Jan 2026 15:39:19 +0800 Subject: [PATCH] =?UTF-8?q?fetch(add):=20=E6=96=B0=E5=A2=9E=E4=BC=81?= =?UTF-8?q?=E4=B8=9A=E8=AE=BE=E5=A4=87=E6=8E=88=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 2 + src/api/modules/index.ts | 1 - src/api/modules/myPackage.ts | 45 --- src/assets/fonts/DMSans.woff2 | Bin 12128 -> 0 bytes src/assets/fonts/Montserrat.woff2 | Bin 12700 -> 0 bytes src/assets/styles/app.scss | 15 +- src/assets/styles/el-ui.scss | 30 ++ src/assets/styles/reset.scss | 4 +- .../core/layouts/art-header-bar/index.vue | 26 +- src/locales/langs/en.json | 7 +- src/locales/langs/zh.json | 8 +- src/router/routes/asyncRoutes.ts | 48 +-- src/router/routesAlias.ts | 8 +- src/types/api/card.ts | 28 +- src/types/api/packageManagement.ts | 86 ++-- .../asset-management/device-task/index.vue | 310 ++++++++++++++ .../index.vue | 143 +++++-- .../{card-search => iot-card-query}/index.vue | 0 .../index.vue | 181 +++------ src/views/dashboard/analysis/index.vue | 61 +-- src/views/dashboard/console/index.vue | 43 +- src/views/dashboard/ecommerce/index.vue | 103 ++--- .../package-management/my-packages/index.vue | 382 ------------------ .../package-assign/index.vue | 40 +- .../series-assign/index.vue | 329 ++++++++++----- 25 files changed, 978 insertions(+), 922 deletions(-) delete mode 100644 src/api/modules/myPackage.ts delete mode 100644 src/assets/fonts/DMSans.woff2 delete mode 100644 src/assets/fonts/Montserrat.woff2 create mode 100644 src/views/asset-management/device-task/index.vue rename src/views/asset-management/{card-list => iot-card-management}/index.vue (90%) rename src/views/asset-management/{card-search => iot-card-query}/index.vue (100%) rename src/views/asset-management/{task-management => iot-card-task}/index.vue (62%) delete mode 100644 src/views/package-management/my-packages/index.vue diff --git a/index.html b/index.html index 8e03a02..4803c3a 100644 --- a/index.html +++ b/index.html @@ -4,6 +4,8 @@
CUCAwU>Hb!Y~RrF4RLyV@Y~U!F}) zV2dmJty$fi-duWv``M38z5ZZT3#5)eWzTZ9tIt4+IqEL$4fqX&OV|T&p)ca zE|SOhJ+l0^Yn%tKi0VU5K&&4FT?Qi4lx`x>#C(l&A@2GClHq|+FUS|G3(cvmSWK@q z!pJz2cKM!cWWnam@*{F`TcPZ%Sg(dk&3}G1CoqPN+9YIx+P&oUrnMr9*;9#;^flw0 zrtX)yA~pLj80Rvf=y|o>nUIR0f<9dwaB}FY?4)z>nbjIeIRCt>o0L*ufB;G^Zld%F z?@F53D;~q6`yZ#ROCkM7D2CFFrbY~Q0ET!N`wm$?`X20`Dx?#|9{!FeK~yd4wgd{w ziz&AS=)$#T6(zbLSie8fE)R5tE99oXr49RrY!i=P`I8Cibjs6s>a@f+f-kBQDRI-Z zY7%(;h+wqa-Tk% CCv1z4(PtzJ z3Xmj}q3R8s=^I8dtDr;_AL~i!4w)F$Z$XlDMy?wi{~C<5&Ztjaid2RU15VBihFc5X zXm%Rl5Iw;_rr1@b)M-KXcNCuKy4pv{wm=~k!Qqw>?is30R6&A1Hn-dXv!yL?AET2g zhYB6bLa#cO {K{L+6pd4AuPR{Vss~>O0#;S()7#m3I!9%WB_cgG0 z=Ci9~T4LjJ>WK%1PTek(7fobKwrL$($gVx?h%J|`mj|q+_Tt;_hTUSuXe2#_t2mx- z4F(g6D+a(sLd>?rc-T48=@wc(ZE1CiqPUJL6yw-ABcc*G&KtrP()dg`7})RW=F*GW z5kdLKuI=u`c( _zp}&=KljD|>M+wVS13`^{2op;6FSJZ zD=1(kI3Yt~2I z~ga4= G7 zG2msJAMyJQ;Mr$U%%IG W5NtmXU>ky5yN4%Ju^*aKq4_Dl(U%(t49aPk1<#!P4Pcmo&9~TbwES=H! z323*R%ykc`@oc0$L*1|cR)WmV8>qp-mM_#PgFnQr;j8DZm{Qqs3h|OdFIx$rrAR7U zueT#|ToT@r)>&1I;^*Bdq%>DPXmn{p6*O!*B;irrIWr)s)DYXE3kpH)-iC66Y M@C4nN>lTlr+KZEtS_DU|3>X6sO`{9U`36 zXv1UJc_ZQ({@Fh?TVDSaRo`xIf?;uf^{vc}DKj{p?-xcm75N$ijh9G*F~-9@u{VrV zaaZn`pDfx>l$`RD$9X+23#d(KJhV0x&8BVxaV*_fqCj7yi|dQ5UKETx=*Q-~J_$cJ zh(i+cGKn}-JoABcCc5Eg!ZY^08m`PUnSldQ#D1|>Rh8@8^tsDewG`MD{QW7bDDD_Y zl7&Pm+Y0k#1uVv3=6sx7(f8@S7jR{~6lzEkSuLpH`Ct?fA7K^i2-^ZUBF$#3*OwZ} zJXx`iC`s7fpi{C6$Ei=>v~CA6swSGXoJmw^eNv_K7dDiu1X`GOZ`i$P6)W1kJJ7B( zfUSwIcc%r#868dfll0$4-&kT8a^I64vA}AfEjZ+lh8{;(?p=qCiKf#2%6ZA)3<-mC z!Q#5}QWZx=lQ!?z*enUa3UU4&i&hKkG)HY}zcvHK|2@v%uE%Z@8CyXwUS6bdGI0xm z`{^hT7co=8f;eqP<;rfen%T5`3a^3Z9 %N}vb-v;O2xIz)X=xn!z?4}&io3o@6|{pN=p^w?zru+ zW!u(dx@T2pCI1kATwdqo+4)YAy5FjgGy%9@_b_zJbouWL(P;u+87IRx^ bGnm@Y5+5Ds1xDQ9Rbu)o@v|$~e>}WuvAX?-=i* zj!+4I;Spp?^!8;W%{c7N`-M4_#f%AET%Mg#6)(pvh8~hU&WK{8+96pOvrS3gp??NM zUYLh(kU>_0@i;W^UixiC2;$Lye$vtVadnK9tQ?or?~*WGnt1%f;}*Vv1ka_NE78#o zxT8yrOZNC^f#0`#NB=Ohhyl&uKvedq0S7|J-UAYc$~79w>8j^lVc*v5ZWWg(2(PsC zIkN d{$SMf!k!6yTF4Iz9Po z)az^;6&P>12o9CXq#W^pcrOI65yqnYWFxkh^opo>(H_~rq@QCRk*@QJf%BqqC?Q NkhPRD@}(Ce%0q9&Y=F0YMTl^XMh1J@O zX1Nf0g0bIPb#7CKw*;`1Fw&T4i>1bs7Pm{R%TSq&HLbE3CMXf`pI<|_)Vd4yj-WOC zqg4M;(;j5`x9(hI!D)#nRN>o&pkh ow73DHwMsJiF#&RfZx22v`3S4{Ep0s}-mOOKRNOtYIG4552$?H@g;$ z&i-5V6ntgt&UXwG2Aqj`@#f1 |55^@Dc@7!R|!67!am*j^oAI0t}*ycq$5 zh}-~Tl@Ldd*?rgq$vIpHGxy<0A6KwQ=0O4!qQCrl7Xt))1Stdw<3!@qul`I6R7M~4 z*X>kp;Vf1Rd1if<)g<*tR#(P{(Dfr`z#{fAjON6d9KqQg&50hcWj!$Pur+YP0XUIB zpbxG89f`v@^W#Irff+A0oG#DXmK`_lh;n8TZ#~wG04?R{GQFotm^3BRb0xiJuE(1c z$Z#bYTL`%DtPJ<10+LW)sOOBc-zo$U=5=#K%mRk(dGluPU)}vlNQLtt6D2^51VNHz z3O81nI2Gzlpw_5Bvlb;V;4|PGW$bPG3zvt|ck+LM9LtU|m=}Y&@o?IM6I0NTN8BVt zhmaERJxVki&3@(cad&-KT?sq?Kh`b4{`;lHd2sT6wW0#f0UAJ;&^2@iJzC+vhw4ft zym%aKc=sG``3nQP9j4Le(k=U+8y+C@$``yVe?p7i-T*(KuXH7nf?vnO(kY~SJQa<$ z=flP|`dvzpbtGJNHRfJUjh{&c1Qt-5NpO!sUn2%Wh>i#Zh(t8RM7jw*#6WaK+aJC= zBzKh?xymVojHEx&HS$n-urZK)q(5jUx`Sb*PEIm?L%3;+Xp3x%))u`jhRmD^1xPB5 z&^;(KHRwaQ3=PQ8VuqoD$+xcy9}dZeQ~?3>){rVs;C&E^8$?N=R4l%lAycI9! BuARiE*M|r7Vxsm8e4anVPUvK*Hj+-1i)Bmq620@#z7R-Wd%VN6wN6l*8<}l zj7idO9g>L1gEJoq^6ZWQ*4eK=w&xKa_OK^{DZoCygW2pt7{Fs-{4RWGNC0)S=!}J~ z0Awd00>;822m=NTgaH#_N8Bn=Apm cG}32R!s+buMhSzscmW}Wlr%aA!Sc_QUR2VQc=6Dh1LtK7YX%+ zMp`XEFBCTc*2g`mJrx+;L77sPkHmxW|9hKkSAY!w?OwqDr~df-xj%Y!ba?a#0H3`a zoijQ#x^lF5)MwQ5@vX->kFy_LdvqBPz>>hG9)P$qE9qx3F3e*8XZx -XA) z=#Yva6D3BXB+2Bmj5W@96J#q=qEwj*m6YnJs5R>GORtyiIO2g(5B=@8&*A!_)reOH zeGSidFKo9XEN^^rJZ#&vxn_^u_Bw`y!O; eP6apGl4l_p)ZiSp&hRUpq33bm?Kt5L651Cc^ne+;|oqRXzh z1VOD94~Q58$mK!I1%2NG47mzWZwF;xfP}S|0R#+`%8oF=dT{8-Bp`-cXadJEA49Wk z0zzDMA`(_auScV&(xcKFLjKrQ!l+@{D3-d}+qpu(RHdyw5frtcc!d-|jCW&cx`i@# z5_ET>O+G3yAc5~i#c3z2Mt$_C=Ri|pk=aXStt~{wA!;@?fB^oKM>d3}l-XuYxVAil z!=O`$xvgd-0$Ma6r)x~%QcC%AZYW nDgB60wXX3MlLg8r9N-0iOqXzt z=P}0g`$Fi8iL*<*y6Qy-(_l9}G^fj9QP0hiB~m~3;bG$k=Z>!1MXVyAymzA1fN)&g zRh3ZKq6+nGm82Rz9jfGwFLdRzUg<@)NaYk(Xle4MiFy~H%DUygp~(cGNL5Ps&5`2$ z7z>C96D#4PYY+< a-wC~SYe =C`3Ut{*n5d{QeWUn&pj0z!Dg#S|8Vb7um0zL z(_Yl9r P69N;xtIe9 zA9XghSgB(6Ipk^<4(-Pn78J3|8<%QLfP`h!FHqveZrYgu>F+DYa*JfC CRphT=w_LP$xOeDmKWc?1eoE2S z7UTJ}fygfGDDz@Lwql3zpz6I;Hn}0S#TVru={t$p?vUTR)rt`SRM+6=c=!M%*|4O% z K@&(Fi(_uAEL^jKG>^ z@qUQ#58h|=@Hs3j$Ul|W`h8nk>=VS7NsZLLSl5y$b2EmNX6dPNJ~ 7G3=8}C+}4HC_~!W>d6-noLXpFpF>>DJ94a5u6gsn1>K z>x=iY SfffsVhTbKXocp+D!gjyFEr!PbF5Q}iqsb0H< zyX^`~pN~WQ5&5WdC6IKBN(Y7$ulp+)B+DVxHk&O 9%rslTAgW3dldome{4}*%m46K)LQ1s~WreokMBe zScJneQY tRw{E<0;`3*Ob~!FGhs`n>{VXV@ zR~Pd0*Vtil2|F`6Lnk=^rKr=Xq~N^7-=Ti_zL^Wwq{{Wm?EZ~rd^&!p+J8WBA}>%@ ztLK6Av!Ygms*}$shUc`i&MQgW3>ymWYe#&@? MDJ+F;Ja+PKwHSza5OXG4p5#)e+`?I1^eR8E&_ap$Wf9_4}IP>DQ zmk4u6y)osc=dZ|di+{v8skRYr8WOk}-arQ&yWzEISCf^ji@b;6sva|f^FF 0)SXKN^&X*~aOt|Nc7g> rw-7u&nsJP9R2STAV7TGVG9IqVsAntzU7n?7Lt@T}Ob ^(PeWQgJ6}z^cZu7JzE*Vv2qfw^Bv9rndxATX z2-Gy3_UyMzvz8UHt%yCXPEM9_oOwMQ&FoejbviJT-W*iq4)~BV%pqg5wc^c(nU_{A z^0|uTx@JLG1El=&qnJ~>fB9ysZvgZ9ihuq|e((bQ^lh1c{P7qQm+;rG_1A>is oj0Y2DB`I+C~jhK1^ zmX| e8wQ_YXqQqZQ6bk0tM zVWlg|Qx7L{3sqhuGPivGAIKl^JcF5(+T;JDcY_m*Ml5a!{s6mEJkyosrRq5@S7%m~ z=8b!t3*?_X*_GrX#(IIrEvj*0!iu>jBa-ADee%h41!&VSTMiW`wkMN>sd~#NAp?mn z8#Ox^qGomLBnIH@T&1y19sC-sX~WWmj>QuDQoMgDE7~$EOY>&D-ubc{-=C`Gpm>A8 z3zk7ttC(uVkUG}8o3a*&TFM7o*`W25z2APp(SOV9c_XYJ+NKW!=ugpCE1vFthjNz8 z-MSsH*xS`bjo|cgEVAuvhLYI!wd| jZAMu*PTvW}Gp2eM$Ak zz_|k)H4bcp9rJczz43-na9+F@lZ1y2*;;iOXwwXfbZE&sr$cI<1xLQaz~A^cwH47o zupw6a4F(R)4*TFW6blBd4?>51`-I6_iX!V%DYO3tB`Uj38|G85T>V4K({G(zXz6a& z;U4Fk>PwzB47lVT6l)}Dt0S=f>~HVk|8D(deN(&F75m`JN%vfN^6iLL$ZYcGB@6gJ zQI;`UEYr!CkXofW+^US|+w-<9y HTv>v*dGH 988 `)MU-mYr78|tjMRW<8x3@ikp=DqaQ_Q|=bs;17Vs~jt;EsJKDA^A$jO8c8LrUiCS zYkT M{}CUJudJMMQ?)v8qPa(rVYf0c(roia2Ue#I%Z5TP&By45&Qby^8=L+|8u9 z$L%q9PbJ($z2YXZ&BKvuBXUK|uvUu1q~*JRfVffa1r!8TPY^vGFVWp)qRb5_))fvJ zyBiFcp}u>@QG+~YYc)mHEL0KKn*N1%469| E|-h(n1 z+z+hD8E^1SC5iA7xv}n6(&3_*M#>8RR xXeRah`_|E#2E0D!0Xtf|M;U)sG)EPkBObKkGAn%Hj9N)BF-fglP9Iz z<9RX)ttN<@gI|qd+jQS2oh5Qp85_(V%DmY9UeqnV+>tN9#AKP>twa4Fkxc5nHoH3( zjs9u<5D02)&{)isGF3<;&bPFX6ANC#s>Hgm5ksSO5EwzkC420Tqo0d^5=kG-HSMNf z*PHb~PY?>3x{{Jv`9Xh>(s)IJ5Rx7j!NW63YJTvH 2TrIYRUjr@h1cM9u# z;4b`FrnG7;uF#-#?lk;q1(|zDT|57}B!3TXn&)8fNGoD|b^l=GCXaj8+Rkc}PG@Aj zRLEn#xAW*f;KQAASE0xzk%}y?Lix(FNF^o4%GoNys8A9Hm53=Y04lnNyT6B1;}HpK zU3liz5h_b)D3+J~5C#s?*A}$yXlW75+{a)8+wxxA5Hl%emy{5uE(4Mv7++N2#E$oG zV6QcR=UI^5HT6>y)Nl3~N;nMRs#yw;H7U}DbOmWRWP8j?k)FZ8P%_~!XmMd$o0u$$ zQy3PdD&(p!#`P`?z3Lfmzj3o>PH!&OYZ5Igz&oaF8<1BIlzU>I9=jyiW7!HOkW?qs zQ#iQIm59XMm{@>KW<@rzN@igdrW_72uWpt?8#m}RWz8DkCleihd|Okuch{ n+{m7VG8zQfRe#RDHbhG3649GW7=f`|c+PLT$XL=A=GHI76g>A>+M70-7! z@L{(`hxi+X4o8y^_3JdSyNU0T`eOu)l$bo8gh{W95@2k%p1b!pcX@XQgQ@8|S;lcq z6HhqQqEK52M`y0v)r6MLCZq@V@ p^|OO-Zj_V z>ur>3gPMYLOlcpNp7P!m4A{v~7t~Xe)+}}<$|(#hqpH-Z8{>{13BBzZwvn4VYhH7) zUYF=p0sS#0Iglb7h&Oa$&61tOCg3I26*MpRokFNf cv+Lmjwn4GF)0>{2_HwR3UFkEm@PDi#Ne@PRq2-=2dvke6v$!_CnN0; z89@@s#Mbv7VEmNhVktn@#913XAkCD zd`#6lPagg~-NWPg^%Z7yX@!Ew-m2&G-_E3BLHAfC_HjcB1WU=BZVqp$C3mEJ2ba53 zt@yv2(G>xU2bK&MOqmSzRI}cm2A|`wk9m&8+2hO7>HS%IIIMGi<`yF wpIrS7nUd-Zmpf63RtT7T9;aQY~`~p>ulNAX$V0Y `i2pkGUcoXn Qi&>snfm*&Fz;ss|oilAISM2Q<1UvM3~r+RGe&g7`V`t@ji|IUIwj?PU{C{{}>)k zPd}Q$Y69PM`$Ul^OP2;dQx}uEYW1Ck3kmB8sPC3ZH!ucCZL$7Y`$H#v0@At(naT7b zD@iXv3h2qK7laHaxcV$^g!@O%$FCKzDtkuwe^5@A9>Cq4#Ri^z_fOJT!I6NSm*SBA z_vS@bH?06Epmk@xFv(1ywR`(TX^Xr?58ms3n(`vhzcmaqfZsiTRXn77R}H!S3IVsK zdT%cTGQZvTcl68;86%n4wV(IGi&GenFff89m!S7*?EL;)FnmS71Ibts3omoPerV|M zko)TqFdP1p{g>MI!K2E?FFRDrJ3Bg4mUCv?3Dr&!eiR$srk|*- DqtULUXIvSrzVw+d4H `QzE{i`&gvbF-j94jH8?0tZjjuOC%o1O@(Vc^h)B zLl69OPpk<#zFoR&KA+RDcI;SwC@HZ@xFHx8tXZklBH?9Bm~tM;bWV~)Mka@Wam4ra zVrvGbE(v5Qfzkf2lm^=bk^=1NU#~C3UZ0d*-lA^-{~&xbjK4nlKOA82U~-3PYLDqa zWtC~)^q!-5vigv5T8C+OMUdNL$CQfiw4PZbE0^KZ1hPrFA7_>j#rjo^$qnjQY!lp2 zr(YY1=+@QOZP3NU)wJ{A&01shs 7LV_ AD`qv z(vGEpz(Uo9y)Jp0jg|>y`bm`#Qkcs)WG*rKO=Bm+PZ!xJDU_?+U`{osuhEDVm}AE% zu4@9uG 0?gJEeaVUo6? zTAP%rM-oa^0!0O5qlm&^IPYXaA6sbR^2|~xFmi FF*H4DM%YSl@R@Pw)woX*}Ueh+25gNncoCGfJ(GbdhVj`u~kZj&@g zwzYzfriyF=zC|qJTWx%iSg^)LtEmN-^E{tg=YQs+@?D>y-94%4AnF%ntTj!Ckk?sa zD#7ic8kpaix+y( sbe8hDV+vC@SX4Yyq0tBf!507VOzw(Hg^XL_=_R_;o_~C43aSpQxHJL$k0YmZbx$%tM zOkwJ19)o;$Q~u&RHAXl-3#^$hQAz>r{={XIQtpjR%lVU@aX**Ahzjq|?YAy`0t}H? zHcKvVhT16od_Ay5a(=N%IX7(}oJ9YQM*Egd|At2Y05qyod(yD?)U@ujw4RL$f@x{V z+#0a6q-L50jaX$ZbgX@`^dr2yZK-T2RJ~EQ@yo^Zucp>sdG8PwZIgUc5Y{CbA%tak zqD~H1eDjQwliyVGu0V)$C>q627*cTOXM&b% zD%qp-TDh9@?pE7w(x@C|Jh&Q(x|FvikVr&4kzS5GX)a)#35`Y;ffyw(mY2v& pU%vNqOF(@e1s#NBALa6{}bjP`~1 zxf|M-L%5Cx#Km3bqMZ~C%fslZd=*^}Uw07QkZ+({&Mmu8h2}wOmukb+t>EyU{JBv8 z>WV6Y5_LhHc;kV*09>we%0;fTnp?HQMt_f iVf-P9gjP lbMECaX+Z~i8nlrc 3-;+fKdr02T(z;E zO;sY$yM#x~hZ<3=lHR;d4B;}64^#Ff4{ ?j9dhhEQ+jOGoBp5m5_SR>AFPRRNwJz-R4D_(xre*OGn%lx$=xtA6 zaq3sT^to@ Au)9F*cBuS=vctTptN_Xtf}7W=JMgADC)<*1I$|Parsji!LH@gZo__~D zkjPJw?D{B0^9pS88heFO1)Smfce9wJ!H6 HmVHYVgHjb8U4e=|k6(m;e1S>OJUECRAdwU47eTcM+4^DqJ%JM7os zQK};jY+Q&Q8cZe50*X9i-qrfzFQwP@vY{FuDhFWXU &j+RiO!1=WZUSPbDHgFuLbR7ix-NNo0^jC2YD zumB-A84kP0mtB$K{59+t8$n9HiwNA{4L-BH1MQp_LgL)|;_frvFR^i$Y6{~XXO-mP z-O6#Y{H2P=WT7A;N|L~cQGzM4I_(0%{se{@A*3B_)jROk+r*T4$b&NWaaM31REu;0 z^FjlQIR&s%
nnES2c^!m^3J<)dST%rz zM6puu?_;%mVhYtNNyJgBP^yqho(vW8NaAhS(Lqz>rHQAKC??{0JnToz?e>~VWk?W4 z8p<{wS12WpA7w-)g4fkWwPBHuwRo&pbi-~?IHhU=g_zi>ATBQ9+q%i3B*;=&IT2ev WQb VU0002(yLrR_ diff --git a/src/assets/styles/app.scss b/src/assets/styles/app.scss index 3062781..041be08 100644 --- a/src/assets/styles/app.scss +++ b/src/assets/styles/app.scss @@ -1,17 +1,8 @@ // 全局样式 -@font-face { - font-family: 'DMSans'; - font-style: normal; - font-weight: 400; - src: url(../fonts/DMSans.woff2) format('woff2'); -} - -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: 400; - src: url(../fonts/Montserrat.woff2) format('woff2'); +// 强制所有元素使用小米字体 +* { + font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important; } .btn-icon { diff --git a/src/assets/styles/el-ui.scss b/src/assets/styles/el-ui.scss index 95bcab0..4e623f9 100644 --- a/src/assets/styles/el-ui.scss +++ b/src/assets/styles/el-ui.scss @@ -9,6 +9,8 @@ // --el-border-color: #E4E4E7 !important; // DCDFE6 // 按钮粗度 --el-font-weight-primary: 400 !important; + // Element Plus 全局字体 + --el-font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important; --el-component-custom-height: 36px !important; @@ -180,6 +182,8 @@ // 修改el-button样式 .el-button { + font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important; + &.el-button--text { background-color: transparent !important; padding: 0 !important; @@ -198,6 +202,32 @@ border-radius: 6px !important; font-weight: bold; transition: all 0s !important; + font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important; +} + +// 为所有 Element Plus 组件添加小米字体 +.el-input, +.el-input__wrapper, +.el-select, +.el-select__wrapper, +.el-form-item__label, +.el-table, +.el-pagination, +.el-dialog, +.el-message, +.el-message-box, +.el-dropdown-menu, +.el-menu, +.el-radio, +.el-checkbox, +.el-switch, +.el-date-picker, +.el-cascader, +.el-tree-select, +.el-upload, +.el-card, +.el-divider { + font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif !important; } .el-checkbox-group { diff --git a/src/assets/styles/reset.scss b/src/assets/styles/reset.scss index 9a25580..c81c5ca 100644 --- a/src/assets/styles/reset.scss +++ b/src/assets/styles/reset.scss @@ -34,9 +34,7 @@ h5 { body { color: var(--art-text-gray-700); text-align: left; - font-family: - Inter, 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', - '微软雅黑', Arial, sans-serif; + font-family: 'MiSans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif; } select { diff --git a/src/components/core/layouts/art-header-bar/index.vue b/src/components/core/layouts/art-header-bar/index.vue index 0be6dc2..2d2600c 100644 --- a/src/components/core/layouts/art-header-bar/index.vue +++ b/src/components/core/layouts/art-header-bar/index.vue @@ -24,7 +24,7 @@ - + - - -+ + + + + + -- -+ + + + + +diff --git a/src/locales/langs/en.json b/src/locales/langs/en.json index 47eef9b..26ba8d8 100644 --- a/src/locales/langs/en.json +++ b/src/locales/langs/en.json @@ -433,11 +433,12 @@ }, "assetManagement": { "title": "Asset Management", - "cardSearch": "Card Search", + "cardSearch": "IoT Card Query", "deviceSearch": "Device Search", "singleCard": "Single Card Info", - "standaloneCardList": "Standalone Card List", - "taskManagement": "Task Management", + "standaloneCardList": "IoT Card Management", + "iotCardTask": "IoT Card Tasks", + "deviceTask": "Device Tasks", "taskDetail": "Task Details", "devices": "Device Management", "deviceDetail": "Device Details", diff --git a/src/locales/langs/zh.json b/src/locales/langs/zh.json index 6430cac..559f820 100644 --- a/src/locales/langs/zh.json +++ b/src/locales/langs/zh.json @@ -406,7 +406,6 @@ "packageAssign": "单套餐分配", "seriesAssign": "套餐系列分配", "packageSeries": "套餐系列", - "myPackages": "代理可售套餐", "packageCommission": "套餐佣金网卡" }, "accountManagement": { @@ -437,11 +436,12 @@ }, "assetManagement": { "title": "资产管理", - "cardSearch": "单卡查询", + "cardSearch": "IoT卡查询", "deviceSearch": "设备查询", "singleCard": "单卡信息", - "standaloneCardList": "单卡列表", - "taskManagement": "任务管理", + "standaloneCardList": "IoT卡管理", + "iotCardTask": "IoT卡任务", + "deviceTask": "设备任务", "taskDetail": "任务详情", "devices": "设备管理", "deviceDetail": "设备详情", diff --git a/src/router/routes/asyncRoutes.ts b/src/router/routes/asyncRoutes.ts index 0b28ada..04dcd17 100644 --- a/src/router/routes/asyncRoutes.ts +++ b/src/router/routes/asyncRoutes.ts @@ -620,15 +620,15 @@ export const asyncRoutes: AppRouteRecord[] = [ icon: '' }, children: [ - { - path: 'card-detail', - name: 'CardDetail', - component: RoutesAlias.CardDetail, - meta: { - title: 'menus.cardManagement.cardDetail', - keepAlive: true - } - }, + // { + // path: 'card-detail', + // name: 'CardDetail', + // component: RoutesAlias.CardDetail, + // meta: { + // title: 'menus.cardManagement.cardDetail', + // keepAlive: true + // } + // }, { path: 'card-assign', name: 'CardAssign', @@ -721,15 +721,6 @@ export const asyncRoutes: AppRouteRecord[] = [ keepAlive: true } }, - { - path: 'my-packages', - name: 'MyPackages', - component: RoutesAlias.MyPackages, - meta: { - title: 'menus.packageManagement.myPackages', - keepAlive: true - } - }, { path: 'package-assign', name: 'PackageAssign', @@ -900,7 +891,7 @@ export const asyncRoutes: AppRouteRecord[] = [ }, children: [ { - path: 'card-search', + path: 'iot-card-query', name: 'CardSearch', component: RoutesAlias.CardSearch, meta: { @@ -918,7 +909,7 @@ export const asyncRoutes: AppRouteRecord[] = [ } }, { - path: 'card-list', + path: 'iot-card-management', name: 'StandaloneCardList', component: RoutesAlias.StandaloneCardList, meta: { @@ -927,11 +918,20 @@ export const asyncRoutes: AppRouteRecord[] = [ } }, { - path: 'task-management', - name: 'TaskManagement', - component: RoutesAlias.TaskManagement, + path: 'iot-card-task', + name: 'IotCardTask', + component: RoutesAlias.IotCardTask, meta: { - title: 'menus.assetManagement.taskManagement', + title: 'menus.assetManagement.iotCardTask', + keepAlive: true + } + }, + { + path: 'device-task', + name: 'DeviceTask', + component: RoutesAlias.DeviceTask, + meta: { + title: 'menus.assetManagement.deviceTask', keepAlive: true } }, diff --git a/src/router/routesAlias.ts b/src/router/routesAlias.ts index 9c69d28..5f28e20 100644 --- a/src/router/routesAlias.ts +++ b/src/router/routesAlias.ts @@ -72,7 +72,6 @@ export enum RoutesAlias { PackageAssign = '/package-management/package-assign', // 单套餐分配 SeriesAssign = '/package-management/series-assign', // 套餐系列分配 PackageSeries = '/package-management/package-series', // 套餐系列 - MyPackages = '/package-management/my-packages', // 代理可售套餐 PackageCommission = '/package-management/package-commission', // 套餐佣金网卡 // 账号管理 @@ -92,10 +91,11 @@ export enum RoutesAlias { SimCardAssign = '/product/sim-card-assign', // 号卡分配 // 资产管理 - CardSearch = '/asset-management/card-search', // 单卡查询 + CardSearch = '/asset-management/iot-card-query', // IoT卡查询 DeviceSearch = '/asset-management/device-search', // 设备查询 - StandaloneCardList = '/asset-management/card-list', // 单卡列表(未绑定设备) - TaskManagement = '/asset-management/task-management', // 任务管理 + StandaloneCardList = '/asset-management/iot-card-management', // IoT卡管理 + IotCardTask = '/asset-management/iot-card-task', // IoT卡任务 + DeviceTask = '/asset-management/device-task', // 设备任务 TaskDetail = '/asset-management/task-detail', // 任务详情 DeviceList = '/asset-management/device-list', // 设备列表 DeviceDetail = '/asset-management/device-detail', // 设备详情 diff --git a/src/types/api/card.ts b/src/types/api/card.ts index 40acc9b..e4fa7a8 100644 --- a/src/types/api/card.ts +++ b/src/types/api/card.ts @@ -256,8 +256,9 @@ export interface ImportIotCardResponse { export interface IotCardImportTask { id: number // 任务ID task_no: string // 任务编号 - batch_no: string // 批次号 + batch_no?: string // 批次号 (可选) carrier_id: number // 运营商ID + carrier_type: string // 运营商类型 (CMCC:中国移动, CUCC:中国联通, CTCC:中国电信) carrier_name: string // 运营商名称 file_name: string // 文件名 status: IotCardImportTaskStatus // 任务状态 @@ -266,10 +267,10 @@ export interface IotCardImportTask { success_count: number // 成功数 fail_count: number // 失败数 skip_count: number // 跳过数 - error_message: string // 错误信息 + error_message?: string // 错误信息 (可选) created_at: string // 创建时间 - started_at: string | null // 开始处理时间 - completed_at: string | null // 完成时间 + started_at?: string | null // 开始处理时间 (可选) + completed_at?: string | null // 完成时间 (可选) } // 导入任务查询参数 @@ -323,24 +324,27 @@ export interface StandaloneCardQueryParams extends PaginationParams { export interface StandaloneIotCard { id: number // 卡ID iccid: string // ICCID - imsi: string // IMSI - msisdn: string // 卡接入号 + imsi?: string // IMSI (可选) + msisdn?: string // 卡接入号 (可选) carrier_id: number // 运营商ID + carrier_type: string // 运营商类型 (CMCC:中国移动, CUCC:中国联通, CTCC:中国电信, CBN:中国广电) carrier_name: string // 运营商名称 - card_type: string // 卡类型 + card_type: string // 卡类型 (physical:物理卡, data_card:流量卡, voice_card:语音卡等) card_category: string // 卡业务类型 (normal:普通卡, industry:行业卡) status: StandaloneCardStatus // 状态 activation_status: number // 激活状态 (0:未激活, 1:已激活) network_status: number // 网络状态 (0:停机, 1:开机) real_name_status: number // 实名状态 (0:未实名, 1:已实名) - batch_no: string // 批次号 - supplier: string // 供应商 - shop_id: number | null // 店铺ID - shop_name: string // 店铺名称 + batch_no?: string // 批次号 (可选) + supplier?: string // 供应商 (可选) + shop_id?: number | null // 店铺ID (可选) + shop_name?: string // 店铺名称 (可选) cost_price: number // 成本价(分) distribute_price: number // 分销价(分) data_usage_mb: number // 累计流量使用(MB) - activated_at: string | null // 激活时间 + first_commission_paid: boolean // 是否已支付首次佣金 + accumulated_recharge: number // 累计充值金额(分) + activated_at?: string | null // 激活时间 (可选) created_at: string // 创建时间 updated_at: string // 更新时间 } diff --git a/src/types/api/packageManagement.ts b/src/types/api/packageManagement.ts index 8d862ac..87deeaf 100644 --- a/src/types/api/packageManagement.ts +++ b/src/types/api/packageManagement.ts @@ -144,58 +144,6 @@ export interface SeriesSelectOption { series_code: string } -// ==================== 代理可售套餐 ==================== - -/** - * 我的可售套餐响应 - */ -export interface MyPackageResponse { - id: number - package_code: string - package_name: string - series_id: number - series_name: string - package_type: string - data_type: string - real_data_mb: number // 真流量额度(MB) - virtual_data_mb: number // 虚流量额度(MB) - duration_months: number - price: number // 套餐原价(分) - cost_price: number // 成本价(分) - suggested_retail_price: number // 建议售价(分) - profit_margin: number // 利润空间(分) - price_source: string // 价格来源:'series_pricing':系列加价, 'package_override':单套餐覆盖 - shelf_status: number - status: number - description?: string - created_at: string - updated_at: string -} - -/** - * 我的可售套餐查询参数 - */ -export interface MyPackageQueryParams extends PaginationParams { - series_id?: number // 系列ID筛选 - package_type?: string // 套餐类型筛选 -} - -/** - * 我的被分配系列响应 - */ -export interface MySeriesAllocationResponse { - id: number // 分配ID - series_id: number - series_code: string - series_name: string - pricing_mode: string // 定价模式:'fixed':固定金额, 'percent':百分比 - pricing_value: number // 定价值 - allocator_shop_name: string // 分配者店铺名称 - package_count: number // 可售套餐数量 - status: number - created_at: string -} - // ==================== 单套餐分配 ==================== /** @@ -276,6 +224,28 @@ export interface TierCommissionConfig { tiers: TierEntry[] // 梯度档位数组 } +/** + * 一次性佣金梯度档位配置 + */ +export interface OneTimeCommissionTierEntry { + tier_type: 'sales_count' | 'sales_amount' // 梯度类型:销量或销售额 + threshold: number // 阈值 + mode: 'fixed' | 'percent' // 返佣模式 + value: number // 返佣值 +} + +/** + * 一次性佣金配置 + */ +export interface OneTimeCommissionConfig { + type: 'fixed' | 'tiered' // 佣金类型:'fixed':固定佣金, 'tiered':梯度佣金 + trigger: 'single_recharge' | 'accumulated_recharge' // 触发方式:'single_recharge':单笔充值, 'accumulated_recharge':累计充值 + threshold: number // 最低阈值(分) + mode?: 'fixed' | 'percent' // 返佣模式(固定佣金时必填) + value?: number // 返佣值(固定佣金时必填) + tiers?: OneTimeCommissionTierEntry[] | null // 梯度档位数组(梯度佣金时必填) +} + /** * 套餐系列分配响应 */ @@ -288,8 +258,8 @@ export interface ShopSeriesAllocationResponse { allocator_shop_id: number // 分配者店铺ID allocator_shop_name: string // 分配者店铺名称 base_commission: BaseCommissionConfig // 基础返佣配置 - enable_tier_commission: boolean // 是否启用梯度返佣 - tier_config?: TierCommissionConfig // 梯度返佣配置(可选) + enable_one_time_commission: boolean // 是否启用一次性佣金 + one_time_commission_config?: OneTimeCommissionConfig // 一次性佣金配置(可选) status: number // 1:启用, 2:禁用 created_at: string updated_at: string @@ -311,8 +281,8 @@ export interface CreateShopSeriesAllocationRequest { series_id: number // 套餐系列ID,必填 shop_id: number // 店铺ID,必填 base_commission: BaseCommissionConfig // 基础返佣配置,必填 - enable_tier_commission?: boolean // 是否启用梯度返佣,可选(默认false) - tier_config?: TierCommissionConfig // 梯度返佣配置,当enable_tier_commission为true时必填 + enable_one_time_commission?: boolean // 是否启用一次性佣金,可选(默认false) + one_time_commission_config?: OneTimeCommissionConfig // 一次性佣金配置,当enable_one_time_commission为true时必填 } /** @@ -320,8 +290,8 @@ export interface CreateShopSeriesAllocationRequest { */ export interface UpdateShopSeriesAllocationRequest { base_commission?: BaseCommissionConfig // 基础返佣配置 - enable_tier_commission?: boolean // 是否启用梯度返佣 - tier_config?: TierCommissionConfig // 梯度返佣配置 + enable_one_time_commission?: boolean // 是否启用一次性佣金 + one_time_commission_config?: OneTimeCommissionConfig // 一次性佣金配置 } /** diff --git a/src/views/asset-management/device-task/index.vue b/src/views/asset-management/device-task/index.vue new file mode 100644 index 0000000..60f054a --- /dev/null +++ b/src/views/asset-management/device-task/index.vue @@ -0,0 +1,310 @@ + + + + + + + + diff --git a/src/views/asset-management/card-list/index.vue b/src/views/asset-management/iot-card-management/index.vue similarity index 90% rename from src/views/asset-management/card-list/index.vue rename to src/views/asset-management/iot-card-management/index.vue index 0e6f998..67b113f 100644 --- a/src/views/asset-management/card-list/index.vue +++ b/src/views/asset-management/iot-card-management/index.vue @@ -28,6 +28,11 @@+ +++ + + + ++ + + + + ++ + 批量设置套餐系列 +网卡分销 +批量充值 +网卡回收 +批量下载 +变更套餐 @@ -404,15 +409,10 @@ const initialSearchState = { status: undefined, carrier_id: undefined, - shop_id: undefined, iccid: '', msisdn: '', batch_no: '', - package_id: undefined, - is_distributed: undefined, - is_replaced: undefined, - iccid_start: '', - iccid_end: '' + is_distributed: undefined } // 搜索表单 @@ -603,14 +603,19 @@ // 列配置 const columnOptions = [ { label: 'ICCID', prop: 'iccid' }, - { label: 'IMSI', prop: 'imsi' }, { label: '卡接入号', prop: 'msisdn' }, - { label: '运营商', prop: 'carrier_name' }, { label: '卡类型', prop: 'card_type' }, + { label: '卡业务类型', prop: 'card_category' }, + { label: '运营商', prop: 'carrier_name' }, + { label: '成本价', prop: 'cost_price' }, + { label: '分销价', prop: 'distribute_price' }, { label: '状态', prop: 'status' }, - { label: '批次号', prop: 'batch_no' }, - { label: '店铺名称', prop: 'shop_name' }, - { label: '激活时间', prop: 'activated_at' }, + { label: '激活状态', prop: 'activation_status' }, + { label: '网络状态', prop: 'network_status' }, + { label: '实名状态', prop: 'real_name_status' }, + { label: '累计流量(MB)', prop: 'data_usage_mb' }, + { label: '首次佣金', prop: 'first_commission_paid' }, + { label: '累计充值', prop: 'accumulated_recharge' }, { label: '创建时间', prop: 'created_at' } ] @@ -653,28 +658,40 @@ { prop: 'iccid', label: 'ICCID', - minWidth: 180 - }, - { - prop: 'imsi', - label: 'IMSI', - width: 150 + minWidth: 190 }, { prop: 'msisdn', label: '卡接入号', - width: 120 - }, - { - prop: 'carrier_name', - label: '运营商', - width: 100 + width: 130 }, { prop: 'card_type', label: '卡类型', width: 100 }, + { + prop: 'card_category', + label: '卡业务类型', + width: 100 + }, + { + prop: 'carrier_name', + label: '运营商', + width: 150 + }, + { + prop: 'cost_price', + label: '成本价', + width: 100, + formatter: (row: StandaloneIotCard) => `¥${(row.cost_price / 100).toFixed(2)}` + }, + { + prop: 'distribute_price', + label: '分销价', + width: 100, + formatter: (row: StandaloneIotCard) => `¥${(row.distribute_price / 100).toFixed(2)}` + }, { prop: 'status', label: '状态', @@ -684,20 +701,55 @@ } }, { - prop: 'batch_no', - label: '批次号', + prop: 'activation_status', + label: '激活状态', + width: 100, + formatter: (row: StandaloneIotCard) => { + const type = row.activation_status === 1 ? 'success' : 'info' + const text = row.activation_status === 1 ? '已激活' : '未激活' + return h(ElTag, { type }, () => text) + } + }, + { + prop: 'network_status', + label: '网络状态', + width: 100, + formatter: (row: StandaloneIotCard) => { + const type = row.network_status === 1 ? 'success' : 'danger' + const text = row.network_status === 1 ? '开机' : '停机' + return h(ElTag, { type }, () => text) + } + }, + { + prop: 'real_name_status', + label: '实名状态', + width: 100, + formatter: (row: StandaloneIotCard) => { + const type = row.real_name_status === 1 ? 'success' : 'warning' + const text = row.real_name_status === 1 ? '已实名' : '未实名' + return h(ElTag, { type }, () => text) + } + }, + { + prop: 'data_usage_mb', + label: '累计流量(MB)', width: 120 }, { - prop: 'shop_name', - label: '店铺名称', - width: 150 + prop: 'first_commission_paid', + label: '首次佣金', + width: 100, + formatter: (row: StandaloneIotCard) => { + const type = row.first_commission_paid ? 'success' : 'info' + const text = row.first_commission_paid ? '已支付' : '未支付' + return h(ElTag, { type, size: 'small' }, () => text) + } }, { - prop: 'activated_at', - label: '激活时间', - width: 160, - formatter: (row: StandaloneIotCard) => (row.activated_at ? formatDateTime(row.activated_at) : '-') + prop: 'accumulated_recharge', + label: '累计充值', + width: 100, + formatter: (row: StandaloneIotCard) => `¥${(row.accumulated_recharge / 100).toFixed(2)}` }, { prop: 'created_at', @@ -729,7 +781,7 @@ const res = await CardService.getStandaloneIotCards(params) if (res.code === 0) { - cardList.value = res.data.list || [] + cardList.value = res.data.items || [] pagination.total = res.data.total || 0 } } catch (error) { @@ -1127,6 +1179,31 @@ } }) } + + // 网卡分销 - 正在开发中 + const cardDistribution = () => { + ElMessage.info('功能正在开发中') + } + + // 批量充值 - 正在开发中 + const batchRecharge = () => { + ElMessage.info('功能正在开发中') + } + + // 网卡回收 - 正在开发中 + const cardRecycle = () => { + ElMessage.info('功能正在开发中') + } + + // 批量下载 - 正在开发中 + const batchDownload = () => { + ElMessage.info('功能正在开发中') + } + + // 变更套餐 - 正在开发中 + const changePackage = () => { + ElMessage.info('功能正在开发中') + } diff --git a/src/views/dashboard/analysis/index.vue b/src/views/dashboard/analysis/index.vue index f14bca4..bac095c 100644 --- a/src/views/dashboard/analysis/index.vue +++ b/src/views/dashboard/analysis/index.vue @@ -1,37 +1,38 @@-diff --git a/src/views/dashboard/console/index.vue b/src/views/dashboard/console/index.vue index a2e8784..d9d44a8 100644 --- a/src/views/dashboard/console/index.vue +++ b/src/views/dashboard/console/index.vue @@ -1,29 +1,30 @@- + 开发中敬请期待... + + + + + + + + -- -- - -- - + + + + + + + + + + + -- -- - -- - -- - + + + + + + + + + + +- -- - -- - -- -diff --git a/src/views/dashboard/ecommerce/index.vue b/src/views/dashboard/ecommerce/index.vue index ec22e04..3fde32a 100644 --- a/src/views/dashboard/ecommerce/index.vue +++ b/src/views/dashboard/ecommerce/index.vue @@ -1,59 +1,60 @@+ 开发中敬请期待... + - - + + + + + + + + -- -- - -- - + + + + + + + + + + + -- -- - -- - -- + -diff --git a/src/views/package-management/my-packages/index.vue b/src/views/package-management/my-packages/index.vue deleted file mode 100644 index e0b7d9b..0000000 --- a/src/views/package-management/my-packages/index.vue +++ /dev/null @@ -1,382 +0,0 @@ - -- + 开发中敬请期待... + + + + + + + + + + + -- -- - -- - -- - + + + + + + + + + + + + + + + + + + + + + -- -- - -- - -- -- -- - -- - -- - + + + + + + + + + + + -- -- - -- - -- - + + + + + + + +- -- - -- - - - - - - diff --git a/src/views/package-management/package-assign/index.vue b/src/views/package-management/package-assign/index.vue index a6d4344..25fef19 100644 --- a/src/views/package-management/package-assign/index.vue +++ b/src/views/package-management/package-assign/index.vue @@ -97,6 +97,7 @@ :remote-method="searchPackage" :loading="packageLoading" clearable + @change="handlePackageChange" >- --- - - - -- - - -- - - - -- - - -- - - - -{{ - currentPackage.package_code - }} -{{ - currentPackage.package_name - }} -{{ - currentPackage.series_name - }} -- -{{ - getPackageTypeLabel(currentPackage.package_type) - }} -- -{{ - getDataTypeLabel(currentPackage.data_type) - }} -{{ - currentPackage.real_data_mb - }}MB -{{ - currentPackage.virtual_data_mb - }}MB -{{ - currentPackage.duration_months - }}月 -¥{{ - (currentPackage.price / 100).toFixed(2) - }} -- -{{ - currentPackage.shelf_status === 1 ? '上架' : '下架' - }} -- -{{ - currentPackage.status === 1 ? '启用' : '禁用' - }} -{{ - currentPackage.description || '无' - }} -({ package_id: [{ required: true, message: '请选择套餐', trigger: 'change' }], shop_id: [{ required: true, message: '请选择店铺', trigger: 'change' }], - cost_price: [{ required: true, message: '请输入成本价', trigger: 'blur' }] + cost_price: [ + { required: true, message: '请输入成本价', trigger: 'blur' }, + { + validator: (rule: any, value: any, callback: any) => { + if (value === undefined || value === null || value === '') { + callback(new Error('请输入成本价')) + } else if (form.package_base_price && value < form.package_base_price) { + callback(new Error(`成本价不能低于套餐价格 ¥${(form.package_base_price / 100).toFixed(2)}`)) + } else { + callback() + } + }, + trigger: 'blur' + } + ] }) // 表单数据 @@ -281,7 +296,8 @@ id: 0, package_id: undefined, shop_id: undefined, - cost_price: 0 + cost_price: 0, + package_base_price: 0 // 存储选中套餐的成本价,用于验证 }) // 成本价表单验证规则 @@ -589,11 +605,13 @@ form.package_id = row.package_id form.shop_id = row.shop_id form.cost_price = row.cost_price + form.package_base_price = 0 } else { form.id = 0 form.package_id = undefined form.shop_id = undefined form.cost_price = 0 + form.package_base_price = 0 } // 重置表单验证状态 @@ -602,6 +620,23 @@ }) } + // 处理套餐选择变化 + const handlePackageChange = (packageId: number | undefined) => { + if (packageId) { + // 从套餐选项中找到选中的套餐 + const selectedPackage = packageOptions.value.find(pkg => pkg.id === packageId) + if (selectedPackage) { + // 将套餐的价格设置为成本价 + form.cost_price = selectedPackage.price + form.package_base_price = selectedPackage.price + } + } else { + // 清空时重置成本价 + form.cost_price = 0 + form.package_base_price = 0 + } + } + // 处理弹窗关闭事件 const handleDialogClosed = () => { // 清除表单验证状态 @@ -611,6 +646,7 @@ form.package_id = undefined form.shop_id = undefined form.cost_price = 0 + form.package_base_price = 0 } // 删除分配 diff --git a/src/views/package-management/series-assign/index.vue b/src/views/package-management/series-assign/index.vue index 410da4d..2b61e67 100644 --- a/src/views/package-management/series-assign/index.vue +++ b/src/views/package-management/series-assign/index.vue @@ -69,6 +69,20 @@ /> + ++ 系列名称: + {{ form.series_name || '-' }} +++ 店铺名称: + {{ form.shop_name || '-' }} +++ 分配者店铺: + {{ form.allocator_shop_name || '-' }} ++- - 梯度返佣设置(可选) -- + + 一次性佣金设置(可选) ++ - -- - + +- - - + -+ 固定 +梯度 +- - + +- - + -+ 单次充值 +累计充值 +- --- + + @@ -295,7 +354,7 @@ { label: '店铺名称', prop: 'shop_name' }, { label: '分配者店铺', prop: 'allocator_shop_name' }, { label: '基础返佣', prop: 'base_commission' }, - { label: '梯度返佣', prop: 'enable_tier_commission' }, + { label: '一次性佣金', prop: 'enable_one_time_commission' }, { label: '状态', prop: 'status' }, { label: '创建时间', prop: 'created_at' }, { label: '操作', prop: 'operation' } @@ -306,14 +365,20 @@ id: 0, series_id: undefined, shop_id: undefined, + series_name: '', + shop_name: '', + allocator_shop_name: '', base_commission: { mode: 'fixed', value: 0 }, - enable_tier_commission: false, - tier_config: { - period_type: 'monthly', - tier_type: 'sales_count', + enable_one_time_commission: false, + one_time_commission_config: { + type: 'fixed', + trigger: 'single_recharge', + threshold: 0, + mode: 'fixed', + value: 0, tiers: [] } }) @@ -341,14 +406,27 @@ ] } - // 如果启用了梯度返佣,添加梯度返佣的验证规则 - if (form.enable_tier_commission) { - baseRules['tier_config.period_type'] = [ - { required: true, message: '请选择周期类型', trigger: 'change' } + // 如果启用了一次性佣金,添加验证规则 + if (form.enable_one_time_commission) { + baseRules['one_time_commission_config.type'] = [ + { required: true, message: '请选择一次性佣金类型', trigger: 'change' } ] - baseRules['tier_config.tier_type'] = [ - { required: true, message: '请选择梯度类型', trigger: 'change' } + baseRules['one_time_commission_config.trigger'] = [ + { required: true, message: '请选择触发条件', trigger: 'change' } ] + baseRules['one_time_commission_config.threshold'] = [ + { required: true, message: '请输入最低阈值', trigger: 'blur' } + ] + + // 固定类型验证 + if (form.one_time_commission_config.type === 'fixed') { + baseRules['one_time_commission_config.mode'] = [ + { required: true, message: '请选择返佣模式', trigger: 'change' } + ] + baseRules['one_time_commission_config.value'] = [ + { required: true, message: '请输入佣金值', trigger: 'blur' } + ] + } } return baseRules @@ -397,14 +475,14 @@ } }, { - prop: 'enable_tier_commission', - label: '梯度返佣', - width: 100, + prop: 'enable_one_time_commission', + label: '一次性佣金', + width: 120, formatter: (row: ShopSeriesAllocationResponse) => { return h( ElTag, - { type: row.enable_tier_commission ? 'success' : 'info', size: 'small' }, - () => (row.enable_tier_commission ? '已启用' : '未启用') + { type: row.enable_one_time_commission ? 'success' : 'info', size: 'small' }, + () => (row.enable_one_time_commission ? '已启用' : '未启用') ) } }, @@ -647,7 +725,8 @@ // 添加档位 const addTier = () => { - form.tier_config.tiers.push({ + form.one_time_commission_config.tiers.push({ + tier_type: 'sales_count', threshold: 0, mode: 'fixed', value: 0 @@ -656,7 +735,7 @@ // 删除档位 const removeTier = (index: number) => { - form.tier_config.tiers.splice(index, 1) + form.one_time_commission_config.tiers.splice(index, 1) } // 显示新增/编辑对话框 @@ -668,21 +747,30 @@ form.id = row.id form.series_id = row.series_id form.shop_id = row.shop_id + form.series_name = row.series_name + form.shop_name = row.shop_name + form.allocator_shop_name = row.allocator_shop_name form.base_commission = { mode: row.base_commission.mode, value: row.base_commission.value } - form.enable_tier_commission = row.enable_tier_commission - if (row.enable_tier_commission && row.tier_config) { - form.tier_config = { - period_type: row.tier_config.period_type, - tier_type: row.tier_config.tier_type, - tiers: row.tier_config.tiers.map((t) => ({ ...t })) + form.enable_one_time_commission = row.enable_one_time_commission + if (row.enable_one_time_commission && row.one_time_commission_config) { + form.one_time_commission_config = { + type: row.one_time_commission_config.type, + trigger: row.one_time_commission_config.trigger, + threshold: row.one_time_commission_config.threshold, + mode: row.one_time_commission_config.mode || 'fixed', + value: row.one_time_commission_config.value || 0, + tiers: row.one_time_commission_config.tiers?.map((t) => ({ ...t })) || [] } } else { - form.tier_config = { - period_type: 'monthly', - tier_type: 'sales_count', + form.one_time_commission_config = { + type: 'fixed', + trigger: 'single_recharge', + threshold: 0, + mode: 'fixed', + value: 0, tiers: [] } } @@ -690,14 +778,20 @@ form.id = 0 form.series_id = undefined form.shop_id = undefined + form.series_name = '' + form.shop_name = '' + form.allocator_shop_name = '' form.base_commission = { mode: 'fixed', value: 0 } - form.enable_tier_commission = false - form.tier_config = { - period_type: 'monthly', - tier_type: 'sales_count', + form.enable_one_time_commission = false + form.one_time_commission_config = { + type: 'fixed', + trigger: 'single_recharge', + threshold: 0, + mode: 'fixed', + value: 0, tiers: [] } } @@ -716,14 +810,20 @@ form.id = 0 form.series_id = undefined form.shop_id = undefined + form.series_name = '' + form.shop_name = '' + form.allocator_shop_name = '' form.base_commission = { mode: 'fixed', value: 0 } - form.enable_tier_commission = false - form.tier_config = { - period_type: 'monthly', - tier_type: 'sales_count', + form.enable_one_time_commission = false + form.one_time_commission_config = { + type: 'fixed', + trigger: 'single_recharge', + threshold: 0, + mode: 'fixed', + value: 0, tiers: [] } } @@ -759,20 +859,22 @@ await formEl.validate(async (valid) => { if (valid) { - // 验证梯度档位 - if (form.enable_tier_commission) { - if (form.tier_config.tiers.length === 0) { - ElMessage.warning('启用梯度返佣时至少需要添加一个档位') - return - } - - // 验证档位阈值递增 - const thresholds = form.tier_config.tiers.map((t: any) => t.threshold) - for (let i = 1; i < thresholds.length; i++) { - if (thresholds[i] <= thresholds[i - 1]) { - ElMessage.warning('档位阈值必须递增') + // 验证一次性佣金配置 + if (form.enable_one_time_commission) { + if (form.one_time_commission_config.type === 'tiered') { + if (form.one_time_commission_config.tiers.length === 0) { + ElMessage.warning('启用梯度类型时至少需要添加一个档位') return } + + // 验证档位阈值递增 + const thresholds = form.one_time_commission_config.tiers.map((t: any) => t.threshold) + for (let i = 1; i < thresholds.length; i++) { + if (thresholds[i] <= thresholds[i - 1]) { + ElMessage.warning('档位阈值必须递增') + return + } + } } } @@ -783,15 +885,26 @@ mode: form.base_commission.mode, value: form.base_commission.value }, - enable_tier_commission: form.enable_tier_commission + enable_one_time_commission: form.enable_one_time_commission } - // 如果启用了梯度返佣,加入梯度配置 - if (form.enable_tier_commission) { - data.tier_config = { - period_type: form.tier_config.period_type, - tier_type: form.tier_config.tier_type, - tiers: form.tier_config.tiers.map((t: any) => ({ + // 如果启用了一次性佣金,加入配置 + if (form.enable_one_time_commission) { + data.one_time_commission_config = { + type: form.one_time_commission_config.type, + trigger: form.one_time_commission_config.trigger, + threshold: form.one_time_commission_config.threshold + } + + // 固定类型配置 + if (form.one_time_commission_config.type === 'fixed') { + data.one_time_commission_config.mode = form.one_time_commission_config.mode + data.one_time_commission_config.value = form.one_time_commission_config.value + } + // 梯度类型配置 + else if (form.one_time_commission_config.type === 'tiered') { + data.one_time_commission_config.tiers = form.one_time_commission_config.tiers.map((t: any) => ({ + tier_type: t.tier_type, threshold: t.threshold, mode: t.mode, value: t.value @@ -864,4 +977,30 @@ align-items: center; margin-bottom: 8px; } + + .info-row { + display: flex; + gap: 20px; + margin-bottom: 18px; + padding: 12px; + border-radius: 4px; + } + + .info-item { + flex: 1; + display: flex; + align-items: center; + } + + .info-label { + font-size: 14px; + margin-right: 8px; + white-space: nowrap; + } + + .info-value { + font-size: 14px; + color: var(--art-primary); + font-weight: 500; + }- - -- - - 删除 + ++ + + + ++ + + ++ +固定金额 +百分比 ++ + + + + ++ + +-+++ ++ + + + ++ + + 删除 +添加档位 添加档位 -