From 09daf9bb4d69c092497553b6037ccc6ef150b13f Mon Sep 17 00:00:00 2001 From: hs <873121290@qq.com> Date: Thu, 11 Sep 2025 15:27:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=AB=E9=A1=B9=E4=BD=9C=E4=B8=9A=E6=95=B4?= =?UTF-8?q?=E4=BD=93=E4=BF=AE=E6=94=B9=E6=8F=90=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle.kts | 2 +- assets/images/highwork_tip.jpg | Bin 0 -> 11579 bytes lib/customWidget/single_image_viewer.dart | 47 +- lib/http/ApiService.dart | 6 +- .../safeCheck_sign_list_page.dart | 12 +- .../check_person_list_page.dart | 9 +- .../safeCheck_danger_list_page.dart | 9 +- .../Record/defend_record_list_page.dart | 9 +- .../Start/safeCheck_start_list_page.dart | 9 +- lib/pages/home/tap/item_list_widget.dart | 32 +- .../special_wrok/MeasuresListWidget.dart | 46 +- .../dh_work/HotWorkDetailFormWidget.dart | 2 +- .../dh_work/SpecialWorkFormBaseWork.dart | 2 +- .../dh_work_detai/hotwork_apply_detail.dart | 9 +- .../dh_work/hotwork_list_page.dart | 14 +- .../jszy_work_detail/hotwork_jszy_detail.dart | 2 +- .../kszy_work_detail/hotwork_kszy_detail.dart | 2 +- .../hotwork_set_safe_detail.dart | 2 +- .../dl_work/CutroadDetailFormWidget.dart | 7 +- .../dl_work/CutroadFormBaseWork.dart | 189 ------- .../cutroad_safe_func_sure.dart | 6 +- .../dl_work/cutroad_list_page.dart | 13 +- .../dl_work_detai/cutroad_apply_detail.dart | 179 +++--- .../jhr_work_detail/cutroad_jhr_detail.dart | 62 ++- .../jszy_work_detail/cutroad_jszy_detail.dart | 2 +- .../kszy_work_detail/cutroad_kszy_detail.dart | 2 +- .../shbm_work_detail/cutroad_shbm_detail.dart | 53 +- .../spbm_work_detail/cutroad_spbm_detail.dart | 53 +- .../cutroad_set_safe_detail.dart | 2 +- .../szdw_work_detail/cutroad_szdw_detail.dart | 52 +- .../zyfz_work_detail/cutroad_zyfz_detail.dart | 52 +- .../zyr_work_detail/cutroad_zyr_detail.dart | 76 +-- .../dt_work/BreakgroundDetailFormWidget.dart | 514 +++++++----------- .../dt_work/SpecialWorkFormBaseWork.dart | 439 +++------------ .../breakground_safe_func_sure.dart | 2 +- .../breakground_aqjd_detail.dart | 4 +- .../dt_work/breakground_list_page.dart | 14 +- .../breakground_apply_detail.dart | 170 +++--- .../breakground_dzzh_detail.dart | 4 +- .../breakground_jhr_detail.dart | 4 +- .../breakground_jsjd_detail.dart | 4 +- .../breakground_jszy_detail.dart | 6 +- .../breakground_kszy_detail.dart | 6 +- .../breakground_shbm_detail.dart | 6 +- .../breakground_spbm_detail.dart | 4 +- .../breakground_ssr_detail.dart | 4 +- .../breakground_set_safe_detail.dart | 4 +- .../breakground_szdw_detail.dart | 4 +- .../breakground_ysgd_detail.dart | 4 +- .../breakground_zyfz_detail.dart | 4 +- .../breakground_zyr_detail.dart | 4 +- .../dz_work/HoistworkDetailFormWidget.dart | 440 ++++++--------- .../dz_work/SpecialWorkFormBaseWork.dart | 202 +++---- .../dz_work_detai/hoistwork_apply_detail.dart | 218 ++++---- .../dz_work/hoistwork_list_page.dart | 20 +- .../hoistwork_jszy_detail.dart | 2 +- .../hoistwork_kszy_detail.dart | 2 +- .../ssr_work_detail/hoistwork_ssr_detail.dart | 2 + .../hoistwork_set_safe_detail.dart | 2 +- .../gc_work/HighWorkDetailFormWidget.dart | 310 +++++++---- .../gc_work/SpecialWorkFormBaseWork.dart | 201 +------ .../highwork_safe_func_sure.dart | 1 + .../gc_work_detai/highwork_apply_detail.dart | 213 ++++---- .../gc_work/highwork_list_page.dart | 14 +- .../jhr_work_detail/highwork_jhr_detail.dart | 1 + .../highwork_jszy_detail.dart | 2 +- .../highwork_kszy_detail.dart | 2 +- .../highwork_shbm_detail.dart | 2 +- .../highwork_spbm_detail.dart | 107 ++-- .../highwork_set_safe_detail.dart | 3 +- .../ElectricityDetailFormWidget.dart | 267 +++++---- .../lsyd_work/SpecialWorkFormBaseWork.dart | 202 +++---- .../electricity_safe_func_sure.dart | 1 + .../lsyd_work/electricity_list_page.dart | 14 +- .../electricity_jhr_detail.dart | 1 + .../electricity_jszy_detail.dart | 2 +- .../electricity_kszy_detail.dart | 2 +- .../electricity_apply_detail.dart | 10 +- .../electricity_set_safe_detail.dart | 3 +- .../electricity_ydr_detail.dart | 55 +- .../mbcd_work/BlindboardDetailFormWidget.dart | 40 +- .../mbcd_work/blindboard_list_page.dart | 13 +- .../blindboard_jszy_detail.dart | 2 +- .../blindboard_kszy_detail.dart | 2 +- .../blindboard_apply_detail.dart | 8 +- .../blindboard_set_safe_detail.dart | 2 +- .../sxkj_work/SpaceWorkDetailFormWidget.dart | 258 +++++---- .../sxkj_work/SpecialWorkFormBaseWork.dart | 348 ++---------- .../spacework_safe_func_sure.dart | 1 + .../jhr_work_detail/spacework_jhr_detail.dart | 1 + .../spacework_jszy_detail.dart | 2 +- .../spacework_kszy_detail.dart | 2 +- .../spacework_apply_detail.dart | 9 +- .../sxkj_work/spacework_list_page.dart | 14 +- .../spacework_set_safe_detail.dart | 3 +- .../home/tap/tabList/work_tab_dz_list.dart | 22 +- 96 files changed, 2172 insertions(+), 3019 deletions(-) create mode 100644 assets/images/highwork_tip.jpg diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index 3f71f7d..4e1fc7f 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -30,7 +30,7 @@ android { defaultConfig { applicationId = "com.zhuoyun.qhdprevention.qhd_prevention" - minSdk = 22 + minSdk = 24 targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName diff --git a/assets/images/highwork_tip.jpg b/assets/images/highwork_tip.jpg new file mode 100644 index 0000000000000000000000000000000000000000..19dfad18780de638b4afe2776d54e54f0098c542 GIT binary patch literal 11579 zcma*N1yohh_b$4T5Kuz8K|xx&yFt1;q#G1Cbg6`Zbmx(h?vh53?mUEaNp~IUZvOYa z_r|#I_rK%rG1%w8SggI*oO6A1&h>p^s>-q$=p^U>0AReAlTrtOXAtmvIO;R-E;+)q z1%9A?l+$ws0L(v6KM09Tn4|ze1-zFM*YwOdSo9M6enSczTbKVNPCWdYkk=d&hm&a_ zcUV&?F*01o+&rjXTe?50Zx5?FjI4FCdx54_s2Pr#-|S{9@Y5>IYH91LH^wc-k%MG( zoAsy#b|$j4m3nk_-*%*cgB~1+ErI&F>WzW`5QHruhi>X8jruz157r(N_-7h_U6WVf z=Sdel92^!#IivG5=&rKu&ADligsGL)R;HlGQk9~(xcFdyb#?XW>1ln$^z<}2zl)Sx zw4tZxwdms=H8yG!#p~!^-21QHW{C+2waqUhx_9AG*b+x#iEaSu1z^acqph7J^#%b5 zlS<=vwK6wfpDa+3hN1>bh(J}|#M*F?09@SM{QUf>X=x!rLEi{cMEnGTB^v#1-AjhE zMEtzF!|~bK*?XfYMO`-fT79nY@bG$~$QPVm?!hYBKdyF$V31BsOt2WY5aHl(cpk5~ zOOo?Aq$DT9=IiVo9UMZiDE;B*JKBQ@NlEjwvktSB;yOCKJUmJA`EmUgYK7psO0>&x zOt!G$zMzHv-7_;Y&pNoD(IgLUe&kC_OB;rwB7IqG_PD*i2E<%kP9q3eXUYudigj~x zq_b7$op_j;6%7o0Mze&arKPK?stykihr8>Fio!;>CwI=bg0(a?U0hre5)+AE%0M7> zIXPy{*(gXz8(UlY`uYO{15w1BTYno}J&u+jA3xgEy-Zci;^X}$MOG~TF3N2WIl9Eyc>TGRI2dAN@|3>xg z>vJp$5nm#JRwav>u@(aZ1N7lAlZfy2@!?|gdQYT=rlw(=uh*wfpQNOMl9G~a(t!_- zj^rdH1FIihTwRBUhBh`g5d!-yKr3;iGBeK7DQBecIHqM}WZ0xzT3UYo{23DylY)W* zI6fN{m6et*Gi>B|^F~5Rsmv=Cw9!bW;ML0SuRA+CUGx_PJj8-8V81l9p@a%z^l9*6CK@-B|{>cO+a8Cyt=#d^YUoe*gnoxTLLke znZh<>KO{pj`2__d2yRb$DN9O9KnuU2rta$M5*89NGc&UqPUH5!^8{ATZgzKfpMCx? zTWJ~|9u5Xk&KE|;@*F>W0)le=Iz~ReYcND|99eWLf3&sv-(DW%AcJeZzrQDZr_bem z{x4TH8g$Xj%#62>&)~oSCWVmaLcL>CQ@PERMw=SPunqXY1Zy@H=V>pf4_ z5)$wLKF}{jg;f}t$)ok%=i9rSBPS{fMA zll3PV{H`IxR$%BEXd3F28xj)}@2sw77Z#?Zr>7@BUAz{3F^Nn%1cZbtXU%ne_BT^{Ur{jZ zxc9Y9OiT<645+Zb$?%+bwg~%N_6-iw(a?Z41O`*%fE)tL13g;Kqm zku2e6*KK75g~7W!UoWp4$A$X-fdSAqF>*8k0Rd`z@yZ3D^$uBz{;{!`!A&bmOIv$;lP0$? zMOu|~9!C%+?r*PD6ckD-DzGpx@>S_gd{3k`H4`Et24xk&aC`9-ZVhJL;bUWCJv}|{ z+ayFpeFFnO3koX0$fcv(4tTs>hM5HTT_3O3)^br(=WZPu8W}BuuVK>WJJ-?C@%y(a z7+N__+j=!t2x8LG!K(Bbq5%&H3>qLz@R3E?l&R&)q^6|&>F(Ck)vf(&>*eL8t{zuV zK$j?wKdtkHih$MF7YwtQm>7FlIWiKGjh$Wf-2TNLthuSl2?VAoe4!5=fmPYqE@3WMUN-I z$Cn`hVPs*6lF23K``EF#=(jsnv^|o!P-m|Lx&hpm(h*_$@vd7#slq-yVNwF0){vm1 z&dt;s8XB^)y-85eKQCTH93LNl|NcD*>b%s_SYAFdI;z6;K6l)Ge-;5a+a8S$3mc!9 z&~I{Mh?G%KQL(O>1C6hvrG*T9p%M}jQdd_;fANBxoZNaS<@ct`J7#8dbo9IX`yx%o z_XSQUY2%ADi$M=%ONN4QmtR`?5{Qh9%+JpsOlE~mPDVsW6TYJ*p{xai zXFONd-o}R6@RzFQbQ-(Nqc*4Op6;wQ+J{NmIyHm5HV}I6QQ+w`ambZ!|otcU%w> z76!k7Uijw*?~A3DMofGqVH9+MpN&Pu%36`1zqz%A0^Ho(z{-v6ea!8Zl!n24V9TX% zX}S5GnDgQ8Y!vj}mhqa^aO8Xvw6L&{2z=~rNmNwSKi6^mzuMrmUyxtS`?opFRSyjf zf$oo>ot&5e^BT%aBC52~!a~oRQ_J`7`@xMXub^Pd1!C^so=DOiH*YDaKcHd270w2q zQw1$`z{AI$k4;TY!C<5P{jZef7Zz&f_S4cx#%aW{!SyaSIGcbGY!YyOHq!ih^u9U)N3hum|wRuA`=}mVKRuqz19G4bv&bAQ|5q&Op!5nvb zc82f)1Q}+6lB%jt)5TgZQF6ij)@=rQWw@v3XI|c)(NR_*A>YgWxuvD0@$qq3g-LXH zxVpBsQ(J+Yo*q9pw-#uo!NG`bGh`H$k#ydQ+S;kn(de$#!s251_4WRI-HTAZ*HaL% zDDiF&2|-b#JW>(8pR$|z6NXFu=FLkC41^D>oxz~1pHj(4CMORM3V?+b4b~_kUZ)%2 z<{)G>#zRFyK|uj?4*_HY2WkAS!}JRkSjr4$S*U4TZw@AtVTOXRJuuMJ*a#-fw{P=f zsb#C@9C*?fr=~QGjD}Y~f>BCFMmFnE4~3eDi3QqBP1o8^T3A?sdxd(JiQocjxjg`? zNV~nY)zsWPn!(S>!g2^kAR@}kUv4`%@%b(GZWaVIwYAHQTjzUwd#9%_+L68P;Sg!*?$xeP-hk8d9Sv}=AtML7CvSh` zdx=5~Zb44Y$)`Pw*$Ae#y_qru1caks%HOefUxGEn>!6tH)wA@c^6)>@e_$QB7J7mI zItUv_^nVThzbzgA`+tp|AAjk~$_zg7+?WQZ=$^O}Q%Xw8cb^C>LbEA0cc)9p6UQ+Z zDl9nW=H_m|4MoYTIfY3`n5>k})A;L`oB%dBxAXPQ&F1#D2Nz*Q`}IxC zu{u{#^7e5jY*()y(iB_ z=H{8-D;{$$8NcnS4aJc?WUuMz1ILs{hok6F0kYGum{~W^089xvfs+?&&cY1qyrNkaS9cL6{vdgRgHIefHOhco^9#sjJj8=H4Z>TC2ZTJoqU zA*qy9S@c+Pcm21AQSIV-Bj8PvK=6V$QA93h$okpw>5+B1f0wV1MrL%3k58}8<3J>b z4))@*%0IgV(d#ScEFrWXJDd0G$+k?&4?L2OWj1@AzOZg*qrbsOZ>IR4>@hT!pvBGY z)6bw`Y(c<4x^wl+^-LT9I>Qt4yw|huEr*87`V~WLOhu%OdD9qxGI6<+P`WP4_Pjip^dk&OvM8@ zq(f*YoAd+3g7S)oNNQR|a5o#r+Z`2a=ZW0jBmZK*_5a3wYZW>A1>(5Q{P$K1K2J{= zqN@?E>hsj6G{#PnIv@jYP1_>Odi=M4p6@cMt>=nfas&j_`Xu~Km-b@7(wOEd?NZKM zqkF8Q8sgc_;^iX9@3ES0BBrnXODlMKMQsu7GmoeIcbxtV@%AF%lM1xC*MkTV@Fny^ z1b}JwWOJ_G$VumdlNTKk%OaD|+O;thop%GzrR1LBwEsNTLrFD>fpZyDa8c(zL%Lz; z_qsPWd@-A9R%d!onD)*eKGYaQyAdM6N3_@9iY)WG9100~{T5D3(pUO%6cqQW#Q%CgE0k9M@H%!+I@)e+ zAanLLdPF;E|F7%8^vI7lTqqa--g5?8XW^p9nu<>gpD0_V0$4?1%j{AmmXp75U!fz3 zZ6yxiRkG1M)wI|GYxS5DMgN9o71*Ala&n)c*>9haD^2){lfE zOZDJyEeCa+#ewxN()!(>GKKd4wFaEN^YIPQMi1WGX|5CXVNEEC*fAP<ckRgf+<9gzfGlhU5d?2asKvCa-niQD!SbJX^v^_YrtzdH(o#;$(!{_?WO}Yn2bfb z|HB_$I+W+-V>l)iayccW^McWK(`Z8~kDoAndO4X$u{mfyUFs4F;?d{onZR34o$AK|1Huv-EX=U_!CUrFv=@p_7qYtGuLBQ;u`0S)Dp>} zCR}|%_h#wwVWEdVznUGk@qeCgDbdeg-$T^zt4Qzz<4;xjP8QIl2Lq7jvez?>xt}rU zCuN-_W0(WX2GcDB!w&O=4#`lK$c0mFA*rRt9~?(V1-87r#)8DJQD^Ho80|EHAM|>W z9=!Xx)9FY`8&$Zr8A6yTEz?w+OS)~NTdYyEfNBC47yKn9kN<23Gd}g=r!JJA{Yg4g zuYOF81X~6@Ftvz2&mP509b(wRN;%~0iaC#y%~l5sE-l@-xPCHjm~}{1PE%1Z0rGXx z>Zqchwf=YY0n9dc{#u8;?GN6Ak*c+etwI;{fZ`y7Mrgms@fQ{VUY=#_-Ave}Lo9%u#uQhI1Q2JMuMcdIv((bW-?>J;5zf}+dog&H?p9xt9Y zz%@G7nf^oPX@6doM20Fev=(81K=X_b`H*D8Sn?b?40PL8`0^nvuWop;`33O z&Qbf&B3T#jk$BYg+6}OIb8RRw7G{KP*}wW(Hm<*8w9SobZd2}9pA;GRab82dx9~$H zKqJbFIQ!G#!!nk4iKhpn1Ym3&mJ>|(HOEQN@pIYjJ>qTkJJ`^VOp{6#KkMUB^C<)7 z{%E6S@tp>eua6lVK_Wz8IV~c(p>y<=HlBphWg^Q3_|cT1q~YlGJFdJa9|h=;R~k~| zAP{=lD7ea`V+2T3OGYaDI;(P_L}%XG-5pmarPtkFR+7iw-tO7HE?S<=Hx4Od?Q^G< zSlJeSo9f5DGTnqu?JE?oGvwmad20qM%HMLH-kV>^-?qNLxH6E;dbMly1i^R5H#yd1 zv084o{TjAhIDpY`r(ElWi#eoSw)gGM8RiX2_CZ~h+4qAItVX6|^fW(g zU%C*}l1RLKmQz(!)~Ji3Cc2kqyAKtDR%JU zmQ(b@2fsTRG)aRx#>2lSRM`b3Wko$DE*W(Yt^CKy)nVz3_={5Yh}Y?HDO&jqOlN#M zUXcXx8Jc3}lU*+=<$NpKz|$@@WA$+Zh4`f~=~ufaX{cWSAO>2`TX@s8I%D-I`O=ZE z{Sn%O{9qBdd!C-%097;cpXXJ~e74eb=?n`VJz8ubj!z*YHd0krH_rdpcE2(U<5rlR z?ReEvRPjZ|-F)3Z&{DL~ZI?np`Lpsf;B{A5u-m~DL!6j>3*;hEqX4+x4>#6yx5KP} zBD89}a*0#lAfwx>JX^~->aoU4;4OT4ChRh8h|CzzO3r`WuE*4Q`ZDS9(@FvB@MN1X z|FxJYl(&lQ`3;K5DKc>UE&VyL@=CO#IWAJf9IR7hWCR2SJ-Bq#NpPa>u4Ubd#QGW^ z2R(YTUd*%ne&6o@;O^e4O7HM(QN;f=>laCOB|G(T!E%ng3F|xhu-V7Gd^h)qI=inw zuQJ_)3NjD;&@(bKsi~>ok|W2xNlYc~#yA+UmBVPiu2iJLLr4CC1^2;j=^OSr<9*vV z+GhcA4bs}&yy%4QU*D>r+s$LtW&hl|pe1R>c_Bf5vs+Sed9VN*|C_}fRL;28$I2^@ zL<5902LFw)u5%!0^t8P`_fq9y+nw}x##nS4+F0Gi1AeHA{5$%bGi`D;Y@SFjAcJDmlv<1X zim|we{WE{Z{74H_qB(m4AJ5o1XHiz>^;E03`Xig@yN{3SXrjUV#TvkdEPscG^~B$# z^m_PUwoTOBFJaza?`6&>#bd}_V!8MJ#Ez5P=v-0iK)IK-i33F}`lHGk>KMySymE4i zXQ`0<{VkPj^&Q-}MX!45dTd2m$bwW{#8F>QAqy9@;WYkk?hLtxx~t(SaUN{VBKh4a zoKr4G;|ZSyUkU9?>AqHq6-WLjJq({Xm9UB&<64=pL4<6TO$K}oRKb-HA75|wuq(3? z_%)K5;!dl(q}=*CJ?}?fOtyNVo50uKY?*u!OU;}OlvH5FNxsK$k(li6+p9DPeQ@(T zyW zUR;!W75HzO&GCHyZ;9+hZZTx*qQT*^!rx49j1 zh+#*@tHphBy7N8Fx~jXF$BNOyWEp@#lA@6pqb1YlyYIm$+Q2Nm_u zwYsk~ptlzA`g{-+E=w0+$Yb}|dUkbBPK4sh`;OJy(3P|4x0$8jHl^tHX)NEpR}HgB zrfUt@3=Uh>=rV(EHw<>H6-Lcl>+94zVtIz(*CAv4WyrF-^qxIP#07D`I@A>nGPLI^g)XkR#G zy@=rzqc6{KGPhpV3mkrBI#tkVW&i-`Vej8<0ZJpHAL0;zf7yB6zAR6gS1zIe_b zK{4EES@ZrSEwPOq2_xVu&PvWCYXk(I-uYr{|3wo@kb%@_l;aCO{~4x9>bI3sRFsT> z!FSSY?yYn^F+cyC1o+m{wasfVD*WqXTd-lT=~KXE!Vq`u7505zGbF{=4hTl|4D!q9eHNlzK?|@o+o>cGS0KA?zcc6NkV^k$G(3Uvx!3{M|M5^1g{_ z1y+)XSa+o2p?mM#-76vh+G---y4GZ``VFg*LP7M>NlhI((5E5)CFxg%kH~?`^+Lts z%7(N_o9BUAYW3~Xy7_Ys0HEKEB8{>$o~tv}HgWcX8a4CWG%}Q=d66(Y0~)DzWxR`w z^M9w2da5lZ*mv!v8N`lm>Xum60Mh^MPvV?;w5mnQ2q-M=tx+f)6jpXz-f%@ zl5G%;@;YeD`iJb4jy|Pdt2U)t0=L29qyntoZ8{`s{FdmShwMkNdsj6O&S}euj>vrF ze%W)j+a!>7vw@7OxCEJ0ceMH=O82Fr;OqcKVOT^?=_bM@>GwN{RY~BCtTbt_oVcGx zKIbbdjdu9bN12^%KIhX9MQujAi@oU{-m)n>yb1}29&ht=u;#){ukioMVC6xq+SS)3 zqv4`7ElTwz>Jk+_LagOESXY;jgGcXCOLn?wnHC#$5-#%-B*~sz9!AKwmcmPQeVp3+ z(s5WxsXkqvBc_kbv#Pe7hEL`mzKtf-D;@HZ`c7jlVG(>V<>B2)xIUNQ_DExVL1)}R zzn>%B@B+@STuKlM@|4!+4~T1cTF)SF$xC0f)CP<$+H;M)Mg-UrP;J{E7Eex2p_Hd= zeE&}QqGYlm4EcW|o)eY_ks10AtvNZl=EuT?0~O&{kG>ohDO6 zp~~|j*EP*I6^jXWqfNR}S2MhNq)BZHt6E`>>0RP;!UCU#w;#yP)yCk>6}rN;4cI{7 zhr}d?s{;jOAZKO5PC>mQjLyCkMuv&j=xH(N+dH$oRdF(C#tIek7O6j<*5DUxEU%1` z(xN&kF~LjtH1DJduk~oTt2H5KX7LejZiXMgSRQ&4+`Zc;D!%3(YIX`HJN~>~IyS;o z1XeZ)YcO8c6#s~<$)myMbNV<}__?d^6GV(sY_OB;){ zp)C|yVx<-T90#J9u1Z}so(InRv_HSnuj@!d0Pr&V5llZl4w=zrz-@M-ZN>N$_9>KxRAon6JHIR+t?OvZV-MH z)YnO?bH$7({4Sbw&&%HX!PawnFIs;q=HDvXp9j+^mWQ(y$|wdnrOAvC?dNiChn^5q zPJr)bobX|(?O%f(ahd7*wxqB1sFgMBEpdtp@hnhAl-;}I(Z zwdENtg((nFoI691Ee&CLyY-7*Xx>%7r9; z!>KOZZx{G=-2o4yR|q#6?vE>lm%F%c9y_r}yE^>g$;Rg2A+jU)rW=Oi*Zm!oTgX%F z@CBcD`YSoI_(t{!z>jhI&YwTAbd$?BT0UmkSihXimaO@rK`K_EfqgjDtj=?U!?Q*WqL&&cF#=w9M z{%4)v#S=5T)YPAIlUwSyD^W$a`#fvzmHXc>V|x4H)DNwqwr6FE?NiE>VN2`q-V`+7 z*Zx++_%`u;T%{2Z8_#T7-x%fO;*2Uyo99%f zyytec5ka--Y13dn$m>_+s2ZzIp|(26V#tS$;z8(Kg-Tz{}MqEx^GX+Mi1%?-!yM6_gU++ZH+1v${-c)-EZVc@M8*bM){o zUdQWTrM8fG=A&g7V3iAKcOE%z2-qKT(fPT;VgcZ&uo5f6)syYL7(r{IF}#d-9Bm4yAwA)|6wu4K zl8?N!Z-X!LgkEmtdjC(1oDzBetDr9arLw5C&?{oL0lXKlS5wUrayKR3tE!J$5()}qig zn5-42tMeTP2Z#CHySL=Qp1yAw96=Hmwli4({>ta~WzOBrt;O%QJ}>v0+4o{v2P6ac zY*^||Vu{AIG#}262Fgn#=7SmTQ`i;?srlN_p3dOg!Bg>PpFui#7i{z>c`2r%ii?Xu zx(}x)cYEVCd*9HIMa`UNr$+-w@Pjfyf{gItcMQnDdT%rY0!d8BbD|k22pYB$^|>6HpVtTL-A0i91e*$sNFEi4*jju- z!c==ez+KNZDhDU$_HcTGd2f{aw)?EVB}XbK9B6P_+#Q)!E%^28m&1H*e|NX^Q_1}2 zj}*ulJLo`oot>RkR8+wGQ+EKW2kIT>);2b1!0rGFvMf+g?U5D%`|q?UV2Sm=a}ld& zuVOt<_#Mi{PyreoE$u9ZduM|CSyW^4P#6sofRi|qhfS8XG94s@3!Q{%AvHvG5n3io z#b@J0=Acoj?Qo3I%X7yRz7(oaqx*1+ABJB*#o+t+<#nrUnJ|Q@tahDnCi}5igmrb< z#2VwDu=im8^_OJiuvI~!M8&Q9R}Y1O?{>z#MRI6)50_0^U!n|MzukDKX(#4l4!a!V7gim} zZD)Dok|_XUUs&j+byV6Kzai#_9}@8XBl}Pl66@SIJ7PW}?(%(eq1_llZ8410C1zFy zSEu4;sj8NJLH%7?gE^zYKWDD$p!|miI_#Hx>I?p55yH)o?l#iy*)Jd^qY`=dzLwt0>qereL`)lKG|5rg_D9H4FL+|y9!nJ9In}5lF^4kw~@ z%}3&sRSoMRzN*SVEOaW*vV>|U@Q;}Mp1q?X|Fn9*uSogME}^!(uVB}IPNAsalm7j- z>O%F^!q|eb*2Ltppcj9dvbc(=pEZdTDPr;k zpU_vB9VS%uXWY1iy&&kHj^Fn6Fq-K1nZ)piI~9s;ul=vd+RG>gu`ao|8*P>2iBbMp zDsq1B-LogoC6j^Ta7McXM%^uw&<6z77^9qW4gmUZTpGgaG63<7f+EomGyh=FA)M$v zXhT)a1Wzxi!_j&jSED)x`x$gdiw9%eN`*-U-)`)GwJxd^NrXj{Gm!4HLo6uK1FP>7 z7HMRQh!&94^-K~SlPEBa7~#BK7W0RdwsBGaYC6gII?aFNeT}h0hx3fUooO$oE|%-K z;B4|C^&=tgem+mDPhn$=5tEvb_aD0s{@TN8SbbQg!hq=4mXvdZWea9}up6Sm0QtTr zMH~4g*4fP+DCl}Y$m09gQ&n(aa1hi<8E9#}1<^)NSy>qZ;m$fPVQuG4@@*q6jSJ%|k)zt~6EtvY@qauMSCs4bzNI(1Swe2J= zAtB)t7UJOIf}({Ja2k*_&&tXI?{S!*NRFT1ajv?%zyCcrsVI1X%z4z-+Qt8?&-)LU z_`mV96IXYpG_R2=qPpyHo&jO<*6OI3D#vybSz%bX*oa>YdRHTG6m$Aj!(_&hVhY`e zZSX8fe$#|p&YyG*e@x94?SJYlp7$T5@ThnK;P=xqYq)PbhZ+QsbDs(^{6}H?pV1Juj;kg&VzqcukM;dStpMzZ029t>`8`YZe^Amp6J^0# z)1KqcceUxVyk&AE5R2Pqgw~|O3|>Azr7ATfMnssMR!)L7iS_U~ql>6_qFGJ6HEA`8 zIZRJKPFMeP%`Up|JFt%8OpbRe6xJ^hTG(mzjiHCUPilKG4PU~(_ShU=nk0mK^D_w_ zld|((BexNqQLD1KWbE7K!kjCg;1uI)EJYWF=Iw%~a?ctg1)ilwa#;D-TN^z-6%ye; zHe-Yubh8+$>?GXXuD@bW`p`6Fi2C-hpj?;{_JsXdB<&xweTGe#aL-%(tiSI|A|$^4 z4}f^<^N2gfIBF%C&)z?wV}ek~mGnT@N3rkBMPNE8* ztN$NH{$XMNWRq%Lq*%>010(nrzNTLGFh2o%5rqx6u@Sg*{~L-mfJSv1pH}ODPeUHV z71u+fV7qB*xg_j&{6oLzmuAPBdxk0AWhPL@S zz_lX(e^~kZWNuMrH;(z>BJu2e>%Og=`WW+7kg86fUNq6ERG|YkMwgR_-b9kc4(YPy z4Lx&}cnu@`&p2Z$inejvm&g2yvQL2;SJZro!Cv`V)2uF8$up^a)7FFuGu1@=$cZTT zT14uf*rhwKA)EYj(xrB$AetH^_p`G8KWNIK9UNYoliV_p^ZmUi)t1(A)6%YQWvQf94+0{0bGw+Cj9T86dQ3! z|4XqE3kqMFIVB_{Ky{#_nc3;Mq(m7g6}{My&zb`fWlcKLPFWx_q~p7PwJ5rG^A&ooSdKl1uO(X l&gv;8LRbGIM72L68i`8WCLFGlfof>ry|l7axx|Mr{{x}0^-%x- literal 0 HcmV?d00001 diff --git a/lib/customWidget/single_image_viewer.dart b/lib/customWidget/single_image_viewer.dart index 66a1e91..24fe779 100644 --- a/lib/customWidget/single_image_viewer.dart +++ b/lib/customWidget/single_image_viewer.dart @@ -1,8 +1,10 @@ import 'dart:io'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:photo_view/photo_view.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; + // 查看大图 class SingleImageViewer extends StatelessWidget { final String imageUrl; @@ -11,26 +13,59 @@ class SingleImageViewer extends StatelessWidget { @override Widget build(BuildContext context) { ImageProvider provider; + + // 选择图片来源:网络 / asset / 本地文件(优先检测 http,然后 asset,再文件) if (imageUrl.toLowerCase().startsWith('http')) { provider = NetworkImage(imageUrl); + } else if (imageUrl.startsWith('assets/') || + imageUrl.startsWith('package:') || + imageUrl.startsWith('packages/')) { + // 明确标记为工程资源(asset) + provider = AssetImage(imageUrl) as ImageProvider; } else { - provider = FileImage(File(imageUrl)); + // 不是明确的网络或 asset 路径 —— 在非 web 平台尝试作为文件路径 + if (!kIsWeb) { + try { + final file = File(imageUrl); + if (file.existsSync()) { + provider = FileImage(file); + } else { + // 文件不存在时尝试作为 asset 路径回退 + provider = AssetImage(imageUrl) as ImageProvider; + } + } catch (e) { + // 任何异常都回退为 asset 尝试(避免抛出) + provider = AssetImage(imageUrl) as ImageProvider; + } + } else { + // web 平台没有 File API,可直接尝试当作 asset + provider = AssetImage(imageUrl) as ImageProvider; + } } + return Scaffold( backgroundColor: Colors.black.withValues(alpha: 0.5), appBar: MyAppbar( isBack: false, actions: [ - IconButton(onPressed: () { - Navigator.of(context).pop(); - }, icon: Icon(Icons.close, color: Colors.white, size: 40,),) + IconButton( + onPressed: () { + Navigator.of(context).pop(); + }, + icon: const Icon( + Icons.close, + color: Colors.white, + size: 40, + ), + ) ], - backgroundColor: Colors.black.withValues(alpha:0.5), title: '', + backgroundColor: Colors.black.withValues(alpha: 0.5), + title: '', ), body: Center( child: PhotoView( imageProvider: provider, - backgroundDecoration: BoxDecoration(color: Colors.black.withValues(alpha:0.5)), + backgroundDecoration: BoxDecoration(color: Colors.black.withValues(alpha: 0.5)), minScale: PhotoViewComputedScale.contained, maxScale: PhotoViewComputedScale.covered * 2, onTapUp: (context, details, controllerValue) { diff --git a/lib/http/ApiService.dart b/lib/http/ApiService.dart index db014b5..6f720f9 100644 --- a/lib/http/ApiService.dart +++ b/lib/http/ApiService.dart @@ -24,9 +24,9 @@ class ApiService { /// 登录及其他管理后台接口 // static const String basePath = "http://192.168.20.240:8500/integrated_whb";//测试服务器 // static const String basePath = "https://qaaqwh.qhdsafety.com/integrated_whb"; - static const String basePath = "http://192.168.20.240:8500/integrated_whb"; + // static const String basePath = "http://192.168.20.240:8500/integrated_whb"; // static const String basePath = "http://192.168.0.25:28199";//王轩服务器 - // static const String basePath = "http://192.168.0.45:28199";//长久服务器 + static const String basePath = "http://192.168.0.45:28199";//长久服务器 /// 图片文件服务 static const String baseImgPath = "https://file.zcloudchina.com/YTHFile"; @@ -865,6 +865,7 @@ U6Hzm1ninpWeE+awIDAQAB /// 所有安全防护措施 static Future> listSignFinishAllMeasures( String workType, + CUTROAD_ID, ) { final String tm = DateTime.now().millisecondsSinceEpoch.toString(); return HttpManager().request( @@ -872,6 +873,7 @@ U6Hzm1ninpWeE+awIDAQAB '/app/$workType/listAllMeasures?tm=$tm', method: Method.post, data: { + "CUTROAD_ID": CUTROAD_ID, "CORPINFO_ID": SessionService.instance.corpinfoId, "USER_ID": SessionService.instance.loginUserId, }, diff --git a/lib/pages/home/SafeCheck/CheckPersonSign/safeCheck_sign_list_page.dart b/lib/pages/home/SafeCheck/CheckPersonSign/safeCheck_sign_list_page.dart index 64d0714..14c7bd6 100644 --- a/lib/pages/home/SafeCheck/CheckPersonSign/safeCheck_sign_list_page.dart +++ b/lib/pages/home/SafeCheck/CheckPersonSign/safeCheck_sign_list_page.dart @@ -273,17 +273,15 @@ class _SafecheckSignListPageState extends State { // 显示底部选择器 Future _showStepPicker() async { if (stepList.isEmpty) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('正在加载步骤数据,请稍后...'))); + LoadingDialogHelper.show(); if (stepList.isEmpty) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('无法加载步骤数据'))); + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '无法加载数据'); return; } } - + + LoadingDialogHelper.hide(); // 创建选项列表 final options = stepList.map((e) => e['name'] as String).toList(); diff --git a/lib/pages/home/SafeCheck/CheckPersonSure/check_person_list_page.dart b/lib/pages/home/SafeCheck/CheckPersonSure/check_person_list_page.dart index be5a5c2..e35d035 100644 --- a/lib/pages/home/SafeCheck/CheckPersonSure/check_person_list_page.dart +++ b/lib/pages/home/SafeCheck/CheckPersonSure/check_person_list_page.dart @@ -275,13 +275,10 @@ class _CheckPersonListPageState extends State { // 显示底部选择器 Future _showStepPicker() async { if (stepList.isEmpty) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('正在加载步骤数据,请稍后...'))); + LoadingDialogHelper.show(); if (stepList.isEmpty) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('无法加载步骤数据'))); + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '无法加载数据'); return; } } diff --git a/lib/pages/home/SafeCheck/DangeCheck/safeCheck_danger_list_page.dart b/lib/pages/home/SafeCheck/DangeCheck/safeCheck_danger_list_page.dart index e6367e5..41af91b 100644 --- a/lib/pages/home/SafeCheck/DangeCheck/safeCheck_danger_list_page.dart +++ b/lib/pages/home/SafeCheck/DangeCheck/safeCheck_danger_list_page.dart @@ -304,13 +304,10 @@ class _SafecheckDangerListPageState extends State { // 显示底部选择器 Future _showStepPicker() async { if (stepList.isEmpty) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('正在加载步骤数据,请稍后...'))); + LoadingDialogHelper.show(); if (stepList.isEmpty) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('无法加载步骤数据'))); + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '无法加载数据'); return; } } diff --git a/lib/pages/home/SafeCheck/Record/defend_record_list_page.dart b/lib/pages/home/SafeCheck/Record/defend_record_list_page.dart index 5420126..d1bbefb 100644 --- a/lib/pages/home/SafeCheck/Record/defend_record_list_page.dart +++ b/lib/pages/home/SafeCheck/Record/defend_record_list_page.dart @@ -279,13 +279,10 @@ class _DefendRecordListPageState extends State { // 显示底部选择器 Future _showStepPicker() async { if (stepList.isEmpty) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('正在加载步骤数据,请稍后...'))); + LoadingDialogHelper.show(); if (stepList.isEmpty) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('无法加载步骤数据'))); + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '无法加载数据'); return; } } diff --git a/lib/pages/home/SafeCheck/Start/safeCheck_start_list_page.dart b/lib/pages/home/SafeCheck/Start/safeCheck_start_list_page.dart index 1d987c4..f531ac4 100644 --- a/lib/pages/home/SafeCheck/Start/safeCheck_start_list_page.dart +++ b/lib/pages/home/SafeCheck/Start/safeCheck_start_list_page.dart @@ -350,13 +350,10 @@ class _SafecheckStartListPageState extends State { // 显示底部选择器 Future _showStepPicker() async { if (stepList.isEmpty) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('正在加载步骤数据,请稍后...'))); + LoadingDialogHelper.show(); if (stepList.isEmpty) { - ScaffoldMessenger.of( - context, - ).showSnackBar(SnackBar(content: Text('无法加载步骤数据'))); + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '无法加载数据'); return; } } diff --git a/lib/pages/home/tap/item_list_widget.dart b/lib/pages/home/tap/item_list_widget.dart index 7b551b6..3d14ce7 100644 --- a/lib/pages/home/tap/item_list_widget.dart +++ b/lib/pages/home/tap/item_list_widget.dart @@ -201,7 +201,9 @@ class ItemListWidget { VoidCallback? onTap, // 点击回调 double fontSize = 14, // 字体大小 bool isClean = false, + bool isTip = false, VoidCallback? onTapClean, // 清除回调 + VoidCallback? onTapTip, // 提醒回调 bool isRequired = true, String cleanText = '清除', double horizontalnum= horizontal_inset, @@ -217,14 +219,26 @@ class ItemListWidget { children: [ if (isRequired && isEditable) Text('* ', style: TextStyle(color: Colors.red)), - Text( - label, - textAlign: TextAlign.right, - style: TextStyle( - fontSize: fontSize, - fontWeight: FontWeight.bold, - ), - ), + Row( + children: [ + Text( + label, + textAlign: TextAlign.right, + style: TextStyle( + fontSize: fontSize, + fontWeight: FontWeight.bold, + ), + ), + if (isTip) + Column( + children: [ + IconButton(onPressed: onTapTip, icon: Icon(Icons.error_outline,color: Colors.blue,size: 20,)), + const SizedBox() + ], + ) + ], + ) + ], ), if (isClean) @@ -237,7 +251,7 @@ class ItemListWidget { textStyle: TextStyle(fontSize: 11, color: Colors.white), borderRadius: 10, backgroundColor: - cleanText == '清除' ? Colors.red : Colors.green, + cleanText.contains('清除') ? Colors.red : Colors.green, onPressed: onTapClean, ), SizedBox(height: 20), diff --git a/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart b/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart index 99662ce..3a7abd9 100644 --- a/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart @@ -1164,19 +1164,19 @@ class _SelectionPopupState extends State { title: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Text(key, style: TextStyle(fontSize: 15)), + Text(key, style: TextStyle(fontSize: 13)), if (widget.type == 'assignments') ...[ Text( '作业内容: ${item['WORK_CONTENT'] ?? ''}', - style: TextStyle(fontSize: 15), + style: TextStyle(fontSize: 13), ), Text( '作业负责人: ${item['CONFIRM_USER_NAME'] ?? ''}', - style: TextStyle(fontSize: 15), + style: TextStyle(fontSize: 13), ), Text( '作业申请时间: ${item['CREATTIME'] ?? ''}', - style: TextStyle(fontSize: 15), + style: TextStyle(fontSize: 13), ), ], ], @@ -1413,7 +1413,6 @@ class SignItemWidget extends StatelessWidget { const double timeBoxWidth = 120.0; // 时间文本固定宽度(可调整) // 单独渲染一行:签字: [多个签字图片水平滚动] 时间(只会渲染一次) - // 单独渲染一行:签字: [多个签字图片多行显示(Wrap)] 时间(只会渲染一次,超过宽度自动换行) list.add( Padding( padding: const EdgeInsets.symmetric(vertical: 0, horizontal: 10), @@ -1458,7 +1457,7 @@ class SignItemWidget extends StatelessWidget { fullUrl, width: thumbSize, height: thumbSize, - fit: BoxFit.cover, + fit: BoxFit.fill, errorBuilder: (_, __, ___) => Container( width: thumbSize, height: thumbSize, @@ -1479,19 +1478,7 @@ class SignItemWidget extends StatelessWidget { // 图片与时间之间的小间隔(仅在有图片时展示) if (aggregatedSignPaths.isNotEmpty) const SizedBox(width: 8), - // 时间文本(始终固定在最右侧并底部对齐) - SizedBox( - width: timeBoxWidth, - child: Text( - lastTime, - textAlign: TextAlign.right, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - fontSize: 13, - color: Colors.black87, - ), - ), - ), + ], ), ); @@ -1500,6 +1487,23 @@ class SignItemWidget extends StatelessWidget { ), ), ); + // 时间文本(始终固定在最右侧并底部对齐) + list.add(const SizedBox(height: 10,)); + list.add(Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + const SizedBox(), + Text( + lastTime, + textAlign: TextAlign.right, + overflow: TextOverflow.ellipsis, + style: const TextStyle( + fontSize: 13, + color: Colors.black87, + ), + ) + ], + )); return list; @@ -1573,7 +1577,7 @@ class ConfirmWithSignWidget extends StatelessWidget { return Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ - // 意见卡片(复用你之前的 _itemContainer 风格) + // 意见卡片 Container( decoration: BoxDecoration( color: Colors.white, @@ -1591,7 +1595,7 @@ class ConfirmWithSignWidget extends StatelessWidget { ), child: Row( children: [ - Expanded(child: ListItemFactory.headerTitle('$headerTitle:')), + Expanded(child: ListItemFactory.headerTitle('$headerTitle')), const SizedBox(), // 仅当 pd 中存在 nameKey 且不为空时显示 // if (FormUtils.hasValue(safePd, nameKey)) diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart index f29ed32..993c32f 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/HotWorkDetailFormWidget.dart @@ -392,7 +392,7 @@ class _HotWorkDetailFormWidgetState extends State { if (FormUtils.hasValue(pd, 'ANALYZE_TIME') && !widget.isEditable) ...[ const Divider(), ItemListWidget.OneRowButtonTitleText( - label: '分析人:', + label: '气体分析信息:', text: pd['ANALYZE_USER_NAME'] ?? '', onTap: widget.onAnalyzeTap, ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart index 149b388..f0911d4 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/SpecialWorkFormBaseWork.dart @@ -130,7 +130,7 @@ class SpecialWorkFormBaseWork extends StatelessWidget { baseImgPath: baseImgPath, sectionKey: 'GUARDIAN', nameKey: 'GUARDIAN_USER_NAME', - headerTitle: '监护人意见', + headerTitle: '监护人签字', roleTitle: '监护人', ), if (FormUtils.hasValue(signs, 'CONFIRM')) diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart index 268ea7d..f3f176f 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/dh_work_detai/hotwork_apply_detail.dart @@ -301,9 +301,12 @@ class _HotworkApplyDetailState extends State { builder: (_) => WorkAreaPicker( onSelected: (String id, String POSITIONS, String name) { - pd['ELECTRONIC_FENCE_AREA_ID'] = id; - pd['POSITIONS'] = POSITIONS; - pd['PLS_NAME'] = name; + setState(() { + pd['ELECTRONIC_FENCE_AREA_ID'] = id; + pd['POSITIONS'] = POSITIONS; + pd['PLS_NAME'] = name; + }); + }, ), ).then((_) { diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart index 1538306..621e4c1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/hotwork_list_page.dart @@ -59,7 +59,6 @@ class _HotWorkListPageState extends State { @override void initState() { super.initState(); - _fetchSteps(); _fetchData(); _scrollController.addListener(_onScroll); } @@ -138,9 +137,11 @@ class _HotWorkListPageState extends State { } /// 申请 - void _handleApply() { + void _handleApply() async{ // 处理申请按钮点击逻辑 - pushPage(HotworkApplyDetail(HOTWORK_ID: '', flow: widget.flow), context); + await pushPage(HotworkApplyDetail(HOTWORK_ID: '', flow: widget.flow), context); + _fetchData(); + LoadingDialogHelper.hide(); } /// 打开流程图 @@ -286,9 +287,10 @@ class _HotWorkListPageState extends State { default: break; } - LoadingDialogHelper.show(); - _fetchSteps(); - _fetchData(); + + + await _fetchData(); + LoadingDialogHelper.hide(); } Widget _buildFlowStepItem({ diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/jszy_work_detail/hotwork_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/jszy_work_detail/hotwork_jszy_detail.dart index 064ff47..ff76ba4 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/jszy_work_detail/hotwork_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/jszy_work_detail/hotwork_jszy_detail.dart @@ -227,6 +227,7 @@ class _HotworkJszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( +spacing: 12, children: [ // _setSafeDetailWidget(), SpecialWorkFormBaseWork( @@ -274,7 +275,6 @@ class _HotworkJszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/kszy_work_detail/hotwork_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/kszy_work_detail/hotwork_kszy_detail.dart index 8d67175..7e5fdf4 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/kszy_work_detail/hotwork_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/kszy_work_detail/hotwork_kszy_detail.dart @@ -198,6 +198,7 @@ class _HotworkKszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( + spacing: 12, children: [ // _setSafeDetailWidget(), SpecialWorkFormBaseWork( @@ -243,7 +244,6 @@ class _HotworkKszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dh_work/szaq_work_detail/hotwork_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dh_work/szaq_work_detail/hotwork_set_safe_detail.dart index 48988e2..874d6d6 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dh_work/szaq_work_detail/hotwork_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dh_work/szaq_work_detail/hotwork_set_safe_detail.dart @@ -349,7 +349,7 @@ class _HotworkSetSafeDetailState extends State { } Future _getMeasures() async { - final data = await ApiService.listSignFinishAllMeasures('hotwork'); + final data = await ApiService.listSignFinishAllMeasures('hotwork', widget.HOTWORK_ID); setState(() { measuresList = List>.from( data['measuresList'] ?? >[], diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadDetailFormWidget.dart index ff0cf8d..cfb666b 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadDetailFormWidget.dart @@ -147,7 +147,7 @@ class _CutroadDetailFormWidgetState extends State { controller: widget.unitController, text: pd['OTHER_DEPT'] ?? '', ), - if (FormUtils.hasValue(pd, 'CONFIRM_USER_NAME') && + if (FormUtils.hasValue(pd, 'GUARDIAN_USER_NAME') && !widget.isEditable) ...[ const Divider(), // ItemListWidget.OneRowImageTitle(label: '作业负责人', imgPath: imgPath) @@ -238,7 +238,10 @@ class _CutroadDetailFormWidgetState extends State { ItemListWidget.selectableLineTitleTextRightButton( label: '断路作业实施时间:', isEditable: widget.isEditable, - text: pd['WORK_START_DATE'] ?? '', + text: + FormUtils.hasValue(pd, 'WORK_END_DATE') + ? '${pd['WORK_START_DATE'] ?? ''}\n-${pd['WORK_END_DATE'] ?? ''}' + : pd['WORK_START_DATE'] ?? '', ), ] else ...[ const Divider(), diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart index 98d775c..4c57ce7 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart @@ -51,196 +51,7 @@ class CutroadFormBaseWork extends StatelessWidget { ); } - Widget signItemWidget( - String signKey, - String nameKey, - String name, - BuildContext context, - ) { - return _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 标题行 - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Row( - children: [ - Expanded(child: ListItemFactory.headerTitle('$name')), - if (FormUtils.hasValue(pd, nameKey)) - Text( - pd[nameKey]?.toString() ?? '', - style: const TextStyle(fontSize: 16), - ), - ], - ), - ), - const SizedBox(height: 8), - if (FormUtils.hasValue(signs, signKey)) - ...((signs[signKey] as List) - .cast>() - .map((item) { - // 解析 SIGN_PATH - List signPaths = []; - final rawSP = - FormUtils.hasValue(item, 'SIGN_PATH') - ? item['SIGN_PATH'] - : null; - if (rawSP is String && rawSP.isNotEmpty) { - signPaths = rawSP.split(',').map((s) => s.trim()).toList(); - } else if (rawSP is List) { - signPaths = rawSP.cast(); - } - - // 解析 SIGN_TIME 保留空格 - List signTimes = []; - final rawST = - FormUtils.hasValue(item, 'SIGN_TIME') - ? item['SIGN_TIME'] - : null; - if (rawST is String && rawST.isNotEmpty) { - signTimes = rawST.split(','); - } else if (rawST is List) { - signTimes = rawST.cast(); - } - - final pairCount = math.min( - signPaths.length, - signTimes.length, - ); - - // 解析 IMG_PATH, 最多 2 张 - List imgPaths = []; - final rawIP = - FormUtils.hasValue(item, 'IMG_PATH') - ? item['IMG_PATH'] - : null; - if (rawIP is String && rawIP.isNotEmpty) { - imgPaths = - rawIP.split(',').map((s) => s.trim()).take(2).toList(); - } else if (rawIP is List) { - imgPaths = rawIP.cast().take(2).toList(); - } - - return Padding( - padding: const EdgeInsets.symmetric( - vertical: 8.0, - horizontal: 10, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (imgPaths.isNotEmpty) ...[ - Row( - children: - imgPaths.map((p) { - final fullUrl = '$baseImgPath$p'; - return GestureDetector( - onTap: - () => presentOpaque( - SingleImageViewer(imageUrl: fullUrl), - context, - ), - child: Padding( - padding: const EdgeInsets.only( - right: 8.0, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(2), - child: Image.network( - fullUrl, - width: 50, - height: 50, - fit: BoxFit.fill, - errorBuilder: - (_, __, ___) => const Icon( - Icons.broken_image, - size: 40, - ), - ), - ), - ), - ); - }).toList(), - ), - const SizedBox(height: 8), - ], - - // 签名及时间 - ...List.generate(pairCount, (index) { - final imgPath = signPaths[index]; - final timeLabel = signTimes[index]; - final fullUrl = '$baseImgPath$imgPath'; - const imageWidth = 200.0; - const imageHeight = 100.0; - - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - GestureDetector( - onTap: - () => presentOpaque( - SingleImageViewer( - imageUrl: fullUrl, - ), - context, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(4), - child: Image.network( - fullUrl, - width: imageWidth, - height: imageHeight, - fit: BoxFit.fill, - errorBuilder: - (_, __, ___) => const Icon( - Icons.broken_image, - size: 60, - ), - ), - ), - ), - const SizedBox(width: 12), - Expanded( - child: SizedBox( - height: imageHeight, - child: Align( - alignment: Alignment.bottomRight, - child: Text( - timeLabel, - style: const TextStyle( - fontSize: 14, - color: Colors.black87, - ), - ), - ), - ), - ), - ], - ), - if (index < pairCount - 1) - const Padding( - padding: EdgeInsets.only(top: 8.0), - child: Divider(height: 1), - ), - ], - ), - ); - }), - ], - ), - ); - }) - .toList()), - ], - ), - ); - } @override Widget build(BuildContext context) { diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/aqcs_work_detail/cutroad_safe_func_sure.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/aqcs_work_detail/cutroad_safe_func_sure.dart index 6fda295..63bff37 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/aqcs_work_detail/cutroad_safe_func_sure.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/aqcs_work_detail/cutroad_safe_func_sure.dart @@ -71,9 +71,9 @@ class _CutroadSafeFuncSureState extends State { return {'signs': {}}; }); - final futureMeasures = ApiService.listSignFinishAllMeasures('cutroad') + final futureMeasures = ApiService.listSignSureAllMeasures('cutroad', widget.CUTROAD_ID) .catchError((e) { - return {'measuresList': >[]}; + return {'measuresForSignList': >[]}; }); final results = await Future.wait([futurePd, futureSigns, futureMeasures]); @@ -92,7 +92,7 @@ class _CutroadSafeFuncSureState extends State { : {}; final newMeasuresList = >[]; - final rawMeasures = measuresResult['measuresList']; + final rawMeasures = measuresResult['measuresForSignList']; if (rawMeasures is List) { for (final m in rawMeasures) { if (m is Map) { diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/cutroad_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/cutroad_list_page.dart index 33ada6a..9b7e02f 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/cutroad_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/cutroad_list_page.dart @@ -145,9 +145,11 @@ class _CutroadListPageState extends State { } /// 申请 - void _handleApply() { + void _handleApply() async{ // 处理申请按钮点击逻辑 - pushPage(CutroadApplyDetail(CUTROAD_ID: '', flow: widget.flow), context); + await pushPage(CutroadApplyDetail(CUTROAD_ID: '', flow: widget.flow), context); + _fetchData(); + LoadingDialogHelper.hide(); } /// 打开流程图 @@ -230,9 +232,10 @@ class _CutroadListPageState extends State { default: break; } - LoadingDialogHelper.show(); - _fetchSteps(); - _fetchData(); + + + await _fetchData(); + LoadingDialogHelper.hide(); } Widget _buildFlowStepItem({ diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart index e48a7b7..af141b0 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/dl_work_detai/cutroad_apply_detail.dart @@ -19,7 +19,6 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_Wrok/MeasuresListW import 'package:qhd_prevention/customWidget/BaiDuMap/Map_page.dart'; import 'package:qhd_prevention/pages/home/tap/workArea_picker.dart'; - enum EditUserType { PROJECT_MANAGER('断路示意图负责单位', '断路示意图负责人', true), GUARDIAN('监护人单位', '监护人', true), @@ -57,6 +56,7 @@ class CutroadApplyDetail extends StatefulWidget { class _CutroadApplyDetailState extends State { late bool isEditable = false; + /// 编辑还是新增 late String msg = 'add'; @@ -69,15 +69,18 @@ class _CutroadApplyDetailState extends State { final TextEditingController _contentController = TextEditingController(); final TextEditingController _relatedController = TextEditingController(); final TextEditingController _riskController = TextEditingController(); + /// ------------------- 新增 ------------------- /// 视频监控摄像 late List videoMonitoringList = []; + /// 承包商列表 late List unitAllList = []; + /// 作业区域列表 late List> workAreaList = []; - /// -------------------------------------- + /// -------------------------------------- // 存储各单位的人员列表 final Map>> _personCache = {}; @@ -96,7 +99,6 @@ class _CutroadApplyDetailState extends State { pd['APPLY_USER_ID'] = SessionService.instance.loginUserId; pd['APPLY_USER_NAME'] = SessionService.instance.username; pd['IS_CONTRACTOR_WORK'] = '0'; - } _getVideoList(); @@ -128,7 +130,7 @@ class _CutroadApplyDetailState extends State { } void set_pd_USER_ID(EditUserType type, String id) { - pd['${type.name}_USER_ID'] = id; + pd['${type.name}_USER_ID'] = id; } void set_pd_USER_Name(EditUserType type, String name) { @@ -144,9 +146,7 @@ class _CutroadApplyDetailState extends State { } String get_pd_USER_ID(EditUserType type) { - - return pd['${type.name}_USER_ID'] ?? ''; - + return pd['${type.name}_USER_ID'] ?? ''; } String get_pd_USER_Name(EditUserType type) { @@ -244,13 +244,15 @@ class _CutroadApplyDetailState extends State { return; } - if (personList.isEmpty) { // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 + if (personList.isEmpty) { + // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 await _getPersonListForUnitId(unitId, type); final list = _personCache[type] ?? []; - if (list.isEmpty) { // 如果还是没数据,说明该部门没有可选的人 + if (list.isEmpty) { + // 如果还是没数据,说明该部门没有可选的人 ToastUtil.showNormal(context, '暂无数据,请选择其他单位'); - }else{ + } else { choosePersonHandle(type); } return; @@ -287,6 +289,7 @@ class _CutroadApplyDetailState extends State { // }, {'value': _riskController.text.trim(), 'message': '请填写风险辨识结果'}, ]; + /// 各项负责人校验 final unitRules = [ EditUserType.PROJECT_MANAGER, @@ -295,8 +298,8 @@ class _CutroadApplyDetailState extends State { EditUserType.ACCEPT_CONFESS, EditUserType.CONFIRM, EditUserType.LEADER, - EditUserType.AUDIT, - EditUserType.APPROVE, + EditUserType.AUDIT, + EditUserType.APPROVE, EditUserType.WORK_START, EditUserType.WORK_END, EditUserType.ACCEPT, @@ -319,7 +322,8 @@ class _CutroadApplyDetailState extends State { return; } - if (pd['IS_CONTRACTOR_WORK'] == '1' && !FormUtils.hasValue(pd, 'UNITS_ID')) { + if (pd['IS_CONTRACTOR_WORK'] == '1' && + !FormUtils.hasValue(pd, 'UNITS_ID')) { ToastUtil.showNormal(context, '请选择承包商'); return; } @@ -339,7 +343,6 @@ class _CutroadApplyDetailState extends State { return; } } - } // LoadingDialogHelper.show(); @@ -364,7 +367,8 @@ class _CutroadApplyDetailState extends State { pd['APPLY_USER_ID'] = SessionService.instance.loginUserId; pd['APPLY_USER_NAME'] = SessionService.instance.username; pd['USER_ID'] = SessionService.instance.loginUserId; - pd['SPECIAL_WORK'] = FormUtils.hasValue(pd, 'SPECIAL_WORK') ? pd['SPECIAL_WORK'] : '无'; + pd['SPECIAL_WORK'] = + FormUtils.hasValue(pd, 'SPECIAL_WORK') ? pd['SPECIAL_WORK'] : '无'; } LoadingDialogHelper.show(); @@ -397,9 +401,9 @@ class _CutroadApplyDetailState extends State { final choice = await BottomPicker.show( context, items: - videoMonitoringList - .map((item) => item['VIDEONAME'] as String) - .toList(), + videoMonitoringList + .map((item) => item['VIDEONAME'] as String) + .toList(), itemBuilder: (item) => Text(item, textAlign: TextAlign.center), initialIndex: 0, ); @@ -408,7 +412,7 @@ class _CutroadApplyDetailState extends State { pd['VIDEONAME'] = choice; Map result = videoMonitoringList.firstWhere( - (item) => item['VIDEONAME'] == choice, + (item) => item['VIDEONAME'] == choice, orElse: () => {}, // 避免找不到时报错 ); if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { @@ -418,6 +422,7 @@ class _CutroadApplyDetailState extends State { }); } } + /// 选择承包商 Future _chooseUnitManager() async { final choice = await BottomPicker.show( @@ -431,7 +436,7 @@ class _CutroadApplyDetailState extends State { pd['UNITS_NAME'] = choice; Map result = unitAllList.firstWhere( - (item) => item['UNITS_NAME'] == choice, + (item) => item['UNITS_NAME'] == choice, orElse: () => {}, // 避免找不到时报错 ); if (FormUtils.hasValue(result, 'UNITS_ID')) { @@ -441,10 +446,9 @@ class _CutroadApplyDetailState extends State { }); } } - - + /// 选择经纬度 - Future _showLocationHandle() async{ + Future _showLocationHandle() async { if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) { ToastUtil.showNormal(context, '请选择作业区域'); return; @@ -453,10 +457,11 @@ class _CutroadApplyDetailState extends State { setState(() { pd['LONGITUDE'] = mapData['longitue'] ?? ''; pd['LATITUDE'] = mapData['latitude'] ?? ''; - pd['LATITUDE_LONGITUDE'] = '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; + pd['LATITUDE_LONGITUDE'] = + '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; }); - } + /// 作业区域 Future _getWorkArea() async { //FocusHelper.clearFocus(context); @@ -467,16 +472,21 @@ class _CutroadApplyDetailState extends State { backgroundColor: Colors.transparent, builder: (_) => WorkAreaPicker( - onSelected: (String id, String POSITIONS, String name) { - pd['ELECTRONIC_FENCE_AREA_ID'] = id; - pd['POSITIONS'] = POSITIONS; - pd['PLS_NAME'] = name; - }, - ), + onSelected: (String id, String POSITIONS, String name) { + setState(() { + setState(() { + pd['ELECTRONIC_FENCE_AREA_ID'] = id; + pd['POSITIONS'] = POSITIONS; + pd['PLS_NAME'] = name; + }); + }); + }, + ), ).then((_) { //FocusHelper.clearFocus(context); }); } + /// 获取摄像头列表 Future _getVideoList() async { final result = await ApiService.getVideomanagerList(); @@ -484,6 +494,7 @@ class _CutroadApplyDetailState extends State { videoMonitoringList = result['varList'] ?? []; }); } + /// 获承包商列表 Future _getUnitListAll() async { final result = await ApiService.getUnitListAll(); @@ -491,6 +502,7 @@ class _CutroadApplyDetailState extends State { unitAllList = result['varList'] ?? []; }); } + /// 作业区域列表 Future _getPlsList() async { final result = await ApiService.getWorkAreaList(); @@ -499,12 +511,15 @@ class _CutroadApplyDetailState extends State { workAreaList = jsonDecode(zTreeNodes); }); } + /// ------------------------------------------------------------ /// 初始化拉取数据 Future _getData() async { - - final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID); + final data = await ApiService.getHomeworkFindById( + 'cutroad', + widget.CUTROAD_ID, + ); setState(() { pd = data['pd']; if (pd['STEP_ID'] == 0) { @@ -527,7 +542,8 @@ class _CutroadApplyDetailState extends State { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('cutroad', + final data = await ApiService.listSignFinished( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -536,7 +552,8 @@ class _CutroadApplyDetailState extends State { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('cutroad', + final data = await ApiService.listSignFinishMeasures( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -565,7 +582,7 @@ class _CutroadApplyDetailState extends State { unitController: _unitController, relatedController: _relatedController, riskController: _riskController, - onChooseLevel: (){}, + onChooseLevel: () {}, // 新增 onChooseVideoManager: _chooseVideoManager, onContractorHandle: _chooseUnitManager, @@ -646,7 +663,7 @@ class _CutroadApplyDetailState extends State { color: Colors.white, child: MeasuresListWidget( measuresList: - measuresList, // List> + measuresList, // List> baseImgPath: ApiService.baseImgPath, isAllowEdit: false, ), @@ -674,45 +691,9 @@ class _CutroadApplyDetailState extends State { ), isEditable ? Row( - spacing: 10, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: CustomButton( - height: 45, - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '提交', - backgroundColor: Colors.blue, - onPressed: () { - _submit('1'); - }, - ), - ), - - Expanded( - child: CustomButton( - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '暂存', - backgroundColor: Colors.green, - onPressed: () { - _submit('0'); - }, - ), - ), - ], - ) - : Column( - children: [ - SizedBox(height: 20), - Row( + spacing: 10, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox(width: 50), Expanded( child: CustomButton( height: 45, @@ -720,18 +701,54 @@ class _CutroadApplyDetailState extends State { fontSize: 16, color: Colors.white, ), - text: '返回', - backgroundColor: Colors.green, + text: '提交', + backgroundColor: Colors.blue, onPressed: () { - Navigator.pop(context); + _submit('1'); }, ), ), - SizedBox(width: 50), + + Expanded( + child: CustomButton( + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '暂存', + backgroundColor: Colors.green, + onPressed: () { + _submit('0'); + }, + ), + ), + ], + ) + : Column( + children: [ + SizedBox(height: 20), + Row( + children: [ + SizedBox(width: 50), + Expanded( + child: CustomButton( + height: 45, + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '返回', + backgroundColor: Colors.green, + onPressed: () { + Navigator.pop(context); + }, + ), + ), + SizedBox(width: 50), + ], + ), ], ), - ], - ), ], ), ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/jhr_work_detail/cutroad_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/jhr_work_detail/cutroad_jhr_detail.dart index 3cc841c..3f37bcd 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/jhr_work_detail/cutroad_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/jhr_work_detail/cutroad_jhr_detail.dart @@ -15,6 +15,7 @@ import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; import '../CutroadDetailFormWidget.dart'; + /// 监护人签字 class CutroadJhrDetail extends StatefulWidget { const CutroadJhrDetail({ @@ -32,13 +33,14 @@ class CutroadJhrDetail extends StatefulWidget { class _CutroadJhrDetailState extends State { late bool isEditable = false; + /// 详情 late Map pd = {}; + /// 安全防护措施列表 late List> measuresList = []; late Map signs = {}; - List imagePaths = []; List signTimes = []; // 签字时间列表 @override @@ -55,7 +57,7 @@ class _CutroadJhrDetailState extends State { MaterialPageRoute(builder: (context) => MineSignPage()), ); await NativeOrientation.setPortrait(); -if (path != null) { + if (path != null) { final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); setState(() { imagePaths.add(path); @@ -137,7 +139,7 @@ if (path != null) { title: '作废原因', hintText: '请输入作废原因', cancelText: '取消', - confirmText: '确定' + confirmText: '确定', ); if (reasonText.isEmpty) { ToastUtil.showNormal(context, '请填写作废原因'); @@ -162,32 +164,31 @@ if (path != null) { barrierDismissible: false, ); if (confirmed) { - LoadingDialogHelper.show(); - try { - final result = await ApiService.saveSafeFunctionSure( -'cutroad', - formData, - imagePaths, - ); - LoadingDialogHelper.hide(); - if (result['result'] == 'success') { - ToastUtil.showSuccess( - context, - '保存成功', - ); - Navigator.of(context).pop(true); - } - } catch (e) { - LoadingDialogHelper.hide(); - ToastUtil.showNormal(context, '操作失败:$e'); - } - + LoadingDialogHelper.show(); + try { + final result = await ApiService.saveSafeFunctionSure( + 'cutroad', + formData, + imagePaths, + ); + LoadingDialogHelper.hide(); + if (result['result'] == 'success') { + ToastUtil.showSuccess(context, '保存成功'); + Navigator.of(context).pop(true); + } + } catch (e) { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '操作失败:$e'); + } } } /// 初始化拉取数据 Future _getData() async { - final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID); + final data = await ApiService.getHomeworkFindById( + 'cutroad', + widget.CUTROAD_ID, + ); setState(() { pd = data['pd']; @@ -197,7 +198,8 @@ if (path != null) { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('cutroad', + final data = await ApiService.listSignFinishMeasures( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -208,7 +210,8 @@ if (path != null) { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('cutroad', + final data = await ApiService.listSignFinished( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -234,11 +237,10 @@ if (path != null) { Container( color: Colors.white, child: MeasuresListWidget( - measuresList: - measuresList, // List> + measuresList: measuresList, // List> baseImgPath: ApiService.baseImgPath, isAllowEdit: false, - isShowSign:true, + isShowSign: true, ), ), ], @@ -325,7 +327,7 @@ if (path != null) { signs: signs, pd: pd, isEditable: false, - onChooseLevel: (){}, + onChooseLevel: () {}, ), SizedBox(height: 20), _setSafeDetailWidget(), diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/jszy_work_detail/cutroad_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/jszy_work_detail/cutroad_jszy_detail.dart index 7fb2719..95ffc91 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/jszy_work_detail/cutroad_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/jszy_work_detail/cutroad_jszy_detail.dart @@ -283,6 +283,7 @@ class _CutroadJszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( +spacing: 12, children: [ // _setSafeDetailWidget(), CutroadFormBaseWork( @@ -344,7 +345,6 @@ class _CutroadJszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/kszy_work_detail/cutroad_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/kszy_work_detail/cutroad_kszy_detail.dart index a637263..94cf683 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/kszy_work_detail/cutroad_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/kszy_work_detail/cutroad_kszy_detail.dart @@ -188,6 +188,7 @@ class _CutroadKszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( + spacing: 12, children: [ // _setSafeDetailWidget(), CutroadFormBaseWork( @@ -258,7 +259,6 @@ class _CutroadKszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/shbm_work_detail/cutroad_shbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/shbm_work_detail/cutroad_shbm_detail.dart index 2e23ddb..790b2ec 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/shbm_work_detail/cutroad_shbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/shbm_work_detail/cutroad_shbm_detail.dart @@ -13,7 +13,6 @@ import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; - /// 消防、安全管理部门意见 class CutroadShbmDetail extends StatefulWidget { const CutroadShbmDetail({ @@ -58,7 +57,7 @@ class _CutroadShbmDetailState extends State { await NativeOrientation.setPortrait(); if (path != null) { final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); -setState(() { + setState(() { signImages.add(path); signTimes.add(now); }); @@ -143,7 +142,7 @@ setState(() { title: '作废原因', hintText: '请输入作废原因', cancelText: '取消', - confirmText: '确定' + confirmText: '确定', ); if (reasonText.isEmpty) { ToastUtil.showNormal(context, '请填写作废原因'); @@ -170,29 +169,31 @@ setState(() { barrierDismissible: false, ); if (confirmed) { - LoadingDialogHelper.show(); - try { - final result = await ApiService.saveSafeFunctionSure( -'cutroad', - formData, - signImages, - ); - LoadingDialogHelper.hide(); - if (result['result'] == 'success') { - ToastUtil.showSuccess(context, '保存成功'); - Navigator.of(context).pop(true); - } - } catch (e) { - LoadingDialogHelper.hide(); - ToastUtil.showNormal(context, '操作失败:$e'); - } - + LoadingDialogHelper.show(); + try { + final result = await ApiService.saveSafeFunctionSure( + 'cutroad', + formData, + signImages, + ); + LoadingDialogHelper.hide(); + if (result['result'] == 'success') { + ToastUtil.showSuccess(context, '保存成功'); + Navigator.of(context).pop(true); + } + } catch (e) { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '操作失败:$e'); + } } } /// 初始化拉取数据 Future _getData() async { - final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID); + final data = await ApiService.getHomeworkFindById( + 'cutroad', + widget.CUTROAD_ID, + ); setState(() { pd = data['pd']; @@ -202,7 +203,8 @@ setState(() { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('cutroad', + final data = await ApiService.listSignFinishMeasures( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -213,7 +215,8 @@ setState(() { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('cutroad', + final data = await ApiService.listSignFinished( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -279,7 +282,7 @@ setState(() { '消防、安全管理部门意见', '请输入意见', _contentController, - isRequired: true + isRequired: true, ), Divider(), Column( @@ -300,7 +303,7 @@ setState(() { ), if (signImages.isNotEmpty) _signListWidget(), ], - ) + ), ], ), ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/spbm_work_detail/cutroad_spbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/spbm_work_detail/cutroad_spbm_detail.dart index e8a0e2c..91d59c7 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/spbm_work_detail/cutroad_spbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/spbm_work_detail/cutroad_spbm_detail.dart @@ -57,7 +57,7 @@ class _CutroadSpbmDetailState extends State { await NativeOrientation.setPortrait(); if (path != null) { final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); -setState(() { + setState(() { signImages.add(path); signTimes.add(now); }); @@ -142,7 +142,7 @@ setState(() { title: '作废原因', hintText: '请输入作废原因', cancelText: '取消', - confirmText: '确定' + confirmText: '确定', ); if (reasonText.isEmpty) { ToastUtil.showNormal(context, '请填写作废原因'); @@ -169,29 +169,31 @@ setState(() { barrierDismissible: false, ); if (confirmed) { - LoadingDialogHelper.show(); - try { - final result = await ApiService.saveSafeFunctionSure( -'cutroad', - formData, - signImages, - ); - LoadingDialogHelper.hide(); - if (result['result'] == 'success') { - ToastUtil.showSuccess(context, '保存成功'); - Navigator.of(context).pop(true); - } - } catch (e) { - LoadingDialogHelper.hide(); - ToastUtil.showNormal(context, '操作失败:$e'); - } - + LoadingDialogHelper.show(); + try { + final result = await ApiService.saveSafeFunctionSure( + 'cutroad', + formData, + signImages, + ); + LoadingDialogHelper.hide(); + if (result['result'] == 'success') { + ToastUtil.showSuccess(context, '保存成功'); + Navigator.of(context).pop(true); + } + } catch (e) { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '操作失败:$e'); + } } } /// 初始化拉取数据 Future _getData() async { - final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID); + final data = await ApiService.getHomeworkFindById( + 'cutroad', + widget.CUTROAD_ID, + ); setState(() { pd = data['pd']; @@ -201,7 +203,8 @@ setState(() { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('cutroad', + final data = await ApiService.listSignFinishMeasures( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -212,7 +215,8 @@ setState(() { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('cutroad', + final data = await ApiService.listSignFinished( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -278,8 +282,7 @@ setState(() { '审批部门负责人意见', '请输入意见', _contentController, - isRequired: true - + isRequired: true, ), Divider(), Column( @@ -305,7 +308,7 @@ setState(() { ), if (signImages.isNotEmpty) _signListWidget(), ], - ) + ), ], ), ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/szaq_work_detail/cutroad_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/szaq_work_detail/cutroad_set_safe_detail.dart index 0a42288..1c591d5 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/szaq_work_detail/cutroad_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/szaq_work_detail/cutroad_set_safe_detail.dart @@ -67,7 +67,7 @@ class _CutroadSetSafeDetailState extends State { return {'signs': {}}; }); - final futureMeasures = ApiService.listSignFinishAllMeasures('cutroad') + final futureMeasures = ApiService.listSignFinishAllMeasures('cutroad', widget.CUTROAD_ID) .catchError((e) { return {'measuresList': >[]}; }); diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/szdw_work_detail/cutroad_szdw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/szdw_work_detail/cutroad_szdw_detail.dart index 7058013..1c4f479 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/szdw_work_detail/cutroad_szdw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/szdw_work_detail/cutroad_szdw_detail.dart @@ -58,7 +58,7 @@ class _CutroadSzdwDetailState extends State { await NativeOrientation.setPortrait(); if (path != null) { final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); -setState(() { + setState(() { signImages.add(path); signTimes.add(now); }); @@ -143,7 +143,7 @@ setState(() { title: '作废原因', hintText: '请输入作废原因', cancelText: '取消', - confirmText: '确定' + confirmText: '确定', ); if (reasonText.isEmpty) { ToastUtil.showNormal(context, '请填写作废原因'); @@ -170,29 +170,31 @@ setState(() { barrierDismissible: false, ); if (confirmed) { - LoadingDialogHelper.show(); - try { - final result = await ApiService.saveSafeFunctionSure( -'cutroad', - formData, - signImages, - ); - LoadingDialogHelper.hide(); - if (result['result'] == 'success') { - ToastUtil.showSuccess(context, '保存成功'); - Navigator.of(context).pop(true); - } - } catch (e) { - LoadingDialogHelper.hide(); - ToastUtil.showNormal(context, '操作失败:$e'); - } - + LoadingDialogHelper.show(); + try { + final result = await ApiService.saveSafeFunctionSure( + 'cutroad', + formData, + signImages, + ); + LoadingDialogHelper.hide(); + if (result['result'] == 'success') { + ToastUtil.showSuccess(context, '保存成功'); + Navigator.of(context).pop(true); + } + } catch (e) { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '操作失败:$e'); + } } } /// 初始化拉取数据 Future _getData() async { - final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID); + final data = await ApiService.getHomeworkFindById( + 'cutroad', + widget.CUTROAD_ID, + ); setState(() { pd = data['pd']; @@ -202,7 +204,8 @@ setState(() { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('cutroad', + final data = await ApiService.listSignFinishMeasures( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -213,7 +216,8 @@ setState(() { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('cutroad', + final data = await ApiService.listSignFinished( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -279,7 +283,7 @@ setState(() { '所在单位负责人意见', '请输入意见', _contentController, - isRequired: true + isRequired: true, ), Divider(), Column( @@ -300,7 +304,7 @@ setState(() { ), if (signImages.isNotEmpty) _signListWidget(), ], - ) + ), ], ), ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/zyfz_work_detail/cutroad_zyfz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/zyfz_work_detail/cutroad_zyfz_detail.dart index 7c3091f..3457690 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/zyfz_work_detail/cutroad_zyfz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/zyfz_work_detail/cutroad_zyfz_detail.dart @@ -58,7 +58,7 @@ class _CutroadZyfzDetailState extends State { await NativeOrientation.setPortrait(); if (path != null) { final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); -setState(() { + setState(() { signImages.add(path); signTimes.add(now); }); @@ -143,7 +143,7 @@ setState(() { title: '作废原因', hintText: '请输入作废原因', cancelText: '取消', - confirmText: '确定' + confirmText: '确定', ); if (reasonText.isEmpty) { ToastUtil.showNormal(context, '请填写作废原因'); @@ -170,29 +170,31 @@ setState(() { barrierDismissible: false, ); if (confirmed) { - LoadingDialogHelper.show(); - try { - final result = await ApiService.saveSafeFunctionSure( -'cutroad', - formData, - signImages, - ); - LoadingDialogHelper.hide(); - if (result['result'] == 'success') { - ToastUtil.showSuccess(context, '保存成功'); - Navigator.of(context).pop(true); - } - } catch (e) { - LoadingDialogHelper.hide(); - ToastUtil.showNormal(context, '操作失败:$e'); - } - + LoadingDialogHelper.show(); + try { + final result = await ApiService.saveSafeFunctionSure( + 'cutroad', + formData, + signImages, + ); + LoadingDialogHelper.hide(); + if (result['result'] == 'success') { + ToastUtil.showSuccess(context, '保存成功'); + Navigator.of(context).pop(true); + } + } catch (e) { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '操作失败:$e'); + } } } /// 初始化拉取数据 Future _getData() async { - final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID); + final data = await ApiService.getHomeworkFindById( + 'cutroad', + widget.CUTROAD_ID, + ); setState(() { pd = data['pd']; @@ -202,7 +204,8 @@ setState(() { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('cutroad', + final data = await ApiService.listSignFinishMeasures( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -213,7 +216,8 @@ setState(() { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('cutroad', + final data = await ApiService.listSignFinished( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -278,7 +282,7 @@ setState(() { '作业负责人意见', '请输入意见', _contentController, - isRequired: true + isRequired: true, ), Divider(), Column( @@ -299,7 +303,7 @@ setState(() { ), if (signImages.isNotEmpty) _signListWidget(), ], - ) + ), ], ), ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart index cfa2a76..d1cb8e1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dl_work/zyr_work_detail/cutroad_zyr_detail.dart @@ -15,6 +15,7 @@ import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/dl_work/CutroadFormBaseWork.dart'; + /// 本地路径 + 线上路径模型 class ImageData { String localPath; @@ -22,6 +23,7 @@ class ImageData { ImageData({required this.localPath, required this.serverPath}); } + /// 断路示意图负责人意见 class CutroadZyrDetail extends StatefulWidget { const CutroadZyrDetail({ @@ -45,6 +47,7 @@ class _CutroadZyrDetailState extends State { final TextEditingController _contentController = TextEditingController(); late List imgList = []; + /// 安全防护措施列表 late List> measuresList = []; late Map signs = {}; @@ -67,7 +70,7 @@ class _CutroadZyrDetailState extends State { await NativeOrientation.setPortrait(); if (path != null) { final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); -setState(() { + setState(() { signImages.add(path); signTimes.add(now); }); @@ -155,7 +158,7 @@ setState(() { title: '作废原因', hintText: '请输入作废原因', cancelText: '取消', - confirmText: '确定' + confirmText: '确定', ); if (reasonText.isEmpty) { ToastUtil.showNormal(context, '请填写作废原因'); @@ -165,7 +168,7 @@ setState(() { final serverPathString = imgList .map((e) => e.serverPath) .where((s) => s.isNotEmpty) - .map((s) => s) // 将 String? 转回 String + .map((s) => s) // 将 String? 转回 String .join(','); // 存回 measures final Map formData = {}; @@ -173,7 +176,7 @@ setState(() { formData['WORK_CONTENT'] = _contentController.text.trim(); formData['CONIMG_PATH'] = serverPathString; - formData['DESCR'] = FormUtils.hasValue(pd, 'DESCR') ?pd['DESCR']: '无'; + formData['DESCR'] = FormUtils.hasValue(pd, 'DESCR') ? pd['DESCR'] : '无'; formData['CUTROAD_ID'] = widget.CUTROAD_ID; formData['SIGNTIME'] = signTimes.join(','); formData['USER_ID'] = SessionService.instance.loginUserId; @@ -189,29 +192,31 @@ setState(() { barrierDismissible: false, ); if (confirmed) { - LoadingDialogHelper.show(); - try { - final result = await ApiService.saveSafeFunctionSure( -'cutroad', - formData, - signImages, - ); - LoadingDialogHelper.hide(); - if (result['result'] == 'success') { - ToastUtil.showSuccess(context, '保存成功'); - Navigator.of(context).pop(true); - } - } catch (e) { - LoadingDialogHelper.hide(); - ToastUtil.showNormal(context, '操作失败:$e'); - } - + LoadingDialogHelper.show(); + try { + final result = await ApiService.saveSafeFunctionSure( + 'cutroad', + formData, + signImages, + ); + LoadingDialogHelper.hide(); + if (result['result'] == 'success') { + ToastUtil.showSuccess(context, '保存成功'); + Navigator.of(context).pop(true); + } + } catch (e) { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '操作失败:$e'); + } } } /// 初始化拉取数据 Future _getData() async { - final data = await ApiService.getHomeworkFindById('cutroad', widget.CUTROAD_ID); + final data = await ApiService.getHomeworkFindById( + 'cutroad', + widget.CUTROAD_ID, + ); setState(() { pd = data['pd']; @@ -221,7 +226,8 @@ setState(() { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('cutroad', + final data = await ApiService.listSignFinishMeasures( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { @@ -232,13 +238,15 @@ setState(() { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('cutroad', + final data = await ApiService.listSignFinished( + 'cutroad', homework_id.length > 0 ? homework_id : widget.CUTROAD_ID, ); setState(() { signs = data['signs'] ?? {}; }); } + /// 拍照或选图后的回调 Future _onImageAdded(String localPath) async { // 上传到服务器 @@ -260,6 +268,7 @@ setState(() { imgList.remove(item); }); } + /// 底部按钮 Widget _bottomButtons() { return Row( @@ -314,10 +323,10 @@ setState(() { Column( children: [ ListItemFactory.createBuildMultilineInput( - '断路地段示意图相关说明:', - '请输入断路地段示意图相关说明', - _contentController, - isRequired: true + '断路地段示意图相关说明:', + '请输入断路地段示意图相关说明', + _contentController, + isRequired: true, ), Divider(), RepairedPhotoSection( @@ -330,7 +339,9 @@ setState(() { isRequired: true, onMediaAdded: _onImageAdded, onMediaRemoved: (path) { - final item = imgList.firstWhere((e) => e.localPath == path); + final item = imgList.firstWhere( + (e) => e.localPath == path, + ); _onImageRemoved(item); }, onAiIdentify: () {}, @@ -340,7 +351,10 @@ setState(() { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - ListItemFactory.headerTitle('断路示意图负责人签字',isRequired: true), + ListItemFactory.headerTitle( + '断路示意图负责人签字', + isRequired: true, + ), CustomButton( text: '新增手写签字', height: 36, @@ -353,7 +367,7 @@ setState(() { ), if (signImages.isNotEmpty) _signListWidget(), ], - ) + ), ], ), ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/BreakgroundDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/BreakgroundDetailFormWidget.dart index 33927a3..e691c48 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/BreakgroundDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/BreakgroundDetailFormWidget.dart @@ -24,12 +24,17 @@ class BreakgroundDetailFormWidget extends StatefulWidget { final TextEditingController? contentController; // 内容 final TextEditingController? relatedController; final TextEditingController? riskController; -// 新增 -/// 选择摄像头 - final VoidCallback? onChooseVideoManager;/// 承包商 + + // 新增 + /// 选择摄像头 + final VoidCallback? onChooseVideoManager; + + /// 承包商 final VoidCallback? onContractorHandle; + /// 作业区域 final VoidCallback? onWorkAreaHandle; + /// 作业地点经纬度 final VoidCallback? onWorkAreaLocationHandle; @@ -39,6 +44,7 @@ class BreakgroundDetailFormWidget extends StatefulWidget { required this.isEditable, required this.onChooseLevel, required this.signs, + /// 新增 this.onChooseVideoManager, this.onContractorHandle, @@ -66,212 +72,11 @@ class BreakgroundDetailFormWidget extends StatefulWidget { class _BreakgroundDetailFormWidgetState extends State { - Widget signItemWidget( - String signKey, - String nameKey, - String name, - BuildContext context, - ) { - return _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 标题行 - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Row( - children: [ - Expanded(child: ListItemFactory.headerTitle(name)), - if (FormUtils.hasValue(widget.pd, nameKey)) - Text( - widget.pd[nameKey]?.toString() ?? '', - style: const TextStyle(fontSize: 16), - ), - ], - ), - ), - const SizedBox(height: 8), - - if (FormUtils.hasValue(widget.signs, signKey)) - ...((widget.signs[signKey] as List) - .cast>() - .map((item) { - // 解析 SIGN_PATH - List signPaths = []; - final rawSP = - FormUtils.hasValue(item, 'SIGN_PATH') - ? item['SIGN_PATH'] - : null; - if (rawSP is String && rawSP.isNotEmpty) { - signPaths = rawSP.split(',').map((s) => s.trim()).toList(); - } else if (rawSP is List) { - signPaths = rawSP.cast(); - } - - // 解析 SIGN_TIME 保留空格 - List signTimes = []; - final rawST = - FormUtils.hasValue(item, 'SIGN_TIME') - ? item['SIGN_TIME'] - : null; - if (rawST is String && rawST.isNotEmpty) { - signTimes = rawST.split(','); - } else if (rawST is List) { - signTimes = rawST.cast(); - } - - final pairCount = math.min( - signPaths.length, - signTimes.length, - ); - - // 解析 IMG_PATH, 最多 2 张 - List imgPaths = []; - final rawIP = - FormUtils.hasValue(item, 'IMG_PATH') - ? item['IMG_PATH'] - : null; - if (rawIP is String && rawIP.isNotEmpty) { - imgPaths = - rawIP.split(',').map((s) => s.trim()).take(2).toList(); - } else if (rawIP is List) { - imgPaths = rawIP.cast().take(2).toList(); - } - - return Padding( - padding: const EdgeInsets.symmetric( - vertical: 8.0, - horizontal: 10, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (imgPaths.isNotEmpty) ...[ - Row( - children: - imgPaths.map((p) { - final fullUrl = '${ApiService.baseImgPath}$p'; - return GestureDetector( - onTap: - () => presentOpaque( - SingleImageViewer(imageUrl: fullUrl), - context, - ), - child: Padding( - padding: const EdgeInsets.only( - right: 8.0, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(2), - child: Image.network( - fullUrl, - width: 50, - height: 50, - fit: BoxFit.fill, - errorBuilder: - (_, __, ___) => const Icon( - Icons.broken_image, - size: 40, - ), - ), - ), - ), - ); - }).toList(), - ), - const SizedBox(height: 8), - ], - - // 签名及时间 - ...List.generate(pairCount, (index) { - final imgPath = signPaths[index]; - final timeLabel = signTimes[index]; - final fullUrl = '${ApiService.baseImgPath}$imgPath'; - const imageWidth = 200.0; - const imageHeight = 100.0; - - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - GestureDetector( - onTap: - () => presentOpaque( - SingleImageViewer( - imageUrl: fullUrl, - ), - context, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(4), - child: Image.network( - fullUrl, - width: imageWidth, - height: imageHeight, - fit: BoxFit.fill, - errorBuilder: - (_, __, ___) => const Icon( - Icons.broken_image, - size: 60, - ), - ), - ), - ), - const SizedBox(width: 12), - Expanded( - child: SizedBox( - height: imageHeight, - child: Align( - alignment: Alignment.bottomRight, - child: Text( - timeLabel, - style: const TextStyle( - fontSize: 14, - color: Colors.black87, - ), - ), - ), - ), - ), - ], - ), - if (index < pairCount - 1) - const Padding( - padding: EdgeInsets.only(top: 8.0), - child: Divider(height: 1), - ), - ], - ), - ); - }), - ], - ), - ); - }) - .toList()), - ], - ), - ); - } - - Widget _itemContainer(Widget child) { - return Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), - child: child, - ); - } - @override Widget build(BuildContext context) { if (FormUtils.hasValue(widget.pd, 'LATITUDE')) { - widget.pd['LATITUDE_LONGITUDE'] = '${widget.pd['LATITUDE']},${widget.pd['LONGITUDE']}'; //参数map + widget.pd['LATITUDE_LONGITUDE'] = + '${widget.pd['LATITUDE']},${widget.pd['LONGITUDE']}'; //参数map } final pd = widget.pd; @@ -292,15 +97,34 @@ class _BreakgroundDetailFormWidgetState ), const Divider(), ], - if ( - FormUtils.hasValue(pd, 'APPLY_DEPARTMENT_NAME')) ...[ - ItemListWidget.singleLineTitleText( - label: '申请部门:', - isEditable: false, - text: pd['APPLY_DEPARTMENT_NAME'] ?? '', - ), + ItemListWidget.singleLineTitleText( + label: '作业申请单位:', + isEditable: false, + text: pd['APPLY_DEPARTMENT_NAME'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '申请人:', + isEditable: false, + text: pd['APPLY_USER_NAME'] ?? '', + ), + if (FormUtils.hasValue(pd, 'CREATTIME') && !widget.isEditable) ...[ const Divider(), + ItemListWidget.singleLineTitleText( + label: '作业申请时间:', + isEditable: false, + text: pd['CREATTIME'] ?? '', + ), ], + if (FormUtils.hasValue(pd, 'CONFIRM_DEPARTMENT_NAME')) ...[ + const Divider(), + ItemListWidget.singleLineTitleText( + label: '作业单位:', + isEditable: false, + text: pd['CONFIRM_DEPARTMENT_NAME'] ?? '', + ), + ], + const Divider(), ItemListWidget.singleLineTitleText( label: '作业地点:', @@ -317,42 +141,29 @@ class _BreakgroundDetailFormWidgetState hintText: '请输入作业内容', text: pd['JOB_CONTENT'] ?? '', ), + if (FormUtils.hasValue(pd, 'GUARDIAN_USER_NAME') && + !widget.isEditable) ...[ + const Divider(), + // ItemListWidget.OneRowImageTitle(label: '作业负责人', imgPath: imgPath) + SignRowImageTitle( + label: '监护人:', + signKey: 'GUARDIAN', + signs: widget.signs, + text: pd['GUARDIAN_USER_NAME'] ?? '', + ), + ], + if (FormUtils.hasValue(pd, 'CONFIRM_USER_NAME') && + !widget.isEditable) ...[ + const Divider(), + SignRowImageTitle( + label: '作业负责人:', + signKey: 'CONFIRM', + signs: widget.signs, + text: pd['CONFIRM_USER_NAME'] ?? '', + ), + ], + const Divider(), - if (FormUtils.hasValue(pd, 'WORK_CONTENT')) ...[ - ItemListWidget.singleLineTitleText( - label: '作业内容、范围、方式:', - isEditable: false, - text: pd['WORK_CONTENT'] ?? '', - ), - const Divider(), - ], - if (FormUtils.hasValue(pd, 'CONTENT_IMG_PATH')) ...[ - ItemListWidget.singleLineTitleText( - label: '作业内容、范围、方式简图:', - isEditable: false, - text: '', - ), - SizedBox(height: 5,), - Padding(padding: EdgeInsets.symmetric(horizontal: 12), child: Row( - crossAxisAlignment: CrossAxisAlignment.end, // 对齐到底部 - children: List.generate(pd['CONTENT_IMG_PATH'].length, (index) { - final fullUrl = - ApiService.baseImgPath + pd['CONTENT_IMG_PATH'][index]; - return Container( - margin: const EdgeInsets.only(right: 20), // 右侧 20px 间隔 - width: 60, - height: 60, - child: GestureDetector( - onTap: () { - presentOpaque(SingleImageViewer(imageUrl: fullUrl), context); - }, - child: Image.network(fullUrl, fit: BoxFit.fill), - ), - ); - }), - ),), - const Divider(), - ], ItemListWidget.twoRowButtonTitleText( label: '关联其他特殊作业及安全作业票编号', isRequired: false, @@ -378,7 +189,49 @@ class _BreakgroundDetailFormWidgetState controller: widget.relatedController, text: pd['SPECIAL_WORK'] ?? '', ), + const Divider(), + if (FormUtils.hasValue(pd, 'WORK_CONTENT')) ...[ + ItemListWidget.singleLineTitleText( + label: '作业内容、范围、方式:', + isEditable: false, + text: pd['WORK_CONTENT'] ?? '', + ), + const Divider(), + ], + if (FormUtils.hasValue(pd, 'CONTENT_IMG_PATH')) ...[ + ItemListWidget.singleLineTitleText( + label: '作业内容、范围、方式简图:', + isEditable: false, + text: '', + ), + SizedBox(height: 5), + Padding( + padding: EdgeInsets.symmetric(horizontal: 12), + child: Row( + crossAxisAlignment: CrossAxisAlignment.end, // 对齐到底部 + children: List.generate(pd['CONTENT_IMG_PATH'].length, (index) { + final fullUrl = + ApiService.baseImgPath + pd['CONTENT_IMG_PATH'][index]; + return Container( + margin: const EdgeInsets.only(right: 20), // 右侧 20px 间隔 + width: 60, + height: 60, + child: GestureDetector( + onTap: () { + presentOpaque( + SingleImageViewer(imageUrl: fullUrl), + context, + ); + }, + child: Image.network(fullUrl, fit: BoxFit.fill), + ), + ); + }), + ), + ), + const Divider(), + ], ItemListWidget.twoRowButtonTitleText( label: '风险辨识结果', isEditable: widget.isEditable, @@ -403,73 +256,69 @@ class _BreakgroundDetailFormWidgetState controller: widget.riskController, text: pd['RISK_IDENTIFICATION'] ?? '', ), + if (FormUtils.hasValue(pd, 'WORK_START_DATE')) ...[ + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '作业实施时间:', + isEditable: widget.isEditable, + text: + FormUtils.hasValue(pd, 'WORK_END_DATE') + ? '${pd['WORK_START_DATE'] ?? ''}\n-${pd['WORK_END_DATE'] ?? ''}' + : pd['WORK_START_DATE'] ?? '', + ), + ] else ...[ + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '预计作业开始时间:', + isEditable: widget.isEditable, + onTap: () async { + DateTime? picked = await BottomDateTimePicker.showDate( + mode: BottomPickerMode.dateTimeWithSeconds, + context, + allowFuture: true, + ); + if (picked != null) { + setState(() { + pd['WORK_EXPECTED_START_TIME'] = DateFormat( + 'yyyy-MM-dd HH:mm:ss', + ).format(picked); + + /// 开始时间必须早于结束时间 + if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') && + !isBeforeStr( + pd['WORK_EXPECTED_START_TIME'], + pd['WORK_EXPECTED_END_TIME'], + )) { + pd['WORK_EXPECTED_END_TIME'] = ''; + } + }); + } + }, + text: pd['WORK_EXPECTED_START_TIME'] ?? '', + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '预计作业结束时间:', + isEditable: widget.isEditable, + onTap: () async { + DateTime? picked = await BottomDateTimePicker.showDate( + context, + minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '', + allowFuture: true, + ); + if (picked != null) { + setState(() { + pd['WORK_EXPECTED_END_TIME'] = DateFormat( + 'yyyy-MM-dd HH:mm:ss', + ).format(picked); + }); + } + }, + text: pd['WORK_EXPECTED_END_TIME'] ?? '', + ), + ], const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '作业视频监控:', - isClean: widget.isEditable, - cleanText: '清除监控', - onTapClean: () { - setState(() { - pd['VIDEONAME'] = ''; - pd['VIDEOMANAGER_ID'] = ''; - }); - }, - isRequired: false, - isEditable: widget.isEditable, - onTap: widget.onChooseVideoManager ?? () {}, - text: pd['VIDEONAME'] ?? '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '预计作业开始时间:', - isEditable: widget.isEditable, - onTap: () async { - DateTime? picked = await BottomDateTimePicker.showDate( - mode: BottomPickerMode.dateTimeWithSeconds, - context, - allowFuture: true, - ); - if (picked != null) { - setState(() { - pd['WORK_EXPECTED_START_TIME'] = DateFormat( - 'yyyy-MM-dd HH:mm:ss', - ).format(picked); - - /// 开始时间必须早于结束时间 - if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') && - !isBeforeStr( - pd['WORK_EXPECTED_START_TIME'], - pd['WORK_EXPECTED_END_TIME'], - )) { - pd['WORK_EXPECTED_END_TIME'] = ''; - } - }); - } - }, - text: pd['WORK_EXPECTED_START_TIME'] ?? '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '预计作业结束时间:', - isEditable: widget.isEditable, - onTap: () async { - DateTime? picked = await BottomDateTimePicker.showDate( - context, - minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '', - allowFuture: true, - ); - if (picked != null) { - setState(() { - pd['WORK_EXPECTED_END_TIME'] = DateFormat( - 'yyyy-MM-dd HH:mm:ss', - ).format(picked); - }); - } - }, - text: pd['WORK_EXPECTED_END_TIME'] ?? '', - ), - const Divider(), ListItemFactory.createYesNoSection( verticalPadding: 0, horizontalPadding: 2, @@ -511,19 +360,40 @@ class _BreakgroundDetailFormWidgetState isInput: false, isEditable: widget.isEditable, buttonText: '定位', - onTap: widget.onWorkAreaLocationHandle ?? (){}, + onTap: widget.onWorkAreaLocationHandle ?? () {}, hintText: '', text: pd['LATITUDE_LONGITUDE'] ?? (widget.isEditable ? '' : '无'), ), - // 作业人签字 - if (FormUtils.hasValue(widget.signs, 'WORK_USER')) - Column( - children: [ - Container(height: 10,width: double.maxFinite,color: h_backGroundColor(),), - signItemWidget('WORK_USER', 'WORK_USER_USER_NAME', '作业人', context), - ], - ) + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '作业视频监控:', + isClean: widget.isEditable, + cleanText: '清除监控', + onTapClean: () { + setState(() { + pd['VIDEONAME'] = ''; + pd['VIDEOMANAGER_ID'] = ''; + }); + }, + isRequired: false, + isEditable: widget.isEditable, + onTap: widget.onChooseVideoManager ?? () {}, + text: pd['VIDEONAME'] ?? '', + ), + + if (FormUtils.hasValue(widget.signs, 'WORK_USER')) ...[ + const Divider(), + ConfirmWithSignWidget( + signs: widget.signs, + pd: pd, + baseImgPath: ApiService.baseImgPath, + sectionKey: 'WORK_USER', + nameKey: 'WORK_USER_USER_NAME', + headerTitle: '作业人签字', + roleTitle: '', + ), + ], ], ), ); diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/SpecialWorkFormBaseWork.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/SpecialWorkFormBaseWork.dart index d679fa9..992b8a5 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/SpecialWorkFormBaseWork.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/SpecialWorkFormBaseWork.dart @@ -51,202 +51,6 @@ class SpecialWorkFormBaseWork extends StatelessWidget { ); } - Widget signItemWidget( - String signKey, - String nameKey, - String name, - BuildContext context, - ) { - return _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 标题行 - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Row( - children: [ - Expanded( - child: Text( - name, - style: TextStyle(fontSize: 13, fontWeight: FontWeight.bold), - ), - ), - SizedBox(width: 10), - if (FormUtils.hasValue(pd, nameKey)) - Text( - pd[nameKey]?.toString() ?? '', - style: const TextStyle(fontSize: 13), - ), - ], - ), - ), - const SizedBox(height: 8), - - if (FormUtils.hasValue(signs, signKey)) - ...((signs[signKey] as List) - .cast>() - .map((item) { - // 解析 SIGN_PATH - List signPaths = []; - final rawSP = - FormUtils.hasValue(item, 'SIGN_PATH') - ? item['SIGN_PATH'] - : null; - if (rawSP is String && rawSP.isNotEmpty) { - signPaths = rawSP.split(',').map((s) => s.trim()).toList(); - } else if (rawSP is List) { - signPaths = rawSP.cast(); - } - - // 解析 SIGN_TIME 保留空格 - List signTimes = []; - final rawST = - FormUtils.hasValue(item, 'SIGN_TIME') - ? item['SIGN_TIME'] - : null; - if (rawST is String && rawST.isNotEmpty) { - signTimes = rawST.split(','); - } else if (rawST is List) { - signTimes = rawST.cast(); - } - - final pairCount = math.min( - signPaths.length, - signTimes.length, - ); - - // 解析 IMG_PATH, 最多 2 张 - List imgPaths = []; - final rawIP = - FormUtils.hasValue(item, 'IMG_PATH') - ? item['IMG_PATH'] - : null; - if (rawIP is String && rawIP.isNotEmpty) { - imgPaths = - rawIP.split(',').map((s) => s.trim()).take(2).toList(); - } else if (rawIP is List) { - imgPaths = rawIP.cast().take(2).toList(); - } - - return Padding( - padding: const EdgeInsets.symmetric( - vertical: 8.0, - horizontal: 10, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (imgPaths.isNotEmpty) ...[ - Row( - children: - imgPaths.map((p) { - final fullUrl = '$baseImgPath$p'; - return GestureDetector( - onTap: - () => presentOpaque( - SingleImageViewer(imageUrl: fullUrl), - context, - ), - child: Padding( - padding: const EdgeInsets.only( - right: 8.0, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(2), - child: Image.network( - fullUrl, - width: 50, - height: 50, - fit: BoxFit.fill, - errorBuilder: - (_, __, ___) => const Icon( - Icons.broken_image, - size: 40, - ), - ), - ), - ), - ); - }).toList(), - ), - const SizedBox(height: 8), - ], - - // 签名及时间 - ...List.generate(pairCount, (index) { - final imgPath = signPaths[index]; - final timeLabel = signTimes[index]; - final fullUrl = '$baseImgPath$imgPath'; - const imageWidth = 200.0; - const imageHeight = 100.0; - - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - GestureDetector( - onTap: - () => presentOpaque( - SingleImageViewer( - imageUrl: fullUrl, - ), - context, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(4), - child: Image.network( - fullUrl, - width: imageWidth, - height: imageHeight, - fit: BoxFit.fill, - errorBuilder: - (_, __, ___) => const Icon( - Icons.broken_image, - size: 60, - ), - ), - ), - ), - const SizedBox(width: 12), - Expanded( - child: SizedBox( - height: imageHeight, - child: Align( - alignment: Alignment.bottomRight, - child: Text( - timeLabel, - style: const TextStyle( - fontSize: 14, - color: Colors.black87, - ), - ), - ), - ), - ), - ], - ), - if (index < pairCount - 1) - const Padding( - padding: EdgeInsets.only(top: 8.0), - child: Divider(height: 1), - ), - ], - ), - ); - }), - ], - ), - ); - }) - .toList()), - ], - ), - ); - } @override Widget build(BuildContext context) { @@ -258,8 +62,9 @@ class SpecialWorkFormBaseWork extends StatelessWidget { BreakgroundDetailFormWidget( pd: pd, isEditable: isEditable, - signs: {}, + signs: signs, onChooseLevel: onChooseLevel, + ), // 安全防护措施 @@ -293,175 +98,87 @@ class SpecialWorkFormBaseWork extends StatelessWidget { ], ), ), - // 作业人签字 - if (FormUtils.hasValue(signs, 'WORK_USER')) - signItemWidget('WORK_USER', 'WORK_USER_USER_NAME', '作业人', context), - - // 各环节签字及意见 if (FormUtils.hasValue(signs, 'GUARDIAN')) - signItemWidget('GUARDIAN', 'GUARDIAN_USER_NAME', '监护人', context), - + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'GUARDIAN', + nameKey: 'GUARDIAN_USER_NAME', + headerTitle: '监护人签字', + roleTitle: '监护人', + ), if (FormUtils.hasValue(signs, 'CONFESS')) - signItemWidget('CONFESS', 'CONFESS_USER_NAME', '安全交底人', context), - + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'CONFESS', + nameKey: 'CONFESS_USER_NAME', + headerTitle: '安全交底人', + roleTitle: '安全交底人', + ), if (FormUtils.hasValue(signs, 'ACCEPT_CONFESS')) - signItemWidget( - 'ACCEPT_CONFESS', - 'ACCEPT_CONFESS_USER_NAME', - '接受交底人', - context, + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'ACCEPT_CONFESS', + nameKey: 'ACCEPT_CONFESS_USER_NAME', + headerTitle: '接受交底人', + roleTitle: '', + ), + if (FormUtils.hasValue(signs, 'CONFIRM')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'CONFIRM', + nameKey: 'CONFIRM_USER_NAME', + headerTitle: '作业负责人意见', + roleTitle: '作业负责人', + ), + if (FormUtils.hasValue(signs, 'LEADER')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'LEADER', + nameKey: 'LEADER_USER_NAME', + headerTitle: '所在单位负责人意见', + roleTitle: '所在单位负责人', + ), + if (FormUtils.hasValue(signs, 'SAFETY')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'SAFETY', + nameKey: 'SAFETY_USER_NAME', + headerTitle: '有关水、电、汽、工艺、设备、消防、安全等部门意见', + roleTitle: '', + ), + if (FormUtils.hasValue(signs, 'APPROVE')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'APPROVE', + nameKey: 'APPROVE_USER_NAME', + headerTitle: '审批部门负责人意见', + roleTitle: '审批部门负责人', + ), + if (FormUtils.hasValue(signs, 'ACCEPT')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'ACCEPT', + nameKey: 'ACCEPT_USER_NAME', + headerTitle: '验收部门负责人意见', + roleTitle: '验收部门负责人', ), - // 作业负责人意见 - if (FormUtils.hasValue(signs, 'CONFIRM')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 8), - child: ListItemFactory.headerTitle('作业负责人意见'), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['CONFIRM'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1), - signItemWidget('CONFIRM', 'CONFIRM_USER_NAME', '作业负责人', context), - ], - ), - ], - - // 所在单位负责人意见 - if (FormUtils.hasValue(signs, 'LEADER')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 8), - child: ListItemFactory.headerTitle('所在单位意见'), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['LEADER'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1), - signItemWidget('LEADER', 'LEADER_USER_NAME', '所在单位负责人', context), - ], - ), - ], - - // 安全管理部门负责人意见 - if (FormUtils.hasValue(signs, 'SAFETY')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 8), - child: Text( - '有关水、电、汽、工艺、设备、消防、安全等部门意见', - maxLines: 5, - overflow: TextOverflow.ellipsis, - style: const TextStyle( - fontSize: 13, - fontWeight: FontWeight.bold, - ), - ), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['SAFETY'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1), - signItemWidget( - 'SAFETY', - 'SAFETY_USER_NAME', - '有关水、电、汽、工艺、设备、消防、安全等部门负责人', - context, - ), - ], - ), - ], - - // 审批人意见 - if (FormUtils.hasValue(signs, 'APPROVE')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 8), - child: ListItemFactory.headerTitle('审批人意见'), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['APPROVE'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1), - signItemWidget('APPROVE', 'APPROVE_USER_NAME', '审批负责人', context), - ], - ), - ], - - // // 作业开始负责人签字 - // if (FormUtils.hasValue(signs, 'WORK_START')) - // signItemWidget( - // 'WORK_START', - // 'WORK_START_USER_NAME', - // '作业开始负责人', - // context, - // ), - // - // // 作业结束负责人签字 - // if (FormUtils.hasValue(signs, 'WORK_END')) - // signItemWidget('WORK_END', 'WORK_END_USER_NAME', '作业结束负责人', context), - - // 完工验收意见和签字 - if (FormUtils.hasValue(signs, 'ACCEPT')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding( - padding: EdgeInsets.symmetric(horizontal: 8), - child: ListItemFactory.headerTitle('完工验收意见'), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['ACCEPT'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1), - signItemWidget('ACCEPT', 'ACCEPT_USER_NAME', '验收部门负责人', context), - ], - ), - ], ], ); } diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/aqcs_work_detail/breakground_safe_func_sure.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/aqcs_work_detail/breakground_safe_func_sure.dart index cbb663d..1460ef0 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/aqcs_work_detail/breakground_safe_func_sure.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/aqcs_work_detail/breakground_safe_func_sure.dart @@ -275,7 +275,7 @@ class _BreakgroundSafeFuncSureState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart index 5f83a65..6fd84a4 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/aqjd_work_detail/breakground_aqjd_detail.dart @@ -239,7 +239,7 @@ class _BreakgroundAqjdDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -251,7 +251,7 @@ class _BreakgroundAqjdDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/breakground_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/breakground_list_page.dart index d619637..487fcc7 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/breakground_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/breakground_list_page.dart @@ -58,7 +58,6 @@ class _BreakgroundListPageState extends State { @override void initState() { super.initState(); - _fetchSteps(); _fetchData(); _scrollController.addListener(_onScroll); } @@ -137,12 +136,14 @@ class _BreakgroundListPageState extends State { } /// 申请 - void _handleApply() { + void _handleApply() async{ // 处理申请按钮点击逻辑 - pushPage( + await pushPage( BreakgroundApplyDetail(BREAKGROUND_ID: '', flow: widget.flow), context, ); + _fetchData(); + LoadingDialogHelper.hide(); } /// 打开流程图 @@ -314,9 +315,10 @@ class _BreakgroundListPageState extends State { default: break; } - LoadingDialogHelper.show(); - _fetchSteps(); - _fetchData(); + + + await _fetchData(); + LoadingDialogHelper.hide(); } Widget _buildFlowStepItem({ diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart index f8a1d26..fd6e8ee 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/dt_work_detai/breakground_apply_detail.dart @@ -19,7 +19,6 @@ import 'package:intl/intl.dart'; import 'package:qhd_prevention/pages/home/tap/workArea_picker.dart'; import 'package:qhd_prevention/customWidget/BaiDuMap/Map_page.dart'; - enum EditUserType { WORK_USER('作业人单位', '作业人', true), GUARDIAN('监护人单位', '监护人', true), @@ -72,15 +71,18 @@ class _BreakgroundApplyDetailState extends State { final TextEditingController _contentController = TextEditingController(); final TextEditingController _relatedController = TextEditingController(); final TextEditingController _riskController = TextEditingController(); + /// ------------------- 新增 ------------------- /// 视频监控摄像 late List videoMonitoringList = []; + /// 承包商列表 late List unitAllList = []; + /// 作业区域列表 late List> workAreaList = []; - /// -------------------------------------- + /// -------------------------------------- // 存储各单位的人员列表 final Map>> _personCache = {}; @@ -91,7 +93,6 @@ class _BreakgroundApplyDetailState extends State { if (widget.BREAKGROUND_ID.length > 0) { msg = 'edit'; _getData(); - } else { isEditable = true; pd['APPLY_DEPARTMENT_ID'] = SessionService.instance.deptId; @@ -139,7 +140,7 @@ class _BreakgroundApplyDetailState extends State { void set_pd_USER_ID(EditUserType type, String id) { if (type == EditUserType.WORK_USER) { pd['${type.name}_ID'] = id; - }else{ + } else { pd['${type.name}_USER_ID'] = id; } } @@ -159,7 +160,7 @@ class _BreakgroundApplyDetailState extends State { String get_pd_USER_ID(EditUserType type) { if (type == EditUserType.WORK_USER) { return pd['${type.name}_ID'] ?? ''; - }else{ + } else { return pd['${type.name}_USER_ID'] ?? ''; } } @@ -167,15 +168,16 @@ class _BreakgroundApplyDetailState extends State { String get_pd_USER_Name(EditUserType type) { return pd['${type.name}_USER_NAME'] ?? ''; } + /// ---------------------------- 新增 -------------------------------- /// 视频监控摄像头 Future _chooseVideoManager() async { final choice = await BottomPicker.show( context, items: - videoMonitoringList - .map((item) => item['VIDEONAME'] as String) - .toList(), + videoMonitoringList + .map((item) => item['VIDEONAME'] as String) + .toList(), itemBuilder: (item) => Text(item, textAlign: TextAlign.center), initialIndex: 0, ); @@ -184,7 +186,7 @@ class _BreakgroundApplyDetailState extends State { pd['VIDEONAME'] = choice; Map result = videoMonitoringList.firstWhere( - (item) => item['VIDEONAME'] == choice, + (item) => item['VIDEONAME'] == choice, orElse: () => {}, // 避免找不到时报错 ); if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { @@ -194,6 +196,7 @@ class _BreakgroundApplyDetailState extends State { }); } } + /// 选择承包商 Future _chooseUnitManager() async { final choice = await BottomPicker.show( @@ -207,7 +210,7 @@ class _BreakgroundApplyDetailState extends State { pd['UNITS_NAME'] = choice; Map result = unitAllList.firstWhere( - (item) => item['UNITS_NAME'] == choice, + (item) => item['UNITS_NAME'] == choice, orElse: () => {}, // 避免找不到时报错 ); if (FormUtils.hasValue(result, 'UNITS_ID')) { @@ -217,10 +220,9 @@ class _BreakgroundApplyDetailState extends State { }); } } - - + /// 选择经纬度 - Future _showLocationHandle() async{ + Future _showLocationHandle() async { if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) { ToastUtil.showNormal(context, '请选择作业区域'); return; @@ -229,10 +231,11 @@ class _BreakgroundApplyDetailState extends State { setState(() { pd['LONGITUDE'] = mapData['longitue'] ?? ''; pd['LATITUDE'] = mapData['latitude'] ?? ''; - pd['LATITUDE_LONGITUDE'] = '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; + pd['LATITUDE_LONGITUDE'] = + '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; }); - } + /// 作业区域 Future _getWorkArea() async { //FocusHelper.clearFocus(context); @@ -243,16 +246,19 @@ class _BreakgroundApplyDetailState extends State { backgroundColor: Colors.transparent, builder: (_) => WorkAreaPicker( - onSelected: (String id, String POSITIONS, String name) { - pd['ELECTRONIC_FENCE_AREA_ID'] = id; - pd['POSITIONS'] = POSITIONS; - pd['PLS_NAME'] = name; - }, - ), + onSelected: (String id, String POSITIONS, String name) { + setState(() { + pd['ELECTRONIC_FENCE_AREA_ID'] = id; + pd['POSITIONS'] = POSITIONS; + pd['PLS_NAME'] = name; + }); + }, + ), ).then((_) { //FocusHelper.clearFocus(context); }); } + /// 获取摄像头列表 Future _getVideoList() async { final result = await ApiService.getVideomanagerList(); @@ -260,6 +266,7 @@ class _BreakgroundApplyDetailState extends State { videoMonitoringList = result['varList'] ?? []; }); } + /// 获承包商列表 Future _getUnitListAll() async { final result = await ApiService.getUnitListAll(); @@ -267,6 +274,7 @@ class _BreakgroundApplyDetailState extends State { unitAllList = result['varList'] ?? []; }); } + /// 作业区域列表 Future _getPlsList() async { final result = await ApiService.getWorkAreaList(); @@ -275,6 +283,7 @@ class _BreakgroundApplyDetailState extends State { workAreaList = jsonDecode(zTreeNodes); }); } + /// ------------------------------------------------------------ Future _chooseLevel() async { final choice = await BottomPicker.show( @@ -384,13 +393,15 @@ class _BreakgroundApplyDetailState extends State { return; } - if (personList.isEmpty) { // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 + if (personList.isEmpty) { + // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 await _getPersonListForUnitId(unitId, type); final list = _personCache[type] ?? []; - if (list.isEmpty) { // 如果还是没数据,说明该部门没有可选的人 + if (list.isEmpty) { + // 如果还是没数据,说明该部门没有可选的人 ToastUtil.showNormal(context, '暂无数据,请选择其他单位'); - }else{ + } else { choosePersonHandle(type); } return; @@ -427,7 +438,6 @@ class _BreakgroundApplyDetailState extends State { {'value': _riskController.text.trim(), 'message': '请输入风险辨识结果'}, ]; - /// 各项负责人校验 final unitRules = [ EditUserType.GUARDIAN, @@ -459,7 +469,8 @@ class _BreakgroundApplyDetailState extends State { return; } - if (pd['IS_CONTRACTOR_WORK'] == '1' && !FormUtils.hasValue(pd, 'UNITS_ID')) { + if (pd['IS_CONTRACTOR_WORK'] == '1' && + !FormUtils.hasValue(pd, 'UNITS_ID')) { ToastUtil.showNormal(context, '请选择承包商'); return; } @@ -526,8 +537,10 @@ class _BreakgroundApplyDetailState extends State { /// 初始化拉取数据 Future _getData() async { - - final data = await ApiService.getHomeworkFindById('breakground', widget.BREAKGROUND_ID); + final data = await ApiService.getHomeworkFindById( + 'breakground', + widget.BREAKGROUND_ID, + ); setState(() { pd = data['pd']; if (pd['STEP_ID'] == 0) { @@ -544,12 +557,12 @@ class _BreakgroundApplyDetailState extends State { _relatedController.text = pd['SPECIAL_WORK'] ?? ''; _riskController.text = pd['RISK_IDENTIFICATION'] ?? ''; }); - } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + final data = await ApiService.listSignFinished( + 'breakground', + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; @@ -557,8 +570,9 @@ class _BreakgroundApplyDetailState extends State { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + final data = await ApiService.listSignFinishMeasures( + 'breakground', + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -667,7 +681,7 @@ class _BreakgroundApplyDetailState extends State { color: Colors.white, child: MeasuresListWidget( measuresList: - measuresList, // List> + measuresList, // List> baseImgPath: ApiService.baseImgPath, isAllowEdit: false, ), @@ -695,45 +709,9 @@ class _BreakgroundApplyDetailState extends State { ), isEditable ? Row( - spacing: 10, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: CustomButton( - height: 45, - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '提交', - backgroundColor: Colors.blue, - onPressed: () { - _submit('1'); - }, - ), - ), - - Expanded( - child: CustomButton( - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '暂存', - backgroundColor: Colors.green, - onPressed: () { - _submit('0'); - }, - ), - ), - ], - ) - : Column( - children: [ - SizedBox(height: 20), - Row( + spacing: 10, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox(width: 50), Expanded( child: CustomButton( height: 45, @@ -741,18 +719,54 @@ class _BreakgroundApplyDetailState extends State { fontSize: 16, color: Colors.white, ), - text: '返回', - backgroundColor: Colors.green, + text: '提交', + backgroundColor: Colors.blue, onPressed: () { - Navigator.pop(context); + _submit('1'); }, ), ), - SizedBox(width: 50), + + Expanded( + child: CustomButton( + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '暂存', + backgroundColor: Colors.green, + onPressed: () { + _submit('0'); + }, + ), + ), + ], + ) + : Column( + children: [ + SizedBox(height: 20), + Row( + children: [ + SizedBox(width: 50), + Expanded( + child: CustomButton( + height: 45, + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '返回', + backgroundColor: Colors.green, + onPressed: () { + Navigator.pop(context); + }, + ), + ), + SizedBox(width: 50), + ], + ), ], ), - ], - ), ], ), ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/dzzh_work_detail/breakground_dzzh_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/dzzh_work_detail/breakground_dzzh_detail.dart index 7566825..47bf7f1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/dzzh_work_detail/breakground_dzzh_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/dzzh_work_detail/breakground_dzzh_detail.dart @@ -208,7 +208,7 @@ class _BreakgroundDzzhDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -220,7 +220,7 @@ class _BreakgroundDzzhDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/jhr_work_detail/breakground_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/jhr_work_detail/breakground_jhr_detail.dart index 7bc9423..ca540e0 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/jhr_work_detail/breakground_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/jhr_work_detail/breakground_jhr_detail.dart @@ -202,7 +202,7 @@ class _BreakgroundJhrDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -214,7 +214,7 @@ class _BreakgroundJhrDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/jsjd_work_detail/breakground_jsjd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/jsjd_work_detail/breakground_jsjd_detail.dart index 8d6457c..60dd3d6 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/jsjd_work_detail/breakground_jsjd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/jsjd_work_detail/breakground_jsjd_detail.dart @@ -202,7 +202,7 @@ class _BreakgroundJsjdDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -214,7 +214,7 @@ class _BreakgroundJsjdDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/jszy_work_detail/breakground_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/jszy_work_detail/breakground_jszy_detail.dart index 833ba48..3e861ec 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/jszy_work_detail/breakground_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/jszy_work_detail/breakground_jszy_detail.dart @@ -149,7 +149,7 @@ class _BreakgroundJszyDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -161,7 +161,7 @@ class _BreakgroundJszyDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; @@ -207,6 +207,7 @@ class _BreakgroundJszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( +spacing: 12, children: [ // _setSafeDetailWidget(), SpecialWorkFormBaseWork( @@ -247,7 +248,6 @@ class _BreakgroundJszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/kszy_work_detail/breakground_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/kszy_work_detail/breakground_kszy_detail.dart index 7ab9caa..5eba923 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/kszy_work_detail/breakground_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/kszy_work_detail/breakground_kszy_detail.dart @@ -132,7 +132,7 @@ class _BreakgroundKszyDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -144,7 +144,7 @@ class _BreakgroundKszyDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; @@ -190,6 +190,7 @@ class _BreakgroundKszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( + spacing: 12, children: [ // _setSafeDetailWidget(), SpecialWorkFormBaseWork( @@ -236,7 +237,6 @@ class _BreakgroundKszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/shbm_work_detail/breakground_shbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/shbm_work_detail/breakground_shbm_detail.dart index 3919ab3..2d4e10b 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/shbm_work_detail/breakground_shbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/shbm_work_detail/breakground_shbm_detail.dart @@ -207,7 +207,7 @@ class _BreakgroundShbmDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -219,7 +219,7 @@ class _BreakgroundShbmDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; @@ -294,7 +294,7 @@ class _BreakgroundShbmDetailState extends State { children: [ Expanded( child: ListItemFactory.headerTitle( - '有关水、电、汽、工艺、设备、消防安全等部门负责人', + '有关水、电、汽、工艺、设备、\n消防安全等部门负责人', ), ), CustomButton( diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/spbm_work_detail/breakground_spbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/spbm_work_detail/breakground_spbm_detail.dart index 0271ddb..b7fb181 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/spbm_work_detail/breakground_spbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/spbm_work_detail/breakground_spbm_detail.dart @@ -207,7 +207,7 @@ class _BreakgroundSpbmDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -219,7 +219,7 @@ class _BreakgroundSpbmDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/ssr_work_detail/breakground_ssr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/ssr_work_detail/breakground_ssr_detail.dart index 1eeede3..4714219 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/ssr_work_detail/breakground_ssr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/ssr_work_detail/breakground_ssr_detail.dart @@ -201,7 +201,7 @@ class _BreakgroundSsrDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -213,7 +213,7 @@ class _BreakgroundSsrDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/szaq_work_detail/breakground_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/szaq_work_detail/breakground_set_safe_detail.dart index 4057f4a..9349f36 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/szaq_work_detail/breakground_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/szaq_work_detail/breakground_set_safe_detail.dart @@ -352,7 +352,7 @@ class _BreakgroundSetSafeDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; @@ -360,7 +360,7 @@ class _BreakgroundSetSafeDetailState extends State { } Future _getMeasures() async { - final data = await ApiService.listSignFinishAllMeasures('breakground'); + final data = await ApiService.listSignFinishAllMeasures('breakground', widget.BREAKGROUND_ID); setState(() { measuresList = List>.from( data['measuresList'] ?? >[], diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/szdw_work_detail/breakground_szdw_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/szdw_work_detail/breakground_szdw_detail.dart index 31431d4..cd87d7c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/szdw_work_detail/breakground_szdw_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/szdw_work_detail/breakground_szdw_detail.dart @@ -208,7 +208,7 @@ class _BreakgroundSzdwDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -220,7 +220,7 @@ class _BreakgroundSzdwDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/ysgd_work_detail/breakground_ysgd_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/ysgd_work_detail/breakground_ysgd_detail.dart index adb7657..7395412 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/ysgd_work_detail/breakground_ysgd_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/ysgd_work_detail/breakground_ysgd_detail.dart @@ -272,7 +272,7 @@ class _BreakgroundYsgdDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -284,7 +284,7 @@ class _BreakgroundYsgdDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/zyfz_work_detail/breakground_zyfz_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/zyfz_work_detail/breakground_zyfz_detail.dart index 4b456fe..608ee6e 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/zyfz_work_detail/breakground_zyfz_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/zyfz_work_detail/breakground_zyfz_detail.dart @@ -208,7 +208,7 @@ class _BreakgroundZyfzDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -220,7 +220,7 @@ class _BreakgroundZyfzDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; diff --git a/lib/pages/home/tap/tabList/special_wrok/dt_work/zyr_work_detail/breakground_zyr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dt_work/zyr_work_detail/breakground_zyr_detail.dart index b807d8d..300dbb1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dt_work/zyr_work_detail/breakground_zyr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dt_work/zyr_work_detail/breakground_zyr_detail.dart @@ -228,7 +228,7 @@ class _BreakgroundZyrDetailState extends State { Future _getMeasures(String homework_id) async { final data = await ApiService.listSignFinishMeasures( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { measuresList = List>.from( @@ -240,7 +240,7 @@ class _BreakgroundZyrDetailState extends State { Future _getSigns(String homework_id) async { final data = await ApiService.listSignFinished( 'breakground', - homework_id.length > 0 ? homework_id : widget.BREAKGROUND_ID, + homework_id.length > 0 ? homework_id : '', ); setState(() { signs = data['signs'] ?? {}; diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/HoistworkDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/HoistworkDetailFormWidget.dart index e6cb1ba..b2ba79f 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/HoistworkDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/HoistworkDetailFormWidget.dart @@ -78,180 +78,6 @@ class _HoistworkDetailFormWidgetState extends State { default: return ''; } } - Widget signItemWidget( - String signKey, - String nameKey, - String name, - BuildContext context, - ) { - return _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 标题行 - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Row( - children: [ - Expanded( - child: ListItemFactory.headerTitle(name), - ), - if (FormUtils.hasValue(widget.pd, nameKey)) - Text( - widget.pd[nameKey]?.toString() ?? '', - style: const TextStyle(fontSize: 16), - ), - ], - ), - ), - const SizedBox(height: 8), - - if (FormUtils.hasValue(widget.signs, signKey)) - ...((widget.signs[signKey] as List) - .cast>() - .map((item) { - // 解析 SIGN_PATH - List signPaths = []; - final rawSP = FormUtils.hasValue(item, 'SIGN_PATH') ? item['SIGN_PATH'] : null; - if (rawSP is String && rawSP.isNotEmpty) { - signPaths = rawSP.split(',').map((s) => s.trim()).toList(); - } else if (rawSP is List) { - signPaths = rawSP.cast(); - } - - // 解析 SIGN_TIME 保留空格 - List signTimes = []; - final rawST = FormUtils.hasValue(item, 'SIGN_TIME') ? item['SIGN_TIME'] : null; - if (rawST is String && rawST.isNotEmpty) { - signTimes = rawST.split(','); - } else if (rawST is List) { - signTimes = rawST.cast(); - } - - final pairCount = math.min(signPaths.length, signTimes.length); - - // 解析 IMG_PATH, 最多 2 张 - List imgPaths = []; - final rawIP = FormUtils.hasValue(item, 'IMG_PATH') ? item['IMG_PATH'] : null; - if (rawIP is String && rawIP.isNotEmpty) { - imgPaths = rawIP.split(',').map((s) => s.trim()).take(2).toList(); - } else if (rawIP is List) { - imgPaths = rawIP.cast().take(2).toList(); - } - - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (imgPaths.isNotEmpty) ...[ - Row( - children: imgPaths.map((p) { - final fullUrl = '${ApiService.baseImgPath}$p'; - return GestureDetector( - onTap: () => presentOpaque( - SingleImageViewer(imageUrl: fullUrl), - context, - ), - child: Padding( - padding: const EdgeInsets.only(right: 8.0), - child: ClipRRect( - borderRadius: BorderRadius.circular(2), - child: Image.network( - fullUrl, - width: 50, - height: 50, - fit: BoxFit.fill, - errorBuilder: (_, __, ___) => const Icon( - Icons.broken_image, - size: 40, - ), - ), - ), - ), - ); - }).toList(), - ), - const SizedBox(height: 8), - ], - - // 签名及时间 - ...List.generate(pairCount, (index) { - final imgPath = signPaths[index]; - final timeLabel = signTimes[index]; - final fullUrl = '${ApiService.baseImgPath}$imgPath'; - const imageWidth = 200.0; - const imageHeight = 100.0; - - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - GestureDetector( - onTap: () => presentOpaque( - SingleImageViewer(imageUrl: fullUrl), - context, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(4), - child: Image.network( - fullUrl, - width: imageWidth, - height: imageHeight, - fit: BoxFit.fill, - errorBuilder: (_, __, ___) => - const Icon(Icons.broken_image, size: 60), - ), - ), - ), - const SizedBox(width: 12), - Expanded( - child: SizedBox( - height: imageHeight, - child: Align( - alignment: Alignment.bottomRight, - child: Text( - timeLabel, - style: const TextStyle( - fontSize: 14, - color: Colors.black87, - ), - ), - ), - ), - ), - ], - ), - if (index < pairCount - 1) - const Padding( - padding: EdgeInsets.only(top: 8.0), - child: Divider(height: 1), - ), - ], - ), - ); - }), - ], - ), - ); - }).toList()), - ], - ), - ); - } - Widget _itemContainer(Widget child) { - return Container( - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.circular(8), - ), - padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 8), - child: child, - ); - } @override Widget build(BuildContext context) { @@ -277,6 +103,35 @@ class _HoistworkDetailFormWidgetState extends State { ), const Divider(), ], + ItemListWidget.singleLineTitleText( + label: '作业申请单位:', + isEditable: false, + text: pd['APPLY_DEPARTMENT_NAME'] ?? '', + ), + const Divider(), + ItemListWidget.singleLineTitleText( + label: '申请人:', + isEditable: false, + text: pd['APPLY_USER_NAME'] ?? '', + ), + if (FormUtils.hasValue(pd, 'CONFIRM_DEPARTMENT_NAME')) ...[ + const Divider(), + ItemListWidget.singleLineTitleText( + label: '作业单位:', + isEditable: false, + text: pd['CONFIRM_DEPARTMENT_NAME'] ?? '', + ), + ], + if (FormUtils.hasValue(pd, 'CREATTIME') && !widget.isEditable) ...[ + const Divider(), + ItemListWidget.singleLineTitleText( + label: '作业申请时间:', + isEditable: false, + text: pd['CREATTIME'] ?? '', + ), + ], + const Divider(), + ItemListWidget.singleLineTitleText( label: '吊装地点:', isEditable: widget.isEditable, @@ -294,6 +149,54 @@ class _HoistworkDetailFormWidgetState extends State { text: pd['TOOL_NAME'] ?? '', ), const Divider(), + ItemListWidget.multiLineTitleTextField( + label: '吊物内容:', + isEditable: widget.isEditable, + controller: widget.contentController, + hintText: '请输入吊物内容', + text: pd['WORK_CONTENT'] ?? '', + ), + if (FormUtils.hasValue(pd, 'WORK_USER_USER_NAME') && + !widget.isEditable) ...[ + const Divider(), + SignRowImageTitle( + label: '吊装作业人:', + signKey: 'WORK_USER', + signs: widget.signs, + text: pd['WORK_USER_USER_NAME'] ?? '', + ), + ], + if (FormUtils.hasValue(pd, 'SISUO_USER_NAME') && + !widget.isEditable) ...[ + const Divider(), + SignRowImageTitle( + label: '司索人:', + signKey: 'SISUO', + signs: widget.signs, + text: pd['SISUO_USER_NAME'] ?? '', + ), + ], + if (FormUtils.hasValue(pd, 'GUARDIAN_USER_NAME') && + !widget.isEditable) ...[ + const Divider(), + SignRowImageTitle( + label: '监护人:', + signKey: 'GUARDIAN', + signs: widget.signs, + text: pd['GUARDIAN_USER_NAME'] ?? '', + ), + ], + if (FormUtils.hasValue(pd, 'PROJECT_MANAGER_USER_NAME') && + !widget.isEditable) ...[ + const Divider(), + SignRowImageTitle( + label: '指挥人员:', + signKey: 'HOISTING_CONDUCTOR', + signs: widget.signs, + text: pd['PROJECT_MANAGER_USER_NAME'] ?? '', + ), + ], + const Divider(), ItemListWidget.singleLineTitleText( label: '吊物质量(吨):', keyboardType: TextInputType.numberWithOptions( @@ -308,35 +211,12 @@ class _HoistworkDetailFormWidgetState extends State { const Divider(), ItemListWidget.selectableLineTitleTextRightButton( label: '作业级别:', - isEditable: widget.isEditable, + isEditable: false, onTap: widget.onChooseLevel, text: _getWorkLevelText(pd['WORK_LEVEL']), ), const Divider(), - ItemListWidget.multiLineTitleTextField( - label: '吊物内容:', - isEditable: widget.isEditable, - controller: widget.contentController, - hintText: '请输入吊物内容', - text: pd['WORK_CONTENT'] ?? '', - ), - if (!widget.isEditable && FormUtils.hasValue(pd, 'WORK_START_DATE')) ...[ - ItemListWidget.singleLineTitleText( - label: '作业开始时间:', - isEditable: false, - text: pd['WORK_START_DATE'] ?? '', - ), - const Divider(), - ], - if (!widget.isEditable && FormUtils.hasValue(pd, 'WORK_END_DATE')) ...[ - ItemListWidget.singleLineTitleText( - label: '作业结束时间:', - isEditable: false, - text: pd['WORK_END_DATE'] ?? '', - ), - const Divider(), - ], ItemListWidget.twoRowButtonTitleText( label: '关联其他特殊作业及安全作业票编号', isRequired: false, @@ -385,71 +265,67 @@ class _HoistworkDetailFormWidgetState extends State { controller: widget.riskController, text: pd['RISK_IDENTIFICATION'] ?? '', ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '作业视频监控:', - isClean: widget.isEditable, - cleanText: '清除监控', - onTapClean: () { - setState(() { - pd['VIDEONAME'] = ''; - pd['VIDEOMANAGER_ID'] = ''; - }); - }, - isRequired: false, - isEditable: widget.isEditable, - onTap: widget.onChooseVideoManager ?? () {}, - text: pd['VIDEONAME'] ?? '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '预计作业开始时间:', - isEditable: widget.isEditable, - onTap: () async { - DateTime? picked = await BottomDateTimePicker.showDate( - mode: BottomPickerMode.dateTimeWithSeconds, - context, - allowFuture: true, - ); - if (picked != null) { - setState(() { - pd['WORK_EXPECTED_START_TIME'] = DateFormat( - 'yyyy-MM-dd HH:mm:ss', - ).format(picked); + if (FormUtils.hasValue(pd, 'WORK_START_DATE')) ...[ + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '作业实施时间:', + isEditable: widget.isEditable, + text: + FormUtils.hasValue(pd, 'WORK_END_DATE') + ? '${pd['WORK_START_DATE'] ?? ''}\n-${pd['WORK_END_DATE'] ?? ''}' + : pd['WORK_START_DATE'] ?? '', + ), + ] else ...[ + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '预计作业开始时间:', + isEditable: widget.isEditable, + onTap: () async { + DateTime? picked = await BottomDateTimePicker.showDate( + mode: BottomPickerMode.dateTimeWithSeconds, + context, + allowFuture: true, + ); + if (picked != null) { + setState(() { + pd['WORK_EXPECTED_START_TIME'] = DateFormat( + 'yyyy-MM-dd HH:mm:ss', + ).format(picked); - /// 开始时间必须早于结束时间 - if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') && - !isBeforeStr( - pd['WORK_EXPECTED_START_TIME'], - pd['WORK_EXPECTED_END_TIME'], - )) { - pd['WORK_EXPECTED_END_TIME'] = ''; - } - }); - } - }, - text: pd['WORK_EXPECTED_START_TIME'] ?? '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '预计作业结束时间:', - isEditable: widget.isEditable, - onTap: () async { - DateTime? picked = await BottomDateTimePicker.showDate( - context, - minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '', - allowFuture: true, - ); - if (picked != null) { - setState(() { - pd['WORK_EXPECTED_END_TIME'] = DateFormat( - 'yyyy-MM-dd HH:mm:ss', - ).format(picked); - }); - } - }, - text: pd['WORK_EXPECTED_END_TIME'] ?? '', - ), + /// 开始时间必须早于结束时间 + if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') && + !isBeforeStr( + pd['WORK_EXPECTED_START_TIME'], + pd['WORK_EXPECTED_END_TIME'], + )) { + pd['WORK_EXPECTED_END_TIME'] = ''; + } + }); + } + }, + text: pd['WORK_EXPECTED_START_TIME'] ?? '', + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '预计作业结束时间:', + isEditable: widget.isEditable, + onTap: () async { + DateTime? picked = await BottomDateTimePicker.showDate( + context, + minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '', + allowFuture: true, + ); + if (picked != null) { + setState(() { + pd['WORK_EXPECTED_END_TIME'] = DateFormat( + 'yyyy-MM-dd HH:mm:ss', + ).format(picked); + }); + } + }, + text: pd['WORK_EXPECTED_END_TIME'] ?? '', + ), + ], const Divider(), ListItemFactory.createYesNoSection( verticalPadding: 0, @@ -496,19 +372,35 @@ class _HoistworkDetailFormWidgetState extends State { hintText: '', text: pd['LATITUDE_LONGITUDE'] ?? (widget.isEditable ? '' : '无'), ), + const Divider(), - if (FormUtils.hasValue(widget.signs, 'SISUO')) - Column( - children: [ - Container( - color: h_backGroundColor(), - height: 10, - width: double.maxFinite, - child: SizedBox() - ), - signItemWidget('SISUO', 'SISUO_USER_NAME', '司索人', context), - ], - ) + ItemListWidget.selectableLineTitleTextRightButton( + label: '作业视频监控:', + isClean: widget.isEditable, + cleanText: '清除监控', + onTapClean: () { + setState(() { + pd['VIDEONAME'] = ''; + pd['VIDEOMANAGER_ID'] = ''; + }); + }, + isRequired: false, + isEditable: widget.isEditable, + onTap: widget.onChooseVideoManager ?? () {}, + text: pd['VIDEONAME'] ?? '', + ), + if (FormUtils.hasValue(widget.signs, 'SISUO')) ...[ + const Divider(), + ConfirmWithSignWidget( + signs: widget.signs, + pd: pd, + baseImgPath: ApiService.baseImgPath, + sectionKey: 'SISUO', + nameKey: 'SISUO_USER_NAME', + headerTitle: '司索人', + roleTitle: '司索人', + ), + ] ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/SpecialWorkFormBaseWork.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/SpecialWorkFormBaseWork.dart index 39fa5d0..7f9c814 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/SpecialWorkFormBaseWork.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/SpecialWorkFormBaseWork.dart @@ -245,8 +245,6 @@ class SpecialWorkFormBaseWork extends StatelessWidget { ], ), ), - // if (FormUtils.hasValue(signs, 'SISUO')) - // signItemWidget('SISUO', 'SISUO_USER_NAME', '司索人', context), // 其他安全防护措施 if (FormUtils.hasValue(signs, 'MEASURES_CONFIRM')) @@ -262,135 +260,89 @@ class SpecialWorkFormBaseWork extends StatelessWidget { ], ), ), - - // 各环节签字及意见 if (FormUtils.hasValue(signs, 'GUARDIAN')) - signItemWidget('GUARDIAN', 'GUARDIAN_USER_NAME', '监护人', context), - + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'GUARDIAN', + nameKey: 'GUARDIAN_USER_NAME', + headerTitle: '监护人签字', + roleTitle: '监护人', + ), if (FormUtils.hasValue(signs, 'CONFESS')) - signItemWidget('CONFESS', 'CONFESS_USER_NAME', '安全交底人', context), - + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'CONFESS', + nameKey: 'CONFESS_USER_NAME', + headerTitle: '安全交底人', + roleTitle: '安全交底人', + ), if (FormUtils.hasValue(signs, 'ACCEPT_CONFESS')) - signItemWidget('ACCEPT_CONFESS', 'ACCEPT_CONFESS_USER_NAME', '接受交底人', context), + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'ACCEPT_CONFESS', + nameKey: 'ACCEPT_CONFESS_USER_NAME', + headerTitle: '接受交底人', + roleTitle: '', + ), - // 作业负责人意见 - if (FormUtils.hasValue(signs, 'CONFIRM')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('作业负责人意见'),), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['CONFIRM'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1,), - signItemWidget('CONFIRM', 'CONFIRM_USER_NAME', '作业负责人', context), - ], - ) + if (FormUtils.hasValue(signs, 'HOISTING_CONDUCTOR')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'HOISTING_CONDUCTOR', + nameKey: 'HOISTING_CONDUCTOR_USER_NAME', + headerTitle: '作业指挥意见', + roleTitle: '', + ), - ], + if (FormUtils.hasValue(signs, 'LEADER')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'LEADER', + nameKey: 'LEADER_USER_NAME', + headerTitle: '所在单位意见', + roleTitle: '', + ), + if (FormUtils.hasValue(signs, 'AUDIT')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'AUDIT', + nameKey: 'AUDIT_USER_NAME', + headerTitle: '审核部门意见', + roleTitle: '', + ), + if (FormUtils.hasValue(signs, 'APPROVE')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'APPROVE', + nameKey: 'APPROVE_USER_NAME', + headerTitle: '审批部门意见', + roleTitle: '审批部门负责人', + ), + if (FormUtils.hasValue(signs, 'ACCEPT')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'ACCEPT', + nameKey: 'ACCEPT_USER_NAME', + headerTitle: '验收部门负责人意见', + roleTitle: '验收部门负责人', + ), - // 所在单位负责人意见 - if (FormUtils.hasValue(signs, 'LEADER')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('所在单位意见'),), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['LEADER'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1,), - signItemWidget('LEADER', 'LEADER_USER_NAME', '所在单位负责人', context), - ], - ) - ], - - // 安全管理部门负责人意见 - if (FormUtils.hasValue(signs, 'AUDIT')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('安全管理部门意见'),), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['AUDIT'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1,), - signItemWidget('AUDIT', 'AUDIT_USER_NAME', '安全管理部门负责人', context), - ], - ) - ], - - // 审批人意见 - if (FormUtils.hasValue(signs, 'APPROVE')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('审批人意见'),), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['APPROVE'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1,), - signItemWidget('APPROVE', 'APPROVE_USER_NAME', '审批负责人', context), - ], - ) - ], - - // 作业开始负责人签字 - // if (FormUtils.hasValue(signs, 'WORK_START')) - // signItemWidget('WORK_START', 'WORK_START_USER_NAME', '作业开始负责人', context), - // - // // 作业结束负责人签字 - // if (FormUtils.hasValue(signs, 'WORK_END')) - // signItemWidget('WORK_END', 'WORK_END_USER_NAME', '作业结束负责人', context), - - // 完工验收意见和签字 - if (FormUtils.hasValue(signs, 'ACCEPT')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('完工验收意见'),), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['ACCEPT'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1,), - signItemWidget('ACCEPT', 'ACCEPT_USER_NAME', '验收部门负责人', context), - ], - ) - ], ], ); } diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/dz_work_detai/hoistwork_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/dz_work_detai/hoistwork_apply_detail.dart index 16d850d..f659601 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/dz_work_detai/hoistwork_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/dz_work_detai/hoistwork_apply_detail.dart @@ -19,15 +19,13 @@ import 'package:intl/intl.dart'; import 'package:qhd_prevention/pages/home/tap/workArea_picker.dart'; import 'package:qhd_prevention/customWidget/BaiDuMap/Map_page.dart'; - enum EditUserType { SISUO('司索人单位', '司索人', true), GUARDIAN('监护人单位', '监护人', true), CONFESS('安全交底人单位', '安全交底人', true), ACCEPT_CONFESS('接受交底人单位', '接受交底人', true), - WORK_USER('作业人单位', '作业人', true), - CONFIRM('作业负责人单位', '作业负责人', true), - PROJECT_MANAGER('吊装指挥单位', '吊装指挥负责人', true), + WORK_USER('作业人单位', '吊装作业人', true), + PROJECT_MANAGER('作业指挥单位', '作业指挥负责人', true), LEADER('所在单位', '所在单位负责人', true), AUDIT('审核部门', '审核部门负责人', true), APPROVE('审批部门', '审批部门负责人', true), @@ -68,13 +66,17 @@ class _HoistworkApplyDetailState extends State { late Map pd = {}; late Map signs = {}; late List> measuresList = []; + /// ------------------- 新增 ------------------- /// 视频监控摄像 late List videoMonitoringList = []; + /// 承包商列表 late List unitAllList = []; + /// 作业区域列表 late List> workAreaList = []; + /// -------------------------------------- final TextEditingController _locationController = TextEditingController(); final TextEditingController _hightController = TextEditingController(); @@ -83,8 +85,6 @@ class _HoistworkApplyDetailState extends State { final TextEditingController _relatedController = TextEditingController(); final TextEditingController _riskController = TextEditingController(); - - // 存储各单位的人员列表 final Map>> _personCache = {}; @@ -102,7 +102,6 @@ class _HoistworkApplyDetailState extends State { pd['APPLY_USER_ID'] = SessionService.instance.loginUserId; pd['APPLY_USER_NAME'] = SessionService.instance.username; pd['IS_CONTRACTOR_WORK'] = '0'; - } _getVideoList(); _getUnitListAll(); @@ -121,6 +120,19 @@ class _HoistworkApplyDetailState extends State { _hightController.addListener(() { pd['PART_WEIGHT'] = _hightController.text.trim(); + setState(() { + double height = double.parse(pd['PART_WEIGHT']); + int level = 0; + if (height > 100.0) { + level = 1; + } else if (height >= 40.0 && height <= 100.0) { + level = 2; + } else { + level = 3; + } + pd['WORK_LEVEL'] = level; + pd['WORK_LEVEL_NAME'] = levelList[level - 1].toString(); + }); }); _relatedController.addListener(() { pd['SPECIAL_WORK'] = _relatedController.text.trim(); @@ -129,15 +141,16 @@ class _HoistworkApplyDetailState extends State { pd['RISK_IDENTIFICATION'] = _riskController.text.trim(); }); } + /// ---------------------------- 新增 -------------------------------- /// 视频监控摄像头 Future _chooseVideoManager() async { final choice = await BottomPicker.show( context, items: - videoMonitoringList - .map((item) => item['VIDEONAME'] as String) - .toList(), + videoMonitoringList + .map((item) => item['VIDEONAME'] as String) + .toList(), itemBuilder: (item) => Text(item, textAlign: TextAlign.center), initialIndex: 0, ); @@ -146,7 +159,7 @@ class _HoistworkApplyDetailState extends State { pd['VIDEONAME'] = choice; Map result = videoMonitoringList.firstWhere( - (item) => item['VIDEONAME'] == choice, + (item) => item['VIDEONAME'] == choice, orElse: () => {}, // 避免找不到时报错 ); if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { @@ -156,6 +169,7 @@ class _HoistworkApplyDetailState extends State { }); } } + /// 选择承包商 Future _chooseUnitManager() async { final choice = await BottomPicker.show( @@ -169,7 +183,7 @@ class _HoistworkApplyDetailState extends State { pd['UNITS_NAME'] = choice; Map result = unitAllList.firstWhere( - (item) => item['UNITS_NAME'] == choice, + (item) => item['UNITS_NAME'] == choice, orElse: () => {}, // 避免找不到时报错 ); if (FormUtils.hasValue(result, 'UNITS_ID')) { @@ -179,10 +193,9 @@ class _HoistworkApplyDetailState extends State { }); } } - - + /// 选择经纬度 - Future _showLocationHandle() async{ + Future _showLocationHandle() async { if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) { ToastUtil.showNormal(context, '请选择作业区域'); return; @@ -191,10 +204,11 @@ class _HoistworkApplyDetailState extends State { setState(() { pd['LONGITUDE'] = mapData['longitue'] ?? ''; pd['LATITUDE'] = mapData['latitude'] ?? ''; - pd['LATITUDE_LONGITUDE'] = '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; + pd['LATITUDE_LONGITUDE'] = + '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; }); - } + /// 作业区域 Future _getWorkArea() async { //FocusHelper.clearFocus(context); @@ -205,16 +219,19 @@ class _HoistworkApplyDetailState extends State { backgroundColor: Colors.transparent, builder: (_) => WorkAreaPicker( - onSelected: (String id, String POSITIONS, String name) { - pd['ELECTRONIC_FENCE_AREA_ID'] = id; - pd['POSITIONS'] = POSITIONS; - pd['PLS_NAME'] = name; - }, - ), + onSelected: (String id, String POSITIONS, String name) { + setState(() { + pd['ELECTRONIC_FENCE_AREA_ID'] = id; + pd['POSITIONS'] = POSITIONS; + pd['PLS_NAME'] = name; + }); + }, + ), ).then((_) { //FocusHelper.clearFocus(context); }); } + /// 获取摄像头列表 Future _getVideoList() async { final result = await ApiService.getVideomanagerList(); @@ -222,6 +239,7 @@ class _HoistworkApplyDetailState extends State { videoMonitoringList = result['varList'] ?? []; }); } + /// 获承包商列表 Future _getUnitListAll() async { final result = await ApiService.getUnitListAll(); @@ -229,6 +247,7 @@ class _HoistworkApplyDetailState extends State { unitAllList = result['varList'] ?? []; }); } + /// 作业区域列表 Future _getPlsList() async { final result = await ApiService.getWorkAreaList(); @@ -237,6 +256,7 @@ class _HoistworkApplyDetailState extends State { workAreaList = jsonDecode(zTreeNodes); }); } + /// ------------------------------------------------------------ void set_pd_DEPARTMENT_ID(EditUserType type, String id) { pd['${type.name}_DEPARTMENT_ID'] = id; @@ -249,7 +269,7 @@ class _HoistworkApplyDetailState extends State { void set_pd_USER_ID(EditUserType type, String id) { if (type == EditUserType.WORK_USER) { pd['${type.name}_ID'] = id; - }else{ + } else { pd['${type.name}_USER_ID'] = id; } } @@ -269,7 +289,7 @@ class _HoistworkApplyDetailState extends State { String get_pd_USER_ID(EditUserType type) { if (type == EditUserType.WORK_USER) { return pd['${type.name}_ID'] ?? ''; - }else{ + } else { return pd['${type.name}_USER_ID'] ?? ''; } } @@ -278,23 +298,6 @@ class _HoistworkApplyDetailState extends State { return pd['${type.name}_USER_NAME'] ?? ''; } - Future _chooseLevel() async { - final choice = await BottomPicker.show( - context, - items: levelList, - itemBuilder: (item) => Text(item, textAlign: TextAlign.center), - initialIndex: 0, - ); - if (choice != null) { - // 用户点击确定并选择了 choice - setState(() { - pd['WORK_LEVEL_NAME'] = choice; - pd['WORK_LEVEL'] = (levelList.indexOf(choice) + 1).toString(); - //FocusHelper.clearFocus(context); - }); - } - } - Widget _card(Widget child) { return Container( padding: EdgeInsets.symmetric(vertical: 5), @@ -390,13 +393,15 @@ class _HoistworkApplyDetailState extends State { return; } - if (personList.isEmpty) { // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 + if (personList.isEmpty) { + // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 await _getPersonListForUnitId(unitId, type); final list = _personCache[type] ?? []; - if (list.isEmpty) { // 如果还是没数据,说明该部门没有可选的人 + if (list.isEmpty) { + // 如果还是没数据,说明该部门没有可选的人 ToastUtil.showNormal(context, '暂无数据,请选择其他单位'); - }else{ + } else { choosePersonHandle(type); } return; @@ -443,12 +448,10 @@ class _HoistworkApplyDetailState extends State { EditUserType.GUARDIAN, EditUserType.CONFESS, EditUserType.ACCEPT_CONFESS, - EditUserType.CONFIRM, EditUserType.LEADER, EditUserType.PROJECT_MANAGER, EditUserType.AUDIT, - if (pd['WORK_LEVEL'] == '1') - EditUserType.APPROVE, + if (pd['WORK_LEVEL'] == '1') EditUserType.APPROVE, EditUserType.WORK_USER, EditUserType.WORK_START, EditUserType.WORK_END, @@ -462,11 +465,7 @@ class _HoistworkApplyDetailState extends State { return; } } - // 级别校验 - if (level.length == 0) { - ToastUtil.showNormal(context, '请选择作业级别'); - return; - } + if (!FormUtils.hasValue(pd, 'WORK_EXPECTED_START_TIME')) { ToastUtil.showNormal(context, '请选择预计作业开始时间'); return; @@ -476,7 +475,8 @@ class _HoistworkApplyDetailState extends State { return; } - if (pd['IS_CONTRACTOR_WORK'] == '1' && !FormUtils.hasValue(pd, 'UNITS_ID')) { + if (pd['IS_CONTRACTOR_WORK'] == '1' && + !FormUtils.hasValue(pd, 'UNITS_ID')) { ToastUtil.showNormal(context, '请选择承包商'); return; } @@ -499,9 +499,9 @@ class _HoistworkApplyDetailState extends State { // LoadingDialogHelper.show(); String taskId = '0'; - if (pd['WORK_LEVEL'] == '1') { + if (pd['WORK_LEVEL'] == 1) { taskId = '10'; - } else if (pd['WORK_LEVEL'] == '2' || pd['WORK_LEVEL'] == '3') { + } else if (pd['WORK_LEVEL'] == 2 || pd['WORK_LEVEL'] == 3) { taskId = '11'; } pd['USER_ID'] = SessionService.instance.loginUserId; @@ -550,8 +550,10 @@ class _HoistworkApplyDetailState extends State { /// 初始化拉取数据 Future _getData() async { - - final data = await ApiService.getHomeworkFindById('hoisting', widget.HOISTING_ID); + final data = await ApiService.getHomeworkFindById( + 'hoisting', + widget.HOISTING_ID, + ); setState(() { pd = data['pd']; if (pd['STEP_ID'] == 0) { @@ -577,7 +579,8 @@ class _HoistworkApplyDetailState extends State { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('hoisting', + final data = await ApiService.listSignFinished( + 'hoisting', homework_id.length > 0 ? homework_id : widget.HOISTING_ID, ); setState(() { @@ -586,7 +589,8 @@ class _HoistworkApplyDetailState extends State { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('hoisting', + final data = await ApiService.listSignFinishMeasures( + 'hoisting', homework_id.length > 0 ? homework_id : widget.HOISTING_ID, ); setState(() { @@ -617,7 +621,7 @@ class _HoistworkApplyDetailState extends State { hightController: _hightController, relatedController: _relatedController, riskController: _riskController, - onChooseLevel: _chooseLevel, + onChooseLevel: () {}, // 新增 onChooseVideoManager: _chooseVideoManager, onContractorHandle: _chooseUnitManager, @@ -640,8 +644,6 @@ class _HoistworkApplyDetailState extends State { SizedBox(height: 15), _card(_chooseItem(EditUserType.WORK_USER)), SizedBox(height: 15), - _card(_chooseItem(EditUserType.CONFIRM)), - SizedBox(height: 15), _card(_chooseItem(EditUserType.PROJECT_MANAGER)), SizedBox(height: 15), _card(_chooseItem(EditUserType.LEADER)), @@ -703,7 +705,7 @@ class _HoistworkApplyDetailState extends State { color: Colors.white, child: MeasuresListWidget( measuresList: - measuresList, // List> + measuresList, // List> baseImgPath: ApiService.baseImgPath, isAllowEdit: false, ), @@ -731,45 +733,9 @@ class _HoistworkApplyDetailState extends State { ), isEditable ? Row( - spacing: 10, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: CustomButton( - height: 45, - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '提交', - backgroundColor: Colors.blue, - onPressed: () { - _submit('1'); - }, - ), - ), - - Expanded( - child: CustomButton( - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '暂存', - backgroundColor: Colors.green, - onPressed: () { - _submit('0'); - }, - ), - ), - ], - ) - : Column( - children: [ - SizedBox(height: 20), - Row( + spacing: 10, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox(width: 50), Expanded( child: CustomButton( height: 45, @@ -777,18 +743,54 @@ class _HoistworkApplyDetailState extends State { fontSize: 16, color: Colors.white, ), - text: '返回', - backgroundColor: Colors.green, + text: '提交', + backgroundColor: Colors.blue, onPressed: () { - Navigator.pop(context); + _submit('1'); }, ), ), - SizedBox(width: 50), + + Expanded( + child: CustomButton( + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '暂存', + backgroundColor: Colors.green, + onPressed: () { + _submit('0'); + }, + ), + ), + ], + ) + : Column( + children: [ + SizedBox(height: 20), + Row( + children: [ + SizedBox(width: 50), + Expanded( + child: CustomButton( + height: 45, + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '返回', + backgroundColor: Colors.green, + onPressed: () { + Navigator.pop(context); + }, + ), + ), + SizedBox(width: 50), + ], + ), ], ), - ], - ), ], ), ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/hoistwork_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/hoistwork_list_page.dart index a5e700f..39cf1c1 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/hoistwork_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/hoistwork_list_page.dart @@ -60,7 +60,6 @@ class _HoistworkListPageState extends State { @override void initState() { super.initState(); - _fetchSteps(); _fetchData(); _scrollController.addListener(_onScroll); } @@ -140,9 +139,11 @@ class _HoistworkListPageState extends State { } /// 申请 - void _handleApply() { + void _handleApply() async{ // 处理申请按钮点击逻辑 - pushPage(HoistworkApplyDetail(HOISTING_ID: '', flow: widget.flow), context); + await pushPage(HoistworkApplyDetail(HOISTING_ID: '', flow: widget.flow), context); + _fetchData(); + LoadingDialogHelper.hide(); } /// 打开流程图 @@ -201,9 +202,9 @@ class _HoistworkListPageState extends State { case '作业人签字': await pushPage(HoistworkZyrDetail(HOISTING_ID: item['HOISTING_ID'], flow: widget.flow), context); break; - case '作业负责人签字': - await pushPage(HoistworkZyfzDetail(HOISTING_ID: item['HOISTING_ID'], flow: widget.flow), context); - break; + // case '作业负责人签字': + // await pushPage(HoistworkZyfzDetail(HOISTING_ID: item['HOISTING_ID'], flow: widget.flow), context); + // break; case '吊装指挥人签字': await pushPage(HoistworkDzzhDetail(HOISTING_ID: item['HOISTING_ID'], flow: widget.flow), context); break; @@ -231,9 +232,10 @@ class _HoistworkListPageState extends State { default: break; } - LoadingDialogHelper.show(); - _fetchSteps(); - _fetchData(); + + + await _fetchData(); + LoadingDialogHelper.hide(); } Widget _buildFlowStepItem({ diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/jszy_work_detail/hoistwork_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/jszy_work_detail/hoistwork_jszy_detail.dart index 4e087be..0af99f9 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/jszy_work_detail/hoistwork_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/jszy_work_detail/hoistwork_jszy_detail.dart @@ -207,6 +207,7 @@ class _HoistworkJszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( +spacing: 12, children: [ // _setSafeDetailWidget(), SpecialWorkFormBaseWork( @@ -246,7 +247,6 @@ class _HoistworkJszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/kszy_work_detail/hoistwork_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/kszy_work_detail/hoistwork_kszy_detail.dart index 4324b2d..530bf56 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/kszy_work_detail/hoistwork_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/kszy_work_detail/hoistwork_kszy_detail.dart @@ -189,6 +189,7 @@ class _HoistworkKszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( + spacing: 12, children: [ // _setSafeDetailWidget(), SpecialWorkFormBaseWork( @@ -235,7 +236,6 @@ class _HoistworkKszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/ssr_work_detail/hoistwork_ssr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/ssr_work_detail/hoistwork_ssr_detail.dart index 458420f..9a4ae8f 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/ssr_work_detail/hoistwork_ssr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/ssr_work_detail/hoistwork_ssr_detail.dart @@ -186,6 +186,7 @@ class _HoistworkSsrDetailState extends State { /// 初始化拉取数据 Future _getData() async { + LoadingDialogHelper.show(); final data = await ApiService.getHomeworkFindById( 'hoisting', widget.HOISTING_ID, @@ -196,6 +197,7 @@ class _HoistworkSsrDetailState extends State { _getSigns(pd['HOISTING_ID'] ?? ''); _getMeasures(pd['HOISTING_ID'] ?? ''); }); + LoadingDialogHelper.hide(); } Future _getMeasures(String homework_id) async { diff --git a/lib/pages/home/tap/tabList/special_wrok/dz_work/szaq_work_detail/hoistwork_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/dz_work/szaq_work_detail/hoistwork_set_safe_detail.dart index ad5eac0..f04c7a5 100644 --- a/lib/pages/home/tap/tabList/special_wrok/dz_work/szaq_work_detail/hoistwork_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/dz_work/szaq_work_detail/hoistwork_set_safe_detail.dart @@ -359,7 +359,7 @@ class _HoistworkSetSafeDetailState extends State { } Future _getMeasures() async { - final data = await ApiService.listSignFinishAllMeasures('hoisting'); + final data = await ApiService.listSignFinishAllMeasures('hoisting', widget.HOISTING_ID); setState(() { measuresList = List>.from( data['measuresList'] ?? >[], diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/HighWorkDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/HighWorkDetailFormWidget.dart index 6727946..9234d6a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/HighWorkDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/HighWorkDetailFormWidget.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:qhd_prevention/customWidget/ItemWidgetFactory.dart'; import 'package:intl/intl.dart'; import 'package:qhd_prevention/customWidget/picker/CupertinoDatePicker.dart'; +import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import '../../../../../../tools/tools.dart'; import '../../../item_list_widget.dart'; import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/MeasuresListWidget.dart'; @@ -9,29 +10,40 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/MeasuresListW /// 通用高处作业明细表单组件(支持编辑/只读) class HighWorkDetailFormWidget extends StatefulWidget { final Map pd; + + /// 其他签字数据 + final Map signs; final bool isEditable; final VoidCallback onChooseLevel; -// 新增 -/// 选择摄像头 - final VoidCallback? onChooseVideoManager;/// 承包商 + + // 新增 + /// 选择摄像头 + final VoidCallback? onChooseVideoManager; + + /// 承包商 final VoidCallback? onContractorHandle; + /// 作业区域 final VoidCallback? onWorkAreaHandle; + /// 作业地点经纬度 final VoidCallback? onWorkAreaLocationHandle; /// 编辑模式下需提供以下控制器,非编辑模式可不传 final TextEditingController? locationController; // 地点 - final TextEditingController? hightController; // 高度 - final TextEditingController? contentController; // 内容、 + final TextEditingController? hightController; // 高度 + final TextEditingController? contentController; // 内容、 final TextEditingController? relatedController; final TextEditingController? riskController; const HighWorkDetailFormWidget({ Key? key, required this.pd, + required this.signs, + required this.isEditable, required this.onChooseLevel, + /// 新增 this.onChooseVideoManager, this.onContractorHandle, @@ -44,35 +56,42 @@ class HighWorkDetailFormWidget extends StatefulWidget { this.relatedController, this.riskController, }) : assert( - !isEditable || - (locationController != null && - hightController != null && - contentController != null && - relatedController != null && - riskController != null), - 'Editable mode requires all TextEditingController parameters', - ), - super(key: key); + !isEditable || + (locationController != null && + hightController != null && + contentController != null && + relatedController != null && + riskController != null), + 'Editable mode requires all TextEditingController parameters', + ), + super(key: key); @override - State createState() => _HighWorkDetailFormWidgetState(); + State createState() => + _HighWorkDetailFormWidgetState(); } class _HighWorkDetailFormWidgetState extends State { String _getWorkLevelText(dynamic level) { switch (level?.toString()) { - case '1': return 'I级高处作业'; - case '2': return 'II级高处作业'; - case '3': return 'III级高处作业'; - case '4': return 'IV级高处作业'; - default: return ''; + case '1': + return 'I级高处作业'; + case '2': + return 'II级高处作业'; + case '3': + return 'III级高处作业'; + case '4': + return 'IV级高处作业'; + default: + return ''; } } @override Widget build(BuildContext context) { if (FormUtils.hasValue(widget.pd, 'LATITUDE')) { - widget.pd['LATITUDE_LONGITUDE'] = '${widget.pd['LATITUDE']},${widget.pd['LONGITUDE']}'; //参数map + widget.pd['LATITUDE_LONGITUDE'] = + '${widget.pd['LATITUDE']},${widget.pd['LONGITUDE']}'; //参数map } final pd = widget.pd; @@ -98,11 +117,23 @@ class _HighWorkDetailFormWidgetState extends State { isEditable: false, text: pd['APPLY_DEPARTMENT_NAME'] ?? '', ), + const Divider(), + ItemListWidget.singleLineTitleText( label: '申请人:', isEditable: false, text: pd['APPLY_USER_NAME'] ?? '', ), + if (FormUtils.hasValue(pd, 'CREATTIME') && !widget.isEditable) ...[ + const Divider(), + ItemListWidget.singleLineTitleText( + label: '作业申请时间:', + isEditable: false, + text: pd['CREATTIME'] ?? '', + ), + ], + const Divider(), + ItemListWidget.singleLineTitleText( label: '作业地点:', isEditable: widget.isEditable, @@ -110,31 +141,76 @@ class _HighWorkDetailFormWidgetState extends State { text: pd['WORK_PLACE'] ?? '', ), const Divider(), - ItemListWidget.singleLineTitleText( - label: '作业高度(米):', - keyboardType: TextInputType.numberWithOptions( - decimal: true, // 允许小数点 - signed: false, // 允许负号(如需) - ), - isEditable: widget.isEditable, - controller: widget.hightController, - text: pd['WORK_HIGH'] ?? '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '高处作业级别:', - isEditable: widget.isEditable, - onTap: widget.onChooseLevel, - text: _getWorkLevelText(pd['WORK_LEVEL']), - ), - const Divider(), ItemListWidget.multiLineTitleTextField( label: '作业内容:', isEditable: widget.isEditable, controller: widget.contentController, text: pd['WORK_CONTENT'] ?? '', ), - + const Divider(), + ItemListWidget.singleLineTitleText( + label: '作业高度(米):', + keyboardType: TextInputType.numberWithOptions( + decimal: true, // 允许小数点 + signed: false, // 允许负号(如需) + ), + isEditable: widget.isEditable, + controller: widget.hightController, + text: pd['WORK_HIGH'] ?? '', + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '高处作业级别:', + isTip: true, + isEditable: false, + isRequired: true, + onTap: widget.onChooseLevel, + onTapTip: () { + presentOpaque( + SingleImageViewer(imageUrl: 'assets/images/highwork_tip.jpg'), + context, + ); + }, + text: _getWorkLevelText(pd['WORK_LEVEL']), + ), + if (FormUtils.hasValue(pd, 'CONFIRM_DEPARTMENT_NAME')) ...[ + const Divider(), + ItemListWidget.singleLineTitleText( + label: '作业单位:', + isEditable: false, + text: pd['CONFIRM_DEPARTMENT_NAME'] ?? '', + ), + ], + if (FormUtils.hasValue(pd, 'WORK_USER_USER_NAME') && + !widget.isEditable) ...[ + const Divider(), + SignRowImageTitle( + label: '作业人:', + signKey: 'WORK_USER', + signs: widget.signs, + text: pd['WORK_USER_USER_NAME'] ?? '', + ), + ], + if (FormUtils.hasValue(pd, 'GUARDIAN_USER_NAME') && + !widget.isEditable) ...[ + const Divider(), + SignRowImageTitle( + label: '监护人:', + signKey: 'GUARDIAN', + signs: widget.signs, + text: pd['GUARDIAN_USER_NAME'] ?? '', + ), + ], + if (FormUtils.hasValue(pd, 'CONFIRM_USER_NAME') && + !widget.isEditable) ...[ + const Divider(), + SignRowImageTitle( + label: '作业负责人:', + signKey: 'CONFIRM', + signs: widget.signs, + text: pd['CONFIRM_USER_NAME'] ?? '', + ), + ], const Divider(), ItemListWidget.twoRowButtonTitleText( label: '关联其他特殊作业及安全作业票编号', @@ -143,16 +219,17 @@ class _HighWorkDetailFormWidgetState extends State { onTap: () async { final val = await showDialog( context: context, - builder: (_) => SelectionPopup( - type: 'assignments', - initialValue: pd['SPECIAL_WORK'] ?? '', - onConfirm: (v) { - setState(() { - pd['SPECIAL_WORK'] = v; - widget.relatedController?.text = v; - }); - }, - ), + builder: + (_) => SelectionPopup( + type: 'assignments', + initialValue: pd['SPECIAL_WORK'] ?? '', + onConfirm: (v) { + setState(() { + pd['SPECIAL_WORK'] = v; + widget.relatedController?.text = v; + }); + }, + ), ); //FocusHelper.clearFocus(context); }, @@ -167,16 +244,17 @@ class _HighWorkDetailFormWidgetState extends State { onTap: () async { await showDialog( context: context, - builder: (_) => SelectionPopup( - type: 'identification', - initialValue: pd['RISK_IDENTIFICATION'] ?? '', - onConfirm: (v) { - setState(() { - pd['RISK_IDENTIFICATION'] = v; - widget.riskController?.text = v; - }); - }, - ), + builder: + (_) => SelectionPopup( + type: 'identification', + initialValue: pd['RISK_IDENTIFICATION'] ?? '', + onConfirm: (v) { + setState(() { + pd['RISK_IDENTIFICATION'] = v; + widget.riskController?.text = v; + }); + }, + ), ); //FocusHelper.clearFocus(context); }, @@ -185,6 +263,7 @@ class _HighWorkDetailFormWidgetState extends State { text: pd['RISK_IDENTIFICATION'] ?? '', ), const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( label: '作业视频监控:', isClean: widget.isEditable, @@ -200,55 +279,67 @@ class _HighWorkDetailFormWidgetState extends State { onTap: widget.onChooseVideoManager ?? () {}, text: pd['VIDEONAME'] ?? '', ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '预计作业开始时间:', - isEditable: widget.isEditable, - onTap: () async { - DateTime? picked = await BottomDateTimePicker.showDate( - mode: BottomPickerMode.dateTimeWithSeconds, - context, - allowFuture: true, - ); - if (picked != null) { - setState(() { - pd['WORK_EXPECTED_START_TIME'] = DateFormat( - 'yyyy-MM-dd HH:mm:ss', - ).format(picked); + if (FormUtils.hasValue(pd, 'WORK_START_DATE')) ...[ + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '作业实施时间:', + isEditable: widget.isEditable, + text: + FormUtils.hasValue(pd, 'WORK_END_DATE') + ? '${pd['WORK_START_DATE'] ?? ''}\n-${pd['WORK_END_DATE'] ?? ''}' + : pd['WORK_START_DATE'] ?? '', + ), + ] else ...[ + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '预计作业开始时间:', + isEditable: widget.isEditable, + onTap: () async { + DateTime? picked = await BottomDateTimePicker.showDate( + mode: BottomPickerMode.dateTimeWithSeconds, + context, + allowFuture: true, + ); + if (picked != null) { + setState(() { + pd['WORK_EXPECTED_START_TIME'] = DateFormat( + 'yyyy-MM-dd HH:mm:ss', + ).format(picked); - /// 开始时间必须早于结束时间 - if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') && - !isBeforeStr( - pd['WORK_EXPECTED_START_TIME'], - pd['WORK_EXPECTED_END_TIME'], - )) { - pd['WORK_EXPECTED_END_TIME'] = ''; - } - }); - } - }, - text: pd['WORK_EXPECTED_START_TIME'] ?? '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '预计作业结束时间:', - isEditable: widget.isEditable, - onTap: () async { - DateTime? picked = await BottomDateTimePicker.showDate( - context, - minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '', - allowFuture: true, - ); - if (picked != null) { - setState(() { - pd['WORK_EXPECTED_END_TIME'] = DateFormat( - 'yyyy-MM-dd HH:mm:ss', - ).format(picked); - }); - } - }, - text: pd['WORK_EXPECTED_END_TIME'] ?? '', - ), + /// 开始时间必须早于结束时间 + if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') && + !isBeforeStr( + pd['WORK_EXPECTED_START_TIME'], + pd['WORK_EXPECTED_END_TIME'], + )) { + pd['WORK_EXPECTED_END_TIME'] = ''; + } + }); + } + }, + text: pd['WORK_EXPECTED_START_TIME'] ?? '', + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '预计作业结束时间:', + isEditable: widget.isEditable, + onTap: () async { + DateTime? picked = await BottomDateTimePicker.showDate( + context, + minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '', + allowFuture: true, + ); + if (picked != null) { + setState(() { + pd['WORK_EXPECTED_END_TIME'] = DateFormat( + 'yyyy-MM-dd HH:mm:ss', + ).format(picked); + }); + } + }, + text: pd['WORK_EXPECTED_END_TIME'] ?? '', + ), + ], const Divider(), ListItemFactory.createYesNoSection( verticalPadding: 0, @@ -291,10 +382,11 @@ class _HighWorkDetailFormWidgetState extends State { isInput: false, isEditable: widget.isEditable, buttonText: '定位', - onTap: widget.onWorkAreaLocationHandle ?? (){}, + onTap: widget.onWorkAreaLocationHandle ?? () {}, hintText: '', text: pd['LATITUDE_LONGITUDE'] ?? (widget.isEditable ? '' : '无'), ), + ], ), ); diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/SpecialWorkFormBaseWork.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/SpecialWorkFormBaseWork.dart index 213d9bb..dee56bd 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/SpecialWorkFormBaseWork.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/SpecialWorkFormBaseWork.dart @@ -50,198 +50,6 @@ class HighWorkFormBaseWork extends StatelessWidget { child: child, ); } - - Widget signItemWidget( - String signKey, - String nameKey, - String name, - BuildContext context, - ) { - return _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 标题行 - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Row( - children: [ - Expanded(child: ListItemFactory.headerTitle(name)), - if (FormUtils.hasValue(pd, nameKey)) - Text( - pd[nameKey]?.toString() ?? '', - style: const TextStyle(fontSize: 16), - ), - ], - ), - ), - const SizedBox(height: 8), - - if (FormUtils.hasValue(signs, signKey)) - ...((signs[signKey] as List) - .cast>() - .map((item) { - // 解析 SIGN_PATH - List signPaths = []; - final rawSP = - FormUtils.hasValue(item, 'SIGN_PATH') - ? item['SIGN_PATH'] - : null; - if (rawSP is String && rawSP.isNotEmpty) { - signPaths = rawSP.split(',').map((s) => s.trim()).toList(); - } else if (rawSP is List) { - signPaths = rawSP.cast(); - } - - // 解析 SIGN_TIME 保留空格 - List signTimes = []; - final rawST = - FormUtils.hasValue(item, 'SIGN_TIME') - ? item['SIGN_TIME'] - : null; - if (rawST is String && rawST.isNotEmpty) { - signTimes = rawST.split(','); - } else if (rawST is List) { - signTimes = rawST.cast(); - } - - final pairCount = math.min( - signPaths.length, - signTimes.length, - ); - - // 解析 IMG_PATH, 最多 2 张 - List imgPaths = []; - final rawIP = - FormUtils.hasValue(item, 'IMG_PATH') - ? item['IMG_PATH'] - : null; - if (rawIP is String && rawIP.isNotEmpty) { - imgPaths = - rawIP.split(',').map((s) => s.trim()).take(2).toList(); - } else if (rawIP is List) { - imgPaths = rawIP.cast().take(2).toList(); - } - - return Padding( - padding: const EdgeInsets.symmetric( - vertical: 8.0, - horizontal: 10, - ), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (imgPaths.isNotEmpty) ...[ - Row( - children: - imgPaths.map((p) { - final fullUrl = '$baseImgPath$p'; - return GestureDetector( - onTap: - () => presentOpaque( - SingleImageViewer(imageUrl: fullUrl), - context, - ), - child: Padding( - padding: const EdgeInsets.only( - right: 8.0, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(2), - child: Image.network( - fullUrl, - width: 50, - height: 50, - fit: BoxFit.fill, - errorBuilder: - (_, __, ___) => const Icon( - Icons.broken_image, - size: 40, - ), - ), - ), - ), - ); - }).toList(), - ), - const SizedBox(height: 8), - ], - - // 签名及时间 - ...List.generate(pairCount, (index) { - final imgPath = signPaths[index]; - final timeLabel = signTimes[index]; - final fullUrl = '$baseImgPath$imgPath'; - const imageWidth = 200.0; - const imageHeight = 100.0; - - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - GestureDetector( - onTap: - () => presentOpaque( - SingleImageViewer( - imageUrl: fullUrl, - ), - context, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(4), - child: Image.network( - fullUrl, - width: imageWidth, - height: imageHeight, - fit: BoxFit.fill, - errorBuilder: - (_, __, ___) => const Icon( - Icons.broken_image, - size: 60, - ), - ), - ), - ), - const SizedBox(width: 12), - Expanded( - child: SizedBox( - height: imageHeight, - child: Align( - alignment: Alignment.bottomRight, - child: Text( - timeLabel, - style: const TextStyle( - fontSize: 14, - color: Colors.black87, - ), - ), - ), - ), - ), - ], - ), - if (index < pairCount - 1) - const Padding( - padding: EdgeInsets.only(top: 8.0), - child: Divider(height: 1), - ), - ], - ), - ); - }), - ], - ), - ); - }) - .toList()), - ], - ), - ); - } - @override Widget build(BuildContext context) { return Column( @@ -253,6 +61,7 @@ class HighWorkFormBaseWork extends StatelessWidget { pd: pd, isEditable: isEditable, onChooseLevel: onChooseLevel, + signs: signs, ), // 2. 安全防护措施 @@ -295,7 +104,7 @@ class HighWorkFormBaseWork extends StatelessWidget { baseImgPath: baseImgPath, sectionKey: 'GUARDIAN', nameKey: 'GUARDIAN_USER_NAME', - headerTitle: '监护人意见', + headerTitle: '监护人签字', roleTitle: '监护人', ), if (FormUtils.hasValue(signs, 'CONFESS')) @@ -338,13 +147,13 @@ class HighWorkFormBaseWork extends StatelessWidget { headerTitle: '所在单位负责人意见', roleTitle: '所在单位负责人', ), - if (FormUtils.hasValue(signs, 'AUDIT')) + if (FormUtils.hasValue(signs, 'REVIEWER')) ConfirmWithSignWidget( signs: signs, pd: pd, baseImgPath: baseImgPath, - sectionKey: 'AUDIT', - nameKey: 'AUDIT_USER_NAME', + sectionKey: 'REVIEWER', + nameKey: 'REVIEWER_USER_NAME', headerTitle: '审核部门意见', roleTitle: '审核部门负责人', ), diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/aqcs_work_detail/highwork_safe_func_sure.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/aqcs_work_detail/highwork_safe_func_sure.dart index d3f7293..c555953 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/aqcs_work_detail/highwork_safe_func_sure.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/aqcs_work_detail/highwork_safe_func_sure.dart @@ -441,6 +441,7 @@ class _HighworkSafeFuncSureState extends State { pd: pd, isEditable: false, onChooseLevel: () {}, + signs: {}, ), SizedBox(height: 20), _setSafeDetailWidget(), diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/gc_work_detai/highwork_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/gc_work_detai/highwork_apply_detail.dart index ed2ee0a..00df405 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/gc_work_detai/highwork_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/gc_work_detai/highwork_apply_detail.dart @@ -19,7 +19,6 @@ import 'package:intl/intl.dart'; import 'package:qhd_prevention/pages/home/tap/workArea_picker.dart'; import 'package:qhd_prevention/customWidget/BaiDuMap/Map_page.dart'; - enum EditUserType { GUARDIAN('监护人单位', '监护人', true), CONFESS('安全交底人单位', '安全交底人', true), @@ -57,7 +56,7 @@ class HighworkApplyDetail extends StatefulWidget { class _HighworkApplyDetailState extends State { late bool isEditable = false; - final levelList = ["I级高处作业", "II级高处作业", "III级高处作业","IV级高处作业"]; + final levelList = ["I级高处作业", "II级高处作业", "III级高处作业", "IV级高处作业"]; /// 编辑还是新增 late String msg = 'add'; @@ -66,13 +65,17 @@ class _HighworkApplyDetailState extends State { late Map pd = {}; late Map signs = {}; late List> measuresList = []; + /// ------------------- 新增 ------------------- /// 视频监控摄像 late List videoMonitoringList = []; + /// 承包商列表 late List unitAllList = []; + /// 作业区域列表 late List> workAreaList = []; + /// -------------------------------------- final TextEditingController _locationController = TextEditingController(); final TextEditingController _hightController = TextEditingController(); @@ -80,8 +83,6 @@ class _HighworkApplyDetailState extends State { final TextEditingController _relatedController = TextEditingController(); final TextEditingController _riskController = TextEditingController(); - - // 存储各单位的人员列表 final Map>> _personCache = {}; @@ -99,7 +100,6 @@ class _HighworkApplyDetailState extends State { pd['APPLY_USER_ID'] = SessionService.instance.loginUserId; pd['APPLY_USER_NAME'] = SessionService.instance.username; pd['IS_CONTRACTOR_WORK'] = '0'; - } _getVideoList(); @@ -115,6 +115,21 @@ class _HighworkApplyDetailState extends State { }); _hightController.addListener(() { pd['WORK_HIGH'] = _hightController.text.trim(); + setState(() { + double height = double.parse(pd['WORK_HIGH']); + int level = 0; + if (height >= 2.0 && height <= 5.0) { + level = 1; + }else if (height >= 5.0 && height <= 15.0) { + level = 2; + }else if (height >= 15.0 && height <= 30.0) { + level = 3; + }else{ + level = 4; + } + pd['WORK_LEVEL'] = level; + pd['WORK_LEVEL_NAME'] = levelList[level-1].toString(); + }); }); _relatedController.addListener(() { pd['SPECIAL_WORK'] = _relatedController.text.trim(); @@ -123,15 +138,16 @@ class _HighworkApplyDetailState extends State { pd['RISK_IDENTIFICATION'] = _riskController.text.trim(); }); } + /// ---------------------------- 新增 -------------------------------- /// 视频监控摄像头 Future _chooseVideoManager() async { final choice = await BottomPicker.show( context, items: - videoMonitoringList - .map((item) => item['VIDEONAME'] as String) - .toList(), + videoMonitoringList + .map((item) => item['VIDEONAME'] as String) + .toList(), itemBuilder: (item) => Text(item, textAlign: TextAlign.center), initialIndex: 0, ); @@ -140,7 +156,7 @@ class _HighworkApplyDetailState extends State { pd['VIDEONAME'] = choice; Map result = videoMonitoringList.firstWhere( - (item) => item['VIDEONAME'] == choice, + (item) => item['VIDEONAME'] == choice, orElse: () => {}, // 避免找不到时报错 ); if (FormUtils.hasValue(result, 'VIDEOMANAGER_ID')) { @@ -150,6 +166,7 @@ class _HighworkApplyDetailState extends State { }); } } + /// 选择承包商 Future _chooseUnitManager() async { final choice = await BottomPicker.show( @@ -163,7 +180,7 @@ class _HighworkApplyDetailState extends State { pd['UNITS_NAME'] = choice; Map result = unitAllList.firstWhere( - (item) => item['UNITS_NAME'] == choice, + (item) => item['UNITS_NAME'] == choice, orElse: () => {}, // 避免找不到时报错 ); if (FormUtils.hasValue(result, 'UNITS_ID')) { @@ -173,10 +190,9 @@ class _HighworkApplyDetailState extends State { }); } } - - + /// 选择经纬度 - Future _showLocationHandle() async{ + Future _showLocationHandle() async { if (!FormUtils.hasValue(pd, 'ELECTRONIC_FENCE_AREA_ID')) { ToastUtil.showNormal(context, '请选择作业区域'); return; @@ -185,10 +201,11 @@ class _HighworkApplyDetailState extends State { setState(() { pd['LONGITUDE'] = mapData['longitue'] ?? ''; pd['LATITUDE'] = mapData['latitude'] ?? ''; - pd['LATITUDE_LONGITUDE'] = '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; + pd['LATITUDE_LONGITUDE'] = + '${mapData['longitue'] ?? ''},${mapData['latitude'] ?? ''}'; }); - } + /// 作业区域 Future _getWorkArea() async { //FocusHelper.clearFocus(context); @@ -199,16 +216,19 @@ class _HighworkApplyDetailState extends State { backgroundColor: Colors.transparent, builder: (_) => WorkAreaPicker( - onSelected: (String id, String POSITIONS, String name) { - pd['ELECTRONIC_FENCE_AREA_ID'] = id; - pd['POSITIONS'] = POSITIONS; - pd['PLS_NAME'] = name; - }, - ), + onSelected: (String id, String POSITIONS, String name) { + setState(() { + pd['ELECTRONIC_FENCE_AREA_ID'] = id; + pd['POSITIONS'] = POSITIONS; + pd['PLS_NAME'] = name; + }); + }, + ), ).then((_) { //FocusHelper.clearFocus(context); }); } + /// 获取摄像头列表 Future _getVideoList() async { final result = await ApiService.getVideomanagerList(); @@ -216,6 +236,7 @@ class _HighworkApplyDetailState extends State { videoMonitoringList = result['varList'] ?? []; }); } + /// 获承包商列表 Future _getUnitListAll() async { final result = await ApiService.getUnitListAll(); @@ -223,6 +244,7 @@ class _HighworkApplyDetailState extends State { unitAllList = result['varList'] ?? []; }); } + /// 作业区域列表 Future _getPlsList() async { final result = await ApiService.getWorkAreaList(); @@ -231,6 +253,7 @@ class _HighworkApplyDetailState extends State { workAreaList = jsonDecode(zTreeNodes); }); } + /// ------------------------------------------------------------ void set_pd_DEPARTMENT_ID(EditUserType type, String id) { pd['${type.name}_DEPARTMENT_ID'] = id; @@ -243,7 +266,7 @@ class _HighworkApplyDetailState extends State { void set_pd_USER_ID(EditUserType type, String id) { if (type == EditUserType.WORK_USER) { pd['${type.name}_ID'] = id; - }else{ + } else { pd['${type.name}_USER_ID'] = id; } } @@ -263,7 +286,7 @@ class _HighworkApplyDetailState extends State { String get_pd_USER_ID(EditUserType type) { if (type == EditUserType.WORK_USER) { return pd['${type.name}_ID'] ?? ''; - }else{ + } else { return pd['${type.name}_USER_ID'] ?? ''; } } @@ -303,15 +326,13 @@ class _HighworkApplyDetailState extends State { Widget _chooseItem(EditUserType type) { bool isClean = false; bool isRequird = true; - if (pd['WORK_LEVEL'] == '1' && type == EditUserType.AUDIT) { + if (pd['WORK_LEVEL'] == 1 && type == EditUserType.AUDIT) { isRequird = false; isClean = true; - } - if (pd['WORK_LEVEL'] != '4' && type == EditUserType.APPROVE) { + if (pd['WORK_LEVEL'] != 4 && type == EditUserType.APPROVE) { isRequird = false; isClean = true; - } return Column( @@ -390,13 +411,15 @@ class _HighworkApplyDetailState extends State { return; } - if (personList.isEmpty) { // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 + if (personList.isEmpty) { + // 一般这种情况是因为重新编辑没有缓存对应部门的负责人,所以先拉取一下接口 await _getPersonListForUnitId(unitId, type); final list = _personCache[type] ?? []; - if (list.isEmpty) { // 如果还是没数据,说明该部门没有可选的人 + if (list.isEmpty) { + // 如果还是没数据,说明该部门没有可选的人 ToastUtil.showNormal(context, '暂无数据,请选择其他单位'); - }else{ + } else { choosePersonHandle(type); } return; @@ -434,8 +457,6 @@ class _HighworkApplyDetailState extends State { // }, {'value': _riskController.text.trim(), 'message': '请填写风险辨识结果'}, ]; - final level = pd['WORK_LEVEL'] ?? ''; - print('---level-$level'); /// 各项负责人校验 final unitRules = [ @@ -444,10 +465,8 @@ class _HighworkApplyDetailState extends State { EditUserType.ACCEPT_CONFESS, EditUserType.CONFIRM, EditUserType.LEADER, - if (pd['WORK_LEVEL'] != '1') - EditUserType.AUDIT, - if (pd['WORK_LEVEL'] == '4') - EditUserType.APPROVE, + if (pd['WORK_LEVEL'] != 1) EditUserType.AUDIT, + if (pd['WORK_LEVEL'] == 4) EditUserType.APPROVE, EditUserType.WORK_USER, EditUserType.WORK_START, EditUserType.WORK_END, @@ -461,11 +480,7 @@ class _HighworkApplyDetailState extends State { return; } } - // 级别校验 - if (level.length == 0) { - ToastUtil.showNormal(context, '请输入高处作业级别'); - return; - } + if (!FormUtils.hasValue(pd, 'WORK_EXPECTED_START_TIME')) { ToastUtil.showNormal(context, '请选择预计作业开始时间'); return; @@ -475,7 +490,8 @@ class _HighworkApplyDetailState extends State { return; } - if (pd['IS_CONTRACTOR_WORK'] == '1' && !FormUtils.hasValue(pd, 'UNITS_ID')) { + if (pd['IS_CONTRACTOR_WORK'] == '1' && + !FormUtils.hasValue(pd, 'UNITS_ID')) { ToastUtil.showNormal(context, '请选择承包商'); return; } @@ -494,15 +510,16 @@ class _HighworkApplyDetailState extends State { return; } } + } // LoadingDialogHelper.show(); String taskId = '0'; - if (pd['WORK_LEVEL'] == '1') { + if (pd['WORK_LEVEL'] == 1) { taskId = '5'; - } else if (pd['WORK_LEVEL'] == '2' || pd['WORK_LEVEL'] == '3') { + } else if (pd['WORK_LEVEL'] == 2 || pd['WORK_LEVEL'] == 3) { taskId = '6'; - } else if (pd['WORK_LEVEL'] == '4') { + } else if (pd['WORK_LEVEL'] == 4) { taskId = '7'; } pd['USER_ID'] = SessionService.instance.loginUserId ?? ''; @@ -550,12 +567,12 @@ class _HighworkApplyDetailState extends State { } } - - /// 初始化拉取数据 Future _getData() async { - - final data = await ApiService.getHomeworkFindById('highwork', widget.HIGHWORK_ID); + final data = await ApiService.getHomeworkFindById( + 'highwork', + widget.HIGHWORK_ID, + ); setState(() { pd = data['pd']; if (pd['STEP_ID'] == 0) { @@ -581,7 +598,8 @@ class _HighworkApplyDetailState extends State { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('highwork', + final data = await ApiService.listSignFinished( + 'highwork', homework_id.length > 0 ? homework_id : widget.HIGHWORK_ID, ); setState(() { @@ -590,7 +608,8 @@ class _HighworkApplyDetailState extends State { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('highwork', + final data = await ApiService.listSignFinishMeasures( + 'highwork', homework_id.length > 0 ? homework_id : widget.HIGHWORK_ID, ); setState(() { @@ -625,12 +644,12 @@ class _HighworkApplyDetailState extends State { onContractorHandle: _chooseUnitManager, onWorkAreaHandle: _getWorkArea, onWorkAreaLocationHandle: _showLocationHandle, + signs: {}, ), ), if (isEditable) Column( children: [ - SizedBox(height: 15), _card(_chooseItem(EditUserType.GUARDIAN)), SizedBox(height: 15), @@ -701,7 +720,7 @@ class _HighworkApplyDetailState extends State { color: Colors.white, child: MeasuresListWidget( measuresList: - measuresList, // List> + measuresList, // List> baseImgPath: ApiService.baseImgPath, isAllowEdit: false, ), @@ -729,45 +748,9 @@ class _HighworkApplyDetailState extends State { ), isEditable ? Row( - spacing: 10, - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - Expanded( - child: CustomButton( - height: 45, - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '提交', - backgroundColor: Colors.blue, - onPressed: () { - _submit('1'); - }, - ), - ), - - Expanded( - child: CustomButton( - textStyle: TextStyle( - fontSize: 16, - color: Colors.white, - ), - text: '暂存', - backgroundColor: Colors.green, - onPressed: () { - _submit('0'); - }, - ), - ), - ], - ) - : Column( - children: [ - SizedBox(height: 20), - Row( + spacing: 10, + mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - SizedBox(width: 50), Expanded( child: CustomButton( height: 45, @@ -775,18 +758,54 @@ class _HighworkApplyDetailState extends State { fontSize: 16, color: Colors.white, ), - text: '返回', - backgroundColor: Colors.green, + text: '提交', + backgroundColor: Colors.blue, onPressed: () { - Navigator.pop(context); + _submit('1'); }, ), ), - SizedBox(width: 50), + + Expanded( + child: CustomButton( + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '暂存', + backgroundColor: Colors.green, + onPressed: () { + _submit('0'); + }, + ), + ), + ], + ) + : Column( + children: [ + SizedBox(height: 20), + Row( + children: [ + SizedBox(width: 50), + Expanded( + child: CustomButton( + height: 45, + textStyle: TextStyle( + fontSize: 16, + color: Colors.white, + ), + text: '返回', + backgroundColor: Colors.green, + onPressed: () { + Navigator.pop(context); + }, + ), + ), + SizedBox(width: 50), + ], + ), ], ), - ], - ), ], ), ), diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/highwork_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/highwork_list_page.dart index 78d2219..4ff5e9c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/highwork_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/highwork_list_page.dart @@ -58,7 +58,6 @@ class _HighworkListPageState extends State { @override void initState() { super.initState(); - _fetchSteps(); _fetchData(); _scrollController.addListener(_onScroll); } @@ -139,9 +138,11 @@ class _HighworkListPageState extends State { } /// 申请 - void _handleApply() { + void _handleApply() async{ // 处理申请按钮点击逻辑 - pushPage(HighworkApplyDetail(HIGHWORK_ID: '', flow: widget.flow), context); + await pushPage(HighworkApplyDetail(HIGHWORK_ID: '', flow: widget.flow), context); + _fetchData(); + LoadingDialogHelper.hide(); } /// 打开流程图 @@ -228,9 +229,10 @@ class _HighworkListPageState extends State { default: break; } - LoadingDialogHelper.show(); - _fetchSteps(); - _fetchData(); + + + await _fetchData(); + LoadingDialogHelper.hide(); } Widget _buildFlowStepItem({ diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/jhr_work_detail/highwork_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/jhr_work_detail/highwork_jhr_detail.dart index 85b0cdc..cddde84 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/jhr_work_detail/highwork_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/jhr_work_detail/highwork_jhr_detail.dart @@ -329,6 +329,7 @@ class _HighworkJhrDetailState extends State { pd: pd, isEditable: false, onChooseLevel: () {}, + signs: signs, ), SizedBox(height: 20), _setSafeDetailWidget(), diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/jszy_work_detail/highwork_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/jszy_work_detail/highwork_jszy_detail.dart index 7800b93..f7bbfb4 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/jszy_work_detail/highwork_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/jszy_work_detail/highwork_jszy_detail.dart @@ -207,6 +207,7 @@ class _HighworkJszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( +spacing: 12, children: [ // _setSafeDetailWidget(), HighWorkFormBaseWork( @@ -246,7 +247,6 @@ class _HighworkJszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/kszy_work_detail/highwork_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/kszy_work_detail/highwork_kszy_detail.dart index 38614d0..c65155d 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/kszy_work_detail/highwork_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/kszy_work_detail/highwork_kszy_detail.dart @@ -190,6 +190,7 @@ class _HighworkKszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( + spacing: 12, children: [ // _setSafeDetailWidget(), HighWorkFormBaseWork( @@ -236,7 +237,6 @@ class _HighworkKszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/shbm_work_detail/highwork_shbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/shbm_work_detail/highwork_shbm_detail.dart index 07a8bc6..017503f 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/shbm_work_detail/highwork_shbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/shbm_work_detail/highwork_shbm_detail.dart @@ -13,7 +13,7 @@ import 'package:qhd_prevention/http/ApiService.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; import 'package:qhd_prevention/pages/my_appbar.dart'; -/// 安全管理部门意见 +/// 审核部门意见 class HighworkShbmDetail extends StatefulWidget { const HighworkShbmDetail({ super.key, diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/spbm_work_detail/highwork_spbm_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/spbm_work_detail/highwork_spbm_detail.dart index 90a71b0..5276f57 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/spbm_work_detail/highwork_spbm_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/spbm_work_detail/highwork_spbm_detail.dart @@ -31,14 +31,8 @@ class HighworkSpbmDetail extends StatefulWidget { class _HighworkSpbmDetailState extends State { late bool isEditable = false; - /// 详情 - late Map pd = {}; final TextEditingController _contentController = TextEditingController(); - - /// 安全防护措施列表 - late List> measuresList = []; - late Map signs = {}; - + List signImages = []; List signTimes = []; // 签字时间列表 @override @@ -46,7 +40,70 @@ class _HighworkSpbmDetailState extends State { super.initState(); _getData(); } + late Map pd = {}; + late Map signs = {}; + late List> measuresList = []; + /// 初始化拉取数据(并行获取 pd / signs / measures,最后一次 setState) + Future _getData() async { + LoadingDialogHelper.show(); + + try { + // 并行发起三个请求,并在出错时返回安全的默认值(避免 Future.wait 因一个失败而中断) + final futurePd = ApiService.getHomeworkFindById('highwork', widget.HIGHWORK_ID) + .catchError((e) { + // 可加入日志记录 e + return {}; // 回退为空 map + }); + + final futureSigns = ApiService.listSignFinished('highwork', widget.HIGHWORK_ID) + .catchError((e) { + return {'signs': {}}; + }); + + final futureMeasures = ApiService.listSignFinishMeasures('highwork', widget.HIGHWORK_ID) + .catchError((e) { + return {'finishMeasuresList': >[]}; + }); + + final results = await Future.wait([futurePd, futureSigns, futureMeasures]); + + final pdResult = results[0] as Map? ?? {}; + final signsResult = results[1] as Map? ?? {}; + final measuresResult = results[2] as Map? ?? {}; + + // 从各自的结果里提取需要的字段,使用默认值以防字段缺失或类型不对 + final newPd = (pdResult['pd'] is Map) + ? Map.from(pdResult['pd']) + : {}; + + final newSigns = (signsResult['signs'] is Map) + ? Map.from(signsResult['signs']) + : {}; + + final newMeasuresList = >[]; + final rawMeasures = measuresResult['finishMeasuresList']; + if (rawMeasures is List) { + for (final m in rawMeasures) { + if (m is Map) { + newMeasuresList.add(Map.from(m)); + } + } + } + + if (!mounted) return; + + setState(() { + pd = newPd; + signs = newSigns; + measuresList = newMeasuresList; + }); + } catch (e, st) { + debugPrint('[_getData] 未捕获异常: $e\n$st'); + } finally { + LoadingDialogHelper.hide(); + } + } /// 签字 Future _sign() async { await NativeOrientation.setLandscape(); @@ -190,42 +247,6 @@ class _HighworkSpbmDetailState extends State { } } - /// 初始化拉取数据 - Future _getData() async { - final data = await ApiService.getHomeworkFindById( - 'highwork', - widget.HIGHWORK_ID, - ); - setState(() { - pd = data['pd']; - - _getSigns(pd['HIGHWORK_ID'] ?? ''); - _getMeasures(pd['HIGHWORK_ID'] ?? ''); - }); - } - - Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures( - 'highwork', - homework_id.length > 0 ? homework_id : widget.HIGHWORK_ID, - ); - setState(() { - measuresList = List>.from( - data['finishMeasuresList'] ?? >[], - ); - }); - } - - Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished( - 'highwork', - homework_id.length > 0 ? homework_id : widget.HIGHWORK_ID, - ); - setState(() { - signs = data['signs'] ?? {}; - }); - } - /// 底部按钮 Widget _bottomButtons() { return Row( diff --git a/lib/pages/home/tap/tabList/special_wrok/gc_work/szaq_work_detail/highwork_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/gc_work/szaq_work_detail/highwork_set_safe_detail.dart index 090590c..00a587a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/gc_work/szaq_work_detail/highwork_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/gc_work/szaq_work_detail/highwork_set_safe_detail.dart @@ -67,7 +67,7 @@ class _HighworkSetSafeDetailState extends State { return {'signs': {}}; }); - final futureMeasures = ApiService.listSignFinishAllMeasures('highwork') + final futureMeasures = ApiService.listSignFinishAllMeasures('highwork', widget.HIGHWORK_ID) .catchError((e) { return {'measuresList': >[]}; }); @@ -597,6 +597,7 @@ class _HighworkSetSafeDetailState extends State { pd: pd, isEditable: false, onChooseLevel: () {}, + signs: signs, ), SizedBox(height: 20), _setSafeDetailWidget(), diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart index 8f9b667..c89d849 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ElectricityDetailFormWidget.dart @@ -9,6 +9,8 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/MeasuresListW /// 通用明细表单组件(支持编辑/只读) class ElectricityDetailFormWidget extends StatefulWidget { final Map pd; + final Map signs; + final bool isEditable; final VoidCallback onChooseLevel; final VoidCallback onChooseHotworkUser; @@ -38,6 +40,7 @@ class ElectricityDetailFormWidget extends StatefulWidget { required this.onChooseLevel, required this.onChooseHotworkUser, required this.onAnalyzeTap, + required this.signs, /// 新增 this.onChooseVideoManager, @@ -86,6 +89,13 @@ class _ElectricityDetailFormWidgetState extends State { context, ); }, + signs: {}, ), SizedBox(height: 20), _setSafeDetailWidget(), diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/electricity_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/electricity_list_page.dart index d5c74f9..751fa33 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/electricity_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/electricity_list_page.dart @@ -58,7 +58,6 @@ class _ElectricityListPageState extends State { @override void initState() { super.initState(); - _fetchSteps(); _fetchData(); _scrollController.addListener(_onScroll); } @@ -137,12 +136,14 @@ class _ElectricityListPageState extends State { } /// 申请 - void _handleApply() { + void _handleApply() async{ // 处理申请按钮点击逻辑 - pushPage( + await pushPage( ElectricityApplyDetail(ELECTRICITY_ID: '', flow: widget.flow), context, ); + _fetchData(); + LoadingDialogHelper.hide(); } /// 打开流程图 @@ -317,9 +318,10 @@ class _ElectricityListPageState extends State { default: break; } - LoadingDialogHelper.show(); - _fetchSteps(); - _fetchData(); + + + await _fetchData(); + LoadingDialogHelper.hide(); } Widget _buildFlowStepItem({ diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jhr_work_detail/electricity_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jhr_work_detail/electricity_jhr_detail.dart index 2a6dd86..bd1a7a2 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jhr_work_detail/electricity_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jhr_work_detail/electricity_jhr_detail.dart @@ -334,6 +334,7 @@ class _ElectricityJhrDetailState extends State { context, ); }, + signs: {}, ), SizedBox(height: 20), _setSafeDetailWidget(), diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jszy_work_detail/electricity_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jszy_work_detail/electricity_jszy_detail.dart index 94bd87b..57ff8ec 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jszy_work_detail/electricity_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/jszy_work_detail/electricity_jszy_detail.dart @@ -207,6 +207,7 @@ class _ElectricityJszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( +spacing: 12, children: [ // _setSafeDetailWidget(), SpecialWorkFormBaseWork( @@ -253,7 +254,6 @@ class _ElectricityJszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/kszy_work_detail/electricity_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/kszy_work_detail/electricity_kszy_detail.dart index 5e3888f..c6b8c85 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/kszy_work_detail/electricity_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/kszy_work_detail/electricity_kszy_detail.dart @@ -201,6 +201,7 @@ class _ElectricityKszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( + spacing: 12, children: [ // _setSafeDetailWidget(), SpecialWorkFormBaseWork( @@ -246,7 +247,6 @@ class _ElectricityKszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/lsyd_work_detai/electricity_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/lsyd_work_detai/electricity_apply_detail.dart index bb2c0a9..54ef6a6 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/lsyd_work_detai/electricity_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/lsyd_work_detai/electricity_apply_detail.dart @@ -218,9 +218,12 @@ class _ElectricityApplyDetailState extends State { builder: (_) => WorkAreaPicker( onSelected: (String id, String POSITIONS, String name) { - pd['ELECTRONIC_FENCE_AREA_ID'] = id; - pd['POSITIONS'] = POSITIONS; - pd['PLS_NAME'] = name; + setState(() { + pd['ELECTRONIC_FENCE_AREA_ID'] = id; + pd['POSITIONS'] = POSITIONS; + pd['PLS_NAME'] = name; + }); + }, ), ).then((_) { @@ -635,6 +638,7 @@ class _ElectricityApplyDetailState extends State { context, ); }, + signs: {}, // 新增 onChooseVideoManager: _chooseVideoManager, onContractorHandle: _chooseUnitManager, diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/electricity_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/electricity_set_safe_detail.dart index 3b530a1..c3d1c7c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/electricity_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/szaq_work_detail/electricity_set_safe_detail.dart @@ -348,7 +348,7 @@ class _ElectricitySetSafeDetailState extends State { } Future _getMeasures() async { - final data = await ApiService.listSignFinishAllMeasures('electricity'); + final data = await ApiService.listSignFinishAllMeasures('electricity', widget.ELECTRICITY_ID); setState(() { measuresList = List>.from( data['measuresList'] ?? >[], @@ -568,6 +568,7 @@ class _ElectricitySetSafeDetailState extends State { context, ); }, + signs: {}, ), SizedBox(height: 20), _setSafeDetailWidget(), diff --git a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart index 560f86e..e631061 100644 --- a/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/lsyd_work/ydr_work_detail/electricity_ydr_detail.dart @@ -12,6 +12,7 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/lsyd_work/Spe import 'package:qhd_prevention/customWidget/custom_alert_dialog.dart'; import 'package:qhd_prevention/customWidget/single_image_viewer.dart'; import 'package:qhd_prevention/pages/mine/mine_sign_page.dart'; + /// 用电人签字 class ElectricityYdrDetail extends StatefulWidget { const ElectricityYdrDetail({ @@ -29,13 +30,14 @@ class ElectricityYdrDetail extends StatefulWidget { class _ElectricityYdrDetailState extends State { late bool isEditable = false; + /// 详情 late Map pd = {}; + /// 安全防护措施列表 late List> measuresList = []; late Map signs = {}; - List imagePaths = []; List signTimes = []; // 签字时间列表 @override @@ -52,7 +54,7 @@ class _ElectricityYdrDetailState extends State { MaterialPageRoute(builder: (context) => MineSignPage()), ); await NativeOrientation.setPortrait(); -if (path != null) { + if (path != null) { final now = DateFormat('yyyy-MM-dd HH:mm').format(DateTime.now()); setState(() { imagePaths.add(path); @@ -134,7 +136,7 @@ if (path != null) { title: '作废原因', hintText: '请输入作废原因', cancelText: '取消', - confirmText: '确定' + confirmText: '确定', ); if (reasonText.isEmpty) { ToastUtil.showNormal(context, '请填写作废原因'); @@ -159,32 +161,31 @@ if (path != null) { barrierDismissible: false, ); if (confirmed) { - LoadingDialogHelper.show(); - try { - final result = await ApiService.saveSafeFunctionSure( -'electricity', - formData, - imagePaths, - ); - LoadingDialogHelper.hide(); - if (result['result'] == 'success') { - ToastUtil.showSuccess( - context, - '保存成功', - ); - Navigator.of(context).pop(true); - } - } catch (e) { - LoadingDialogHelper.hide(); - ToastUtil.showNormal(context, '操作失败:$e'); - } - + LoadingDialogHelper.show(); + try { + final result = await ApiService.saveSafeFunctionSure( + 'electricity', + formData, + imagePaths, + ); + LoadingDialogHelper.hide(); + if (result['result'] == 'success') { + ToastUtil.showSuccess(context, '保存成功'); + Navigator.of(context).pop(true); + } + } catch (e) { + LoadingDialogHelper.hide(); + ToastUtil.showNormal(context, '操作失败:$e'); + } } } /// 初始化拉取数据 Future _getData() async { - final data = await ApiService.getHomeworkFindById('electricity', widget.ELECTRICITY_ID); + final data = await ApiService.getHomeworkFindById( + 'electricity', + widget.ELECTRICITY_ID, + ); setState(() { pd = data['pd']; @@ -194,7 +195,8 @@ if (path != null) { } Future _getMeasures(String homework_id) async { - final data = await ApiService.listSignFinishMeasures('electricity', + final data = await ApiService.listSignFinishMeasures( + 'electricity', homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID, ); setState(() { @@ -205,7 +207,8 @@ if (path != null) { } Future _getSigns(String homework_id) async { - final data = await ApiService.listSignFinished('electricity', + final data = await ApiService.listSignFinished( + 'electricity', homework_id.length > 0 ? homework_id : widget.ELECTRICITY_ID, ); setState(() { diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardDetailFormWidget.dart index 7cc1655..7fb8d9f 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/BlindboardDetailFormWidget.dart @@ -490,7 +490,10 @@ class _BlindboardDetailFormWidgetState ItemListWidget.selectableLineTitleTextRightButton( label: '盲板作业实施时间:', isEditable: widget.isEditable, - text: pd['WORK_START_DATE'] ?? '', + text: + FormUtils.hasValue(pd, 'WORK_END_DATE') + ? '${pd['WORK_START_DATE'] ?? ''}\n-${pd['WORK_END_DATE'] ?? ''}' + : pd['WORK_START_DATE'] ?? '', ), ] else ...[ const Divider(), @@ -543,9 +546,8 @@ class _BlindboardDetailFormWidgetState text: pd['WORK_EXPECTED_END_TIME'] ?? '', ), ], - if (!widget.isEditable && - FormUtils.hasValue(pd, 'BOARD_PATH_NO')) - ConfirmWithSignWidget( + if (!widget.isEditable && FormUtils.hasValue(pd, 'BOARD_PATH_NO')) + ConfirmWithSignWidget( signs: widget.signs, pd: pd, baseImgPath: ApiService.baseImgPath, @@ -557,17 +559,35 @@ class _BlindboardDetailFormWidgetState roleTitle: '', ), - if (FormUtils.hasValue(pd, 'CONFIRM_USER_NAME') && !widget.isEditable) ...[ + if (FormUtils.hasValue(pd, 'CONFIRM_USER_NAME') && + !widget.isEditable) ...[ const Divider(), - SignRowImageTitle(label: '作业负责人:', signKey: 'CONFIRM', signs: widget.signs, text: pd['CONFIRM_USER_NAME']??'',), + SignRowImageTitle( + label: '作业负责人:', + signKey: 'CONFIRM', + signs: widget.signs, + text: pd['CONFIRM_USER_NAME'] ?? '', + ), ], - if (FormUtils.hasValue(pd, 'WORK_USER_USER_NAME') && !widget.isEditable) ...[ + if (FormUtils.hasValue(pd, 'WORK_USER_USER_NAME') && + !widget.isEditable) ...[ const Divider(), - SignRowImageTitle(label: '作业人:', signKey: 'WORK_USER', signs: widget.signs, text: pd['WORK_USER_USER_NAME']??'',), + SignRowImageTitle( + label: '作业人:', + signKey: 'WORK_USER', + signs: widget.signs, + text: pd['WORK_USER_USER_NAME'] ?? '', + ), ], - if (FormUtils.hasValue(pd, 'GUARDIAN_USER_NAME') && !widget.isEditable) ...[ + if (FormUtils.hasValue(pd, 'GUARDIAN_USER_NAME') && + !widget.isEditable) ...[ const Divider(), - SignRowImageTitle(label: '监护人:', signKey: 'GUARDIAN', signs: widget.signs, text: pd['GUARDIAN_USER_NAME']??'',), + SignRowImageTitle( + label: '监护人:', + signKey: 'GUARDIAN', + signs: widget.signs, + text: pd['GUARDIAN_USER_NAME'] ?? '', + ), ], const Divider(), diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/blindboard_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/blindboard_list_page.dart index 008728d..7a84870 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/blindboard_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/blindboard_list_page.dart @@ -142,9 +142,11 @@ class _BlindboardListPageState extends State { } /// 申请 - void _handleApply() { + void _handleApply() async{ // 处理申请按钮点击逻辑 - pushPage(BlindboardApplyDetail(BLINDBOARD_ID: '', flow: widget.flow), context); + await pushPage(BlindboardApplyDetail(BLINDBOARD_ID: '', flow: widget.flow), context); + _fetchData(); + LoadingDialogHelper.hide(); } /// 打开流程图 @@ -228,9 +230,10 @@ class _BlindboardListPageState extends State { default: break; } - LoadingDialogHelper.show(); - _fetchSteps(); - _fetchData(); + + + await _fetchData(); + LoadingDialogHelper.hide(); } Widget _buildFlowStepItem({ diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jszy_work_detail/blindboard_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jszy_work_detail/blindboard_jszy_detail.dart index 48f88e5..6eda906 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jszy_work_detail/blindboard_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/jszy_work_detail/blindboard_jszy_detail.dart @@ -208,6 +208,7 @@ class _BlindboardJszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( +spacing: 12, children: [ // _setSafeDetailWidget(), BlindboardFormBaseWork( @@ -248,7 +249,6 @@ class _BlindboardJszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/kszy_work_detail/blindboard_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/kszy_work_detail/blindboard_kszy_detail.dart index 9129d76..a9b773b 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/kszy_work_detail/blindboard_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/kszy_work_detail/blindboard_kszy_detail.dart @@ -192,6 +192,7 @@ class _BlindboardKszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( + spacing: 12, children: [ // _setSafeDetailWidget(), BlindboardFormBaseWork( @@ -238,7 +239,6 @@ class _BlindboardKszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/mbcd_work_detai/blindboard_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/mbcd_work_detai/blindboard_apply_detail.dart index 103b74b..9ef525a 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/mbcd_work_detai/blindboard_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/mbcd_work_detai/blindboard_apply_detail.dart @@ -209,9 +209,11 @@ class _BlindboardApplyDetailState extends State { builder: (_) => WorkAreaPicker( onSelected: (String id, String POSITIONS, String name) { - pd['ELECTRONIC_FENCE_AREA_ID'] = id; - pd['POSITIONS'] = POSITIONS; - pd['PLS_NAME'] = name; + setState(() { + pd['ELECTRONIC_FENCE_AREA_ID'] = id; + pd['POSITIONS'] = POSITIONS; + pd['PLS_NAME'] = name; + }); }, ), ).then((_) { diff --git a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szaq_work_detail/blindboard_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szaq_work_detail/blindboard_set_safe_detail.dart index 70e9eed..6ec9819 100644 --- a/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szaq_work_detail/blindboard_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/mbcd_work/szaq_work_detail/blindboard_set_safe_detail.dart @@ -362,7 +362,7 @@ class _BlindboardSetSafeDetailState extends State { } Future _getMeasures() async { - final data = await ApiService.listSignFinishAllMeasures('blindboard'); + final data = await ApiService.listSignFinishAllMeasures('blindboard', widget.BLINDBOARD_ID); setState(() { measuresList = List>.from( data['measuresList'] ?? >[], diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpaceWorkDetailFormWidget.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpaceWorkDetailFormWidget.dart index de9469f..58a15bc 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpaceWorkDetailFormWidget.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpaceWorkDetailFormWidget.dart @@ -9,17 +9,24 @@ import 'package:qhd_prevention/pages/home/tap/tabList/special_wrok/MeasuresListW /// 通用明细表单组件(支持编辑/只读) class SpaceWorkDetailFormWidget extends StatefulWidget { final Map pd; + /// 其他签字数据 + final Map signs; final bool isEditable; late bool isEditSpaceName; // 是否手动输入受限空间名称 final VoidCallback onChooseLevel; final VoidCallback onChooseSpaceName; final VoidCallback onAnalyzeTap; -// 新增 -/// 选择摄像头 - final VoidCallback? onChooseVideoManager;/// 承包商 + + // 新增 + /// 选择摄像头 + final VoidCallback? onChooseVideoManager; + + /// 承包商 final VoidCallback? onContractorHandle; + /// 作业区域 final VoidCallback? onWorkAreaHandle; + /// 作业地点经纬度 final VoidCallback? onWorkAreaLocationHandle; @@ -38,13 +45,17 @@ class SpaceWorkDetailFormWidget extends StatefulWidget { required this.onChooseLevel, required this.onChooseSpaceName, required this.onAnalyzeTap, + required this.signs, + /// 新增 this.onChooseVideoManager, this.onContractorHandle, this.onWorkAreaHandle, this.onWorkAreaLocationHandle, - this.isEditSpaceName = false, /// 受限空间可选择可手写,默认选择,受限空间编号也要跟着变化 + this.isEditSpaceName = false, + + /// 受限空间可选择可手写,默认选择,受限空间编号也要跟着变化 this.contentController, this.spaceNameController, this.spaceNumberController, @@ -72,7 +83,8 @@ class _SpaceWorkDetailFormWidgetState extends State { @override Widget build(BuildContext context) { if (FormUtils.hasValue(widget.pd, 'LATITUDE')) { - widget.pd['LATITUDE_LONGITUDE'] = '${widget.pd['LATITUDE']},${widget.pd['LONGITUDE']}'; //参数map + widget.pd['LATITUDE_LONGITUDE'] = + '${widget.pd['LATITUDE']},${widget.pd['LONGITUDE']}'; //参数map } final pd = widget.pd; @@ -85,6 +97,14 @@ class _SpaceWorkDetailFormWidgetState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: [ + if (FormUtils.hasValue(pd, 'CHECK_NO')) ...[ + ItemListWidget.singleLineTitleText( + label: '编号:', + isEditable: false, + text: pd['CHECK_NO'] ?? '', + ), + const Divider(), + ], ItemListWidget.singleLineTitleText( label: '作业申请单位:', isEditable: false, @@ -96,32 +116,24 @@ class _SpaceWorkDetailFormWidgetState extends State { isEditable: false, text: pd['APPLY_USER_NAME'] ?? '', ), - if (FormUtils.hasValue(pd, 'CHECK_NO')) ...[ - const Divider(), - ItemListWidget.singleLineTitleText( - label: '编号:', - isEditable: false, - text: pd['CHECK_NO'] ?? '', - ), - ], const Divider(), if (!widget.isEditSpaceName) - ItemListWidget.selectableLineTitleTextRightButton( - label: '受限空间名称:', - isEditable: widget.isEditable, - cleanText: '输入', - isClean: widget.isEditable, - text: pd['LIMITSPACE_NAME'] ?? '', - onTapClean: () { - setState(() { - pd['LIMITSPACE_NAME'] = ''; - pd['LIMITSPACE_NUMBER'] = ''; + ItemListWidget.selectableLineTitleTextRightButton( + label: '受限空间名称:', + isEditable: widget.isEditable, + cleanText: '输入', + isClean: widget.isEditable, + text: pd['LIMITSPACE_NAME'] ?? '', + onTapClean: () { + setState(() { + pd['LIMITSPACE_NAME'] = ''; + pd['LIMITSPACE_NUMBER'] = ''; - widget.isEditSpaceName = !widget.isEditSpaceName; - }); - }, - onTap: widget.onChooseSpaceName, - ), + widget.isEditSpaceName = !widget.isEditSpaceName; + }); + }, + onTap: widget.onChooseSpaceName, + ), if (widget.isEditSpaceName) ItemListWidget.selectableLineTitleTextField( label: '受限空间名称:', @@ -138,7 +150,8 @@ class _SpaceWorkDetailFormWidgetState extends State { }, onTap: widget.onChooseSpaceName, ), - if (FormUtils.hasValue(pd, 'LIMITSPACE_NUMBER') || widget.isEditable) ...[ + if (FormUtils.hasValue(pd, 'LIMITSPACE_NUMBER') || + widget.isEditable) ...[ const Divider(), ItemListWidget.singleLineTitleText( label: '受限空间编号:', @@ -162,22 +175,45 @@ class _SpaceWorkDetailFormWidgetState extends State { controller: widget.contentController, text: pd['WORK_CONTENT'] ?? '', ), - if (FormUtils.hasValue(pd, 'WORK_START_DATE')) ...[ + if (FormUtils.hasValue(pd, 'CONFIRM_DEPARTMENT_NAME')) ...[ const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '作业开始时间:', + ItemListWidget.singleLineTitleText( + label: '作业单位:', isEditable: false, - text: pd['WORK_START_DATE'] ?? '', + text: pd['CONFIRM_DEPARTMENT_NAME'] ?? '', ), ], - if (FormUtils.hasValue(pd, 'WORK_END_DATE')) ...[ + if (FormUtils.hasValue(pd, 'CONFIRM_USER_NAME') && + !widget.isEditable) ...[ const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '作业结束时间:', - isEditable: false, - text: pd['WORK_END_DATE'] ?? '', + SignRowImageTitle( + label: '作业负责人:', + signKey: 'CONFIRM', + signs: widget.signs, + text: pd['CONFIRM_USER_NAME'] ?? '', ), ], + if (FormUtils.hasValue(pd, 'WORK_USER_USER_NAME') && + !widget.isEditable) ...[ + const Divider(), + SignRowImageTitle( + label: '作业人:', + signKey: 'WORK_USER', + signs: widget.signs, + text: pd['WORK_USER_USER_NAME'] ?? '', + ), + ], + if (FormUtils.hasValue(pd, 'GUARDIAN_USER_NAME') && + !widget.isEditable) ...[ + const Divider(), + SignRowImageTitle( + label: '监护人:', + signKey: 'GUARDIAN', + signs: widget.signs, + text: pd['GUARDIAN_USER_NAME'] ?? '', + ), + ], + const Divider(), ItemListWidget.twoRowButtonTitleText( label: '关联其他特殊作业及安全作业票编号', @@ -229,71 +265,67 @@ class _SpaceWorkDetailFormWidgetState extends State { controller: widget.riskController, text: pd['RISK_IDENTIFICATION'] ?? '', ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '作业视频监控:', - isClean: widget.isEditable, - cleanText: '清除监控', - onTapClean: () { - setState(() { - pd['VIDEONAME'] = ''; - pd['VIDEOMANAGER_ID'] = ''; - }); - }, - isRequired: false, - isEditable: widget.isEditable, - onTap: widget.onChooseVideoManager ?? () {}, - text: pd['VIDEONAME'] ?? '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '预计作业开始时间:', - isEditable: widget.isEditable, - onTap: () async { - DateTime? picked = await BottomDateTimePicker.showDate( - mode: BottomPickerMode.dateTimeWithSeconds, - context, - allowFuture: true, - ); - if (picked != null) { - setState(() { - pd['WORK_EXPECTED_START_TIME'] = DateFormat( - 'yyyy-MM-dd HH:mm:ss', - ).format(picked); + if (FormUtils.hasValue(pd, 'WORK_START_DATE')) ...[ + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '作业实施时间:', + isEditable: widget.isEditable, + text: + FormUtils.hasValue(pd, 'WORK_END_DATE') + ? '${pd['WORK_START_DATE'] ?? ''}\n-${pd['WORK_END_DATE'] ?? ''}' + : pd['WORK_START_DATE'] ?? '', + ), + ] else ...[ + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '预计作业开始时间:', + isEditable: widget.isEditable, + onTap: () async { + DateTime? picked = await BottomDateTimePicker.showDate( + mode: BottomPickerMode.dateTimeWithSeconds, + context, + allowFuture: true, + ); + if (picked != null) { + setState(() { + pd['WORK_EXPECTED_START_TIME'] = DateFormat( + 'yyyy-MM-dd HH:mm:ss', + ).format(picked); - /// 开始时间必须早于结束时间 - if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') && - !isBeforeStr( - pd['WORK_EXPECTED_START_TIME'], - pd['WORK_EXPECTED_END_TIME'], - )) { - pd['WORK_EXPECTED_END_TIME'] = ''; - } - }); - } - }, - text: pd['WORK_EXPECTED_START_TIME'] ?? '', - ), - const Divider(), - ItemListWidget.selectableLineTitleTextRightButton( - label: '预计作业结束时间:', - isEditable: widget.isEditable, - onTap: () async { - DateTime? picked = await BottomDateTimePicker.showDate( - context, - minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '', - allowFuture: true, - ); - if (picked != null) { - setState(() { - pd['WORK_EXPECTED_END_TIME'] = DateFormat( - 'yyyy-MM-dd HH:mm:ss', - ).format(picked); - }); - } - }, - text: pd['WORK_EXPECTED_END_TIME'] ?? '', - ), + /// 开始时间必须早于结束时间 + if (FormUtils.hasValue(pd, 'WORK_EXPECTED_END_TIME') && + !isBeforeStr( + pd['WORK_EXPECTED_START_TIME'], + pd['WORK_EXPECTED_END_TIME'], + )) { + pd['WORK_EXPECTED_END_TIME'] = ''; + } + }); + } + }, + text: pd['WORK_EXPECTED_START_TIME'] ?? '', + ), + const Divider(), + ItemListWidget.selectableLineTitleTextRightButton( + label: '预计作业结束时间:', + isEditable: widget.isEditable, + onTap: () async { + DateTime? picked = await BottomDateTimePicker.showDate( + context, + minTimeStr: pd['WORK_EXPECTED_START_TIME'] ?? '', + allowFuture: true, + ); + if (picked != null) { + setState(() { + pd['WORK_EXPECTED_END_TIME'] = DateFormat( + 'yyyy-MM-dd HH:mm:ss', + ).format(picked); + }); + } + }, + text: pd['WORK_EXPECTED_END_TIME'] ?? '', + ), + ], const Divider(), ListItemFactory.createYesNoSection( verticalPadding: 0, @@ -336,14 +368,32 @@ class _SpaceWorkDetailFormWidgetState extends State { isInput: false, isEditable: widget.isEditable, buttonText: '定位', - onTap: widget.onWorkAreaLocationHandle ?? (){}, + onTap: widget.onWorkAreaLocationHandle ?? () {}, hintText: '', text: pd['LATITUDE_LONGITUDE'] ?? (widget.isEditable ? '' : '无'), ), + const Divider(), + + ItemListWidget.selectableLineTitleTextRightButton( + label: '作业视频监控:', + isClean: widget.isEditable, + cleanText: '清除监控', + onTapClean: () { + setState(() { + pd['VIDEONAME'] = ''; + pd['VIDEOMANAGER_ID'] = ''; + }); + }, + isRequired: false, + isEditable: widget.isEditable, + onTap: widget.onChooseVideoManager ?? () {}, + text: pd['VIDEONAME'] ?? '', + ), + if (FormUtils.hasValue(pd, 'ANALYZE_TIME') && !widget.isEditable) ...[ const Divider(), ItemListWidget.OneRowButtonTitleText( - label: '分析人:', + label: '气体分析信息:', text: pd['ANALYZE_USER_NAME'] ?? '', onTap: widget.onAnalyzeTap, ), diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpecialWorkFormBaseWork.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpecialWorkFormBaseWork.dart index 432d394..4a95482 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpecialWorkFormBaseWork.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/SpecialWorkFormBaseWork.dart @@ -55,168 +55,6 @@ class SpecialWorkFormBaseWork extends StatelessWidget { ); } - Widget signItemWidget( - String signKey, - String nameKey, - String name, - BuildContext context, - ) { - return _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - // 标题行 - Padding( - padding: const EdgeInsets.symmetric(vertical: 5, horizontal: 10), - child: Row( - children: [ - Expanded( - child: ListItemFactory.headerTitle(name), - ), - if (FormUtils.hasValue(pd, nameKey)) - Text( - pd[nameKey]?.toString() ?? '', - style: const TextStyle(fontSize: 16), - ), - ], - ), - ), - const SizedBox(height: 8), - - if (FormUtils.hasValue(signs, signKey)) - ...((signs[signKey] as List) - .cast>() - .map((item) { - // 解析 SIGN_PATH - List signPaths = []; - final rawSP = FormUtils.hasValue(item, 'SIGN_PATH') ? item['SIGN_PATH'] : null; - if (rawSP is String && rawSP.isNotEmpty) { - signPaths = rawSP.split(',').map((s) => s.trim()).toList(); - } else if (rawSP is List) { - signPaths = rawSP.cast(); - } - - // 解析 SIGN_TIME 保留空格 - List signTimes = []; - final rawST = FormUtils.hasValue(item, 'SIGN_TIME') ? item['SIGN_TIME'] : null; - if (rawST is String && rawST.isNotEmpty) { - signTimes = rawST.split(','); - } else if (rawST is List) { - signTimes = rawST.cast(); - } - - final pairCount = math.min(signPaths.length, signTimes.length); - - // 解析 IMG_PATH, 最多 2 张 - List imgPaths = []; - final rawIP = FormUtils.hasValue(item, 'IMG_PATH') ? item['IMG_PATH'] : null; - if (rawIP is String && rawIP.isNotEmpty) { - imgPaths = rawIP.split(',').map((s) => s.trim()).take(2).toList(); - } else if (rawIP is List) { - imgPaths = rawIP.cast().take(2).toList(); - } - - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 10), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - if (imgPaths.isNotEmpty) ...[ - Row( - children: imgPaths.map((p) { - final fullUrl = '$baseImgPath$p'; - return GestureDetector( - onTap: () => SingleImageViewer(imageUrl: fullUrl), - child: Padding( - padding: const EdgeInsets.only(right: 8.0), - child: ClipRRect( - borderRadius: BorderRadius.circular(2), - child: Image.network( - fullUrl, - width: 50, - height: 50, - fit: BoxFit.fill, - errorBuilder: (_, __, ___) => const Icon( - Icons.broken_image, - size: 40, - ), - ), - ), - ), - ); - }).toList(), - ), - const SizedBox(height: 8), - ], - - // 签名及时间 - ...List.generate(pairCount, (index) { - final imgPath = signPaths[index]; - final timeLabel = signTimes[index]; - final fullUrl = '$baseImgPath$imgPath'; - const imageWidth = 200.0; - const imageHeight = 100.0; - - return Padding( - padding: const EdgeInsets.symmetric(vertical: 8.0), - child: Column( - children: [ - Row( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - GestureDetector( - onTap: () => presentOpaque( - SingleImageViewer(imageUrl: fullUrl), - context, - ), - child: ClipRRect( - borderRadius: BorderRadius.circular(4), - child: Image.network( - fullUrl, - width: imageWidth, - height: imageHeight, - fit: BoxFit.fill, - errorBuilder: (_, __, ___) => - const Icon(Icons.broken_image, size: 60), - ), - ), - ), - const SizedBox(width: 12), - Expanded( - child: SizedBox( - height: imageHeight, - child: Align( - alignment: Alignment.bottomRight, - child: Text( - timeLabel, - style: const TextStyle( - fontSize: 14, - color: Colors.black87, - ), - ), - ), - ), - ), - ], - ), - if (index < pairCount - 1) - const Padding( - padding: EdgeInsets.only(top: 8.0), - child: Divider(height: 1), - ), - ], - ), - ); - }), - ], - ), - ); - }).toList()), - ], - ), - ); - } - @override Widget build(BuildContext context) { return Column( @@ -230,6 +68,7 @@ class SpecialWorkFormBaseWork extends StatelessWidget { onChooseLevel: onChooseLevel, onChooseSpaceName: onChooseSpaceName, onAnalyzeTap: onAnalyzeTap, + signs: signs, ), // 2. 安全防护措施 @@ -263,138 +102,67 @@ class SpecialWorkFormBaseWork extends StatelessWidget { ], ), ), - - // 4. 各环节签字及意见 if (FormUtils.hasValue(signs, 'GUARDIAN')) - signItemWidget('GUARDIAN', 'GUARDIAN_USER_NAME', '监护人', context), - + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'GUARDIAN', + nameKey: 'GUARDIAN_USER_NAME', + headerTitle: '监护人签字', + roleTitle: '监护人', + ), if (FormUtils.hasValue(signs, 'CONFESS')) - signItemWidget('CONFESS', 'CONFESS_USER_NAME', '安全交底人', context), - + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'CONFESS', + nameKey: 'CONFESS_USER_NAME', + headerTitle: '安全交底人', + roleTitle: '安全交底人', + ), if (FormUtils.hasValue(signs, 'ACCEPT_CONFESS')) - signItemWidget('ACCEPT_CONFESS', 'ACCEPT_CONFESS_USER_NAME', '接受交底人', context), + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'ACCEPT_CONFESS', + nameKey: 'ACCEPT_CONFESS_USER_NAME', + headerTitle: '接受交底人', + roleTitle: '', + ), + if (FormUtils.hasValue(signs, 'CONFIRM')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'CONFIRM', + nameKey: 'CONFIRM_USER_NAME', + headerTitle: '作业负责人意见', + roleTitle: '作业负责人', + ), + if (FormUtils.hasValue(signs, 'LEADER')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'LEADER', + nameKey: 'LEADER_USER_NAME', + headerTitle: '所在单位负责人意见', + roleTitle: '所在单位负责人', + ), - // 作业负责人意见 - if (FormUtils.hasValue(signs, 'CONFIRM')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('作业负责人意见'),), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['CONFIRM'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1,), - signItemWidget('CONFIRM', 'CONFIRM_USER_NAME', '作业负责人', context), - ], - ) - - ], - - // 所在单位负责人意见 - if (FormUtils.hasValue(signs, 'LEADER')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('所在单位意见'),), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['LEADER'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1,), - signItemWidget('LEADER', 'LEADER_USER_NAME', '所在单位负责人', context), - ], - ) - ], - - // 安全管理部门负责人意见 - if (FormUtils.hasValue(signs, 'AUDIT')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('安全管理部门意见'),), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['AUDIT'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1,), - signItemWidget('AUDIT', 'AUDIT_USER_NAME', '安全管理部门负责人', context), - ], - ) - ], - - // 动火审批人意见 - if (FormUtils.hasValue(signs, 'APPROVE')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('动火审批人意见'),), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['APPROVE'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1,), - signItemWidget('APPROVE', 'APPROVE_USER_NAME', '动火审批人', context), - ], - ) - ], - - if (FormUtils.hasValue(signs, 'MONITOR')) - signItemWidget('MONITOR', 'MONITOR_USER_NAME', '动火前在岗班长', context), - - // 作业开始负责人签字 - // if (FormUtils.hasValue(signs, 'WORK_START')) - // signItemWidget('WORK_START', 'WORK_START_USER_NAME', '作业开始负责人', context), - // - // // 作业结束负责人签字 - // if (FormUtils.hasValue(signs, 'WORK_END')) - // signItemWidget('WORK_END', 'WORK_END_USER_NAME', '作业结束负责人', context), - - // 完工验收意见和签字 - if (FormUtils.hasValue(signs, 'ACCEPT')) ...[ - Column( - children: [ - _itemContainer( - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Padding(padding: EdgeInsets.symmetric(horizontal: 8), child: ListItemFactory.headerTitle('完工验收意见'),), - Padding( - padding: const EdgeInsets.all(8.0), - child: Text(signs['ACCEPT'][0]['DESCR'] ?? ''), - ), - ], - ), - ), - Divider(height: 1,), - signItemWidget('ACCEPT', 'ACCEPT_USER_NAME', '验收部门负责人', context), - ], - ) - ], + if (FormUtils.hasValue(signs, 'ACCEPT')) + ConfirmWithSignWidget( + signs: signs, + pd: pd, + baseImgPath: baseImgPath, + sectionKey: 'ACCEPT', + nameKey: 'ACCEPT_USER_NAME', + headerTitle: '验收部门负责人意见', + roleTitle: '验收部门负责人', + ), ], ); } diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqcs_work_detail/spacework_safe_func_sure.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqcs_work_detail/spacework_safe_func_sure.dart index 8f96d5e..f272393 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqcs_work_detail/spacework_safe_func_sure.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/aqcs_work_detail/spacework_safe_func_sure.dart @@ -451,6 +451,7 @@ class _SpaceworkSafeFuncSureState extends State { context, ); }, + signs: {}, ), SizedBox(height: 20), _setSafeDetailWidget(), diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jhr_work_detail/spacework_jhr_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jhr_work_detail/spacework_jhr_detail.dart index 1c27286..63a001c 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jhr_work_detail/spacework_jhr_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jhr_work_detail/spacework_jhr_detail.dart @@ -338,6 +338,7 @@ class _SpaceworkJhrDetailState extends State { context, ); }, + signs: signs, ), SizedBox(height: 20), _setSafeDetailWidget(), diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jszy_work_detail/spacework_jszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jszy_work_detail/spacework_jszy_detail.dart index efa5071..67b0c69 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jszy_work_detail/spacework_jszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/jszy_work_detail/spacework_jszy_detail.dart @@ -206,6 +206,7 @@ class _SpaceworkJszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( +spacing: 12, children: [ // _setSafeDetailWidget(), SpecialWorkFormBaseWork( @@ -254,7 +255,6 @@ class _SpaceworkJszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/kszy_work_detail/spacework_kszy_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/kszy_work_detail/spacework_kszy_detail.dart index 0040579..721ab10 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/kszy_work_detail/spacework_kszy_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/kszy_work_detail/spacework_kszy_detail.dart @@ -201,6 +201,7 @@ class _SpaceworkKszyDetailState extends State { child: SingleChildScrollView( padding: EdgeInsets.all(12), child: Column( + spacing: 12, children: [ // _setSafeDetailWidget(), SpecialWorkFormBaseWork( @@ -249,7 +250,6 @@ class _SpaceworkKszyDetailState extends State { ], ), ), - const SizedBox(height: 12,), _bottomButtons(), ], ), diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/space_work_detai/spacework_apply_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/space_work_detai/spacework_apply_detail.dart index 046f07e..2b5f300 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/space_work_detai/spacework_apply_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/space_work_detai/spacework_apply_detail.dart @@ -217,9 +217,11 @@ class _SpaceworkApplyDetailState extends State { builder: (_) => WorkAreaPicker( onSelected: (String id, String POSITIONS, String name) { - pd['ELECTRONIC_FENCE_AREA_ID'] = id; - pd['POSITIONS'] = POSITIONS; - pd['PLS_NAME'] = name; + setState(() { + pd['ELECTRONIC_FENCE_AREA_ID'] = id; + pd['POSITIONS'] = POSITIONS; + pd['PLS_NAME'] = name; + }); }, ), ).then((_) { @@ -638,6 +640,7 @@ class _SpaceworkApplyDetailState extends State { onContractorHandle: _chooseUnitManager, onWorkAreaHandle: _getWorkArea, onWorkAreaLocationHandle: _showLocationHandle, + signs: {}, ), ), if (isEditable) diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/spacework_list_page.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/spacework_list_page.dart index b181f6a..d3e8f08 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/spacework_list_page.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/spacework_list_page.dart @@ -59,7 +59,6 @@ class _SpaceworkListPageState extends State { @override void initState() { super.initState(); - _fetchSteps(); _fetchData(); _scrollController.addListener(_onScroll); } @@ -140,9 +139,11 @@ class _SpaceworkListPageState extends State { } /// 申请 - void _handleApply() { + void _handleApply() async{ // 处理申请按钮点击逻辑 - pushPage(SpaceworkApplyDetail(WORK_ID: '', flow: widget.flow), context); + await pushPage(SpaceworkApplyDetail(WORK_ID: '', flow: widget.flow), context); + _fetchData(); + LoadingDialogHelper.hide(); } /// 打开流程图 @@ -339,9 +340,10 @@ class _SpaceworkListPageState extends State { default: break; } - LoadingDialogHelper.show(); - _fetchSteps(); - _fetchData(); + + + await _fetchData(); + LoadingDialogHelper.hide(); } Widget _buildFlowStepItem({ diff --git a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szaq_work_detail/spacework_set_safe_detail.dart b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szaq_work_detail/spacework_set_safe_detail.dart index 28b123d..6c5e158 100644 --- a/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szaq_work_detail/spacework_set_safe_detail.dart +++ b/lib/pages/home/tap/tabList/special_wrok/sxkj_work/szaq_work_detail/spacework_set_safe_detail.dart @@ -347,7 +347,7 @@ class _SpaceworkSetSafeDetailState extends State { } Future _getMeasures() async { - final data = await ApiService.listSignFinishAllMeasures('confinedspace'); + final data = await ApiService.listSignFinishAllMeasures('confinedspace', widget.CONFINEDSPACE_ID); setState(() { measuresList = List>.from( data['measuresList'] ?? >[], @@ -570,6 +570,7 @@ class _SpaceworkSetSafeDetailState extends State { context, ); }, + signs: {}, ), SizedBox(height: 20), _setSafeDetailWidget(), diff --git a/lib/pages/home/tap/tabList/work_tab_dz_list.dart b/lib/pages/home/tap/tabList/work_tab_dz_list.dart index 3db4432..b2b9105 100644 --- a/lib/pages/home/tap/tabList/work_tab_dz_list.dart +++ b/lib/pages/home/tap/tabList/work_tab_dz_list.dart @@ -42,7 +42,7 @@ class _WorkTabDzListState extends State { }, { "icon": "assets/icon-apps/icon-yh-1.png", - "title": "设置安全", + "title": "设置安全\n措施确认人", "unreadCount": eight_work_count['MEASURES_SET'] ?? '0', }, { @@ -70,11 +70,6 @@ class _WorkTabDzListState extends State { "title": "作业人\n意见", "unreadCount": eight_work_count['WORK_USER'] ?? '0', }, - { - "icon": "assets/icon-apps/icon-yxkj-2.png", - "title": "作业负责人\n意见", - "unreadCount": eight_work_count['CONFIRM'] ?? '0', - }, { "icon": "assets/icon-apps/icon-yxkj-2.png", "title": "吊装指挥人\n意见", @@ -127,14 +122,13 @@ class _WorkTabDzListState extends State { case 5: title = '安全交底人签字'; break; case 6: title = '接受交底人签字'; break; case 7: title = '作业人签字'; break; - case 8: title = '作业负责人签字'; break; - case 9: title = '吊装指挥人签字'; break; - case 10: title = '所在单位签字'; break; - case 11: title = '审核人签字'; break; - case 12: title = '审批人签字'; break; - case 13: title = '开始作业'; break; - case 14: title = '结束作业'; break; - case 15: title = '验收签字'; break; + case 8: title = '吊装指挥人签字'; break; + case 9: title = '所在单位签字'; break; + case 10: title = '审核人签字'; break; + case 11: title = '审批人签字'; break; + case 12: title = '开始作业'; break; + case 13: title = '结束作业'; break; + case 14: title = '验收签字'; break; default: print("按钮 $index 被点击");