;YixF@D3|&BfKx{t5lUL=oE%
zW}NWjkRK5VKJxNqb9vaY*!?JUyc6g7IdcgJ#j%{4uYi>DhtUY;w*a++0Q
zsBxm1ibI&UL_xyRl^KdhYS(oJ`3O*Ewx4I)lE}iSO}^5$w8?Pl#)>W~;(SG$E;unh
z{Mfs25`ts1(Nyo6skxWi;4te`{-t3fPu&+Uv@Q)D-Bb{_436D@?Q2*g|CbIj{Jsfy
z%SM4%MJ_qPHR?%}23yr@O}KJ;Xmk?YKBSvoCT0HU7m?zjlfkuaSz5dKfD0g61Z4X{6^IzNIGxeCj=EvJovk`VgnGzDn+m2
zQ7d1uIqS(AtbPl9Sd)?wPE-=OQjebw?C<#e^}L?3V^k303ETf{YM{Z`dfNRoGXI$X
z5>iK7R(5%3{KOy;E~r30n7$
zPDm@6HQ=5&_m!%SRTo|oHvPW%Zq8WhX3f|E%D_dSX;+|Ny37VA(
zgPlVaa>~vC-~gL&ER8o`ZmrMfX>69f
z8NCKJ!EZVHU*v4@zsa3_ptoBG>5h6Y!n3Eh=!>K-#dkKKln)4|E5OU0krNNP+V8)4
zkd5oJ)lVhZpvwrD&39*#v-~K$Lptm7p*YChL3mMZR=BW+6>qX6oP6^8l5oBV8{Xu#
z3G|oOaG%xkPJ7_$u+;Jn*vCTz=l$Iq`H5)?+FB=8|*T^K$C@D{^I`Cn994Ft%}#
zLLapS(XGO(eEDKB4__(vCYINOL{-{T6h6)xi9+q<8A~`4<_T|;tdg<;8k-5nkyKn%
zRJFy1)7m+gFP`+^yZ(cs8okM#&>{bruXQGAF2#gb#mr$ck-gt
z&z|eYh^EeoZ%VXmZh^3w%Ay9N-G}7X`f13RzGxUaWJN#yf6lbO*_*QK|6;}92DwB3
zVkuc1RZO?@MDr%ary%(}9xlM9jA@p1nb0dx5s+mbbyO_4_ln0zU2yNa9f+KE2!Vr0
zMM2W)G*Xv!osmdINpfj`9B(L6ls_*$#xqi?E(s8S8tKlu{*q`)Mv{Mkym<%#3%mX;
zI#k&grDs7Fgax6U%_wT3#wJoPNvmr&QqZ)&$jBm;AF@-zV0)y3$@rAQt*V=&!4H-#
zzz>dSDPc4{vcV5pWS#}h&8abpBByF8H6hiH+|s(X1sGkpMk6rYJ~plIF&mufUi(F?
zLeU~CVx
zQlCvAk)#fXaKr{jpt3|U=_~*bK_L`d6hAj)Qev0%0sw~~77FObF$rdtNFyBuU?a$d
zVs+!0gybANE76xJhug(h)&7$*XO_|?p$BLp*oGnpS5g-MDQoa@
zh_nB{=FTAc|2X&E*ar{Re7s1*HYuivxPJTt{FO|%6UxlP-7zIWDTxh<W
z_7;D9cFGf`PA-D2JPGcvs0RO
z;l4+n9m7ohLdzvaXc%cUQx(~6P%zdYy+5(*_6(-*-BO|4+=aQPs;kwg
z;G}y-R&rcO1KHR}g@JAy;IY=A)a5}NhKE2yO#9xG5MR+2k#svxuE`_DY9Inv)Sa~(
zweVPlf`WhdTI0u#mV1@@q@s!V7Mxy>L(U^&OE*cD!ybNY)SBW$|-s1T)
z?}}nFw8Cv&_v5u2I@-G(U>k-2eO-`OOOG!18NgI5lzXno2KMZYEzxtS3D5H36+K&2
zi0c{c--GKG)MfR)xttLK3HjZO?F2lW^g^y~
zSlM+;QFL{;L@BlM(FfJ@slfLh5S-|s#&^JP
zrdMOSYgc?)o7k+!Ahax3(H&8jX7dDga7#`WRiQ;tF*V!K;10~d889}S$Rr=!d+>mc(`U<9e8C2dXICr<8pgCz}eypE=k>ks=z3fO`Cl$Ts4
zB1*AML@6_%HNrF_tX4sqp=bXbW-XiY6P%9Mr$LeFLyC;TxXiTdsv
z^-Lpza{A9m(*iL)7>@F1k14#iVuivLiu~D38)?(IL{HS0r5_KQ@6xCdY8-^0&{?#geu$j%4k{NGljIpC
zEEgJIDWW>}*M&N-bi(6XhUQt-FajV1Bi*6@s_*&OH>;1?s3qpRZD}g#wU{O#hp_Yn
z8i_4!(J!&gj)ooHXIal)mXh>^7SKllw)2ab!A>}QR$ehF9^Fd-Rb}bk3;Htg4O3a=
zhRr$}mCcGQnP;?ZmhL)~*?_P#^cNBwZ_FEe)?V4kN=wVr(7vMN=(d}o*Liu$NY{S<
z*y$o0yrWJub~b3U#ukAjd9)DN!}_q**+?Fz;T4zdg6*aJBj$1nI7-N6JSjR3JB4Jv
zD1z?JJ2|=tU}laW~YfHB#qG2a1t|zSWWDzo5E=D*}5hhl*(V5Y0`lixQ10+HkA$2^yjJ$wlv15B)k86GQ+g
zNczVldeqR*X~k%xUMc9Vksp`C7qX>)+84@cTYSFI+s_&&Z#OILjM-E<11jY}vcy`DXgOFf-mm!)
zRPY{jhrx4UyZ^Wg)o(plx?VTB$mM9cinMX=mx@O$EIphaQC=B^WK0@Qv*^7$M!SoY
zNQz|wkl}$wT@Df7Nq)=J5BtIcfBYDUp|cds&nizsUOVDqd`q=WMlKs+8g0QC
zD9#G0tn=D_hQ9|l7ikWWd`dE8fCbs4zsCShevS-EHP7{qHMhxbHcvrgw?L<}NN=+i
zpB2dhWWPoZtI*G)U}E57oWS2fmF~YMC?P3ZkRhcmvY87)@q(NP3_+?H`9Y{~S+U4w
zA4*NF=Mah_8!(TFcoXwBS4A27bUjs)_B27j=}xz_-w<+{N*1;I2suj?^|45$P1;uD
zeOD=Cz{9n>r#HXv58(CvkCTg>2#s5x624kjAM#S6UJG*#RRw?P=@UtuEfs*lNZoQ0
zq>me=h8rHAh`_~^M|k^ZmqSIN>R`oH;8@)8yGy=t`duDqTXzn8ra`m#a_-T8V4ea9=r3nM#dp)XEyPk_@EI1RjHh!+n
zG?1g#C^mgA3Z>2y^}%+nmuJA*12tQH_f2;$SuRxAj0}MX?G~)TS7CiOeIKJD84sgV
ztm}!G!}OW~)MW?soo3Zf&fAaonKu*X4u(8&
znhhP^6hys>xeY&z8Fk-V$V#cS^Sh+W#5i8yyh2r&Ne=9@nr0;QUh&LVO}{`H%VlZ$
z7BdF$Wpi4}UF(v%%3;NADVlmml9y|sQaUGTVWpjqzE;ihZOep}eTi6UU<<@XfDf9h
zw;SQ>Z{Zam%Y8g!1WL@p(2((S}0GAobJoN%KW?`%OTryVyoz8p;p2j;J5a4~EW
zR@Bw=WT0H;awU3?yKdIY*<8z#t+sxScng#vlk~_EEOr*V4R_tke9NfeDD9ZDL!A0q
z$tb{f-_tQ=h)I84kE=kH60Pq{BhUBQ)MLA+IFU9>O_g>@4bxDxzU*wC?6oSB7Wwz7
z7X(*yTGO%W`S)hSrpK^LW~;aERQ~Vsr%32HB3ZpZ)bn`hHCrzzE0|;E
zg3S0T&0}x36Q4Odt`*~oC8wlk-|zQ*fd2@FMKLD>Z93!i%9`x@TLN7Oor_x0f`rGG
zVs#SKnHb>N_ChFq^>B*BKy^i>E#=;FZPxt+`OfENkym%X1V1L|R*K1xHS7Y|ei64m^^e`o1*^M&(t9
zBTc5dBo}1>!t7K>w5zr3ed?=ay28*b4gNmnU4h{j_zjpQy6~)BVe`T2Cb75c4Cg&=
zxt%X?-D;{k36r0>4$?28+^r?#4rW#;;9z(b@lCJU4h6LP^M`|m5yF{@hc(bFEcc*4
zai?Nssht7j2^ROs8BlnA8CS7cykhB91a1U+f=Gm<$s70H@Z+MxRe
zk3^`Op+pa3eTinKje#}VyB!Xu>X4B9V}@p`M6OUIiFPzr7#^`fW&O}tS3!ZQSR@HS
zeB9tHPFBn+8?)8)?lb>LDWN1JF_H5m8H`4@WN~9_Dg{G5w*6@BxXK&4V)%AcgF1OQq@Zi&7e84kxPMVtLBfnf_UN!rJiD9*hWJ*@rP!Fn`Vid7{$Uu
zhhJS~g&g6%C$&E553u@jp$uyzHAvec7FmqE21wzoaJ@=Td?_w*1IC8rI_qhWooa7PO?<#E-?{MyWz)kLBW=OZXns=
z;7Q?t|L<)KyKA@OSl;DbtsN
zYMn*u&8K0rP_*G0L^gtNlVZ8KKrdC1wX_+Uh(vSi%$Cu%+IRGZ=_+VO@a00}3$CkbU2Jgo
zk>26Rq^=x`>xvmr1@5bLyIoG%%8v^x-WSwhwlk~bU#PQ44V6m$f{@*q!X(ql3rpnb>=UX=%gtBFc|UM&1P19taU
zEwW~_bveJ)P(VV(u>{|F81lCW-StgOtUTHa!#$V|4(9F}b44)iT&%{wQVPIB%Ry7&
zxxSZIA0H7CgeN`kh!9oQ$YH-`mQJzk-~Ar49}i_+Y%Biq^d^{wQYAiDgb+(MgsW`8
z>cQpeTi5wb6)`MOxiM%uA>=!NYgF*Z=EY|8hX`t>)qpE@*?4r`!T~*-eAb=E+k?+-
zS5QGTjjB*-*ciPB7ehvt9bS$PcRuH+57?8rb_0`%`9lDO9pV+fyIoXBSP;-mI`l}$
z@1BK*tK&!7+i>b`8he9CR5C>ym}*ci-QFc9
zoxz5&!tvr&p>|G>Z+YM9OQX+`Ptm0)P#8ROe!Gh`3VUcMCzNxmTI86()tuurLKaJN}V5c@t1`7(8
zVzk4+s+PHs9fVuzG?l<=h=ZyUmX~f9X^dhqRtrm0=mpC#)5Q8EHZ*fiGIB}0N}2O3
zacV4D6I2yMuWuCuU1|{8hbY5bJI~R1Fw0N1jf~1{~ET4^v{58evQAlr-*~qL*?^9)F(<
zo4$@T<$jN{QPR%CT-4wpa9?YXH}OdyNBiNB^62+G#4VyvcjJNOTnz5w>ML?9W
ziTo$-ECse+~1SGt#7l}S$(5d
z;r)t_q54#~OP<4=tCSHnRJ&kvwv)<>)zO!{GDWQ?ChSnD#hFkoUx3ADyqKwAB#v8j
zs4lt{;q8`M!PhkEn*;<*wRM>oitZX`<0_l|30aNWvQMS`!-%+Z;e)a;=*iA>1i;8n;==c`7YBlg^#^VtEe2uobJTzuj
z#J-w_Igj<(qiWauUq?pzJVwCfWavNLhiuZ-q9}rv=WLJFNA_(XsSk{Hs8E
zzSsmC-KKhCwwql7R!oR*{z3=Zr34%t&jip-aOBuSHln=3k^xylKP*k{_0pDphckWp
zfW9K}Ys#Fl8{wImo$jv0DZRQ8Y2HxEyn{yy)`8y5R4+jeBWd6nLz&0_o(un1{^LKv
zIcWD8_zetW^HYcd{0okG{UUqHi~l=F@h@~0Ya7Qx9&%#&b(8{9iDpa=}WBRgJc_@)Y
z);D@15MjwnSC=_DHaK!yjlUhdOcZxNE$Cz!c=d9Kn}7q0G;boCvp~fqwIo?3Gvw$A
zU6rCj_}Nz=Q%9_VHb00dc^2x&W5O>DT-WHMJCPtJap`sILFh=y_b57D?-*Ih2S-k?
z%KG`TC)-_y7Y$VDM?M*I+IBnnlk-=YrUC`aY?0G4{E2{RM0zEc0
zCzBWx<28#CigoDO@15)ysi5GK@1U2)P$EGwnKHbGHyw}nZAg-Iwy!D0XIJLRjV`qz
z6}=0W%PonM-=2Z6(n8g`J>fa@plhd2Zf%%#;5&m$3FpgYUh+G|)k4x$pFt9g$@|rj
zO)-yqq5&B#I~{%6_!!&dzN)6{B6AY(cd66M(}J`vd^RY8MKt*xup7!VqR?Ve$r9Dt
zUH1c39iCxnY;!E^26CB)oaTqRZ+mn$9L45E>58ymv$P?~aeh1l68H%#hL?6|#4TLR
zl%xvdJ(mNhPd1bbzX_rsr9u`0J(|lAuK}+a^BZnW*P)Ud-?E|NrRr?UUk^LkiNjoi
z$g-us$q%53(AYsFam<0f9~Bcsw_PUA!#ykuV+)8Vx|Rg)ICi)|=xoEBj11hozd9eU
z?x}luIgEHX{&j~z^ow8V-pXZrVnYXg>v`9?8RtEmvK%B7=FiyducEO(R|dQ|5Recg
z;J%yUKd#d+0sp(jc@pre{)~?7Z~ODR(myTG6UQ&5N`LYEd}IEbvZq(_S9>aUdusov
zi~C*QpOtY>#J}`W|C8-sb#i|~^k=Qt-`vUIE&Z3$e^-9}$^K`#(%%7)o+fPzj);QI&3|L~9VHL)f7qu#2l}TWd(!g@CD1?F{)bunQ_i1BfWPIG
zf(QMdQUZTU_%nw0w*&^PUlRU`=>1>J9lU43%Kx3h{(Xo1nZ*8EBj}%Of2Xwn9P*z*
z>c0g%qW{$UPuTw3pr4AWezm6+j`_91zm-`1KJq_{te$v(t=h-`!TWc~m9iY{)8_%W
Qb`byp52n+ldiwW&0Qb?&SpWb4
literal 0
HcmV?d00001
diff --git a/src/api/supplierInput/supplierInput/index.ts b/src/api/supplierInput/supplierInput/index.ts
index 834b072..0838699 100644
--- a/src/api/supplierInput/supplierInput/index.ts
+++ b/src/api/supplierInput/supplierInput/index.ts
@@ -61,3 +61,22 @@ export const delSupplierInput = (id: string | number | Array) =
method: 'delete'
});
};
+//导入供商入库
+export const leadingIn = (formData: FormData, projectId) => {
+ return request({
+ url: '/supplierInput/supplierInput/import?projectId=' + projectId,
+ method: 'post',
+ data: formData,
+
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ }
+ });
+};
+//导入供商出库
+export const leadingOut = () => {
+ return request({
+ url: '/supplierInput/supplierInput/export',
+ method: 'post'
+ });
+};
diff --git a/src/views/tender/supplierInput/index.vue b/src/views/tender/supplierInput/index.vue
index 3709164..a3afeda 100644
--- a/src/views/tender/supplierInput/index.vue
+++ b/src/views/tender/supplierInput/index.vue
@@ -31,9 +31,14 @@
新增
-
+
+ 导入
+
+
+ 导出模板
+
@@ -309,7 +314,14 @@
diff --git a/src/views/projectLarge/digitalizationScreen/components/header.vue b/src/views/projectLarge/digitalizationScreen/components/header.vue
new file mode 100644
index 0000000..d911f88
--- /dev/null
+++ b/src/views/projectLarge/digitalizationScreen/components/header.vue
@@ -0,0 +1,327 @@
+
+
+
+
+
+
+
diff --git a/src/views/projectLarge/digitalizationScreen/components/leftPage.vue b/src/views/projectLarge/digitalizationScreen/components/leftPage.vue
new file mode 100644
index 0000000..b7e438b
--- /dev/null
+++ b/src/views/projectLarge/digitalizationScreen/components/leftPage.vue
@@ -0,0 +1,326 @@
+
+
+
+
+
+
+

+
+ {{ item.title }}
+ {{ item.id === newId ? '关闭' : '查看' }}
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+

+
出勤人
+
+ {{ attendanceCount }}
+ 人
+
+
+
+

+
在岗人
+
+ {{ peopleCount }}
+ 人
+
+
+
+

+
出勤率
+
+ {{ attendanceRate }}
+ %
+
+
+
+
+
+
+
+
{{ item.teamName }}
+
+ {{ item.attendanceNumber }} 人/{{ item.allNumber }}
+
+
{{ item.attendanceRate }} %
+
{{ item.attendanceTime }}
+
+
+
+
+
+
+
+
+
diff --git a/src/views/projectLarge/digitalizationScreen/components/optionList.ts b/src/views/projectLarge/digitalizationScreen/components/optionList.ts
new file mode 100644
index 0000000..bcdf958
--- /dev/null
+++ b/src/views/projectLarge/digitalizationScreen/components/optionList.ts
@@ -0,0 +1,153 @@
+export let pieOption = {
+ // 定义中心文字
+ graphic: [
+ {
+ type: 'text',
+ left: 'center',
+ top: '40%',
+ style: {
+ // 需要从接口替换
+ text: '70%',
+ fontSize: 24,
+ fontWeight: 'bold',
+ fill: '#fff'
+ }
+ },
+ {
+ type: 'text',
+ left: 'center',
+ top: '50%',
+ style: {
+ text: '总进度',
+ fontSize: 14,
+ fill: '#fff'
+ }
+ },
+ ],
+ legend: {
+ show: true,
+ type: 'plain',
+ bottom: 20,
+ itemWidth: 12,
+ itemHeight: 12,
+ textStyle: {
+ color: '#fff'
+ }
+ },
+ series: {
+ type: 'pie',
+ data: [],
+ radius: [50, 80],
+ center: ['50%', '45%'],
+ itemStyle: {
+ borderColor: '#fff',
+ borderWidth: 1
+ },
+ label: {
+ alignTo: 'edge',
+ formatter: '{name|{b}}\n{percent|{c} %}',
+ minMargin: 10,
+ edgeDistance: 20,
+ lineHeight: 15,
+ rich: {
+ name: {
+ fontSize: 12,
+ color: '#fff'
+ },
+ percent: {
+ fontSize: 12,
+ color: '#fff'
+ }
+ }
+ },
+ legend: {
+ top: 'bottom'
+ },
+ }
+};
+
+export let barOption = {
+ legend: {
+ icon: 'rect',
+ itemWidth: 12,
+ itemHeight: 12,
+ // 调整文字与图标间距
+ data: ['计划流转面积', '已流转面积'],
+ top: 0,
+ right: 20,
+ textStyle: {
+ color: '#fff',
+ }
+ },
+ xAxis: {
+ type: 'category',
+ data: ['地块1', '地块2', '地块3', '地块4', '地块5', '地块6'],
+ axisLabel: {
+ color: '#fff'
+ },
+ axisLine: {
+ show: false
+ },
+ splitLine: {
+ show: false
+ }
+ },
+ yAxis: {
+ name: '单位:m²',
+ type: 'value',
+ axisLabel: {
+ formatter: '{value}'
+ }
+ },
+ grid: {
+ bottom: 0, // 距离容器底部的距离
+ containLabel: true // 确保坐标轴标签不被裁剪
+ },
+ series: [
+ {
+ name: '计划流转面积',
+ type: 'bar',
+ data: [],
+ barWidth: '20%',
+ itemStyle: {
+ color: 'rgb(29, 253, 253)'
+ },
+ },
+ {
+ name: '已流转面积',
+ type: 'bar',
+ data: [],
+ barWidth: '20%',
+ itemStyle: {
+ color: 'rgb(25, 181, 251)'
+ },
+ }
+ ]
+};
+
+export let mapOption = {
+ geo: {
+ map: 'ch',
+ roam: true,
+ aspectScale: Math.cos((47 * Math.PI) / 180),
+ },
+ series: [
+ {
+ type: 'graph',
+ coordinateSystem: 'geo',
+ data: [
+ { name: 'a', value: [7.667821250000001, 46.791734269956265] },
+ { name: 'b', value: [7.404848750000001, 46.516308805996054] },
+ { name: 'c', value: [7.376673125000001, 46.24728858538375] },
+ { name: 'd', value: [8.015320625000001, 46.39460918238572] },
+ { name: 'e', value: [8.616400625, 46.7020608630855] },
+ { name: 'f', value: [8.869981250000002, 46.37539345234199] },
+ { name: 'g', value: [9.546196250000001, 46.58676648282309] },
+ { name: 'h', value: [9.311399375, 47.182454114178896] },
+ { name: 'i', value: [9.085994375000002, 47.55395822835779] },
+ { name: 'j', value: [8.653968125000002, 47.47709530818285] },
+ { name: 'k', value: [8.203158125000002, 47.44506909144329] }
+ ],
+ }
+ ]
+};
diff --git a/src/views/projectLarge/digitalizationScreen/components/rightPage.vue b/src/views/projectLarge/digitalizationScreen/components/rightPage.vue
new file mode 100644
index 0000000..0d08c08
--- /dev/null
+++ b/src/views/projectLarge/digitalizationScreen/components/rightPage.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
diff --git a/src/views/projectLarge/digitalizationScreen/components/title.vue b/src/views/projectLarge/digitalizationScreen/components/title.vue
new file mode 100644
index 0000000..361f557
--- /dev/null
+++ b/src/views/projectLarge/digitalizationScreen/components/title.vue
@@ -0,0 +1,45 @@
+
+
+
+

+

+
+
+
+
+
{{ title }}
+
+
+
+
+
+
diff --git a/src/views/projectLarge/digitalizationScreen/index.vue b/src/views/projectLarge/digitalizationScreen/index.vue
new file mode 100644
index 0000000..fead15c
--- /dev/null
+++ b/src/views/projectLarge/digitalizationScreen/index.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
From d01a56d9dc5f9e311dc9411879f9e452ffee140f Mon Sep 17 00:00:00 2001
From: ljx <15723110242@139.com>
Date: Tue, 9 Sep 2025 15:37:59 +0800
Subject: [PATCH 11/19] =?UTF-8?q?=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/router/index.ts | 2 +-
.../digitalizationScreen/components/centerPage.vue | 0
.../digitalizationScreen/components/header.vue | 0
.../digitalizationScreen/components/leftPage.vue | 0
.../digitalizationScreen/components/optionList.ts | 0
.../digitalizationScreen/components/rightPage.vue | 0
.../digitalizationScreen/components/title.vue | 0
.../digitalizationScreen/index.vue | 0
8 files changed, 1 insertion(+), 1 deletion(-)
rename src/views/{projectLarge => enterpriseLarge}/digitalizationScreen/components/centerPage.vue (100%)
rename src/views/{projectLarge => enterpriseLarge}/digitalizationScreen/components/header.vue (100%)
rename src/views/{projectLarge => enterpriseLarge}/digitalizationScreen/components/leftPage.vue (100%)
rename src/views/{projectLarge => enterpriseLarge}/digitalizationScreen/components/optionList.ts (100%)
rename src/views/{projectLarge => enterpriseLarge}/digitalizationScreen/components/rightPage.vue (100%)
rename src/views/{projectLarge => enterpriseLarge}/digitalizationScreen/components/title.vue (100%)
rename src/views/{projectLarge => enterpriseLarge}/digitalizationScreen/index.vue (100%)
diff --git a/src/router/index.ts b/src/router/index.ts
index 87951e5..e168127 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -80,7 +80,7 @@ export const constantRoutes: RouteRecordRaw[] = [
},
{
path: '/digitalizationScreen',
- component: () => import('@/views/projectLarge/digitalizationScreen/index.vue'),
+ component: () => import('@/views/enterpriseLarge/digitalizationScreen/index.vue'),
hidden: true
},
{
diff --git a/src/views/projectLarge/digitalizationScreen/components/centerPage.vue b/src/views/enterpriseLarge/digitalizationScreen/components/centerPage.vue
similarity index 100%
rename from src/views/projectLarge/digitalizationScreen/components/centerPage.vue
rename to src/views/enterpriseLarge/digitalizationScreen/components/centerPage.vue
diff --git a/src/views/projectLarge/digitalizationScreen/components/header.vue b/src/views/enterpriseLarge/digitalizationScreen/components/header.vue
similarity index 100%
rename from src/views/projectLarge/digitalizationScreen/components/header.vue
rename to src/views/enterpriseLarge/digitalizationScreen/components/header.vue
diff --git a/src/views/projectLarge/digitalizationScreen/components/leftPage.vue b/src/views/enterpriseLarge/digitalizationScreen/components/leftPage.vue
similarity index 100%
rename from src/views/projectLarge/digitalizationScreen/components/leftPage.vue
rename to src/views/enterpriseLarge/digitalizationScreen/components/leftPage.vue
diff --git a/src/views/projectLarge/digitalizationScreen/components/optionList.ts b/src/views/enterpriseLarge/digitalizationScreen/components/optionList.ts
similarity index 100%
rename from src/views/projectLarge/digitalizationScreen/components/optionList.ts
rename to src/views/enterpriseLarge/digitalizationScreen/components/optionList.ts
diff --git a/src/views/projectLarge/digitalizationScreen/components/rightPage.vue b/src/views/enterpriseLarge/digitalizationScreen/components/rightPage.vue
similarity index 100%
rename from src/views/projectLarge/digitalizationScreen/components/rightPage.vue
rename to src/views/enterpriseLarge/digitalizationScreen/components/rightPage.vue
diff --git a/src/views/projectLarge/digitalizationScreen/components/title.vue b/src/views/enterpriseLarge/digitalizationScreen/components/title.vue
similarity index 100%
rename from src/views/projectLarge/digitalizationScreen/components/title.vue
rename to src/views/enterpriseLarge/digitalizationScreen/components/title.vue
diff --git a/src/views/projectLarge/digitalizationScreen/index.vue b/src/views/enterpriseLarge/digitalizationScreen/index.vue
similarity index 100%
rename from src/views/projectLarge/digitalizationScreen/index.vue
rename to src/views/enterpriseLarge/digitalizationScreen/index.vue
From db6d39e02e41b0fec0cf87c971e7aeb30c92e3ed Mon Sep 17 00:00:00 2001
From: dhr <2216804034@qq.com>
Date: Tue, 9 Sep 2025 15:38:38 +0800
Subject: [PATCH 12/19] 0909
---
src/assets/images/contract.png | Bin 0 -> 4422 bytes
.../digitalizationScreen/components/leftPage.vue | 2 +-
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 src/assets/images/contract.png
diff --git a/src/assets/images/contract.png b/src/assets/images/contract.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7c69479355c28aecfc5f28d79aa0e3d3cd07d5a
GIT binary patch
literal 4422
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
M07*qoM6N<$f+!j83IG5A
literal 0
HcmV?d00001
diff --git a/src/views/projectLarge/digitalizationScreen/components/leftPage.vue b/src/views/projectLarge/digitalizationScreen/components/leftPage.vue
index b7e438b..eb8590c 100644
--- a/src/views/projectLarge/digitalizationScreen/components/leftPage.vue
+++ b/src/views/projectLarge/digitalizationScreen/components/leftPage.vue
@@ -1,7 +1,7 @@
-
+

From d92a54078602161ec5348f3900a5bb99108e5e0f Mon Sep 17 00:00:00 2001
From: taoge1020
Date: Tue, 9 Sep 2025 17:03:01 +0800
Subject: [PATCH 13/19] =?UTF-8?q?=E9=87=91=E9=A2=9D=E6=A0=BC=E5=BC=8F?=
=?UTF-8?q?=E8=AE=BE=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.env.development | 2 +-
src/plugins/index.ts | 3 +-
src/utils/ruoyi.ts | 16 +
src/views/contract/bidCost/index.vue | 6 +-
src/views/contract/division/index.vue | 35 +-
src/views/contract/limitPrice/index.vue | 10 +-
src/views/contract/limitPrice/indexEdit.vue | 18 +-
src/views/ctr/update/index.vue | 355 +++++++++---------
src/views/design/designChange/indexEdit.vue | 8 +-
src/views/out/constructionValue/index.vue | 12 +-
src/views/out/designCompletion/index.vue | 18 +-
src/views/out/monthPlan/index.vue | 20 +-
src/views/out/monthPlanAudit/index.vue | 26 +-
src/views/out/outDesignTable/index.vue | 34 +-
src/views/out/outDesignTableVS/index.vue | 74 +++-
src/views/out/outTable/index.vue | 79 +++-
src/views/out/purchase/comm/purchPage.vue | 6 +-
.../out/settlementValueSubcontract/index.vue | 6 +-
src/views/out/valueAllocation/index.vue | 48 ++-
src/views/progress/progressCategory/index.vue | 10 +-
src/views/project/constructionUser/index.vue | 4 +-
.../landTransferLedger/index.vue | 40 +-
.../landTransferLedgerFangzhen/index.vue | 20 +-
src/views/project/projectUser/index.vue | 4 +-
src/views/project/salaryExcel/index.vue | 6 +-
src/views/project/subManagementUser/index.vue | 4 +-
src/views/project/subcontract/index.vue | 8 +-
src/views/project/workWage/index.vue | 8 +-
src/views/tender/bidd/index.vue | 8 +-
src/views/tender/bidd/indexEdit.vue | 8 +-
src/views/tender/bidd/indexEdit2.vue | 8 +-
src/views/tender/plan/index.vue | 47 ++-
32 files changed, 633 insertions(+), 318 deletions(-)
diff --git a/.env.development b/.env.development
index 4a874b9..6359576 100644
--- a/.env.development
+++ b/.env.development
@@ -14,7 +14,7 @@ VITE_APP_BASE_API = 'http://192.168.110.149:8899'
# 罗成
# VITE_APP_BASE_API = 'http://192.168.110.188:8899'
# 朱银
-VITE_APP_BASE_API = 'http://192.168.110.149:8899'
+# VITE_APP_BASE_API = 'http://192.168.110.149:8899'
#曾涛
# VITE_APP_BASE_API = 'http://192.168.110.171:8899'
diff --git a/src/plugins/index.ts b/src/plugins/index.ts
index 7449bde..1b5d412 100644
--- a/src/plugins/index.ts
+++ b/src/plugins/index.ts
@@ -9,7 +9,7 @@ import animate from '@/animate';
import { download as dl } from '@/utils/request';
import { useDict } from '@/utils/dict';
import { getConfigKey, updateConfigByKey } from '@/api/system/config';
-import { parseTime, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi';
+import { parseTime, addDateRange, handleTree, selectDictLabel, selectDictLabels,formatPrice } from '@/utils/ruoyi';
import { downloadFile } from '@/utils/useFileDownload';
import { App } from 'vue';
@@ -42,4 +42,5 @@ export default function installPlugin(app: App) {
app.config.globalProperties.selectDictLabels = selectDictLabels;
app.config.globalProperties.animate = animate;
app.config.globalProperties.downloadFile = downloadFile;
+ app.config.globalProperties.formatPrice = formatPrice;
}
diff --git a/src/utils/ruoyi.ts b/src/utils/ruoyi.ts
index 8efd12c..c92994d 100644
--- a/src/utils/ruoyi.ts
+++ b/src/utils/ruoyi.ts
@@ -62,7 +62,23 @@ export const addDateRange = (params: any, dateRange: any[], propName?: string) =
}
return search;
};
+// 价格格式化函数
+export const formatPrice = (price, show = true) => {
+ if ((!show && price == 0) || price == '' || price == undefined || price == null) return '';
+ if (!price && price !== 0) return '0.0000';
+ // 转换为数字并保留四位小数
+ const num = Number(price);
+ if (isNaN(num)) return '0.0000';
+
+ const fixedNum = num.toFixed(4);
+ const [integer, decimal] = fixedNum.split('.');
+
+ // 千分位处理
+ const formattedInteger = integer.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
+
+ return `${formattedInteger}.${decimal}`;
+};
// 回显数据字典
export const selectDictLabel = (datas: any, value: number | string) => {
if (value === undefined) {
diff --git a/src/views/contract/bidCost/index.vue b/src/views/contract/bidCost/index.vue
index a69eb4c..8df9d45 100644
--- a/src/views/contract/bidCost/index.vue
+++ b/src/views/contract/bidCost/index.vue
@@ -77,8 +77,8 @@
changePrice(scope.row);
}
"
- :precision="2"
- :step="0.1"
+ :min="0"
+ :precision="4"
:controls="false"
v-if="scope.row.quantity && scope.row.quantity != 0"
/>
@@ -86,7 +86,7 @@
- {{ scope.row.price != 0 ? Number(scope.row.price).toFixed(2) : null }}
+ {{ proxy.formatPrice(scope.row.price) }}
diff --git a/src/views/contract/division/index.vue b/src/views/contract/division/index.vue
index 1f085b2..23c50f5 100644
--- a/src/views/contract/division/index.vue
+++ b/src/views/contract/division/index.vue
@@ -25,7 +25,11 @@
-
+
+
+ {{ proxy.formatPrice(scope.row.price) }}
+
+
*计划招标时间
@@ -158,22 +162,28 @@
-
+
+
+ {{ proxy.formatPrice(scope.row.unitPrice) }}
+
+
+
{{
- ((scope.row.quantity ? Number(scope.row.quantity) : 0) -
- (scope.row.useQuantity ? Number(scope.row.useQuantity) : 0) -
- (scope.row.selectNum ? Number(scope.row.selectNum) : 0)) *
- Number(scope.row.unitPrice) ==
- 0
- ? ''
- : (
- ((scope.row.quantity ? Number(scope.row.quantity) : 0) -
+ proxy.formatPrice(
+ ((scope.row.quantity ? Number(scope.row.quantity) : 0) -
+ (scope.row.useQuantity ? Number(scope.row.useQuantity) : 0) -
+ (scope.row.selectNum ? Number(scope.row.selectNum) : 0)) *
+ Number(scope.row.unitPrice) ==
+ 0
+ ? ''
+ : ((scope.row.quantity ? Number(scope.row.quantity) : 0) -
(scope.row.useQuantity ? Number(scope.row.useQuantity) : 0) -
(scope.row.selectNum ? Number(scope.row.selectNum) : 0)) *
- Number(scope.row.unitPrice)
- ).toFixed(2)
+ Number(scope.row.unitPrice),
+ false
+ )
}}
@@ -207,6 +217,7 @@ import { useUserStoreHook } from '@/store/modules/user';
import { getDicts } from '@/api/system/dict/data';
import { Plus } from '@element-plus/icons-vue';
import { FormInstance } from 'element-plus';
+const { proxy } = getCurrentInstance();
import {
treeList,
sheetList,
diff --git a/src/views/contract/limitPrice/index.vue b/src/views/contract/limitPrice/index.vue
index 505add3..dce5f23 100644
--- a/src/views/contract/limitPrice/index.vue
+++ b/src/views/contract/limitPrice/index.vue
@@ -79,18 +79,16 @@
changePrice(scope.row);
}
"
- :precision="2"
- :step="0.1"
+ :min="0"
+ :precision="4"
:controls="false"
v-if="scope.row.quantity && scope.row.quantity != 0"
/>
-
+
-
- {{ scope.row.price != 0 ? Number(scope.row.price).toFixed(2) : null }}
-
+ {{ proxy.formatPrice(scope.row.price) }}
diff --git a/src/views/contract/limitPrice/indexEdit.vue b/src/views/contract/limitPrice/indexEdit.vue
index facd683..4665f32 100644
--- a/src/views/contract/limitPrice/indexEdit.vue
+++ b/src/views/contract/limitPrice/indexEdit.vue
@@ -41,10 +41,14 @@
-
-
+
- {{ scope.row.price != 0 ? Number(scope.row.price).toFixed(2) : null }}
+ {{ proxy.formatPrice(scope.row.unitPrice, false) }}
+
+
+
+
+ {{ proxy.formatPrice(scope.row.price) }}
@@ -70,8 +74,12 @@
diff --git a/src/views/ctr/update/index.vue b/src/views/ctr/update/index.vue
index 4908951..d813daf 100644
--- a/src/views/ctr/update/index.vue
+++ b/src/views/ctr/update/index.vue
@@ -1,79 +1,80 @@
-
-
-
-
-
-
-
-
- 修改收入合同
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 下一步
-
-
-
- 修改收入合同
-
-
-
- 月结算
- 形象节点
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 上一步
- 提交
-
-
-
-
+
+
+
+
+
+
+
+
+ 修改收入合同
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 下一步
+
+
+ 修改收入合同
+
+
+
+ 月结算
+ 形象节点
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 上一步
+ 提交
+
+
+
+
+
diff --git a/src/views/design/designChange/indexEdit.vue b/src/views/design/designChange/indexEdit.vue
index 9e6e857..7e0c7e5 100644
--- a/src/views/design/designChange/indexEdit.vue
+++ b/src/views/design/designChange/indexEdit.vue
@@ -145,7 +145,13 @@
>
-
diff --git a/src/views/out/constructionValue/index.vue b/src/views/out/constructionValue/index.vue
index b6d49e0..50d0699 100644
--- a/src/views/out/constructionValue/index.vue
+++ b/src/views/out/constructionValue/index.vue
@@ -39,8 +39,16 @@
-
-
+
+
+ {{ proxy.formatPrice(scope.row.outValue) }}
+
+
+
+
+ {{ proxy.formatPrice(scope.row.ownerValue) }}
+
+
diff --git a/src/views/out/designCompletion/index.vue b/src/views/out/designCompletion/index.vue
index 92f6638..fe4a233 100644
--- a/src/views/out/designCompletion/index.vue
+++ b/src/views/out/designCompletion/index.vue
@@ -24,9 +24,21 @@
-
-
-
+
+
+ {{ proxy.formatPrice(scope.row.planValue) }}
+
+
+
+
+ {{ proxy.formatPrice(scope.row.completeValue) }}
+
+
+
+
+ {{ proxy.formatPrice(scope.row.differenceValue) }}
+
+
对甲
diff --git a/src/views/out/monthPlan/index.vue b/src/views/out/monthPlan/index.vue
index af7bebd..e64d670 100644
--- a/src/views/out/monthPlan/index.vue
+++ b/src/views/out/monthPlan/index.vue
@@ -40,9 +40,21 @@
-
-
-
+
+
+ {{ proxy.formatPrice(scope.row.planValue) }}
+
+
+
+
+ {{ proxy.formatPrice(scope.row.completeValue) }}
+
+
+
+
+ {{ proxy.formatPrice(scope.row.differenceValue) }}
+
+
@@ -104,7 +116,7 @@
+
+
+
+
\ No newline at end of file
diff --git a/src/views/projectLarge/ProjectScreen/js/CesiumFlyToRoamingController.js b/src/views/projectLarge/ProjectScreen/js/CesiumFlyToRoamingController.js
new file mode 100644
index 0000000..e6b4d4f
--- /dev/null
+++ b/src/views/projectLarge/ProjectScreen/js/CesiumFlyToRoamingController.js
@@ -0,0 +1,293 @@
+export default class CesiumFlyToRoamingController {
+ /**
+ * 构造函数 - 创建基于flyTo的漫游控制器
+ * @param {Cesium.Viewer} viewer - Cesium Viewer实例
+ * @param {Object} [options] - 漫游配置选项
+ * @param {number} [options.duration=3] - 飞行持续时间(秒)
+ * @param {number} [options.pitch=-30] - 俯仰角(度)
+ * @param {number} [options.headingOffset=0] - 航向偏移(度)
+ */
+ constructor(viewer, options = {}) {
+ if (!viewer || !(viewer instanceof Cesium.Viewer)) {
+ throw new Error('必须提供有效的Cesium Viewer实例');
+ }
+
+ this.viewer = viewer;
+ this.isRoaming = false;
+ this.path = [];
+ this.currentIndex = -1; // 初始为-1,表示尚未开始
+ this.loop = false;
+ this.duration = options.duration || 3;
+ this.pitch = Cesium.Math.toRadians(options.pitch || -30);
+ this.headingOffset = Cesium.Math.toRadians(options.headingOffset || 0);
+ this.flyToOptions = null;
+ }
+
+ /**
+ * 开始路径漫游 - 严格按照路径点顺序,首先飞入第一个点位
+ * @param {Array} path - 路径点数组(按顺序排列)
+ * @param {number} [duration] - 飞行持续时间(秒)
+ * @param {boolean} [loop=false] - 是否循环漫游
+ */
+ startPathRoaming(path, duration, loop = false) {
+ if (!path || path.length < 1) {
+ throw new Error('路径漫游需要至少1个路径点');
+ }
+
+ // 停止当前可能的漫游
+ this.stopRoaming();
+
+ // 初始化参数
+ this.path = [...path];
+ this.loop = loop;
+ this.currentIndex = -1; // 重置为初始状态
+
+ if (duration !== undefined) {
+ this.duration = duration;
+ }
+
+ this.isRoaming = true;
+
+ // 第一步:飞到第一个点位
+ this.flyToFirstPoint();
+ }
+
+ /**
+ * 专门用于飞到第一个点位的方法
+ */
+ flyToFirstPoint() {
+ if (!this.isRoaming || this.path.length === 0) return;
+
+ const firstPointIndex = 0;
+ const firstPoint = this.path[firstPointIndex];
+
+ // 计算朝向:如果有第二个点,则面向第二个点,否则保持当前朝向
+ let orientation;
+ if (this.path.length > 1) {
+ orientation = this.calculateOrientation(firstPoint, this.path[1]);
+ } else {
+ orientation = {
+ heading: this.viewer.camera.heading,
+ pitch: this.pitch,
+ roll: 0
+ };
+ }
+
+ // 飞行到第一个点
+ this.flyToOptions = {
+ destination: firstPoint,
+ orientation: orientation,
+ duration: this.duration,
+ complete: () => {
+ // 第一个点到达后更新索引
+ this.currentIndex = firstPointIndex;
+
+ // 如果有更多点,继续飞行到下一个点
+ if (this.path.length > 1) {
+ this.flyToNextPoint();
+ } else {
+ // 只有一个点时,完成后停止漫游
+ this.isRoaming = false;
+ }
+ },
+ cancel: () => {
+ this.isRoaming = false;
+ }
+ };
+
+ this.viewer.camera.flyTo(this.flyToOptions);
+ }
+
+ /**
+ * 飞行到下一个路径点
+ */
+ flyToNextPoint() {
+ if (!this.isRoaming || this.currentIndex === -1) return;
+
+ // 计算下一个点的索引
+ const nextIndex = this.currentIndex + 1;
+
+ // 检查是否超出路径范围
+ if (nextIndex >= this.path.length) {
+ if (this.loop) {
+ // 循环模式:回到第一个点
+ this.currentIndex = -1;
+ this.flyToFirstPoint();
+ } else {
+ // 非循环模式:到达终点,停止漫游
+ this.isRoaming = false;
+ }
+ return;
+ }
+
+ // 更新当前索引并获取目标点
+ this.currentIndex = nextIndex;
+ const targetPoint = this.path[this.currentIndex];
+
+ // 计算朝向
+ let orientation;
+ if (this.currentIndex < this.path.length - 1) {
+ // 面向下一个点
+ orientation = this.calculateOrientation(targetPoint, this.path[this.currentIndex + 1]);
+ } else if (this.loop) {
+ // 最后一个点且循环模式,面向第一个点
+ orientation = this.calculateOrientation(targetPoint, this.path[0]);
+ } else {
+ // 最后一个点且不循环,保持当前朝向
+ orientation = {
+ heading: this.viewer.camera.heading,
+ pitch: this.pitch,
+ roll: 0
+ };
+ }
+
+ // 执行飞行
+ this.flyToOptions = {
+ destination: targetPoint,
+ orientation: orientation,
+ duration: this.duration,
+ complete: () => this.flyToNextPoint(),
+ cancel: () => { this.isRoaming = false; }
+ };
+
+ this.viewer.camera.flyTo(this.flyToOptions);
+ }
+
+ /**
+ * 计算相机朝向
+ * @param {Cesium.Cartesian3} position - 相机位置
+ * @param {Cesium.Cartesian3} lookAtPoint - 看向的点
+ * @returns {Object} 朝向配置
+ */
+ calculateOrientation(position, lookAtPoint) {
+ const direction = Cesium.Cartesian3.subtract(lookAtPoint, position, new Cesium.Cartesian3());
+ const heading = Math.atan2(direction.x, direction.y) + this.headingOffset;
+
+ return {
+ heading: heading,
+ pitch: this.pitch,
+ roll: 0
+ };
+ }
+
+ /**
+ * 停止漫游
+ */
+ stopRoaming() {
+ if (this.isRoaming) {
+ this.isRoaming = false;
+ if (this.flyToOptions) {
+ this.viewer.camera.cancelFlight();
+ this.flyToOptions = null;
+ }
+ }
+ }
+
+ /**
+ * 暂停漫游
+ */
+ pauseRoaming() {
+ if (this.isRoaming) {
+ this.isRoaming = false;
+ if (this.flyToOptions) {
+ this.viewer.camera.cancelFlight();
+ }
+ }
+ }
+
+ /**
+ * 恢复漫游
+ */
+ resumeRoaming() {
+ if (!this.isRoaming && this.path.length > 0) {
+ this.isRoaming = true;
+ if (this.currentIndex === -1) {
+ this.flyToFirstPoint();
+ } else {
+ this.flyToNextPoint();
+ }
+ }
+ }
+
+ /**
+ * 添加路径点
+ * @param {Cesium.Cartesian3} point - 路径点
+ */
+ addPathPoint(point) {
+ if (point instanceof Cesium.Cartesian3) {
+ this.path.push(point);
+ } else {
+ console.warn('路径点必须是Cesium.Cartesian3类型');
+ }
+ }
+
+ /**
+ * 清除路径
+ */
+ clearPath() {
+ this.stopRoaming();
+ this.path = [];
+ this.currentIndex = -1;
+ }
+
+ /**
+ * 设置飞行持续时间
+ * @param {number} duration - 持续时间(秒)
+ */
+ setDuration(duration) {
+ if (typeof duration === 'number' && duration > 0) {
+ this.duration = duration;
+ }
+ }
+
+ /**
+ * 销毁控制器
+ */
+ destroy() {
+ this.stopRoaming();
+ this.viewer = null;
+ this.path = null;
+ }
+}
+
+// 使用示例:
+// 假设已经有一个Cesium Viewer实例叫做viewer
+//
+// // 创建漫游控制器
+// const roamingController = new CesiumRoamingController(viewer, {
+// speed: 20,
+// pitch: -20, // 20度俯角
+// headingOffset: 0
+// });
+//
+// // 示例1: 自由漫游
+// // 开始自由漫游
+// document.getElementById('startFreeRoam').addEventListener('click', () => {
+// roamingController.startFreeRoaming(15); // 速度15米/秒
+// });
+//
+// // 示例2: 路径漫游
+// // 创建路径点
+// const pathPoints = [
+// Cesium.Cartesian3.fromDegrees(116.3, 39.9, 200),
+// Cesium.Cartesian3.fromDegrees(116.4, 39.9, 200),
+// Cesium.Cartesian3.fromDegrees(116.4, 40.0, 200),
+// Cesium.Cartesian3.fromDegrees(116.3, 40.0, 200)
+// ];
+//
+// // 开始路径漫游
+// document.getElementById('startPathRoam').addEventListener('click', () => {
+// roamingController.startPathRoaming(pathPoints, 30, true); // 速度30米/秒,循环漫游
+// });
+//
+// // 停止漫游
+// document.getElementById('stopRoam').addEventListener('click', () => {
+// roamingController.stopRoaming();
+// });
+//
+// // 调整速度
+// document.getElementById('speedUp').addEventListener('click', () => {
+// const currentSpeed = roamingController.speed;
+// roamingController.setSpeed(currentSpeed + 5);
+// });
+
\ No newline at end of file
diff --git a/src/views/projectLarge/ProjectScreen/js/CesiumImageLabelEntity.js b/src/views/projectLarge/ProjectScreen/js/CesiumImageLabelEntity.js
new file mode 100644
index 0000000..fea29ec
--- /dev/null
+++ b/src/views/projectLarge/ProjectScreen/js/CesiumImageLabelEntity.js
@@ -0,0 +1,293 @@
+export default class CesiumImageLabelEntity {
+ /**
+ * 构造函数 - 创建带有图片和名称的Cesium Entity
+ * @param {Cesium.Viewer} viewer - Cesium Viewer实例
+ * @param {Object} options - 配置选项
+ * @param {Cesium.Cartesian3} options.position - 实体位置坐标
+ * @param {string} options.name - 实体名称(标签文本)
+ * @param {string} options.imageUrl - 图片URL
+ * @param {Function} [options.onClick] - 左击事件回调函数
+ * @param {string} [options.id] - 实体ID,可选
+ * @param {number} [options.imageWidth=64] - 图片宽度
+ * @param {number} [options.imageHeight=64] - 图片高度
+ * @param {Cesium.Color} [options.imageColor=Cesium.Color.WHITE] - 图片颜色(用于色调调整)
+ * @param {Cesium.Color} [options.labelColor=Cesium.Color.WHITE] - 标签颜色
+ * @param {string} [options.labelFont='16px sans-serif'] - 标签字体
+ * @param {number} [options.labelOffsetY=-70] - 标签Y轴偏移量(相对于图片)
+ * @param {boolean} [options.show=true] - 是否显示实体
+ * @param {Cesium.HorizontalOrigin} [options.horizontalOrigin=Cesium.HorizontalOrigin.CENTER] - 水平对齐方式
+ * @param {Cesium.VerticalOrigin} [options.verticalOrigin=Cesium.VerticalOrigin.BOTTOM] - 垂直对齐方式
+ */
+ constructor(viewer, options) {
+ // 验证必要参数
+ if (!viewer || !(viewer instanceof Cesium.Viewer)) {
+ throw new Error('必须提供有效的Cesium Viewer实例');
+ }
+ if (!options || !options.position) {
+ throw new Error('必须提供实体位置信息');
+ }
+ if (!options.name) {
+ throw new Error('必须提供实体名称');
+ }
+ if (!options.imageUrl) {
+ throw new Error('必须提供图片URL');
+ }
+
+ this.viewer = viewer;
+ this.onClickCallback = options.onClick || null;
+ this.options = {
+ // 默认配置
+ id: options.id || `image-label-entity-${Date.now()}`,
+ imageWidth: options.imageWidth || 64,
+ imageHeight: options.imageHeight || 64,
+ imageColor: options.imageColor || Cesium.Color.WHITE,
+ labelColor: options.labelColor || Cesium.Color.WHITE,
+ labelFont: options.labelFont || '16px sans-serif',
+ labelOffsetY: options.labelOffsetY || -80,
+ show: options.show !== undefined ? options.show : true,
+ horizontalOrigin: options.horizontalOrigin || Cesium.HorizontalOrigin.CENTER,
+ verticalOrigin: options.verticalOrigin || Cesium.VerticalOrigin.BOTTOM,
+ ...options
+ };
+
+ // 创建实体
+ this.entity = this.createEntity();
+
+ // 初始化点击事件监听
+ this.initClickHandler();
+ }
+
+ /**
+ * 创建实体
+ * @returns {Cesium.Entity} 创建的实体对象
+ */
+ createEntity() {
+ const entity = new Cesium.Entity({
+ id: this.options.id,
+ position: Cesium.Cartesian3.fromDegrees(
+ this.options.position.lng,
+ this.options.position.lat,
+ this.options.position.alt
+ ),
+ show: this.options.show,
+
+ // 图片属性
+ billboard: {
+ image: this.options.imageUrl,
+ width: this.options.imageWidth,
+ height: this.options.imageHeight,
+ color: this.options.imageColor,
+ horizontalOrigin: this.options.horizontalOrigin,
+ verticalOrigin: this.options.verticalOrigin,
+ // 允许实体被选中
+ pickable: true
+ },
+
+ // 名称标签属性
+ label: {
+ text: this.options.name,
+ font: this.options.labelFont,
+ fillColor: this.options.labelColor,
+ horizontalOrigin: this.options.horizontalOrigin,
+ verticalOrigin: Cesium.VerticalOrigin.TOP,
+ pixelOffset: new Cesium.Cartesian2(0, this.options.labelOffsetY),
+ // 添加背景
+ backgroundColor: new Cesium.Color(0, 0, 0, 0),
+ backgroundPadding: new Cesium.Cartesian2(5, 5),
+ showBackground: true,
+ // 允许标签被选中
+ pickable: true
+ }
+ });
+
+ // 将实体添加到viewer
+ this.viewer.entities.add(entity);
+
+ return entity;
+ }
+
+ /**
+ * 初始化点击事件处理器
+ */
+ initClickHandler() {
+ // 存储当前实例的引用,方便在回调中使用
+ const self = this;
+
+ // 注册左击事件
+ this.viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
+ // 检测是否点击了当前实体
+ const pickedObject = self.viewer.scene.pick(movement.position);
+
+ // 检查是否点击了当前实体或其实体的子组件(billboard、label等)
+ if (Cesium.defined(pickedObject) &&
+ (pickedObject.id === self.entity ||
+ pickedObject.id === self.entity.billboard ||
+ pickedObject.id === self.entity.label)) {
+
+ // 如果设置了点击回调,则执行
+ if (self.onClickCallback && typeof self.onClickCallback === 'function') {
+ self.onClickCallback(self.entity, movement.position);
+ }
+ }
+ }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+ }
+
+ /**
+ * 设置点击事件回调函数
+ * @param {Function} callback - 回调函数,接收(entity, position)参数
+ */
+ setOnClick(callback) {
+ if (typeof callback === 'function') {
+ this.onClickCallback = callback;
+ } else {
+ console.warn('回调函数必须是一个函数');
+ }
+ }
+
+ /**
+ * 平滑飞行到实体当前位置
+ * @param {Object} [options] - 飞行参数配置
+ * @param {number} [options.duration=3] - 飞行持续时间(秒)
+ * @param {number} [options.offsetDistance=1000] - 距离目标点的距离(米)
+ * @param {Cesium.HeadingPitchRange} [options.headingPitchRange] - 方向、俯仰和范围,优先级高于offsetDistance
+ * @param {Function} [options.complete] - 飞行完成后的回调函数
+ * @param {Function} [options.cancel] - 飞行被取消后的回调函数
+ */
+ flyTo(options = {}) {
+ // 获取实体当前位置(考虑可能已更新的情况)
+ const currentPosition = this.entity?.position?.getValue(Cesium.JulianDate.now());
+
+ if (!currentPosition) {
+ console.warn('无法飞行到实体,实体或实体位置不存在');
+ return;
+ }
+
+ // 默认飞行参数
+ const defaultOptions = {
+ duration: 3,
+ offsetDistance: 1000,
+ complete: () => {},
+ cancel: () => {}
+ };
+
+ // 合并用户配置和默认配置
+ const flyOptions = { ...defaultOptions, ...options };
+
+ // 计算飞行视角
+ let headingPitchRange;
+ if (flyOptions.headingPitchRange) {
+ headingPitchRange = flyOptions.headingPitchRange;
+ } else {
+ // 默认视角:从上方稍远处看向实体
+ headingPitchRange = new Cesium.HeadingPitchRange(
+ 0, // 方向角(弧度)
+ Cesium.Math.toRadians(-30), // 俯仰角(弧度),负值表示向下看
+ flyOptions.offsetDistance // 距离目标点的距离
+ );
+ }
+
+ // 执行飞行到当前位置
+ this.viewer.flyTo(this.entity, {
+ destination: currentPosition, // 明确指定当前位置作为目标
+ duration: flyOptions.duration,
+ offset: headingPitchRange,
+ complete: flyOptions.complete,
+ cancel: flyOptions.cancel
+ });
+ }
+
+ /**
+ * 更新实体位置
+ * @param {Cesium.Cartesian3} position - 新的位置坐标
+ */
+ updatePosition(position) {
+ if (position && this.entity) {
+ this.entity.position = position;
+ // 更新options中的位置,保持同步
+ this.options.position = position;
+ }
+ }
+
+ /**
+ * 更新实体名称
+ * @param {string} name - 新的名称
+ */
+ updateName(name) {
+ if (name && this.entity && this.entity.label) {
+ this.entity.label.text = name;
+ }
+ }
+
+ /**
+ * 更新实体图片
+ * @param {string} imageUrl - 新的图片URL
+ */
+ updateImage(imageUrl) {
+ if (imageUrl && this.entity && this.entity.billboard) {
+ this.entity.billboard.image = imageUrl;
+ }
+ }
+
+ /**
+ * 显示实体
+ */
+ show() {
+ if (this.entity) {
+ this.entity.show = true;
+ }
+ }
+
+ /**
+ * 隐藏实体
+ */
+ hide() {
+ if (this.entity) {
+ this.entity.show = false;
+ }
+ }
+
+ /**
+ * 移除实体
+ */
+ remove() {
+ if (this.entity) {
+ this.viewer.entities.remove(this.entity);
+ this.entity = null;
+ }
+ }
+
+ /**
+ * 获取当前实体
+ * @returns {Cesium.Entity} 当前实体对象
+ */
+ getEntity() {
+ return this.entity;
+ }
+}
+
+// 使用示例:
+// 假设已经有一个Cesium Viewer实例叫做viewer
+// // 创建实体
+// const initialPosition = Cesium.Cartesian3.fromDegrees(116.39, 39.9, 100);
+// const imageEntity = new CesiumImageLabelEntity(viewer, {
+// position: initialPosition,
+// name: "可移动点",
+// imageUrl: "path/to/your/image.png",
+// onClick: function(entity) {
+// console.log("点击了实体,飞向当前位置");
+// entity.flyTo(); // 飞向当前位置
+// }
+// });
+//
+// // 一段时间后更新位置
+// setTimeout(() => {
+// const newPosition = Cesium.Cartesian3.fromDegrees(116.45, 39.92, 100);
+// imageEntity.updatePosition(newPosition);
+// console.log("实体位置已更新");
+// }, 2000);
+//
+// // 调用flyTo将飞向最新的位置
+// setTimeout(() => {
+// imageEntity.flyTo({duration: 2});
+// }, 4000);
+
\ No newline at end of file
From e6f235036e0d387ae238a4fc21a754282ddba28d Mon Sep 17 00:00:00 2001
From: tcy <1193318383@qq.com>
Date: Tue, 9 Sep 2025 21:12:04 +0800
Subject: [PATCH 16/19] =?UTF-8?q?refactor(components):=20=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=E5=A4=9A=E4=B8=AA=E7=BB=84=E4=BB=B6=E7=9A=84=E6=A0=B7?=
=?UTF-8?q?=E5=BC=8F=E5=92=8C=E5=B8=83=E5=B1=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 调整了多个组件的输入框、按钮等元素的样式
- 优化了部分对话框的布局结构
- 统一了表单项的样式
- 调整了部分字体大小和颜色
---
src/components/FileUpload/index.vue | 52 ++----
.../formalitiesAreConsolidated/index.vue | 132 +++++--------
src/views/progress/plan/index.vue | 104 ++++-------
src/views/progress/progressCategory/index.vue | 176 +++++++++++++++---
src/views/tender/plan/comm/planPage.vue | 18 +-
src/views/tender/plan/comm/winTheBid.vue | 14 +-
src/views/tender/plan/index.vue | 171 ++++++-----------
7 files changed, 306 insertions(+), 361 deletions(-)
diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue
index bd0b93c..e7a4f60 100644
--- a/src/components/FileUpload/index.vue
+++ b/src/components/FileUpload/index.vue
@@ -1,29 +1,11 @@
-
+
@@ -42,20 +24,10 @@
的文件
-
-
+
+
{{ getFileName(file.name) }}
@@ -305,8 +277,6 @@ const handleChange = (file: any, filelist: any) => {
// 删除文件
const handleRemove = (file: any, fileList: any) => {
- console.log(11);
-
emit('handleRemove', file, fileList);
};
@@ -470,7 +440,7 @@ defineExpose({ submitUpload });
}
}
- > span {
+ >span {
width: 100%;
}
}
diff --git a/src/views/formalities/formalitiesAreConsolidated/index.vue b/src/views/formalities/formalitiesAreConsolidated/index.vue
index b276f4d..d848aa7 100644
--- a/src/views/formalities/formalitiesAreConsolidated/index.vue
+++ b/src/views/formalities/formalitiesAreConsolidated/index.vue
@@ -1,6 +1,7 @@
-
+
@@ -11,25 +12,15 @@
-->
-
+
-
+
-
+
-
+
@@ -181,7 +161,8 @@
-
+
{{ scope.row.fileName || '查看文件' }}
@@ -192,13 +173,8 @@
-
+
关闭
@@ -208,18 +184,9 @@
-
+
@@ -247,18 +214,14 @@
-
+
@@ -284,7 +247,8 @@
-
+
diff --git a/src/views/progress/plan/index.vue b/src/views/progress/plan/index.vue
index b4eb9cf..433cb9b 100644
--- a/src/views/progress/plan/index.vue
+++ b/src/views/progress/plan/index.vue
@@ -1,12 +1,14 @@
-
+
-
+
@@ -21,24 +23,16 @@
-
+
-
+ @click="handleToggleExpandAll">
+
+
@@ -46,9 +40,8 @@
- {{ row.name }}
+ {{ row.name }}
{{ row.name }}
@@ -60,7 +53,8 @@
- {{ row.isDelay == '1' ? '是' : '否' }}
+ {{ row.isDelay == '1' ? '是' : '否'
+ }}
@@ -71,7 +65,8 @@
-
+
@@ -87,35 +82,17 @@
-
+ v-hasPermi="['progress:progressCategory:add']">
导入表格
-
+
计划
-
+
日报
@@ -132,7 +109,8 @@
-
+
@@ -140,7 +118,8 @@
- {{ row.name }}
+ {{ row.name }}
{{ row.name }}
@@ -163,7 +142,8 @@
-
+
@@ -179,28 +159,17 @@
-
+ v-hasPermi="['progress:progressCategory:add']">
导入表格
-
+
计划
-
+
日报
@@ -211,7 +180,8 @@
-
+