From 3b544b04a28ce67f38247cf7d5f32c4fb1a87651 Mon Sep 17 00:00:00 2001 From: llllon Date: Fri, 26 Sep 2025 16:25:21 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E9=98=B2=E6=B0=B4=E6=B6=82=E6=96=99?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=202=E3=80=81=E5=AE=9A=E6=97=B6=E5=99=A8?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=BA=94=E6=94=B6=E6=98=8E=E7=BB=86=E9=94=99?= =?UTF-8?q?=E8=AF=AF=203=E3=80=81=E9=94=80=E5=94=AEBI=E6=B1=87=E6=80=BB?= =?UTF-8?q?=E9=94=80=E9=87=8F=E9=94=80=E9=A2=9D=E8=BF=87=E6=BB=A4=E9=98=B2?= =?UTF-8?q?=E6=B0=B4=E6=B6=82=E6=96=99=E5=8F=96=E5=80=BC=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datalinkup/job/SaleDataLinkUpJob.class | Bin 6864 -> 3568 bytes .../service/impl/SaleCountDimensionImpl.class | Bin 40776 -> 40893 bytes .../impl/SaleDataSyncServiceImpl.class | Bin 40964 -> 43008 bytes .../compileJava/previous-compilation-data.bin | Bin 9396131 -> 9396147 bytes .../WaterproofPaintAccountsReceivableJob.java | 735 +++++++++++------- .../service/impl/SaleCountDimensionImpl.java | 4 +- .../service/impl/SaleDataSyncServiceImpl.java | 105 ++- 7 files changed, 546 insertions(+), 298 deletions(-) diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/job/SaleDataLinkUpJob.class b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/job/SaleDataLinkUpJob.class index 010f8f81d95252372c6bc2cb3142c2016b460814..1c753de1ae15e99302413f1e953a07a0275c38b8 100644 GIT binary patch delta 977 zcmYk4$x~EU6vltIfp;ITA0@W7v6UV`2_i-?1P3BG#Q_BkLPXF+AJ`7ib~kiuoN+eJ znrl+2a^=EgmkQ~sIHaOkxJYH?!mZ`Xg&WKK1BvH>W#v`fdxm?@_kH)A_q6HF%+bI9 zefS7igmI{3ouK0;E5+3gTzk7lpKJ_a>Inv|KZo|(IWHHBDF zQy^B>mG=gQI=pPR*Plvi_A8v#hX#__{Ju;&XZozhqG~=Y+_03gW-(i_&|I=B%#+|` zbHXky*Q8xCWHrMsBjn6;U75(c9N?hB>gww4NwkRb>ek7Zw|;i{nnQ{j(^(cbEw)p( zn8PkdIO=kYz9Lc@>&%E>5mBWm8UTF8egs&7V_i5}KRxg7!>i=s;HCwx!d_kyR-#mrLdp zKg?-2zl3AP2_G)uTSfJF^kcX#8kdPHs$|VT8YfdJ5?^{LdyRP=p4K==a+X9;L9OiW zxL?9t>LgOk<0BbwjksenYg=;Pn?=)7tv^xQY(=c!nDLOA(5!#OiRg&+fQll1C)(== z_lP|n6ObxWGM|V5_;l+Dnb`FD(Qe81Nq!5%^l+T5(uiKZW81ip-8i&~==s!(z)m4) zU;$e0P3L18#T%9feL|C*il}#jeQ%-s>q?|vW3f~ODCay&XqKl(r212qijFGsqqNXU z3CpBBA%_!W%ioi&5Q+(q6#}wSZp8`wCweVST(e3O&=hMwv{9N!HJ{0)V&RTTX7xmq vCF764|4Kvg`y>iDV-hI-*ZQc?uaRVcwW1n%x#9{pxGIW0i3Oj2Sp#nY<=?1) literal 6864 zcmcIp33yc175;CQd6PE}h{NUx+5u4(fkC0737||8ATS}ogw@*kGIPTO7C*x7l&K9a|k3iaQj1TE0Ic5w=OV&)V@hJGRUIop#(MhwgS#>irJv#1~ZT z!UM9kTfu`0zNlghHapwc{}b`&4`tk2{dS zLkjjQctXX+*lfp>DyHEn+4-6sos#~5T+l%~y6iY4*TiPG9fuV>tzr(IaYEo(N%su} z&#Ca@n+m?A;wX+O__lz}S3iG#%`yR}FB)t0#6vAJ)_Hu<)>b1{$=O-KNH8%+pm@T> z6#^wy(Pl$nh%Xp17AM0^Myx?^3UP$Y0X?)rj|F8vJy?=h8;lFg_64G0kG?V9uIq76 zGH%2?dV71^(-dh6dz$rx9tuXbO3s#}e0iI9p@R1f!9vXe425N>oZEOJjPZmDHCFP_7Y41QQ(|iZzx=PKqpQiVBQP z@dpybk4IY)o~HINwT^m>NGsRx@z#^FIIOn|OesjpWrxXXuCYmv8=hs+jdglExg23V zD0OZLw$ec5zIFNr-IGiNLmpo+o*;oryQH+?{BX`iU0aSA4s-H64avATGx+%l6V#3g(DiC8ewN;W~erNx;OHJbuPyEFjjD9$vp zfcs3_Ku-yAAzWy@BNFf%u?@ihk$nT)5xR(E@C3u{p^QuTvq-fZr$U3{$#7VYb!71C zKM;NnSXzWLPKT_DCL@XJVAzPnX$gTv?^jGNP+G)@+|cQ0?+c$9mQ9sAKC7UU<@nsm&mNLJzdjoy{zx;5!PQSMUO3 zCgZF!rb2qSsaYSF&K={X2~?xXLP4PJgMj7vJ$L+l;^jNIhWS_^aOv#ykGtpamYzMg z_ujha#O|$c+_|Oa&V9XiJ>GlAzMgGcdmnrFcz1WtZM)rl)CykI@DjeO;CmXrj~@t( z_SQGnEN}EK_SQ94&uy6Nt6jWk`I1Ke!ubtL)+l&c!z*}|=a%2UdZl|d8z~tYeuy6l zj5pVn&FJywHcv>NTs)D2Oz2CKMyzA*l3EQd__2nc;HMgXhMx;e>(j{Hvu|tfE!)nh zxxnRFmi#5}zqxlych9yPdv_k`*|{TSfy}Bk`~ttU0;HuCVoDh@rIZEWHT;S(;EhHT z@kC5-uQL*Bqs{RlHvGCAzv1h*<=CX*cQ~$~M?)`OS8zhZ8~DA3kKj!PS=MJ6@!Y?G zIYj@+(eMZSQNy3`mWDs$FB<-eziIfpeEb7%YxpPL7MR&(Aop0=T z>iEG!Zymnxy3KDL-uim?_THVldUJ-QXZ%ZGj=#oNQ`O-1E}HLm&s$bs=Pv9btNe|t z{JzEoYuxjf)h}P-_O3QrXr}BrSl_gc=c$5!YdDGj2wc?9U(5=CV}*`&9*c#jt@)Y9 zqSR8ufANlncX3Lfrq4^R+dL&FHjW?Ma{TG-JzMXdV)Zp|t<_kT4Sz{M6G9ZR-0J(0 zh=ozC82wzw;&%Ntvg%<)$Y>!j-75QZ^m!7q$-&BEO$Y_Oyf3rn7Al%379~S$qSP*I znowwHVHaiG99i8Ks2nqg2D7!Ks~ni87c5p4p=!b*G=VXNTp=Daewzc(Onq-A}n}7W7vy z;wjf^B)s*^f&v##nApGQ$P%YgCh2%6k3B79hKhyxdYNA7p@sB1lbpWPOksAtx!LTp z*eL*IS#&C%EAtkS6UU}j9utt@PA)lXW@&d0o+Zmzc`xyHWUBV@Y0=rT-O89b>B()Q zzH>t%0hg7fDpkD8+FI5ZDvMcfTl(fS)JkaTAotD2TyE%Lfl)a+rbcBA&&f(v3=)I; z?R}pa)~Ki!L+Bp~L%NeY2c{(%F%L%1l9 zR>{F2{HQ$mv{j-p)^MeXsCoFDm!oGIBST1-X;u~T=Ft9djRH$3(k~lMMPOF%!3ZUl4NttN_d6$&A z!@}ZET`;X%kshLPxkP~l1;{M`eJ z@q`{p$Otm8`vQ~R+qeyDW6_QB!;SgR}^NZyq=>V5A`2If3p4J`{Ru`kMB5CH&%Ca&PSsobq&dRbo+3su<@lme zekfw4QyYmGF;l3)RlaCdC5@M=co*oA=8zE|mtw56I6>OhmXRFB242IhbToY{xf1=nE_|qnknRe5H^xx<*orcjy$k0PUv;Tn7$BRVB80jiAM>;Vf)f(T4iF-~xD+Nz-m629H#&_YO5;!LpKaD8|F;xmUitQ5H zLvh4Pi`ybwrnqSpS~o7HT9;G|at(4$cWKV)otV*y51XsKG~MsQ%wo7oD0)yQE|Wqp zx6a6c3hRKYG(}n|XJ%Pv_MEz2j?FfWwFeU`Y|_S89Kw}Ag~BP9;<9yNZZW#yT`fBY zP<3QKH+rntD<0)X@DkG{9>FAT|9E~PpMY{qgp2*Ln9Sd)sGuKt`DMKpm(V$;V-;qg z2{RGGWr*Q&T#wnfjYvCi1sz#d_3>8?Z#&j-}#$EEBuXAogMnHC!R~VWl{PRpKaCi9!A2%Olit z8T@b%%|HW|V-T?;Sb>#v>ssQj!fHDEQn3na$fsb3aPkg+HCOq7D8om|TSl#Rp^`5ymbF`XvkJG<*+^yFYp`4RSc7I@f=#Q7Tip72eFRU9Lqp!qisqN zrbTD)ozf(d(IlGDq@7qP`Rl=dPnft-;>O6?2>U7Qg+oELg1CYr1tkh>3hWAa4QJP_ zV2r|lnDELxiOrK3dJ;wNV6r)%Jc*l5(F|nh&ktVx=3Iac6e81ww_KGc5L+^3$kZWI z#;{2Yf@4tm8h;c@$sUvxKg#i9O9q*3$sohfL36@X-G<`9#aGf$xHglD#+ax;nX~#J zYMz8D(-A*=^O;IV=Mwrl_KI-57{Rv+A%=-_#BloJ4)&d#xra3O;y!$yd(Y_pAKP4Y ACIA2c diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.class b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.class index 2432cf19291453acd05cd06a5269d457fcad5a80..cd04e0f5fd0a733637cfb86e605f5e72bb758756 100644 GIT binary patch delta 15682 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 Qa}T?%FZbkLHqDU#1H7gX<^TWy delta 15568 zcmb_j2VfLM_kU&YZgO`?E|&tA&|4q`5CQ>04NV|)q$7y*-bF+?KMNoz#YF`~#YQZk zKqMp}Qlwe1pn#|-qWFoui=gEHX7}!L6x-(?bF;IvQ{KLP@At}#+jr1`7by7h`K>Pi zKx3o38>*8>k=G4*6zhiL6c+tSI|X8T~yLVWkpr=;HrwM>1(jMi)y$bjne%9R9iP?x~PsDDpFlV^;~p? zqWX#&xF}0g)6k7Asgawqsj;FaZfZ(7dPp-x&Gof~qL%t$D-SNA)_y>0@1YKKr5}j$ z{J^>}sE3<+QZN0Ww<}0jDe9xA?yIPu9~{))4^G|Br3*zp6b*6FP&ed~N6&hV2baeq-<^q7ktcf%dz@k5MoUK*Eb zqVg3zp@%=|fo1fRi=Nikb-Gv|RP>CZXBBNww9!qQs6b(7Mb9bPtf)}Y7DYvhiv8f$ zT=ZxLdUX*?J^T=-+v4@DPZtTAv%3|&sA!L(y^8iJ+OOzy|(c6j+D>|a+sG@fi9aHqKCg?py?<+d4=mSL`DmtO)BZVCmomBL( zqE8f^QuL{!|N0?Olar(=N!CS*Cg)2lsoNr->+VIcICp zWc^QZdBqhJS5#a{ab?9-6jxPTO>uQmAQpv-Wl^{)nx?9HvTC}hu4k;FXRM>RuHt%% zuTWfHaRWEL##w#{rt61|w5TjoobBeu+(gse)DJZ&PZWxqi)wKTKh)w@ibVl4^t`oo zkx4y7y10XjuN2AVj*2@e?yNXZ)6zv3U3Jk-ad*W%6!-K)9jdK0VVVFF_ZHpY@>ePD zqqwh|`*D944^TW%zs?}VgI#>J`Ma?ihnTAz<;o33NN&@8X!|}x+x2TVw0p01?RyQ) zYdf^#K!x244ml<`JlD8*7()3;BWLw6;}QY|*Lt2oeA-NiU2k0L;^76mWA8#7QP3m) z0Tt+v0}zZhc~|!K@<=@4Xu17 z8Nokp*mc9|&73iILcO-bCXAdkV%Rh~V_wqcR@0E!cn4YwOGH8K0 zCaqSlJ9wd&7xA4kxp|~FLOwRCMl0dzenZwm=90M<#8W=j8MV6xk<9Q zt3u`2wVdzeCxpxVBtK<-Q(>BVn%8NztvAP3%(gUs z&jDBVZZ8BJ;FrAoGQWb5ZZ>aM(afmfRTb6`L~1v zZ_Dqn{Eo=)sQliM-!b{UTQIEVSoS>4?%QbKWayXj`$~RaEB;1S=J(9&8fL3+`8zM)!QU4=*KjNP zevs!s%I_!n{jB&Gb8hxngU|4<1z%)$!g73;&w2Sbo*|Eam*08$mBc#@PzDzCXfg{M zlEKO_5HM4Itz3q~Yd8&;*HA``^mF?}l5wWt@fuzuRvB?ZhY@d{Yg#kYCyx_+_?}$+ zK0N9*67?7HS=u&X*rd_*+D)E$?SzqDBZ+@CyXUOvkjzhc4btC#GfzeE_P(ln+q~|* zuI!fEwY{vJE~1m3u8b6~QHJMuvA~#r<(p!GLBr z5SKH`7aVD^1DzF&iUK)iZtEoT*;Wp$WNvO%h?UI=t?L?95Sqw?L~~_}MDw9ePSe-Z zVP4bPV^l?`ZtiH6V$R8pH#zr|ubLPXqq;5xpsN_^1!r={8P#g)dM#aK=t3Z|ijk=c zagwSSb#+nCoY&zK-xa!AUl$E@k!9X+r7jxL%Z z{9v~1*r?!KCpY?<>!udEXsL@<1<82{v-x4P{c-S%}`-T0Mm{8Bf5p&LKfZKrkHe|6iZy6qF) zc2c)}s3q&TZhIHs^WqUaYIf{V3%eFf>#+rmZu;B2(X+g{u7@&v^~wmg0WYL#%oppL zitVujAYLhTf+KR@G3tK5+;@t)pCk93qwZJAeO~E3c9Hw8QTN^CzI)Vt54rCd#9r3I zf}hs)D(n*`0Q*XZeiz&~kY{4Fq#P){>w$>3Tpbx(05?j7aFCQvtFasomb%yOfLG%X zxkDU^*Vu#cD=@$TVBXOC91b$CyXw}U?%xqy&=NZ0FuYctyI>0r7m67ULJE$MngP3^ zGLFPi(gyHJXkJ|#jbp5}KEbg#PAC~K&y&IR8~9yt+?{X^2AqY4ZCsF6Ssse{v&nFN zD~lup@Lihv&puKprJaxfm z^f>-Uo+|i(R%wDD1}o7-yjA+SF^dM`Z8Dz+v#B56j`P5at*9H$$KV2p#XIcp5u$V< z_(F>51-NRd{x1Re!X zq&=t~xNwOJnuID=9iRltKzyXz<$Iwt=elsI?!6z9{$_6%bkIxLf9)U-;2fMR0XM|` zoe2Pbleaw!ts07SiHD`7t6=Ql3L;SEf}uZXdBRjEC$b%|-tGB_-rM0k(K*#r+z~Nu*+z!5tZa>UPlKKmwda?}MZkCL!*m;Lv{wso=IVsY#E0AI|2(7d`kiy~m zi-8nJxV|Tl;tbdK22xz%`aW~as5+Iu2)GO3x>eAk2yXE254im|7Qs!$FxP+_uV%pk zvv5>xe97!Gw1JOz^Ik{;Lz^h93wdU>(c6Oy@K?dbv$PI>qZjaZI*287jDSuN(l^BH z7ca5`IXHuyoJ}rnLyEhRoBNZ8N07u<6vsDFJl{-yUO$LBqe%quh(zf3sioyVmm=!vo;mmLu4dx0IX zXV=Cgv1+CBknh4w>+czDSiG+OVLSLIQ)*nw{UgVf zE9Sf7D&ec_by<2u%&* zXqtvoXgV&W8EDc>e1xvUbuC zuB2OO0L`OeG@nM$LYhE}^A$Fil)i%ccwG5^P-#!frtk?ff}lAD*xj*C}@PX-jb>BU`GtbR?{}QVUz{BVom* zf+)Ss5Ky%j6I&fx%+gkCEv>Eg3X33Uo9N9D^M|TA{~`;0flmGo3ASrjA}A`=kQZ61 zJt0-r-rwc)aEK^k3Dkv{KN++9Q(80MxRg9}>5$vc-88 z8($DsbOPz2WaLKdRs`>L%h2{+eldmcevT0^%+#r=gO1xO{6WB(Sq!NLXf^z>Sn}qO zQAgSe;Y5DPE4uL`t5M$JWIlAwk^B?H)F}qZnB_x4jzjnOB;Y893IYR0A(Yz+r_3c& zE8|IX3-YXNZfp{(^BiQ+W@t@YpfeRgFDiyUv<-&RJ{V5>VH7Z9S;tM7|0T@_&MQ?6OtegH;Z{P zU>10TSSVqj1C~HpD>QUSWYH?@bqagzkW(`%B)(F!olX)DcncPR?R4r8)t-2b2(mUE zoj{$3@-8e6dtZ%9B>0K)D6v?AmLR14rbCuA?T3l2sd`Bd+^Xc$ZNulKlz7>3qkOnT zVb@yC*iSQs)ADUN+wlK4$5A`ra9I9YX72$;o!&+8S+)hkr<0vUkYOQlKBU{<^>fR! zGw+#K)|@;&Dfx>Cs(+~g{VQF3ZD!6cYi^hx=l%vD$DBDH zcmv*In2#X21J1VK`lkY(;XudXK)nC389TER9x<<;QWt90)H{r&n##}B&X6+E=Q(#eD`uidYmg+BKVoO)al}Y=`?^7nn@ZUsPhj_JQjj(Kh}r$ zE$9{?hPNz8PQaRQ%8vQPWQAgWY8{UG1@=QRKgQrf3#Mb?3CS*Pmqpwns3$FK_P~cC z`8t62YOx86bWo~VekJ!JHLV(g3R2V3&GIqsv$6z+d=k@wY0(U7X;}cL1<%?5xa1?m zS<%0ePvNnm{}?L>YbaZlHlY&ohscuvK19kQAth)}r@b$2T5iR=Lb2C69eXter-oP2 z9?Sa?mn#zDx3K-L=ts8eh4L!rVTA504H1|>4=2Jfo>wB#vlWVCaj0Af0xjr=N|AC z_e8zl_r>Pi58F%jyc-V);?+D5NAn=OjtArId^IlTA^0c{#Z7z-?&4v1 zkgvt}csPE>Bk(64B_ZBu3Dd?>Z5~f8cmfUNi8PBRQIIFoEj*1D@^re7XHdR`dz<(= z+9US|`Fc9avzd7gJNYJ#k!_3s2L&)Bb$2OZ*nsg~1TeD1$J1e*51WhMrvtYH%n)zS zN)l3j1TZ#50OPI*V0iFc7%*r^7%-?$2ry0rsYVzvI5mtIQVRiw)IxwEwGdzkQ0laz z0ER%QPAh7_*c1Vb+bxe#1I8^8zzALh7&f6AFoHIH8Zk~-q-eyjr?UY=PZt6VTm$}p z0~n(&0~i7hb|NpYYC;L5>-6u1V00;DM0tyOKrYA=e9_?XPlvJ|8q}y)y+m@y|8)4j zUD;kZD4DYmPW~;JZ1j&{Qg--kXT~{KOo&dL_Z65-L~jHqD;bFx8%D}YfHD!|%u~UZ zMtmXq%=DY@Hu)W$qXs^1}Lk417?;7-AtrO=%3f|k5k@MZ~I!zPU6t0l>>R`4bt4)7Cjke`IZ{1kk^8{m81h%PR`1bz;acr(`G zE!cpIuqPJ>aUgHS;k*qe@bfs6x8rU60xsqq_<-z*uH#*}jd$aIei0Az9z4l=@f%4G zAs>*G(M#ftyiASx73##ViX(E6Ch}{7J+IR;euEz6H)%5;qV4<^?UZ!V0X|BH`5ijN z$LL#rmx+(EhlB5PG9TyG{2{mHkGKP$M?Ng~k2{30D4BCZSTvHpvmzp=qyb*VT|%l${El4~ zJ}F5BEXSbsXkuV5Ewcd1Eju8KEr9YwJQ|z&h4KzI&5OmOv&qw`W_voFKGoA{e6o{B zFKCCR`5!wpqwR!o@B$A5Vr@4@HZN?y=9)`ksvv?=C6b1*QptZj#~(R2Rwh{w3+g16 z)$5|QFZ6MChm}_?6BbsIk8+!(L}eq&E4mx_6WvXX_Ht@k!AK&eIk%g4&#P&x^b7O4 zV>vT!el<^dQQx?b`nH&_)i*v6U#h-3KP&2MPM^OiSRs&5jIzz0h?R=4auHU^Nt712 z0tE}I3O-;pl4li)uzDy>bzIWRNdXm5Td{^LlWfhE9!R#rq}qXGmPo1yev~Y8N@$vz z8dqxRBICk*SD8S(`PhP{F|`?XVrC)MF+W|<0_&R9?wEx2O!JQVc!i0#S|Ja%fgZxM z(}FOc3&MOQ2=k2~%(sFtKMKNpCkXRB4B;PO82ZYEaCI8oJ(M} zME#G+v4nL7!E*+~Hp2;f4F#_ov2e(UgTqEVyleR2q>%_;7y&3TQZdOW7sLuid8}+y zz-*%uwlb<>N240{G-}`!BOPZOHSrFk7CvEQ;6|f1ZZk4*zflKYHtOO*qdp!r8sL{k z7M?L05*Upr)@V$rMk`7;aw*GbL!FGa)Ys@tGmSi&YjmOcMps&Gbf?FS9`uaSleQSa zUbN5XO>Y@j(MLufI&Ji&FO7lpqcMol7|aRA)pBHE2-lVS#>O?AYYgL_#u ztGySNL~|v#t>G(`=EJq9_rlU>HFU)nrBBVMnSd ziTc^%&Gn>;sCUo&a8j^H17oaYDsQ)T&*CtN23tF2@mdEXz<65(7;lRJ<83xD21Vdz zM38ZE2pLClg%C2{F46Hz__C<=5=qi)j8w3kzQtE$A3X-P$=2|z^3*K}(@hpcdIYbZ zwII@KL1ZsU;M?3?ByVo>K-X*@9E4z*(3>xm&tSjrVzDar`>u(+@590!``s1^zDh0y z_k!<_5wuzfOtg1>F9tt+&2nC1T_`#0-@y??JP%?Izdpk~y9mm3-k=M!bB@J8PMNP=wamB2Cx{39yztT)geUi5y2wZ(lWB>tnRmY5GM zE|V1%ox3i6eMu%<5F5+!F75Q0rx#ZU`T}x-su1EN?U~~UI0P|$0f&;mLXh|{PSS)} ze<#G|I0MdrqYxXcf{JxEL5+a35aJ6Vy%_E!=ofH0q+eEk$?-ZHbPR4C8)=}E9L6L$ z!8I9TjVX|5OqKlDbf{>|fa=CfsBg@IWme#RUaX3Vu*9DQa4V0c)Kr1pTw zx?~ij_Mp^AbYYN{H)K)5zWAnfwxpsU!y&0TB&Aam-;$cs(gd9jwEM4-1ffm`R@5J? z8Mri;YlxiaKlvPD<@Fyxb=i;CEIaIT>(f3uL2T|?m1t$jtg|pi2aC=Wou-j~?+Cc* ze}u=RhB8VH3Wd_jjiisJ+>?=rb?rSC&7r7+HAZ`DGEJs*!}rBY1DQe&9EGN65Sk*W zWR8ZiGkfs_?V=`7kqPA3QfPu4Nh0aVeKNjLB4$gza4R+jxOkq1QS)LUN;!Wo)d#^~$+hzu$l?d1=xb=dCyqBy+*>m!(Or^0b|UFANu|r5 zs8xx~VKs>{4mC-uypSC43Na@7<219$xQHkGK-8M0A4iUfg{Ek)KTe)3rJ1Ye*at2{ z-jLTtUc?d^zCUUrUzm95;{b|ltz|~epIQ78NsHogi@)Hq99{c=;Br$TI7hhLOt{=M ziqL<-WjR>)_qp68YRytE%K^QA%H`~+i7v}!Ir(=fm+91BaQW;14=&S3vVU|^{F;wt zN9Cg^LjMJq<}#g#TCT3!%W2ZT&*jEZ%qiuvoJ#$tTy7LK(PgvCTp%rc7Gc`1=UmVtbQ%o&5M&P zs_dIs20m6FwJK-3Ru;C(Vc{^RO0iW=&|Ju=i!GR(Gqy(kD|y7VV(#)KIr9W$$=RM# zhWrb8lvB_l4*syP5m(_Z(56D~u8zjg4LlgX=)>|NEX}z2Q zP_R_AdYMJc|DyHsKV+)N!S=QmYyedCS1H041>o3*EeA-PzXe+tKn?pQcS}&;<>+(o zXnCMEDdmNfR+1TSE&o$!j65T98~QxI8_;NPbTK-}|EpJ1hOC9Ua_9*ugL0*38){4K ztXfCvM4dymE}>di>PFo|{rX4x1qVbr4x~ZW0Ue3JyX-q4Xq_Qat=4M?pucLb0Z_$ Qa9gXbE4SnJR-az~2i*hJW&i*H diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.class b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.class index 45c0c94bcde01afacfb5f67005392dbfa071f73c..fda278adbdc337e75c0b21692790ba3a94847c07 100644 GIT binary patch delta 15362 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 bo$l4?KAqO;^ckH#tJD2DeNLx!I<5bI_-X_d delta 13750 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 Ny9w_!;Vu*I{vX7HAO8RV diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin index 55c4f8aae0dbcd5b0a3c3d91015c34d01a0acd74..f956245b799228ec24856dd2d52c51c4de893316 100644 GIT binary patch delta 874 zcmZY4ZA{Do0LStBcbEI?ivM+~h#s!4l9ZHkx||+}9!?!SkkSLG&|QkiLv=@ol!u%3 zCYz==HnWlKX4A|lVI#v9qZbit7;nrxjjz|e_`Le5uNHjPfDUHHsyGnGZL;-G)LjiZpfYPNB#l~{U zuRA$>q~zD*w;!&w-|Xv3adp>-85gIGa!iOb;Q5|-q64YbKvXBO7pvu#33AO$O7#44mB4e7|hYL}{IjeJNd z)V-9O#$U)T|RbI8NXsI&lhJ=ynb3PQTIr E15Ru`mH+?% delta 855 zcmWm8drZs$0KoCCJKa_2mr_!cyN(`*lA`X&$qdG5U#1}e9-51?Sr9aEdOywj#ZR5DxB20qIE!C<*D*jr$>mU zq;iErl%d!`CzGqi-ULOJ+}YLPe~L1Q)g>}!isB`H-hI6@8uX21zbyHcg9%o8kz zE7Q*A7hNNU@40CYd)0PJp-Q|V+_F8d{1v15eRDEJ?|pInoiwU)h6`LV6SFWIZV>FF zD)+2t;aP1^k!?tCOYoaW3{5NjEXBvUV-7sviMjBy$H#d;T_yR{d1D@YFdx3~!vZXX zKLW4_YG@D$Ef!-5f)I=lghGdVzK`PRaj;+{+?Z`kT zvXG4(*ohqEVi$HJ4<_tEKFrvQ0_;N}icpLa?8gC=q73Dzz(G`^3e|R9>>=^3EUdl4 zqo!4w@~A;A4x= '" + startDateFormat + "' "); - LOGGER.info("已删除目标表[{}]中{}条数据(时间范围: {} )", - section.getTargetTable(), delete, startDateFormat); + // 清理目标表数据 + String startDateFormat = startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 00:00:00"; + int deleteCount = DBSql.update("DELETE FROM " + section.getTargetTable() + " WHERE RQ >= ?", new String[]{startDateFormat}); + LOGGER.info("已删除目标表[{}]中{}条数据", section.getTargetTable(), deleteCount); - // 查询销售组织和客户分组信息 - List maps = DBSql.getMaps("SELECT QYGS, FCUSTNAME, SQ AS FPROVINCE,CS AS FCITY,QY AS FDISTRICT ,XSZZ FROM " + - section.getYsdTable() + " WHERE QYGS IS NOT NULL GROUP BY QYGS, FCUSTNAME, SQ,CS"); + // 获取所有销售组织-客户组合 + List customerMaps = DBSql.getMaps( + "SELECT DISTINCT QYGS, FCUSTNAME, SQ AS FPROVINCE, CS AS FCITY, QY AS FDISTRICT, XSZZ " + + "FROM " + section.getYsdTable() + " WHERE QYGS IS NOT NULL AND FCUSTNAME IS NOT NULL" + ); - if (maps == null || maps.isEmpty()) { + if (customerMaps == null || customerMaps.isEmpty()) { LOGGER.warn("{}板块未查询到销售组织和客户数据", sectionName); - return true; // 没有数据也算成功 + return true; } - LOGGER.info("{}板块共查询到 {} 个销售组织-客户组合", sectionName, maps.size()); + LOGGER.info("{}板块共查询到 {} 个销售组织-客户组合", sectionName, customerMaps.size()); - // 用于批量插入的数据列表 - List batchData = new ArrayList<>(); - int processedCount = 0; + // 分批次处理客户数据 + int totalCustomers = customerMaps.size(); + for (int i = 0; i < totalCustomers; i += CUSTOMER_BATCH_SIZE) { + int endIndex = Math.min(i + CUSTOMER_BATCH_SIZE, totalCustomers); + List batchCustomers = customerMaps.subList(i, endIndex); - // 获取每个月的最大日期(月末日期) - List monthEndDates = getMonthEndDates(startDate, nowDate); - LOGGER.info("{}板块将处理 {} 个月末日期", sectionName, monthEndDates.size()); + LOGGER.info("{}板块正在处理第 {} 批客户,进度: {}/{}", + sectionName, (i / CUSTOMER_BATCH_SIZE) + 1, endIndex, totalCustomers); - // 遍历每个月末日期 - for (LocalDate monthEndDate : monthEndDates) { - LOGGER.info("{}板块正在处理月末日期: {}", sectionName, monthEndDate); - - // 计算该月的日期范围(月初到月末或昨天) - LocalDate monthStartDate = monthEndDate.withDayOfMonth(1); - LocalDate monthEnd = monthEndDate; - // 遍历每个销售组织-客户组合 - for (RowMap row : maps) { - try { - String manageRegionName = row.getString("QYGS"); - String saleOrgUnit = row.getString("XSZZ"); - String custName = row.getString("FCUSTNAME"); -// LOGGER.info("manageRegionName:{};saleOrgUnit:{},custName:{}",manageRegionName,saleOrgUnit,custName); - - // 查询省市区信息 - String province = row != null ? row.getString("FPROVINCE") : ""; - String city = row != null ? row.getString("FCITY") : ""; - String district = row != null ? row.getString("FDISTRICT")!=null ? row.getString("FDISTRICT"):"": ""; - - // 计算期初余额(上一年度) - LocalDate previousYearStart = monthStartDate.minusYears(1).withDayOfYear(1); - LocalDate previousYearEnd = monthStartDate.minusYears(1).withDayOfYear(365); - BigDecimal qcye = calculateInitialBalance(section, saleOrgUnit, custName, previousYearStart, previousYearEnd); - - // 计算累计销售(本年年初到查询截止日期) - LocalDate yearStart = monthStartDate.withDayOfYear(1); - BigDecimal ljxs = calculateTotalSales(section, saleOrgUnit, custName, monthEndDate, monthEnd); - - // 计算累计还款(本年年初到查询截止日期) - BigDecimal ljhk = calculateTotalRepayment(section, saleOrgUnit, custName, monthEndDate, monthEnd); - - // 计算应收余额 - BigDecimal ysye = qcye.add(ljxs).subtract(ljhk); -// LOGGER.info("计算应收余额={}",ysye.doubleValue()); - - // 计算账龄分析(需要查询历史数据) - Map zlfx = calculateMonthlyAgingAnalysis(section, saleOrgUnit, custName, monthEndDate, ysye); -// for (String key: zlfx.keySet()){ -// LOGGER.info("账龄-{}={}",key,zlfx.get(key)); -// } - - // 创建数据记录(记录日期仍使用月末日期) - BO record = createRecord( - section, manageRegionName, saleOrgUnit, monthEndDate, custName, - province, city, district, qcye, ljxs, ljhk, ysye, zlfx - ); - - batchData.add(record); - - // 批量插入 - if (batchData.size() >= BATCH_SIZE) { - batchInsert(section, batchData); - batchData.clear(); - } - - // 更新处理计数 - processedCount++; - if (processedCount % 1000 == 0) { - LOGGER.info("{}板块已处理 {} 条记录", sectionName, processedCount); - } - - } catch (Exception e) { - LOGGER.error("{}板块处理销售组织 {} 客户 {} 月末日期 {} 时发生错误", - sectionName, row.getString("XSZZ"), row.getString("FCUSTNAME"), monthEndDate, e); - } + boolean batchSuccess = processCustomerBatch(section, batchCustomers, startDate, endDate); + if (!batchSuccess) { + LOGGER.error("{}板块第 {} 批客户处理失败", sectionName, (i / CUSTOMER_BATCH_SIZE) + 1); + return false; } } - // 插入剩余数据 - if (!batchData.isEmpty()) { - batchInsert(section, batchData); - } - - LOGGER.info("{}板块数据处理完成,共处理 {} 条记录", sectionName, processedCount); + LOGGER.info("{}板块数据处理完成,共处理 {} 个客户组合", sectionName, totalCustomers); return true; } catch (Exception e) { @@ -194,179 +124,403 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { } /** - * 判断是否为当前月月末 - * @param monthEndDate 月末日期 - * @param nowDate 当前日期 - * @return 是否为当前月月末 + * 处理一批客户数据 */ - private boolean isCurrentMonthEnd(LocalDate monthEndDate, LocalDate nowDate) { - // 判断是否为当前月的月末,并且月末日期大于或等于当前日期 - return monthEndDate.getMonth() == nowDate.getMonth() && - monthEndDate.getYear() == nowDate.getYear() && - monthEndDate.getDayOfMonth() == monthEndDate.lengthOfMonth() && - monthEndDate.isAfter(nowDate.minusDays(1)); // 确保是当前月月末 - } + private boolean processCustomerBatch(Section section, List customerBatch, + LocalDate startDate, LocalDate endDate) { + try { + // 提取销售组织和客户名称列表 + List saleOrgUnits = customerBatch.stream() + .map(row -> row.getString("XSZZ")) + .distinct() + .collect(Collectors.toList()); - /** - * 获取时间范围内的所有月末日期 - */ - private List getMonthEndDates(LocalDate startDate, LocalDate endDate) { - List monthEndDates = new ArrayList<>(); - LocalDate current = startDate.withDayOfMonth(1); - while (!current.isAfter(endDate)) { - // 如果当前月份与endDate不是同年同月 - if (current.getYear() != endDate.getYear() || current.getMonth() != endDate.getMonth()) { - LocalDate monthEnd = current.withDayOfMonth(current.lengthOfMonth()); - // 确保月末日期在时间范围内 - if (!monthEnd.isBefore(startDate) && !monthEnd.isAfter(endDate)) { - monthEndDates.add(monthEnd); + List custNames = customerBatch.stream() + .map(row -> row.getString("FCUSTNAME")) + .distinct() + .collect(Collectors.toList()); + + // 获取需要处理的所有月末日期 + List monthEndDates = getMonthEndDates(startDate, endDate); + + // 批量预加载所有需要的数据 + Map preloadedResults = preloadAllData( + section, saleOrgUnits, custNames, monthEndDates); + + // 批量处理数据 + List allRecords = new ArrayList<>(); + + for (LocalDate monthEndDate : monthEndDates) { + for (RowMap customer : customerBatch) { + String saleOrgUnit = customer.getString("XSZZ"); + String custName = customer.getString("FCUSTNAME"); + String keyPrefix = saleOrgUnit + "_" + custName + "_"; + + try { + // 从预加载数据中获取计算结果 + BigDecimal qcye = getPreloadedValue(preloadedResults, keyPrefix + "QCYE_" + monthEndDate); + BigDecimal ljxs = getPreloadedValue(preloadedResults, keyPrefix + "LJXS_" + monthEndDate); + BigDecimal ljhk = getPreloadedValue(preloadedResults, keyPrefix + "LJHK_" + monthEndDate); + BigDecimal ysye = qcye.add(ljxs).subtract(ljhk); + + // 从预加载数据中获取账龄分析 + Map zlfx = new HashMap<>(); + for (String zlfxKey : Arrays.asList("ZLFX0_60", "ZLFX60_1", "ZLFX1_2", "ZLFX2_3", "ZLFX3_4", "ZLFX4_5", "ZLFX5")) { + BigDecimal value = getPreloadedValue(preloadedResults, keyPrefix + zlfxKey + "_" + monthEndDate); + zlfx.put(zlfxKey, value); + } + + // 创建记录 + BO record = createRecord( + section, + customer.getString("QYGS"), + saleOrgUnit, + monthEndDate, + custName, + customer.getString("FPROVINCE"), + customer.getString("FCITY"), + customer.getString("FDISTRICT") != null ? customer.getString("FDISTRICT") : "", + qcye, ljxs, ljhk, ysye, zlfx + ); + + allRecords.add(record); + + } catch (Exception e) { + LOGGER.error("处理客户数据时发生错误,销售组织: {}, 客户: {}, 日期: {}", + saleOrgUnit, custName, monthEndDate, e); + } } } - // 如果当前月份与endDate是同年同月 - else { - LocalDate dayBeforeEnd = endDate.minusDays(1); - // 确保前一天在时间范围内 - if (!dayBeforeEnd.isBefore(startDate)) { - monthEndDates.add(dayBeforeEnd); - } - break; // 遇到同年同月后就可以结束循环了 + + // 分批插入数据 + for (int i = 0; i < allRecords.size(); i += BATCH_SIZE) { + int endIndex = Math.min(i + BATCH_SIZE, allRecords.size()); + List batchRecords = allRecords.subList(i, endIndex); + batchInsert(section, batchRecords); } - current = current.plusMonths(1); - } - return monthEndDates; - } - /** - * 计算期初余额 - */ - private BigDecimal calculateInitialBalance(Section section, String saleOrgUnit, String custName, - LocalDate startDate, LocalDate endDate) { - String startDateStr = startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+" 00:00:00"; - String endDateStr = endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+" 23:59:59"; - try { - // 查询应收单总额 - RowMap ysResult = DBSql.getMap( - "SELECT SUM(SSJERMB) as total FROM " + section.getYsdTable() + - " WHERE XSZZ = ? AND FCUSTNAME = ? AND DZRQ >= ? AND DZRQ< ?", - saleOrgUnit, custName, startDateStr, endDateStr - ); -// LOGGER.info("期初余额-应收单总额sql:SELECT SUM(SSJERMB) as total FROM " + section.getYsdTable() + -// " WHERE XSZZ = "+saleOrgUnit+" AND FCUSTNAME = "+custName+" AND DZRQ >= "+startDateStr+" AND DZRQ< "+endDateStr+""); - - BigDecimal ysTotal = ysResult != null && ysResult.get("total") != null ? - new BigDecimal(ysResult.get("total").toString()) : BigDecimal.ZERO; - - // 查询收款单总额 - RowMap skResult = DBSql.getMap( - "SELECT SUM(FSALEAMOUNTRMB) as total FROM " + section.getSkdTable() + - " WHERE FSALEORGUNIT = ? AND FCUSTNAME = ? AND FBILLDATE >= ? AND FBILLDATE < ?", - saleOrgUnit, custName, startDateStr, endDateStr - ); -// LOGGER.info("期初余额-收款单总额sql:SELECT SUM(FSALEAMOUNTRMB) as total FROM " + section.getSkdTable() + -// " WHERE FSALEORGUNIT = "+saleOrgUnit+" AND FCUSTNAME = "+custName+" AND FBILLDATE >= "+startDateStr+" AND FBILLDATE< "+endDateStr+""); - - BigDecimal skTotal = skResult != null && skResult.get("total") != null ? - new BigDecimal(skResult.get("total").toString()) : BigDecimal.ZERO; - - // 查询收款退款单总额 - RowMap sktkResult = DBSql.getMap( - "SELECT SUM(FSALEAMOUNTRMB) as total FROM " + section.getSktkdTable() + - " WHERE FSALEORGUNIT = ? AND FCUSTNAME = ? AND FBILLDATE >= ? AND FBILLDATE < ?", - saleOrgUnit, custName, startDateStr, endDateStr - ); -// LOGGER.info("期初余额-收款退款单总额sql:SELECT SUM(FSALEAMOUNTRMB) as total FROM " + section.getSktkdTable() + -// " WHERE FSALEORGUNIT = "+saleOrgUnit+" AND FCUSTNAME = "+custName+" AND FBILLDATE >= "+startDateStr+" AND FBILLDATE< "+endDateStr+""); - - BigDecimal sktkTotal = sktkResult != null && sktkResult.get("total") != null ? - new BigDecimal(sktkResult.get("total").toString()) : BigDecimal.ZERO; - -// LOGGER.info("期初余额:{}",sktkTotal.doubleValue()); - // 期初余额 = 应收单总额 - 收款单总额 + 收款退款单总额 - return ysTotal.subtract(skTotal).add(sktkTotal); + return true; } catch (Exception e) { - LOGGER.error("计算{}板块期初余额时发生错误,销售组织: {}, 客户: {}", section.getName(), saleOrgUnit, custName, e); - return BigDecimal.ZERO; + LOGGER.error("处理客户批次数据时发生错误", e); + return false; } } /** - * 计算累计销售 + * 安全获取预加载值 */ - private BigDecimal calculateTotalSales(Section section, String saleOrgUnit, String custName, - LocalDate startDate, LocalDate endDate) { - String startDateStr = startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+" 00:00:00"; - String endDateStr = endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+" 23:59:59"; - try { - RowMap result = DBSql.getMap( - "SELECT SUM(SSJERMB) as total FROM " + section.getYsdTable() + - " WHERE XSZZ = ? AND FCUSTNAME = ? AND DZRQ >= ? AND DZRQ < ?", - saleOrgUnit, custName, startDateStr, endDateStr - ); -// LOGGER.info("计算累计销售:SELECT SUM(SSJERMB) as total FROM " + section.getYsdTable() + -// " WHERE XSZZ = "+saleOrgUnit+" AND FCUSTNAME = "+custName+" AND DZRQ >= "+startDateStr+" AND DZRQ < "+endDateStr+""); + private BigDecimal getPreloadedValue(Map preloadedData, String key) { + return preloadedData.getOrDefault(key, BigDecimal.ZERO); + } -// LOGGER.info("累计销售={}",result != null && result.get("total") != null ? -// new BigDecimal(result.get("total").toString()) : BigDecimal.ZERO); - return result != null && result.get("total") != null ? - new BigDecimal(result.get("total").toString()) : BigDecimal.ZERO; + /** + * 预加载所有需要的数据 + */ + private Map preloadAllData(Section section, + List saleOrgUnits, List custNames, List monthEndDates) { + + Map results = new HashMap<>(); + + try { + // 批量查询应收单数据 + Map ysData = batchQueryYSDData(section, saleOrgUnits, custNames, monthEndDates); + + // 批量查询收款单数据 + Map skData = batchQuerySKDData(section, saleOrgUnits, custNames, monthEndDates); + + // 批量查询收款退款单数据 + Map sktkData = batchQuerySKTKDData(section, saleOrgUnits, custNames, monthEndDates); + + // 批量查询历史余额数据 + Map historyData = batchQueryHistoryBalance(section, saleOrgUnits, custNames, monthEndDates); + + // 计算所有需要的指标 + calculateAllMetrics(results, ysData, skData, sktkData, historyData, saleOrgUnits, custNames, monthEndDates); } catch (Exception e) { - LOGGER.error("计算{}板块累计销售时发生错误,销售组织: {}, 客户: {}", section.getName(), saleOrgUnit, custName, e); - return BigDecimal.ZERO; + LOGGER.error("预加载数据时发生错误", e); } + + return results; } /** - * 计算累计还款 + * 批量查询应收单数据 */ - private BigDecimal calculateTotalRepayment(Section section, String saleOrgUnit, String custName, - LocalDate startDate, LocalDate endDate) { - String startDateStr = startDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+" 00:00:00"; - String endDateStr = endDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))+" 23:59:59"; + private Map batchQueryYSDData(Section section, List saleOrgUnits, + List custNames, List monthEndDates) { + + Map result = new HashMap<>(); + + if (saleOrgUnits.isEmpty() || custNames.isEmpty() || monthEndDates.isEmpty()) { + return result; + } + try { - // 查询收款单总额 - RowMap skResult = DBSql.getMap( - "SELECT SUM(FSALEAMOUNTRMB) as total FROM " + section.getSkdTable() + - " WHERE FSALEORGUNIT = ? AND FCUSTNAME = ? AND FBILLDATE >= ? AND FBILLDATE < ?", - saleOrgUnit, custName, startDateStr, endDateStr - ); -// LOGGER.info("计算累计还款:SELECT SUM(FSALEAMOUNTRMB) as total FROM " + section.getSkdTable() + -// " WHERE FSALEORGUNIT = "+saleOrgUnit+" AND FCUSTNAME = "+custName+" AND FBILLDATE >= "+startDateStr+" AND FBILLDATE < "+endDateStr+""); + String inSaleOrgs = buildInCondition(saleOrgUnits); + String inCustNames = buildInCondition(custNames); - BigDecimal skTotal = skResult != null && skResult.get("total") != null ? - new BigDecimal(skResult.get("total").toString()) : BigDecimal.ZERO; + // 构建日期条件 + StringBuilder dateCondition = new StringBuilder(); + for (LocalDate date : monthEndDates) { + LocalDate monthStart = date.withDayOfMonth(1); + if (dateCondition.length() > 0) { + dateCondition.append(" OR "); + } + dateCondition.append("(DZRQ >= '") + .append(monthStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .append(" 00:00:00' AND DZRQ <= '") + .append(date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .append(" 23:59:59')"); + } - // 查询收款退款单总额 - RowMap sktkResult = DBSql.getMap( - "SELECT SUM(FSALEAMOUNTRMB) as total FROM " + section.getSktkdTable() + - " WHERE FSALEORGUNIT = ? AND FCUSTNAME = ? AND FBILLDATE >= ? AND FBILLDATE < ?", - saleOrgUnit, custName, startDateStr, endDateStr - ); -// LOGGER.info("计算累计还款:SELECT SUM(FSALEAMOUNTRMB) as total FROM " + section.getSktkdTable() + -// " WHERE FSALEORGUNIT = "+saleOrgUnit+" AND FCUSTNAME = "+custName+" AND FBILLDATE >= "+startDateStr+" AND FBILLDATE < "+endDateStr+""); + String sql = "SELECT XSZZ, FCUSTNAME, DATE_FORMAT(DZRQ, '%Y-%m-%d') as BILL_DATE, SUM(SSJERMB) as TOTAL " + + "FROM " + section.getYsdTable() + + " WHERE XSZZ IN (" + inSaleOrgs + ") " + + " AND FCUSTNAME IN (" + inCustNames + ") " + + " AND (" + dateCondition + ") " + + " GROUP BY XSZZ, FCUSTNAME, DATE_FORMAT(DZRQ, '%Y-%m-%d')"; - BigDecimal sktkTotal = sktkResult != null && sktkResult.get("total") != null ? - new BigDecimal(sktkResult.get("total").toString()) : BigDecimal.ZERO; -// LOGGER.info("累计还款={}",skTotal.subtract(sktkTotal).doubleValue()); - // 累计还款 = 收款单总额 - 收款退款单总额 - return skTotal.subtract(sktkTotal); + List queryResults = DBSql.getMaps(sql); + + for (RowMap row : queryResults) { + String key = row.getString("XSZZ") + "_" + row.getString("FCUSTNAME") + "_" + row.getString("BILL_DATE"); + BigDecimal value = row.get("TOTAL") != null ? new BigDecimal(row.get("TOTAL").toString()) : BigDecimal.ZERO; + result.put(key, value); + } } catch (Exception e) { - LOGGER.error("计算{}板块累计还款时发生错误,销售组织: {}, 客户: {}", section.getName(), saleOrgUnit, custName, e); - return BigDecimal.ZERO; + LOGGER.error("批量查询应收单数据时发生错误", e); } + + return result; } /** - * 计算月度账龄分析 + * 批量查询收款单数据 */ - private Map calculateMonthlyAgingAnalysis(Section section, String saleOrgUnit, String custName, - LocalDate currentDate, BigDecimal currentBalance) { + private Map batchQuerySKDData(Section section, List saleOrgUnits, + List custNames, List monthEndDates) { + Map result = new HashMap<>(); try { - // 计算各个时间点的应收余额 + String inSaleOrgs = buildInCondition(saleOrgUnits); + String inCustNames = buildInCondition(custNames); + + StringBuilder dateCondition = new StringBuilder(); + for (LocalDate date : monthEndDates) { + LocalDate monthStart = date.withDayOfMonth(1); + if (dateCondition.length() > 0) { + dateCondition.append(" OR "); + } + dateCondition.append("(FBILLDATE >= '") + .append(monthStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .append(" 00:00:00' AND FBILLDATE <= '") + .append(date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .append(" 23:59:59')"); + } + + String sql = "SELECT FSALEORGUNIT, FCUSTNAME, DATE_FORMAT(FBILLDATE, '%Y-%m-%d') as BILL_DATE, SUM(FSALEAMOUNTRMB) as TOTAL " + + "FROM " + section.getSkdTable() + + " WHERE FSALEORGUNIT IN (" + inSaleOrgs + ") " + + " AND FCUSTNAME IN (" + inCustNames + ") " + + " AND (" + dateCondition + ") " + + " GROUP BY FSALEORGUNIT, FCUSTNAME, DATE_FORMAT(FBILLDATE, '%Y-%m-%d')"; + + List queryResults = DBSql.getMaps(sql); + + for (RowMap row : queryResults) { + String key = row.getString("FSALEORGUNIT") + "_" + row.getString("FCUSTNAME") + "_" + row.getString("BILL_DATE"); + BigDecimal value = row.get("TOTAL") != null ? new BigDecimal(row.get("TOTAL").toString()) : BigDecimal.ZERO; + result.put(key, value); + } + + } catch (Exception e) { + LOGGER.error("批量查询收款单数据时发生错误", e); + } + + return result; + } + + /** + * 批量查询收款退款单数据 + */ + private Map batchQuerySKTKDData(Section section, List saleOrgUnits, + List custNames, List monthEndDates) { + + Map result = new HashMap<>(); + + try { + String inSaleOrgs = buildInCondition(saleOrgUnits); + String inCustNames = buildInCondition(custNames); + + StringBuilder dateCondition = new StringBuilder(); + for (LocalDate date : monthEndDates) { + LocalDate monthStart = date.withDayOfMonth(1); + if (dateCondition.length() > 0) { + dateCondition.append(" OR "); + } + dateCondition.append("(FBILLDATE >= '") + .append(monthStart.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .append(" 00:00:00' AND FBILLDATE <= '") + .append(date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))) + .append(" 23:59:59')"); + } + + String sql = "SELECT FSALEORGUNIT, FCUSTNAME, DATE_FORMAT(FBILLDATE, '%Y-%m-%d') as BILL_DATE, SUM(FSALEAMOUNTRMB) as TOTAL " + + "FROM " + section.getSktkdTable() + + " WHERE FSALEORGUNIT IN (" + inSaleOrgs + ") " + + " AND FCUSTNAME IN (" + inCustNames + ") " + + " AND (" + dateCondition + ") " + + " GROUP BY FSALEORGUNIT, FCUSTNAME, DATE_FORMAT(FBILLDATE, '%Y-%m-%d')"; + + List queryResults = DBSql.getMaps(sql); + + for (RowMap row : queryResults) { + String key = row.getString("FSALEORGUNIT") + "_" + row.getString("FCUSTNAME") + "_" + row.getString("BILL_DATE"); + BigDecimal value = row.get("TOTAL") != null ? new BigDecimal(row.get("TOTAL").toString()) : BigDecimal.ZERO; + result.put(key, value); + } + + } catch (Exception e) { + LOGGER.error("批量查询收款退款单数据时发生错误", e); + } + + return result; + } + + /** + * 批量查询历史余额数据 + */ + private Map batchQueryHistoryBalance(Section section, List saleOrgUnits, + List custNames, List monthEndDates) { + + Map result = new HashMap<>(); + + try { + String inSaleOrgs = buildInCondition(saleOrgUnits); + String inCustNames = buildInCondition(custNames); + String inDates = monthEndDates.stream() + .map(date -> "'" + date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 23:59:59'") + .collect(Collectors.joining(",")); + + String sql = "SELECT XSZZ, KH, DATE_FORMAT(RQ, '%Y-%m-%d') as BALANCE_DATE, YSYE " + + "FROM " + section.getTargetTable() + + " WHERE XSZZ IN (" + inSaleOrgs + ") " + + " AND KH IN (" + inCustNames + ") " + + " AND RQ IN (" + inDates + ")"; + + List queryResults = DBSql.getMaps(sql); + + for (RowMap row : queryResults) { + String key = row.getString("XSZZ") + "_" + row.getString("KH") + "_" + row.getString("BALANCE_DATE"); + BigDecimal value = row.get("YSYE") != null ? new BigDecimal(row.get("YSYE").toString()) : BigDecimal.ZERO; + result.put(key, value); + } + + } catch (Exception e) { + LOGGER.error("批量查询历史余额数据时发生错误", e); + } + + return result; + } + + /** + * 计算所有指标 + */ + private void calculateAllMetrics(Map results, + Map ysData, Map skData, + Map sktkData, Map historyData, + List saleOrgUnits, List custNames, List monthEndDates) { + + // 计算每个客户每个月的指标 + for (String saleOrgUnit : saleOrgUnits) { + for (String custName : custNames) { + String keyPrefix = saleOrgUnit + "_" + custName + "_"; + + for (LocalDate monthEndDate : monthEndDates) { + String dateKey = monthEndDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String fullKeyPrefix = keyPrefix + dateKey; + + // 计算期初余额(上一年度累计) + LocalDate previousYearStart = monthEndDate.minusYears(1).withDayOfYear(1); + LocalDate previousYearEnd = monthEndDate.minusYears(1).withDayOfYear(365); + BigDecimal qcye = calculatePeriodBalance(ysData, skData, sktkData, saleOrgUnit, custName, previousYearStart, previousYearEnd); + + // 计算累计销售(本年年初到当前月末) + LocalDate yearStart = monthEndDate.withDayOfYear(1); + BigDecimal ljxs = calculatePeriodBalance(ysData, null, null, saleOrgUnit, custName, yearStart, monthEndDate); + + // 计算累计还款(本年年初到当前月末) + BigDecimal ljhk = calculatePeriodBalance(null, skData, sktkData, saleOrgUnit, custName, yearStart, monthEndDate); + + // 计算应收余额 + BigDecimal ysye = qcye.add(ljxs).subtract(ljhk); + + // 计算账龄分析 + Map zlfx = calculateAgingAnalysis(historyData, saleOrgUnit, custName, monthEndDate, ysye); + + // 存储计算结果 + results.put(keyPrefix + "QCYE_" + monthEndDate, qcye); + results.put(keyPrefix + "LJXS_" + monthEndDate, ljxs); + results.put(keyPrefix + "LJHK_" + monthEndDate, ljhk); + results.put(keyPrefix + "YSYE_" + monthEndDate, ysye); + + for (Map.Entry entry : zlfx.entrySet()) { + results.put(keyPrefix + entry.getKey() + "_" + monthEndDate, entry.getValue()); + } + } + } + } + } + + /** + * 计算指定时间段的余额 + */ + private BigDecimal calculatePeriodBalance(Map ysData, Map skData, + Map sktkData, String saleOrgUnit, String custName, + LocalDate startDate, LocalDate endDate) { + + BigDecimal result = BigDecimal.ZERO; + String keyPrefix = saleOrgUnit + "_" + custName + "_"; + + // 累加指定时间段内的数据 + LocalDate current = startDate; + while (!current.isAfter(endDate)) { + String dateKey = current.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String fullKey = keyPrefix + dateKey; + + if (ysData != null) { + result = result.add(ysData.getOrDefault(fullKey, BigDecimal.ZERO)); + } + + if (skData != null) { + result = result.subtract(skData.getOrDefault(fullKey, BigDecimal.ZERO)); + } + + if (sktkData != null) { + result = result.add(sktkData.getOrDefault(fullKey, BigDecimal.ZERO)); + } + + current = current.plusDays(1); + } + + return result; + } + + /** + * 计算账龄分析 + */ + private Map calculateAgingAnalysis(Map historyData, + String saleOrgUnit, String custName, LocalDate currentDate, BigDecimal currentBalance) { + + Map result = new HashMap<>(); + String keyPrefix = saleOrgUnit + "_" + custName + "_"; + + try { + // 计算各个时间点的历史余额 LocalDate date60DaysAgo = currentDate.minusDays(60); LocalDate date1YearAgo = currentDate.minusYears(1); LocalDate date2YearsAgo = currentDate.minusYears(2); @@ -374,13 +528,13 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { LocalDate date4YearsAgo = currentDate.minusYears(4); LocalDate date5YearsAgo = currentDate.minusYears(5); - // 查询历史月末的应收余额 - BigDecimal balance60DaysAgo = findMonthlyBalance(section, saleOrgUnit, custName, date60DaysAgo); - BigDecimal balance1YearAgo = findMonthlyBalance(section, saleOrgUnit, custName, date1YearAgo); - BigDecimal balance2YearsAgo = findMonthlyBalance(section, saleOrgUnit, custName, date2YearsAgo); - BigDecimal balance3YearsAgo = findMonthlyBalance(section, saleOrgUnit, custName, date3YearsAgo); - BigDecimal balance4YearsAgo = findMonthlyBalance(section, saleOrgUnit, custName, date4YearsAgo); - BigDecimal balance5YearsAgo = findMonthlyBalance(section, saleOrgUnit, custName, date5YearsAgo); + // 查找历史余额 + BigDecimal balance60DaysAgo = findHistoricalBalance(historyData, keyPrefix, date60DaysAgo); + BigDecimal balance1YearAgo = findHistoricalBalance(historyData, keyPrefix, date1YearAgo); + BigDecimal balance2YearsAgo = findHistoricalBalance(historyData, keyPrefix, date2YearsAgo); + BigDecimal balance3YearsAgo = findHistoricalBalance(historyData, keyPrefix, date3YearsAgo); + BigDecimal balance4YearsAgo = findHistoricalBalance(historyData, keyPrefix, date4YearsAgo); + BigDecimal balance5YearsAgo = findHistoricalBalance(historyData, keyPrefix, date5YearsAgo); // 计算各账龄段金额 result.put("ZLFX0_60", currentBalance.subtract(balance60DaysAgo.max(BigDecimal.ZERO))); @@ -393,7 +547,7 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { } catch (Exception e) { LOGGER.error("计算账龄分析时发生错误,销售组织: {}, 客户: {}", saleOrgUnit, custName, e); - // 发生错误时设置默认值 + // 设置默认值 result.put("ZLFX0_60", BigDecimal.ZERO); result.put("ZLFX60_1", BigDecimal.ZERO); result.put("ZLFX1_2", BigDecimal.ZERO); @@ -407,29 +561,55 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { } /** - * 查找指定月末的应收余额 + * 查找历史余额 */ - private BigDecimal findMonthlyBalance(Section section, String saleOrgUnit, String custName, LocalDate targetDate) { + private BigDecimal findHistoricalBalance(Map historyData, String keyPrefix, LocalDate targetDate) { // 调整为目标月份的月末日期 LocalDate monthEndDate = targetDate.withDayOfMonth(targetDate.lengthOfMonth()); - String dateStr = monthEndDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 23:59:59"; + String dateKey = monthEndDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + String fullKey = keyPrefix + dateKey; - try { - // 查询目标表中该月末的应收余额 - RowMap result = DBSql.getMap( - "SELECT YSYE FROM " + section.getTargetTable() + - " WHERE XSZZ = ? AND KH = ? AND RQ = ?", - saleOrgUnit, custName, dateStr - ); + return historyData.getOrDefault(fullKey, BigDecimal.ZERO); + } - return result != null && result.get("YSYE") != null ? - new BigDecimal(result.get("YSYE").toString()) : BigDecimal.ZERO; - - } catch (Exception e) { - LOGGER.debug("未找到{}板块销售组织 {} 客户 {} 日期 {} 的历史余额,使用默认值0", - section.getName(), saleOrgUnit, custName, monthEndDate); - return BigDecimal.ZERO; + /** + * 构建IN查询条件 + */ + private String buildInCondition(List values) { + if (values == null || values.isEmpty()) { + return "''"; } + return values.stream() + .map(value -> "'" + value.replace("'", "''") + "'") + .collect(Collectors.joining(",")); + } + + /** + * 获取时间范围内的所有月末日期(优化版) + */ + private List getMonthEndDates(LocalDate startDate, LocalDate endDate) { + List monthEndDates = new ArrayList<>(); + LocalDate current = startDate.withDayOfMonth(1); + + while (!current.isAfter(endDate)) { + if (current.getYear() == endDate.getYear() && current.getMonth() == endDate.getMonth()) { + // 当前月份与结束日期同年同月,使用结束日期前一天 + LocalDate dayBeforeEnd = endDate.minusDays(1); + if (!dayBeforeEnd.isBefore(startDate)) { + monthEndDates.add(dayBeforeEnd); + } + break; + } else { + // 其他月份使用月末日期 + LocalDate monthEnd = current.withDayOfMonth(current.lengthOfMonth()); + if (!monthEnd.isBefore(startDate) && !monthEnd.isAfter(endDate)) { + monthEndDates.add(monthEnd); + } + } + current = current.plusMonths(1); + } + + return monthEndDates; } /** @@ -456,13 +636,13 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { record.set("YSYE", ysye); // 账龄分析字段 - record.set("ZLFX0_60", zlfx.get("ZLFX0_60")); - record.set("ZLFX60_1", zlfx.get("ZLFX60_1")); - record.set("ZLFX1_2", zlfx.get("ZLFX1_2")); - record.set("ZLFX2_3", zlfx.get("ZLFX2_3")); - record.set("ZLFX3_4", zlfx.get("ZLFX3_4")); - record.set("ZLFX4_5", zlfx.get("ZLFX4_5")); - record.set("ZLFX5", zlfx.get("ZLFX5")); + record.set("ZLFX0_60", zlfx.getOrDefault("ZLFX0_60", BigDecimal.ZERO)); + record.set("ZLFX60_1", zlfx.getOrDefault("ZLFX60_1", BigDecimal.ZERO)); + record.set("ZLFX1_2", zlfx.getOrDefault("ZLFX1_2", BigDecimal.ZERO)); + record.set("ZLFX2_3", zlfx.getOrDefault("ZLFX2_3", BigDecimal.ZERO)); + record.set("ZLFX3_4", zlfx.getOrDefault("ZLFX3_4", BigDecimal.ZERO)); + record.set("ZLFX4_5", zlfx.getOrDefault("ZLFX4_5", BigDecimal.ZERO)); + record.set("ZLFX5", zlfx.getOrDefault("ZLFX5", BigDecimal.ZERO)); return record; } @@ -472,9 +652,8 @@ public class WaterproofPaintAccountsReceivableJob implements IJob { */ private void batchInsert(Section section, List batchData) { try { - int[] dataBO = SDK.getBOAPI().createDataBO(section.getTargetTable(), batchData, UserContext.fromUID("admin")); - long result = Arrays.stream(dataBO).count(); - LOGGER.info("成功插入 {} 条数据到 {} 表", result, section.getTargetTable()); + int[] results = SDK.getBOAPI().createDataBO(section.getTargetTable(), batchData, UserContext.fromUID("admin")); + LOGGER.info("成功插入 {} 条数据到 {} 表", batchData.size(), section.getTargetTable()); } catch (Exception e) { LOGGER.error("批量插入{}板块数据到表{}时发生错误", section.getName(), section.getTargetTable(), e); } diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.java b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.java index f2a52c5..e27474f 100644 --- a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.java +++ b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleCountDimensionImpl.java @@ -501,7 +501,9 @@ public class SaleCountDimensionImpl implements DataSummaryService { bo.set("JD", location.getLongitude()); bo.set("WD", location.getLatitude()); } - if ("石膏板".equals(lb_1) || "高分子".equals(lb_1)){ + if ("石膏板".equals(lb_1) + || (bkgs.equals("北新防水") && ("高分子".equals(lb_1) || "卷材".equals(lb_1) || "涂料".equals(lb_1))) + || (bkgs.equals("北新涂料") && "涂料".equals(lb_1))){ bo.set("XL", map.getDouble("TSXL")); bo.set("SNTQXL", map.getString("sntqtsxl")); }else { diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java index 8df30af..66826fc 100644 --- a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java +++ b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java @@ -97,13 +97,13 @@ public class SaleDataSyncServiceImpl implements DataSyncService { String targetTable = mainConfig.getString("LDB"); String ccId = mainConfig.getString("CC_ID"); String partitionField = mainConfig.getString("FQBZD"); - String bkgs = mainConfig.getString("BKGS"); + String bkgs = mainConfig.getString("SSBK"); String jezd = mainConfig.getString("JEZD"); String tablename = mainConfig.getString("TABLENAME"); DateRange dateRange = new DateRange(); - LOGGER.info("处理配置:BindID={}, 源表={}, 目标表={}, CC_ID={}, 时间字段={}, 分区字段配置={}", - bindId, tableName, targetTable, ccId,timeField,partitionField); + LOGGER.info("处理配置:BindID={}, 源表={}, 目标表={}, CC_ID={}, 时间字段={}, 分区字段配置={}, 板块={}", + bindId, tableName, targetTable, ccId,timeField,partitionField,bkgs); // 查询子表字段映射配置 List fieldMappings = SDK.getBOAPI() @@ -144,7 +144,7 @@ public class SaleDataSyncServiceImpl implements DataSyncService { // 查询源表数据(跨库查询) if (tablename.equals("应收表")){ LOGGER.info("开始执行应收的明细汇总"); - if ((!bkgs.equals("北新防水")) || (!bkgs.equals("北新涂料"))) { + if (!bkgs.equals("北新防水") || !bkgs.equals("北新涂料")) { querySourceDataYS(ccId, tableName, timeField, startDate, endDate, partitionField, fieldMappings, targetTable, jezd); } @@ -845,7 +845,7 @@ public class SaleDataSyncServiceImpl implements DataSyncService { if ("北新防水".equals(map.getString("BKGS")) && "否".equals(map.getString("F_SFNBJY")) && !map.getString("XSZZ").equals("北新防水工程(辽宁)有限公司") && !map.getString("XSZZ").equals("北新防水工程(四川)有限公司") - && StringUtils.isBlank(map.getString("F_SFNBJY"))){ + && StringUtils.isBlank(map.getString("QYGS").trim())){ continue; } // 复制所有字段(排除系统字段) @@ -997,7 +997,8 @@ public class SaleDataSyncServiceImpl implements DataSyncService { } if ("北新防水".equals(map.getString("BKGS")) && "否".equals(map.getString("F_SFNBJY")) && !map.getString("XSZZ").equals("北新防水工程(辽宁)有限公司") - && !map.getString("XSZZ").equals("北新防水工程(四川)有限公司")){ + && !map.getString("XSZZ").equals("北新防水工程(四川)有限公司") + && StringUtils.isBlank(map.getString("QYGS").trim())){ continue; } // 复制所有字段(排除系统字段) @@ -1118,12 +1119,26 @@ public class SaleDataSyncServiceImpl implements DataSyncService { " AND MONTH = " + firstDayOfLastYearMonth.getMonthValue()); LOGGER.info("先清空{}去年同期数{}",lastYearFirstDayStr,update1); // 构建插入SQL(注意:需确保字段匹配且处理可能的主键冲突) - String insertCurrentMonthLastYearSql = "INSERT INTO " + targetTable + - " SELECT * FROM " + targetTable + - " WHERE " + targetTimeField + " >= '" + lastYearFirstDayStr + - "' AND " + targetTimeField + " < '" + lastYearNextMonthFirstDayStr + "'"; + + String CurrentMonthLastYearSql = "SELECT * FROM " + targetTable + + " WHERE " +targetTimeField+">='"+lastYearFirstDayStr+"' AND "+ + targetTimeField+"<'"+lastYearNextMonthFirstDayStr+"'"; + ArrayList bos = new ArrayList<>(); + List maps = DBSql.getMaps(CurrentMonthLastYearSql); + for (RowMap map : maps) { + map.remove("ID"); + map.remove("ORGID"); + map.remove("CREATEDATE"); + map.remove("CREATEUSER"); + map.remove("UPDATEDATE"); + map.remove("UPDATEUSER"); + map.remove("ISEND"); + map.remove("BINDID"); + BO bo = new BO().setAll(map); + bos.add(bo); + } // 执行插入操作 - DBSql.update(insertCurrentMonthLastYearSql); + SDK.getBOAPI().createDataBO(hzb, bos, UserContext.fromUID("admin")); LOGGER.info("{}已新增当月去年同期数据",lastYearFirstDayStr); } catch (Exception e) { @@ -1329,23 +1344,75 @@ public class SaleDataSyncServiceImpl implements DataSyncService { String lastYearFirstDayStr = firstDayOfLastYearMonth.format(formatter); String lastYearNextMonthFirstDayStr = firstDayOfNextMonthLastYear.format(formatter); + //删除清空去年同期数据 int update1 = DBSql.update("DELETE FROM " + targetTable + " WHERE RQ = '" + lastYearNextMonthFirstDayStr+"'"); LOGGER.info("先清空{}去年同期数{}",lastYearFirstDayStr,update1); - // 构建插入SQL(注意:需确保字段匹配且处理可能的主键冲突) - String insertCurrentMonthLastYearSql = "INSERT INTO " + targetTable + - " SELECT * FROM " + targetTable + - " WHERE RQ >= '" + lastYearFirstDayStr + - "' AND RQ < '" + lastYearNextMonthFirstDayStr + "'"; - // 执行插入操作 - rdsapi.update(insertCurrentMonthLastYearSql); - LOGGER.info("{}已新增当月去年同期数据",lastYearFirstDayStr); + // 构建查询去年同期全部数据的SQL + String lastYearQuerySql; + List lastYearParams = new ArrayList<>(); + + // 根据不同的数据库类型构建查询语句 + if ("ORACLE".equalsIgnoreCase(DBname)) { + lastYearQuerySql = "SELECT * FROM " + tableName + + " WHERE TO_DATE(" + timeField + ", 'YYYY-MM-DD') BETWEEN TO_DATE(?, 'YYYY-MM-DD') AND TO_DATE(?, 'YYYY-MM-DD')"; + lastYearParams.add(lastYearFirstDayStr); + lastYearParams.add(lastYearNextMonthFirstDayStr); + } else if ("POSTGRESQL".equalsIgnoreCase(DBname) || "GAUSS".equalsIgnoreCase(DBname)) { + lastYearQuerySql = "SELECT * FROM " + tableName + + " WHERE " + timeField + "::DATE BETWEEN ?::DATE AND ?::DATE"; + lastYearParams.add(lastYearFirstDayStr); + lastYearParams.add(lastYearNextMonthFirstDayStr); + } else if ("SQLSERVER".equalsIgnoreCase(DBname)) { + lastYearQuerySql = "SELECT * FROM " + tableName + + " WHERE CONVERT(DATE, " + timeField + ") BETWEEN CONVERT(DATE, ?) AND CONVERT(DATE, ?)"; + lastYearParams.add(lastYearFirstDayStr); + lastYearParams.add(lastYearNextMonthFirstDayStr); + } else { + // 默认处理(如MySQL) + lastYearQuerySql = "SELECT * FROM " + tableName + + " WHERE STR_TO_DATE(" + timeField + ", '%Y-%m-%d') BETWEEN STR_TO_DATE(?, '%Y-%m-%d') AND STR_TO_DATE(?, '%Y-%m-%d')"; + lastYearParams.add(lastYearFirstDayStr); + lastYearParams.add(lastYearNextMonthFirstDayStr); + } + + // 添加分区条件(如果存在) + if (partitionField != null && !partitionField.isEmpty() && !maxPartition.isEmpty()) { + if ("ORACLE".equalsIgnoreCase(DBname)) { + lastYearQuerySql += " AND " + partitionField + " = '" + maxPartition + "'"; + } else { + lastYearQuerySql += " AND " + partitionField + " = '" + maxPartition + "'"; + } + } + + LOGGER.info("查询去年同期数据SQL: {}", lastYearQuerySql); + LOGGER.info("查询参数: 开始日期={}, 结束日期={}", lastYearFirstDayStr, lastYearNextMonthFirstDayStr); + + // 执行查询去年同期数据 + List lastYearData; + if (lastYearParams.isEmpty()) { + lastYearData = rdsapi.getMaps(lastYearQuerySql); + } else { + // 这里需要根据您的rdsapi接口调整参数传递方式 + lastYearData = rdsapi.getMaps(lastYearQuerySql, lastYearParams.toArray()); + } + + if (lastYearData != null && !lastYearData.isEmpty()) { + // 批量插入去年同期数据 + int lastYearSuccessCount = this.processAndInsertData(lastYearData, fieldMappings, targetTable); + LOGGER.info("成功插入去年同期数据{}条,时间范围: {}-{}", + lastYearSuccessCount, lastYearFirstDayStr, lastYearNextMonthFirstDayStr); + } else { + LOGGER.warn("未查询到去年同期数据,时间范围: {}-{}", + lastYearFirstDayStr, lastYearNextMonthFirstDayStr); + } } catch (Exception e) { LOGGER.error("每月1号任务执行失败: {}", e.getMessage(), e); } + // } LOGGER.info("从表[{}]共查询到{}条数据,成功同步{}条数据",