From eb0655d3fc747c3eab3438a810f046436c52b8b4 Mon Sep 17 00:00:00 2001 From: YANG JIANKUAN Date: Fri, 31 Jul 2026 23:12:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=2011=E6=A8=A1=E5=9D=97=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E7=A8=BF=E5=85=A8=E9=87=8F=E8=B5=B0=E6=9F=A5=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E2=80=94=E2=80=94=E6=97=B6=E9=97=B4=E7=BA=BF=E7=8A=B6=E6=80=81?= =?UTF-8?q?pill/=E6=89=8B=E6=9C=BA=E7=9F=AD=E6=A0=87=E9=A2=98/ULD=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E9=A1=BA=E5=BA=8F/=E8=AE=A1=E9=87=8D=E5=8D=A1?= =?UTF-8?q?=E7=89=87=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 设计稿逐态渲染对照走查(01~11 全模块)后的修正: - 运单追踪竖排时间线为已发生节点补状态pill(绿底展示该环节日志content,超长省略) - 11 页手机端标题按设计稿改短标题(DeviceUtil.isPhone 分支,平板长标题零变化): 出库交接/出港待计重/计重记录/计重明细/开始计重/出港运抵/出港移库/出港查询/ 出港货物/进港查询/进港货物 - ULD 编辑表单「来源」移至「所在港」之后(设计稿顺序) - 出港计重列表卡片与计重记录卡片补字段小图标(airplane/location/person/tag) 接口缺口台账复核:#31 进港移库整模块缺失成立(api-doc 全模块清单+报价单双重印证); #19 修正定性——IntExpArrive/declare 入参已含收发货人全套字段,改登记为待确认提交口径; #10 成立(单条 deleteUld 在、批量无)。 双端抽验:手机短标题三页生效(出港待计重/出库交接/进港货物),平板保持长标题,零崩溃。 Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 8 + .../page/log/detail/LogDetailActivity.kt | 35 +- app/src/main/res/layout/activity_uld_edit.xml | 22 +- documents/后端接口对接问题清单.xlsx | Bin 23282 -> 23556 bytes .../gjc/activity/GjcQueryActivity.kt | 2 +- .../gjc/activity/GjcQueryDetailsActivity.kt | 181 +++---- .../gjc/activity/GjcWeighingListActivity.kt | 210 ++++----- .../GjcWeighingRecordDetailsActivity.kt | 207 ++++---- .../activity/GjcWeighingRecordListActivity.kt | 198 ++++---- .../gjc/activity/GjcWeighingStartActivity.kt | 442 +++++++++--------- .../gjc/activity/IntExpArriveActivity.kt | 354 +++++++------- .../gjc/activity/IntExpOutHandoverActivity.kt | 2 +- .../gjc/page/move/IntExpMoveActivity.kt | 342 +++++++------- .../src/main/res/layout/item_gjc_weighing.xml | 99 +++- .../res/layout/item_gjc_weighing_record.xml | 26 +- .../gjj/activity/IntImpQueryActivity.kt | 2 +- .../activity/IntImpQueryDetailsActivity.kt | 3 +- 17 files changed, 1124 insertions(+), 1009 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a358d34..9ea617b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,14 @@ 表头)、`bg_phone_photo_add`(虚线加号槽位)、色值 `phone_amber` ### 修复 (Fixed) +- 【11 模块全量设计稿走查】修正 4 类差异(2026-07-31,3 个并行审计 + 逐态渲染比对): + ① 运单追踪手机竖排时间线补齐已发生节点的状态 pill(绿底标签展示该环节日志 content, + 如「放行状态:01」,超长省略,设计稿 06/08 运单追踪均有此元素); + ② 11 个页面手机端标题对齐设计稿短标题(出库交接/出港待计重/计重记录/计重明细/开始计重/ + 出港运抵/出港移库/出港查询/出港货物/进港查询/进港货物),平板保持原长标题零变化; + ③ ULD 编辑表单「来源」字段移至「所在港」之后(设计稿顺序); + ④ 出港计重列表卡片(日期/航程/代理/特码)与计重记录卡片(代理)补齐字段小图标 + (复用 ic_phone_airplane/location/person/tag,与其余模块卡片风格统一) - 出港查询/进港查询卡片「代理人」空值兜底失效:转换器把 JSON null 归一成空串,DataBinding `??` 只判 null 不判空串导致 agentCode 回退永不生效;改用 Bean 计算属性 `agentDisplay` (isNullOrEmpty 双兜底),已同步修正 06 出港查询(`item_gjc_query.xml`) diff --git a/app/src/main/java/com/lukouguoji/aerologic/page/log/detail/LogDetailActivity.kt b/app/src/main/java/com/lukouguoji/aerologic/page/log/detail/LogDetailActivity.kt index 9214019..0a80fc9 100644 --- a/app/src/main/java/com/lukouguoji/aerologic/page/log/detail/LogDetailActivity.kt +++ b/app/src/main/java/com/lukouguoji/aerologic/page/log/detail/LogDetailActivity.kt @@ -91,7 +91,9 @@ class LogDetailActivity : BaseBindingActivity - - - + + + aKO$3?9@9j-(_D355j)1_lSV*Bp=33%A$&sVh!D4#Y2z0@DiptVp2-&t?FL-%Bc8Mv%^iNu> zF~c4FIv3f85>bL}VjoZ~$js>2)RCT>yXuvGAbWzNJA&4vET@uA^N-gFuc~Rn7%ME= z%)QpGc7HlqgD$}~1R`pXLgV@z~e%6t zs|UR31=-e4PU!|arf^C#->O{ShTdq^)of4e%^Um=DKP)TO5-!QFbwK{yqwx(t2;7* zfn^YaCpwDYCF;Y$0%y*I!}V7`-?4S%u*aokRyI~(-Q?$7vBy)&G=C|W>MgzO2aF_# zQN$U7DK$(P06%`TAI;op`}xHvo|dSDh@6|0l$O5oyuTgJS-l%M3nHzZKV=?V9KP*) zc67ado#shh>Ywz!YgyQE7zaFBw6`W&-p>B|bhqiC-Z41N0h8=M#Agn9?glSLTeiY_ zy0n4U$y47B-F1}O#g)U4L-X#BwppCcpYtQBGHm~Nx zEvJX1%E3v84y`J?#)s?6w|(iChuGxSZ@M=CZhvX?&6Q2o*xJHr|MS7_>01#mKB*7C zX|BN*6Yefxw&Ldcw0CXyx>2Wl3)_%r^J{Hk@|mCX(5?Fb@NCh4 ze{x{hOWg?x(cCPn^6L87e>oNRIVJ8-#@6KAyDk5rp$D^L z7#JQ_CrA^2Li*PH0-kw)LaWw%Y92N5?GP9{i(?{DF{_=BlyxN@e?oJI{-{kf0u@*u z7Z;R#o_hx|#Ur!=6|L)w{!-gw{c#o`?C^SVlB+oxv4a1}c-GDLO1*Wv6y0-> zdL7h5lgrAm=IaennX&m4bfuzL_BS9}v8-K7^)=_3lP{!%&XX@vi^EsLRW&MCTsgIy z#<%AVQ)>|6MXR}+<|8i44CHz)H}R`_cp7N1hCa~J^BjJ*S)#dR<2iWlx;UMB8aNu& zYEfq~pA;U}0?C6wyQA+>FFEe<-o{#Rmu0-f!}ayuOgcAO&H7)vrG%8%`JC)HGGB78 zV<|T>v=|l}Y7pyx+0JnN;Pslu1mt4ECq3CZw3e{<;rX_ztcKa!OkT-5P14(~(KjGxWx>Ec`P5w1?PAS%+@G~vChr{l`VwTq{otu9?3qL1^n z?$ISKGlsOH>U3T0#jxoHT4>CLuH~<-lUk!cX>^ye1i!wkuGQ6Gu5)KD+^XvS9v*FD zWysi4agLk5uGyIDS2?S1&AWHG@&`8Ok-0su>7UhQr=oW9qaSAK>iWG{ zq?eVs2A>HBp1rr|dGEvTbsy)L(&go#s&wqbr1ADgySpFKFuQxU}xGg(%)|3wzMl_&}>;2sIsM;;W?YZM3PR&&p-y!r?UNUxa zU7H+muP6}QQ?-lKnmJjfxxl!7tT>7O8~K!-K#);cfi?G*$j3ww8?g_t+vA(6b{ zxNAFyErS=2Ejv#gTXxTOuY|&OW+%xSS$%vJFptdB4T-}vFv{a4=SW>6!KNoB92$&#$a;(euhH9TtULXwnc?dhx@4&Z#jzC&nU{vU?QTQ zzYMB1oRA?iRO$=+&4AmN1mt1Iq+8!VQTJU|=2a~6lcUgGakg3FK>~wE&dI z5(>vWnMUt(Z|1+hMHi8(qc72l5;WR%+P%8HtO@owIWk1s6oy-7Q41sY+A%`RHKl~s zD$t}Bi#xTvo=u)%qimMWBuvPC4_nPiTuOtFka;iE(h#j~NC1#PoUS|SenNw4#PV!| z;piZ_d@tfbwNh-=3)+$h+LFKH^dv=HjI``{J7N1Lh-4%mK5igz-fU{myH~4^uJ)XJ+EHHkTdBJ23fuLt0?*d# zg{NMwq>EgQOMeV7U;O(8>`UZ8hD?Os7kWF?&^7pjdw{HqIlW#Mj%wI8KAfti2@Q6iC9QYw9v`8eu3dK9iv_JwWhfU7b#9L39hH%JS~=}{V=GM6XYsgc z+9payfRN86U?t%_CBswBnmF}124`>fx4I35DhC%wZbL-uteVEqtyT5|t;Zls<%Rc& zsx95$V^tlHKO3!sm8?p}uFqL`sdVL`8jLgEg7tf+ey=oiOw1d3xl9E{Oj5Czrnreg ziUDMBu%A7Fc}!*8u!sQ4tViFAi3b(zpA=*~prEL^9-NS6LMGFIUxVPQ&Nrkf9a|e% z0mT|wWhr71mebh0ndA~Yc90Jq5xkW}bwN_3(l4%UsQd~(=`?7*v39c(H}tvDU%Eei zTiOY3pZXt{j%tS!S7QwkX{<2HJVse!EW0St%K+rOu=&mOT^yHDDV33xuWNQuzV4&2 zK+`>uadtn*Kxzagg$jzmFtV&&qr3iuN+-^do_a5C+oT`@5B#V{=6VF>ob*qa#Gn;&Fq?oL?YCZ)O+>)TG`D#f(# zW*^*`AK41p!>bjX^Bg%Il(0esq|_|}08r_IR9;Q#PoAUIR+PvHkE%l6KbrudL@xU) zo5+@d2!A0;7V|lZR4cYaH;2MTdu}+isfR>SAvxpr+~oVt-0{hefRLIFZO???>3yFl z!-jirv}LM=!{yg{(?h{nmm|*Wk7k+hbc-oJ(hEe*^PrsWB_P3lxDkwZjW%NL0dLn) zqs-@}T2bn2``pbB7vL`C>`9;_t9Gk)8#dK$hz{q?uPpuoT{952m`Xo5FQ4psT7NVg{|*4b2d|U z*GDX=e4*$<5_MMD*^r0|wbn5bz_kT7?Q}qePQq8Mldo!l|A_x{;BmB*5)921z4!;J4Oij6=7%?dN9M#MqI|S)>*-7gddx8^(qxWQAvw2A zaJ)>Wp!kq$XKp32TJn-42#3i6|HVSS?0abVir@R#cx>){w>PJ{%jj{xa9x|3g*k#a zyBCY-lKx(@^DZByw5sBgcUeYd1PM6UI0 z=UDNsTVY2&=)Q3}M$IU@&B*PJjTM8i)?^uW2m!Vxgi-8MK>M{%eVx;vm;D=~W``Z( zc6$X7`E#kcEHaPmmdpH_SP~E)Hmzy0G~>JpSFe3Fw?(;BgQsFc+R@@ec1K zS&9szY-JTl(fuZSgp02EYh_YQ`Cd-+ncrdRB)1(V%aR(vhk|~FH=+z}4`O%as!8|~ zbAy%n-DZdva!h1hn}j`iuc;q0lz~Z+3{%XSGwLs1X!vXkzjMm;if8&JhsEzXyX-T6V?=5CVy@mu&`aW8t?GUdX|Gmt%ccMi~7LjPE-HQJ->;2WPjikBj^W3Wh( z2-u`V+yeN0EhgNOrF8s1du0^EgyKX_Bf8${Op+wZ1{v^}`ch_C{$dCuz1GyR`E)8m zikD`QT@C+M8XrFQ-KU3{jg<4&p3*oBNE*VhA56aiPm`D3=P~S(2qlO$WXxNNU`VE5 ziXX>5a4-^cz4+pkr30ylVzls%j`8?#-^IbA>AZyY{Z$r|DqhMl`y~~7Jhjq|!a!Qc z77QnhwU+$-cw~qMW%HOae5S@HUGt2G4+iZFSMIRZqX}861RSf@pjz`m8pH1qj7~JL_W%(F>`4|%kpfPc2>km1&`ufu8UIQn#}K62LkSQ>6~gMhu{~QwkbMw+L*IK=(yaNZPu(< z1B0y|ua;-Q?CUs)7=_b3ED#;_%jvCW>zf1M_?iS+C`{Prgi-370srYb;#?v#~H@P@3?TH8Z6B%TSY8b4hv2`lQ~Act1dni z#a9`f_&`fYaEgI!##W^vsjBimlceUIyemWRQd?Lw6qi<%Lcmh+at}SDy2u5qq!tbw zU6huWfs!1_D3{?1q^cT0tD z+tn}$=BiO>)vWh?w+N|lFt7wFdbGfy>hQ!KNnUYI1I39Rf)g24FgotM#v}%3KtZ?) zYR$u%e<@=-u}!#SzG(YhTR}3)_q5frgNa#iZ&>Xqo1bN-RyhsaDGC7(zg->NIx(=* zkX5)-N?iKY+cwv@6{ zaBtk7AlSBZ0UET(H zzrOgsstsk7o4_WUaW0`+56}XyRFlY@kvi$eX(Og`It)74D+s$iP^D*Sm+Vv9-l?j8 zM}WZ2QE9a3O;e>Kfx%;arfgj|Mq&t+t$ZRV#%LAXzKf!pXj%<}5}3Plali*B5ne&v zEexf(7fw6wzBP8NA=2Dmw@8a)pCrSg&R@=LI^EU4B*v3E2hv}a%pLf%QbKP(;$~Qh zh2UF|{4LD(O18KzvMD=ZmQ~+Yi-f6?tzH-2HeKI3tk)UCN3!|0R@tdri(o}SO(&?q zhYdgUwk{Pk?A&QeiEoO~{kCiU@8mEt3-@)-`y%xB@fRgBH%b66M90mb@zFYdktm{h z(Z4(*^&C3*kG8A9$~Z8wpW*Dp=u&M;kmOFkIMc_!$mK<~vv(r7uVmOa`qQcRt<`L+ z-BsH!t_VS`bW!OXY9^hG^rG$n9=o{(Rom;Ga*xou`7IqS zoqb6#^Y;vt>WpTFagqh?Vbyc}aLgRNuKHuDVraU?f>CvlweU&+QLS771^V#|m~Ml0c>{-Yi_>?&l4HLG2p z2EI3Ypq+^#hrs~Mm17DG>yY=M;Cy4G3U5L>+Em!y1w$`pfC?)>h5d@SI3-Y@wkh9T z&+%ENIi_b6H4ImHACmk~nwV`7r_2~RgeaFt8Buyj-yPpkWfL)FsNvni>2GS+4HcyM zwf^ku4?oQ36+kZns&4S&RnN)Ga$o2};nsmD6w+KBTm}g^cpkz&DA$pU`ki024k(k< zE*lxIV1lKJQsIKs2|#TRNV3{I72XaT-5ZVzVwD7!5tRwdp23x?HL0b|-HW9SY$!EG zPK^|PXj}+RxXR1PnFS(e`9YsNklJ&I>?BAQ^0jMe2)t6lR#tgnX?#c>{-G2H1fCu$ zZ%Ml{p4)(fXk{tRzZIQ6ZPlPOTq^L~$<>+1^TN=wRE^|j?(pJ>e4>y$zTu^`MROQI zvQ)xM@>5(yseOWystOy%k!Q<>m+b= zMr)KRK`212J)tZ%tCZdtiqveLmyHBEsfik`&>N^Ikj|)3UZ-3k8B+c^#H|F2po@G@ zkPrPV@-4_}&EYbI0qj6SES%1u%mo1(RslXaTedW5m|-$~I{+%GU}Pj%xj97H?qM=P zgO`C+m%`~M-orLQ78J8G#m?0AC|BCr!)~P;76nCC#^^%yzmw){qJkZ{OkYJ5O5fkT z-csO1Tp0aJ_}<>Oxfx{*LVvkw`RIuQ{Y#nP&O9edu!`G_Y<#F?PH14T&G6AFN;ae} zZzdn&d`FT3Y`#`RvvRrUuV1Wcb_L0S8eG2}C3cHh_BgrzMp$dJX?M%h9P9`vUOn?_ zBn0_%W!JV8u%0|$yy{dE{k0QIQT>?se0l~B#)m;5WvK)r@AV{1yf<)6+>f%fK=Yp@ zV9w_{j;;`g?oy-buoA6lg)?dWOcmPPSk3}XeMcl|CR+p*9SiRczciS*DuZO}54Cl>n3hH) zS2-UC_?bT^debZZttz~|dp zGpMnIwmr~%qxrZT*g&@BDEC)eF|@@8q^-4hFGlB5afQWWVo+_UU9+f_0f}@W`;%|5 z{N*xLD}t8L;x~cPwn{U2=3)dwE73Wf^j=3+EnZwTPEScalF1-aniT;utoJ?^raPi8 zlI<5M8v5D*L4D{+sB#R1lv6oS?^IKOYb97p6Ov(i)v=p9bcaFp?{_iqti|3Y$XL-O zi=N+1>mzMvU>6z$^IwmR00JxO_xoPcjk%et1#49+XqdNS{p1w=9-mh+DiWU-lANlg z$k@QE@8261it-XY-j0fisj5we7)R|0ZI5>4g&B{o4#1JwCoe)2ZqoWx?ePk19Sht1 z^H_f9Ay!4|eR^hxGDmPOm}R(jtx|S*-)wA8BQ{mau0X@?H0C&9{&TrX#<+Gqb3pJ9~cSDz+ z*@%#Og{3dF-rT-x`9}VKNG#Vz@>7#-cidLJhgp9pze2z;I+KT_>t<`{R#$ zfr>3-o_vn7!_e1Wbg?uQnYhr12ALMRUI&tU&4p86OZa1Y=OtLj^5p641@Y|nrd4y{ zD&W$-_BW5RH8(o^T?MX2<<}n0A@0VrO3gL7K^(Jaxq_!h0d8%a5xvDFxz&%;iW_+P z)5xE0xDqtcqtD-^b&*rYUp!e0s}H`JJ9`MOPfS99Ykts-vMKe2xhjor{4D9#-LS*C zvJWK#eG=#u{9Q||tbC|jITj8}nHXxxWCIFE-}>J#+}^eH2YWu*8P)F;ChfBKWuB!} zFsfSB)mcef)hD;MgLp`uz$tk=D@2UXmJ#^=7{0mjv@S3xJWx|a87{Ryk*v*`rA_*R zk&Mc>Jg7-45DcuKQONFM34Nl^q-oA#No&8(%s$Jkx3Wt}GpSI^jOC~%Lx++1wjZM@ zO(uA@nR10wY5!SwBW9bo?F#dA0TeHY+9=q?+Ld7QvDJT`GLZWpBuiQH!r6sZm&$$> z>t$+y4)pYcnUus^ZQ^$b2&3Qe?gjRTelJGtca1TlZ#0s8m@hks?Qd8?oObJ)lLen& zu(nXB6Lf>%}mpC%j*m7Wrf8NW&6w{<5a=lW;Ch z$1Af!M)TkJ7a?RH;%FW^ua}G0v+pNrWr_;(gOX@zxXJ^L=miM=00bIuf+E$cPD}Kz z6dgLC3%LTQsO#Z`3uBt+-|C)iUD)v)q2QQa?7WcO5QmP6gxg`qK_dL60~TQF3@q|` zVgkKLZ40dH(eHDhHmTUDt&JKdW@h`Az1|Jpx;cn1+$c|X@mcSq<&mEdh~^v<;q?Jz zQ_4gp&LkWlQ*KnL;@ms=v3W-J?8cj&{h59Gie_Ze#jF$9L$Qd@1lWyDsB0dlmC}B?2lr0CN-VahljY8U+TnH0hOR zg$xY#B-V&Gjd?@3c(cj^ky9{`?qw0pN$#ewA>8k168?~?96^8H4x z(e5V$t@!l!73qw6s!H;>z0MnvgE)_cj)ke4Q3J>mptn9^fSZZFo5?5Ubk9+S0q-?< z0$+YL=v_1uA5pyWF5U-a)dqC7GZxNqpE5X9e?VlnHMyiS?Gw&7XcqJ&5_g$_W}ySE zdo-dML1|fSnt>hEz~x}q;#y028H%WS*2n!;zxhFatGaW zo)WP$a2E!_zoua1I6-`?q?~MPiNiW{xZB&U$z<}Sq%W{8yQC zN3}QszF$3G-?WUhBjYRXbFgXOeoiB_H$pq}>#(k_^tB(3XJMmkEceya-7MGDlsg%B zi^K#H5wQRDoV-9k2Q)K;OH8gIUQeni!8*qKfbaSfIRu|5A_6aEh8CH*rwZ^UzW4?H zeH3R|-Am6oIJa0?RM#+8Q z0doXKn3#Q-K-!=uEwmx`w%~H=I_$F5`Tc~%_GK+yn4d6CjFYI@tI8RLFi67j4x`M0 z*ta6Xh83Qe zqG4TaRXYzX$GQBKLmn=(>H3{68uvAE&Gfgw%BqNW7#cVCf@zDrB0A+>O`CFUBx2J= z_b&(wSGgu#=xP&NBnpN$G;uv$TMh-b+`Hqi3#V3h8@6AzYa9EH!oS6SLAp4l1PbHO zdsa87It|7LL;V4p%kRHW7w}li)(!b2iS90pT{8`s`H?@rv!aCkG-Ob9Dfy)b4|0#?FH-c6EtC5j5;B2%({a84Q)h$ZHN)+my^`|WMWe%4=ckdFAM$5w&R=MT zbe*lSHTksO5#DSv)!1YbV@X={#u5m-(f7utFo~u+7K(-^)=R~3)5>s|V2KtJ#-IP7 z9AMK_7h;SN@6X{Ind)zI-}rRvptya7Jdf$HDkxGS)4Bd!1BhcSe{#m=3*uzNHFL_~ z7wrxF{Z+*ZiK-sjyE6sj^>h;CcAt;V zyf<6oA!p|^w0s7tei20)C(UE#3bGP4O?!_Z$BP9NqOwx_jiSlTCmMIB9=>hG%+=P! z@1tPH(J7YC4neTd z#p>K36Z!FgO>Bc8M&tV*1wI$3;m8#QhBx<#UrpmQXn~2}zIkbFzn7oxDx!9#%o+F6 zJnkq9phrS0#sC0UuIIg&NxzsR+HeeH=|+8=6JcA-IAHEbsZxHwdA9lHQsKG$Po%J; zaO2kEklnCGOApmm}Aca@)RjqPt=MkwXc zO-R%(bbw?L`1%Ta?d?x3wJ`xjdn!W0;9DG43H`s*d*APeupxLwb=Vj2RNuc*(Kg7Q zdwd(OL7=0>e2fnHIU)RE@tj?-C8o~>%(ue_IB>*qM5#aDVA*i3g!V2eTtNT1XZ5qx z28zH8WgaDs+l4WlUn$sDNy9HzONNyjDqwN*T!D3*l;Zt`-P``mj?(d1U!;dWG188* zC1s297;A@N@iug4LEBBK0e>@mTz`!IF+nDQ8$G2BRggcS zWX)WZT3OH|q|u|UL;gE0aSDY=J;Z=*k^^LLb65+1H(YI!C)u$1g_>Z~j-vpt}%kTvj@)F58vXXpw1#V&=>1hqFoC9lVnCKCP0_>FIjnZL3SJrYwE|akB)P?xOan|C`qOX@ zOZQuL1vot{7`O}3(~(_GV1*0>&CXRY3ymE;BM{FwJk($yUsl`;oZhr{J;7f|9PKagGjsckn` z=>j)vjHxHx>B*Ky z7ogrnn+BRsq3VE(K*TT2*(4cqI?c?&<$jDa5=jjd zO{e%|yGy0ENn-ld^?w97`eAwwi&q>feAi$B`EzTZJOw*oGn4-s$DU!rbWl0zm43{t zF0(cH!OMKH1tejmWN6*y5t&1g5~s{k2=yua*5$e{`GV`ns_)HNPYPLO_& zqAEG@t7Ws&pDSez$}_>0xdr67`EzW1CIiR?`XMi+qE%Oe4Zu`>jTvT&}UN=>b7CPBgSt_auf2I34r+cPT?exeyI27wMeM02sxY41xzBFoBdepePrx)_%U}dx{)nUa8>iL zJC{vJM?|}zUK2v{kT`y^yJ!5W6~e2f%kaVZjmlZ38_3!+6Ru%?dBN&4y>I}{y5g>- z;!tUh^C$5MdjHk2=S?n@S_Ju}&#Xj0ol#`kH?NDUqjz58?M~EtHS<>}C~}|b`#MC} zi5QjnA|5OCUUJUYtbvNnP@JY4hwQouHaB}xnZ2&5WdQ%v@4{TGFXFBPm&oDrDZEHQ z9X$J)8fQk!xBcgDYxWYBk51i(Dwc^%p+DbNckLSwDRpAqaNipAHg4#0OzlBy7pD?$ zcb;hm$Y(bYAFmw?R*?oyA8(4453n~e_MfExUnP9w6lW45#9niwsYo5ne-=mbE8Krp zMbQiLpG}-rIrhV8y8C*$0-v4yyQ`lf&c>h%T|NH#>t-d9SYEl1} zZly&8K_rzJ_CKiZAJSAxoYErv&v&Lpq`jaD24>)7X5-Al{NMloZ*gvR-dzX|26hYy z28Q~-_5WEv@NP9QFn1f4pY~4H#`gBs%6KGpw*Gu-&6Q7feQ0ZtXWzd5Og4xD-oj#gQq`v@NLI{GU%t)ecEWaz@ zgC6lcC~hH0PRV&O=U8TACx2jP7vA6^ZKwEa!9e9&P;ygPV9=%qL>Pt3Yf8csDyv{m zc@<%Ietw-qV8g2gM8X&(M&=08v#DO@X4Jn!%QN?H?`nZhie^^;rbkG%t}fvoG7mrU z9*45=Jx6vPoS*n>vX(g$Z8>6l3NhVoTTRkNnTFoQx-1f{I_2v-LTb(`G3Xf`mz&!RWh02BRv_ii+3?9Mk!Kh$K*w|4kv*#A3}FaLKc4S&Ifz99cMmo15)38Qad zV3OG2Nf#VANrqoxfRiNr;e;#C4@|$L=B{uB*F?cgysx>#WOEfQL4cvnPv5(`w6q;PcV; z?t<$qY{R7v&(NX%Vqjy#@9z0(z~%kqwvs%- zKYH}9(=0lGhxfRFjt$QN7a3ydsru&!#~Wua38sIWbZlNMdY*goPHgx|ecn4Zd|a6f zZSj1A@nImG=yI*|3iqSQ+Uwa5n4b4r&Yu7VMu6>*k`N!hEu^igv>rxBkCrs64IK}* z&McvCo}c=FkD#p_w7Bp+S#prohjevgQFN=FavYhE%1q6Cd1N^pJ%bbg}t@U_rm+A=g*LL z{j`s6X|dKo9bbO(L+LN$Lr6K(S6|VE$;{QKkkU~Wc7@p}oe8{0odtzH!KgyUA4+fj zx9Bnwa5p+l-P9lP*%n&v`$5yqRV!92P1(S0F=LmRALm1a+l0bscZF}!vtx@V!=%d)kKM650_YNz!)8!9;ZX|9a-V}egP1+y&_6sGt z*;z6ejkh!YU2T?F((gSNP)4{Y_b|=|4Qph14Fv&Fo~v0ct%{AOo~<5zfZ*eNt$TEd z!(u$6xGF+h_s{ioJq-`~g1{DU?WBy1XK813o0r>1X)~$8aGL{X#SnE*Kx~qWi6(nb z$stMZjzLH1aLJ;XzsMHu9qnuP(Hcd7RRnE#QY%Z2MLbWrhEy*ATk4rt7T<+L)Ch0 zxeHEB7Z<3WMyjM?slLL{VE|>Sb=dnp7MFBM&6v|w73D0N0)lz`yr@0)t&vGyb@-S5 zdX*kMh&@}M9#WobTgT4yay5;+7-K3;=2y35e7=5`C{6ZbQ!`QO(y4-}T1%MjW@t@? zObzjhIcbkif!YEKgKd>`bB62EWaqE^iQyaMcY$A(g_nl_U< zJef%(lR7_iCNumDgk9+pOl{zihC_apTV?ZvoO|uticKUm+uzxY?x`N`>#_>2+vu`# zJlyEA%7}lfi>h}>7Mxgo(&7qDwBrp_jFLqOE-ZW5JuR!)3E@T9=#yS|$tt%R^*nJK{TmiUcoqOh^|90707BeYK%0LUGIV4N8@`H|`4<7GELz>meDeto` zYM*WVxq9<)PBQ2U@j!BBf9lRWoYHy(X6Ui$P0Y=xs5ljT@De-fzRJ((61DT@Xs2S0 zY+TlGIV~}J(9=Ev;goI3^jMwAq;9seHPHA zJBC`0rhHRTI$d%4DN{vyVhvxa=^wrBie*GhP$>1V!~fOQB>G4ed{4kw<0FZXVE-I94@3 zzuAgeuEJ;PoI!$tF`(Jdk$O<7nD}z9$I_G{pSa6J8vsExqs6{E>p6sE+xls~B}YRukvvwS;f8u}m?%xiUl+c={srK-xtlj2#B z=HY;Wo8g`Tw|KZ4xP10=7qeLXUD1$O^!2#1+}_e944zainAzqzvP>a*2U}E7-Wpc> zH@92JN+R%!Ni&gZeSHnKKEFv>QNoPpPhK}CMyJ^ZNxpOz|!Lj?ktQq6S zeOXmSF$>LiTRBy{y&q>0M=}+M+Fx987VO?T4aSoq`Fa0Dh0vABdKZ7&7@)&>t$)*0 zO^5&clk~6^&KV(Ok0iI0ANb}p2)0_E5K3d>U|$TxXidpx8S$y&@#={njOjVp!|*Fr z%c*=N)WR?wTeb*Wg2f2=fnyHE(Wt2sDM7QQy9-raPAd}*%`?_c`O{-(Zq!5F)4!z~ z_x5Sva_OjMMdm`v242cmRrM~@kYLV7hRpagGlWdk*D6x4my%qX)bh-p59|Fp5y|?5 zXOI^NtLa9GSI|ubvzFEqUufEmQD9nzh*4v~1&J?Sxg}}jPJ&g3lxNB8xzhXPjy=wz z*W~_~%|7?SHOgxJg1m8NeXVJIT_64HdQoMEL3QVXSQJDpmB8&0Su%#mC`G0b{>SLh ziS2UhB*eY4N>)r@AVcc=Hu)oS-NA_-$V?h=pajR*nUJN-F_w8Ip=ABWFbYmtYrYmS z+q|BjGWm-=A@7F#%qDHzHAKPg;Wkq9E`oEhC!R9_w)|>KE1gHgRWq~Tu{Y>&BBX0}WYj;4tF|T0!&QGMNP7g#k14y8 zo$nLPA#usTqVp{6iQzN7&|oQ1T+T09!jrnb($G>aF5dwaTwP){{0e+<7O%Fv~#)7I=4aA z?5rYFFb7|uex{`{t*V3o!sebJ87jO*8||^PESFH0+nT$`&a>lUdkZZ0wsA(EC^Qaa zh}0n)9pJp1z{I6Yt^*LiDcXw5?_Z-PBEE|tmQzl!K*mN_K~H>gTOb21T*Jii=0!u``EmG-59Y#@pj)~be>fN4g~;0HOf^zu2(3y3jc zY0oDm9!e{8IFZhJ=S>u1oU_B51};|y_k)q==uOFhJjaF#mm7dSh7C**GYHCPH?0_q zFykMhLd`%O3m`*j!3vW<;J(=I-H{!4&4?)Az!U#bYZ7#S!I*vE+HCmq2?6KYO}z}N zI$bIuP74?7nVttZp^I}eYGpLvEjw^mnb)lb60056xWKhnG^|(DQ@<7kSWoDMfSce% zsf?de=hlhk1p|PF+HA`mcWLV zfG7A0lDStN1{)_Ko7^Z9xqxDDNW+o@1rvNw_0ewxvbd5~k^%_eFYKl#*NMS}^ z|27x!8o!<7?9mArOPKDp)j2Dug(|USe)=!Z|xrmfE9}I?iqF{l3Q%+{~ zJ9%N*Twv@=Si88G4noDkXtFxMN{MMy(wg|+Sxt+DmNc(=PL{1?L?U2e;0h&?;iy;5d z)`Q$Y7$@~Amrpb(BRR7_WavuJ7qK(^n-F^M&RKDNlhKE^G4zQVlsq+KmW7|yLv#S+ z#1YS)B^qK4T`--X)hf=+JrjSb&yvRnSQ0&fG2AB;%3P_&!_ksP|H^N+O$|WBkWcpc zUbTh9Z#jEmEXNIp*`K3?S@oS{tc-=hDitZ8Z^p&4Lrg;LF1e}BEm0p?8^&swUIl!G z#KLSv{UpyqUrj>(&$thweJ2F3TR+Q2s;OVRy&*fB%^6A{?{Ae^a}(-C*uP<-0Fn26 za`jFoQ(a_A&cdL}b0S#e57M+tjPh@Nn9c@Rohura2RIg*?PCa9VRh9!p{!9tPD&P` z_U$Kgn9FX?AEz|e=NeW?Cyh(bbT^r>FqQkF+seM%&*qGO8t(DdX2S?3k5)(o?XSms z-rs6{=}af*>mbKjv(I2SOq1WyfTJ&&Lsjx_(dMkhRVh`G_9?qP$%@xT_&W+9yF|HRp-C`lSeDiJH5_oShQOiiCp+41QA8;ViEq!#S;SlA;NH41e^ z$0r`PDhySXd|w+kRv%>Ql6P2do_v6S9$$s6#L*Fh3?eP*af3>O7 zo(OQ>aj8;(p^8j70p?-zb{U9FsIdc?C?gvYjy7Yrcfn9W^x|j|#7J&fl{wy~EL~ZC zW>z02b;%w5II*abCy4ZCO4NKiBt_a-G1%!;G8jse8h+#+Ix84CeU;b#CJ>|Rez3Tv zCxg{z+2FF6ZI;SWW65^ zgP2oe!FJ+`VJa|7+v4A0@nNY4sF#c#m!fKPsU&f-Gb0va@{9KVpes32$Oe^1BlW-R z^_AX807Bp-H+y^AmKGG%a06xLWurIW>7IWH?96i`rIeiSra>U@@gu{)uf$G22ynyv z`p)T!RqIKcgA~+&VOOLIvUV`}wJuH%Q)Nprj2n^G9X&UHOkZyEY<m=bo!-?g`= zEras-?+0q-roZ@n?TNmE;H8l?iWd0!>HBtj0PJOD(NM@B2|A9!B7B5LzysBIy-h17t|lt;)H1Z&xE-&Kulu%gp2X1iW|I1*|}z6O#=v#5+wp_~peWSgRcHKmkZDKp<*bi)Mku)IUF zg0BV4CW1abHEgkQU2KC;*J-{1Km41t6`paWDHd;P4?sd$#_K`nba_3mQ2o1nPiop(}14O zOrK&on%!f7u87H-v8rCV_16Xw#JqD!CBqbfw$%&6n2L3QgDaJTg<%;^rLPh_*K*_h zQZ+DMf`1~$DvXu1MA$^iLxP5Q=QL{Bs*E@20w@_FwW;Xa361(LwdlWpDub1}Ghg-= z&2TI;8N+j#Uh)ceV18**d}K!CNCNzQn021q?tLFt({%&Eh1#`BN|v0qK9nP*wwyw# zvnF@^Vq}#fd&GY@}q)(plu{*Cf|?fH~yxXJ2RGq>Muku~IMjoi;9n+2+=r zb>T85D+78R?DmfbUgR8XoAPn?GoL0IpXc32YeLQc+Nj-yH^ zn${3~Qd3QA4c`-ejup5mE}-x&O$bAB9=wB^`VVCM8gphh+)Gnhey=k!iJC<&X<;-<<*ZcYq}EU0TJp?~yga z`>XR*yVr=nUdnkEw1VV;nXHCXQ;XU0+b+4zlce|Y%=Id+xRwlgk5gMGGiBSbR1H|Y z5z`4LOH^lRNoH0S>sB}x?GE)ae9{lEt6SwUb4ntIwRHXL$lqjxhU8hgSWWB{a`EPD zP0WtIH`<9W&Rfkg7Qn2!WJ@wEPm9I{`e2YdgBvYRoLl&<$!E}boS-1s+bzEP%q5`^|Z*-or2dPe09ba1mRBWcYwnE!hE zmZC3g$7eOeE9t1QdiaxklCeKfhl+ELFVaP=WD7n4&r#3a4pb4 znE9Hj`e<<^9#nzTtV~hH6n!>4MCOYuS4wZ5rR`D$)frY|^JaPt)(9?|2zS*{?xfpR zSB0h1_a0$@AHD?TRF*Rgfq4J#V`r>sbhFZ3m;JkbrusZ>db z&Rig{Q3n(WmjOq{8MqdOnsOP;Si%|$XzBbQ_W>9r zHK~P4mEFl}7I+I@nEm3JSI(XK@3#%x95v^*RhGZ;8OF1Ui!BZh{(@)?LVTVq4#s`< zp*(Dw%!53UX7*FTx8bMeWq02WfFCgiGkVo9@VXZVKKI?={UWh$DBg6zVd7!G$|=DT z@;$>?kccU$O6kLMj8C~KJhqdfn%vs#c2hg3TGu&b77-LAP_zr`1DXtx?Q8*@Gno>kFySvnF00zfj zTiA(W3tEyW@^ek6@K<`;vGP{S5Fc&cT-2p!jvcmZ%wlbwY+suf;LYmZcYNA5GuuA6 zL93(h!`fg7mt?}?_F|MEK(0mbFzM}T#k-fn;kW;8|4?La5xm8zxu=P-m^&Ag2Q-@g zB`30&rL`++%vc&VSA}t5eMUj%aQR_t$zTKSC_BB4G~DJFO>I&(CKcMtKOrYn=}>+C zE**ME<^t#rzfCUCF#}mA1c-i}FV3C2HL`5lrd{vXP@a^aLxnr&0?0q~UeM-;_mVZ4 zAK^3EFbYJ^u~#RQ=QVQT&Ru6bS~d~56y@VvLKvbMO25DQcdvL~%1zKRl6S%cxq~30Fxna}fbXuu>w&y&!L^Ao0l@cLXV-VFVrh>+F{%cPG_&b-->6%h6E}qlciD&0D+$}cU!}&TrE?)txd1W&!EfLp(b4aLAXL|Y4E22F=T=?Dj_tp*3M$(%n zd}~cH{@H5^^h#g$3QW^Cy7c2PwJ2Jz(jmO_S*oe1PFR;TiQn*JG%P^D^h-%4Kv|&m`TAE65nC zGzR?@sUf_L)}Y#tY3p_nVtcjHlrf;2Z%F8Si$2R-Wbk-RdbE3Wzxaua?t{e{;v?K+ zw$eai*)AV#HR`aEwJdQAqIwl!NnLLY|*pw4kZ=NsRwBmFv?~@sG1K%>f0dF;(#;{V$~a zRoR0Wh8|(3;#}49ayGra;C``e3#+2w%kicn6MRTlPQlr4Z$5$5HD_U7 zpgy@Nh>awa^l4T*KNx#~-0jXn!tll1``1qW^!Tvp%R?3u{4AF;7hl7C(#CzXQUT>E zVG3@fWu<3oAsjF2c!+okE0>Y*VFK@fn2P%^0&p8rRne1ODU=7RqqnaRxD5{v9b!{! z$)Ac(7UoBx`A3Uc^Jci*3dCgQ!jv5nK%}-jU4#U53=|DB|GFeD|6DM*W#n>hEZO@0 zW;4-&Pj$hxlUvLmK@FXq+C+TR#jggXt@urIYWQU;M47aVih^F(8i&aAXB|KEiO!O< z%PSTZ^EhVYMN%QeHDI2R#>x>GMd(evtr4A;KOz?zC!oh1g?Zs?Lh@2Fh`Lv|0rm6r zYN4hX#}Dk)b$>}_{lwHz6KK><@#}N`MVMg57z8<4uVWRgj$qB0ftE$w-MEe zO6zpbQ2&$&HMv^Bd&;kDElnh9uS~7b zJ=y6FRBPlcYhfNuz2w{m6CS!d!)DDO1HnL?Yy>!cPohgD4G4dq{U!ozc)@zB(A@~_ zZ(c5MuNBYpMaVIT$b=#Ue6jo&^@XJl`@D2n&k52ce|&3v@8*EEQ!dbWX=n%UTFwvm zvBaJ^46I+q-C7cH`Ki$C2WlnseAeH@*YCK`NzzdCWLS2@LLLhzd1AR{7 z#T64d)c)OClTXW{0*|$c-Q)@876|kp19fQTh`4|?sYclo#>>SeV(yF(+MolGg>DVl zWC>R}184>P(JH{)tVnqiVsHfh(>ptSvsDx}wl@{QeNLT82t4w9wZL$ORf81TqQ86g zI`(;(7*UA!MPOg!PO2)41Z%=(kOi%GQ|rg|;m65s5iuY}xVk~%IJ%$Wu2NV5QoX&V z!a=Nl*-~u`H_e%23^secHqA@ekeN7$_C%1I8oT1j(yb$VNX_NaiVY|%W4Tt0fwrOD zUR2gs*>vOx{Wb!D`Q0kPolrN9~%i9;2eal~!wE{g$ zs>Fe$*a1*tc>$fSsgEOTOHPB*sKL<4MK(&dCUgDIUzPV?p&w4H6zp$B>2YkNNUHet z$3wx*UOkIm-!(QtJc0X zVhHLguaCqs`0szv-1siXWfV_+e3|-NBvGPd0VWsnQ|@Zv#bo%FybDwpPcQc!b9j1e z&(fLtsm1FVU0AIW=fr#29WL1I{ipKu@HLR;16iza;IF&&Q)GrIvkj$EtEQ2YZk;hE z;KiHFNdi-;o_D;A^84sX@`?&Lj7Nj_in$>Xt~^4R860V5p^bSs_ddJyI1_X0r?v>J zh-~m|orTs=s>tlce7A4z`X5pyXQEqNsdV$k0h|&)?){cses=HgYZOH`@rdqbFoJ-Q zz=3LUdB`#egmx+2I8y>2i^69viD!S*?hCoDzLdwobrC1RAi=!mi3f7Z+GRoi1yOm~ z1`?8oO6k^LA%aLvEWzpfSvi!r;U7|lMO~uPXlB=~g>&HyJT*6(OZP=c6WJRrg3N{o zN%Js*h6cv!_nd~RafVhnI$maN*Ox$344zKjiOJt{#|@B~ee>D1m`>t@rAW>A07y-K zyCBm?7~CKu%TjY_(rpn`bee#UyH-v}g8YVmdij^Xt4ZxkSD7i*q!%6Ok{U%yf4mWv zXTh&PVxm-;9$w!CXt3A49B7Fdb^OypB zW`EA~x1Si|y0a(xnSdY#<QF$+6g0W0QdeQYy$Fm&ns-tAws$8{aJ(8x zjxUYaVxAMBlzD7uap}x8N68#zxMVgp#s4-y)OaI>RBYw$lqvqED?I?zZs&5m574m7 z@|~b1OEKd9z)B1yJoBkIi+qM$p0a4M+P}v;f}Iq={vPJ*AM3()cbCAE?jzl5Q8gY| zUeNTezfY_+U2!1o4Z>qMN#=}`6=w32ANSi#l4G;B41%x;FT4vJlrAuyRP4@3Wy$DR z(JtGStpBCtAFhG0a?lFU%q7Be#=Stc{Hd$#KlgWLNDvg*oB`&p=%}R#cj9*{ZNty2 zX4RXg^>rfm4^u5Itky;^VBd!w+WFghT4eS%nhgDT+YsNJ@O>N zlZKiK&unxl)nvP~x2%M!YfhfkLq}J4s(&Tbo|8<}ds|@9k7NUe{x5n?+$lxMi&_C0 zeJhAhXXIHlj$2~LO=OaGV zq~R2oI-Ntq!L?|tq28OrVzvdorDq^h$Adu5uFj)J*IL!pUm>Tk=gC?V?3t~tswKX^ ziE~H5Kgamm)9>{Y?Ei0lH*9kx!$Tl8Hh75Ce)%ubNb`REFPba+LjH?MJ8DP&rDN(- z;QytWnvegbiCWtKlb&ny|9{eW60;81emwfz3M)>D{ZU^xFw^#5G}f!f0V3Ne#xbW#69{d5T+;H3WNNsTV*|DbY9 zg(s^2)Ufc6$o~&g zsRjn-WzXd4?V^() { - - override fun layoutId() = R.layout.activity_gjc_query_details - override fun viewModelClass() = GjcQueryDetailsViewModel::class.java - - override fun initOnCreate(savedInstanceState: Bundle?) { - setBackArrow("国际出港查询详情") - binding.viewModel = viewModel - - // 初始化ViewModel(传入maWbId) - viewModel.initOnCreated(intent) - - // 配置ViewPager2 - binding.vp.adapter = CustomVP2Adapter( - viewModel.fragmentList, - supportFragmentManager, - lifecycle - ) - binding.vp.isUserInputEnabled = false // 禁用滑动 - binding.vp.offscreenPageLimit = 3 // 预加载3个Fragment - - // 监听Tab索引变化,切换Fragment - viewModel.currentTab.observe(this) { - binding.vp.setCurrentItem(it, false) // false:无动画 - } - - // 标题栏右侧添加日志查询图标 - val toolbar = findViewById(com.lukouguoji.module_base.R.id.toolbar) - val logIcon = ImageView(this).apply { - setImageResource(com.lukouguoji.module_base.R.drawable.img_log) - layoutParams = Toolbar.LayoutParams( - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.WRAP_CONTENT - ).apply { - gravity = Gravity.END or Gravity.CENTER_VERTICAL - marginEnd = 15 - width = 30.dp - height = 30.dp - } - setOnClickListener { - val wbNo = viewModel.maWbData.value?.get("wbNo") as? String ?: "" - ARouter.getInstance() - .build(ARouterConstants.ACTIVITY_URL_LOG_DETAIL) - .withString(Constant.Key.KEY, wbNo) - .withString(Constant.Key.AWB_TYPE, "IO") - .navigation() - } - } - toolbar.addView(logIcon) - - // 加载详情数据 - viewModel.loadDetails() - } - - private val Int.dp: Int - get() = (this * resources!!.displayMetrics.density).toInt() - - companion object { - @JvmStatic - fun start(context: Context, maWbId: Long?) { - val starter = Intent(context, GjcQueryDetailsActivity::class.java) - .putExtra(Constant.Key.ID, maWbId?.toString() ?: "") - context.startActivity(starter) - } - } -} +package com.lukouguoji.gjc.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.Gravity +import android.widget.ImageView +import android.widget.LinearLayout +import androidx.appcompat.widget.Toolbar +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ActivityGjcQueryDetailsBinding +import com.lukouguoji.gjc.viewModel.GjcQueryDetailsViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.base.CustomVP2Adapter +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.router.ARouterConstants +import com.lukouguoji.module_base.util.DeviceUtil + +/** + * 国际出港查询详情页面 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GJC_QUERY_DETAILS) +class GjcQueryDetailsActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_gjc_query_details + override fun viewModelClass() = GjcQueryDetailsViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow(if (DeviceUtil.isPhone()) "出港货物" else "国际出港查询详情") + binding.viewModel = viewModel + + // 初始化ViewModel(传入maWbId) + viewModel.initOnCreated(intent) + + // 配置ViewPager2 + binding.vp.adapter = CustomVP2Adapter( + viewModel.fragmentList, + supportFragmentManager, + lifecycle + ) + binding.vp.isUserInputEnabled = false // 禁用滑动 + binding.vp.offscreenPageLimit = 3 // 预加载3个Fragment + + // 监听Tab索引变化,切换Fragment + viewModel.currentTab.observe(this) { + binding.vp.setCurrentItem(it, false) // false:无动画 + } + + // 标题栏右侧添加日志查询图标 + val toolbar = findViewById(com.lukouguoji.module_base.R.id.toolbar) + val logIcon = ImageView(this).apply { + setImageResource(com.lukouguoji.module_base.R.drawable.img_log) + layoutParams = Toolbar.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ).apply { + gravity = Gravity.END or Gravity.CENTER_VERTICAL + marginEnd = 15 + width = 30.dp + height = 30.dp + } + setOnClickListener { + val wbNo = viewModel.maWbData.value?.get("wbNo") as? String ?: "" + ARouter.getInstance() + .build(ARouterConstants.ACTIVITY_URL_LOG_DETAIL) + .withString(Constant.Key.KEY, wbNo) + .withString(Constant.Key.AWB_TYPE, "IO") + .navigation() + } + } + toolbar.addView(logIcon) + + // 加载详情数据 + viewModel.loadDetails() + } + + private val Int.dp: Int + get() = (this * resources!!.displayMetrics.density).toInt() + + companion object { + @JvmStatic + fun start(context: Context, maWbId: Long?) { + val starter = Intent(context, GjcQueryDetailsActivity::class.java) + .putExtra(Constant.Key.ID, maWbId?.toString() ?: "") + context.startActivity(starter) + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingListActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingListActivity.kt index f657b23..b10a91e 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingListActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingListActivity.kt @@ -1,105 +1,105 @@ -package com.lukouguoji.gjc.activity - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import androidx.databinding.ObservableBoolean -import com.alibaba.android.arouter.facade.annotation.Route -import com.lukouguoji.gjc.R -import com.lukouguoji.gjc.databinding.ActivityGjcWeighingListBinding -import com.lukouguoji.gjc.viewModel.GjcWeighingViewModel -import com.lukouguoji.module_base.base.BaseBindingActivity -import com.lukouguoji.module_base.bean.GjcWeighingBean -import com.lukouguoji.module_base.common.ConstantEvent -import com.lukouguoji.module_base.impl.FlowBus -import com.lukouguoji.module_base.impl.observe -import com.lukouguoji.module_base.ktx.getLifecycleOwner -import com.lukouguoji.module_base.router.ARouterConstants -import com.lukouguoji.module_base.util.DeviceUtil - -/** - * 国际出港计重列表页 - * - * 布局 id 不区分设备,平板/手机由资源限定符自动选择: - * layout-sw600dp/activity_gjc_weighing_list.xml(平板) - * layout/activity_gjc_weighing_list.xml(手机) - */ -@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_LIST) -class GjcWeighingListActivity : - BaseBindingActivity() { - - override fun layoutId() = R.layout.activity_gjc_weighing_list - - override fun viewModelClass() = GjcWeighingViewModel::class.java - - /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ - val filterPanelVisible = ObservableBoolean(false) - - override fun initOnCreate(savedInstanceState: Bundle?) { - setBackArrow("国际出港待计重") - - binding.viewModel = viewModel - binding.activity = this - - // 手机版专属数据:放开默认日期、加载筛选弹层字典、启用三格统计 - // 平板端不调用,查询链路与请求次数与改造前完全一致 - if (DeviceUtil.isPhone()) { - viewModel.initPhoneExtras() - } - - // 初始化代理人列表(从API获取) - viewModel.initAgentList() - - // 初始化特码列表(从API获取) - viewModel.initSpecialCodeList() - - // 绑定分页逻辑 - viewModel.pageModel - .bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner()) - - // 监听刷新事件 - FlowBus.with(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { viewModel.onItemCheckChanged() } - - FlowBus.with(ConstantEvent.EVENT_REFRESH) - .observe(this) { - viewModel.refresh() - } - - // 初始加载 - viewModel.refresh() - } - - // ==================== 手机版专用交互(纯 UI,复用既有 ViewModel 字段) ==================== - - /** 手机版筛选弹层显隐切换 */ - fun toggleFilterPanel() { - filterPanelVisible.set(!filterPanelVisible.get()) - } - - /** 手机版筛选:重置(只清弹层内条件,不影响顶部搜索框) */ - fun resetFilter() { - viewModel.channelFilter.value = "" - viewModel.carrierFilter.value = "" - viewModel.awbTypeFilter.value = "" - viewModel.agentCode.value = "" - } - - /** 手机版筛选:确认 */ - fun confirmFilter() { - filterPanelVisible.set(false) - viewModel.searchClick() - } - - /** 手机版卡片内「提前运抵」(单票,由 ViewHolder 调用) */ - fun preArriveClick(bean: GjcWeighingBean) { - viewModel.arrivedAheadSingle(bean) - } - - companion object { - @JvmStatic - fun start(context: Context) { - val starter = Intent(context, GjcWeighingListActivity::class.java) - context.startActivity(starter) - } - } -} +package com.lukouguoji.gjc.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.databinding.ObservableBoolean +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ActivityGjcWeighingListBinding +import com.lukouguoji.gjc.viewModel.GjcWeighingViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.bean.GjcWeighingBean +import com.lukouguoji.module_base.common.ConstantEvent +import com.lukouguoji.module_base.impl.FlowBus +import com.lukouguoji.module_base.impl.observe +import com.lukouguoji.module_base.ktx.getLifecycleOwner +import com.lukouguoji.module_base.router.ARouterConstants +import com.lukouguoji.module_base.util.DeviceUtil + +/** + * 国际出港计重列表页 + * + * 布局 id 不区分设备,平板/手机由资源限定符自动选择: + * layout-sw600dp/activity_gjc_weighing_list.xml(平板) + * layout/activity_gjc_weighing_list.xml(手机) + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_LIST) +class GjcWeighingListActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_gjc_weighing_list + + override fun viewModelClass() = GjcWeighingViewModel::class.java + + /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ + val filterPanelVisible = ObservableBoolean(false) + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow(if (DeviceUtil.isPhone()) "出港待计重" else "国际出港待计重") + + binding.viewModel = viewModel + binding.activity = this + + // 手机版专属数据:放开默认日期、加载筛选弹层字典、启用三格统计 + // 平板端不调用,查询链路与请求次数与改造前完全一致 + if (DeviceUtil.isPhone()) { + viewModel.initPhoneExtras() + } + + // 初始化代理人列表(从API获取) + viewModel.initAgentList() + + // 初始化特码列表(从API获取) + viewModel.initSpecialCodeList() + + // 绑定分页逻辑 + viewModel.pageModel + .bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner()) + + // 监听刷新事件 + FlowBus.with(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { viewModel.onItemCheckChanged() } + + FlowBus.with(ConstantEvent.EVENT_REFRESH) + .observe(this) { + viewModel.refresh() + } + + // 初始加载 + viewModel.refresh() + } + + // ==================== 手机版专用交互(纯 UI,复用既有 ViewModel 字段) ==================== + + /** 手机版筛选弹层显隐切换 */ + fun toggleFilterPanel() { + filterPanelVisible.set(!filterPanelVisible.get()) + } + + /** 手机版筛选:重置(只清弹层内条件,不影响顶部搜索框) */ + fun resetFilter() { + viewModel.channelFilter.value = "" + viewModel.carrierFilter.value = "" + viewModel.awbTypeFilter.value = "" + viewModel.agentCode.value = "" + } + + /** 手机版筛选:确认 */ + fun confirmFilter() { + filterPanelVisible.set(false) + viewModel.searchClick() + } + + /** 手机版卡片内「提前运抵」(单票,由 ViewHolder 调用) */ + fun preArriveClick(bean: GjcWeighingBean) { + viewModel.arrivedAheadSingle(bean) + } + + companion object { + @JvmStatic + fun start(context: Context) { + val starter = Intent(context, GjcWeighingListActivity::class.java) + context.startActivity(starter) + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingRecordDetailsActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingRecordDetailsActivity.kt index f2c6887..ca1e9fe 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingRecordDetailsActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingRecordDetailsActivity.kt @@ -1,103 +1,104 @@ -package com.lukouguoji.gjc.activity - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import androidx.recyclerview.widget.DividerItemDecoration -import androidx.recyclerview.widget.LinearLayoutManager -import com.alibaba.android.arouter.facade.annotation.Route -import com.lukouguoji.gjc.R -import com.lukouguoji.gjc.databinding.ActivityGjcWeighingRecordDetailsBinding -import com.lukouguoji.gjc.holder.GjcCheckInRecordViewHolder -import com.lukouguoji.gjc.viewModel.GjcWeighingRecordDetailsViewModel -import com.lukouguoji.module_base.base.BaseBindingActivity -import com.lukouguoji.module_base.base.CommonAdapter -import com.lukouguoji.module_base.bean.GjcCheckInRecord -import com.lukouguoji.module_base.bean.GjcWeighingRecordBean -import com.lukouguoji.module_base.common.Constant -import com.lukouguoji.module_base.router.ARouterConstants - -/** - * 国际出港计重明细页 - * - * 布局 id 不区分设备,平板/手机由资源限定符自动选择: - * layout-sw600dp/activity_gjc_weighing_record_details.xml(平板,列表内联编辑) - * layout/activity_gjc_weighing_record_details.xml(手机,单条记录经全屏「修改记录」覆层编辑) - */ -@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_DETAILS) -class GjcWeighingRecordDetailsActivity : - BaseBindingActivity() { - - private lateinit var adapter: CommonAdapter - - // 当前编辑模式(供ViewHolder获取) - var currentEditMode = false - - override fun layoutId() = R.layout.activity_gjc_weighing_record_details - - override fun viewModelClass() = GjcWeighingRecordDetailsViewModel::class.java - - override fun initOnCreate(savedInstanceState: Bundle?) { - setBackArrow("国际出港计重明细") - - binding.viewModel = viewModel - - // 初始化RecyclerView - val layoutManager = LinearLayoutManager(this) - binding.recyclerView.layoutManager = layoutManager - - // 添加分割线 - val divider = DividerItemDecoration(this, DividerItemDecoration.VERTICAL) - binding.recyclerView.addItemDecoration(divider) - - adapter = CommonAdapter( - this, - R.layout.item_gjc_check_in_record, - GjcCheckInRecordViewHolder::class.java - ) - binding.recyclerView.adapter = adapter - - // 监听数据变化更新RecyclerView - viewModel.recordList.observe(this) { records -> - adapter.refresh(records) - } - - // 监听编辑模式变化,更新当前编辑模式并刷新列表 - viewModel.isEditMode.observe(this) { isEditMode -> - // 更新当前编辑模式状态 - currentEditMode = isEditMode - - // 刷新所有可见的 ViewHolder - adapter.notifyDataSetChanged() - } - - // 初始化数据 - viewModel.initOnCreated(intent) - } - - // ==================== 手机版专用交互(纯 UI,复用既有 ViewModel 编辑链路) ==================== - - /** - * 手机版:打开「修改记录」覆层编辑指定记录。 - * 复用 [GjcWeighingRecordDetailsViewModel.onModifyClick] 的备份/编辑态逻辑, - * 覆层显隐由 isEditMode 驱动(平板端该状态驱动列表内联编辑,互不影响)。 - */ - fun openPhoneEdit(record: GjcCheckInRecord) { - viewModel.onModifyClick() - binding.editRecord = record - } - - /** 手机版:取消编辑(恢复备份并收起覆层) */ - fun closePhoneEdit() { - viewModel.onCancelClick() - } - - companion object { - @JvmStatic - fun start(context: Context, bean: GjcWeighingRecordBean) { - val starter = Intent(context, GjcWeighingRecordDetailsActivity::class.java) - .putExtra(Constant.Key.BEAN, bean) - context.startActivity(starter) - } - } -} +package com.lukouguoji.gjc.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.recyclerview.widget.DividerItemDecoration +import androidx.recyclerview.widget.LinearLayoutManager +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ActivityGjcWeighingRecordDetailsBinding +import com.lukouguoji.gjc.holder.GjcCheckInRecordViewHolder +import com.lukouguoji.gjc.viewModel.GjcWeighingRecordDetailsViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.base.CommonAdapter +import com.lukouguoji.module_base.bean.GjcCheckInRecord +import com.lukouguoji.module_base.bean.GjcWeighingRecordBean +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.router.ARouterConstants +import com.lukouguoji.module_base.util.DeviceUtil + +/** + * 国际出港计重明细页 + * + * 布局 id 不区分设备,平板/手机由资源限定符自动选择: + * layout-sw600dp/activity_gjc_weighing_record_details.xml(平板,列表内联编辑) + * layout/activity_gjc_weighing_record_details.xml(手机,单条记录经全屏「修改记录」覆层编辑) + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_DETAILS) +class GjcWeighingRecordDetailsActivity : + BaseBindingActivity() { + + private lateinit var adapter: CommonAdapter + + // 当前编辑模式(供ViewHolder获取) + var currentEditMode = false + + override fun layoutId() = R.layout.activity_gjc_weighing_record_details + + override fun viewModelClass() = GjcWeighingRecordDetailsViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow(if (DeviceUtil.isPhone()) "计重明细" else "国际出港计重明细") + + binding.viewModel = viewModel + + // 初始化RecyclerView + val layoutManager = LinearLayoutManager(this) + binding.recyclerView.layoutManager = layoutManager + + // 添加分割线 + val divider = DividerItemDecoration(this, DividerItemDecoration.VERTICAL) + binding.recyclerView.addItemDecoration(divider) + + adapter = CommonAdapter( + this, + R.layout.item_gjc_check_in_record, + GjcCheckInRecordViewHolder::class.java + ) + binding.recyclerView.adapter = adapter + + // 监听数据变化更新RecyclerView + viewModel.recordList.observe(this) { records -> + adapter.refresh(records) + } + + // 监听编辑模式变化,更新当前编辑模式并刷新列表 + viewModel.isEditMode.observe(this) { isEditMode -> + // 更新当前编辑模式状态 + currentEditMode = isEditMode + + // 刷新所有可见的 ViewHolder + adapter.notifyDataSetChanged() + } + + // 初始化数据 + viewModel.initOnCreated(intent) + } + + // ==================== 手机版专用交互(纯 UI,复用既有 ViewModel 编辑链路) ==================== + + /** + * 手机版:打开「修改记录」覆层编辑指定记录。 + * 复用 [GjcWeighingRecordDetailsViewModel.onModifyClick] 的备份/编辑态逻辑, + * 覆层显隐由 isEditMode 驱动(平板端该状态驱动列表内联编辑,互不影响)。 + */ + fun openPhoneEdit(record: GjcCheckInRecord) { + viewModel.onModifyClick() + binding.editRecord = record + } + + /** 手机版:取消编辑(恢复备份并收起覆层) */ + fun closePhoneEdit() { + viewModel.onCancelClick() + } + + companion object { + @JvmStatic + fun start(context: Context, bean: GjcWeighingRecordBean) { + val starter = Intent(context, GjcWeighingRecordDetailsActivity::class.java) + .putExtra(Constant.Key.BEAN, bean) + context.startActivity(starter) + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingRecordListActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingRecordListActivity.kt index bb83248..836ed9c 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingRecordListActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingRecordListActivity.kt @@ -1,99 +1,99 @@ -package com.lukouguoji.gjc.activity - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import androidx.databinding.ObservableBoolean -import com.alibaba.android.arouter.facade.annotation.Route -import com.lukouguoji.gjc.R -import com.lukouguoji.gjc.databinding.ActivityGjcWeighingRecordListBinding -import com.lukouguoji.gjc.viewModel.GjcWeighingRecordViewModel -import com.lukouguoji.module_base.base.BaseBindingActivity -import com.lukouguoji.module_base.common.ConstantEvent -import com.lukouguoji.module_base.impl.FlowBus -import com.lukouguoji.module_base.impl.observe -import com.lukouguoji.module_base.ktx.getLifecycleOwner -import com.lukouguoji.module_base.router.ARouterConstants -import com.lukouguoji.module_base.util.DeviceUtil - -/** - * 国际出港计重记录列表页 - * - * 布局 id 不区分设备,平板/手机由资源限定符自动选择: - * layout-sw600dp/activity_gjc_weighing_record_list.xml(平板) - * layout/activity_gjc_weighing_record_list.xml(手机) - */ -@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_LIST) -class GjcWeighingRecordListActivity : - BaseBindingActivity() { - - override fun layoutId() = R.layout.activity_gjc_weighing_record_list - - override fun viewModelClass() = GjcWeighingRecordViewModel::class.java - - /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ - val filterPanelVisible = ObservableBoolean(false) - - override fun initOnCreate(savedInstanceState: Bundle?) { - setBackArrow("国际出港计重记录") - - binding.viewModel = viewModel - binding.activity = this - - // 手机版专属数据:放开默认日期、加载计重人下拉 - // 平板端不调用,查询链路与请求次数与改造前完全一致 - if (DeviceUtil.isPhone()) { - viewModel.initPhoneExtras() - } - - // 初始化代理人列表 - viewModel.initAgentList() - - // 初始化特码列表 - viewModel.initSpecialCodeList() - - // 绑定分页逻辑 - viewModel.pageModel - .bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner()) - - // 监听刷新事件 - FlowBus.with(ConstantEvent.EVENT_REFRESH) - .observe(this) { - viewModel.refresh() - } - - // 初始加载 - viewModel.refresh() - } - - // ==================== 手机版专用交互(纯 UI,复用既有 ViewModel 字段) ==================== - - /** 手机版筛选弹层显隐切换 */ - fun toggleFilterPanel() { - filterPanelVisible.set(!filterPanelVisible.get()) - } - - /** 手机版筛选:重置(只清弹层内条件,不影响顶部搜索框) */ - fun resetFilter() { - viewModel.checkInDateStart.value = "" - viewModel.checkInDateEnd.value = "" - viewModel.agentCode.value = "" - viewModel.spCode.value = "" - viewModel.destFilter.value = "" - viewModel.opUserFilter.value = "" - } - - /** 手机版筛选:确认 */ - fun confirmFilter() { - filterPanelVisible.set(false) - viewModel.searchClick() - } - - companion object { - @JvmStatic - fun start(context: Context) { - val starter = Intent(context, GjcWeighingRecordListActivity::class.java) - context.startActivity(starter) - } - } -} +package com.lukouguoji.gjc.activity + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.databinding.ObservableBoolean +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ActivityGjcWeighingRecordListBinding +import com.lukouguoji.gjc.viewModel.GjcWeighingRecordViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.common.ConstantEvent +import com.lukouguoji.module_base.impl.FlowBus +import com.lukouguoji.module_base.impl.observe +import com.lukouguoji.module_base.ktx.getLifecycleOwner +import com.lukouguoji.module_base.router.ARouterConstants +import com.lukouguoji.module_base.util.DeviceUtil + +/** + * 国际出港计重记录列表页 + * + * 布局 id 不区分设备,平板/手机由资源限定符自动选择: + * layout-sw600dp/activity_gjc_weighing_record_list.xml(平板) + * layout/activity_gjc_weighing_record_list.xml(手机) + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_LIST) +class GjcWeighingRecordListActivity : + BaseBindingActivity() { + + override fun layoutId() = R.layout.activity_gjc_weighing_record_list + + override fun viewModelClass() = GjcWeighingRecordViewModel::class.java + + /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ + val filterPanelVisible = ObservableBoolean(false) + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow(if (DeviceUtil.isPhone()) "计重记录" else "国际出港计重记录") + + binding.viewModel = viewModel + binding.activity = this + + // 手机版专属数据:放开默认日期、加载计重人下拉 + // 平板端不调用,查询链路与请求次数与改造前完全一致 + if (DeviceUtil.isPhone()) { + viewModel.initPhoneExtras() + } + + // 初始化代理人列表 + viewModel.initAgentList() + + // 初始化特码列表 + viewModel.initSpecialCodeList() + + // 绑定分页逻辑 + viewModel.pageModel + .bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, getLifecycleOwner()) + + // 监听刷新事件 + FlowBus.with(ConstantEvent.EVENT_REFRESH) + .observe(this) { + viewModel.refresh() + } + + // 初始加载 + viewModel.refresh() + } + + // ==================== 手机版专用交互(纯 UI,复用既有 ViewModel 字段) ==================== + + /** 手机版筛选弹层显隐切换 */ + fun toggleFilterPanel() { + filterPanelVisible.set(!filterPanelVisible.get()) + } + + /** 手机版筛选:重置(只清弹层内条件,不影响顶部搜索框) */ + fun resetFilter() { + viewModel.checkInDateStart.value = "" + viewModel.checkInDateEnd.value = "" + viewModel.agentCode.value = "" + viewModel.spCode.value = "" + viewModel.destFilter.value = "" + viewModel.opUserFilter.value = "" + } + + /** 手机版筛选:确认 */ + fun confirmFilter() { + filterPanelVisible.set(false) + viewModel.searchClick() + } + + companion object { + @JvmStatic + fun start(context: Context) { + val starter = Intent(context, GjcWeighingRecordListActivity::class.java) + context.startActivity(starter) + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingStartActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingStartActivity.kt index 937534d..252b63f 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingStartActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/GjcWeighingStartActivity.kt @@ -1,221 +1,221 @@ -package com.lukouguoji.gjc.activity - -import android.animation.Animator -import android.animation.AnimatorListenerAdapter -import android.animation.AnimatorSet -import android.animation.ObjectAnimator -import android.content.Context -import android.content.Intent -import android.os.Bundle -import android.view.View -import com.alibaba.android.arouter.facade.annotation.Route -import com.lukouguoji.gjc.R -import com.lukouguoji.gjc.databinding.ActivityGjcWeighingStartBinding -import com.lukouguoji.gjc.viewModel.GjcWeighingStartViewModel -import com.lukouguoji.module_base.base.BaseBindingActivity -import com.lukouguoji.module_base.common.Constant -import com.lukouguoji.module_base.router.ARouterConstants -import com.lukouguoji.module_base.util.DeviceUtil - -/** - * 国际出港计重-开始计重页面 - */ -@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_START) -class GjcWeighingStartActivity : - BaseBindingActivity() { - - private var isExpanded = false - - override fun layoutId() = R.layout.activity_gjc_weighing_start - - override fun viewModelClass() = GjcWeighingStartViewModel::class.java - - override fun initOnCreate(savedInstanceState: Bundle?) { - setBackArrow("国际出港开始计重") - binding.viewModel = viewModel - - // 手机版专属:提交体携带托盘数量/托盘自重(平板不调用,请求体与改造前完全一致) - if (DeviceUtil.isPhone()) { - viewModel.initPhoneExtras() - } - - viewModel.initOnCreated(this, intent) - - setupFloatButtons() - } - - private fun setupFloatButtons() { - // 浮动按钮组仅平板布局存在(layout-sw600dp),手机布局无这些 id,直接跳过 - val mainFloatButton = binding.mainFloatButton ?: return - val maskView = binding.maskView ?: return - val subButton1 = binding.subButton1 ?: return - val subButton2 = binding.subButton2 ?: return - - // 主按钮点击事件 - mainFloatButton.setOnClickListener { - if (!isExpanded) { - expandButtons() - } - } - - // 遮罩层点击事件 - maskView.setOnClickListener { - collapseButtons() - } - - // 子按钮1点击事件 - 跳转到出港运抵页面 - subButton1.setOnClickListener { - com.alibaba.android.arouter.launcher.ARouter.getInstance() - .build(ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE) - .navigation() - collapseButtons() - } - - // 子按钮2点击事件 - 跳转到计重记录 - subButton2.setOnClickListener { - com.alibaba.android.arouter.launcher.ARouter.getInstance() - .build(ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_LIST) - .navigation() - collapseButtons() - } - } - - /** - * 展开子按钮(仅平板,手机布局无浮动按钮组) - */ - private fun expandButtons() { - val mainFloatButton = binding.mainFloatButton ?: return - val maskView = binding.maskView ?: return - val subButton1 = binding.subButton1 ?: return - val subButton2 = binding.subButton2 ?: return - - isExpanded = true - - // 显示遮罩层 - maskView.visibility = View.VISIBLE - maskView.alpha = 0f - maskView.animate().alpha(0.3f).setDuration(200).start() - - // 显示子按钮 - subButton1.visibility = View.VISIBLE - subButton2.visibility = View.VISIBLE - - // 子按钮1动画(向左上方移动: 左移15dp, 上移55dp) - val sub1TransX = ObjectAnimator.ofFloat(subButton1, "translationX", 0f, -5f) - val sub1TransY = ObjectAnimator.ofFloat(subButton1, "translationY", 0f, -25f) - val sub1Alpha = ObjectAnimator.ofFloat(subButton1, "alpha", 0f, 1f) - val sub1Scale = ObjectAnimator.ofFloat(subButton1, "scaleX", 0f, 1f) - val sub1ScaleY = ObjectAnimator.ofFloat(subButton1, "scaleY", 0f, 1f) - - val animSet1 = AnimatorSet() - animSet1.playTogether(sub1TransX, sub1TransY, sub1Alpha, sub1Scale, sub1ScaleY) - animSet1.duration = 200 - - // 子按钮2动画(向左下方移动: 左移55dp, 下移15dp) - val sub2TransX = ObjectAnimator.ofFloat(subButton2, "translationX", 0f, -25f) - val sub2TransY = ObjectAnimator.ofFloat(subButton2, "translationY", 0f, -5f) - val sub2Alpha = ObjectAnimator.ofFloat(subButton2, "alpha", 0f, 1f) - val sub2Scale = ObjectAnimator.ofFloat(subButton2, "scaleX", 0f, 1f) - val sub2ScaleY = ObjectAnimator.ofFloat(subButton2, "scaleY", 0f, 1f) - - val animSet2 = AnimatorSet() - animSet2.playTogether(sub2TransX, sub2TransY, sub2Alpha, sub2Scale, sub2ScaleY) - animSet2.duration = 200 - animSet2.startDelay = 50 - - // 主按钮隐藏动画 - mainFloatButton.animate() - .scaleX(0f) - .scaleY(0f) - .alpha(0f) - .setDuration(150) - .setListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - mainFloatButton.visibility = View.GONE - } - }) - .start() - - animSet1.start() - animSet2.start() - } - - /** - * 收起子按钮(仅平板,手机布局无浮动按钮组) - */ - private fun collapseButtons() { - val mainFloatButton = binding.mainFloatButton ?: return - val maskView = binding.maskView ?: return - val subButton1 = binding.subButton1 ?: return - val subButton2 = binding.subButton2 ?: return - - isExpanded = false - - // 隐藏遮罩层 - maskView.animate().alpha(0f).setDuration(200).withEndAction { - maskView.visibility = View.GONE - }.start() - - // 子按钮1动画(回到原位) - val sub1TransX = ObjectAnimator.ofFloat(subButton1, "translationX", subButton1.translationX, 0f) - val sub1TransY = ObjectAnimator.ofFloat(subButton1, "translationY", subButton1.translationY, 0f) - val sub1Alpha = ObjectAnimator.ofFloat(subButton1, "alpha", 1f, 0f) - val sub1Scale = ObjectAnimator.ofFloat(subButton1, "scaleX", 1f, 0f) - val sub1ScaleY = ObjectAnimator.ofFloat(subButton1, "scaleY", 1f, 0f) - - val animSet1 = AnimatorSet() - animSet1.playTogether(sub1TransX, sub1TransY, sub1Alpha, sub1Scale, sub1ScaleY) - animSet1.duration = 200 - - // 子按钮2动画(回到原位) - val sub2TransX = ObjectAnimator.ofFloat(subButton2, "translationX", subButton2.translationX, 0f) - val sub2TransY = ObjectAnimator.ofFloat(subButton2, "translationY", subButton2.translationY, 0f) - val sub2Alpha = ObjectAnimator.ofFloat(subButton2, "alpha", 1f, 0f) - val sub2Scale = ObjectAnimator.ofFloat(subButton2, "scaleX", 1f, 0f) - val sub2ScaleY = ObjectAnimator.ofFloat(subButton2, "scaleY", 1f, 0f) - - val animSet2 = AnimatorSet() - animSet2.playTogether(sub2TransX, sub2TransY, sub2Alpha, sub2Scale, sub2ScaleY) - animSet2.duration = 200 - - animSet1.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - subButton1.visibility = View.GONE - } - }) - - animSet2.addListener(object : AnimatorListenerAdapter() { - override fun onAnimationEnd(animation: Animator) { - subButton2.visibility = View.GONE - } - }) - - // 主按钮显示动画 - mainFloatButton.visibility = View.VISIBLE - mainFloatButton.animate() - .scaleX(1f) - .scaleY(1f) - .alpha(1f) - .setDuration(200) - .setStartDelay(100) - .setListener(null) - .start() - - animSet1.start() - animSet2.start() - } - - companion object { - /** - * 启动开始计重页面 - * @param context 上下文 - * @param maWbId 运单ID,默认为0(新增模式) - */ - @JvmStatic - fun startForAdd(context: Context, maWbId: Long = 0) { - val starter = Intent(context, GjcWeighingStartActivity::class.java) - .putExtra(Constant.Key.MAWB_ID, maWbId) - context.startActivity(starter) - } - } -} +package com.lukouguoji.gjc.activity + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.AnimatorSet +import android.animation.ObjectAnimator +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ActivityGjcWeighingStartBinding +import com.lukouguoji.gjc.viewModel.GjcWeighingStartViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.router.ARouterConstants +import com.lukouguoji.module_base.util.DeviceUtil + +/** + * 国际出港计重-开始计重页面 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_START) +class GjcWeighingStartActivity : + BaseBindingActivity() { + + private var isExpanded = false + + override fun layoutId() = R.layout.activity_gjc_weighing_start + + override fun viewModelClass() = GjcWeighingStartViewModel::class.java + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow(if (DeviceUtil.isPhone()) "开始计重" else "国际出港开始计重") + binding.viewModel = viewModel + + // 手机版专属:提交体携带托盘数量/托盘自重(平板不调用,请求体与改造前完全一致) + if (DeviceUtil.isPhone()) { + viewModel.initPhoneExtras() + } + + viewModel.initOnCreated(this, intent) + + setupFloatButtons() + } + + private fun setupFloatButtons() { + // 浮动按钮组仅平板布局存在(layout-sw600dp),手机布局无这些 id,直接跳过 + val mainFloatButton = binding.mainFloatButton ?: return + val maskView = binding.maskView ?: return + val subButton1 = binding.subButton1 ?: return + val subButton2 = binding.subButton2 ?: return + + // 主按钮点击事件 + mainFloatButton.setOnClickListener { + if (!isExpanded) { + expandButtons() + } + } + + // 遮罩层点击事件 + maskView.setOnClickListener { + collapseButtons() + } + + // 子按钮1点击事件 - 跳转到出港运抵页面 + subButton1.setOnClickListener { + com.alibaba.android.arouter.launcher.ARouter.getInstance() + .build(ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE) + .navigation() + collapseButtons() + } + + // 子按钮2点击事件 - 跳转到计重记录 + subButton2.setOnClickListener { + com.alibaba.android.arouter.launcher.ARouter.getInstance() + .build(ARouterConstants.ACTIVITY_URL_GJC_WEIGHING_RECORD_LIST) + .navigation() + collapseButtons() + } + } + + /** + * 展开子按钮(仅平板,手机布局无浮动按钮组) + */ + private fun expandButtons() { + val mainFloatButton = binding.mainFloatButton ?: return + val maskView = binding.maskView ?: return + val subButton1 = binding.subButton1 ?: return + val subButton2 = binding.subButton2 ?: return + + isExpanded = true + + // 显示遮罩层 + maskView.visibility = View.VISIBLE + maskView.alpha = 0f + maskView.animate().alpha(0.3f).setDuration(200).start() + + // 显示子按钮 + subButton1.visibility = View.VISIBLE + subButton2.visibility = View.VISIBLE + + // 子按钮1动画(向左上方移动: 左移15dp, 上移55dp) + val sub1TransX = ObjectAnimator.ofFloat(subButton1, "translationX", 0f, -5f) + val sub1TransY = ObjectAnimator.ofFloat(subButton1, "translationY", 0f, -25f) + val sub1Alpha = ObjectAnimator.ofFloat(subButton1, "alpha", 0f, 1f) + val sub1Scale = ObjectAnimator.ofFloat(subButton1, "scaleX", 0f, 1f) + val sub1ScaleY = ObjectAnimator.ofFloat(subButton1, "scaleY", 0f, 1f) + + val animSet1 = AnimatorSet() + animSet1.playTogether(sub1TransX, sub1TransY, sub1Alpha, sub1Scale, sub1ScaleY) + animSet1.duration = 200 + + // 子按钮2动画(向左下方移动: 左移55dp, 下移15dp) + val sub2TransX = ObjectAnimator.ofFloat(subButton2, "translationX", 0f, -25f) + val sub2TransY = ObjectAnimator.ofFloat(subButton2, "translationY", 0f, -5f) + val sub2Alpha = ObjectAnimator.ofFloat(subButton2, "alpha", 0f, 1f) + val sub2Scale = ObjectAnimator.ofFloat(subButton2, "scaleX", 0f, 1f) + val sub2ScaleY = ObjectAnimator.ofFloat(subButton2, "scaleY", 0f, 1f) + + val animSet2 = AnimatorSet() + animSet2.playTogether(sub2TransX, sub2TransY, sub2Alpha, sub2Scale, sub2ScaleY) + animSet2.duration = 200 + animSet2.startDelay = 50 + + // 主按钮隐藏动画 + mainFloatButton.animate() + .scaleX(0f) + .scaleY(0f) + .alpha(0f) + .setDuration(150) + .setListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + mainFloatButton.visibility = View.GONE + } + }) + .start() + + animSet1.start() + animSet2.start() + } + + /** + * 收起子按钮(仅平板,手机布局无浮动按钮组) + */ + private fun collapseButtons() { + val mainFloatButton = binding.mainFloatButton ?: return + val maskView = binding.maskView ?: return + val subButton1 = binding.subButton1 ?: return + val subButton2 = binding.subButton2 ?: return + + isExpanded = false + + // 隐藏遮罩层 + maskView.animate().alpha(0f).setDuration(200).withEndAction { + maskView.visibility = View.GONE + }.start() + + // 子按钮1动画(回到原位) + val sub1TransX = ObjectAnimator.ofFloat(subButton1, "translationX", subButton1.translationX, 0f) + val sub1TransY = ObjectAnimator.ofFloat(subButton1, "translationY", subButton1.translationY, 0f) + val sub1Alpha = ObjectAnimator.ofFloat(subButton1, "alpha", 1f, 0f) + val sub1Scale = ObjectAnimator.ofFloat(subButton1, "scaleX", 1f, 0f) + val sub1ScaleY = ObjectAnimator.ofFloat(subButton1, "scaleY", 1f, 0f) + + val animSet1 = AnimatorSet() + animSet1.playTogether(sub1TransX, sub1TransY, sub1Alpha, sub1Scale, sub1ScaleY) + animSet1.duration = 200 + + // 子按钮2动画(回到原位) + val sub2TransX = ObjectAnimator.ofFloat(subButton2, "translationX", subButton2.translationX, 0f) + val sub2TransY = ObjectAnimator.ofFloat(subButton2, "translationY", subButton2.translationY, 0f) + val sub2Alpha = ObjectAnimator.ofFloat(subButton2, "alpha", 1f, 0f) + val sub2Scale = ObjectAnimator.ofFloat(subButton2, "scaleX", 1f, 0f) + val sub2ScaleY = ObjectAnimator.ofFloat(subButton2, "scaleY", 1f, 0f) + + val animSet2 = AnimatorSet() + animSet2.playTogether(sub2TransX, sub2TransY, sub2Alpha, sub2Scale, sub2ScaleY) + animSet2.duration = 200 + + animSet1.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + subButton1.visibility = View.GONE + } + }) + + animSet2.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + subButton2.visibility = View.GONE + } + }) + + // 主按钮显示动画 + mainFloatButton.visibility = View.VISIBLE + mainFloatButton.animate() + .scaleX(1f) + .scaleY(1f) + .alpha(1f) + .setDuration(200) + .setStartDelay(100) + .setListener(null) + .start() + + animSet1.start() + animSet2.start() + } + + companion object { + /** + * 启动开始计重页面 + * @param context 上下文 + * @param maWbId 运单ID,默认为0(新增模式) + */ + @JvmStatic + fun startForAdd(context: Context, maWbId: Long = 0) { + val starter = Intent(context, GjcWeighingStartActivity::class.java) + .putExtra(Constant.Key.MAWB_ID, maWbId) + context.startActivity(starter) + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpArriveActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpArriveActivity.kt index ce5498f..41d7c1f 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpArriveActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpArriveActivity.kt @@ -1,177 +1,177 @@ -package com.lukouguoji.gjc.activity - -import android.app.Activity -import android.content.Intent -import android.os.Bundle -import androidx.databinding.ObservableBoolean -import com.alibaba.android.arouter.facade.annotation.Autowired -import com.alibaba.android.arouter.facade.annotation.Route -import com.alibaba.android.arouter.launcher.ARouter -import com.lukouguoji.gjc.R -import com.lukouguoji.gjc.databinding.ActivityIntExpArriveBinding -import com.lukouguoji.gjc.viewModel.IntExpArriveViewModel -import com.lukouguoji.module_base.base.BaseBindingActivity -import com.lukouguoji.module_base.bean.GjcHaWb -import com.lukouguoji.module_base.bean.GjcMaWb -import com.lukouguoji.module_base.common.Constant -import com.lukouguoji.module_base.common.ConstantEvent -import com.lukouguoji.module_base.impl.FlowBus -import com.lukouguoji.module_base.impl.observe -import com.lukouguoji.module_base.ktx.addOnItemClickListener -import com.lukouguoji.module_base.ktx.commonAdapter -import com.lukouguoji.module_base.router.ARouterConstants -import com.lukouguoji.module_base.util.DeviceUtil -import java.util.ArrayList - -/** - * 国际出港-出港运抵页面 - * - * 布局 id 不区分设备,平板/手机由资源限定符自动选择: - * layout-sw600dp/activity_int_exp_arrive.xml(平板) - * layout/activity_int_exp_arrive.xml(手机) - */ -@Route(path = ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE) -class IntExpArriveActivity : - BaseBindingActivity() { - - @JvmField - @Autowired - var wbNoParam: String? = null - - override fun layoutId() = R.layout.activity_int_exp_arrive - override fun viewModelClass() = IntExpArriveViewModel::class.java - - /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ - val filterPanelVisible = ObservableBoolean(false) - - /** 供 [com.lukouguoji.gjc.holder.IntExpArriveViewHolder] 绑定 item 布局的 viewModel 变量(父类 viewModel 为 protected) */ - val itemViewModel: IntExpArriveViewModel get() = viewModel - - override fun initOnCreate(savedInstanceState: Bundle?) { - // 注入 ARouter 参数 - ARouter.getInstance().inject(this) - - setBackArrow("国际出港运抵") - binding.viewModel = viewModel - binding.activity = this - - // 手机版专属数据:加载「代理」筛选下拉 - // 平板端不调用,查询链路与请求次数与改造前完全一致 - if (DeviceUtil.isPhone()) { - viewModel.initPhoneExtras() - } - - // 如果有传入运单号,自动填充并触发搜索 - if (!wbNoParam.isNullOrEmpty()) { - viewModel.waybillNo.value = wbNoParam - viewModel.searchClick() - } - - // 绑定分页 - viewModel.pageModel.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, this) - - // 设置item点击监听 - binding.rv.addOnItemClickListener(viewModel) - - // 监听刷新事件 - FlowBus.with(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { viewModel.onItemCheckChanged() } - - FlowBus.with(ConstantEvent.EVENT_REFRESH).observe(this) { - viewModel.refresh() - } - - // 初始加载数据(如果没有传入运单号,才执行初始加载) - if (wbNoParam.isNullOrEmpty()) { - viewModel.refresh() - } - } - - // ==================== 手机版专用交互(纯 UI,复用既有 ViewModel 字段与数据) ==================== - - /** - * 手机版 Tab 切换回调:PhoneStatusTab 已通过双向绑定写入 viewModel.currentTab, - * 这里触发 ViewModel 把适配器数据集替换为过滤后的子集(不发起新请求)。 - */ - fun onArriveTabChanged() { - viewModel.onTabChangedPhone() - } - - /** 卡片长按:展开操作浮层(View.OnLongClickListener 要求返回 Boolean) */ - fun showCardActionPhone(bean: GjcMaWb): Boolean { - bean.actionMenuVisible.set(true) - return true - } - - /** 点击浮层遮罩/空白处:收起操作浮层 */ - fun hideCardActionPhone(bean: GjcMaWb) { - bean.actionMenuVisible.set(false) - } - - /** 选择圈勾选状态变化后回调(由 ViewHolder 调用) */ - fun onItemCheckChanged() { - viewModel.onItemCheckChanged() - } - - /** 手机版筛选弹层显隐切换 */ - fun toggleFilterPanel() { - filterPanelVisible.set(!filterPanelVisible.get()) - } - - /** 手机版筛选:重置 */ - fun resetFilter() { - viewModel.flightDate.value = "" - viewModel.flightNo.value = "" - viewModel.agentCodePhone.value = "" - } - - /** 手机版筛选:确认 */ - fun confirmFilter() { - filterPanelVisible.set(false) - viewModel.searchClick() - } - - /** - * 进入「分单明细」页:直接传递该运单已加载的 haWbList,零新增请求。 - */ - fun openSubOrder(bean: GjcMaWb) { - val list = ArrayList(bean.haWbList.orEmpty()) - IntExpArriveSubOrderActivity.start(this, bean.wbNo.orEmpty(), list) - } - - /** - * 进入「回执」页(手机专属只读页):复用 haWbList[].response + arrivalOpDate,零新增请求。 - */ - fun openReceipt(bean: GjcMaWb) { - bean.actionMenuVisible.set(false) - val list = ArrayList(bean.haWbList.orEmpty()) - IntExpArriveReceiptActivity.start(this, bean.wbNo.orEmpty(), list) - } - - /** - * 进入「补充信息」页(手机专属新页):对该运单整个 haWbList 批量应用(参照 Pad 端国际进港 - * IntArrSupplementInfoViewModel 的批量复制模式)。后端暂无保存接口,见接口问题清单。 - */ - fun openSupplement(bean: GjcMaWb) { - bean.actionMenuVisible.set(false) - val list = ArrayList(bean.haWbList.orEmpty()) - IntExpArriveSupplementActivity.start(this, bean.wbNo.orEmpty(), list) - } - - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - when (requestCode) { - Constant.RequestCode.WAYBILL -> { - if (resultCode == Activity.RESULT_OK) { - viewModel.waybillNo.value = data?.getStringExtra(Constant.Result.CODED_CONTENT) - viewModel.searchClick() - } - } - Constant.RequestCode.CODE -> { - if (resultCode == Activity.RESULT_OK) { - viewModel.hno.value = data?.getStringExtra(Constant.Result.CODED_CONTENT) - viewModel.searchClick() - } - } - } - } -} +package com.lukouguoji.gjc.activity + +import android.app.Activity +import android.content.Intent +import android.os.Bundle +import androidx.databinding.ObservableBoolean +import com.alibaba.android.arouter.facade.annotation.Autowired +import com.alibaba.android.arouter.facade.annotation.Route +import com.alibaba.android.arouter.launcher.ARouter +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ActivityIntExpArriveBinding +import com.lukouguoji.gjc.viewModel.IntExpArriveViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.bean.GjcHaWb +import com.lukouguoji.module_base.bean.GjcMaWb +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.common.ConstantEvent +import com.lukouguoji.module_base.impl.FlowBus +import com.lukouguoji.module_base.impl.observe +import com.lukouguoji.module_base.ktx.addOnItemClickListener +import com.lukouguoji.module_base.ktx.commonAdapter +import com.lukouguoji.module_base.router.ARouterConstants +import com.lukouguoji.module_base.util.DeviceUtil +import java.util.ArrayList + +/** + * 国际出港-出港运抵页面 + * + * 布局 id 不区分设备,平板/手机由资源限定符自动选择: + * layout-sw600dp/activity_int_exp_arrive.xml(平板) + * layout/activity_int_exp_arrive.xml(手机) + */ +@Route(path = ARouterConstants.ACTIVITY_URL_INT_EXP_ARRIVE) +class IntExpArriveActivity : + BaseBindingActivity() { + + @JvmField + @Autowired + var wbNoParam: String? = null + + override fun layoutId() = R.layout.activity_int_exp_arrive + override fun viewModelClass() = IntExpArriveViewModel::class.java + + /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ + val filterPanelVisible = ObservableBoolean(false) + + /** 供 [com.lukouguoji.gjc.holder.IntExpArriveViewHolder] 绑定 item 布局的 viewModel 变量(父类 viewModel 为 protected) */ + val itemViewModel: IntExpArriveViewModel get() = viewModel + + override fun initOnCreate(savedInstanceState: Bundle?) { + // 注入 ARouter 参数 + ARouter.getInstance().inject(this) + + setBackArrow(if (DeviceUtil.isPhone()) "出港运抵" else "国际出港运抵") + binding.viewModel = viewModel + binding.activity = this + + // 手机版专属数据:加载「代理」筛选下拉 + // 平板端不调用,查询链路与请求次数与改造前完全一致 + if (DeviceUtil.isPhone()) { + viewModel.initPhoneExtras() + } + + // 如果有传入运单号,自动填充并触发搜索 + if (!wbNoParam.isNullOrEmpty()) { + viewModel.waybillNo.value = wbNoParam + viewModel.searchClick() + } + + // 绑定分页 + viewModel.pageModel.bindSmartRefreshLayout(binding.srl, binding.rv, viewModel, this) + + // 设置item点击监听 + binding.rv.addOnItemClickListener(viewModel) + + // 监听刷新事件 + FlowBus.with(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { viewModel.onItemCheckChanged() } + + FlowBus.with(ConstantEvent.EVENT_REFRESH).observe(this) { + viewModel.refresh() + } + + // 初始加载数据(如果没有传入运单号,才执行初始加载) + if (wbNoParam.isNullOrEmpty()) { + viewModel.refresh() + } + } + + // ==================== 手机版专用交互(纯 UI,复用既有 ViewModel 字段与数据) ==================== + + /** + * 手机版 Tab 切换回调:PhoneStatusTab 已通过双向绑定写入 viewModel.currentTab, + * 这里触发 ViewModel 把适配器数据集替换为过滤后的子集(不发起新请求)。 + */ + fun onArriveTabChanged() { + viewModel.onTabChangedPhone() + } + + /** 卡片长按:展开操作浮层(View.OnLongClickListener 要求返回 Boolean) */ + fun showCardActionPhone(bean: GjcMaWb): Boolean { + bean.actionMenuVisible.set(true) + return true + } + + /** 点击浮层遮罩/空白处:收起操作浮层 */ + fun hideCardActionPhone(bean: GjcMaWb) { + bean.actionMenuVisible.set(false) + } + + /** 选择圈勾选状态变化后回调(由 ViewHolder 调用) */ + fun onItemCheckChanged() { + viewModel.onItemCheckChanged() + } + + /** 手机版筛选弹层显隐切换 */ + fun toggleFilterPanel() { + filterPanelVisible.set(!filterPanelVisible.get()) + } + + /** 手机版筛选:重置 */ + fun resetFilter() { + viewModel.flightDate.value = "" + viewModel.flightNo.value = "" + viewModel.agentCodePhone.value = "" + } + + /** 手机版筛选:确认 */ + fun confirmFilter() { + filterPanelVisible.set(false) + viewModel.searchClick() + } + + /** + * 进入「分单明细」页:直接传递该运单已加载的 haWbList,零新增请求。 + */ + fun openSubOrder(bean: GjcMaWb) { + val list = ArrayList(bean.haWbList.orEmpty()) + IntExpArriveSubOrderActivity.start(this, bean.wbNo.orEmpty(), list) + } + + /** + * 进入「回执」页(手机专属只读页):复用 haWbList[].response + arrivalOpDate,零新增请求。 + */ + fun openReceipt(bean: GjcMaWb) { + bean.actionMenuVisible.set(false) + val list = ArrayList(bean.haWbList.orEmpty()) + IntExpArriveReceiptActivity.start(this, bean.wbNo.orEmpty(), list) + } + + /** + * 进入「补充信息」页(手机专属新页):对该运单整个 haWbList 批量应用(参照 Pad 端国际进港 + * IntArrSupplementInfoViewModel 的批量复制模式)。后端暂无保存接口,见接口问题清单。 + */ + fun openSupplement(bean: GjcMaWb) { + bean.actionMenuVisible.set(false) + val list = ArrayList(bean.haWbList.orEmpty()) + IntExpArriveSupplementActivity.start(this, bean.wbNo.orEmpty(), list) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + when (requestCode) { + Constant.RequestCode.WAYBILL -> { + if (resultCode == Activity.RESULT_OK) { + viewModel.waybillNo.value = data?.getStringExtra(Constant.Result.CODED_CONTENT) + viewModel.searchClick() + } + } + Constant.RequestCode.CODE -> { + if (resultCode == Activity.RESULT_OK) { + viewModel.hno.value = data?.getStringExtra(Constant.Result.CODED_CONTENT) + viewModel.searchClick() + } + } + } + } +} diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpOutHandoverActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpOutHandoverActivity.kt index 25e1f83..243ff95 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpOutHandoverActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/activity/IntExpOutHandoverActivity.kt @@ -35,7 +35,7 @@ class IntExpOutHandoverActivity : val filterPanelVisible = ObservableBoolean(false) override fun initOnCreate(savedInstanceState: Bundle?) { - setBackArrow("国际出港出库交接") + setBackArrow(if (DeviceUtil.isPhone()) "出库交接" else "国际出港出库交接") binding.viewModel = viewModel binding.activity = this diff --git a/module_gjc/src/main/java/com/lukouguoji/gjc/page/move/IntExpMoveActivity.kt b/module_gjc/src/main/java/com/lukouguoji/gjc/page/move/IntExpMoveActivity.kt index 26dc0a1..e78fcff 100644 --- a/module_gjc/src/main/java/com/lukouguoji/gjc/page/move/IntExpMoveActivity.kt +++ b/module_gjc/src/main/java/com/lukouguoji/gjc/page/move/IntExpMoveActivity.kt @@ -1,171 +1,171 @@ -package com.lukouguoji.gjc.page.move - -import android.app.Activity -import android.content.Context -import android.content.Intent -import android.os.Bundle -import androidx.databinding.ObservableBoolean -import com.alibaba.android.arouter.facade.annotation.Route -import com.lukouguoji.gjc.R -import com.lukouguoji.gjc.databinding.ActivityIntExpMoveBinding -import com.lukouguoji.gjc.viewModel.IntExpMoveViewModel -import com.lukouguoji.module_base.base.BaseBindingActivity -import com.lukouguoji.module_base.common.Constant -import com.lukouguoji.module_base.common.ConstantEvent -import com.lukouguoji.module_base.impl.FlowBus -import com.lukouguoji.module_base.impl.observe -import com.lukouguoji.module_base.ktx.addOnItemClickListener -import com.lukouguoji.module_base.ktx.showToast -import com.lukouguoji.module_base.model.ConfirmDialogModel -import com.lukouguoji.module_base.model.ScanModel -import com.lukouguoji.module_base.router.ARouterConstants -import com.lukouguoji.module_base.util.DeviceUtil - -/** - * 国际出港-出港移库 - */ -@Route(path = ARouterConstants.ACTIVITY_URL_INT_EXP_MOVE) -class IntExpMoveActivity : BaseBindingActivity() { - - // 布局 id 不区分设备,平板/手机由资源限定符自动选择: - // layout-sw600dp/activity_int_exp_move.xml(平板) / layout/activity_int_exp_move.xml(手机) - override fun layoutId() = R.layout.activity_int_exp_move - - override fun viewModelClass() = IntExpMoveViewModel::class.java - - /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ - val filterPanelVisible = ObservableBoolean(false) - - override fun initOnCreate(savedInstanceState: Bundle?) { - setBackArrow("国际出港移库") - binding.viewModel = viewModel - binding.activity = this - - // 手机版专属数据:默认「待移库」Tab、Tab 角标计数、特码下拉 - // 平板端不调用,查询链路与请求次数与改造前完全一致 - if (DeviceUtil.isPhone()) { - viewModel.initPhoneExtras() - } - - initRecyclerView() - initListeners() - observeData() - } - - /** - * 初始化RecyclerView - */ - private fun initRecyclerView() { - viewModel.pageModel.bindSmartRefreshLayout( - binding.srl, - binding.rv, - viewModel, - this - ) - binding.rv.addOnItemClickListener(viewModel) - } - - /** - * 初始化监听器 - */ - private fun initListeners() { - // 移库按钮:btnMove 只存在于平板变体(手机版底部条走 setOnActionClick),故判空 - binding.btnMove?.setOnClickListener { - showMoveConfirmDialog() - } - } - - /** - * 观察数据变化 - */ - private fun observeData() { - // 监听item选择变化事件,更新全选状态 - FlowBus.with(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { - viewModel.onItemCheckChanged() - } - - // 监听刷新事件 - FlowBus.with(ConstantEvent.EVENT_REFRESH).observe(this) { - viewModel.refresh() - } - - // 初始加载数据 - viewModel.refresh() - } - - /** - * 扫码运单号 - */ - fun scanWaybill() { - ScanModel.startScan(this, Constant.RequestCode.WAYBILL) - } - - // ==================== 手机版专用交互(复用既有 ViewModel 字段,无新增业务逻辑) ==================== - - /** - * 手机版筛选弹层显隐切换 - */ - fun toggleFilterPanel() { - filterPanelVisible.set(!filterPanelVisible.get()) - } - - /** - * 手机版筛选:重置 - * - * 只清空弹层内的三个条件(承运人 / 运单类型 / 特码),不影响 Tab 与顶部搜索框。 - */ - fun resetFilter() { - viewModel.by1.value = "" - viewModel.awbType.value = "" - viewModel.spCode.value = "" - } - - /** - * 手机版筛选:确定 - */ - fun confirmFilter() { - filterPanelVisible.set(false) - viewModel.searchClick() - } - - /** - * 显示移库确认对话框 - * - * 手机版底部操作条通过 XML 的 setOnActionClick 调用,故为 public。 - */ - fun showMoveConfirmDialog() { - val selectedItems = viewModel.getSelectedItems() - - if (selectedItems.isEmpty()) { - showToast("请至少选择一条运单") - return - } - - ConfirmDialogModel( - message = "确定要移库选中的 ${selectedItems.size} 条运单吗?", - title = "移库确认" - ) { - viewModel.submitMove() - }.show() - } - - /** - * 扫码回调 - */ - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == Constant.RequestCode.WAYBILL && resultCode == Activity.RESULT_OK) { - val code = data?.getStringExtra(Constant.Result.CODED_CONTENT) - viewModel.waybillNo.value = code - viewModel.searchClick() - } - } - - companion object { - @JvmStatic - fun start(context: Context) { - val starter = Intent(context, IntExpMoveActivity::class.java) - context.startActivity(starter) - } - } -} +package com.lukouguoji.gjc.page.move + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.os.Bundle +import androidx.databinding.ObservableBoolean +import com.alibaba.android.arouter.facade.annotation.Route +import com.lukouguoji.gjc.R +import com.lukouguoji.gjc.databinding.ActivityIntExpMoveBinding +import com.lukouguoji.gjc.viewModel.IntExpMoveViewModel +import com.lukouguoji.module_base.base.BaseBindingActivity +import com.lukouguoji.module_base.common.Constant +import com.lukouguoji.module_base.common.ConstantEvent +import com.lukouguoji.module_base.impl.FlowBus +import com.lukouguoji.module_base.impl.observe +import com.lukouguoji.module_base.ktx.addOnItemClickListener +import com.lukouguoji.module_base.ktx.showToast +import com.lukouguoji.module_base.model.ConfirmDialogModel +import com.lukouguoji.module_base.model.ScanModel +import com.lukouguoji.module_base.router.ARouterConstants +import com.lukouguoji.module_base.util.DeviceUtil + +/** + * 国际出港-出港移库 + */ +@Route(path = ARouterConstants.ACTIVITY_URL_INT_EXP_MOVE) +class IntExpMoveActivity : BaseBindingActivity() { + + // 布局 id 不区分设备,平板/手机由资源限定符自动选择: + // layout-sw600dp/activity_int_exp_move.xml(平板) / layout/activity_int_exp_move.xml(手机) + override fun layoutId() = R.layout.activity_int_exp_move + + override fun viewModelClass() = IntExpMoveViewModel::class.java + + /** 手机版筛选弹层显隐(仅 UI 状态,不涉及业务逻辑) */ + val filterPanelVisible = ObservableBoolean(false) + + override fun initOnCreate(savedInstanceState: Bundle?) { + setBackArrow(if (DeviceUtil.isPhone()) "出港移库" else "国际出港移库") + binding.viewModel = viewModel + binding.activity = this + + // 手机版专属数据:默认「待移库」Tab、Tab 角标计数、特码下拉 + // 平板端不调用,查询链路与请求次数与改造前完全一致 + if (DeviceUtil.isPhone()) { + viewModel.initPhoneExtras() + } + + initRecyclerView() + initListeners() + observeData() + } + + /** + * 初始化RecyclerView + */ + private fun initRecyclerView() { + viewModel.pageModel.bindSmartRefreshLayout( + binding.srl, + binding.rv, + viewModel, + this + ) + binding.rv.addOnItemClickListener(viewModel) + } + + /** + * 初始化监听器 + */ + private fun initListeners() { + // 移库按钮:btnMove 只存在于平板变体(手机版底部条走 setOnActionClick),故判空 + binding.btnMove?.setOnClickListener { + showMoveConfirmDialog() + } + } + + /** + * 观察数据变化 + */ + private fun observeData() { + // 监听item选择变化事件,更新全选状态 + FlowBus.with(ConstantEvent.EVENT_CHECK_CHANGED).observe(this) { + viewModel.onItemCheckChanged() + } + + // 监听刷新事件 + FlowBus.with(ConstantEvent.EVENT_REFRESH).observe(this) { + viewModel.refresh() + } + + // 初始加载数据 + viewModel.refresh() + } + + /** + * 扫码运单号 + */ + fun scanWaybill() { + ScanModel.startScan(this, Constant.RequestCode.WAYBILL) + } + + // ==================== 手机版专用交互(复用既有 ViewModel 字段,无新增业务逻辑) ==================== + + /** + * 手机版筛选弹层显隐切换 + */ + fun toggleFilterPanel() { + filterPanelVisible.set(!filterPanelVisible.get()) + } + + /** + * 手机版筛选:重置 + * + * 只清空弹层内的三个条件(承运人 / 运单类型 / 特码),不影响 Tab 与顶部搜索框。 + */ + fun resetFilter() { + viewModel.by1.value = "" + viewModel.awbType.value = "" + viewModel.spCode.value = "" + } + + /** + * 手机版筛选:确定 + */ + fun confirmFilter() { + filterPanelVisible.set(false) + viewModel.searchClick() + } + + /** + * 显示移库确认对话框 + * + * 手机版底部操作条通过 XML 的 setOnActionClick 调用,故为 public。 + */ + fun showMoveConfirmDialog() { + val selectedItems = viewModel.getSelectedItems() + + if (selectedItems.isEmpty()) { + showToast("请至少选择一条运单") + return + } + + ConfirmDialogModel( + message = "确定要移库选中的 ${selectedItems.size} 条运单吗?", + title = "移库确认" + ) { + viewModel.submitMove() + }.show() + } + + /** + * 扫码回调 + */ + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (requestCode == Constant.RequestCode.WAYBILL && resultCode == Activity.RESULT_OK) { + val code = data?.getStringExtra(Constant.Result.CODED_CONTENT) + viewModel.waybillNo.value = code + viewModel.searchClick() + } + } + + companion object { + @JvmStatic + fun start(context: Context) { + val starter = Intent(context, IntExpMoveActivity::class.java) + context.startActivity(starter) + } + } +} diff --git a/module_gjc/src/main/res/layout/item_gjc_weighing.xml b/module_gjc/src/main/res/layout/item_gjc_weighing.xml index 12b55aa..643b6dd 100644 --- a/module_gjc/src/main/res/layout/item_gjc_weighing.xml +++ b/module_gjc/src/main/res/layout/item_gjc_weighing.xml @@ -75,23 +75,51 @@ android:layout_marginTop="12dp" android:orientation="horizontal"> - + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + + + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + + @@ -102,23 +130,54 @@ android:layout_marginTop="8dp" android:orientation="horizontal"> - + android:gravity="center_vertical" + android:orientation="horizontal"> - + + + + + + + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + + diff --git a/module_gjc/src/main/res/layout/item_gjc_weighing_record.xml b/module_gjc/src/main/res/layout/item_gjc_weighing_record.xml index 8f23284..07fe776 100644 --- a/module_gjc/src/main/res/layout/item_gjc_weighing_record.xml +++ b/module_gjc/src/main/res/layout/item_gjc_weighing_record.xml @@ -56,14 +56,28 @@ - + android:gravity="center_vertical" + android:orientation="horizontal"> + + + + + +