From b893e8d8e45bf0827b5991775da8974eeb879501 Mon Sep 17 00:00:00 2001 From: cyf Date: Tue, 28 Jul 2026 10:16:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=8D=95=E6=8D=AE=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=92=8C=E4=BF=AE=E6=94=B9=E5=AF=86=E7=A0=81=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + 引用DLL/Lskj.Data.ADO.dll | Bin 49152 -> 49152 bytes 引用DLL/Lskj.Data.Api.dll | Bin 173568 -> 176640 bytes 引用DLL/Lskj.Web.Core.dll | Bin 267264 -> 267264 bytes 引用DLL/Lskj.WebErp.Core.dll | Bin 1199616 -> 1199616 bytes 插件库/Lskj.Business/Impl/MainImpl.cs | 21 + 插件库/Lskj.Business/Impl/PowerImpl.cs | 21 + 插件库/Lskj.Business/Impl/SystemInfo.cs | 10 + 插件库/Lskj.Control/AuditPanelEx.Designer.cs | 42 +- 插件库/Lskj.Control/FrmExport.cs | 80 +- 插件库/Lskj.Control/GridControlEx.cs | 74 + 插件库/Lskj.Control/LabelMultiAutoTextEdit.cs | 7 + 插件库/Lskj.Control/Model/ControlModel.cs | 2 +- 插件库/Lskj.Control/Model/GridExtend.cs | 9 +- .../Model/MenuStrip/BaseMenuStrip.cs | 13 +- .../Model/MenuStrip/RightMenuModel.cs | 6 + 插件库/Lskj.Control/Model/MessageUtil.cs | 58 +- 插件库/Lskj.Control/Model/MyControl.cs | 1 + 插件库/Lskj.Control/ModuleEx.cs | 109 +- .../Lskj.Control/MultiGridLookUp/FrmLookUp.cs | 58 +- .../MultiModelLookUp/FrmModelLookUp.cs | 6 +- .../MultiModelLookUp/FrmModelLookUp2.cs | 6 + 插件库/Lskj.Control/TreeGridControlEx.cs | 977 ++- 插件库/Lskj.Core/ApiHelper.cs | 13 +- 插件库/Lskj.LserpAll/Lskj.LserpAll.sln | 14 + 插件库/Lskj.Model/BillModel.cs | 10 +- 插件库/Lskj.Model/ModuleModel.cs | 13 +- 插件库/Lskj.PubApiSetModule/FrmMain.cs | 7 +- 插件库/Lskj.PubBill/BillModule.cs | 527 +- 插件库/Lskj.PubBill/Model/BillSourceModel.cs | 26 +- .../Model/BillSourceUnionModel.cs | 18 +- .../BillModule.Designer.cs | 215 + 插件库/Lskj.PubBillManagement/BillModule.cs | 2474 ++++++ 插件库/Lskj.PubBillManagement/BillModule.resx | 141 + 插件库/Lskj.PubBillManagement/DllBaseClass.cs | 64 + .../Lskj.PubBillManagement/FrmAdd.Designer.cs | 81 + 插件库/Lskj.PubBillManagement/FrmAdd.cs | 112 + 插件库/Lskj.PubBillManagement/FrmAdd.resx | 120 + .../FrmBill.Designer.cs | 639 ++ 插件库/Lskj.PubBillManagement/FrmBill.cs | 6638 +++++++++++++++++ 插件库/Lskj.PubBillManagement/FrmBill.resx | 120 + .../FrmBomSelect.Designer.cs | 196 + 插件库/Lskj.PubBillManagement/FrmBomSelect.cs | 260 + .../Lskj.PubBillManagement/FrmBomSelect.resx | 120 + .../FrmDocumentSource.Designer.cs | 245 + .../FrmDocumentSource.cs | 601 ++ .../FrmDocumentSource.resx | 120 + .../FrmMain.Designer.cs | 64 + 插件库/Lskj.PubBillManagement/FrmMain.cs | 186 + 插件库/Lskj.PubBillManagement/FrmMain.resx | 123 + .../FrmScanCodeAssociation.Designer.cs | 98 + .../FrmScanCodeAssociation.cs | 82 + .../FrmScanCodeAssociation.resx | 120 + .../Lskj.PubBillManagement.csproj | 209 + .../Model/BillModuleModel.cs | 15 + .../Model/BillSourceModel.cs | 133 + .../Model/BillSourceUnionModel.cs | 76 + .../Model/ComboxEditModel.cs | 41 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/licenses.licx | 3 + 插件库/Lskj.PubBillManagement/app.config | 35 + 插件库/Lskj.PubPower/FrmMain.cs | 2 +- 插件库/Lskj.PubUpdatePwd/DllBaseClass.cs | 57 + 插件库/Lskj.PubUpdatePwd/FrmMain.Designer.cs | 193 + 插件库/Lskj.PubUpdatePwd/FrmMain.cs | 277 + 插件库/Lskj.PubUpdatePwd/FrmMain.resx | 120 + .../Lskj.PubUpdatePwd.csproj | 112 + 插件库/Lskj.PubUpdatePwd/Program.cs | 21 + .../Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + .../Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + .../Properties/licenses.licx | 3 + .../Lskj.PubUserTomodule/FrmMain.Designer.cs | 6 +- 75 files changed, 16227 insertions(+), 309 deletions(-) create mode 100644 插件库/Lskj.PubBillManagement/BillModule.Designer.cs create mode 100644 插件库/Lskj.PubBillManagement/BillModule.cs create mode 100644 插件库/Lskj.PubBillManagement/BillModule.resx create mode 100644 插件库/Lskj.PubBillManagement/DllBaseClass.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmAdd.Designer.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmAdd.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmAdd.resx create mode 100644 插件库/Lskj.PubBillManagement/FrmBill.Designer.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmBill.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmBill.resx create mode 100644 插件库/Lskj.PubBillManagement/FrmBomSelect.Designer.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmBomSelect.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmBomSelect.resx create mode 100644 插件库/Lskj.PubBillManagement/FrmDocumentSource.Designer.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmDocumentSource.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmDocumentSource.resx create mode 100644 插件库/Lskj.PubBillManagement/FrmMain.Designer.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmMain.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmMain.resx create mode 100644 插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.Designer.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.cs create mode 100644 插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.resx create mode 100644 插件库/Lskj.PubBillManagement/Lskj.PubBillManagement.csproj create mode 100644 插件库/Lskj.PubBillManagement/Model/BillModuleModel.cs create mode 100644 插件库/Lskj.PubBillManagement/Model/BillSourceModel.cs create mode 100644 插件库/Lskj.PubBillManagement/Model/BillSourceUnionModel.cs create mode 100644 插件库/Lskj.PubBillManagement/Model/ComboxEditModel.cs create mode 100644 插件库/Lskj.PubBillManagement/Properties/AssemblyInfo.cs create mode 100644 插件库/Lskj.PubBillManagement/Properties/licenses.licx create mode 100644 插件库/Lskj.PubBillManagement/app.config create mode 100644 插件库/Lskj.PubUpdatePwd/DllBaseClass.cs create mode 100644 插件库/Lskj.PubUpdatePwd/FrmMain.Designer.cs create mode 100644 插件库/Lskj.PubUpdatePwd/FrmMain.cs create mode 100644 插件库/Lskj.PubUpdatePwd/FrmMain.resx create mode 100644 插件库/Lskj.PubUpdatePwd/Lskj.PubUpdatePwd.csproj create mode 100644 插件库/Lskj.PubUpdatePwd/Program.cs create mode 100644 插件库/Lskj.PubUpdatePwd/Properties/AssemblyInfo.cs create mode 100644 插件库/Lskj.PubUpdatePwd/Properties/Resources.Designer.cs create mode 100644 插件库/Lskj.PubUpdatePwd/Properties/Resources.resx create mode 100644 插件库/Lskj.PubUpdatePwd/Properties/Settings.Designer.cs create mode 100644 插件库/Lskj.PubUpdatePwd/Properties/Settings.settings create mode 100644 插件库/Lskj.PubUpdatePwd/Properties/licenses.licx diff --git a/.gitignore b/.gitignore index b02974c..f2f274c 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ *.zip *.rar *.7z +*.r[0-9]* # Confirmed unnecessary large files. /其他程序/工作部署记录/Smart X1 SDK V1.0.zip diff --git a/引用DLL/Lskj.Data.ADO.dll b/引用DLL/Lskj.Data.ADO.dll index 5d8c72b3389c5cf470069c1141369f88c65d8dbf..08f2ab0abfeff35051dae3d527a5f8bb7bf8002f 100644 GIT binary patch delta 70 zcmZo@U~Xt&p3uQ^Lo+&SW6zFN0=|bOW6R diff --git a/引用DLL/Lskj.Data.Api.dll b/引用DLL/Lskj.Data.Api.dll index 60bf317fae3177d949013f5c60a93d2968ad0edb..e4a252a0373aa7481b92ea7bb9a875e077a3ea8c 100644 GIT binary patch literal 176640 zcmeFa37lL-wfKLh_iZ{;b7y*zOqR(qlTNxP1i~^iC?u@1gNQ7Oihv3T7kXHfI3bF- zARsQF1X+yYf{OYS_XQU~QB+W$;*%))^gWm7`h5Can*aBls(br(PtPRqd;jJ4|NQdF z^u2XzJ5_b+oKvT&&OPR|>%FAsc`5!Lf86sv!BhTi(%<=iwh>)k{;9I}(foreKGAdZ zgDal#qI0H4E^GuZY@Bia$eCwca6xeK$n(!0Xo;eCYnAM^CQK7Hp^@Ron!(;J~R zn#7}Bo34_i^1t_jaPxmLhtE6<0ed#-CT7LW0~qnVTr4_A_-V25 z`iswg$;E^(e2;6FwAJAqCL_!9);FdbX97^%r0vqs_qQk9KtjP)TCQb% zXjZy|G&=UPR{E8Hf?L8%d*69kkN27*d%PZnKJlNiMAi4ag6FOCJbyz{9#WR^8vI_E zyyh%|DgCVukgkvj26<$Lf(nmf&C9xctD}5hkMdQAy65mWq`cEfPfLuKt}Z0icwf4) zp~t&0SVW-G?5Xus3Yq$Hudz44WGY={cZ?2)Z`I-MP0>EvoAMb! z`fR^!*k`uwNt#m3)^lFt4q^&kTkn->peTLb%KzIr^WT%3D}TzP&xFj3mz-WAXl4?r zpB+Yc1$a5&qL&Ruc$RAC_9v<3ZFh;3&b-@zmHrEgg*MduB|F@iU3M z$!K9R+o@>{(c{|JW9D>BaZ-rWs)X(^OK*FKCbwwiJRrcq=rt(RH?Dn?1A#No6h!Z zCO_jb-usf1@vNI{uph4%Gp&34oM&jNjbbye#w-ko=#VLwIaD(y1XSy zW{WAVvvhW?H+i22my>=>d3W(dKG4r@?j)kQBP0d5eeOJecZtkTB}}SXW)!8nDAdoG zOns%7%$xLha-fzq9W%$y89F(fGdIj8n&hlG6WkcmOwv0QeDg{Z^;}ZfZ>?ttHkI}U zO0~_&`3a@3$7box*M*0D25RK(G`w<1Z zIuKYf(bxhvsczyuqQV0$6_#>C+Z92fCI)fxTCy<^L))X2V>YFquK1bSi%i;Nw)IN^pQ~)oYcAn{eippGnjWQ7k#+ZjVo}F-?p`fSqdgRg znO5JHa+6m}<2+!UJ=@FluDvkN)b!JyvEo{KNywCbP0!P>*{sRN`c+0k`W2YT&gxfq zhYWF^ZhfPd_470`ziwS3Sv>+|BmD%GLUbl%SmO>lW*|6HI`k-hEYlNtiX^c-G0}Km zl%^{u?waQ#yPF5v59|3_lt*zHTAyt^0;ra5JjTQEW5F$k|F7Efbj78o5Vmpm@gIH? zdG>q~d5+lKJh3*P5#{L^vsjv$-AHruTxn2%Li+d!X@*qC>mZVjarpFHW$i~)Ki+*pB&j#FMD&Os$JXKEb-K+TFThv~_coXKwoY{9I{-wh+|9d;YB>O=bv1Uk1IS zKYB_}V!U=YPpn-VqdarB>)^T4#M*UgN160l*T)0`vs{I=cnv3xI40&=&w`n>K~M#08=BbF9zil!LJ} zk4OE{rC&ioXu8-N(&{B=qg=G)k(A@oESfKklgn$OG+pX)X(qd*i8ry6F6M2c!|j-; z%(?MDxl5V@XuH6Z!7-v~tfTLt2;2Ai($U{%MrF+1zKeDv%~iXR=I!0nBvhG485Fub znbAS9ZXYk#&mZrezm0zGpD&H;+h0U!=I-0a=S$=887_x3Hh16cF<%;o&*4#;4t#`{ zX`05_BuP|{BbcZj&#$##38TX1b!@0p4sXbNGt7J=|C7rP49LJTX0Vy?i>6pFdC5v9 zAbX*&$D2NZXL0)J{FYegQ~ppD+fpHT20vc5aTO3C&1gG(1*JFO4>6>h<_q^!~dsv2I$NCM0`2DVi{wGj_Z*d&3 zk3r*8pFgX-kz#1u5M}Kd#_vE{Y6QEfi zJO?lcw9Gt>69g480o7|DrlC0z3s<15c>R6MK9k$D!Mn<3ZE5?OeH#}^UC$N7_cQy| zSq{;wfXu#8!#3R#Jdb#@QE9unNzx8@SVKtqkS6VjYH!SFf4ngo+O5V+n2D${^XIaS znKYBJ#!Q(hY0RK)%;da{8PvuM+Qv+_H3l;@W4ITK#=Xp5X3y)+Ik48mr~~zgv1saJ z|G=15G2?bgy}#L?CH4NHy~s_0N^pksSjALgBRm;)N@&X)GnIw{=jx1DZ@`SZjeXj(J#VqoH@aNs(ETG!QD2&+a*CsXOVw^IUttc+cv>A5~Qo>Ts42l zGMt5`6wy=22^P(U#nUKfSUlhl5BN(4{G|i_GGhj2u0R18@RtwxBLn`5=`)2)R@%p^ z#-FA3)s8u?ege#K)Qq-Rp+9Cu>sd4ASnz@7z{yoK#WQ2qiuUCXhc8RQm!;tg7`j)* zGXyUWUq-^06%~Ke#Ak)kx|+=c$y4zsMIq@xGAG*5wZlCI9^9mZ@CI_N0w1>K5M;I4{W(ovGi zH4!G^tdxG=4Pm##iTbTzLXP>FlWs%}1!qxBSMli|Y*v8R!M4eb8wPi`O#cu!1rD)0 zZvLTWr8zW!cu`nRt1w3na|sUXm?L)&QO7}Z=qQJqRpxM8if1;#-Zz2WSTp56%{*;t zZ@9W=aZGE&{57tQH4cetyl-rp`5M1=`UNt#*EQ}1C%LoK2ybze1mq(Z*CO3^T zgNFPgEB;Xvzh15HM_Yb#%+?o4_G70-GxU$MkK@hpvy?+X|DXoV71Is@i+b1voL<-! zJlGv9th`GhYr3S47)*;@*tX=&kU1(~7pQPCyMsOc2@W}PLiJpL7VGnP^AhF+v$zUH zW&Ed`r%%3jC0%06IMFP=?i|a%o>B2nscrPkVspxN|5V9xYL&ju_@|j?m{ZKDjYC1s zoYpvwNA<-NyTdc5Fx;mQNg)jQv&^%`Ki@b}l0Bn(J}LYYZ7nC6UMm%zZJu3!2~~u3 zo?h{vQyY;wpR?V6t~uR2r}13L{#;d!sNgwN@Er3TSHbhl^Tr=Gr(bu@5ZeA3=8XCZ zuQ5&f#+8!kbgi@TYTm0CNbM(iHFl~_uWaYdtMz-P*PLKG{bkawlRR^xpLgU~Vb8M@vdM)?qW^sJ{Q5d}y!14K9|vFETGuLFN>wb3AiSOPmC%%b#02$ee2x`3*u%=XvHh zb6#)>+08k;T*^yVeiWM>9wq3`-`!|(=XTTN8aLBka}=Zc;{F#`FViyJ%Ez*YW4+oQ z>`xwD@sDhLe9p9u9}%UapmY-^FGiqQIA!m(&j>*|Ue~(}B2-Br7W0p97A* z2Out)T2&!^N8%TIJJVxyA1GWLLtz7(n7t0-2<8$yk1w^4%PRg$CvHUdnZ8JtpO<^4 zs@cs;t+KMkTyC~B8ep{xePm{vNb4<)t9PBWu|v`C2@<(#+&4wuYL&HE%B8B9-exQg&^7Bgl-@afP{}zR+CJnk0?SNsTJ|la*RcN7YwJcRmFGPtg;@C%5ujKR#21z=Pb&9xx?6hg&l+|%~~ad@se3$92pl^+9t`Ge>`zHtA6d+mDt;Twc-LbEZRtGoQW)z?%}d>UR4IX6zTR9v zb;92tf7~ow?2b~IG^eP{rBSE2r5DGl%w@BIi_A$o^gNZn&|F{^I)OHEtMaJTpaPFt zCy#}Wl{v2Q2FtSEXa*yeb%VK~en!Z$20N>=ENjq>#GrXYl}^l5nUNvOdSeuKLSt}g zJ3D)0i=Dl37CW;LhuE7e5xu$M-#GDd;bYUn$KDe0u^TNPd#ibidFyWRv6l-Ud+QVA zV>gjwclg+L_}E*TnTxydv77VeEnB4WI3IHmX-Nn4W zWmZ{T_}JTa#m8=S82h)`LAX86$8KxQiMN}#3zzw!%4yTd5`e0TVp)zz2?2b!)}eHOUT3SG&ncFPG8i3tdF8F4oti&FpvF7$p zmK9IwnHynQH<}weSl0W^`=?&eg=M`t>Vp`|I+3HGU0IY_B4hLc^MU#d`r%!*7foLx z6a9mp`Jh>1?%F={3YoXhG#_kcF6}bAK4d;5`9EwvTwmjv56v^i|74b%yUaiBpiA$f zJ$DgUqD!KWn2(HK?U`j#&PUBhC#g`5-`!n1fBG^(Bw+(*+!)pU|oJgf%CFE!4Doc%AGFJnS;xbc(@vNop>HWJ3_326VzZc2XH>D>2L z{QD-Bu|w>cFPQs+*6RI!bAN2T`4#gO%6S!~kB%=MV=O+?%)qFuB0K6oFe6dsftX7B zRrA&Qe*A4<=tEq-IyZ@^Dy{ljMcCcf%-4h$Ucp|r`CP~c{jZy^*QWsZ51I$f{mQR( z{h;CaQu;xbybsP=@+Qpv=1bP>@D1~g$w3Nt>f1NXmqHW3w<`X_wF%FB$vnK>|F&fL zwlzC^$9&5*#C+S@9=_9Ndw3Yae%L%LC86Vd*L-*UQ`YwIEo*!Drn%RAGe9^N{D;g# zVl(LR|JnTWhG*HzCcei0PlO-1t{b&2r<%Zn^RA=HEqBKNb_! zzc9auMD@?fCT#PU=9eO>e=_%+@JVV*m*vK<%&#I*{d2kj93TV=KxW!Po`}r+wfVKk z%tx%u{8^{Wd_-mDBUWbq%=~*r1)t-T}_I=oB!G(jr0FuJGj}J1G6W^KcY#|EI-Z& zHB0g_h^*-Mw6vUF-(?bIiYd# zE0gB0^Gq7D*jlNvSx#y``Hdz|(@vhZ$>jN+T{QnAwr>5M`71NZ*6;*oRI{AYs^nJ| z&%f`wc>cXEo_}u_&&|$R#W^Xbv;H33{=}^MllhY)Qa7ub<+N5Kzq*@YejA%zzne9? ze%}ePv+cLcw%@whRx5dp@nznH(GU9+6$wQ(|aHp>Nh6_ZM{EXEY% zaI;+Eg)(}1)Glq7B-kuTXnV6<=0QkGXqF@}_bRJdUZAO@+{Tqsn`UU11l&3R;VQN@ z44q=@wIN$KCj~C!`bV=Q1r1+|%G5LZEmpUwDoRj6PmkC#nk8vXYj|u9t;sgjTws&9 zfv|ldRZ8F3P`q=c?>R+8jQmc0SdJ_3Z{ms!zl}Sz|BS}VZ>wI!+OG7%W?8dx(@^URreueXW4kJ`cV{Mj4G**7=&m^K*UZDW{D@{^jS1mRk7hgtOxH-95 zl3cU2T9u2<@}jV;W_fYzb(q(78QCl^5m=k@*eovv)-1_yOI|k1%Lp?i7G>ui>!+v1{ny{3@gdat#BHOqn;y&y+H5SMH|(QHph`%-eZFv;0(vv|IN}^hn8Q#T?5%Q{#u!&eoF6fvvXja|JAJmL!Yr z%5!sH1?`S1CIZgq$fmUXtF3b-HvV&0O<*JY{AT%p781>p1Ok><(RnRYqzI<T+ zrm=X%T>axR$jO0bNzz(EwiviJ$Gsnd5`kNgu=GKy9le6a<8K)^d;UYn^TJTclVNvN~u zBbe*?gA_T1O7}Ldp~PlMp!WDqhCY7u7%4v&>a@-B!J0{aCqIs5LE^3 zHB0guTnkjsMK#NZ5(X>}J?9l%M_kvlEY0#^ByvgRpx1m!5AR6&dP*I$dG!ERv;4GH z3K`4!3Ok~eREBuIq(_pp@kZ&a@=?4-^HBoJ+V2+Zw~AXb5oLyV3r2@53!UTY!RSI4 zy_wu5Jv;j%7k@JG&5~d~JI!L3hS@+GL3wtXVVCChnnt>FcA6zF&CQxdMrU@Kr7q0} zG>vrntTe&(GB`@8M-$&7R0(wwY6NqHdJJirC56TaRiITpXC{OilHDZrOubajvJYB9 ztd|@?R*Ato#>7jtemj20%DctBS(3p2)*tl?L@l|^h$Yk0; z_8O4#=d7F0Cs0_8O60kYk=x9IOPJ8h37^2r!>rl#V!wlOU9AFz^~zXLM;8ykOuWt zNQCvCcYX~1R^I;r>}s~OPKm+OR3vMQjhs{o;evl3CjqbHgu{RL5*C}nBRCg{ zr91@%eHs&wkMHh6-M)SSi&m$>z5ABH2^8WC@rT!5jGT)3puw&UmA| zX1u($fA-;n$d*B82=X&{xZ#rDx7O0%RgBMtbVDw>Dw0u+)mwy1>b;rZHuCT|-qREsMdq3Wn)!gII$c2d&vylwd> zXnCHN=UvOi-^|-3MYg(w$5?jDJ9relon^l$-b!9#Lu|m{>cy0V{x%QLtV;owX^Xzl1#sg{Ff&> z7WqYcmp`Gr2A&AbrdN9xj{G|;xrE~#rdOf*Zuz0XV5kwz6mvG`={u+7p&sEH_%wmP z;N7QoXhNg*N+r&%;M~)S+041@IEy=#w3j&-_gf>Fr>{5{+7s4P@H9yFO!gdp z8Exrv>8Is9=^*-P3oHit*f*9)$XWW#XkkVm)(^#)$K7=ahWTK(;xo*6({y}h)G7?Y zduWJ9;JrM9J6+&?5_rD^?Db;mO?j|mZ?We805JtyWigS=WJNS)yaX?>;fzOl1X86X7W?n#%sIeQrO(N(urkmS=+dY+^lSK ztZEy#>HDJmj?u-9yY+q8;GAwr43QL){Y!#htPy(m;P1Btg%x z)z@SjzaVQB0bbB9tPjQ^f*|%jCkZFFF}BmMW^B|eS7*ZN2T48idPd6Rw#Z}9I{FfK zT~8Bc`XS=Ee~_tum=}|4W?n;4_5eTuWv5!?M=n;gH=GntT$lw-(G(U|OQH&SMntug z1F04oe+F%BgD)stY7>A3vr)_!MARh@WU|6r?Pm6CV%w zr%C7!Osofu{(ZynB#yvRvlO%6(ijrzuZ%09%O;IT zG8bpjnKqy@YD;X3u%4-^pQCeBJOt2mj5M~Q^~4F_Iw641lX!HS#8fG^Rz<(91)Is| z`O9hSdEjaXBk+qu-QQNz+T)KF91uevEhyt#Otw|Q@?c#9986wr( zDrj!2SP|)9Wwjqrx^Q%wZPY+A6^;=L#OjyHKmKvNBYMpW6-BM0QK_&|sV?BhTtN4E@Y4 zyfyX#J-q^N^~QSzxm;$8#KDP+2#gzq5!?rSAZy{%_Y){3wjd2sx!@}V)J`C}-$me{ zIx;?7d(e=r%aCI2Ims6H8rs;GR7t90j020*L-(z-Nh}kq1Yf1tt{POahGvO#-3Coi zi$zhCV(Jw?gZIG>m&y34JCs7DIB}CONLzF^I71NE>#*WJaN-mjM`m%M`T!3$Jz32HQUto~zKsVEloq()9xis5{iv)-gso^XgShq7 zTaems)-6nJCdxBk18)9W|`z$o6J%c9E0pe~}mRB(% zXCZ|;Hg!D~(@frNWMqd<5kI!kNRkFMZ0dMPtv{zwHN+^>P)bxTy#N3xsaLMDAewzg5HKLPW*#WbS`gMvEdbtXr-lR(Ujha zPZOPw-Ih&xIp)dSvmEp!b+-%74>SjYOP6|0U z8xVE1b1AJwdg2)M6s@6y?$VC#(z`=<>3C)IFl&loU#HhXgK8-WAH7aUAXO{Ur`g~^4KT*c?$FWhXT|*A4bPqU8OJ-WmM}*O zHfoe0iaQZsVwYqBdcXahR}gtFev1DM$jI*Y%V#A2{|5asr2SIGT$d^CZ0iEG7fT=f z;9tT%NO~Bw+U&)Nma(x|i|obL^>b*ePR4E3|Ks-JnD6pkxTKB_$8`8EPyHX?<*KWl zz}T)3`c_kNAsKvw8Mb^N_$CkZ>r$n+wkDU~&VOzkpE8PToc& zdafW_Vvk`2WP59k{$!P&gEygUbTGdT*663*Mo!VBQ^Uc-i{g6~LS z;zm0uCge=@Mbf+s-Hza)3$e3P;~HMZucCR$_Aen|lcRY#=bwJ9cg1^JZTlG5r?qYE zEkhl7i?l4!F%17ZeB0q)!Zul-`$!C0^F?V*2T?tluR5e!M?E2WY>(kr9cD*_7OtgG zSoqvw6Iz$fo?LOHGZ^xIyu}pZZRlLfZiPHjmRlZva{epgaBC2X%x#08CmpXewUDW(AQSlB&9iAG$PLiR4*Z zFyqHRQ-%)nWXrrqyt=;R)gc`uJ%O%RB~4kcAvL{OUqO<7~G=w34D`;#8#E$JVnA@yaZOODoo`61S7~@xpuV`IlB)wX1*a1_=*{_;(_5s^Trm!yL(?#zSj{bf2h{UN1!z|whdL`J^ zbLr|;JXNAhmWgCUWu(+R&gUa;VSZ#gt>Tr^#CKtcsA|6=+8VYSdse**dmGiY97DD#N8z%2H&X zHTjPY8+HMfNL@=!VaMn)Q`#}QJa2mWEf~XZ(e(3MqI&BeC*`W*P|&OCrm;lhZR6oU z*r>+$0W|v7105p8e2zL+wGGc|v%0>omybO7tODi60hA+H>qdn`qSsc0iBwVWYAuK@Q7~p!|8*#wqmuoXb@@cMnAxd``w6S7?cVR`TQwhu2 z+*t1gzmU0_uDxXXMm8TrDd`nfnY%HSc=p}DC zBejp$_$alQ%*!Na_1BuszW;~hf}s^6_lOZSc~tisVy0eZ)r54jQi<)>o5ZvZ-}L77=#8x3ie5e!9=yrPQJWvo%k!MH ziABjl8?614|DY|?+m&#z^jM@Tdcb1lcB+jXvk<0rvmo^`kd7U}foW|;b&liy21)iw zl8tVY7(Ifs^{wq`-Y98)t7#;rI!M1&;Z-&J`NH25!%5($agOp2@`{RB*m_fY5pQZ0 zAu+;Z+_50`C^-cc{3ki97t;R>h+Cz9u;X~9FbBKlJ*?-Xn|pd?Y{m9J#Il;pP-E~XO664DtE5~#kyluEY-0MqfX?)RMxy#>UiGslw8?(tpaY+V{T-{6_o!H+hGyB=6tl zeY<^!+zZt=$I`sbzH6BXT1l_(x7&BE_v#q@8hKAv#F~=vbk`93FJqM{CUj}iI_gzl z9EZrN@e+Ew$C`3EHn6vs=uFUc!$nWt%t%+tZQ8axpQTVaQ8w6FkRB_ud7=+DqQZPb zMk^cJ;)IDzenNm8_qfO)pyY6S^`B^tpJwCJ7F+#PD=cWZ@W6mcb5rSk(xXj&$gxF6 z6{v1O!t+iAth@W6fn)?8wKvl#*?G9;aZ)mS*Astidwi@EYmyMfr)txS;bLEqtFyS+ zhv#@-EH!mV;iaev+Bt|;Qo}d#0jAnRudxp2SGDu7;0|!pF zzNbC$j#grci6zz#*QTl0&riG@?E3T7jD+ZLl*&vhUxnH-vS%GmCEaB{1$EW>SZ4=V z_u2e1>ZHB3vYkqNqjOK}ttzsnc51(|nBv8}Up{Ztx;({UQ{%@ck`1>el7v&$PfNpm_AUD5 zV10(~_%L+fM!|x?_^qhfroH-!OW~PzOvQN`W~|9S(rMwCzPG*C-_h!IiHY?(wzf@F zx%JNW4DW1ZkeFD83ZI%DOjX}cCOWTTJ7I`U7_yzP(8CLDdnYVPm__kUu;ErGNZ54( zNBYRFovJXU{6Xj*m>}qL zLRA{3Y(P$>J}i;S*8Szy7&Bs)#uz467`wBTaNronT*>LicpGiF)kX=sHj++RQkc{Ie?^4@XI4$p(ToC=*6ce9)$!fkEV zb18CObWOZr9KJ2ccyge#qTX=S2uOo#q0{LRxKzq4^+)oqlgvnPyG|mnwkIGV0%3k~ z2y_KY@i3Jog~-V4Xif-7xWd#&t_P_2Yi(&XbS|ucypR@Q9$Cs9sATYb$U<4&(I% zK%ode_(c;!Uf)Z_D5S#plkx%XjOG5G_e0K;GD~HKtb?$}d7jL(m#6#__>cKRAM!2+ zzJRCv6Zo}+U%>N^9q>02De%AWjHh1$FM0;B3)8LgN#AVZ>Wk@&TZmB7 zwp}>nXC~f7X&kvsm+jZ#Dv& zDP-ozy|{qBqs5yg#`5Mx(7%3bdl+e{?9EkvHYvEs-pzs-Nf8bs}Gn(jIhI*<7F78*R4Jvs-+cE2AQZu@+IoM=9H;sBWUs zwg%5ZLe?v1Fy9NMwKMVsdKnvWtc<+RLu$($7GY<&Bl0ZCkPKD`s_Zq$Es8^-LcN0f zJf6SiZ$jLs*vdGh*r&as48NYU&>ANwJ7g7ByFO*IEtUY|Dv&x4Sl7(Kd2y=Dg+PU! ztB*&;)ue4!Et=XQ$M8BdBRkHrjWaosB5hL0E2i|IkS~q{^Z<;%Bx9D?OAcZ0FBQn> zT$2IuJglQNzJ#j|a&#`>UUQ*dCUj945`HM6`*In3#5ruR;4gP{fxKoPWkl)XXcE9} zyd!x|9KnxSeo5V~$hgC?a#FrE4eVlpiOjWLE%xj;tE|8Ybxx^JWa?K)PKH(L;ldxC zpkndA4C8iR{280wErK}fEGw8r#+`+X8)lZN{>Q`}j!R=3rhD9)OTrnu{E}BQX88(v zR*?pX7Tyx?p_x_Cngp$>(?yT%WwRg$#4SkF4`G+q9%{QrT8qq`WH}IP?b?a&OK7ca ztt3SR&LV=g*49jIa)*=wo=>L16!rj<$*k+jH}$lS-edZ~E)(s#yVlz7T4K9vE#0*? z>@IHtB~wVpE#^fQPhKhQf^-DtkGC~@y;=XiHpt_>Y7t_}P+hid$R&Tx`X z8(&Oh9hveLo0S?G4d-OhEuP*FAhv>jS4%)kj1|!RbQC+~o2Yi{2inuWyOmyITIqXp zTkmR5`kq!&iD@O3BN*e9E%H%Lqb%?eDNgv%2-49tiFBU#56gR2Jq5_&ivfaq!cAm0 z`q1QW=t%lT;4TsSoR0~!y%GAbyMc0vzmeEi>^Os@vl?@CkfF3&^8uGESi_rqbx2;g zxT>3lrqJjkQ)7T1?P8me*d;*Hs?bNEbz1xg#rwtnV*BoTl;{@)!C}Sxi9Q1IcCcN( zw8_aurvhT&LJ?k^9t@-+^)Vm;ZIm`wLQ?$9ZKO|%6l#hLCIjrf-Y9rQB0Rq802p)7Q*= zBph=)+N$ZH0*MaG)r(0serSaWP67`ZN1yKmA1MG`6*d&V}kk}#k9JP!593h@oJZ-Vg^} zwagY&4d%Mx#=2(G0Lld6jSy5{rs-9^DN>Br&PV$NCMTD0Kf zQFuv+{0IOHCBxMfyo^7Jp=7vOSsk;})Lz_b zTJ#jkAEDx1<|y5mH0a=f5_b#*o1nNQL~n9)X?nY+8tM%GD{3)g zVsFmycovW9a|L@X^yg8ba?4W-70~}mq3BWCReg^sjDK5UHWH zkUJZ_*5^r54v%)>YC2!W(OfqWJ+!f6m!)+i3=3kJ*Up@cB2{0>iVSA{IVlJQL>R%i z8OOOr!qjz@DqL-J%No#Of_+$qs>*wHEk75p0jn8_;uPk3&JC_#$J+cXyYBxgGM9Mo zcRUyHlz)h0?+_TJz|Z3uhrgW2B7fHauSjD4N&0=$p0^1Cx)i|^rXSvr^%fFl?JxVI zZvuHeL^iZ>FB_`p`LXfU*4D1a5v3p0^6rk2u9d#go0sYcq|D}%-6NX#0yV1Yi&0#k zrC2d6*V7YkAO+Z|X@!A*R45KXIavjFfs0Kigo`Nrj5GufAkebF|Aq9{%0l4B8o0^E ztfMd8mOxsY&{kIUU8E{n!-dN!0#wEf5jlCh))KEoPETi4YF>|5MY~{%uBqo53KW*m zRS{-spKJVGsC_j_LOaxo5IA=}j!BgU{9bEE(es$>9Q&i`M0<9 zn;2fgcoso=08nLv)hrh{+kANT*Rvn#6j4||2vX>^EvnIpEp#35y1ANJib`YeB@{Gb z6#yAf`4+?qvr^P)v8KP%vNMknN4@(D zAY|3rM+iB_C53*(RP9W!QP>YZJML^-8+EmI#pJ*ny{|i7a)PX=ZNv|xTtTg|yDjJ7 z?6+=YMlIgNE3_MQXri&?ke5h*Gs{$FX;V+dO0A@mBd?^pnO;$i##$5`$AkGC z7)R(fUP&T#!wDjf-UlB3kRy^fCZZH{WK))mk7;Wz)xrv6^!DDidCfx zqBrgaqB!D|;;k`uj%sZ?)I{q|T+_WzF@i*W`W@<>3snr|PZm{c8xH3f8kCxiy+;Kj zbRpY~@!l2B8@}t^CEConu)=imWU<0@qvI3egBg1rxS%Sx%-9&iLo;@w`Z@wRiwHZR zLNQ{zl|%l^&GM-;IDEKn^P8oUJ@2c?4i+=sfAJKyy(h}D!1Hj+{dpe3GY)?*;R)c6 z@htNU)4zfDXCcde&7aU>2!AQ>55f13q!8&vfs@q}_;Z1MpFhN+{*$}R*Yk#a ze}I|Th2^1*>tk1^hc=GbP(?532bTz~=?U^hys0>UV%`J##R^-g-bp9wQmH8J1LS=F zL9_!#9P=G8C=#uU?|?S+md=Bo@OL?3bP%P`4F%f3>~Oigd~#F(U^;36geKo`Kj2BqDaO| zbqr*eF*XJ)HKjX6%E-<60XF~xyt)Axa04*V8UVYIhs3cPd^m5g{bh!%-8DpHf}Iq> zqji5C88Z2EMom#^U7`OcW{A(Opt^3z@6Hwa*v<@-Tr3t!76=z-+WVg+3y~OjZJ0$C z^9@5y+%~w5$y-mTcI^0cIeZj-H8#27s7RZstMQ5-xoz;e_-$Z6eCj)Rs$nCXb-+?) zy4cOW0q@&~uAcrFR3-jcJ_Six-C8T=$nX{cG1R5pq<*W!0_0;atxbSlJA*m3v5-C; z?~P4lp=a4KJD#EIoXEWiMg!f|>Sr1njfK)Wk$Wu}g^os2-pZL_9uKWc$?~ z+!^9jraF$y1fuQh4I$jBg+LUt^QcI;RvXaKIfd#`m>sOG2is18m|}6F7fhAI`mFUh z{*$S4RHrt^3G;BJfH*Upg^KvQ^)DiKk|y6Kyq}i3*k^$S$4E{SezQ1s3T#*gi7ly5 zOTRBMWjQ`Fd5`8?qSg7!QkgBpMy9P#ggrItkIYB}#~50DCZ;6YXDjHl6}Hb<+H+1M z>a$gRe{`i1wCyvwXhNTbKsIh#eHH_TeYT?2XDizKtk*1)t9R1f(^%8o9661qxmS9@ zSx{gTI`MtHv&qB{o+%xGxkWCG46V<@JH{5S@8_h|lInT}wz`Lm?kIb!OR5l5p}MCH zv({tZ$yOSjuh=ful8RYu?P6jZ%JH>Xw>jmewdpNRAl)3@b1V1+-WlU)O}76nVkFU( z=g{^D`cw-Y+V1xaAPD;!KN0o(xsp&!OM7_JdkJE&J+qEo(~S}^;gn>bY#peq3sI@9 zF@4p&C5aedxFXS4Wpi0FaAu(KYgzQ{OPI3ME-Obg%3hh{keE+zxBdKL6ZUP_ZVt64 zzdzp1Y#@nk$9D6$?dD9ZoBQeJOst#x8I68)L(ZirPt5vz0NH~^ZvIapRnLPTc}Mbh z7k{EChB|SR_ZRW^0(v@xi%vYj&+~b1=NZ~^2zsA(;RkpkG9n%N#Y{y>{|%mDdXjjL z^K(9BznH=iv(dlb0>2UXRlvh~CGwX9B>#WM;8M;n2oFgDD(#i0`?rYadx3qCzpxxR zQ}R;6`!X&->%~;CAEOlc7CMzUFSYf<{KV9$_eIloo5bjp-HHT=r+L4mnV_uEZ4y%* z30a}|W{`7%rHP$jG5tx>_2%)?AV(QzK0{J3zeOJH(h|qSFA%~^nDgC*;aBooQ@-Xbnd~=IB2`% zM81S5#tst;isH~nCFiW;#93T%#Zk237K##fD3VT5%+4n{vmxFpId{A0ub2rDJ;hi(D1#O4d3&DdeOUr&%$O8G)Q2>!n)kV2o0J zhrBey)*&9!vKMo~BvXJq_GI1ow_9w#qvU9CM;)$9IlCC*>bj8vmpW7(l|F~w9ojfd zM{+d1ts`5;b1`=?D`D9(483+3ya`ypBMp|PC&(zFRbP7!MuE}F@=&<2O6)3JSmnhe z3#N=nvcMDglHLL?<4+ntz_xbk57tZvEQN;jQbqnyaJLi zS=VrpChoN*w8Kc1)f{J$Z6ZAfvw^ITow{eMt(QWxDo)hcXp66{wqOz7*W5raIB>6m zT|n+R!PZ14o2poMm-vrC>k79#LJ72v$~I#?mVfv1cOrl6OGP|d;4dO9vgcbdxF9L# z3^((fM3#gyL*UORyeH2$#oz?J&k^}so*w`n$^e01Oh9DGl{`bZlrv30WXaV$Ls=ql zxS02QU}qp7BwzRs^t@?c7xNdEBQoZ00!%S8jq5qqOsSdAN_-k+`7^VpY)e9%MYieB zwn>Q3NyhvZc{~{j@xmu9A<)v%P_48m&n+%+^D72zhv6)Fp?E(Ld9hUxep2!xL|9}; zi16+T57&y?lvKVe!PK>)um|Q5B`^jtEyYC1YCWP$sygzT7c$R z*&*f?u>@KERdTkGiD77VemR0joBWefF$UKR*J@|2;1GO~91#o8d608ljtp=o21ygi zkwJ%Og*Bd~1`y>Gp&|-*u7rYQzzPz%6Ek212`2>*BtwxPVYSj$)k2mM3u9Gr2B6n0 zvZ5puA`5M)-=oxpT}utueO_&i!*p@NERHY@yOfd_M{-1|_c^;EN5q)V+^sDVgK$!O zJGdd~jm%ZArniMfYnhfs>uVc}R*14_B$KQs=Vj5lu(B1@*0xx*uCE-p--4maf`i2Q z^!45NwDRXSTMl<6kLU6CQ~qFa(b|B8kNWB5utWqGKKVm_4&u2CejDe{hZ7zLesK&= z(Az=!U-P^Ucv!xav!1`p=+Ha(3;C_sqGm`pK|e}2i(g*8+Ic=8jw*aYS-6g3;Dk(hjnVl31jgTs%c|7yujjo$c9J3+3N5T4*3uX zR}o?GEP58>+}*Z>E=$EicRX4&CqSh)bak8rUckMcK1MvH+dn4v`n@UOAa2*WnJt{c9QZ96e^?pi5OiKMimr~)wQK`Z_2ei}$QK=JuBQw??YaWMF1{7BaF>f$#Ojfux*C5*G?;^r7 z-w)#%=L4c!JrkHr+Sa^IdRH)BEH8{VApXRnvvS1=IW*!t`<{*BS@M!OJ#5ySk51gm z#?;YXjw5!`19JTX$3Qk!VWKF6;6m19DMs2<^+V84AtSt+c`0nsulpR0&jWE$^ z-$2_-6NeL((;JsCV7+H4TZvJ3$aoz`1jm00ZV2H}NKc!#pxZnyU243i9E zZ|5NPh6BcE^~MKLhQ$tIsWpft#-J3cJzi~DJC-s=1&5dpr1jc2b(aieF;~y#I)^X% zUcf`NNX8HIYuot2RlQSzoyT91cljrN2bU1uU&gN`SM}&-%E?uk9ZsN%d%xqDJ-x|% zz;Vz*eR(b>`}%D_d7YY8#SX-H+iQ|GvSm<`TjiQG#ufz@mwYzdl6(?&%aPa>^SK2d z1eQ~|my3x#b$J@$5%6W(f^DI)y?%SYw}b83``1I>pGrN-x}Jzn^JADiu+TYuny;0~ z1?M{z8Wc29W&X&J%;VFXLwt~is^1%g@jPjt=0`!svj%}VwC?}rRlX)V}tVLwxuueHcTja?c zTgcv4Q#%6cK{@qG&{4>jg``AQ%l(NxV({JZWiAG=rwF~`3s&?RRPCi=?(XIz{LvhV zy(j2II`U;cc`KR4ojFG`YZu^{KfN85T5ocSWGl^wbk^f$nWyA}wN0^2Y&SZw-IK zU9eB#gDT-2&-+uQZ&SKlpleg9V(mbbsOkamp^|mStLJTq*g3{UUy>Jk^KyQY{d){9 z==koCO>t*tjIVUIe6RO;6HoIpwyyu<1jzB@dL>OuLwmecQdqwLS=^xMk6QSbCuSk+zD<39p#*6ql( zPP`}YA!-)tdT4TYu@6?s=x_@rrH7YQwLexit8@j>l^MxuywSu&-bhTaw@a5InZ$AQ z91RcMolm{Uiu_rP&q5M>mB+Td>fLsKtL<_Ha*nqDtZUmp4D^Y%z2)|qX0wR43!HN> zVyq>ghw)rQcvyN@ZnU3d2OT_b2ZjCf*2)Nvg+q3SAO~u$ZsyHRU0kcXg)M zK`VNZ#V;osw^6()S2t0f#ffHHXXaAEYX$$E#0`axpO-sm#ad4WzLQUJ9iq(dx5|r8%3EgDHtL`qwRM&;K(gDq zW)|o!G7nZCqk;bN{^c=`;+4iHWw?ecatrNa5!GPmareB$Rk#d;K{!ezm$kx{-sDsCcPLTY!8ZKo_IWxXl?RwdXI;x7X)g(jnYAy}=q z6xgyDyvuhjWRuK(*CN@{W7O_3-*+uAI9&=pUD-o$J27Ht#EM)Pe-hudNPF+0J)5n} z)o-7ttD7jRs274t(+9FN!x9=ZPUBFhOqS^{!@++Z0%`t?!-^*5s4u=0*07qkKB?FLW`dRkB;8 z3VZQ-9Y#E1j52j(_d|@>Vuxm>+4W51b?Ay;Wp>uMe_ZK$K63hCnl9&_mRu{%8Lc!P zBfXHKtrvQ1>@g(}>wjH!Zm2S6zn&c&PWCYlLLEgK+X*2kXJ2fO7+uWTZs8h2f5r5N z-Gbxxis=nQSms|ftKFf-%N}Q}H?&CKw=H1zMKN~?6wRD`0lnbx8F2WR0rpW8Ym3=H z3^UH=58@9e!bMZK!7S!YvBC$p-C)Y*o>1V_&+YZ@jNM?7`*S&Vz^ws?&wj6xZn;4E z7+1GY0RmEKBh8nXDkdEkmk%}*$&JBczMjoT*4`mBouPH1?T69#RzQeH@fY7~83uki zup9UbZM|aqIaxZAf6gl_i;B=eD@OD1bzEN$qV^edU;IcOEVL@?xqBfhTuIEV5pYWR z$qemECDJoe)H-~@CguA&vJcF?-Yu+CP$LJ&a8)WMJzU#lyj$thLj)Jy z{^Pc5B=7jqAUNiZee8r zCtgiG;uyA->$8;W9K*JNQkiuOtHZuUe(UTr%Cq&|YC%J`XmC$!V?IuA#}i30R^g08 z?*IESp1H=?O-shs2nk_d3crYFe z`zaZ4JS0>79`Q)3MAD_-MA$`PhRp;RJ30L-JMkQdo?NZdBU$|xQR2Erzowtk7h)@AJ%d1+?8 zLaENVt;9$ZYgLuMh;$LCLT_BOvjwBSiBPSU1xvoQSzpSEb`idT$3V*A#A|D%Bby+2 zBec|bKQY2WACTvSe6s-5Xj=6l0oXRz^R6-BIthQClH}Wxgn!9^IblaasLp<{*=pCl z$pAK}TgI|KxstRnyiDV3Oj#RMsU9s;Nd-@@SHmrvB+y~iU1l+a2t+>l(5qmXyFy+2 z(uRj*>f3%7%~kClm_|siujE)vFW8!@$0*?^8-Lcy*)x{U2MzA8pAQ=5kql0p1#@+d zmm4ccL1+`@@wp*&LoH> znJVO8&@bqKUSXB=u6Ivk6U$!lqH~o5JM(Ks!5r5bjeS6}b#Y(mG3pmoCEGQvTl>ji zb}yhmb?XSLvpcueOk?%04wv!{lX=@Xn~H6xyqiu@&RB3_FXat!YM@l}a{AqtS22?h zmpn{?uhC`WBeuFapF@g%xpF!_+EYC{Tu0E=ACmE2!l2mZJ^t4m|T%<^>` zJLcESz==cfMN0fk59g|JwDD>n-SLKBq5wt-<>NPY{)dGX`PhvkeN?~pPP;jzk}&ZH zwH~F@Xi3YYJbAHBO6Ku}Vah*^M#V-H9md_O_(!uo1U~{;XNRBf&$sLVHX7ClbInXY zlR+EJ1Sj(t)6XjDfcF=ggD~=8ZrKK>5C!{(-EvH!P(4Z}Jwq+rQD%>js_+fi67Fxr zj%4=_bz5e%aRqpHA)j9<%5L__SC}B2qj`k5Kd$jIA415yt-*Oqt2J5Innh1xPD=fq ztw9_(i|@LYZBk^~70j@0{H0}nLm(*01hh1h#HKPA85uVbbRiysfl;<5mKTUs+MinyYnTKf+ zuKbXaDQ+l#M;@t}@5-Z`nn7G^S{KFo-1yXjo=&u=52E<`+*FK!e)iFQzy`0o2x(chx19&?jhzR73UM+k?bV_) zP!}ei%}*k;MccPUo2Lb5wn!5Ps^1ixvX6cjs?xdU=Um0lj<>*XIa5#>KVFV|RS@>h ziL=Si3!%vcd%1OHrA5QXm-LX{F+Jy;N%b_G-$3piqm_bezCUP1- z_L`qc_s6t#8QX`=%=gKn^QXF!385bI>g+YR%+)MF?ruCHsh$T7S62ZD&fsm#vmenS zC1mSdL!dLsvCsX*1|yYg{;l`X%$VZ&wXm?!Z4#qJR#!{yd^vKmJu8Z1JnPpbD@X9y zijkP=D7mWe8Oa)P8?UyO7VLspTpPIOmVNX#m{Q)l)qN*O4{m6`q7S#7U{JKtw3LaWd((R3cUqzG38ug!6fpM6m4(h0NzByEkO991+1MOlwKG%R1%i zLAN?R@Y5*^-Ed1+Upbd$Z$S6v{g5?0Q>dKlYI1p9&rXlf5u(_ma&e$9uM$jY(=XKq z^3^jLHN8SbFikP6(~6>Fiw}rC$0j%ucp}A8M#<0aERI<{j90WLh)jI5$v+4Y4(WOS z%o80ivcVoe_1`C4ak52tCP6)8k0Rm~;XWdBLO6Pi_eo&?%3smJWuNR$-j4){=^sFD z!ed#`rC_Md%)bczvHh*CwyX?c-N;rMi#9jOSP!0KIW8X5Rl4}8+C+cKikCDhJXfLh zB8x}};gZ59P$KL7IJQVDAI6q;JA?=tXm@(ReYu;4_DSy_;T?Ki zXsbziMfw3ff&obedr4EQLhE$GQl^{ZSG(5N^8>QYyFc0FvsD@VPgJQQGb8q~Ot6X9 ztzY3aHm@HHJ7;v8#Hc7%F^g!h88A}CGkl|!L1JPVxcs~If%e4TY$cYMSmI3HI%v&i z+P%16tB)$B^^xJ`Ca9^ z2Qp$}u8_$k+l_pR1(zrScIDSD=hHs~h3;5LbH7Ov2*f3DfkP<7@2#!l{GC{9?m$3r z#{g@MkU)RAdMH31hw*S5ucVwLH2xq4nqF(5kt5u(FUd$vlhkBAKyu?Ov1PrEb7oAx zHZbb<%?QBs>30WA*7|NtG&4V-ja_{=W_`1B)bGbq(r?9Nvhi9*&I&`mP^E$tw+Ap0 z(>mw1drxk)ef;#^-^0NvjfK-i33y zHOVF!ksM5+G*P9@Al;ILnp0ZP6RA=z_R{r#iern4* z=vzOXw}u!Q;(E>kYYQx}rHrwD!fwr(IZ;U?un-Do1x>mNyK_87w-;=id=ewt=mNL<7RNld zrL3KaPlRDE1L2*+?Gx*!Xkw`^M{ZkSdp%N()`JY_E@l-Dv{mNMhyjvbWj=4ML2fqIP2&4JJqc@VwA zJ_*al+ezpqncatp8_ZB|t!dgSs$Wx9ghS*n^3u$Fi-t{~#UvixCNb4DqHUs))q;b` z7tUN;6&|4K`^7<9zusQhLsHn;TA0M}t$0^hfwJnwOz?t8g}^9$pI{AcF9hhPCf-Z{ zRp3Pu!hvQwU-EBlT3X0!K&XFzL zL>HXS0jH_w*)wuzDEr11x5`>vcMnAf<4E<(1OkDyBP|B!XNG+!(Q(9QFSo29>R3!^ ziLFIjglTAr2=@*jp-11%-!_N}{U-XSGzQ%*<4;(ywNIoxxVv|(<^O7NhxxN_$@y(; zBHA2F20f6$$-7H#54Kat!!2@?m`-vFJI2u)X32JX`$l_d-)_;H#I)#*3reD~w#ZEn zTpuV$yOi3}wF+x{B{i|xb9lVUsvBkiR0ezeF?3PBryL(?EGeWMa0!)fWM!*9Enqlg zl%2sjvJM|+mrSoN*=5sj4fkqgiWSnqk!?BC!BLVa9l*l4S8MUes$30LBYHD zETI6a+!gZ5J@es{sYQgEc6hJH$A-bAkVqS84OGuXk3+_{VF^8JHz|1b951ia~D z`yZak)+Aj>nsg;?($bc+Y1+~Sxjh{MeF0T~^wQmsE8g?W7=^YO{#0O;^!Hmr zc5EftZ=tR~hUJaR(T}3-{-~Ql%$cDmMg2Mp6@f*aD9kYy0FLrEEF>xwGo9pb_yH+H zJA(;JCmqRG`v{R#dS>W3qP0y%x;*|&PaxBSr{wY?0b(tzzYDbV!e9YGJ@9S;?%Yo! zsTXDGT{YNwRRZG8xKh6;eq@o}$U7FBvXoBs#EmgMS*wEQQ!IeyZR>2~-XI${1;pZZ zq6E>m2n9oMJjGd*9>2Q>*EentcudPRE&*brR|KDPV$r%g8;?>AS>gUn*#FpG2)vy{ zFaJzuWc`)7RiI@4S(bUN_TmvCA~a&A$h|hJsga} zcjZKPSyi$IGFOJ2+UqV`>8Wss0JVY3U7^QS_5^R#$Rk3(VZA zV@}0bRTxZE6@Ykik82H6!tqL!3$@MtlWH4#;^y#bi+knbT3bd^!-aD004r>nR@f?c zRpV1#C@h`YR3^*Q%iXI1Yhfh!oXABa(dv3PV0U$78bLK8y(Wla(swl08nwI5UDxm_ zeHs^;JJ)Dl{;SN4<|Wr%8#gb#-Mw)<-(8ExI@q%0vSrCtmZkPEmIW~?%W_zzm}QBD z{s)SP1wsSy#!qM5WG6JN20Sm=nT~_=p>;(rBpd_0qC(wJjGDPKc{0zgnCd3 zmTv}%ld4=Fcb{@xquGUd1ap&aU#UqoUKLmGt}plNj}+X*qhvE0P1Mn#@s8r>#EE7L#O#KuWa2Wj38HP@sL)!V-xzF}WXM6UqM4yc) zi9VY;505?gk02Q^q})?WRcDIKs;@@vHuqU*89N~bUWPfF4x_3@wX6O=EM~03|Gyj# znALDVpDDsxm$8$m&zFrAH~pTNqr4v389}l#Y_!3_z&SKtuRu=!;K`ID4t+93sm$Rf z(St7_BBVo)5p+^8Z3~g2N#VIwO5#O}Mf{u!?76^77v@$Eb(Vq*;vvscgz@qG#x(cTMzCFw$onslEy(!_+Hg!ed8Nh|<+r3MyoMmO`JGumoqKZmA}Q?oFhK z-PX3J5ff=mWGhLC}@C%=L6$~L*)@W=Rz_>SBmEks2|)5MMd-XFd1~WTI_5d zdP5kkok84Y?#s{>4FN=w!gs0use@_Jd>_^XkIRl7v7^&O^b|#+OA(m^k$7zBwgZ+& zF{N#&l@MdY-AGVuP&Wv&#y}pkw73u+!(dD-sTC=0Ks5cYNHuq1)LRgR0AXxGsNc#i zT8vXYa}n5Krg|_nr=p;hPH3Ak$WF0hVj6o$(6K-_$wZ@4XX93CSGqVc=|q)rmQneT z-7LT#HP^IW6SJokZMZSR*^Z*J;Ld)N@PfxhWo60bdyTNY$Q+!{(UoCaD~9KY7^n{N znD|LDCmn=xVpBftw?!SKdsxWUnxkX-=`~{*+A`60F}}gI-H`?Ktu1;csF8)r-%kET zzSgTcQy#hZ#F+_u>S zM=r(Z9xJa+@bo(ktZh-af>$3B@w+h**o_dBfQztzAaO%4?J4uv z_?83O?Nvto_%sJKv2?}ew}6Bx&0!CIKz0CwvWSl=G0pALumZ!O@@h;hwOxTAd8cSG zSn|Q5In{DTW@ct^DL61&RS%`5Ct!$2jXZHNa3n7VAyC@TLW8tOj4ejLl0u+y(I63> z57FpQVr1wJ-JRW4TCxvH28vmK$D?%*8T|TkQd6%dN0;AU5MM%xcxf`M`t!xnn-G8W zek!XqqPZeGsI4Sl+bE+)n!_a>KK6gH=RQJfOT!{S2NJAw>*(teKA*HyR^lJQg0%{ip zJr5qah7g6JnK)>K6%(b%G^#6b2fV?*f{2})fyfGY!c98o*AkEw{SQU%bK~l6PHK<} zER+!~=-&m}6CFqBI4|b^oN9-WK*ZdeolS$YOn0GLS)vQT?HEU*opp-$4o*vUbRq>< z5S@>o;B`oms#qD(MJoORe|hkFLbD#_b=D&v2D9j!IE6uzAuvP98WaWZ!eK2v4HkSv z{cflf)=EF3+LMG$2y7TuA{spKV$TfT03Uj2y1$x+Td{3)5Yd^Tsx%FOvH!vvT~BGW z1zSJ@2N`;t6eXk)h1!LVT~cw_RARS#yve2K+rn|ChO?JW3t7eAe} zjp|zDMoJv!K(JfIanNoRx?UVNyek4v&<8Py4Pg?*h@1C5Lguc}d+_YHeGJ3WwvaN{ zP88Y*&x2h)Rz&rUE+j{=&gkRFdlv6dh^#?6Pyr25&BHDlW3Znjf+Y$Eiwyzq6M8Ma z4q}88ng^R{{OD7n-VADSJ5hq@&V+)Ml!xRrJ6&epa20e4rqdYlhn>UtED>w4Gn#2Q`U)%IUrb zZUAVilJ1FT6E~v19p5SzY)~W42&K^yxs_5n6UEE3mU!p_CvpA;oS^|%;in~qaWU9! zAcbNfQ1hH(iQJB#R23dyzM@-19d@jmQ1d(<$9*_PL+ISo(%53T|x zxE>*JqwYz<3Vzt7<#Y$o+^A;qUaU!4j1e;LaU(#@I9{gFpHNm<3SO_q+zE`8%*h6L zJQ#PYA^#x_(-o=Zm;hk7~G{$qIPw%IZDk)$jrmKzu{*gO>My_BX{ z`O&*-%}5chOk+ZpDRL)CZ9fS!$8PMu&{f`S$704SMbvLVy~Of#EHup3G=PQl@V;0q z;XDO&nWebWktET^C%L;PRtd{OFaSAI{6MruBSx0iN49aPw<(+lJ2BRuPiB1VkYlfLMKe# zr=36glBmk$5yfEgoM|@9;RecQ!`>NV{j75UUnOECin4c~cjoz;c$B>(%DgW+lfOxj ziK6Tsi3TPGO*7j$5)lmBcf`tOE*a4GaR@hU+DDW@US!vVcv=QNmR4E|q`S{10CNi2 zwcX&ScY(g4u(1-zbtuy|o8aI^6#PNgQ(!jA&JR~1wjU_A`$?Ossa>dngQPWF4iJb9>i#oMv$oMaml9e2?XC{X% zIXG=-HbovlROSe5X<{YJ;?0aa2y_I}!A|p}a$k%MS%7IyDmN#EWH$4JFp?r{WEbv^jIAk3uWqLI;|u1mGs z9%~xPbIsAz7Tr$ZWK6V23_y#4O&2=qFoNBQgj%HWQc`(NCuqOi1wkFiGw%1 zdaPcTRLw^C6m5UQ!}FJ(#f@Hc0GM$=DtaXUW=H2^ERK^<(IE`yMvvp)?$ML@*B3pN zfAgZ_=+_afg^8dhkyeUNBWoU=1Oi_z#OLr;=P81vS$)ok#`-*Xz#2bpmNU`ZQo~Ao zC`@=7BKRm6583^u1AG{ftFEcON(U>?s_L{oMxSCaI`TMqQlmExK+}~H*#roegL2^| z91xxW!Hs!M%1MyM^}27Nnl}sQG!@yKDIB!)OuakCabGX&0>od=grLI(p@GrYC_YPc z0cPT&AH&bN$NYB0l88o{%(5 z{KO|=oFXwC!#0j;fQeZk>Kjn)OykKQFw#KSWrc^or@0^uH66#(PzE#o4b?~(y5V6b zaFM4FdB{$_&G5xLU3$g?JxYwph`I$-98sXtM0|GmWRx=&eF>y3qggZqbbRD#aN(sU zuO7A9M6?7VVs*n{bP)VOQZ%|jP#{LyH4pdMTbjJ%btHN53c3F)(@fr-zlf)v) zj66f(U<7(clY!9)Dk`i4%`eil z6b+MY+);L?#HT@Q$hJepl39h_E-6Wd=||E7uj*pkLKXjov6I4}0vaYR=^24eGYx4L z)!{|AS*IuuV-YpQXcK9;p4EoV%AwPhm>U_9mXvjZC{yRGR>{_XOCGP9#L1@G%hXwM z8oSPP;Jw^LJH(6n$w|@AAx(2+4P=DV_Im+XVu14qOx-F#DK|HgQ6JE;tIEpLjJK7s z@QfFgr8+ParWb(AQ=((=nI}-c2eTK((9Q$e%$jt#iG54-SMWKay#~PqmXlhO4Z-t| z(SE>Sa_Nc!RNcwIIe9NU-m8rcBZ|#PISm+3k}bNNC`kqi-~8aQ=f)bf$H732+B5u{ z9et61bE2=)ug8(QbR;)^uTUGvBUdmRf$UdsI3q^MF;F~CucsTERgX*kxYg#0boJwb znct2`vLf>+f2f@vT$a?ZhsQbEAoF)=IB=0(h%t7L$j8+GOS5=r_7I(nU-7v`i3hI? zbraFHBMk^8dUp@DgxW}9slS`DQcw?i+;22Ck&w|*k4lx$2AvW$kxQcQ((-`e3&g`^ z(U92yfXCXuDa zQ(eQU$%^*p-|Xlx{>_P=hF`oZa2~j$m!O5`r76nBTxRGVy^Vi;(Jl0gGYR!hYHhGQ z^d5@W6O6tEys9T2moCI0&$z@3v2!Vwq7+LFrHCym>F%=sR*GeRuoO!ZrC8ckDXNY_ z7)|`K$T5sB+F_bhq6yFvG=D)>;scy?cP8Ei#uO*Ue4!q~q(2V6Kn+YeKEi~Q6-;;o zVFxqCFEonj3Rx`D6*}iax}tO>SL;akn2z|m)Dc5v&VI$97RLHpoNLg8PCDXA@oBX{ z&5fx=Jb^K_XgW$I@DS>dqtzi-t3&s=I%Imnp(91xRuTm!E8PxvcxB{8Kmvf1fWK>i zDK9Z#S9gk5L|!IP;HAk?G(}7IRpItrY;y|VmFcOf$50SNyE^iZ4M|Zle|WmJYNeV* z28IlwJB2W>pgiMfvWw`-R4v!1;yKn{Y$n}liSJdD;O-T{Y$*~I1bdJ*CZyVds#z!z)*B9yGDG`!JY z3U?Lcg1uUF^%LY$>#l9wh1FnN^e^}fGiK+3*U(r**8xqdhFIzFFj4jRGi=e<>4OXd zuWDE_b7DsA6EKib+sD7zQS;G&Jy~)3fenvpaI)ii^yd^k2e)>)5ks^9PVgTn9go}4 z_PX&*6M71G57&rvX=HcY%y%zQeRx7v9f;-Tp)OSDu2Y7k3TDvLTey2C45v~<0S-3v z|ALvX>&ieN$j>P7yv~95sc$D;>|+QY<=Q=3hYYyuBNyQlZrUOp^l^i`;mS-58XDb= z<;P$x)YIf{DyL1Gn$_KqxiWeZKILXfFNuWkG;b${a}HqO_$l>`Q`PERpF?Dz6+Bo| zQ%db)P4MK~qO&Qj`35DxBq2s!fimPwV!Ug@4PWP6s`_On@rC)E;TGLrYq3{G?ApKD zesz_D{j{gxpZInR5*BL^oN694oN9?)j_7zuN%ob7St+VxVXa5M7uP=>xEQbc1|ey2 z;Q~?`fKBBAm^Ve+>|DbXeR(SOT~XcpC;0R*JwEW`<^L4nP1U{Ja2l36rV}^K?h`ld ztcfqyGka{Y-U@+OArMcM#BI53%xS+vNZ88CkjLOQvLt1=JPh-Q>NYX<0D(D0g=06eEm-O3c@mZfkID5<;X~7Gl!y{0_M+Va40z(f zusoAlp2_vg;xzs~KBZKlo+8F^(kmy@D1~MyLS{$S%DEIYkU1E8&=&loMZAN#9EC=9 z;3odfj^4w+IngcjOLB8$uMEBnF=7#w_q$;l6(|ldo@&g2CXtLVG*=>F4`gcPH-Jx9 zGNBpOtQyGUn}g(mz1fV73_wir`~*~fGFM`*Rb^er(>oRqdk``Dh$>?C08t-9um=cK zBgMfUAR1!`_5jfoL$C*kzA*%Qfan)Pum_0d7=k@O^p7Ff14K&1hSw@k_5g8I48a~Cj*cPN1H_ORf;~VS6GO0v?*=Nu z^apAX?H~LaMV6f8v;`xWd`z(i&Uor?mkj(H6u=(%c--4%b;sEQk8b*pt1izTSm|$b zHetRKPr@l=)9V20H=q}34{TU+OnQ?EULt;7`*=Wp`M%2g zDOgL^o~2D^>Mse|G>}qhV`ld;{hw`urQwh&F8|<#rdM^a6igE)R7CxIa1hL{XSUas z*#iZRzin+AtG`(6EqbM?T?53?)Q7&fgTL7E)$$*kHt66ir_BGkqJh$T?Wp;CD{|`> zg9oiQDj!?Y#%c5+?T55QKZ+yA5poP8cgK-K33(JFsZOiUIo@hUQUzDYLgLJ0B-M6> zOeG{{&Jht+eTBpdfvCqy1CVk^4EYHmcQ7(9j-+Ox{zXRC#gUH^@&QI36-Sa~tG|hn zXT*`$5%Mxdw#AVP0EcGSq8%|zcxq^(EqZkvJS#NX7F`zyPYxZ6Ysuo^QK7!J=+|*@ zKqzdB{vHRLLTDhnAEPrBt_yX;2tE#$grM`Z`jQ$dG6iX^B{kID6#SVz*r@k!_Tcc4 zA_)iYw`+y?#vZ!9)b+OqNMYlZzD6legoI#Dkfl!OFB;281#zOUk3Y8p#&%yX(c$ON< zP{L0jELo``2pOrQK1ebu>0#_rU8^=qsF!SvDj`*p09mM}S`DzhIU7Jd7U@9bLLjv! zPA-8>8sHLWtH;DTC{)p@!gC2ct2x*zU^R)qWmE7WC|pIgi9nfgF}Zj`A;j16(1zJBbu5u zR{LLcZK`V1NF`X;u;!f5wODC$tCtT-JvRGjU5mGE%k&qlfF~0Z)_-C;NZLUP$;}xA zfvUcb)9vxhyH>%DyGy=VRmYC>Td>#5;T3fT0Rrch(l z#5S3#j?wu4KuO4DWLzB@KPMzsXTce_w~ef@--BYXx{a)`?=muO)f>5)c%G5*0%~M) zcpoDZtsy6A6(i%es*#!rzMj@l3Bngr!x2~i@OWxC;))+Wks6MK$`7K3Bcbng)NmxU zqa*}nR9aac^YnQo_1VUDf zuO|WOKF~klrD9_}p&D8LIul7X>avv0s=#Y5N?9uEx#d-cs$v?Uxhd#RKJILk=xQC8 zd3dg_)^UM{CsDPIiyDmps&%4G7)I4PA>?MN)(Ih_S{sEN2=z1y*&WI@3Yn`Q>|tjC zB7Y>q2FP%HqFyJ;1|un4yv!w#%x$MB*xj%akF~+rkZCW1QoUFjNu@ftA4_8)HuZJb zW2wYX#*;>bO3Djk5VZ#t=hfc<7&NM9bvf{G%YeRu##NkMf2rbNQHPkovUZ1}jzq7H z@YK#0oh&3}S^G9R{&Njt+zFLXHlD?y?+zg&YqYGGX>p4H4L*x5@BI1D~5Ij*dg$OI51K8gv7&2Ye!9sN%&i7cz$GTMRRkF{C#! zOb27AD#kEN7(+6NVU{z741NrAJ!5`1VAe8*HmbyU)-#4$C53Tv@{<7$LV~f(Jpwzw z`oMc@A+I(QpxpF{>nw$?PQITDM67|>=O4H#!h$M-SDTG2xnoGr* z#CA>XNBu#Ze!N=WL;nra)O2cu^vWXU;5QAaHw8wa^_+VgJ~Z*sl)1-~*E@Fv{meN5 z?tWa}Da??Gq72gM6r4WTFbM9;K1WO@yx{a2m@99=BC1K3W1qH?%(&oH)qi|(Pxm(sN-0S9&SUVytIJSRh#J=Tb>Mo9L$39aW?UrXTOQK z4?K5~PCNih>j2r1G`I9vmej8QRo!#59+K6E+%k zJU;PQ)HTG|X)%Jpr1YfVc6c0<_w(zAq;8c0ckcEiiD5Fpsm`Qf?}|E;rUMIp1d_Uv z7~A3W&EHhEr$R>OaGv}#Mw(_*v6Y8ZqRV^mSEkuiupE6dUUxkKv72U-4os$P_*vLv zmxeIfenbMW)l{VE5maYip?e<76 z)d@9}rl@KD8(~qRkW4eD4tIZ>1x@F`9wDsRqd*L2nu7iCWqF$V&E}hZd6K)K9jwB{ zhhgRtFQO;b?8xbm05_V+p@Hf#Vs0{F4LD59uTWdqW%+_O7&LX~HbO()Nm6a(Lp##d zE9BVq6@S%4he&(SaNJmx&0sP78j((EBO84Le$P|+LA^gHKbeXA;GPp$E6PD8=U^`J zBLezK*nC5Hqq_(%r>pRCRCvUX@aRW{NAHuYM*1eH^qty8c)5n~CTjuba&XCQNQyHB z;-T(IYN$}X>#RB_c-I-%OC=ySwFMZK}IF!B9I=O2onZ{&&dBSM6%B4iH`7`7<{ zdw>`lL$C*kaWMpYfS}sTiDnNF6JiMV0D-=-;$V;JhldZBFTRsLIfVMf)fMfW>YCsi zlCclJx^9z9%2Ty8Jg6J7icB^DHL4RIW?G0}y>L;g0xvHx(F+TSE$lkZBE-py-mw6Y z5A=gnKG>t`QZ?e3Lh_DIq^{BXNP>x9Aaa^*(TfPR1E{DA7kx%=0?7MHxwv2nkD$s- z=Z-DnNwi)OgcA_(w4aTb{4MS1bXfe^?PwD%`R%Yk7Qd?<71xs6j_P5_Y=@#*{QcTd z-T;sa%RKsU=^f}7v?DOfJPLph$h2PopMZ_a67z^+3!vjKf*&9OtFS^f%4y?I_gj*a z!teV>r-afKpWW^s(E8dcT;bE20xw?$g!hv__RoTS$x%FLaxDIFt^V9mV8k=Qt<>20 z$Ej9N%dE`)A*ZIaHqP{;HJ4#{r%K8*iRh(7pKMF><_J0zW)Bo z)n!Vz^Wu8v4^+5K{?v*Tliyj9Wb!+>v0%QJXqZA>wV*CxJ0UlP(m8%3M`=o(fBPJE@-zYVU_K+FUrL*Xc+|jH;e6|gH#j&!C(m?kmlLbAG^p0=$LO?h} zUXSr3^*EF1y`ALcII|k}VpnAh>rkK323UNCBJ6g?Yfyxw9Q;__N%Kgv&nU;6hS?JW zn-Si)*Fr#NPk0R{ zRBGkEdi4RAbhkBk{Mdugw(Rk4&%tPizyBFmLn&Pd5+~{H*vx`M=#9IvnI(zEk8;7; zvxWso63GXm(fL)W!rj-Ls>5YI`+yW?ACx$x*oY&YGGvQEQU3^1kTj1h3DQJI(QZqm z2`S4OwVbQfA1;&bhbS3QJXuB6fEuPV!T|4QKYTB zuL0#ys8R#UsZf~)R5GKGEZSj$8x?e-k3yo@9JuYvJr?D2EcaNI&$--VQ$A8Nya33L zU%4&NTx;%xv9GO)qpYZTx#KaknE;QGVDpW4Cjo&y+{gk93Yq|@G-_;P5q9PnQmC_L zOti|HPBc|FCF!eR8oEk!JTQ+l;f0Y_(nxW4k^w4J14f)EZ)b2c$rKLtp_5I~yAsgR7(Qah0PxN5jb~pid=uDL z2H#oi3z&i*qx8`&G6k_N3jQ?E&S9U$gr-=~Ybqu@rI9#6iOv-oWta?c+ucIHqhhA@ z4l$MT#zPQ1jP(h^#ih&{_)#6g$fxk8K%zKgZg>3U4uoS4eg>Sn$Wh?>##D!$H$g&z z;df#u+-y7o@#sxkvA72hi`^Y%5lztTixP6xS25fVaYUb>F6Z?$lqrtBM2LUI5g7kM z%$RV?vPWKrC%cty*mg!gA+|4xt&qT71pXKYeaB< z>hMra5qy}Si^`$cmuHD4;fHr$=c|(|&>=g$o&8rt#fL^x=yjVCd=!2flMT4>t0Xbm zz``_h@4D@C3YV^vGQ1(m5~fx)_ywrZRK&%a#%beiV<i?H9q?(X1EGj*y`X}TWNRP?WO!w~6n;UL% zV4>o=qysArs?nheG-XG!tsE~FsL?u=BkHCJQyoU<-rrL74rUWlpVqN1rNU}uW8OtPp0NoEd zC<%f;6eHvVC{_UO0aJF)U^vj+!Rn$Wxh+>t?0*b3&TKN+^wRv*KxAYF=Rb(uUpD7~ zB1euHW#g))?36u7<(s+#3lB-Ll@~{uvVA6zBYbsAzGT-iiy>xG_{y%Eq96Bx^?*f$ z0W9w)+AxU6qzopXBbeHAVj)tijt7PTbstGfJdKSPdhO*&c3q&bx-q*)gMO@FczV%) zET5pgC_5^a1~a`OD`rs|xM-biI}sD|h4bm~Ab(%sN7>=b$k*_vs0>1ZjX6}!mC~V9 zQBtGAPmI)QtYxNqyTxpZOX-d+>LyDw^mJqzM-rVSw&+y&qocq1u zCVeR{WJ_VwR-H~^e=|jgt+rnCtd%YLYNRXdYZr8d-FBglyHg0?M!UjVr*?(SzNjl~ z&uLv@ebc+b`e$^7t)AHxcEGHzu+6i9rMKY@EkTkWbfdHUZs@>wR5pg(cP)OFfBAvm zZ@3uWN0$7zc(1~DbGVL~W~2Np(RKJFxC`ol`MRkh@FkB$z6H!P9i((7y4=zx0$+6| z!9alon*h?+ok=v!YYI+g(l?z+yubkBBqHKQm=K04s_G0kMV~@i=2EIm!S9d)TC}9O zhYF;5F4Al&FAY4m+SlR4I-b{*6!{)JwsC>0rI4eYNm-+klT6%0s5FH>ve69w5gbU| zbGkWlHMQS8;FxB&BOabPOK^5(==g687ymbg1qU-+*(nW+z%YA09MkNDa967I{1Ki* zWa`p*j2q3-{&XcQ6s7CwdeiI#^C3c8@@GOzFdrhc%l=Gg3Fdfc&;=Xq;pczmHaEtt z#irR;B2@E%%eTDZmAIf`9<*Mq2`+bpj)d`> zZ9x6cL&5+BAz>ch%q!UR>!(N(a;Cdi%3$B;k)6P5!b;?USLB@a`yl*u!E18K=#zkn z%HRfK$Uv?mxETgji{Ri7@X|`MzP1wkOb8v_hB}@UNymr0(rTK$3Rvx39rN;41Zw@& zu2#a=;e%A1bG`+?SPZ#c{j9|gTNLax;NYo>x>H;90Vl)1Z#h>a2 z@V*O?0+G=ky>7tMzqr(&H%EuzZP!DqhH1`?B-U?`f&-Q#k9_acPX$|YI8zwJJnO( z=M%8o`ouK*(E~YAf}J=|P?9vw zevCNLskNbqyF|tVSLL63VELP7Z;AyG{5J|Bks8i#7yM8BN&YAQBtIG2siN%#s!UG7YChf^83oyg({yEsE$&bQ(n`8k zs1+FqzUlS9R}5(7VEPhu5kWfD-(fbTEN?mvDOtSJ8&aUR(QnKqQLiWHVpgX|R6Z*R*#TC3msQR;pmRQ*>zF{}1FK zu7)W7ohY+d@qY>b0mV;b6#rNFi5I`deN8wn{&;w#e-?3r35tk+ZJ4B_?iRWL7CKOD z6UFA}U#KZMWPdV(h?woB!?W#!)=_Bmy!>H8+oeN$I2Ky)Sk%nO_Zt0=7`khv_(8M1 zdw8}zn(fQOv;Cymem*?gUd?8`{IEIuMYDMh&-R;UD>yvce$7^ScsA^z;KJ#5cs7$} zJNEEw7G{f{N?bPOkB}cH2N6s3TJk%Ue+&816(#)F*q9@ZldFrlIT%jFdeW%GkR)lOQ@RG!m!Ah(Q7i^ zWk!(YJ=O0)ADtinh*YempE*)P?A7WwqoP!K4*KpyQq5x0So)5quhG0=dCZ3Wkrwd? z>?r1JV)MU(FOs9-V{}|RZ`S(7;8GKB(MdoXwlAwYFK`ne4Rxb8fvB!Y_@nn+C6(h| zO>~v?+w{F`xcG{ntHWe{Ln;}0Mb?)NVu2`9O57OFIHSo+k+%?hVSRZ(0WPOv@zFz(O+r11W6PkMTK5Y^Qg*qDUf_*re(Ozc$q z`%}|Xd4Kd;Zh^Yoi9ah~nqNTe#>hyW^B8#IF#|CtO02xkb6RahRYgrz zO|J&RSZUvfxFplO5jd9QM3ouS&be?oit<+ zXv+ZaEdXuc6Ut|qEEKRW^r~FPmnqXKMA)W`)3_nC95QJ#P zFVIvcg#&+A1`7|*!__)j}?E5vjpFV?@Uh@WBt#i+eD;a zYGtN)q@|_FCVuu$hkL7it@l*17nUwyz``W}?HLnJ3Vq*1@s!Z`(RZCN*m|sSD99587xsG#( zTp)I*c+z<-!r54#TA3!o6;Fgq#7VWjewkut&CPJz8oq;k&MCaPU%uE;vaWiaa6l!y zOOj8fh&JEc&nCXCI6u8m{G*U!_aKB!@vi-y43re-XjIWmNT9_|={&PP$z*Aq+e0zTFwY}0saUqq+ z&j=@7yw~G7lv;iNJ9_1d_iLzJo`5c;i`zi8iN{c0xHP#h>GN3w$e$b_cQWK-6Z!BL zipR@I2Nr>|P<#b{q1amEfmBbZo{4xLs~J{m6Mg%qR+fox8lOuq6Lak3iYAKv$X?HZ za~p@SF!XA$P$VOrHqlW}b>t}MfK#;EudU7$C!tJj;1P!!4Ht^{IkgQamqKxW`4cF+?Ijd@u#(DgaV`11@Rx{x z7Cl@9d}?YXS%>Lva>)Xc?fO3K$E9fG@4$lT-g0kv82omoZ4ceiXDNJchDKKrV7ohPBwbc}-ZwGWPLxttV=~8;d z5{ACB7pD&sJ;l=u%>!pxR*QETdaGA)`Zz$JF|-u4iE@}IMp9gOYKFcWDJmIyZ2&=M zi<4ys(s?`6&K9F2rP|k{IDI{K8J+=}OVrg8=WIX}N{NQfWvHQ|IDL_vEwH#pxrNMz zVP!BP&G_zKJJzF_Dwak0c$N8FD}v|d~;7BTHPPRo@V%C*sVe-W2R zbAe0D^b)j8EMd;q@$E3NQe49j-9#}=+$dHsG?by6#B~h4$j}GPId<`>pu5A(ZdL&rBQ7 zoIi^HF!UyK?h*SLdXnYx6PkKT=ku&DKjXO0I^=Xs9vra`^KT~TXK!?Q?gC^rd623G z=*v>MPb4t}godQZ%jt%(YxgX2(|kj)oYI^%4DO7qSr`MK(0v5_E4z<|`*l{f&1PGd zJ|Xwy_DlMo4R=ftxxZJFdt*OxR}45CoDJFMLABZ&&d(juzO45IxW~iAQd7k=xO2S} zS4-|Ja9)(#0oTv|ee55@{%^Zq3VeO{WpJ;`y${GGdv7*{=0wO+ zjH|s1;a7Vp{SSJE!5{QnJ5i-5sMrYV{}5AG;@Xr=0F-7?#^h?8*Bl{3Ky1yaOmzOZ!pESM+-e z?j=PJVOHYy5S8zAA5oPA!oJDamva+`_I6V?W;#YTQkX^TE+0T?*w*k7Fz0mt8t#0K zaf0uA_+REUf6DIfTnZI?&rPlsI^!18*}b0KrR;vk)IRM0+Wl|vOfKt| z;uf#=+YA4ue!u0$^sOLSbU(S>6m)*T_5ENpM%YQo7s3{sC^dR+MARO&&=8Tz2P$NLOF7XMks0Y7X3iZgPJP5Rbvt zb>YkABE)`GbrE>J4wHtL7f#6SEt=h>-803H)(W_1rq;t9mwW`=qtnQLt%>k&u>TDQ z;onOh2KVl6!w^oNhGhuH)^G~^c9bSUZXx$7->JYTccOO)FpFCzXT_xSW%HSwk~6zg z>=O}MhnNEQ2`jlN4st`uyqSN!tQxC@(*O5E7NAc|AA=%+$+t5@1L|3t}s)| zTj8RY2H8>yuZ4eG>I}FZmfi?<$F$r4%<7~maFt)V$20!75K#+Q{=`qIy$K<|%c-4V zq8PuiQH%vix4_-)xEt!&zAp$`=uoRwI)if zirv=mHv9w2--G*5-w}{r3rR0d{Sf#Y0-wT7?+aTej;$Y(OKJNO;Z(~CxX0Say)^k- zxR+CK;|pC25T>o6tMH+X8C0@~(xe#o;oIAiN!n{| zq!l+hC>J-NrpGv6vhN3mOJ4+gn0>fXJ=yL%K0s~2;_L#Pqm^Qef<$GHRG&mIk!j-L zjF&8C@vMf94taeRQB|O5V?sV(l31ppdm3J{q=;8EbV}7rmQ>*?B+eD$?!0R)xHDNp z={-w)ZjsVM(Jl&xeIAigq@a;?(`AMz*H9gxEQ~1??dqPjz8uj~qM*-8nta{G?Hanb zuEduod_hG^^AGg-#di!*{%)25@tcC|TfKH!AOfYtx!As{VxuS!BQ>;vp-VM1IFD$X zH1uR4efOb;f>lKGqLWXdYRFo6w68#H&`<_L-)ktV7p0{L(mk-@=mpP6Uy-;| zL+^W90X?9hZW$XzvDl;`Uxo|Na~it5;S67i_=kqBZkPz@O%0vVG}YHr?9kAprg?zA z(9lo$OQ7Q4X~^Wi8qi(^v6hz#3r*Re#7N7_1U*DW&}wL1nHZ{}H0WoUxIjajp`T^q z8Vxdi_v~XU7gIGf2jw0X*J)@VLz^`85mFWwA8IH9EeHz>CbKE_cPloFun1^q z0@DU*$kT&3&(%=nz>VO%LPII2w_$Owh6aX-^9>DM+n=Dl8oCqt3kx4+!!esC8lmN^ z;sjZ*^W5kQi$P3N*0f3-&(P+{e~mY+`7!=Kg~THncHCqo^g4&RLuRTmR&vG~}ZpEp`8)6mmBi}Fqt z^$Uo$Limb8d8Y~QLIqK~GFI$lXtB5`Sd%wie7H!_vU@MV4NP+uE2zY~#&ebkTtd)d z@nvaa-q~WOhD!Sm$~#AVc&VbDQ93;DT;ctT`fg+CDS4B`d&?E{ETG9^=rxKnD_M&3 zg?9x(&x@k|r{$e51~a5|A|ggB$o@;+S$PpLo}muAqxboMCTUttpJ{m)h&D|-qR%`) zb2RNWe0QN(sA-?qoeyZKrfsU9mKPO&)wI{@=K;D=(|YzkE3ZxbP19-+Uz@l`)6VOA zN#0cPu%^xJyA04~P0MRonRk)cs%d2n>j1r~Y47y8D{q?Eu4&)*c?i(Qn)XQ3=Dg|R zD^1(l^iM!PYMQP7uDluIS53>We+ZD}T9%;wO5|atNMWeMz6N=iDKa!|Cup-oo~Hc_ z+AL9`X_uF7#!O3vrmZZ^093DNuvzct%@GR~B&s~0<;@ctR#JQ&Vr|3MdGo~;YZWvm z@5emU(De#BxxY1kv6y@xL5sz^=n-8miXKrkst=co%^J!ZkdwbuxUgS|IA7>rl)p@T z_>6*{ZLZ6|MhyD9f|~msk$;W-VLsZ8e6y+Z%T6)jR@*ft#4+&DW>QQm@M~ar+dwKrj;!_RX zTDdZRlUVq%qUHP7dI63 z&xt|1nA4tL@nZf~F;zn!hqeKlqoMCYpXF^8i!^k1JNFPxu@PT343r ze_yP@?f{}SRC)a$h@)u|22f5_vj1Z-73=&2k#s*5L-<{~0=$A63lAy)H zUp?FJlw0c+R9n5!-%Z}qz?}BcJ)nW|VGW(x!v*MRh8Ek8LK~hT|E{5vGOQv)zRu7h zdkcDbnetr?4J~j1`c!k)fR-gcZ=@I&+0R5zCrf^-p-7br&|VEai55Lu4yU7$=t1;F zFCkl=tf6CjSV233p+)xl?HfgoJV!%M*g1?T|{{TsA=xk*FP}Qu1a;JvA1ZRc(@E8sSwO@(~`3*xI8k%}6 z(N@^M$Xn{KkjofSy~+ytn1-lVSs|ZgXt{W~_f`H%xrd?W#iza%fVK{$P@WgBrmyx_ z$*SQTpExdbi@%rr?KpyzU8<4U#}m{cZWeuPHL`#qvP)m*)yg3Xvaf2f%ieN?hVE#w zir#XxhNunbBgZq;VW&2rkDR1w6)oc&^|DRV`nKFG>*X9xqcL8Cd{{%HDhYZ@L*ptl z0BzOKhNdOHMtL1g-lL3;ZX5|{r-pJEsy{)|77o}b8s#1hJ=$=mzfq=~sA$hNJOrp( zL%%gV?QfEe8cJ&13TTjqMmKLn1)Hj&;myvJzH*(0$`M~*d8dXN8(RTAprOlJ##;Ny zO&VI>vd!O5KBu957@;)Fe`v^3<^uGlhH@|}?=N>~s3&OsDt|YUp42vs|ahOD8Cr zrT=s}O77HD#&Go;23r^&Y&>JUeIr8rI2o<*GKB``GgYz3{r z-2Z9v0S&b>?Hh)k7dK!& zEqiLn<=*2zM~*abo-0q&w0yD4f3CbpLsPAL{1fHP2F~;322DHK`HTNNnQ>kszDY8l zp#`GMvd2G3wlbu&b+SCmz&Tk?(VYK543p(*4NXavf%E098k&@B4@{BwYUqSC8HmV7 zG_=;V$A5wRLPI-1yHI`?gBmNx%4K$Y~6z_-4xa zn)YVu9{)^v2SZ9qv*bet&ROy)&3U=-24=~>Yv={5H!xeit)WbZH!w$bo1)^YOZEol z%3KZAr+NePWU+>Fr8h8N9-*P-fZFA74NbLq10AweLqief#qvxIU6+;{SRgOf(3hry zz(TnuMl*W@i{x7x8j{pAuvmVeA*WdeE|FhoXab;1<#!AzNi30jHSM?5+`tmNg0Av# zp{s}gGTDzI#d(DstZC<^cmr3+3kPfwo-QFHkANGtgGZcQx%K&{oKw8B+Rktu$XqDN|{=R;Dnt z06ROpfoo-%hAuXF1J}tTH1w0LXW)8ytcF5K;lN5cQbWHw?#RDEj?vIIlDCb>vMcUl_*YveKw{SMk%d7XwDZHF;0h0{eDxYLX!b_oN(^?jF$vyrJa*KvW z+V=SGlHX`(dGheU-O}2o(sB*z`#rKsLo?C}0{6->8fxoS5V%h+(9p$>J^qdIZVla^ zIy`W{d_hBxr0wxPAb-%%Rru~fnLky<5ONg+9+F2gq|*7Y9Ik1ZDT4zK%kwof$Z|*i zBeFw74T4DKk(rya8D zt9s^9?pby8Z3SGjSOXU$7_8)(gbXD7i(ANl8*^U4JSTFDE7(7!ABTXiq<9JI2PQ#O zDK=G*|Fp)KUt)!n{EL|LkGtxtgTGbbpTN2H!i~k~!kU6vD9rSFO2cP;iK_e~1|H~F z;Sj%BEaPxg+TJy!ww-f9u1Sn;aJkIbT|nWG-=zJ08i;BiK=||gxCBm4*9!S_Mwm0ES2+P?j zzV;!=?EUv`FEls9~KaelvD2 zB+^g-3|9LC6wZyzzdlZl;Z^NWwMO}`WgRev|3A}{@3GQt5(^Kip@-59N@q-GjG7QW zgv^ybD^4X7B`bPQFjhuXcDMz`P>)oJ4}>mB?DvSdCYD=Fo`jEKNUE_i&46Ehb!cj) zARfP%rd?~e( zTZh&B7S5Mdyv!;8BX#!wU7l&xXtBgEkb@NMjR~7P6Vi*7 zwbI`IC(`*^GnL5aZ21?%GQgG^+}}Nfd5tBhTBXhXi62YHD8Xi~I|?(g2XX!gev?q` z)S>(;7e?wA&{Zi^IO{kiJ7IaSkCY|wzjsxwH->WzOIu+M_NzK&`spZoR{ ztkrZ1*rTyf<7syicSAD0$ z?TuBW_2T!6xl*#k)+5XX(k*WoPyqLbk^PZfZ3YS%|iZ6i;t-e)6Cjp3zbEc zWw{vFx6!iJOnF>urred9U-z|uv&X=}aJOa*wUnBjAu6Ma{wu&!2W zerw>{mU6_q6Co__@h#l`&33B~oEcWqE}!*6NVUkiPuy2fYF#d-^{cdAZ@xTuvn&En zZ)+`oy95$*iC4{`0moP!rqu&S;@hwKjfeewUe!VSr2z3 zgkf^GxEx0!>8p9xK`71JtV5Z4p(G7i&moWG^sJX7@?3(X=dq1sS&d`~k5qahf3MEA ztu<8z3Tz|f1x01H_0m^Z4L65eaL$$M<QCpAC^ za_w87KTY;=mes+L_I<#gYQJ85T{zXg*0iP1Ec=BPlJ*vv5nN~|jrE}fe=4&>pN}ZL z&z{2hT`Ml^^NRgNl%P+hh}FTjfG538(dj3BNI}TGt*f+4_2L$$-olve^6mb|IkwBj z(vut;7{7t>%f$q&#cdHy1I~s!WWXfH_2#V^H_MU8=~~AF$mxR)(!DK?P2z?Dw~0;S zhmviCN8X>+QhllASm(>EKX0&PTFtMwtaQG|{0=j%W?aL$xQ}bMWE;DRF;m&Sh22lt z-N0@y^9KzdI}0o`%XZtQa!xm}dkedtvil7@cv}zInI-~IaTW=t?I3p&3(J2l(N-bV%g!k zEoF&iO8s3ar51bX{h*q$17f|{*7wnrN7?e+XCB`7sgzdp*uwP|FY>t4;zJs)!%8~a zeA90weQfX}Z6op3mnr3-{wJlDsq5ue=>-ygP}j?`)$Y{39Ku@5;)0UYPq~bC!=?=v zgBU-+GOgdrRMPySG_sAQX{DCGhbr0MJ8b~xVu0!W^t)2-vyARLMBHZ?SKplWsAW#U zptL<)?n618`%ub#Y~v)!WQ%2fuy?nSY&l0lSBJvtUQm>28N#8xXfYKBT|-Q#45)F9 z!M75v6}hdT9_@lvL(Lt-`8|_!1Q&VfWgdYwwC$ERLi6zz>FSr3Ze_Q+3M~Jqz00*- z&hGh;YqBI;JsFlZ!@6D0s(Q{f(bT{9tH4tlc3a-dUtn1;X;pGLr)0TlYsOwzt7)p= z;=a%{v8F)I;q)w&r0sJ!v^o6k91gS99342_eFf*YgTK8-`OSY1-RWM%{#)4Hz#(kl zTs*+JfQwvEiVV6nHsrJ4c^ zLf8%c9O8M8!~B$~Qc~?6VY%49#xsWF9fQ>Nwq7re%%@u4yRro`p}0s^yKN+A#A~uu z9PL`deuwolFRZ2YM!!oeF-@;1B$?$VvPEty zm6Y4s-lNG|YW@VRkHbnkAf#zuc!+n2*wt^i*I~WVj}}U-DIDotZX#>5*7V81G2XSN z;|n(5;m1ld&o#I_$x)&?!t)}8$)4Z*wMHL-zXIEc^(B5nu?j;Mn(o5EF zyZnYFwujwT^Rj_|2j_tL;okM8C1?%Tn|33d^``d&LSDA$9*Lup%!8gW8qtLf{82HC9T<|=7PHU+1t(2 z2Hu_B%X~}4EZ1(+ZACk>Tdj-AKFuCsr50fyzD>#*2mk#kIJ^jbn`q4{g?3qLnr{Qf z+y9sxDR=iBmE$nKUO5r&E}VLBFlVXx=BBAR4pTAuHm%ZyeO(tq)2_(bCkmRc%PBxl z=Ej^H>pkIhIjyEgYwv;EyZ(usEv8NXr@eQ9kL#-Lh4&d*o{=n#q>&ZdiR8#}g6%|> zEy)i#u@gOQE3qV7k38xGWh9N|i6xCPGqSBDrXvG|-T+B}P-ub1AMh1=`+)XxX>KoH zlS10^Yxw~!>1}^4#lC57p>0ZA9x3ewfB*klXU{qFkR1mb{CyY8vu3~d+H0@1_S$Rj zbLNg}lz-2*=geO^(RKf_<}X3FSJ#B#XQ;b2gdYf~25ge>R&y=F+weqT2yZ#K5wOQ> z0^AQ6F=b9QU=3i{oO1ATYV$`9Tlf=)wZ81I)>j?Y`U?k(F`n^k13c@r1OBbE2k;wC z7wT>bu$f!zY{lJsG`WuO^v zumtm~9sI;EGWgrgE(l<=a2&q(-;grAr2^AbKM;d2sp9AfJ@ z#P*zo&q?^r0b+h8z}zzd<~}ds=Ouhj!sjIXl7yWSX{UrGOC-F`g-ls5;Z7GarCY*L z7cyl+!iz3s%9|y8#)VAzh=iYaAyYml;d3rz%1aV~x{@F5##PrA-OHS>PEL zGW{bGeoo-?E@b-WBz#ujITtehB?+6LjNOGyFOhJgz;!NU`g#d>2<&tr)4L`7pungL znLZ)mjKD<~GX2dGen#LK7c%`L5`IqL^Dboi=Olbq;5ipE{Ur&Tkl^n^rk6;#QQ$fk zGJU;-I|O#Rkm=nLeo$c4g-oB2a7N&w3z`0mgwME;DbGvz`4GeBBz#W7PMP3V#`JX( zUMJyB33p03D&eSvJIY!9L4k`dWZg3oK2y%{C(7T0GS5rO^OEufNjWDe=OpFK3bu1* z1{JMD6@r_D*Gafj!krS1N;oRvMF}rT_>6?lNVqIaeEI~&1%5){ z7X)sqVs2v%`|1$*pumj4X9PYc@T@=+VaY~;9ReQ|m=XAlz~=;>6=-Uuyuc2D4+_i( zd`94N0?!IGE2X@^4uP4~OnFA&a{|u_?6{8UXX^<~gVYk(AuuEG8G&a7nzd3!V28j5 z1!e?3Bk(zaX9b$;rM$onfe#AI2z*B1a{|u_G>uYTV28j51!e?3Bk(zaX9b#dQeI$( zzy}3p1U@71Ie}*dnj56Nzz%^A3d{(6M&NS-&k8i_S>D_zwFEwQlcc;sQUrDgd{AIU z;4=cx3N#y7@~l9!k>LjgW&}PX@Hv5J1)5FLvcL|34+_i(d`94N0?!IGH?w?3;4=cx z-okat!I_2On@LPLzW2dD*lEV`K-Y2eRdW_k`u5_s-;>VAozFO5a=z+(-FeA*Tj_r* z{o~TVF6~}^_wwlSqs!m5{F&vS4SqHF@4ML3+AE^A@%D(U~hrb?PS+%d~MAgq#y|3z-s*hJaSM~j> zJE{k&$E)8~{bKcBRX5Zes`;&&KdGsVY>O;Jo{G%X{#@<5YJa8nv$bEUeRXBL?!9%N zsr#q8pSk95uKCtA|N9zeRcKY!s=8HcSKYK~WYvAE7FPY{s_(7}tq!klTz$*xmeqS# zzj5_jSO4zn7gm3H^*^kxTyxEujcZ!hbgUU#^Wd7qnuRs*Uh@ZQ{$$Ocu2}|Zl;R1v zAgqjX(+x|c2mZ)ICTvFWe(gtaOZ+j=>i6oRjmG>=a}4m40w)_7{{0)6-n5nB8`cuu zCE+hgnOD~_cW)bEsFU!!t%M)nKv;G|9B_@m+geyRxSp_1S`KYwc)Nr@vw`7-O;Nz_ z)e|1RIRW_fO-z6BX2O>Qlg)zXBR4YleUkFcmCSvoq_?b%BK)7%G37f_=Fg;^wY4lC z>_`Egt33(WSjRHsx1It_-1auW<<~z2sB}0Z<9a|w`c)Zez4UdLj8w}sOD{hwqlj(b zxmZTZ+%52BX(1(8eZ85zPf2*y`Y6I}UF^MD=(%?@Q-0|V!ryFUdU^9N16J<%DB!-G zzXtgC+Zq1zc7}IK`r_{Yf^hS$&jNmD=N|z6$!%W(yrG@pk4nk^5cuIu?EQx3uK|Ah zmX`qk`xf?cLMU@oX5>D>?VyZkP~d49`|k@rgX^Ox|G5xroi8VRR|R2Xm~d4UVQDqt z(*k$YFq{y$*D!pS^!R&1tK%~2+HFk#-fe_uZXtZEgLwX$%-|oiGW^IbggU>!bv?u7 z!Y3PqXWlO1|Er#LQ`-s0Z{^JX?Vc#$E4vu}hlXzeDm{OrgXv0vj*eFlR<4L`Vas2> zjkAA1T4)gX_D;6>N4x$NaK)`Z06ca(Q-*FYS%NtvfRLI_8MKl=sVDO7z`a2u5I zs!ZLso4wpFung4ZuNsx$w4)ZXi8BvKX8=DtTn2azBs5@F8T=TVSq%y0@AKftj_`iv zTEOd23a5R@=Wph$0bGl;fVm#AfN8{cfTtpWH<+vLWz}$$pDFqPP1c=`z0^9(N z5Wo&=3*aW4pak$-aU0+*W;bm_2}7%^iR((5eCaY+E;A8-ABJ zfPL9M!0o0Fa0lMz@1Xu&2)E;nI@rYm2F$Jal_&>o4I;c7`o}?whY-Hq3?qC8Ans&9 zCpl<+6yYv&55nDm0n=mdL%0_(fSwKm?#FLj1km3Y;GHH4c$b*~JYZsg17-?v5Sl-L zr&^Dp?jgW{8NySaxB&wgfFCXaIBFgSyc;{J0D77SycfSN6+ll5fIovh7Jm`x6yW`M z(-UqW;TCrQzv295z%lbyz=zD+(B?6~0K5WxgVlcm3}9FFIKuA$448M~&oS=;&WL%z0qy;DGiI5q6v}ARGV;m=foY5ncuuFs05H5nc|6dkfB&5Do$2-h%TL zgv$W~W`*--2v-0GOr`T8!ePLGsdD}Y!qtEQcoO~+;Rqlk)Zv@QRsupoov$H$4Im`c z`8vX@0U@C{SA&E)F9BZXybM_H{2gF}^G(3D&OZQN@4N!o=zI&c@B|maH{kRI66$;# z@D0v)0XI0WB6lMoWX<_L!YzQ1HRnGNZUcm@IX^&nJ0N7uIS;tg!9Rna>U9EmGNuIZ zR;Lv3HYW(U+bILw$Y;^u*~4sgg>4>;`H1UTYs zK<+5uyTO3ekl0G;48sM+5WPhDf{)Z zKP>Aie^dE8%0FHH=XlHOqbp9Y`1uu2t@u*KUsjx}_-;j6WqsvSl~0DZR<~CluKwNX zA5?eL^wm6G^NTeHBIA)`kz`~|?Z(=jwH>wh)lSv^%F6$?@=bLIR?V&YpQ{f3Q2_SO zy@038QNTBuWf|TA@c+9WH<*_B5`MU54rlNAX=iZXLTi>~OaHp0<<@;6Qdn2t$d_C0 z;AWPqByj%)ul-frh_u*Q9N&}e*XH0iR*Lj-18%n&tSDtzHOjD>;FU}G)Z^2D&su!0 z$EOjWb+8j}z-K)^H{x>>K5xKh13nw^*@Vx{Sfy^krwO0U_|U_(1)r_>wBXZ<4}WlN z8$SGTxgD@McjD8I&n}GWR(x*5XE#23u*%(z&mH)5;M0ju7e3wi^kBW~#b+;8ynXl_ zgT#Hne8G7EKIn7iGs|AZ=ll4aGrLP)#pnC@#GKuwQ~1R3NjTBq!_GqRRkIL0hEKxz z6~uod_=5Rue10c*&Y3BH*h!WD9ll>RzY+XCKDz>6sKA*zE~I~<;&9;8l@H@-(-+M3 z;lFb}5Izy;uKK;eZ=jv`);#QVS0$W};`_G|zdQ1<^FZWP^FSowwA44Y zYCga6VdwKJ_m%wf%I~A!!-2QgecwD$mnc~c>F&7Z()ZBD*p?f--O6}Y_hGuTxH8$4P!qDJsSL{e48DmSD!n_@lw=b6N zoQn^~W+xBMq*y?cnPANNU{fK4`PgeJ zxl2NrtvgeR**k^Ng|68G?Y2O7B5^D(SZGr7M3(n<78_t|(bOH9ik{mgl!vY+=99Ix z-BM+Tgn%xn(w&%1$7Yocv_Re{wXm?{E;bLJ{^gp~X zJ7HNHO(UiEIFNB=G&jc;gjhNnpZ4Vx(I48<=q%X(;7oSbH8nS(FV%Z8HevfbkeK4E zphZFP3i5Qv8E#Emw1$5`&_(QP? zAwA0KKyqiq;%sMWAa=s*v44I#9fyWY?@c6U*iBbra>30mLY0;lXvw^}h3;f3_z0R3 zp*-E`=0Qm!gfSNAP8P^(Qp&PLXh^MPX+^r(iPOx2x>7~Zkx;Jcbg{9`<|{@w8(IsY zVk(XW@{rZSg6(z}TR%%e=M<^5MCuMHi-AMEpjM&IDbiG%S81o)zmGv7`>cZ|A%h5E z26EX$lUV@LhXPBBW|6)jnr`d(%29!cqpM=_hMZ!Y#nI-<1PT`Lc(!uxAhb6x&E@eH zvv+=W;=vX(Fh4yV9iNUN*w;HdKNCyZ*kE!pmW)m2CUz&Lry*33eN^zWh7u=oa%@vr z_}TD*cq)zW1JOqo@HOQb9Dd`&bPwOS`}X#+vFXG_bUM{yy5i}((N`kb)@nu)eY0tN zLq_&TXD6p)Nf0nLJ$84i86DZ%-ruwR-d1-qTgDJ7CQdAn$DvYISfGuyit%-kTHtG@ zf-xkp#B62@VZB80f;p7b0)#Y`O-m?;b2Ld9a;H1UTz+=30=pu#G`k`bIQvCWQ;Mk) z&B@aSMfnsZiz!)cz+*tF&{pNXR@1jHnV6r$ZzMd3sa3XWHFw1pWLY^FjVF=b6PJu= zasd&KcUpbC1Lsl>@3fjM-7I^Y1RgTcEn{uP*#pT1v%#{g1%;}$ijhb&Wm?=)dF0Br zvfa)1lOFo6SkF6bB}_WJiRaA><7~~YuFk0TnN=V3OS0oikN1Jat+I-W| zX53B^QzOywvDU4v+qbs2Y%^_JckbM^V_Vy9!@v~=(4?&<34>FjFTws-s1?L956-8(yb+IFF$8Q$O7x_w7iG!;W+bm+j|_;k#T zfuTo})4l{PJCbnop*~Q@vH(J;P_W>#K!JvEYhjkP))Fk>7PF=DS-{P1a~ml-Im{y) z;VWmp5ic@pNG+I=ZN3@V=9>|CTtOdIl*PulT|34Y5kk==#^@HarSiw>O*lEn8>@L-`{^Qjw7%wUCg$(eCh#7G(>$cc(=R0T1sy z#B%c7F(Iu8K1eOVXQvOJoj!ban!P=pkl~iCJ>5I^Zf)PXt*32A`_5fmEuF1BEiIj0 zEn9c&*uJx8`_{d!ZM(X<+IMyJY;E5Ojj(lZ@3xknz3tL4*|ylokmwD_MH*>Ekk)q8 z;nD6xkj?H=`rxZb#a+IU?ebMbY31G9&F+KA_;I*c`ex>)V>8%Y!55R5?GXZ}Zik69 zkzANd4-I#kw$AR>ojtp{+uPc8rtEXj0*WR7GT3fbn>+0SHLhR^n?{4kv z?rrVa*0po%*51yZ-k#Rp?b~*4>oEsAd(7U!(V?-f`$l?ASLbl=*n!@GeIxtLfx*GM zMh|9Vsbdc{-xC{e?uMVHx$D3IbATz_95h4aNy>2Fz5#RR@Zf+yuV+wWsN0*I%T{mZ z*qS?$JG_ue$7Y)Q2F=Jly#pinjVU^PBV+r921gH?;l6uEdV2@Py81>;Z{NQCBN94J z&%oGN@wSPTZCApWQ@cExp2UgS=|oiaH8K@;lOuDHjZDFy98F=@noXr&t1uPK zyK3L|maprmD!by-)4Hv+r953{{7YkAc2=(J3TPc~2FSrJ6iZ5lnJDO}!FWniIE10t zK^K2mOOnbV6s9KCwIn6RGXumZr`Ly$zC1-5=3dvRDVSAcZQYPs8QJ;kugNm3(3=;x8 zx)u(bohecy zD&m{Qi9lf`Yws8E#qj*ZL@ebxbPIBaVkvmW)bCf2nUb+V435N;Gkd3_Q-$5eQ}-m} zIFf)ju%J3zf&Hl>>Dp(}tnT^L1#;gAb6_9X^q3sckL`Yss1PFJzwUD0G=axOOw&c%w9fokCDAafd&95rDi8K3E$ zois8QkP2oXO)e~t@+FI1N{K-4jHZj>wfY`bRq_mmxF-s!Hq)?O*0(|CUHD= z&rvAC;W;Msr8tzqq%R4I(#w}Y&!*DRSro>Brv{kn&A1F5oS2s~nPnL%(982-O0J1z zL;KV`l+@ver$-VJV(YmoMv`e96-j1kp)!}hY<;_!30bp|duK3fz@P_2#Mh*LVUvXI z5)9*@GCY_-88>|>2-Um7M6`o*}{xEPYYxDZK> z% z6=Qpoi5WMAJ~IO;NG0%11p897Gu8MulkPX_d7C0%8hmkXjE*+l_qqu)veA$x2Vk8@ zpgS>xGqo6~lTAv&!yl6vDLjr=vRT+P%+Jh9l$7*EC)3lu7*&p2jsrNDOdOA6`ymxU zEcuS{=rh|guRqLMq->ad*f4}BHUetmMR>!8)9wcq#WU;hny5FPk*{G03(U3!kT#tFxwB;t&Pec1QK;EeF9yC5QPA0v0=h0{ z%c{{M(Z1Ou2?@k)K&BHrPtuT0Sz3Z$d9E&TWeqQ$r5N-Foi9=-cHFih`>t$5+IyPq zvK?QP&790;XsByGK0VnJI}*j3f6q}IkD0z%Z1LUj*a=CpYl1jXylor`+Z^j%!7+v2 zrZL^oIapNC0`utv-5(Stw2gIRHY(@wpr3p2CRr+CvWb^CmUQ{X{J?NXFKD8!HoP?f zohWnM&2~XZrbz-aY?{Pz_#$yO0K<9?dI5S`v=L+>xqy`$38am?hz`Z(k$|g0X*3HC z1lsC4Fx^LE6US_rmtv^!r(;tL_&icQgUur`c$g%A+zZCW=clG($*v>}9jZNEbJCu1 ze}KZw#*iXXNC}*SB1?*I0R<=FRY=Ciq2bLwY>~ZKkF?7M^V58Nd0A-p?szJmQ@k^k zip`8qFO0;~{#HoSzNuMgGp~BKXcGPqZYsR2k!TWR+>09?u@eb@23AL}RPRafc?vE? zFUht^#eFvvQ_)Na$dUNed{W$zg>`#ksflEKj=oASQ)wtQhGNsvlM+gK`L<&)+2s5L z{WdOzZ3dUnWPIvq(JUzb*#)nTyIQeN^fMlxhIa9Cac;AKsk>8nQWzG#N{x{BG(>^* z()uPf?Aln_?T4moD2^pn*137YI>>mO#t2Y7@i+bX)UXt z)%6V*h3Py36>QgI>$s5dz;O$I9rQw8YBox8dd?1WPdq7J519ISx1#b=?0qQd1@4V> zVg@@{k^w7McDF0J>Ms#Ox4~GFe4%M6U^c9@l@#}$k<{DkbH_+Ru7^et$xA{PN6iuFx`PZn zB#;9*5SyJsLN6Q?_rwvv`jAX(5ZfcH$xQUEGjnkxZWmAytU4LT4lcbvHjU+yDN0@l zo_EtmIM2N>M}M*4D;^_3Q$vaIhYamPtfJG?-&SN$L(-x%;&S(~bumLrUBH1v~{a0oRBgl@8IOpI__To*NoVN~)BKEqNZLEbXbK+bX3JndEz(g=G(tAwFQZm8rh-uVn>#a$5K!zv*~1F+Q{K4w%-~nD38NBIc;;xshII%uZ<4Q$s|jb8fFqyuMn70hN^RJW3sNCl;O7tv9p8{giTB!!{nA-8;)~q6`U;b1=r|-87Er;EZHv_cd<3FXgVqrXQ<| z?CoPwEy^`U@Q?sJDKqZmVJp2bGZTYKpXi*PN?_Y^bjDB)hv5j&TGbg;V72n_=MPM(!Or5;574J5|^BDxw)Us_uXTc zY@xlI3ydLQZiMp|m6HUah8x74ZmgW?q#LzMbL@z_PcePoo<)Xd_klLwZ|C}o%97%X zlRK0$d5JJTd@0C)Drs-ull5VDHi1mt=irBx&I1?Ts z=$cQX6zBP1;^6!oooTr6jEz$i4iD@Hvv;7mdgP^yqad{VKth%=Zl+mC)d4ZVjM_x& z!m>$_uJKq>a$)wwXK{3b$6Q~zH+GRvA&mNTY+Gv`=hf_Y(u430>YN`-9crL^l;ZxMmc&LCE8#; z8zpP`qM$R{wVBA^^CC7XCWX0^6C8y<2~-jPr59)0xn5YF7ziY_Ew5oKQc1x z;kB{^Iww^)@o1=)-17G(@>QF|BEm&*Po#}#1|BAI*JDDwz5>aIq`#Lz|tHdA$m)~lfGnAC` zErw=eCo}==F)%Fm6s@1y%1KW=3dcbTdORgvpc@e=Zt8GqCu7P_BP!X04lUw~?sKO{ zyusQia>4)Ek`iVkBZ+i$8Y>FaWeWJox2Pq%E$3bgzWeFPe#}`s<(AA=%}K?kcsP1Q zp2mQGCc2Q5IeA)Y9mUoSxm+YK_8FVx{e1H|lRz zqPuV3Ha3<%8c)IH5KoiMp^7~cN`!iWl#@u5*}V_XN2l2qiOk7HBYq6Tj2rg!{4=&b$~y91!TrATe`;V^K|-g~`DzEDKPY zw*0}w9D`$X`pqU#z&7CqF#=m2eM@;1v`Ituoeu zcT<9HxKfGoPw`q!AEqrl9y zW`PMCrQOI`gSJKW;ro;w;HN8)&tj*@JY1UU#_>JiYIbJ!J) zrPQK7fZGW6iHNujVUvn5wr1Se$0sxlhSu;fzSA=Iu2&dVSTdC!Oxh@WyHk~d%OYG; zKnNboyXkP-bWg{@>IODcuU>lAHWL%FU9xG&?s1bOzk5E(TOY3F4!U!WnSf#WVz56X z)wMunxe)u1MTuZ{0telE{KGxpGd=tF9<*WJ^0(obp8t_$_>g=ujRUMWj5mg8@S%U2 ztkP&7u93|p5W(pefd3h8eSVFjr3FAQ6AfB^$)m^;qUxk=N4tG+UYq2$aRAS)%^}_o z&-egzjO7OE8_~er(cy(-IV8YNQE(baoG@`*H8=>-kR3F?NdZw~_Lh${lbbR(lNC}b zXfMLbsho;lY;K0l`^1!0nFMrf$Jt9l(y13qx`_3jlni|JM^6f>R1b0tAQ@gvR3x3n z<8Z5-G~@WlvtV5dMz&@61|!H3RtzVuup~|F$Pqg5kHbmH=n+1tEFq3cy$~7)UK#*Z zInVmYxR?ei-!gAH?Qk1ujJk}TB#n(E>^HZg8b)hH9}1R+XmjuhVIww%goqZ@mpM5z ztsYKBm4Ug|pzFs&$7qaSG4F~#en^V|4q!*~c#5%*FplGvM7#-L-AZBk$_0G&8 zcBgeq@NFd~^Mw>%=mbwGUhb5}%Smp==ZHz-)lD-9&EXYHDZHo&mKjRS;6)+F@jZ)J zC-UNW#Zwfo|7*kxosJ?siBBU^*isxV!0m^+b4cBTSDQSFSC^c^H%rW#NqooA?krvj zHI2WG(sB~7J88k|PqciCTRwr7amgF75xp${dMS6KHMm8Q>tG{zc}EgQueq2zC0p?; z!|%D=9Tg|p*4Id?7GF6$MgW3f+b<-JnUf&w1`u@v-X(*}2<~*;;-)dZ$(V3?sjF*hi>Wfp=lN4|VY#!@WqI8y#*KNZF_(;#ITBD+6D5&Km2#4=QkSmhO@i$+ zR~auYp-qrt+jpDWw{3&E=25(niWqrQT^u)08+8MBs(1gmmKxE8YdwlLVX<#Am&GY} zT(}aAMTd(Pmpm?CQ|MQh9O}{6sBN%GUwWxIc#%c(AQsZp5=$o+Rq8=f&n}ow-{tDf zWWIEvrY^SHcS82PmA%-?Ukv@Frs6P$>7R@TFcHdHT!Jn%5nNi_H9zy4S8_nPymL7a zHYKO{61kE`@neGgK|%cRV2#f69?UoO!5fUJ(v&;g6jMrdY=ZNU@M*jbmSz@>swgId ztL>P?m^7UEp`V=6zVsfq9{Jo{=askV)(SBVg?WSMM@>Dm%8zdk`kqF+3mBQ& z7^co+5zh!z>O73M+9~eYzE%yPg;ZgBEwvBLQCxMwhheiy(@0&Ky4g0aBR>p-7861X z+``8j^t85Flgg&U--P#_S{60ySc~sMJtpn-VuUoWaXw}1)^Qd!%~x+d>-FS_$UP`U zJaHKmb*GHkpcr}cGXN}TP7fd-J7?(;+^~k&Oe5_C(#RnvV0FPiWlZe^YS6r=!SALu zu+_a7K^%2BO44pl${huF&bj(aO?y+vx;i%96i|PeHMyf^3+x9RRO^+`Qno60r83t| zpiR=g&_Xn|g=>IW;iZ{dI>FB>8U1KwQYeCZv@S;|Cs9&>%L;OdJB~^}znRKOx4dw1 zjg4h7uC*yXjxEDkGHAngJr!jtNiVOSmy=Dq&P%gcX7lRiK?mhaVgheHsaxgozQosg zE%c&1o+*}5`FIyR=1;#1SVESr)48<0=16+2$1|3z%qqKGBY)A>Ay=f0Y2bX#AV!;C z*VS?Gpi2!`pIHrOsytaCcbQt&Nuwp4{aGF?v-CBKx5Y7`jVN+bgaJ+x{v?gP7Q!~izn<;G(W8E*$X zf}Reb4gdZ(*Wlom#@qFdiaA0hI|b}#(RVK9x!Asz-g2>z1N%nc--s7`MnQwPh(4)B zrRG%nQ_bSw)k{j{ZgnX9xCrX+GncG0ASS1a%y9wo)^G)*j?D7<^{To2>j~wAlg@py zDe1tg_b1RgQyRe>+zi>i$sQYByN@<3S94CJGB#I0twjS#Cz!?+8QO0BoMEqRW%3`r zO|B6IYb3O|wW70QubaadT{evi|zbpFw|JL@l$d)q+s)2oJ@#o?=0 z5PCo?65_`z3c0;nhNNO{lnH$e!m!2)%_vw_mn?U>S53;83ep$rhM{r~xN5f%$``Lw zfj!#~c^bo~6QN!puoo7{Ai|B{iUGt15${Lt2;zfMb{KW{qbyUKq2?1H;XDwhaZXfWX zZlM&@?&Ol8d-@jRWImU>M)-#_h6=i@Hley2xnokDTY@Gug~M)?Q8UnrsNbji+DPa} zeHf(hub9P1s7lfszO#7W)h}Xx{r}@ybF85G`_3h=e@R!tQC_h+->K@r)T@#p51F00 z?2>Cz=w33n2VE^pkoF|@09E?Ub&5MdQ$q~=oM{^Twz0KMvwFYGPQFvJ!8j|t4Zo?S z+8}mZ`)KPmqc>emxK7beY)YE&*@O>XpI*|2{oUU${^H@j0q44=M-}(z6ppVan#|Pr zfwxzW|MHM?-q}zrujRg*-sznG<>9k;Uwd9h=v3W2_0=c-=I+~`eCmlmd(#J}maf-i za_ZIj4Yo9}r#HzQBUL7#S=7p<$>krPDr~OWR_y4<%cbPq$WzxvBU+@@?)Q+ zV^d*Yp4H49CVhR>9j33aCzY%gp{Iinb^RQ4y~X*0F?w8Flk1h3IAX~mD$d@}ao zd!5X8{baI;ColxdoHTmq{7|p3XD+Y=os9lE#fk21fJhp)N5|+UyaGR0IQ%;WwzTy0 z(5AjnzIRGi3?ndeU2e}hRoQdDw8eaW(#tiq3KgJ?f)CzTXaHtW%n(H9>afNtV-_%LcDiJ8LWI z-M`H^xA}2en)=1)X!c!-_$@6+rY?Ns58gxz`kup|KDPT{<-nFv{2)oKO=ZdtGPe#q z@`!T_S&jQ5YJCseTn)dd zKwPZbIEYBIH5ZWke z$lRp%PzUPS6@{vR{vEbrvEq@< z1OC>OU3rL3QFUtXJ-qQAGjQ|3HRIRbck=+ZuQWo~1F;((gz>WK=Bbyb{^#RchrWOK zy>I;3#7lT}$m|5tONp;p{K!($dST~~dW5YFvJrg6(}E^&j&%w(fdi~%Vr@6(`ww;0 zaaBCkt7A7FO_(ApO|9%UIePnpHn)D^?ftSXL)xxRS1#n7zqFf=v!7_zTI`kG4m zh@v7UN%wT9$T>&pW*odbrCZ=0HKjM>mxN5&8-L-&>E8$QIh{H)QS5xlE6vzNlLyIB zbgTBDecHSWl1_a@ql2b|dWC45upBjDOs?^WU0O4PeCvIu80UNSsU>N6NM048#}%ej z1h=jUY9hClTMY!??VH?0cdNf8~9TemE;(^bK%(*$6%#_QiFZaO}I+x8cfaD zyL-BsYlN;+(J5!WN>mDTTCz+Hv8S5&;!};dlnL>!qrI%xsCdGqTxeGCOoonOPzSf` zbw~b*Wa_%IK}$Z^<1xgIjiPG<@0_L zPY<&+xXy-BLUBE39+znS{@1b$L>kQAk|B*wS8v(e;g4aR9TG?{e|-E$9P zRK`u_+r!OIGsZ1Mlc9=djQ10q^~KvWV}E?#2M)y!y&U@=V@@S~M)W)lp+{48*Z9YW z1efjk@?s@r2>8%v%=MP~FfQ{<+Hy~{4m)e|D<#MBlPTd2xDh=2DC~s8_}#-t@e7E& zdV_P~{=a%6cE~%;8b(d7^|tr?)4*qAFHSe2N6N6rnH(`^!0Em8)<}KWwSJl`y_dTf zi}pf2=pkn=vu*@=CGpt_Q(&8~b9dFjWY!VmXUZ@1Uw4#P~ z6MjC8*VO2|V_Ci6vdK87qf4#I7aMl|VC}kWx!!Z*`T2iH_`eBrNyBKrD>HWHFTCz@ z?rAg?Uyaq!%3a~v4^LJFVS>JE=9i?8nV@Oq?Hec&f` zZob_)=~U=sttYRf};%pz@gzDWSom{;ul+Oq|AS>LrE#3Q0x5PGK6|e1fH=T^L z%NOR&M{QHt&yG)HIu@{4jpw#i-=NvB0KLJ#%~*N+0rB=_Xpa5(yH#||ts)Fg+50}Q z?wDw%GF@{J-goKJPGgmNuX2EO8NzAG3f=>lMn5>!uKD6qAD^HOe)aLLX)$djg&sDp zagtKWGK`54zL>Xdy_m2pr6brq7eyKvmQ}s7{XlOjXNgnRwmuY28=eA3qLN03WIQ-%94_{CQbtVo_s2m7#GB zhTZYW1S&cpsweS3n$XuV$k9uX{Ql{`?ryfow@AB;|W{xBBpC~E96Igcq zhi>@>;U46Bw=l-U=q2}ED!R@CR7hN+c;VIC9$x%u1wZf7P*Qbj-A`&6n9MtQd&aWB z>+e8)|8yafy?AojgH>=q&Mfu(um!6OZ=NN$v2k@h0C5QmCD&R-)}9hx;>-??U)ac@ge_>}!~+je(b zncurw1i~YQpF=J#8o!h~fFHkTERDD`^?HS*c$-U$%P+isaVg%_WfGjW=Z?NSwRK1Z z>E;1$W$c!39c+bSf6h%6Be7##)Bg2=Eh8TvDpqEXan`Ve+wRn7-u&moTZaz3T{ijG zdpVk}LaVt?&N>Zrw`fi4DsM70rZx|ZA9G6A!6{{el>_HyfBT)zn&{N`2H@y8w(*|t z9Qh=kWVM$pof`JVS~T|dm=#-{k{jW^e$?ka!RE2_Q5c<69~5D_x~Maef^uG4h*wg0 zv)6`8@Jrmmo3MQzN6vmxgR~srSgNs`54$fj8)n>A<4`JG&(m-#=~dzxF;>;d;cTYs ziGTN?rEy#fqAPkY#*@TK(uHqsnz>@q?e6S(ZLQu0bvd3_7juIn7`r;#H5g+=D$7oy z{X3CQw-rb3r;O?4+)=684KodDQhNE&=$Ovqe@!|MGFP1ow06!7CM1PcAHBCu+r?Yq zT-#QpPL1u!@`SVJ;;pC;nkKi!fmlg>wq`~7sM@CnC>T)@EE(_Y#|L*(ZylNjDVKMkk3nI-g#*L zitbrl>YUIuJJ$-Pg{n5P+M-T0x8Gb7DZhu_tWBpbOfE6wz^Tv%;ik*&VO6eNQIcfS zlKJ`Ev$ogT84>16zch*L36~;Jh@N+TrJECHO(BY$)Qa;?l_$h3-M7^kWt4yGZB=?yrx)d_Is_g-rIM>~PlQK@V-g@-s z74~Em1>5Gt&p`!|Y1p>*x&>I!8YbN~10SAl(ej!xsw$OT^cFXnFe@OnJY)0xsbn5g zx(8=y<|a=C^8kl*Jn(iZeu|0}JEwu_QyHP+Ja30+N%s(^R0O9~n4z}f{N6!5_9>gv zHk>WR`mjn_+pw)tF*qxzLdT)z;A76&l+a{mUhWO(8Bl^Z^Q|pLx{zilCz}+t$*hG6 z)ttQ=KwFdTorJLGszLTaHLec0G=!L59ls4nquz6^nVlEo`r?bXS>f@e!Ko|nc5=~s z>F1xE`u9U?o_5YN#`#j}J3;kunX2pOtH+tArJOp}(3?P1aBga?-C}y}IpS-7$KmR6 z-Vc>>nYaF=1XwkgE4;zYa0Bgv(2$gTdYS@|0O|2N5;CP&V>7Shs=54Pq!hh#wgLKx z5=hA}XC;x|MB4be9CJ=7``QYnUN3-frrA!u(#~(SxT5wyv`rl{g|_^UZrLaAM$tD{&4F8aYvRdLKS zkTx+|8XiSo_NfF?qS@{H6qmO3Ua!va=^Wr_Js2uHQ0n`s_ zs;Tov>fP`*rPR2@BcBSCWWB~jN?;#YauW=e8+{9!@zEwL&nQ9d?)nd}%Wc(<84sJw z&?4PI+_qB+O`ShxPxK6Qtye}*=uFv|tO3xvCD6GgyPxl~NRo?#2T3Nh)1?PI%|a}up^urtV~Gn|Y!jT+vejepU34EPgY$~1ez%UT6D z;=&2VPtC~~IU#y&gQ^iP+e3@D;-j@2fhp;dM9K~Lumtg?P?)y-=UkMT{9^0BITt0P zRONZ}g8DeUQ?A;DrY&<0XY^-X` zjki&lc|N}dBEeOFB2W9#iXADE2J`U7;1O7W?Z(+eg6%$P+vt`tvK?yg&De0L<$`NG zL0SuyBTlJ26H>P2$Qwpp7&~^aQyRSQ8`I7@o>?5jD4NmtJl2D8nb>Kuj49Un8=DJn zFl=o<+xQtK*OvE}qO!@Mdn%U?F1=r>8Mb-}eXjA=QL3sr&{8dMKIiDMy{X|^$r~@j z$bSUirp6u@9CUNcirWTw%6`qyzB=qwjt=A3wWgk&l~@($;MM`A@lK#~ef{JOr|8Dm zDChEghDV(mI={{)@()j~D@Qh(eS(Ld2Yb*XMF|4D=1a%s-%rl?(o-AFUwrtZkKa0= zPJX9uc&vYD{{7BLn@*4FrM(K~1bB>hGUy`Uc2>nVm%5skGmp1$jFu7`&FT9-I8`~o z+m99J*9>uF%qPyk=engwXI9*eF{&MA-8Z#2Lb2v5KXbjuP1Y*Qp$zWN zvXvzK+SX>vPk}91^~I6*zR`zg>0!7XOeI|v)D?8jn<_guZoGy!A=9q@kP%Ki(!!z_PUE`y6S&fsEc{EG(7P9qUPD;?9~&l)?UPjF!KAgZ}ajy36-A_j|khy~F+9 z>3+An-@9N(YCE_gTcx`~?!oDRi6_T2J!g3 zwEwh^b@P33>g@8DvS)&P?wT*#po)6{3-)1G?L8pYoM&bFAHXYoJdaCc6Z&OqeZWVz zqjIIDR;CgL30xwKDt z&`PEXVXi)U$g@-bqq~i=8D0SWxTIWu{Ip*xZM_QYzYAcGE1MuJn+*l2a^#-FR|XGK zf$oGtEd1AhEFPIh|9Ifa;Gs)=Ar{`936B~yxUUQrxi8^Z3Y$&f3R1+HK34`8-Q3s> zM89yWz9P;$Qdc~9$@8z@JSrDMo6N4^{->Doz1YtVZk)d|xY1xLe8r51SE0O-&%9@{ z_@IY3pWMDM<=XRhw7ijYE4D7wp>zYaB6boBGaTSoL>f7s!YkviZ#+BjV>PoAKlw3n zlWb2lU(ZN5iZ4%mbb#AgogIA;K<7q}PtsRtKJ4*}e;ZjSjeZSvW%#1lLl%~n%D+5V z@hDU_@%X^^2AD=FU3=c1xnFtgJOeKmzu~cBW1uVgd$G41C#K(d`n~U~I6pevKlrB$ zR|Ze-)kKAJn6KZL!gnk1tvFxy*c*daeeT7FOw#$5~R52&M z3*!~%r=R%Ba0L#CrXFs@B`E8@(OUyNZkmHF$abl(nqfR!`-KiJK90c@zVw0NPS{>{ zqhg CN;L$Tz1X)y@x-3kVlRc=dUEj+{DuZ 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 literal 173568 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 N|JZZ8886EzHUM`UYJC6z delta 291 zcmZozA<(cwU_uAWhm#L88+%%N7+ZUow)Qa3y~XpTgWF_cz#jS4)sLd5o8D$lW&w#z zZ@kN_G=1M~W@#3%1duBuc7TCFf{}rVfq~&9=Zje&O%_WoR8Hr=!z{xL6q(*|msxhY z_Z?;_7O*&)o@cQME+9S3rt+d-JuDy*kVP^OO<)N$P3O7m)j*nfHhew<(F77f(gc#& z4%Eb~B=~S@@6@}Z8yx1#q}@KOv%+H1c5OD6M~vIc8CfQCgMB`okC#P4;Dfb6b;H>n U$B8*ndzn<{#cVg@WjVzL0AqA)mjD0& diff --git a/引用DLL/Lskj.WebErp.Core.dll b/引用DLL/Lskj.WebErp.Core.dll index 7561c0c0a938cbdc69336d4c0c8d320e83912504..e03e67abd3174ef84c36579a9bf8221732a31806 100644 GIT binary patch delta 11272 zcmaLdd7MsF7zgk<7_(t!US_d1V>f1y7P6J>Dxqi?Aw`x!DWar1j9V`*DRI%DqL3t6 z#?oRd*|TNMlD!mKJ}o}z+MxljBdp1MuKi6t~LUl zqY@V6=1=U#mbEQhzjs^jse@VJm8ig|SglXpS^1~WoeYYRMMgwKl;A(H5iC{&#mGv! zaNfx2cBU9vlt9K}2d*`36eEik$fq6D)!8N=HTzR6hE@k-5yl}bg|M`R8vkYOsjDPs zqh(NPJi-Koi9XbfCaF;ivShUeSqj2bgymg0^pvw2#K&=N+E)kne#I_N!zj#cpe1O05 zf$GY;RFbRIh}beBcASXCRF>y!M8x{@m|XcNf90dqm2VELnVcpc@zy*h@75$fiRW6Jtelnar-5(^!m0Ll z%(H2M6#pd|oh}#Kkcjo;F?o5+v?q4mzD;Er=0-k)ycFiB6XL4Kr8OpE1BloR9+S&m z5GvPt#M`&(g?tdVYVV>muM@MTRh291NW{hvu_Z+8FcFKaMy-^UyijYUgezaAtemfu z)d<%hEVPlo%2{u6-Xp^2U5irJAzY7egCAq~o1C+8Gpo9M$a9ETkjHvR1#kAx9G;l( z%@&TMyLS~;3K$SRL06L^(J5gtQ$oW|l-Awy~f8u)LZOKZt1<0uh} zs!bj0^Yqr7LvjJ(MTD1V47G@tX>~UGGs0gGUP1V)g`!22uG8O8>Q#i-5MK9TU#klg z8)v`!)PsK@{8Nc$WF6`>|E)~mYxN(5|04X4MtiL;A`7`mXE>++7Q)*IBN%z-%ys5v zE*0N@h>;aTSe&Ehu~$O*X>&y;Kk{N)F|sIS0zdN62xAb&(ipnH;%Ie_Mk$1)5tcz1 zZ=txr#O{lcC7{$qgaL$QeQ19N6W(Y!pIR4K7?ThtBTP{v{|+WqtwB~EVFiR05mpkY z@wX16JZv@x(c+{KdYxuYyGqO2=7GL0O4IW^5ai_*?c!jy$9jF2pjrQb6??& z{OZR05H?2G1fa&60%gq*Hb;0r!Uw{r5to09uoCzn!j=eIQ7G0wYfWir{j)X*+ahd- zusw^=)R%t;l==|DhY>#FLCyCUn2sLx;iCvUA?&O|YyGn>Dz)%2gpVWaim;o58h!ac zfl{*(c1PGlLe2Gn&ym!HJrO>MuoptDH_|=`pF-Fd;nPK^$xr`hid4pa2>T;^mc-Ed zX9Gxe);}AFa1g@52y;1V%BTMjlsXjQFoe%}(Ru$4zj8e9Rr~!rjKdMWfbc~n^7YR~ zD3#+#gfAf+g>ZBTHS+2IGD>{~;TVLk%BU5+-;b5G2wy{}As*(4frdoq+7Q)#G=OBDnAlZKw2&MYZxd`VWoKIkQ{j>K74X^w65q^Mh z0m6l_|NIc8euQul!o_aX{4M4ZxBBs8gi8^AqCltrT&7UF|NIo;a)h5DTw$ZC|NI=K zu0*&B;c7p6`p-3fb@!iz2-hN92T)_{fwBz#bhiwbSyc Sty(Uwabihf&9;GKQU3#m7Ci+3 delta 11272 zcmaLdcYM`U6bJBLXldUobUf%_w(QXg;-In=kup>SL@l7GAXpGYQ4|zw$_PFnAgB<* zA}S~%q9Bwq94tjfQI?EqwXzij+{#DvCV5Gd+;e|_wE29_x97f-^xV9h*A^D_DlF(F#i&{}Rf|=%I8_U%T2R&ERjsG%@6jT@&2@4!B@!g z#`p?t_TYap*3y9bbBKA9viIwO3D<2`Ryk9-BN`;86Bw}SmEKpxuFNcT?=P|MJ@&3vu z$SdDMta_fu#6~WVFVdkwC{qzOd7(6c-vK5eoQ!Y^jh(GG%c-=xzip91gV#9b$Y>)Zo!miu5E-gdf%vTUw zVWB)BzM)uJdm@%k#OCpsSniTYxyD<(d8=N^50YE;MPk*AMq)+1iP%IUww#C^CSoy- zsZLqL3pF~$seG-pa^5M$2-hJjF_AyY8BcP;He8QVHz3@IaFZVc{3+UcaXq_^7ETgfiQOM}# zp|<`T=!)iIXB;JBu`Q@eeUg4P>yn&8cpBju8Y3g(Sz4_Z{Q=>R2+tw>$v}HV6!z)Q zDD^zT3kWazaELJl+Aq$2@u>%YMfjT(^_W)FulY}D0`Jwo5dMwu9~#YGT}Br2FP&li z>MtYw4`CD|@0_Eobs4P|RzX;mqvvfeTKd!a>MZKY$4V3Um5)OhKp3PkvcckMwNAJ? z!Wsw@5GEQZ-C#*5H5p+DVND;JpTRgAtd>tb8!QE3D#A25^3Pz>8T2wS>Q@qaqj z%B_CPLYR&43JIG1&ss~==zrD*;gty6BD~5(e*MV@_p4FrH3+Xo*v^lN`~5Y?uWq~! zVS9uf04l5_P}T`yXN1=yyum?*7@E2`O5lwMyCS@aLc9N2H%cS@&vFrVN7w^lPZp)f zw|_5`dNaaX5Z>xR#rNTOZ;$%$HiUf;_LZU0|E!-(4ZIy;e}s1+ywgI3-u`!?)I5X( z5DpYjaXnrS64ZrvBfJOUV1&xONbf^aL-_4TKT8m + /// 记录修改后的密码 + /// + /// + /// + /// + public static bool RecordPassword(string afterPass,string text) + { + try + { + //加密密码 + afterPass = AESUtil.Encrypt(afterPass); + LogUtil.WriteDebug("", text, afterPass, ""); + return true; + } + catch (Exception ex) + { + return false; + } } diff --git a/插件库/Lskj.Business/Impl/PowerImpl.cs b/插件库/Lskj.Business/Impl/PowerImpl.cs index 79c873d..3fa01be 100644 --- a/插件库/Lskj.Business/Impl/PowerImpl.cs +++ b/插件库/Lskj.Business/Impl/PowerImpl.cs @@ -6,6 +6,7 @@ using System.Text; using System.Data.SqlClient; using Lskj.Util; using Lskj.Model; +using Lskj.Core; namespace Lskj.Business.Impl { @@ -202,6 +203,26 @@ namespace Lskj.Business.Impl public static bool SaveRoleOperDate(string OperId, string OperName, string departemnt, string readdate, string editdate) { string sqlValue = string.Format(" if exists (select * from p_systemRoleOperSetTab s where s.operatorid='{0}' and roleId='0' ) update p_systemRoleOperSetTab set ReadPurview='{4}',EditPurview='{5}' where operatorid = '{0}' and roleId='0' ELSE insert into p_systemRoleOperSetTab (roleId,roleOperatorId,operatorid,operatorname,operatedate,department,ReadPurview,EditPurview) values ('0','{0}','{0}','{1}','{2}','{3}','{4}','{5}')", OperId, OperName, DateTime.Now, departemnt, readdate, editdate); + + if (SqlHelper.ConnectionType == ConnectionType.DmServer) + { + string dmOperId = (OperId ?? string.Empty).Replace("'", "''"); + string dmOperName = (OperName ?? string.Empty).Replace("'", "''"); + string dmDepartment = (departemnt ?? string.Empty).Replace("'", "''"); + string dmReadDate = (readdate ?? string.Empty).Replace("'", "''"); + string dmEditDate = (editdate ?? string.Empty).Replace("'", "''"); + + sqlValue = string.Format(@" + MERGE INTO p_systemRoleOperSetTab t + USING (SELECT '{0}' operatorid, '0' roleId FROM DUAL) s + ON (t.operatorid = s.operatorid AND t.roleId = s.roleId) + WHEN MATCHED THEN + UPDATE SET ReadPurview = '{3}', EditPurview = '{4}' + WHEN NOT MATCHED THEN + INSERT (roleId, roleOperatorId, operatorid, operatorname, operatedate, department, ReadPurview, EditPurview) + VALUES ('0', '{0}', '{0}', '{1}', SYSDATE, '{2}', '{3}', '{4}')", + dmOperId, dmOperName, dmDepartment, dmReadDate, dmEditDate); + } return ExecSqlValue(sqlValue) > 0; } diff --git a/插件库/Lskj.Business/Impl/SystemInfo.cs b/插件库/Lskj.Business/Impl/SystemInfo.cs index fd6bbb1..46b5594 100644 --- a/插件库/Lskj.Business/Impl/SystemInfo.cs +++ b/插件库/Lskj.Business/Impl/SystemInfo.cs @@ -16,6 +16,7 @@ using System.Xml; using Lskj.Business.Impl; using Lskj.Core; using Lskj.Model; +using Lskj.Data; namespace Lskj.Business { @@ -330,6 +331,11 @@ namespace Lskj.Business Instance.LoginUsername = item.Table.Columns.Contains("LoginUsername") && !string.IsNullOrEmpty(item["LoginUsername"] + "") ? item["LoginUsername"] + "" : ""; Instance.MainLeftShowMode = item.Table.Columns.Contains("MainLeftShowMode") && !string.IsNullOrEmpty(item["MainLeftShowMode"] + "") ? item["MainLeftShowMode"] + "" : ""; Instance.DeadlockPrompt = item.Table.Columns.Contains("DeadlockPrompt") && !string.IsNullOrEmpty(item["DeadlockPrompt"] + "") ? item["DeadlockPrompt"] + "" : ""; + Instance.SpecialAttachmentBrowser = item.Table.Columns.Contains("SpecialAttachmentBrowser") && !string.IsNullOrEmpty(item["SpecialAttachmentBrowser"] + "") ? "1".Equals(item["SpecialAttachmentBrowser"] + "") : false; + if (Instance.SpecialAttachmentBrowser) + { + ResourceDynamic.PubBrower = System.Environment.OSVersion.Version.Major == 5 && (System.Environment.OSVersion.Version.Minor == 1 || System.Environment.OSVersion.Version.Minor == 2) ? "Lskj.PubBrowerXp.dll" : "Lskj.PubBrower2.dll"; + } } /// /// 高拍仪AccessKey @@ -1154,6 +1160,10 @@ namespace Lskj.Business /// 死锁提示 /// public string DeadlockPrompt; + /// + /// 附件浏览器自带逻辑 + /// + public bool SpecialAttachmentBrowser; } } diff --git a/插件库/Lskj.Control/AuditPanelEx.Designer.cs b/插件库/Lskj.Control/AuditPanelEx.Designer.cs index 1cf15cb..231854f 100644 --- a/插件库/Lskj.Control/AuditPanelEx.Designer.cs +++ b/插件库/Lskj.Control/AuditPanelEx.Designer.cs @@ -28,7 +28,6 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); this.tabMain = new DevExpress.XtraTab.XtraTabControl(); this.tabpage_finish = new DevExpress.XtraTab.XtraTabPage(); this.gridFinish = new Lskj.Control.GridControlEx(); @@ -51,8 +50,8 @@ this.btnReverseSelection = new DevExpress.XtraEditors.SimpleButton(); this.btnSelectAll = new DevExpress.XtraEditors.SimpleButton(); this.dpb_Tools = new DevExpress.XtraEditors.DropDownButton(); - this.p_menu = new DevExpress.XtraBars.PopupMenu(this.components); - this.barManager1 = new DevExpress.XtraBars.BarManager(this.components); + this.p_menu = new DevExpress.XtraBars.PopupMenu(); + this.barManager1 = new DevExpress.XtraBars.BarManager(); this.barDockControlTop = new DevExpress.XtraBars.BarDockControl(); this.barDockControlBottom = new DevExpress.XtraBars.BarDockControl(); this.barDockControlLeft = new DevExpress.XtraBars.BarDockControl(); @@ -85,7 +84,7 @@ this.tabMain.Location = new System.Drawing.Point(0, 0); this.tabMain.Name = "tabMain"; this.tabMain.SelectedTabPage = this.tabpage_finish; - this.tabMain.Size = new System.Drawing.Size(1051, 683); + this.tabMain.Size = new System.Drawing.Size(1051, 701); this.tabMain.TabIndex = 20; this.tabMain.TabPages.AddRange(new DevExpress.XtraTab.XtraTabPage[] { this.tabpage_finish}); @@ -96,7 +95,7 @@ this.tabpage_finish.Controls.Add(this.splitBelow); this.tabpage_finish.Controls.Add(this.pl_top); this.tabpage_finish.Name = "tabpage_finish"; - this.tabpage_finish.Size = new System.Drawing.Size(1045, 654); + this.tabpage_finish.Size = new System.Drawing.Size(1045, 672); this.tabpage_finish.Text = "已完成单据"; // // gridFinish @@ -108,13 +107,14 @@ this.gridFinish.Margin = new System.Windows.Forms.Padding(4); this.gridFinish.Name = "gridFinish"; this.gridFinish.SiftEnumObj = Lskj.Control.GridControlEx.HeaderSiftEnum.Sum; - this.gridFinish.Size = new System.Drawing.Size(1045, 322); + this.gridFinish.Size = new System.Drawing.Size(1045, 340); + this.gridFinish.SysModel = null; this.gridFinish.TabIndex = 29; // // splitBelow // this.splitBelow.Dock = System.Windows.Forms.DockStyle.Bottom; - this.splitBelow.Location = new System.Drawing.Point(0, 361); + this.splitBelow.Location = new System.Drawing.Point(0, 379); this.splitBelow.Name = "splitBelow"; this.splitBelow.Panel1.Controls.Add(this.gridFlow); this.splitBelow.Panel1.Text = "Panel1"; @@ -134,6 +134,7 @@ this.gridFlow.Name = "gridFlow"; this.gridFlow.SiftEnumObj = Lskj.Control.GridControlEx.HeaderSiftEnum.Sum; this.gridFlow.Size = new System.Drawing.Size(453, 293); + this.gridFlow.SysModel = null; this.gridFlow.TabIndex = 19; // // gridDetail @@ -145,6 +146,7 @@ this.gridDetail.Name = "gridDetail"; this.gridDetail.SiftEnumObj = Lskj.Control.GridControlEx.HeaderSiftEnum.Sum; this.gridDetail.Size = new System.Drawing.Size(587, 293); + this.gridDetail.SysModel = null; this.gridDetail.TabIndex = 20; // // pl_top @@ -174,6 +176,8 @@ // labeldate_start // this.labeldate_start.BackColor = System.Drawing.Color.Transparent; + this.labeldate_start.BackgroundColor = System.Drawing.Color.Empty; + this.labeldate_start.ContentBold = false; this.labeldate_start.EditText = null; this.labeldate_start.FontSize = 0F; this.labeldate_start.LabelText = "终审时间起"; @@ -190,6 +194,8 @@ // labelcheck_finalAuditor // this.labelcheck_finalAuditor.BackColor = System.Drawing.Color.Transparent; + this.labelcheck_finalAuditor.BackgroundColor = System.Drawing.Color.Empty; + this.labelcheck_finalAuditor.ContentBold = false; this.labelcheck_finalAuditor.EditText = null; this.labelcheck_finalAuditor.FontSize = 0F; this.labelcheck_finalAuditor.LabelText = "终审人"; @@ -206,6 +212,8 @@ // labeltxt_dataFlag // this.labeltxt_dataFlag.BackColor = System.Drawing.Color.Transparent; + this.labeltxt_dataFlag.BackgroundColor = System.Drawing.Color.Empty; + this.labeltxt_dataFlag.ContentBold = false; this.labeltxt_dataFlag.EditText = ""; this.labeltxt_dataFlag.FontSize = 0F; this.labeltxt_dataFlag.LabelText = "数据标识号"; @@ -233,6 +241,8 @@ // labeldate_end // this.labeldate_end.BackColor = System.Drawing.Color.Transparent; + this.labeldate_end.BackgroundColor = System.Drawing.Color.Empty; + this.labeldate_end.ContentBold = false; this.labeldate_end.EditText = null; this.labeldate_end.FontSize = 0F; this.labeldate_end.LabelText = "终审时间止"; @@ -313,9 +323,9 @@ this.pl_bottom.Controls.Add(this.label_tips); this.pl_bottom.Controls.Add(this.label_date); this.pl_bottom.Dock = System.Windows.Forms.DockStyle.Bottom; - this.pl_bottom.Location = new System.Drawing.Point(0, 683); + this.pl_bottom.Location = new System.Drawing.Point(0, 693); this.pl_bottom.Name = "pl_bottom"; - this.pl_bottom.Size = new System.Drawing.Size(1051, 32); + this.pl_bottom.Size = new System.Drawing.Size(1051, 21); this.pl_bottom.TabIndex = 21; // // btnReverseSelection @@ -323,7 +333,7 @@ this.btnReverseSelection.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnReverseSelection.Appearance.Font = new System.Drawing.Font("宋体", 9F); this.btnReverseSelection.Appearance.Options.UseFont = true; - this.btnReverseSelection.Location = new System.Drawing.Point(586, 3); + this.btnReverseSelection.Location = new System.Drawing.Point(586, -8); this.btnReverseSelection.Name = "btnReverseSelection"; this.btnReverseSelection.Size = new System.Drawing.Size(55, 26); this.btnReverseSelection.TabIndex = 13; @@ -336,7 +346,7 @@ this.btnSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnSelectAll.Appearance.Font = new System.Drawing.Font("宋体", 9F); this.btnSelectAll.Appearance.Options.UseFont = true; - this.btnSelectAll.Location = new System.Drawing.Point(647, 3); + this.btnSelectAll.Location = new System.Drawing.Point(647, -8); this.btnSelectAll.Name = "btnSelectAll"; this.btnSelectAll.Size = new System.Drawing.Size(55, 26); this.btnSelectAll.TabIndex = 12; @@ -351,7 +361,7 @@ this.dpb_Tools.Appearance.Options.UseFont = true; this.dpb_Tools.DropDownArrowStyle = DevExpress.XtraEditors.DropDownArrowStyle.Show; this.dpb_Tools.DropDownControl = this.p_menu; - this.dpb_Tools.Location = new System.Drawing.Point(888, 3); + this.dpb_Tools.Location = new System.Drawing.Point(888, -8); this.dpb_Tools.Name = "dpb_Tools"; this.dpb_Tools.Size = new System.Drawing.Size(80, 26); this.dpb_Tools.TabIndex = 11; @@ -405,7 +415,7 @@ this.btnOkAudit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnOkAudit.Appearance.Font = new System.Drawing.Font("宋体", 9F); this.btnOkAudit.Appearance.Options.UseFont = true; - this.btnOkAudit.Location = new System.Drawing.Point(708, 3); + this.btnOkAudit.Location = new System.Drawing.Point(708, -8); this.btnOkAudit.Name = "btnOkAudit"; this.btnOkAudit.Size = new System.Drawing.Size(82, 26); this.btnOkAudit.TabIndex = 7; @@ -418,7 +428,7 @@ this.btnBackAudit.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnBackAudit.Appearance.Font = new System.Drawing.Font("宋体", 9F); this.btnBackAudit.Appearance.Options.UseFont = true; - this.btnBackAudit.Location = new System.Drawing.Point(796, 3); + this.btnBackAudit.Location = new System.Drawing.Point(796, -8); this.btnBackAudit.Name = "btnBackAudit"; this.btnBackAudit.Size = new System.Drawing.Size(86, 26); this.btnBackAudit.TabIndex = 6; @@ -431,7 +441,7 @@ this.btnRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnRefresh.Appearance.Font = new System.Drawing.Font("宋体", 9F); this.btnRefresh.Appearance.Options.UseFont = true; - this.btnRefresh.Location = new System.Drawing.Point(974, 3); + this.btnRefresh.Location = new System.Drawing.Point(974, -8); this.btnRefresh.Name = "btnRefresh"; this.btnRefresh.Size = new System.Drawing.Size(72, 26); this.btnRefresh.TabIndex = 5; @@ -448,7 +458,7 @@ this.Controls.Add(this.barDockControlBottom); this.Controls.Add(this.barDockControlTop); this.Name = "AuditPanelEx"; - this.Size = new System.Drawing.Size(1051, 715); + this.Size = new System.Drawing.Size(1576, 1072); ((System.ComponentModel.ISupportInitialize)(this.tabMain)).EndInit(); this.tabMain.ResumeLayout(false); this.tabpage_finish.ResumeLayout(false); diff --git a/插件库/Lskj.Control/FrmExport.cs b/插件库/Lskj.Control/FrmExport.cs index b670fd2..fae2a18 100644 --- a/插件库/Lskj.Control/FrmExport.cs +++ b/插件库/Lskj.Control/FrmExport.cs @@ -25,6 +25,7 @@ using System; using System.Collections.Generic; using System.Data; using System.Drawing; +using System.Globalization; using System.IO; using System.Linq; using System.Windows.Forms; @@ -36,6 +37,11 @@ namespace Lskj.Control /// public partial class FrmExport : Form { + /// + /// 临时导出表无法执行原表的自定义汇总逻辑,保存原表已经计算完成的总计值。 + /// + private readonly Dictionary _exportCustomSummaryValues = new Dictionary(StringComparer.OrdinalIgnoreCase); + public FrmExport() { InitializeComponent(); @@ -45,8 +51,57 @@ namespace Lskj.Control gridView1.Appearance.Row.Font = new Font("宋体", 9); gridView1.OptionsView.RowAutoHeight = true; gridView1.RowCellStyle += new RowCellStyleEventHandler(OnGridViewRowCellStyle); + gridView1.CustomSummaryCalculate += OnExportCustomSummaryCalculate; Lskj.Control.Model.AutoSizeChange.ControllInitializeSize(this); } + + /// + /// 将原表已经计算完成的自定义总计回填到临时导出表。 + /// + private void OnExportCustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs e) + { + if (!e.IsTotalSummary || e.SummaryProcess != DevExpress.Data.CustomSummaryProcess.Finalize) + { + return; + } + + GridSummaryItem summaryItem = e.Item as GridSummaryItem; + object summaryValue; + if (summaryItem != null && !string.IsNullOrEmpty(summaryItem.FieldName) && + _exportCustomSummaryValues.TryGetValue(summaryItem.FieldName, out summaryValue)) + { + e.TotalValue = summaryValue; + e.TotalValueReady = true; + } + } + + /// + /// 百分率自定义汇总在原表中可能已经格式化为字符串,导出前还原为数值。 + /// + private static object GetExportSummaryValue(GridColumn column, GridSummaryItem summaryItem) + { + object summaryValue = summaryItem.SummaryValue; + string valueText = summaryValue as string; + string summaryFormat = summaryItem.DisplayFormat ?? string.Empty; + string columnFormat = column == null ? string.Empty : column.DisplayFormat.FormatString; + + if (string.IsNullOrWhiteSpace(valueText) || + (!summaryFormat.Contains("%") && !columnFormat.Contains("%"))) + { + return summaryValue; + } + + string percentSymbol = CultureInfo.CurrentCulture.NumberFormat.PercentSymbol; + string numericText = valueText.Replace(percentSymbol, string.Empty).Replace("%", string.Empty).Trim(); + decimal percentageValue; + if (decimal.TryParse(numericText, NumberStyles.Any, CultureInfo.CurrentCulture, out percentageValue) || + decimal.TryParse(numericText, NumberStyles.Any, CultureInfo.InvariantCulture, out percentageValue)) + { + return percentageValue / 100m; + } + + return summaryValue; + } /// /// DataTable转换成Excel文档流(导出数据量超出65535条,分sheet) /// @@ -105,10 +160,12 @@ namespace Lskj.Control /// GridControl. public BandedGridControlEx ReplaceBitColumn(BandedGridControlEx bandGridControlEx, bool IsCustomColumn = false) { + _exportCustomSummaryValues.Clear(); bool hasBoolean = false; BandedGridView gridView = bandGridControlEx.GridView as BandedGridView; BandedGridControlEx NewBandedGridControlEx = new BandedGridControlEx(); BandedGridView gridView2 = NewBandedGridControlEx.GridView as BandedGridView; + gridView2.CustomSummaryCalculate += OnExportCustomSummaryCalculate; gridView2.Columns.Clear();//默认有2个列 List boolList = new List(); List datetimeList = new List(); @@ -164,6 +221,8 @@ namespace Lskj.Control newCol.Width = col.Width; newCol.OptionsColumn.AllowEdit = col.OptionsColumn.AllowEdit; newCol.ColumnEdit = boolList.Contains(col.FieldName) || datetimeList.Contains(col.FieldName) ? null : col.ColumnEdit; + newCol.DisplayFormat.FormatType = col.DisplayFormat.FormatType; + newCol.DisplayFormat.FormatString = col.DisplayFormat.FormatString; //多表头默认都有1级标题(默认有空白表头) if (col.OwnerBand != null) @@ -377,6 +436,7 @@ namespace Lskj.Control //底部汇总是否导出 if (SystemInfo.Instance.ExportSummary) { + gridView.UpdateTotalSummary(); for (int i = 1; i < gridView2.Columns.Count; i++) { string columnName = gridView2.Columns[i].FieldName; @@ -384,6 +444,11 @@ namespace Lskj.Control GridSummaryItem gsi = gridView.Columns[columnName].SummaryItem; if (gsi.SummaryType != DevExpress.Data.SummaryItemType.None) //gsi.SummaryValue!=null&& !string.IsNullOrEmpty(gsi.SummaryValue.ToString()) { + if (gsi.SummaryType == DevExpress.Data.SummaryItemType.Custom) + { + _exportCustomSummaryValues[columnName] = GetExportSummaryValue(gridView.Columns[columnName], gsi); + } + gridView2.Columns[i].Summary.AddRange(new DevExpress.XtraGrid.GridSummaryItem[] { new DevExpress.XtraGrid.GridColumnSummaryItem(gsi.SummaryType, gridView2.Columns[i].FieldName.ToString(), gsi.DisplayFormat) }); if (SystemInfo.Instance.GroupSpecialMode) @@ -422,6 +487,7 @@ namespace Lskj.Control public GridControl ReplaceBitColumn(GridControl control, bool IsCustomColumn = false) { GridView gridView = control.FocusedView as GridView; + _exportCustomSummaryValues.Clear(); bool hasBoolean = false; List boolList = new List(); List datetimeList = new List(); @@ -481,6 +547,8 @@ namespace Lskj.Control newCol.Width = 100; newCol.OptionsColumn.AllowEdit = col.OptionsColumn.AllowEdit; newCol.ColumnEdit = boolList.Contains(col.FieldName) || datetimeList.Contains(col.FieldName) ? null : col.ColumnEdit; + newCol.DisplayFormat.FormatType = col.DisplayFormat.FormatType; + newCol.DisplayFormat.FormatString = col.DisplayFormat.FormatString; this.gridView1.Columns.Add(newCol); visibleList.Add(col.FieldName); if (gridModel != null && !dictionary.ContainsKey(col.FieldName)) @@ -733,7 +801,9 @@ namespace Lskj.Control if (firstColumn != null) { this.gridView1.OptionsView.ShowFooter = true; - firstColumn.Summary.AddRange(new DevExpress.XtraGrid.GridSummaryItem[] { new DevExpress.XtraGrid.GridColumnSummaryItem(DevExpress.Data.SummaryItemType.Count, firstColumn.FieldName.ToString(), "合计: {0:#,###}行") }); + string firstFieldName = firstColumn.FieldName.ToString(); + _exportCustomSummaryValues[firstFieldName] = string.Format("合计: {0}行", dtTable.Rows.Count); + firstColumn.Summary.AddRange(new DevExpress.XtraGrid.GridSummaryItem[] { new DevExpress.XtraGrid.GridColumnSummaryItem(DevExpress.Data.SummaryItemType.Custom, firstFieldName, "{0}") }); if (SystemInfo.Instance.GroupSpecialMode) { @@ -748,6 +818,7 @@ namespace Lskj.Control //底部汇总是否导出 if (SystemInfo.Instance.ExportSummary) { + gridView.UpdateTotalSummary(); for (int i = 1; i < this.gridView1.Columns.Count; i++) { string columnName = this.gridView1.Columns[i].FieldName; @@ -755,6 +826,11 @@ namespace Lskj.Control if (gsi.SummaryType != DevExpress.Data.SummaryItemType.None) //gsi.SummaryValue!=null&& !string.IsNullOrEmpty(gsi.SummaryValue.ToString()) { + if (gsi.SummaryType == DevExpress.Data.SummaryItemType.Custom) + { + _exportCustomSummaryValues[columnName] = GetExportSummaryValue(gridView.Columns[columnName], gsi); + } + string originalFormat = gsi.DisplayFormat; // 匹配 {0:#.##}、{0:0.##} 等格式 避免出现没有小数但是还有小数点的情况,如 0. try @@ -763,7 +839,7 @@ namespace Lskj.Control if (match.Success) { string innerFormat = match.Groups[1].Value; - if (innerFormat.Contains(".")) + if (innerFormat.Contains(".") && innerFormat.Split(';').Length == 1) { // 生成条件格式:正数;负数;零(整数无小数点) string newInnerFormat = $"{innerFormat};{innerFormat};{innerFormat.Split('.')[0]}"; diff --git a/插件库/Lskj.Control/GridControlEx.cs b/插件库/Lskj.Control/GridControlEx.cs index 3ec2b93..8d7db63 100644 --- a/插件库/Lskj.Control/GridControlEx.cs +++ b/插件库/Lskj.Control/GridControlEx.cs @@ -1880,6 +1880,71 @@ namespace Lskj.Control } } } + + /// + /// 行转列多表头列合计。动态列创建在独立的BandedGridView里,不能直接复用主表格的SetColumnSumming。 + /// + private void SetDynamicBandedColumnSumming(BandedGridView view, BandedGridColumn gridColumn, GridColumnModel model, ref bool isFirstVisibleColumn, bool useSimpleSum) + { + if (view == null || gridColumn == null || model == null || !gridColumn.Visible) return; + + if (isFirstVisibleColumn) + { + view.OptionsView.ShowFooter = true; + gridColumn.Summary.AddRange(new GridSummaryItem[] { new GridColumnSummaryItem(DevExpress.Data.SummaryItemType.Count, gridColumn.FieldName, TotalFormat) }); + if (SystemInfo.Instance.GroupSpecialMode) + { + view.OptionsView.GroupFooterShowMode = GroupFooterShowMode.VisibleAlways; + } + else + { + view.GroupSummary.AddRange(new GridSummaryItem[] { new GridGroupSummaryItem(DevExpress.Data.SummaryItemType.Count, gridColumn.FieldName, null, TotalFormat) }); + } + isFirstVisibleColumn = false; + return; + } + + if (!model.CanSum) return; + + SummaryItemType summaryType = useSimpleSum ? SummaryItemType.Sum : ((!string.IsNullOrEmpty(model.sumCalc) || !string.IsNullOrEmpty(model.SumCond) || model.isSumMerge) ? SummaryItemType.Custom : SummaryItemType.Sum); + string format = model.SumText + "{0:" + model.DataFormat + "}"; + view.OptionsView.ShowFooter = true; + gridColumn.Summary.AddRange(new GridSummaryItem[] { new GridColumnSummaryItem(summaryType, gridColumn.FieldName, format) }); + if (SystemInfo.Instance.GroupSpecialMode) + { + view.GroupSummary.Add(new GridGroupSummaryItem(summaryType, gridColumn.FieldName, gridColumn, format)); + view.OptionsView.GroupFooterShowMode = GroupFooterShowMode.VisibleAlways; + } + else + { + view.GroupSummary.AddRange(new GridSummaryItem[] { new GridGroupSummaryItem(summaryType, gridColumn.FieldName, null, format) }); + } + } + + /// + /// 行转列树形多表头列合计。TreeList使用SummaryFooter,需单独设置。 + /// + private void SetDynamicTreeColumnSumming(DevExpress.XtraTreeList.TreeList treeList, DevExpress.XtraTreeList.Columns.TreeListColumn gridColumn, GridColumnModel model, ref bool isFirstVisibleColumn) + { + if (treeList == null || gridColumn == null || model == null || !gridColumn.Visible) return; + + if (isFirstVisibleColumn) + { + treeList.OptionsView.ShowSummaryFooter = true; + gridColumn.AllNodesSummary = true; + gridColumn.SummaryFooter = DevExpress.XtraTreeList.SummaryItemType.Count; + gridColumn.RowFooterSummaryStrFormat = TotalFormat; + isFirstVisibleColumn = false; + return; + } + + if (!model.CanSum) return; + + treeList.OptionsView.ShowSummaryFooter = true; + gridColumn.AllNodesSummary = true; + gridColumn.SummaryFooter = DevExpress.XtraTreeList.SummaryItemType.Sum; + gridColumn.RowFooterSummaryStrFormat = model.SumText + "{0:" + model.DataFormat + "}"; + } /// /// 说明:创建只读列 /// 创建人:龚宇超 @@ -8738,9 +8803,12 @@ namespace Lskj.Control /* ========= 1. 清空现有列 ========= */ bandedGridControlEx.BandedView.Bands.Clear(); bandedGridControlEx.BandedView.Columns.Clear(); + bandedGridControlEx.BandedView.GroupSummary.Clear(); + bandedGridControlEx.BandedView.OptionsView.ShowFooter = false; /* ========= 2. 创建“基本信息”Band ========= */ List normalColumns = ColumnList.Where(o => o.IsCustomGroupField == 0 || o.IsCustomGroupField == 3).ToList(); + bool bandedFirstVisibleColumn = true; GridBand normalBand = new GridBand { Caption = "基本信息" }; @@ -8775,6 +8843,7 @@ namespace Lskj.Control col.AppearanceHeader.ForeColor = RequiredForceColor; } bandedGridControlEx.SetColumnFormat(col, normalCol); + SetDynamicBandedColumnSumming(bandedGridControlEx.BandedView, col, normalCol, ref bandedFirstVisibleColumn, false); normalBand.Columns.Add(col); bandedGridControlEx.BandedView.Columns.Add(col); } @@ -8835,6 +8904,7 @@ namespace Lskj.Control subColumn.AppearanceHeader.ForeColor = RequiredForceColor; } bandedGridControlEx.SetColumnFormat(subColumn, subField); + SetDynamicBandedColumnSumming(bandedGridControlEx.BandedView, subColumn, subField, ref bandedFirstVisibleColumn, true); dynamicBand.Columns.Add(subColumn); bandedGridControlEx.BandedView.Columns.Add(subColumn); } @@ -8880,9 +8950,11 @@ namespace Lskj.Control /* ========= 1. 清空现有列 ========= */ TreeBandedGridControlEx.TreeListObj.Bands.Clear(); TreeBandedGridControlEx.TreeListObj.Columns.Clear(); + TreeBandedGridControlEx.TreeListObj.OptionsView.ShowSummaryFooter = false; /* ========= 2. 创建“基本信息”Band ========= */ List normalColumns = ColumnList.Where(o => o.IsCustomGroupField == 0 || o.IsCustomGroupField == 3).ToList(); + bool treeFirstVisibleColumn = true; DevExpress.XtraTreeList.Columns.TreeListBand normalBand = new DevExpress.XtraTreeList.Columns.TreeListBand { Caption = "基本信息" }; if (this.AggregationFreeze) normalBand.Fixed = DevExpress.XtraTreeList.Columns.FixedStyle.Left; @@ -8920,6 +8992,7 @@ namespace Lskj.Control col.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; col.AppearanceHeader.Options.UseTextOptions = true; TreeBandedGridControlEx.SetColumnFormat(col, normalCol); + SetDynamicTreeColumnSumming(TreeBandedGridControlEx.TreeListObj, col, normalCol, ref treeFirstVisibleColumn); normalBand.Columns.Add(col); TreeBandedGridControlEx.TreeListObj.Columns.Add(col); } @@ -8984,6 +9057,7 @@ namespace Lskj.Control subColumn.AppearanceHeader.Options.UseTextOptions = true; TreeBandedGridControlEx.SetColumnFormat(subColumn, subField); + SetDynamicTreeColumnSumming(TreeBandedGridControlEx.TreeListObj, subColumn, subField, ref treeFirstVisibleColumn); dynamicBand.Columns.Add(subColumn); TreeBandedGridControlEx.TreeListObj.Columns.Add(subColumn); } diff --git a/插件库/Lskj.Control/LabelMultiAutoTextEdit.cs b/插件库/Lskj.Control/LabelMultiAutoTextEdit.cs index 9c85a24..cbf0a7b 100644 --- a/插件库/Lskj.Control/LabelMultiAutoTextEdit.cs +++ b/插件库/Lskj.Control/LabelMultiAutoTextEdit.cs @@ -75,6 +75,11 @@ namespace Lskj.Control /// 初始赋值 /// public string ControlValue = string.Empty; + /// + /// 保存表格属性用到的key + /// + public string CurrentOperColumnKey = string.Empty; + public LabelMultiAutoTextEdit() @@ -380,6 +385,7 @@ namespace Lskj.Control _lookUpForm.TextField = TextField; _lookUpForm.SourceSQL = SourceSQL; _lookUpForm.DataSource = dataSource; + _lookUpForm.CurrentOperColumnKey = CurrentOperColumnKey; } /// /// 说明:清空选中的值 @@ -419,6 +425,7 @@ namespace Lskj.Control _lookUpForm.EditValue = this.EditValue; _lookUpForm.IsType = Model.FieldType; _lookUpForm.EditText = this.TextEdit.Text; + _lookUpForm.CurrentOperColumnKey = CurrentOperColumnKey; string sqlValue = string.Empty; if (this.ControlObj != null) { diff --git a/插件库/Lskj.Control/Model/ControlModel.cs b/插件库/Lskj.Control/Model/ControlModel.cs index a903434..89ebf3d 100644 --- a/插件库/Lskj.Control/Model/ControlModel.cs +++ b/插件库/Lskj.Control/Model/ControlModel.cs @@ -204,7 +204,7 @@ namespace Lskj.Control.Model /// The enable cond. public string RequiredCond { get; set; } /// - /// 可以方式 + /// 禁用方式(默认禁编,设置为1就禁显) /// /// The type of the enable. public string DisableType { get; set; } diff --git a/插件库/Lskj.Control/Model/GridExtend.cs b/插件库/Lskj.Control/Model/GridExtend.cs index 40fbfdb..b98c394 100644 --- a/插件库/Lskj.Control/Model/GridExtend.cs +++ b/插件库/Lskj.Control/Model/GridExtend.cs @@ -2801,7 +2801,9 @@ namespace Lskj.Control.Model GridColumnModel model = col.Tag as GridColumnModel; if (cell != null) { - if (cell.CellType == CellType.Blank) + // DevExpress导出的xlsx空值可能是内容为空的String单元格,也应按空单元格处理。 + if (cell.CellType == CellType.Blank || + (cell.CellType == CellType.String && string.IsNullOrEmpty(cell.StringCellValue))) { //isImportRows = false; continue; @@ -3564,7 +3566,8 @@ namespace Lskj.Control.Model { string field = fields[i]; string value = rowResult.Table.Columns.Contains(field) ? rowResult[field] + "" : null; - rowItem[field] = value; + + if(rowItem.Table.Columns.Contains(field)) rowItem[field] = value; } } else @@ -3573,7 +3576,7 @@ namespace Lskj.Control.Model for (int i = 0; i < fields.Length; i++) { string field = fields[i]; - rowItem[field] = DBNull.Value; + if (rowItem.Table.Columns.Contains(field)) rowItem[field] = DBNull.Value; } } } diff --git a/插件库/Lskj.Control/Model/MenuStrip/BaseMenuStrip.cs b/插件库/Lskj.Control/Model/MenuStrip/BaseMenuStrip.cs index fc94c3d..bf3d039 100644 --- a/插件库/Lskj.Control/Model/MenuStrip/BaseMenuStrip.cs +++ b/插件库/Lskj.Control/Model/MenuStrip/BaseMenuStrip.cs @@ -173,6 +173,11 @@ namespace Lskj.Control.Model cmsMenu.Items.Add(menuItem); RightMenuItems.Add(menuItem); } + if (menuModel.FontSize != 0) + { + menuItem.Font = new Font(menuItem.Font.FontFamily, menuModel.FontSize); + } + } if (!string.IsNullOrWhiteSpace(menuModel.ExecuteFirstCode)) { @@ -304,7 +309,7 @@ namespace Lskj.Control.Model return; } - if (model.VerifyUpdate && BaseGridView!=null) + if (model.VerifyUpdate && BaseGridView != null) { for (int i = 0; i < BaseGridView.DataRowCount; i++) { @@ -502,7 +507,7 @@ namespace Lskj.Control.Model { tipOnlyOne = false; string prompt = ReplaceHelper.ReplaceRowParam(rowData, model.BeforeMsg); - if (model.Mergeexec) + if (model.Mergeexec) { //替换[],替换的是多选行中的数据 prompt = ReplaceHelper.ReplaceRowParam(rows, prompt.Replace("[", "{").Replace("]", "}"), "", ""); @@ -977,7 +982,7 @@ namespace Lskj.Control.Model case -1: if (rValue == -1) { - if (SqlHelper.ConnectionType == ConnectionType.SqlServer) + if (SqlHelper.ConnectionType == ConnectionType.SqlServer) { SqlStoredProcedurepPrompt.GenerateProcedureExecutionScript(procName, paramList, isFirstFlag, comfirmFlag); } @@ -1811,7 +1816,7 @@ namespace Lskj.Control.Model paramList[2] = ReplaceHelper.ReplaceRowParam(rows, url) + ""; } } - if (model.DllName.ToLower().Contains("p_PubPrint.lsp".ToLower())&& !model.CancelDefaultReplace) + if (model.DllName.ToLower().Contains("p_PubPrint.lsp".ToLower()) && !model.CancelDefaultReplace) { string paramsql1 = paramList[2]; paramList[2] = ReplaceHelper.ReplaceRowParam(rows, paramsql1, "'", "'"); diff --git a/插件库/Lskj.Control/Model/MenuStrip/RightMenuModel.cs b/插件库/Lskj.Control/Model/MenuStrip/RightMenuModel.cs index 65edb81..89b43d1 100644 --- a/插件库/Lskj.Control/Model/MenuStrip/RightMenuModel.cs +++ b/插件库/Lskj.Control/Model/MenuStrip/RightMenuModel.cs @@ -346,6 +346,10 @@ namespace Lskj.Control.Model /// 右键多选合并不走默认替换(p_PubPrint.lsp) /// public bool CancelDefaultReplace; + /// + /// 右键字体大小 + /// + public int FontSize; /// @@ -485,6 +489,8 @@ namespace Lskj.Control.Model this.VerifyUpdate = string.IsNullOrWhiteSpace(item["VerifyUpdate"] + "") ? false : "1".Equals(item["VerifyUpdate"] + ""); if (item.Table.Columns.Contains("CancelDefaultReplace")) this.CancelDefaultReplace = string.IsNullOrWhiteSpace(item["CancelDefaultReplace"] + "") ? false : "1".Equals(item["CancelDefaultReplace"] + ""); + + this.FontSize = item.Table.Columns.Contains("FontSize") && !string.IsNullOrEmpty(item["FontSize"] + "") ? Convert.ToInt32(item["FontSize"] + "") : 0; } /// diff --git a/插件库/Lskj.Control/Model/MessageUtil.cs b/插件库/Lskj.Control/Model/MessageUtil.cs index 37ba281..fe6fbcb 100644 --- a/插件库/Lskj.Control/Model/MessageUtil.cs +++ b/插件库/Lskj.Control/Model/MessageUtil.cs @@ -27,7 +27,43 @@ namespace Lskj.Control public sealed class MessageUtil { - public static string Prompt = string.IsNullOrWhiteSpace(SystemInfo.Instance.DeadlockPrompt) ? "网络连接超时,请稍候再试!" : SystemInfo.Instance.DeadlockPrompt; + public static string Prompt = "网络连接超时,请稍候再试!"; + + /// + /// 系统配置尚未初始化时不主动访问数据库,读取失败则使用默认死锁提示。 + /// + private static bool TryGetDeadlockPrompt(string message, out string deadlockPrompt) + { + deadlockPrompt = message; + if (string.IsNullOrEmpty(message) || !message.Contains("与另一个进程被死锁在")) + { + return false; + } + + bool promptDeadlock = false; + string configuredPrompt = string.Empty; + try + { + SystemInfo systemInfo = SystemInfo.Instance; + if (systemInfo != null) + { + promptDeadlock = systemInfo.PromptDeadlock; + configuredPrompt = systemInfo.DeadlockPrompt; + } + } + catch + { + // 数据库连接失败或系统参数尚未初始化时,提示框仍使用安全默认值。 + } + + if (promptDeadlock) + { + return false; + } + + deadlockPrompt = string.IsNullOrWhiteSpace(configuredPrompt) ? Prompt : configuredPrompt; + return true; + } /// @@ -54,8 +90,9 @@ namespace Lskj.Control } } - if (!string.IsNullOrEmpty(msg) && msg.Contains("与另一个进程被死锁在")&& !SystemInfo.Instance.PromptDeadlock) - msg = Prompt; + string deadlockPrompt; + if (TryGetDeadlockPrompt(msg, out deadlockPrompt)) + msg = deadlockPrompt; if (Business.Impl.LanguageTranslation.Translatable) { msg = Business.Impl.LanguageTranslation.GetTranslatedText(msg); @@ -89,9 +126,10 @@ namespace Lskj.Control } } - if (!string.IsNullOrEmpty(errorMessage) && errorMessage.Contains("与另一个进程被死锁在") && !SystemInfo.Instance.PromptDeadlock) + string deadlockPrompt; + if (TryGetDeadlockPrompt(errorMessage, out deadlockPrompt)) { - errorMessage = Prompt; + errorMessage = deadlockPrompt; if (Business.Impl.LanguageTranslation.Translatable) { errorMessage = Business.Impl.LanguageTranslation.GetTranslatedText(errorMessage); @@ -165,8 +203,9 @@ namespace Lskj.Control if (Debugger.IsAttached) { string msg = ex == null ? ResourceKeys.UnKownErrorTip : ex.StackTrace; - if (!string.IsNullOrEmpty(msg) && msg.Contains("与另一个进程被死锁在") && !SystemInfo.Instance.PromptDeadlock) - msg = Prompt; + string deadlockPrompt; + if (TryGetDeadlockPrompt(msg, out deadlockPrompt)) + msg = deadlockPrompt; if (Business.Impl.LanguageTranslation.Translatable) { msg = Business.Impl.LanguageTranslation.GetTranslatedText(msg); @@ -176,8 +215,9 @@ namespace Lskj.Control else { string msg = ex == null ? ResourceKeys.UnKownErrorTip : ex.Message; //ResourceKeys.SystemErrorTip + "\r\n" + ex.Message + "\r\n" + ex.StackTrace; - if (!string.IsNullOrEmpty(msg) && msg.Contains("与另一个进程被死锁在") && !SystemInfo.Instance.PromptDeadlock) - msg = Prompt; + string deadlockPrompt; + if (TryGetDeadlockPrompt(msg, out deadlockPrompt)) + msg = deadlockPrompt; if (Business.Impl.LanguageTranslation.Translatable) { msg = Business.Impl.LanguageTranslation.GetTranslatedText(msg); diff --git a/插件库/Lskj.Control/Model/MyControl.cs b/插件库/Lskj.Control/Model/MyControl.cs index 2558f5d..2f1d084 100644 --- a/插件库/Lskj.Control/Model/MyControl.cs +++ b/插件库/Lskj.Control/Model/MyControl.cs @@ -4615,6 +4615,7 @@ namespace Lskj.Control.Model multiAutoEdit.ValueField = model.ValueMember; multiAutoEdit.TextField = model.TextMember; multiAutoEdit.ControlObj = this; + multiAutoEdit.CurrentOperColumnKey= Model.ModuleCode + "_" + model.FieldName; //multiAutoEdit.SetDataSource(dataSource); multiAutoEdit.TextBoxProhibition = model.TextBoxProhibition; multiAutoEdit.TextEdit.KeyDown += new KeyEventHandler(OnTextEditKeyDown); diff --git a/插件库/Lskj.Control/ModuleEx.cs b/插件库/Lskj.Control/ModuleEx.cs index 67aa022..4dc7ac1 100644 --- a/插件库/Lskj.Control/ModuleEx.cs +++ b/插件库/Lskj.Control/ModuleEx.cs @@ -31,7 +31,6 @@ using FastReport; using DevExpress.XtraGrid.Views.BandedGrid; using System.Diagnostics; using Lskj.Core; -using System.Text.RegularExpressions; using Lskj.Business; using DevExpress.XtraTreeList.Nodes; using DevExpress.XtraTreeList; @@ -680,8 +679,35 @@ namespace Lskj.Control // this.ModuleGridObj.InitlizeSpiltLocation(); //} this.ModuleGridObj.SearchObj.SearchGrid(sqlValue); - if (!this.IsDragDetail) - this.ModuleGridDetailObj.SetDetailGridDataSource(); + if (!this.IsDragDetail) + { + bool enter = false; + + try + { + if (this.ModuleGridObj != null) + { + DataRow rowItem = this.ModuleGridObj.GridControlObj.GetViewFocusedDataRow(); + if (this.ModuleGridObj.GridControlObj.CustomGroupSelectedRow != null) + { + rowItem = this.ModuleGridObj.GridControlObj.CustomGroupSelectedRow; + } + if (rowItem != null&& !this.SysModel.DoubleClickDetail) enter = true; + } + } + catch (Exception ex) + { + + } + //enter判断 2026-7-24 添加 因为主表有行改版后事件,主表赋值后会刷新一次,这里是重复刷新(方法里有判断,主表有值执行的逻辑是相同的) + //如果是主表有数据,并且绑定了行改变事件,就执行了(重复执行) + //如果主表没有数据,就执行(清空明细) 或者绑定的是双击加载明细事件也执行(节点改变后刷新主表,顺便刷新明细) + if (!enter) + { + this.ModuleGridDetailObj.SetDetailGridDataSource(); + } + } + if (this.treeGridLeft.Visible && ModuleGridDetailObj.GridDetailList != null && ModuleGridDetailObj.GridDetailList.Count > 0) { this.ModuleGridDetailObj.scc_container.PanelVisibility = this.ModuleGridObj.GridControlObj.DataRowCount() == 0 ? SplitPanelVisibility.Panel1 : SplitPanelVisibility.Both; @@ -1851,16 +1877,81 @@ namespace Lskj.Control } /// - /// 判断是否是selete开头(可以处理sql前方有注释和空格的情况) + /// 判断有效SQL是否以select开头(忽略前方空格、BOM和注释) /// /// /// public static bool IsSelectAtStart(string sqlText) { - // Remove comments and whitespace at the start of the text - string cleanedText = Regex.Replace(sqlText, @"^(\s*--.*?(\r\n|\n)|\s*)*", ""); - // Check if the remaining text starts with 'select' - return cleanedText.StartsWith("select", StringComparison.OrdinalIgnoreCase); + if (string.IsNullOrEmpty(sqlText)) + { + return false; + } + + int index = 0; + while (index < sqlText.Length) + { + while (index < sqlText.Length && + (char.IsWhiteSpace(sqlText[index]) || sqlText[index] == '\uFEFF')) + { + index++; + } + + // 跳过SQL开头连续出现的单行注释。 + if (index + 1 < sqlText.Length && sqlText[index] == '-' && sqlText[index + 1] == '-') + { + index += 2; + while (index < sqlText.Length && sqlText[index] != '\r' && sqlText[index] != '\n') + { + index++; + } + continue; + } + + // 跳过块注释,同时兼容SQL Server支持的嵌套块注释。 + if (index + 1 < sqlText.Length && sqlText[index] == '/' && sqlText[index + 1] == '*') + { + index += 2; + int commentDepth = 1; + while (index < sqlText.Length && commentDepth > 0) + { + if (index + 1 < sqlText.Length && sqlText[index] == '/' && sqlText[index + 1] == '*') + { + commentDepth++; + index += 2; + } + else if (index + 1 < sqlText.Length && sqlText[index] == '*' && sqlText[index + 1] == '/') + { + commentDepth--; + index += 2; + } + else + { + index++; + } + } + + if (commentDepth > 0) + { + return false; + } + continue; + } + + break; + } + + const string selectKeyword = "select"; + if (index + selectKeyword.Length > sqlText.Length || + string.Compare(sqlText, index, selectKeyword, 0, selectKeyword.Length, + StringComparison.OrdinalIgnoreCase) != 0) + { + return false; + } + + int nextIndex = index + selectKeyword.Length; + return nextIndex == sqlText.Length || + (!char.IsLetterOrDigit(sqlText[nextIndex]) && sqlText[nextIndex] != '_'); } @@ -2000,4 +2091,4 @@ namespace Lskj.Control } } -} \ No newline at end of file +} diff --git a/插件库/Lskj.Control/MultiGridLookUp/FrmLookUp.cs b/插件库/Lskj.Control/MultiGridLookUp/FrmLookUp.cs index feb9b96..d407e34 100644 --- a/插件库/Lskj.Control/MultiGridLookUp/FrmLookUp.cs +++ b/插件库/Lskj.Control/MultiGridLookUp/FrmLookUp.cs @@ -186,6 +186,8 @@ namespace Lskj.Control.MultiGridLookUp this.Location = new Point((SystemInformation.PrimaryMonitorSize.Width - this.Width) / 2, (SystemInformation.PrimaryMonitorSize.Height - this.Height) / 2); } + // 自动列宽和弹窗尺寸计算完成后,最后应用个性化列配置,避免配置被覆盖。 + this.SetCustomColumns(); } /// /// 说明:计算控件Size,只计算一次 @@ -374,7 +376,6 @@ namespace Lskj.Control.MultiGridLookUp } } } - SetCustomColumns(); this.gcDetail.GridControl.DataSource = this.gridControl1.DataSourceTable().Clone(); this.gcMain.BestFitColumns(); //this.gcDetail.SelectAll(); @@ -397,28 +398,53 @@ namespace Lskj.Control.MultiGridLookUp DataTable customTable = this.gcMain.GetCustomColumnByDatabase(this.CurrentOperColumnKey); if (customTable != null && customTable.Rows.Count > 0) { - foreach (DataRow rowItem in customTable.Rows) + this.gcMain.BeginUpdate(); + this.gcDetail.BeginUpdate(); + try { - string fieldName = rowItem["fieldName"] + ""; - int fieldWidth = Convert.ToInt32(rowItem["fieldWidth"]); - int index = Convert.ToInt32(rowItem["orderid"]); - bool visible = "1".Equals(rowItem["isVisible"] + "") && fieldWidth > 0; - bool isFix = "True".Equals(rowItem["IfFixColumn"] + "", StringComparison.OrdinalIgnoreCase); - - GridColumn gridColumn = this.gcMain.Columns.ColumnByName(fieldName); - if (gridColumn != null && gridColumn.Visible && gridColumn.Width > 0) + foreach (DataRow rowItem in customTable.Rows) { - GridColumn colObj = this.gcMain.Columns[fieldName]; - colObj.VisibleIndex = index; - colObj.Width = fieldWidth; - colObj.Visible = visible; - colObj.Fixed = isFix ? FixedStyle.Left : FixedStyle.None; - colObj.OptionsFilter.FilterPopupMode = FilterPopupMode.CheckedList; + string fieldName = rowItem["fieldName"] + ""; + int fieldWidth = Convert.ToInt32(rowItem["fieldWidth"]); + int index = Convert.ToInt32(rowItem["orderid"]); + bool visible = "1".Equals(rowItem["isVisible"] + "") && fieldWidth > 0; + bool isFix = "True".Equals(rowItem["IfFixColumn"] + "", StringComparison.OrdinalIgnoreCase); + + SetCustomColumn(this.gcMain.Columns.ColumnByName(fieldName), fieldWidth, index, visible, isFix); + SetCustomColumn(this.gcDetail.Columns.ColumnByName(fieldName), fieldWidth, index, visible, isFix); } } + finally + { + this.gcDetail.EndUpdate(); + this.gcMain.EndUpdate(); + } } } + /// + /// 应用单列的个性化布局。 + /// + private static void SetCustomColumn(GridColumn column, int width, int visibleIndex, bool visible, bool isFix) + { + if (column == null) + { + return; + } + + column.Visible = visible; + if (visible) + { + column.VisibleIndex = visibleIndex; + } + if (width > 0) + { + column.Width = width; + } + column.Fixed = isFix ? FixedStyle.Left : FixedStyle.None; + column.OptionsFilter.FilterPopupMode = FilterPopupMode.CheckedList; + } + /// /// 说明:设置默认选中 /// 创建人:龚宇超 diff --git a/插件库/Lskj.Control/MultiModelLookUp/FrmModelLookUp.cs b/插件库/Lskj.Control/MultiModelLookUp/FrmModelLookUp.cs index d5943f7..21417c3 100644 --- a/插件库/Lskj.Control/MultiModelLookUp/FrmModelLookUp.cs +++ b/插件库/Lskj.Control/MultiModelLookUp/FrmModelLookUp.cs @@ -1028,7 +1028,11 @@ namespace Lskj.Control.MultiModelLookUp this.SysModel = new ModuleModel(modelRow);// 系统模块实体对象 if (this.SysModel != null) { - + if (this.SysModel.ModuleFrameHeight > 0 && this.SysModel.ModuleFrameWidth > 0) + { + this.Height = this.SysModel.ModuleFrameHeight; + this.Width = this.SysModel.ModuleFrameWidth; + } switch (this.SysModel.MenuType) { diff --git a/插件库/Lskj.Control/MultiModelLookUp/FrmModelLookUp2.cs b/插件库/Lskj.Control/MultiModelLookUp/FrmModelLookUp2.cs index 4b98950..1c7019b 100644 --- a/插件库/Lskj.Control/MultiModelLookUp/FrmModelLookUp2.cs +++ b/插件库/Lskj.Control/MultiModelLookUp/FrmModelLookUp2.cs @@ -1121,6 +1121,12 @@ namespace Lskj.Control.MultiModelLookUp this.SysModel = new ModuleModel(modelRow);// 系统模块实体对象 if (this.SysModel != null) { + if (this.SysModel.ModuleFrameHeight > 0 && this.SysModel.ModuleFrameWidth > 0) + { + this.Height = this.SysModel.ModuleFrameHeight; + this.Width = this.SysModel.ModuleFrameWidth; + } + switch (this.SysModel.MenuType) diff --git a/插件库/Lskj.Control/TreeGridControlEx.cs b/插件库/Lskj.Control/TreeGridControlEx.cs index 569348c..2b73bf2 100644 --- a/插件库/Lskj.Control/TreeGridControlEx.cs +++ b/插件库/Lskj.Control/TreeGridControlEx.cs @@ -79,6 +79,29 @@ namespace Lskj.Control /// public string SortField; + /// + /// 是否使用按层级分段的新版节点编号;默认false,保持老版整数节点号规则。 + /// + public bool UseSegmentedNodeId { get; set; } + + /// + /// 是否启用单据树表格粘贴;启用后粘贴内容作为新节点添加,不覆盖已有行。 + /// + public bool BillPaste { get; set; } + + // 记录单据粘贴是否应从一级节点开始,避免通过清空TreeList选择状态来表达粘贴位置。 + private bool _billPasteAsRoot; + + private int _treeNumberNodes = 2; + /// + /// 每级节点编号占用的位数,最小为2位。 + /// + public int TreeNumberNodes + { + get { return _treeNumberNodes; } + set { _treeNumberNodes = value < 2 ? 2 : value; } + } + /// /// 上次选中行 /// @@ -156,10 +179,36 @@ namespace Lskj.Control private void GcMain_MouseDown(object sender, MouseEventArgs e) { + TreeList treeList = sender as TreeList; + if (treeList == null) + { + return; + } + + if (e.Button == MouseButtons.Left) + { + TreeListHitInfo mouseHitInfo = treeList.CalcHitInfo(e.Location); + + if (BillPaste) + { + // 点击空白区域时后续粘贴为一级节点,不改动TreeList内部的选中集合。 + _billPasteAsRoot = mouseHitInfo.HitInfoType == HitInfoType.Empty; + } + + if (treeList.OptionsSelection.MultiSelect && + treeList.OptionsSelection.MultiSelectMode == TreeListMultiSelectMode.CellSelect && + (mouseHitInfo.HitInfoType == HitInfoType.RowIndicator || mouseHitInfo.HitInfoType == HitInfoType.RowIndicatorEdge) && + treeList.FocusedColumn == null && treeList.VisibleColumns.Count > 0) + { + // DevExpress 15.2在单元格多选模式下重复点击行序号时会清空FocusedColumn, + // 后续点击会将null列传给IsCellSelected并触发“参数名:key”异常。 + treeList.FocusedColumn = treeList.VisibleColumns[0]; + } + } + if (isEditing) return; // 编辑中不处理折叠 - TreeList treeList = sender as TreeList; - if (treeList == null || e.Clicks != 2 || e.Button != MouseButtons.Left) + if (e.Clicks != 2 || e.Button != MouseButtons.Left) return; TreeListHitInfo hitInfo = treeList.CalcHitInfo(e.Location); @@ -2312,6 +2361,24 @@ namespace Lskj.Control } else if (e.Modifiers.CompareTo(Keys.Control) == 0 && e.KeyCode == Keys.V) { + if (this.BillPaste) + { + // 单据树表格粘贴始终新增节点,不进入下方按可见行覆盖数据的通用粘贴逻辑。 + if (!SystemInfo.Instance.CancelPasteClearSort) + { + this.TreeListObj.ClearSorting(); + } + + object billPasteData = null; + IDataObject billDataObj = Clipboard.GetDataObject(); + if (billDataObj != null && billDataObj.GetDataPresent(DataFormats.Text)) + { + billPasteData = billDataObj.GetData(DataFormats.Text); + } + BillPasteMethod(e, billPasteData); + return; + } + //if (this.gridView.IsFindPanelVisible) //{ // MessageUtil.Show("搜索模式下无法粘贴行."); @@ -3258,6 +3325,314 @@ namespace Lskj.Control } + /// + /// 单据树表格粘贴。先将剪贴板内容转换为临时表,再统一设置父节点和节点号并追加到数据源。 + /// + /// 键盘事件,用于阻止系统继续处理本次粘贴。 + /// 剪贴板中的制表符分隔文本。 + private void BillPasteMethod(KeyEventArgs e, object clipboardData) + { + if (clipboardData == null) + { + return; + } + + DataTable sourceTable = this.GetGridViewDataSource(); + if (sourceTable == null || this.TreeListObj.VisibleColumns.Count == 0 || + !sourceTable.Columns.Contains(this.TreeListObj.KeyFieldName) || + !sourceTable.Columns.Contains(this.TreeListObj.ParentFieldName)) + { + return; + } + + TreeListColumn focusedColumn = this.TreeListObj.FocusedColumn; + if (focusedColumn == null || focusedColumn.VisibleIndex < 0) + { + focusedColumn = this.TreeListObj.VisibleColumns[0]; + } + + string pasteText = clipboardData.ToString(); + pasteText = Regex.Replace(pasteText, "\"[^\"]*(?:\"\"[^\"]*)*\"", m => m.Value.Replace("\r\n", "{lskj}").Replace("\"", "")); + string[] pasteRows = pasteText.Split(new string[] { "\r\n" }, StringSplitOptions.None); + DataTable pasteTable = sourceTable.Clone(); + int startColumnIndex = sourceTable.Rows.Count == 0 ? 0 : focusedColumn.VisibleIndex; + + for (int i = 0; i < pasteRows.Length; i++) + { + if (i == pasteRows.Length - 1 && pasteRows[i].Trim().Length == 0) + { + continue; + } + + string[] pasteCells = IgnoreTab ? new string[] { pasteRows[i] } : pasteRows[i].Split('\t'); + DataRow pasteRow = pasteTable.NewRow(); + SetBillPasteDefaultValues(pasteRow); + + int columnIndex = startColumnIndex; + for (int j = 0; j < pasteCells.Length && columnIndex < this.TreeListObj.VisibleColumns.Count; j++, columnIndex++) + { + TreeListColumn column = this.TreeListObj.VisibleColumns[columnIndex]; + GridColumnModel model = column.Tag as GridColumnModel; + if (model == null || model.ProhibitPaste || + (!model.CanCopy && (!this.TreeListObj.OptionsBehavior.Editable || !column.OptionsColumn.AllowEdit))) + { + continue; + } + + if (!string.IsNullOrWhiteSpace(model.DisableCond)) + { + string updateCond = model.DisableCond; + if (this.ParentControl != null) + { + updateCond = this.ParentControl.ReplaceParentControlValue(updateCond); + } + updateCond = ReplaceHelper.ReplaceRowParam(pasteRow, updateCond); + if (!ReplaceHelper.EvalCond(updateCond)) + { + continue; + } + } + + SetBillPasteCellValue(pasteRow, column, model, pasteCells[j]); + } + + SetBillPasteLengthErrors(pasteRow); + pasteTable.Rows.Add(pasteRow); + } + + if (pasteTable.Rows.Count == 0) + { + e.Handled = true; + return; + } + + TreeListNode parentNode = _billPasteAsRoot ? null : this.TreeListObj.FocusedNode; + DataRow parentRow = this.GetViewSpecifyDataRow(parentNode); + string parentNodeId = parentRow == null ? "0" : parentRow[this.TreeListObj.KeyFieldName] + ""; + if (string.IsNullOrWhiteSpace(parentNodeId)) + { + parentNodeId = "0"; + } + + if (UseSegmentedNodeId) + { + // 保留剪贴板中的节点号和父节点号,按原父子关系整体映射到当前选中节点下。 + pasteTable = PrepareNodeIdsForInsert(pasteTable, parentNodeId); + } + else + { + PrepareOldNodeIdsForInsert(pasteTable, parentNodeId); + } + + object lastNodeId = null; + foreach (DataRow pasteRow in pasteTable.Rows) + { + DataRow newRow = sourceTable.NewRow(); + foreach (DataColumn column in sourceTable.Columns) + { + if (column.AutoIncrement || column.ReadOnly || !string.IsNullOrEmpty(column.Expression)) + { + continue; + } + newRow[column.ColumnName] = pasteRow[column.ColumnName]; + } + sourceTable.Rows.Add(newRow); + lastNodeId = newRow[this.TreeListObj.KeyFieldName]; + } + + this.TreeListObj.RefreshDataSource(); + if (parentNode != null) + { + parentNode.Expanded = true; + } + DataSourceSorting(); + if (UseSegmentedNodeId) + { + // 新版节点号必须与最终界面顺序一致,追加完成后再统一整理一次。 + RenumberNodeIds(); + } + + if (lastNodeId != null) + { + TreeListNode lastNode = this.TreeListObj.FindNodeByKeyID(lastNodeId); + if (lastNode != null) + { + this.TreeListObj.FocusedNode = lastNode; + } + } + this.TreeListObj.ShowEditor(); + e.Handled = true; + } + + /// + /// 按普通表格粘贴规则,为新增粘贴行设置列默认值和父控件参数默认值。 + /// + /// 待填充的临时粘贴行。 + private void SetBillPasteDefaultValues(DataRow row) + { + foreach (TreeListColumn column in this.TreeListObj.Columns) + { + GridColumnModel model = column.Tag as GridColumnModel; + if (model == null || !row.Table.Columns.Contains(column.FieldName)) + { + continue; + } + + string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); + if (!string.IsNullOrEmpty(model.DefaultValue) && model.DefaultValue.Contains("{#") && this.ParentControl != null) + { + fieldValue = this.ParentControl.ReplaceParentControlValue(model.DefaultValue); + if (!string.IsNullOrEmpty(fieldValue)) + { + row[column.FieldName] = fieldValue; + } + } + else if (!string.IsNullOrEmpty(model.DefaultValue) && !model.DefaultValue.Contains("{ROW_")) + { + row[column.FieldName] = fieldValue; + } + } + } + + /// + /// 将单个剪贴板文本转换为列的实际保存值,并处理下拉框、模块返回框、日期和数值类型校验。 + /// + /// 待赋值的临时粘贴行。 + /// 目标树表格列。 + /// 目标列配置。 + /// 剪贴板中的显示文本。 + private void SetBillPasteCellValue(DataRow row, TreeListColumn column, GridColumnModel model, string pasteValue) + { + string cellValue = string.IsNullOrEmpty(pasteValue) ? pasteValue : pasteValue.Replace("{lskj}", "\n"); + bool isTextEqualValue = false; + object value = ControlType.IsValue(model.FieldType) ? GetValueByCaption(model, column.ColumnEdit, cellValue, out isTextEqualValue) : cellValue; + value = model.FieldType == 14 ? ReplaceMultiSpace(value) : value; + + if (model.FieldType == 17) + { + value = value.Equals("非校验") ? 0 : value.Equals("校验") ? 1 : value; + if (value.Equals("不确定")) + { + return; + } + } + + if (model.FieldType == 116 || model.FieldType == 117 || model.FieldType == 160 || model.FieldType == 161) + { + value = ModuleReturnVerify(model, column.ColumnEdit, cellValue, out isTextEqualValue); + if (!isTextEqualValue && cellValue == value + "") + { + return; + } + } + + DateTime dateValue; + if (!isTextEqualValue && ((ControlType.IsValue(model.FieldType) && cellValue == value + "") || + (ControlType.LabTextInt == model.FieldType && (value + "").IsChinese()) || + (ControlType.IsDate(model.FieldType) && !DateTime.TryParse(value + "", out dateValue)))) + { + return; + } + + if (string.IsNullOrEmpty(value + "")) + { + if (!string.IsNullOrWhiteSpace(row[column.FieldName] + "")) + { + return; + } + + string columnType = column.ColumnType.Name.ToLower(); + if (columnType == "string" || columnType.IndexOf("char") >= 0) + row[column.FieldName] = ""; + else if (columnType.IndexOf("int") >= 0 || columnType == "decimal") + row[column.FieldName] = 0; + } + else + { + row[column.FieldName] = value; + } + } + + /// + /// 检查粘贴行的文本字节长度,超出列配置限制时在DataRow上记录列错误。 + /// + /// 已完成字段转换的临时粘贴行。 + private void SetBillPasteLengthErrors(DataRow row) + { + foreach (TreeListColumn column in this.TreeListObj.Columns) + { + GridColumnModel model = column.Tag as GridColumnModel; + if (model == null || model.LimitLength <= 0 || !row.Table.Columns.Contains(column.FieldName)) + { + continue; + } + + int inputLength = Encoding.Default.GetBytes(row[column.FieldName] + "").Length; + if (inputLength > model.LimitLength) + { + row.SetColumnError(row.Table.Columns[column.FieldName], "当前输入文本超过设定长度!"); + } + } + } + + /// + /// 按老版整数节点号规则迁移一批粘贴数据,同时保留这批数据内部的父子关系。 + /// 数值型来源节点号沿用原来的整体偏移方式;非数值或空节点号从当前最大节点号继续生成。 + /// + /// 已从剪贴板转换完成、尚未加入主数据源的临时表。 + /// 整批粘贴数据要插入到的目标父节点号。 + private void PrepareOldNodeIdsForInsert(DataTable pasteTable, string targetParentNodeId) + { + string keyFieldName = this.TreeListObj.KeyFieldName; + string parentFieldName = this.TreeListObj.ParentFieldName; + int nextNodeId = int.Parse(GetNewNodesId()); + int nodeOffset = nextNodeId - 1; + Dictionary nodeIdMap = new Dictionary(StringComparer.Ordinal); + HashSet usedNodeIds = new HashSet(); + + // 第一遍只生成新节点号,并记录来源节点号到新节点号的映射,父节点在第二遍统一处理。 + foreach (DataRow row in pasteTable.Rows) + { + string sourceNodeId = (row[keyFieldName] + "").Trim(); + + int sourceNumber; + int mappedNodeId; + if (!string.IsNullOrEmpty(sourceNodeId) && !nodeIdMap.ContainsKey(sourceNodeId) && + int.TryParse(sourceNodeId, out sourceNumber) && sourceNumber > 0) + { + mappedNodeId = sourceNumber + nodeOffset; + } + else + { + mappedNodeId = nextNodeId; + } + + while (usedNodeIds.Contains(mappedNodeId)) + { + mappedNodeId++; + } + + usedNodeIds.Add(mappedNodeId); + nextNodeId = Math.Max(nextNodeId, mappedNodeId + 1); + row[keyFieldName] = mappedNodeId; + if (!string.IsNullOrEmpty(sourceNodeId) && !nodeIdMap.ContainsKey(sourceNodeId)) + { + nodeIdMap.Add(sourceNodeId, mappedNodeId); + } + } + + // 只有父节点也包含在本次粘贴数据中时才保留层级,否则该行直接挂到目标父节点下。 + foreach (DataRow row in pasteTable.Rows) + { + string sourceParentNodeId = (row[parentFieldName] + "").Trim(); + int mappedParentNodeId; + row[parentFieldName] = !string.IsNullOrEmpty(sourceParentNodeId) && sourceParentNodeId != "0" && + nodeIdMap.TryGetValue(sourceParentNodeId, out mappedParentNodeId) + ? mappedParentNodeId + "" + : targetParentNodeId; + } + } + /// /// 粘贴功能 /// @@ -3450,31 +3825,50 @@ namespace Lskj.Control /// 传入的数据源 public void SetGridViewDataSourceGenerateID(DataTable table) { - DataRow[] dataRows = table.Rows.Cast().Where(x => string.IsNullOrWhiteSpace(x[TreeListObj.KeyFieldName] + "")).ToArray(); - - //传入的表格全部没有节点id,生成id后设置为数据源 - if (table.Rows.Count == dataRows.Length) + if (UseSegmentedNodeId) { - int i = 1; - foreach (DataRow item in table.Rows) - { - item[TreeListObj.KeyFieldName] = i; - i++; - } + table = EnsureSegmentedNodeColumnTypes(table); + AssignMissingSegmentedNodeIds(table); this.SetGridViewDataSource(table); + RenumberNodeIds(); } else { - DataRow[] AlreadyExistsRow = table.Rows.Cast().Where(x => !string.IsNullOrWhiteSpace(x[TreeListObj.KeyFieldName] + "")).ToArray(); - int maxid = int.Parse(AlreadyExistsRow.Cast().Max(n => n[TreeListObj.KeyFieldName]) + "") + 1; - //没有节点id的行赋值当前最大id - foreach (DataRow item in dataRows) + DataRow[] dataRows = table.Rows.Cast().Where(x => string.IsNullOrWhiteSpace(x[TreeListObj.KeyFieldName] + "")).ToArray(); + + //传入的表格全部没有节点id,生成id后设置为数据源 + if (table.Rows.Count == dataRows.Length) { - item[TreeListObj.KeyFieldName] = maxid + ""; - maxid++; + int i = 1; + foreach (DataRow item in table.Rows) + { + item[TreeListObj.KeyFieldName] = i; + i++; + } + this.SetGridViewDataSource(table); + } + else + { + DataRow[] AlreadyExistsRow = table.Rows.Cast().Where(x => !string.IsNullOrWhiteSpace(x[TreeListObj.KeyFieldName] + "")).ToArray(); + int maxid = int.Parse(AlreadyExistsRow.Cast().Max(n => n[TreeListObj.KeyFieldName]) + "") + 1; + //没有节点id的行赋值当前最大id + foreach (DataRow item in dataRows) + { + item[TreeListObj.KeyFieldName] = maxid + ""; + maxid++; + } + this.SetGridViewDataSource(table); } - this.SetGridViewDataSource(table); } + + SetTreeExpansion(); + } + + /// + /// 数据源重新绑定后,根据Expansion配置恢复树节点的展开状态。 + /// + private void SetTreeExpansion() + { if ((Expansion + "").Equals("1")) { this.TreeListObj.ExpandAll(); @@ -3490,13 +3884,79 @@ namespace Lskj.Control } /// - /// 获取新增节点id + /// 获取新增一级节点号;新版从一级节点分段继续编号,老版取最大整数节点号加一。 /// - /// + /// 可用于新增一级节点的节点号。 public string GetNewNodesId() + { + if (UseSegmentedNodeId) + { + return GetNewNodesId("0"); + } + + return GetOldNewNodesId(); + } + + /// + /// 根据父节点获取新增节点号;老版模式忽略父节点并继续使用最大整数节点号。 + /// + /// 目标父节点号,0或空字符串表示一级节点。 + /// 目标层级中下一个可用节点号。 + public string GetNewNodesId(string parentNodeId) + { + if (!UseSegmentedNodeId) + { + return GetOldNewNodesId(); + } + + DataTable gridTable = this.TreeListObj.DataSource as DataTable; + return GetNewNodesId(parentNodeId, gridTable); + } + + /// + /// 根据指定数据源和父节点获取新增节点号,用于尚未绑定到TreeList的批量新增数据。 + /// + /// 目标父节点号,0或空字符串表示一级节点。 + /// 参与计算现有节点号的数据源。 + /// 目标层级中下一个可用节点号。 + public string GetNewNodesId(string parentNodeId, DataTable dataTable) + { + if (!UseSegmentedNodeId) + { + return GetOldNewNodesId(); + } + + int sequence = GetNextNodeSequence(dataTable, parentNodeId); + return BuildSegmentedNodeId(parentNodeId, sequence); + } + + /// + /// 获取指定父节点下最后一个节点号,供新增主节点后继续追加关联子数据使用。 + /// + /// 目标父节点号。 + /// 最后一个同级节点号;该层级没有节点时返回空字符串。 + public string GetLastNodesId(string parentNodeId) + { + if (!UseSegmentedNodeId) + { + int nodeId; + return int.TryParse(GetOldNewNodesId(), out nodeId) ? (nodeId - 1) + "" : ""; + } + + DataTable gridTable = this.TreeListObj.DataSource as DataTable; + int sequence = GetNextNodeSequence(gridTable, parentNodeId) - 1; + return sequence > 0 ? BuildSegmentedNodeId(parentNodeId, sequence) : ""; + } + + /// + /// 按老版规则获取全表最大整数节点号加一。 + /// + /// 下一个可用的老版整数节点号。 + private string GetOldNewNodesId() { int id = 1; - DataTable gridTable = (this.TreeListObj.DataSource as DataTable).TrimDeleteRows(); + DataTable dataSource = this.TreeListObj.DataSource as DataTable; + DataTable gridTable = dataSource == null ? null : dataSource.TrimDeleteRows(); //获取表里最大的节点id if (gridTable != null && gridTable.Rows.Count > 0) { @@ -3510,6 +3970,393 @@ namespace Lskj.Control return id + ""; } + /// + /// 获取指定父节点下的下一个分段序号,只统计符合当前分段位数的直接子节点。 + /// + /// 节点数据源。 + /// 目标父节点号。 + /// 从1开始的下一个同级序号。 + private int GetNextNodeSequence(DataTable dataTable, string parentNodeId) + { + if (dataTable == null || !dataTable.Columns.Contains(TreeListObj.KeyFieldName) || !dataTable.Columns.Contains(TreeListObj.ParentFieldName)) + { + return 1; + } + + string parentId = NormalizeParentNodeId(parentNodeId); + int maxSequence = 0; + foreach (DataRow row in dataTable.Rows) + { + if (row.RowState == DataRowState.Deleted || !IsSameParentNode(row[TreeListObj.ParentFieldName] + "", parentId)) + { + continue; + } + + string nodeId = row[TreeListObj.KeyFieldName] + ""; + if (!nodeId.StartsWith(parentId, StringComparison.Ordinal) || nodeId.Length != parentId.Length + TreeNumberNodes) + { + continue; + } + + int sequence; + if (int.TryParse(nodeId.Substring(parentId.Length, TreeNumberNodes), out sequence) && sequence > maxSequence) + { + maxSequence = sequence; + } + } + + return maxSequence + 1; + } + + /// + /// 将父节点号和同级序号组合成新版分段节点号,例如01 + 02生成0102。 + /// + /// 父节点号。 + /// 当前父节点下的同级序号。 + /// 按TreeNumberNodes补零后的完整节点号。 + private string BuildSegmentedNodeId(string parentNodeId, int sequence) + { + string segment = sequence.ToString(); + if (segment.Length > TreeNumberNodes) + { + throw new InvalidOperationException("当前层级的节点数量已超过" + new string('9', TreeNumberNodes) + "个,无法继续新增节点。"); + } + + return NormalizeParentNodeId(parentNodeId) + segment.PadLeft(TreeNumberNodes, '0'); + } + + /// + /// 统一根节点表示方式,空字符串和0都转换为空前缀。 + /// + /// 待规范化的父节点号。 + /// 用于拼接新版节点号的父节点前缀。 + private string NormalizeParentNodeId(string parentNodeId) + { + string value = (parentNodeId + "").Trim(); + return string.IsNullOrEmpty(value) || value == "0" ? "" : value; + } + + /// + /// 比较两个父节点号,根节点的空字符串和0视为相同。 + /// + /// 数据行中的父节点号。 + /// 目标父节点号。 + /// 规范化后是否为同一个父节点。 + private bool IsSameParentNode(string rowParentNodeId, string parentNodeId) + { + return string.Equals(NormalizeParentNodeId(rowParentNodeId), NormalizeParentNodeId(parentNodeId), StringComparison.Ordinal); + } + + /// + /// 导入数据的临时树节点,保留来源节点关系以便整体重映射节点号。 + /// + private class ImportedTreeNode + { + public DataRow Row; + public string SourceNodeId; + public string SourceParentNodeId; + public List Children = new List(); + } + + /// + /// 将待插入树数据的来源父子关系整体映射到目标父节点下,并生成不重复的新版分段节点号。 + /// + /// 待插入的数据,KeyFieldName和ParentFieldName保存来源节点关系。 + /// 整批数据要插入到的目标父节点号。 + /// 已重新生成节点号和父节点号的数据源。 + public DataTable PrepareNodeIdsForInsert(DataTable dataTable, string parentNodeId) + { + if (!UseSegmentedNodeId || dataTable == null || dataTable.Rows.Count == 0 || + !dataTable.Columns.Contains(TreeListObj.KeyFieldName) || !dataTable.Columns.Contains(TreeListObj.ParentFieldName)) + { + return dataTable; + } + + dataTable = EnsureSegmentedNodeColumnTypes(dataTable); + + List importNodes = new List(); + Dictionary nodeMap = new Dictionary(StringComparer.Ordinal); + foreach (DataRow row in dataTable.Rows) + { + ImportedTreeNode node = new ImportedTreeNode + { + Row = row, + SourceNodeId = (row[TreeListObj.KeyFieldName] + "").Trim(), + SourceParentNodeId = (row[TreeListObj.ParentFieldName] + "").Trim() + }; + importNodes.Add(node); + if (!string.IsNullOrEmpty(node.SourceNodeId) && !nodeMap.ContainsKey(node.SourceNodeId)) + { + nodeMap.Add(node.SourceNodeId, node); + } + } + + List rootNodes = new List(); + foreach (ImportedTreeNode node in importNodes) + { + ImportedTreeNode parentNode; + if (!string.IsNullOrEmpty(node.SourceParentNodeId) && node.SourceParentNodeId != "0" && + nodeMap.TryGetValue(node.SourceParentNodeId, out parentNode) && parentNode != node) + { + parentNode.Children.Add(node); + } + else + { + rootNodes.Add(node); + } + } + + HashSet handledNodes = new HashSet(); + int sequence = GetNextNodeSequence(this.TreeListObj.DataSource as DataTable, parentNodeId); + foreach (ImportedTreeNode node in rootNodes) + { + AssignImportedNodeId(node, parentNodeId, ref sequence, handledNodes); + } + + // 异常的循环父子关系没有根节点,将未处理行按根节点继续添加,避免导入死循环。 + foreach (ImportedTreeNode node in importNodes) + { + if (!handledNodes.Contains(node)) + { + AssignImportedNodeId(node, parentNodeId, ref sequence, handledNodes); + } + } + + return dataTable; + } + + /// + /// 递归为导入节点及其子节点生成目标树中的分段节点号。 + /// + /// 当前待编号的导入节点。 + /// 当前节点在目标树中的父节点号。 + /// 当前层级下一个可用序号,处理后自动递增。 + /// 已处理节点集合,用于避免异常循环父子关系导致无限递归。 + private void AssignImportedNodeId(ImportedTreeNode node, string parentNodeId, ref int sequence, HashSet handledNodes) + { + if (!handledNodes.Add(node)) + { + return; + } + + string nodeId = BuildSegmentedNodeId(parentNodeId, sequence); + sequence++; + node.Row[TreeListObj.KeyFieldName] = nodeId; + node.Row[TreeListObj.ParentFieldName] = string.IsNullOrEmpty(NormalizeParentNodeId(parentNodeId)) ? "0" : parentNodeId; + + int childSequence = 1; + foreach (ImportedTreeNode childNode in node.Children) + { + AssignImportedNodeId(childNode, nodeId, ref childSequence, handledNodes); + } + } + + /// + /// 记录界面节点顺序对应的新节点号,避免遍历过程中直接修改KeyFieldName破坏父子关系。 + /// + private class NodeNumberAssignment + { + public DataRow Row; + public string NodeId; + public string ParentNodeId; + } + + private bool _renumberingNodeIds; + + /// + /// 按当前树节点显示顺序重新生成全部分段节点号和父节点号,然后一次性重新绑定数据源。 + /// + public void RenumberNodeIds() + { + if (!UseSegmentedNodeId || this.TreeListObj.DataSource == null || _renumberingNodeIds) + { + return; + } + + _renumberingNodeIds = true; + try + { + List assignments = new List(); + CollectNodeNumberAssignments(this.TreeListObj.Nodes, "", assignments); + if (assignments.Count == 0) + { + return; + } + + DataTable sourceTable = this.TreeListObj.DataSource as DataTable; + if (sourceTable == null) + { + return; + } + + DataTable numberedTable = sourceTable.Copy(); + foreach (NodeNumberAssignment assignment in assignments) + { + int rowIndex = sourceTable.Rows.IndexOf(assignment.Row); + if (rowIndex >= 0 && rowIndex < numberedTable.Rows.Count) + { + DataRow numberedRow = numberedTable.Rows[rowIndex]; + numberedRow[TreeListObj.ParentFieldName] = string.IsNullOrEmpty(assignment.ParentNodeId) ? "0" : assignment.ParentNodeId; + numberedRow[TreeListObj.KeyFieldName] = assignment.NodeId; + } + } + + this.SetGridViewDataSource(numberedTable); + } + finally + { + _renumberingNodeIds = false; + } + } + + /// + /// 按TreeList当前同级顺序递归收集节点号分配结果,不在遍历过程中修改原数据。 + /// + /// 当前层级的节点集合。 + /// 当前层级对应的父节点号。 + /// 用于汇总全部节点分配结果的集合。 + private void CollectNodeNumberAssignments(TreeListNodes nodes, string parentNodeId, List assignments) + { + for (int i = 0; i < nodes.Count; i++) + { + TreeListNode node = nodes[i]; + DataRowView rowView = this.TreeListObj.GetDataRecordByNode(node) as DataRowView; + if (rowView == null) + { + continue; + } + + string nodeId = BuildSegmentedNodeId(parentNodeId, i + 1); + assignments.Add(new NodeNumberAssignment + { + Row = rowView.Row, + NodeId = nodeId, + ParentNodeId = parentNodeId + }); + CollectNodeNumberAssignments(node.Nodes, nodeId, assignments); + } + } + + /// + /// 为数据源中节点号为空的行补充分段节点号,已有节点号保持不变。 + /// + /// 需要补充节点号的数据源。 + private void AssignMissingSegmentedNodeIds(DataTable dataTable) + { + if (dataTable == null || !dataTable.Columns.Contains(TreeListObj.KeyFieldName) || !dataTable.Columns.Contains(TreeListObj.ParentFieldName)) + { + return; + } + + foreach (DataRow row in dataTable.Rows) + { + if (row.RowState == DataRowState.Deleted || !string.IsNullOrWhiteSpace(row[TreeListObj.KeyFieldName] + "")) + { + continue; + } + + string parentNodeId = row[TreeListObj.ParentFieldName] + ""; + row[TreeListObj.KeyFieldName] = GetNewNodesId(parentNodeId, dataTable); + if (string.IsNullOrEmpty(NormalizeParentNodeId(parentNodeId))) + { + row[TreeListObj.ParentFieldName] = "0"; + } + } + } + + /// + /// 确保新版节点号和父节点号使用可写字符串列,避免01等前导零被数值列丢失。 + /// + /// 待检查或转换的数据源。 + /// 列类型已满足新版编号要求的数据源;无需转换时返回原表。 + private DataTable EnsureSegmentedNodeColumnTypes(DataTable dataTable) + { + if (dataTable == null || !dataTable.Columns.Contains(TreeListObj.KeyFieldName) || !dataTable.Columns.Contains(TreeListObj.ParentFieldName)) + { + return dataTable; + } + + DataColumn keyColumn = dataTable.Columns[TreeListObj.KeyFieldName]; + DataColumn parentColumn = dataTable.Columns[TreeListObj.ParentFieldName]; + bool keyIsString = (keyColumn.DataType == typeof(string) || keyColumn.DataType == typeof(object)) && !keyColumn.ReadOnly; + bool parentIsString = (parentColumn.DataType == typeof(string) || parentColumn.DataType == typeof(object)) && !parentColumn.ReadOnly; + if (keyIsString && parentIsString) + { + return dataTable; + } + + DataTable stringTable = new DataTable(dataTable.TableName); + foreach (DataColumn column in dataTable.Columns) + { + bool isNodeColumn = column.ColumnName.Equals(TreeListObj.KeyFieldName, StringComparison.OrdinalIgnoreCase) || + column.ColumnName.Equals(TreeListObj.ParentFieldName, StringComparison.OrdinalIgnoreCase); + DataColumn newColumn = new DataColumn(column.ColumnName, isNodeColumn ? typeof(string) : column.DataType) + { + Caption = column.Caption, + AllowDBNull = column.AllowDBNull, + DefaultValue = isNodeColumn ? "" : column.DefaultValue, + ColumnMapping = column.ColumnMapping + }; + if (!isNodeColumn && column.DataType == typeof(string)) + { + newColumn.MaxLength = column.MaxLength; + } + foreach (object key in column.ExtendedProperties.Keys) + { + newColumn.ExtendedProperties[key] = column.ExtendedProperties[key]; + } + stringTable.Columns.Add(newColumn); + } + + foreach (DataRow sourceRow in dataTable.Rows) + { + if (sourceRow.RowState == DataRowState.Deleted) + { + continue; + } + + DataRow newRow = stringTable.NewRow(); + foreach (DataColumn column in dataTable.Columns) + { + object value = sourceRow[column]; + if (column.ColumnName.Equals(TreeListObj.KeyFieldName, StringComparison.OrdinalIgnoreCase) || + column.ColumnName.Equals(TreeListObj.ParentFieldName, StringComparison.OrdinalIgnoreCase)) + { + newRow[column.ColumnName] = value == DBNull.Value ? "" : value + ""; + } + else + { + newRow[column.ColumnName] = value; + } + } + stringTable.Rows.Add(newRow); + + if (sourceRow.RowState == DataRowState.Unchanged) + { + newRow.AcceptChanges(); + } + else if (sourceRow.RowState == DataRowState.Modified) + { + newRow.AcceptChanges(); + newRow.SetModified(); + } + } + + foreach (DataColumn sourceColumn in dataTable.Columns) + { + DataColumn targetColumn = stringTable.Columns[sourceColumn.ColumnName]; + bool isNodeColumn = sourceColumn.ColumnName.Equals(TreeListObj.KeyFieldName, StringComparison.OrdinalIgnoreCase) || + sourceColumn.ColumnName.Equals(TreeListObj.ParentFieldName, StringComparison.OrdinalIgnoreCase); + if (!isNodeColumn && !string.IsNullOrEmpty(sourceColumn.Expression)) + { + targetColumn.Expression = sourceColumn.Expression; + } + targetColumn.ReadOnly = isNodeColumn ? false : sourceColumn.ReadOnly; + } + + return stringTable; + } + /// /// 说明:数据源重新生成节点id /// 创建人:曹屹峰 @@ -3521,6 +4368,12 @@ namespace Lskj.Control /// public void GenerateNodeID() { + if (UseSegmentedNodeId) + { + RenumberNodeIds(); + return; + } + //树表格当前数据源重新生成id DataTable dt = this.TreeListObj.DataSource as DataTable; int i = 1; @@ -3592,6 +4445,11 @@ namespace Lskj.Control MessageUtil.Show("删除成功!"); } } + + if (UseSegmentedNodeId) + { + RenumberNodeIds(); + } } } @@ -3674,7 +4532,11 @@ namespace Lskj.Control } } } - tmpRow[this.TreeListObj.KeyFieldName] = GetNewNodesId();//节点id + tmpRow[this.TreeListObj.KeyFieldName] = GetNewNodesId("0");//节点id + if (UseSegmentedNodeId && gridTable.Columns.Contains(this.TreeListObj.ParentFieldName)) + { + tmpRow[this.TreeListObj.ParentFieldName] = "0"; + } gridTable.Rows.Add(tmpRow); this.TreeListObj.ShowEditor(); @@ -3756,10 +4618,10 @@ namespace Lskj.Control /// - /// 拖拽完成时特殊处理 + /// 拖拽释放时处理限制条件和Alt同层排序。新版模式会先移动界面节点,再同步排序字段和分段节点号。 /// - /// - /// + /// 触发拖拽的TreeList。 + /// 拖拽目标位置和按键状态。 private void TreeListObj_DragDrop(object sender, DragEventArgs e) { if (!string.IsNullOrWhiteSpace(TreeTableDragCondition)) @@ -3788,13 +4650,22 @@ namespace Lskj.Control if (!string.IsNullOrWhiteSpace(this.SortField) && dataTable.Columns.Contains(this.SortField)) { //目标节点 + DXDragEventArgs dragEventArgs = DXDragEventArgs.GetEventArgs(TreeListObj, e); TreeListHitInfo hitInfo = TreeListObj.CalcHitInfo(TreeListObj.PointToClient(new System.Drawing.Point(e.X, e.Y))); - TreeListNode TreeListNode = hitInfo.Node;//当前目标节点 + TreeListNode TreeListNode = dragEventArgs == null || dragEventArgs.TargetNode == null ? hitInfo.Node : dragEventArgs.TargetNode;//当前目标节点 + if (TreeListNode == null) + { + return; + } TreeListNode parentNode = TreeListNode.ParentNode; // 获取目标节点的父节点 int nodeIndex = parentNode == null ? TreeListObj.Nodes.IndexOf(TreeListNode) : parentNode.Nodes.IndexOf(TreeListNode);//当前目标节点的索引 //拖拽节点 - TreeListNode SelectedNode = this.TreeListObj.FocusedNode; - TreeListNode SelectedParentNode = TreeListNode.ParentNode; // 获取拖拽节点的父节点 + TreeListNode SelectedNode = dragEventArgs == null || dragEventArgs.Node == null ? this.TreeListObj.FocusedNode : dragEventArgs.Node; + if (SelectedNode == null || SelectedNode == TreeListNode) + { + return; + } + TreeListNode SelectedParentNode = SelectedNode.ParentNode; // 获取拖拽节点的父节点 int SelectedNodeIndex = SelectedParentNode == null ? TreeListObj.Nodes.IndexOf(SelectedNode) : SelectedParentNode.Nodes.IndexOf(SelectedNode);//拖拽节点的索引 //如果目标节点和拖拽节点的父节点不一样,就证明不在同一层级,直接结束 if (SelectedNode.ParentNode != parentNode) @@ -3803,6 +4674,17 @@ namespace Lskj.Control return; } + if (UseSegmentedNodeId) + { + // 新版编号必须以界面中的同层节点顺序为准,先移动节点,再重写排序字段和节点号。 + int newNodeIndex = SelectedNodeIndex < nodeIndex ? nodeIndex : nodeIndex + 1; + this.TreeListObj.SetNodeIndex(SelectedNode, newNodeIndex); + int focusedNodeIndex = this.TreeListObj.GetVisibleIndexByNode(SelectedNode); + DataSourceSorting(); + RebindSegmentedNodesBySortField(focusedNodeIndex); + return; + } + DataRow DragRow = (this.TreeListObj.GetDataRecordByNode(SelectedNode) as DataRowView).Row;//拖拽行 DataRow TargetRow = (this.TreeListObj.GetDataRecordByNode(TreeListNode) as DataRowView).Row; //目标行 int SerialNumber = int.Parse(TargetRow[this.SortField] + "") + 1;//目标行序号+1 @@ -3833,17 +4715,48 @@ namespace Lskj.Control /// - /// 拖拽后执行 + /// TreeList完成普通节点拖拽后,同步数据源排序;新版模式再按最终界面顺序重新生成节点号。 /// - /// - /// + /// 完成拖拽的TreeList。 + /// 拖拽完成后的节点信息。 private void TreeListObj_AfterDragNode(object sender, AfterDragNodeEventArgs e) { DataSourceSorting(); + if (UseSegmentedNodeId) + { + int focusedNodeIndex = this.TreeListObj.GetVisibleIndexByNode(e.Node ?? this.TreeListObj.FocusedNode); + RebindSegmentedNodesBySortField(focusedNodeIndex); + } //强制重新加载数据 // this.TreeListObj.RefreshDataSource(); } + + /// + /// 按排序字段重新绑定新版树节点,再按绑定后的界面顺序生成节点号并恢复焦点位置。 + /// + /// 重新绑定前焦点节点的可见索引。 + private void RebindSegmentedNodesBySortField(int focusedNodeIndex) + { + DataTable dataTable = GetGridViewDataSource(); + if (dataTable == null) + { + return; + } + + if (!string.IsNullOrWhiteSpace(this.SortField) && dataTable.Columns.Contains(this.SortField)) + { + DataView dataView = dataTable.AsDataView(); + dataView.Sort = "[" + this.SortField.Replace("]", "]]") + "] ASC"; + dataTable = dataView.ToTable(); + } + + this.SetGridViewDataSourceGenerateID(dataTable); + if (focusedNodeIndex >= 0) + { + this.TreeListObj.FocusedNode = this.TreeListObj.GetNodeByVisibleIndex(focusedNodeIndex); + } + } #endregion diff --git a/插件库/Lskj.Core/ApiHelper.cs b/插件库/Lskj.Core/ApiHelper.cs index da0ac70..23a2124 100644 --- a/插件库/Lskj.Core/ApiHelper.cs +++ b/插件库/Lskj.Core/ApiHelper.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; - +using System.Windows.Forms; namespace Lskj.Core { @@ -148,15 +148,18 @@ namespace Lskj.Core apiHandlerModels = new List(); apiHandler._dataImpl = new Data.Api.DataImpl(); - apiHandler._dataImpl.dbOperator = new Lskj.Data.ADO.Template.DbTemplate(SqlHelper._connection.ConnectionString, "system.data.sqlclient"); + apiHandler._dataImpl = new Lskj.Data.Api.DataImpl()//新建数据库连接 + { + dbOperator = new Lskj.Data.ADO.Template.DbTemplate(SqlHelper._connection.ConnectionString, "system.data.sqlclient") + }; if (isSend)//是否发送数据 { - apiHandler.GetEventApiSendData(mep, apiHandlerModels); - apiHandler.SendEventApiData(apiHandlerModels); + apiHandler.GetEventApiSendData(mep, apiHandlerModels, apiHandler._dataImpl); + apiHandler.SendEventApiData(apiHandlerModels, apiHandler._dataImpl); } else { - apiHandler.GetEventApiSendData(mep, apiHandlerModels); + apiHandler.GetEventApiSendData(mep, apiHandlerModels, apiHandler._dataImpl); } this.apiResutMsg = apiHandler.GetApiReturnMsg(apiHandlerModels); } diff --git a/插件库/Lskj.LserpAll/Lskj.LserpAll.sln b/插件库/Lskj.LserpAll/Lskj.LserpAll.sln index e3eb339..764c7e7 100644 --- a/插件库/Lskj.LserpAll/Lskj.LserpAll.sln +++ b/插件库/Lskj.LserpAll/Lskj.LserpAll.sln @@ -271,6 +271,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lskj.PubCodeDesign", "..\Ls EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lskj.PubBillManagement", "..\Lskj.PubBillManagement\Lskj.PubBillManagement.csproj", "{6CE319BA-1253-41F2-8B59-8173FD7BE3F3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lskj.PubUpdatePwd", "..\Lskj.PubUpdatePwd\Lskj.PubUpdatePwd.csproj", "{91470E21-B8FB-4A16-967A-912F9E4807E1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1741,6 +1743,18 @@ Global {6CE319BA-1253-41F2-8B59-8173FD7BE3F3}.Release|Mixed Platforms.Build.0 = Release|Any CPU {6CE319BA-1253-41F2-8B59-8173FD7BE3F3}.Release|x86.ActiveCfg = Release|Any CPU {6CE319BA-1253-41F2-8B59-8173FD7BE3F3}.Release|x86.Build.0 = Release|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Debug|x86.ActiveCfg = Debug|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Debug|x86.Build.0 = Debug|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Release|Any CPU.Build.0 = Release|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Release|x86.ActiveCfg = Release|Any CPU + {91470E21-B8FB-4A16-967A-912F9E4807E1}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/插件库/Lskj.Model/BillModel.cs b/插件库/Lskj.Model/BillModel.cs index 1b95f1e..d3b2d1f 100644 --- a/插件库/Lskj.Model/BillModel.cs +++ b/插件库/Lskj.Model/BillModel.cs @@ -468,9 +468,9 @@ namespace Lskj.Model /// public bool HorizontalMode; /// - /// 树表格老版节点号模式 + /// 树表格新版节点号模式 /// - public bool OldNodeRules; + public bool NewNodeRules; /// /// 新版树节点位数(默认2位,最小2位) /// @@ -583,8 +583,8 @@ namespace Lskj.Model this.SourceMainPushPullHide = rowItem.Table.Columns.Contains("SourceMainPushPullHide") ? "1".Equals(rowItem["SourceMainPushPullHide"] + "") : false; this.SelectSourceColor = rowItem.Table.Columns.Contains("SelectSourceColor") ? rowItem["SelectSourceColor"] + "" : ""; this.HorizontalMode = rowItem.Table.Columns.Contains("HorizontalMode") ? "1".Equals(rowItem["HorizontalMode"] + "") : false; - this.OldNodeRules = rowItem.Table.Columns.Contains("OldNodeRules") ? "1".Equals(rowItem["OldNodeRules"] + "") : false; - this.TreeNumberNodes = rowItem.Table.Columns.Contains("MessageRefreshTime") && !string.IsNullOrEmpty(rowItem["MessageRefreshTime"] + "") ? Convert.ToInt32(rowItem["MessageRefreshTime"] + "")>2? Convert.ToInt32(rowItem["MessageRefreshTime"] + ""):2 : 2; + this.NewNodeRules = rowItem.Table.Columns.Contains("NewNodeRules") ? "1".Equals(rowItem["NewNodeRules"] + "") : false; + this.TreeNumberNodes = rowItem.Table.Columns.Contains("TreeNumberNodes") && !string.IsNullOrEmpty(rowItem["TreeNumberNodes"] + "") ? Convert.ToInt32(rowItem["TreeNumberNodes"] + "")>2? Convert.ToInt32(rowItem["TreeNumberNodes"] + ""):2 : 2; } } -} \ No newline at end of file +} diff --git a/插件库/Lskj.Model/ModuleModel.cs b/插件库/Lskj.Model/ModuleModel.cs index 974a1e3..b05701d 100644 --- a/插件库/Lskj.Model/ModuleModel.cs +++ b/插件库/Lskj.Model/ModuleModel.cs @@ -585,7 +585,7 @@ namespace Lskj.Model /// public int AccordingNameSelected; /// - /// 基础档案关闭时候触发存储过程 + /// 基础档案关闭时候触发存储过程(扫码模块关闭时) /// public string FrmCloseStored; /// @@ -1050,6 +1050,14 @@ namespace Lskj.Model ///隐藏审核按钮(lskj.pubadd.dll) /// public bool HideReviewBut; + /// + /// 模块弹出框高度 + /// + public int ModuleFrameHeight; + /// + /// 模块弹出框宽度 + /// + public int ModuleFrameWidth; #endregion @@ -1243,6 +1251,9 @@ namespace Lskj.Model this.TotalQuantity = rowItem.Table.Columns.Contains("TotalQuantity") ? "1".Equals(rowItem["TotalQuantity"] + "") : false; this.HeaderSortCriteria = rowItem.Table.Columns.Contains("HeaderSortCriteria") ? rowItem["HeaderSortCriteria"] + "" : ""; this.HideReviewBut = rowItem.Table.Columns.Contains("HideReviewBut") ? "1".Equals(rowItem["HideReviewBut"] + "") : false; + + this.ModuleFrameHeight = rowItem.Table.Columns.Contains("ModuleFrameHeight") && !string.IsNullOrEmpty(rowItem["ModuleFrameHeight"] + "") ? Convert.ToInt32(rowItem["ModuleFrameHeight"] + "") : 0; + this.ModuleFrameWidth = rowItem.Table.Columns.Contains("ModuleFrameWidth") && !string.IsNullOrEmpty(rowItem["ModuleFrameWidth"] + "") ? Convert.ToInt32(rowItem["ModuleFrameWidth"] + "") : 0; } } } diff --git a/插件库/Lskj.PubApiSetModule/FrmMain.cs b/插件库/Lskj.PubApiSetModule/FrmMain.cs index c6fe370..db52c4c 100644 --- a/插件库/Lskj.PubApiSetModule/FrmMain.cs +++ b/插件库/Lskj.PubApiSetModule/FrmMain.cs @@ -439,7 +439,10 @@ namespace Lskj.PubApiSetModule valueEncryptTypeComboBox.Items.Add(new ComBoxModel() { Value = 3, Text = "URL地址加密" }); valueEncryptTypeComboBox.Items.Add(new ComBoxModel() { Value = 4, Text = "URL文件Base64" }); valueEncryptTypeComboBox.Items.Add(new ComBoxModel() { Value = 5, Text = "RSA" }); - valueEncryptTypeComboBox.Items.Add(new ComBoxModel() { Value = 103, Text = "道宏发票接口特殊加密" });//道宏发票接口特殊加密 + valueEncryptTypeComboBox.Items.Add(new ComBoxModel() { Value = 101, Text = "航天凯特特殊加密" }); + valueEncryptTypeComboBox.Items.Add(new ComBoxModel() { Value = 102, Text = "SHA256ToBase64" }); + valueEncryptTypeComboBox.Items.Add(new ComBoxModel() { Value = 103, Text = "道宏发票接口特殊加密" }); + valueEncryptTypeComboBox.Items.Add(new ComBoxModel() { Value = 104, Text = "SHA256ToBit" }); #endregion #region 朗速接口主表 getIdColumn.OptionsColumn.AllowEdit = false; @@ -607,7 +610,7 @@ namespace Lskj.PubApiSetModule colDic.Add("valueDataType", "int"); colDic.Add("unionPmsId", "int"); colDic.Add("valueEncryptType", "int"); - colDic.Add("encryptKey", "int"); + colDic.Add("encryptKey", "varchar(100)"); colDic.Add("allowNull", "int"); string isExitApiTab = "select top 1 * from sysObjects where Id=OBJECT_ID(N'P_systemEventApiPmsTab') and xtype='U'"; DataTable apiTab = SqlHelper.ExecuteDataTable(isExitApiTab); diff --git a/插件库/Lskj.PubBill/BillModule.cs b/插件库/Lskj.PubBill/BillModule.cs index 11939d9..48b61e5 100644 --- a/插件库/Lskj.PubBill/BillModule.cs +++ b/插件库/Lskj.PubBill/BillModule.cs @@ -611,58 +611,67 @@ namespace Lskj.PubBill #endregion #region 加载来源明细 GridControlEx gridDetail = new GridControlEx(); - if (model.sourceDetailType.Equals("1")) + if (!string.IsNullOrWhiteSpace(model.DetailModeCode)) { - //明细为树表格 - gridDetail = new TreeGridControlEx(); - billModuleModel.SourceDetailControl = gridDetail; - //创建表格列 - cachesDic.AddTask(gridDetail, "DynamicModel", dynamicModelTask); - gridDetail.GetDataCaches(cachesDic, GridCustomColumnStruct.BillSourceDetailGridView + model.FormKey); - Task detailGridRowColorsTask = cachesDic.AddTask(gridDetail, "BaseGridRowColors", new Task(() => - { - return BaseModuleImpl.GetBaseGridRowColors("SOURCEDETAIL_" + model.FormKey); - })); - Task detailGridRightMenusTask = cachesDic.AddTask(gridDetail, "BaseGridRightMenus", new Task(() => - { - return BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDT_" + model.FormKey); - })); } - else + else { - gridDetail = new GridControlEx(); - billModuleModel.SourceDetailControl = gridDetail; - //创建表格列 - cachesDic.AddTask(gridDetail, "DynamicModel", dynamicModelTask); - gridDetail.GetDataCaches(cachesDic, GridCustomColumnStruct.BillSourceDetailGridView + model.FormKey); - Task detailGridRowColorsTask = cachesDic.AddTask(gridDetail, "BaseGridRowColors", new Task(() => + if (model.sourceDetailType.Equals("1")) { - return BaseModuleImpl.GetBaseGridRowColors("SOURCEDETAIL_" + model.FormKey); - })); - Task detailGridRightMenusTask = cachesDic.AddTask(gridDetail, "BaseGridRightMenus", new Task(() => - { - return BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDT_" + model.FormKey); - })); - //明细的明细(明细分成左右2个) - if (!string.IsNullOrEmpty(model.SourceDetailsDetailsSql)) - { - GridControlEx gridDetail_Details = new GridControlEx(); - billModuleModel.SourceDetailDetailControl = gridDetail_Details; - //创建只读列 - Task detailDetailsTask = cachesDic.AddTask(gridDetail_Details, "DetailDetails", new Task(() => - { - return BaseModuleImpl.getDetail_Details(model.FormKey); - })); + //明细为树表格 + gridDetail = new TreeGridControlEx(); + billModuleModel.SourceDetailControl = gridDetail; //创建表格列 - cachesDic.AddTask(gridDetail_Details, "DynamicModel", dynamicModelTask); - gridDetail_Details.GetDataCaches(cachesDic); - Task detailDetailsGridRightMenusTask = cachesDic.AddTask(gridDetail_Details, "BaseGridRightMenus", new Task(() => + cachesDic.AddTask(gridDetail, "DynamicModel", dynamicModelTask); + gridDetail.GetDataCaches(cachesDic, GridCustomColumnStruct.BillSourceDetailGridView + model.FormKey); + Task detailGridRowColorsTask = cachesDic.AddTask(gridDetail, "BaseGridRowColors", new Task(() => { - return BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDTX_" + model.FormKey); + return BaseModuleImpl.GetBaseGridRowColors("SOURCEDETAIL_" + model.FormKey); })); + Task detailGridRightMenusTask = cachesDic.AddTask(gridDetail, "BaseGridRightMenus", new Task(() => + { + return BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDT_" + model.FormKey); + })); + } - } + else + { + gridDetail = new GridControlEx(); + billModuleModel.SourceDetailControl = gridDetail; + //创建表格列 + cachesDic.AddTask(gridDetail, "DynamicModel", dynamicModelTask); + gridDetail.GetDataCaches(cachesDic, GridCustomColumnStruct.BillSourceDetailGridView + model.FormKey); + Task detailGridRowColorsTask = cachesDic.AddTask(gridDetail, "BaseGridRowColors", new Task(() => + { + return BaseModuleImpl.GetBaseGridRowColors("SOURCEDETAIL_" + model.FormKey); + })); + Task detailGridRightMenusTask = cachesDic.AddTask(gridDetail, "BaseGridRightMenus", new Task(() => + { + return BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDT_" + model.FormKey); + })); + //明细的明细(明细分成左右2个) + if (!string.IsNullOrEmpty(model.SourceDetailsDetailsSql)) + { + GridControlEx gridDetail_Details = new GridControlEx(); + billModuleModel.SourceDetailDetailControl = gridDetail_Details; + //创建只读列 + Task detailDetailsTask = cachesDic.AddTask(gridDetail_Details, "DetailDetails", new Task(() => + { + return BaseModuleImpl.getDetail_Details(model.FormKey); + })); + //创建表格列 + cachesDic.AddTask(gridDetail_Details, "DynamicModel", dynamicModelTask); + gridDetail_Details.GetDataCaches(cachesDic); + Task detailDetailsGridRightMenusTask = cachesDic.AddTask(gridDetail_Details, "BaseGridRightMenus", new Task(() => + { + return BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDTX_" + model.FormKey); + })); + } + } + } + + #endregion BillModuleModelDic.Add(sourceModelRow, billModuleModel); #region 加载来源条件 @@ -825,6 +834,9 @@ namespace Lskj.PubBill this.gcMain.Dock = DockStyle.Fill; this.pl_main_center_detail.Controls.Add(this.gcMain); (this.gcMain as TreeGridControlEx).Expansion = this.BillModel.DetailTreeTableExpansion; + (this.gcMain as TreeGridControlEx).UseSegmentedNodeId = this.BillModel.NewNodeRules; + (this.gcMain as TreeGridControlEx).TreeNumberNodes = this.BillModel.TreeNumberNodes; + (this.gcMain as TreeGridControlEx).BillPaste = true; (this.gcMain as TreeGridControlEx).AddRightButton(); //节点编号 (this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName = "tap_id"; @@ -1881,25 +1893,6 @@ namespace Lskj.PubBill controls = BaseModuleImpl.GetCustomQueryFields(model.FormKey); } - if (false) - { - string menuCode = string.Empty; - DataRow modelRow = MainImpl.GetSystemdllTab(menuCode);//获取模块信息 - ModuleModel sysModel = new ModuleModel(modelRow); - //设置主表sql - //model.SourceSql = sysModel.MenuSql; - //获取主表列 - DataTable dtSourceColumns = BaseModuleImpl.GetBaseGridColumns(sysModel.ModeCode); - //获取明细消息 - - //明细sql - //model.DetailSql - - } - - - - XtraTabPage tabPage = new XtraTabPage(); tabPage.Text = model.UserName; @@ -1924,42 +1917,21 @@ namespace Lskj.PubBill GridControlEx gridControl = null; TreeViewEx treeView = null; - if (model.SourceType == 1) + DataTable SourceMainColumns = new DataTable(); + if (!string.IsNullOrWhiteSpace(model.SourceModeCode)) { - // 来源为树类型 - treeView = sourceControl != null ? (TreeViewEx)sourceControl : new TreeViewEx(); - treeView.BorderStyle = BorderStyle.None; - treeView.Dock = DockStyle.Fill; - treeView.TreeNodeKeyField = model.SourceKeyField; - treeView.TreeNodeTextField = model.SourceResult; - if (!dataCaches.GetValue(treeView, "BindTreeTable", out DataTable bindTreeTable)) - { - bindTreeTable = BaseImpl.GetDataTableResult(model.SourceSql); - } - treeView.TreeInhibitSort = model.TreeInhibitSort; - treeView.BindTreeView(bindTreeTable); - treeView.TreeNodeSelectAfter += new TreeViewEventHandler(OnTreeNodeSelectAfter); + string menuCode = model.SourceModeCode; + DataRow modelRow = MainImpl.GetSystemdllTab(menuCode);//获取模块信息 + ModuleModel sysModel = new ModuleModel(modelRow); + //设置主表sql + model.ChangeSourceSql(sysModel.MenuSql); + //主表主键 + string parmaryKey = BaseImpl.GetBasePrimaryKey(sysModel.ModeCode);//获取主键 + unionModel.ParmaryKey = parmaryKey; - tabPage.Controls.Add(treeView); - } - else if (model.SourceType == 5) - { - model.ChangeSourceType(2);//单据来源显示条数 - this.IsBillShowCount = true; - } - else if (model.SourceType == 3 || model.SourceType == 4) - { - //类型为3,是树表格类型的单据管理。 - //类型为4,是树表格类型的数据来源 - gridControl = sourceControl != null ? (TreeGridControlEx)sourceControl : new TreeGridControlEx(); - gridControl.Dock = DockStyle.Fill; - gridControl.BorderStyle = System.Windows.Forms.BorderStyle.None; - gridControl.Model = this.SysModel; - if (!dataCaches.GetValue(gridControl, "SourceColumns", out DataTable dtSourceColumns)) - { - dtSourceColumns = BillImpl.GetSourceColumns(model.Id); - } + //获取主表列 + SourceMainColumns = BaseModuleImpl.GetBaseGridColumns(sysModel.ModeCode); if (!dataCaches.GetValue(gridControl, "BaseGridRowColors", out DataTable dtBaseGridRowColors)) { dtBaseGridRowColors = BaseModuleImpl.GetBaseGridRowColors("BILLSOURCE_" + model.FormKey); @@ -1968,27 +1940,48 @@ namespace Lskj.PubBill { dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCE_" + model.FormKey); } + if (model.SourceType == 3 || model.SourceType == 4) + { + gridControl = sourceControl != null ? (TreeGridControlEx)sourceControl : new TreeGridControlEx(); + gridControl.Dock = DockStyle.Fill; + gridControl.BorderStyle = System.Windows.Forms.BorderStyle.None; + gridControl.Model = this.SysModel; + } + else + { + // 来源为表格类型 + gridControl = sourceControl != null ? (GridControlEx)sourceControl : new GridControlEx(); + gridControl.BorderStyle = BorderStyle.None; + gridControl.Model = this.SysModel; + gridControl.Dock = DockStyle.Fill; + gridControl.ExportPermission = this.BillModel.ExportPermission; + } - //节点编号 - if (!string.IsNullOrWhiteSpace(model.SourceKeyFieldName)) (gridControl as TreeGridControlEx).TreeListObj.KeyFieldName = model.SourceKeyFieldName; - //父节点编号 - if (!string.IsNullOrWhiteSpace(model.SourceParentFieldName)) (gridControl as TreeGridControlEx).TreeListObj.ParentFieldName = model.SourceParentFieldName; - - gridControl.SetReadOnlyColumns(dtSourceColumns, GridCustomColumnStruct.BillSourceGridView + model.FormKey); + gridControl.SetReadOnlyColumns(SourceMainColumns, GridCustomColumnStruct.BillSourceGridView + model.FormKey); gridControl.SetGridRowColors(dtBaseGridRowColors); - //gridControl.SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridControlRightCallback); - (gridControl as TreeGridControlEx).SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridControlRightCallback); - unionModel.TreeGridControlObj = gridControl as TreeGridControlEx; - unionModel.TreeGridControlObj.TreeListObj.FocusedNodeChanged += new DevExpress.XtraTreeList.FocusedNodeChangedEventHandler(OnTreeListObjFocusedNodeChanged); + gridControl.SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridControlRightCallback); + + //基础ModuleGridEx + // DynamicModuleModel dyncModel = new DynamicModuleModel(new[] + //{ sysModel.MenuName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName, + // this.SysModel.Privilege, sysModel.ModeCode, "0" }); + // ModuleGridEx MainGridEx = new ModuleGridEx(); + // MainGridEx.Dock = DockStyle.Fill; + // MainGridEx.VisibleSearchPanel = false;//禁止上方搜索 + // MainGridEx.InitializeControl(sysModel, dyncModel); + // gridControl = MainGridEx.GridControlObj; if (BillModel.IsBillSourceCheck == 1) { - GridDragGrid.TreeListAddCheckBox((gridControl as TreeGridControlEx).TreeListObj); + GridDragGrid.GridAddCheckBox(gridControl.GridView); } - - if (model.SourceType == 4) + if (sysModel.TreeAutoMultiHeader == 1) { + //模块为树表格 + model.ChangeSourceType(4); + unionModel.TreeGridControlObj = gridControl as TreeGridControlEx; + unionModel.TreeGridControlObj.TreeListObj.FocusedNodeChanged += new DevExpress.XtraTreeList.FocusedNodeChangedEventHandler(OnTreeListObjFocusedNodeChanged); //来源拖拽到主表 if (this.BillModel.DetailTreeTable) { @@ -2003,55 +1996,9 @@ namespace Lskj.PubBill treeGridDragGrid.OnDragComplete += TreeGridDragGrid_OnDragComplete; } } - - - tabPage.Controls.Add(gridControl); - } - else - { - // 来源为表格类型 - gridControl = sourceControl != null ? (GridControlEx)sourceControl : new GridControlEx(); - gridControl.BorderStyle = BorderStyle.None; - gridControl.Model = this.SysModel; - gridControl.Dock = DockStyle.Fill; - gridControl.ExportPermission = this.BillModel.ExportPermission; - - if (model.LoadFilter) - { - gridControl.GridView.OptionsView.ShowAutoFilterRow = true; - } - if (!dataCaches.GetValue(gridControl, "SourceColumns", out DataTable dtSourceColumns)) - { - dtSourceColumns = BillImpl.GetSourceColumns(model.Id); - } - if (!dataCaches.GetValue(gridControl, "BaseGridRowColors", out DataTable dtBaseGridRowColors)) - { - dtBaseGridRowColors = BaseModuleImpl.GetBaseGridRowColors("BILLSOURCE_" + model.FormKey); - } - if (!dataCaches.GetValue(gridControl, "BaseGridRightMenus", out DataTable dtBaseGridRightMenus)) - { - dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCE_" + model.FormKey); - } - gridControl.SetReadOnlyColumns(dtSourceColumns, GridCustomColumnStruct.BillSourceGridView + model.FormKey); - gridControl.SetGridRowColors(dtBaseGridRowColors); - gridControl.SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridControlRightCallback); - //gridControl.GridView.SelectionChanged += new SelectionChangedEventHandler(OnGridControlSelectionChanged); - //gridControl.GridView.FocusedRowObjectChanged += OnFocusedRowObjectChanged; - if (model.DetailsDoubleClick) - { - gridControl.GridView.DoubleClick += OnSourceGridViewDoubleClick; // 2023-3-11 增加双击配置 - } - else - { - gridControl.GridView.RowCellClick += OnGridViewRowCellClick; // 2019-11-12 cmd提出改为行点击事件,否则会出现保存提交后,单据管理无法查询出数据 - } - - if (BillModel.IsBillSourceCheck == 1) - { - GridDragGrid.GridAddCheckBox(gridControl.GridView); - } - if (model.SourceType == 0) + else { + gridControl.GridView.RowCellClick += OnGridViewRowCellClick; //来源拖拽到主表 if (this.BillModel.DetailTreeTable) { @@ -2067,8 +2014,177 @@ namespace Lskj.PubBill } } + + tabPage.Controls.Add(gridControl); + //获取明细信息,第一个为对应的来源明细 + DataTable table = BaseModuleImpl.GetBaseDetailPages(sysModel.ModeCode);// + if (table != null && table.Rows.Count > 0) + { + DataRow detailsRow = table.Rows[0]; + GridDetailModel gridDetailModel = new GridDetailModel(detailsRow, new DataTable(), GridCustomColumnStruct.BaseDetailGridView); + //第一个页签的模块号 赋值给 来源明细模块号。后续来源明细会根据模块号加载 + model.DetailModeCode = gridDetailModel.UnionModule; + DataRow Detail = MainImpl.GetSystemdllTab(gridDetailModel.UnionModule);//获取模块信息 + ModuleModel DetailModel = new ModuleModel(Detail); + //明细sql gridDetailModel.IsReadOnly || gridDetailModel.IsChart ? gridDetailModel.DetailSql : DetailModel.MenuSql + model.ChangeSourceDetailSql(DetailModel.MenuSql); + unionModel.GridDetailModel = gridDetailModel; + } + } + else + { + if (model.SourceType == 1) + { + // 来源为树类型 + treeView = sourceControl != null ? (TreeViewEx)sourceControl : new TreeViewEx(); + treeView.BorderStyle = BorderStyle.None; + treeView.Dock = DockStyle.Fill; + treeView.TreeNodeKeyField = model.SourceKeyField; + treeView.TreeNodeTextField = model.SourceResult; + if (!dataCaches.GetValue(treeView, "BindTreeTable", out DataTable bindTreeTable)) + { + bindTreeTable = BaseImpl.GetDataTableResult(model.SourceSql); + } + treeView.TreeInhibitSort = model.TreeInhibitSort; + treeView.BindTreeView(bindTreeTable); + treeView.TreeNodeSelectAfter += new TreeViewEventHandler(OnTreeNodeSelectAfter); + + tabPage.Controls.Add(treeView); + } + else if (model.SourceType == 5) + { + model.ChangeSourceType(2);//单据来源显示条数 + this.IsBillShowCount = true; + } + else if (model.SourceType == 3 || model.SourceType == 4) + { + //类型为3,是树表格类型的单据管理。 + //类型为4,是树表格类型的数据来源 + gridControl = sourceControl != null ? (TreeGridControlEx)sourceControl : new TreeGridControlEx(); + gridControl.Dock = DockStyle.Fill; + gridControl.BorderStyle = System.Windows.Forms.BorderStyle.None; + gridControl.Model = this.SysModel; + + if (!dataCaches.GetValue(gridControl, "SourceColumns", out DataTable dtSourceColumns)) + { + dtSourceColumns = BillImpl.GetSourceColumns(model.Id); + } + if (!dataCaches.GetValue(gridControl, "BaseGridRowColors", out DataTable dtBaseGridRowColors)) + { + dtBaseGridRowColors = BaseModuleImpl.GetBaseGridRowColors("BILLSOURCE_" + model.FormKey); + } + if (!dataCaches.GetValue(gridControl, "BaseGridRightMenus", out DataTable dtBaseGridRightMenus)) + { + dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCE_" + model.FormKey); + } + + //节点编号 + if (!string.IsNullOrWhiteSpace(model.SourceKeyFieldName)) (gridControl as TreeGridControlEx).TreeListObj.KeyFieldName = model.SourceKeyFieldName; + //父节点编号 + if (!string.IsNullOrWhiteSpace(model.SourceParentFieldName)) (gridControl as TreeGridControlEx).TreeListObj.ParentFieldName = model.SourceParentFieldName; + + gridControl.SetReadOnlyColumns(dtSourceColumns, GridCustomColumnStruct.BillSourceGridView + model.FormKey); + gridControl.SetGridRowColors(dtBaseGridRowColors); + //gridControl.SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridControlRightCallback); + (gridControl as TreeGridControlEx).SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridControlRightCallback); + unionModel.TreeGridControlObj = gridControl as TreeGridControlEx; + unionModel.TreeGridControlObj.TreeListObj.FocusedNodeChanged += new DevExpress.XtraTreeList.FocusedNodeChangedEventHandler(OnTreeListObjFocusedNodeChanged); + + + if (BillModel.IsBillSourceCheck == 1) + { + GridDragGrid.TreeListAddCheckBox((gridControl as TreeGridControlEx).TreeListObj); + } + + if (model.SourceType == 4) + { + //来源拖拽到主表 + if (this.BillModel.DetailTreeTable) + { + TreeGridDragTree treeGridDragTree = new TreeGridDragTree((gridControl as TreeGridControlEx).TreeListObj, (this.gcMain as TreeGridControlEx).TreeListObj); + treeGridDragTree.CanDragParentNode = true; + treeGridDragTree.NeglectingNodes = true; + treeGridDragTree.OnDragComplete += TreeGridDragTree_OnDragComplete; + } + else + { + TreeGridDragGrid treeGridDragGrid = new TreeGridDragGrid((gridControl as TreeGridControlEx).TreeListObj, this.gcMain.GridView); + treeGridDragGrid.OnDragComplete += TreeGridDragGrid_OnDragComplete; + } + } + + + tabPage.Controls.Add(gridControl); + } + else + { + // 来源为表格类型 + gridControl = sourceControl != null ? (GridControlEx)sourceControl : new GridControlEx(); + gridControl.BorderStyle = BorderStyle.None; + gridControl.Model = this.SysModel; + gridControl.Dock = DockStyle.Fill; + gridControl.ExportPermission = this.BillModel.ExportPermission; + + if (model.LoadFilter) + { + gridControl.GridView.OptionsView.ShowAutoFilterRow = true; + } + if (!dataCaches.GetValue(gridControl, "SourceColumns", out DataTable dtSourceColumns)) + { + dtSourceColumns = BillImpl.GetSourceColumns(model.Id); + } + if (!dataCaches.GetValue(gridControl, "BaseGridRowColors", out DataTable dtBaseGridRowColors)) + { + dtBaseGridRowColors = BaseModuleImpl.GetBaseGridRowColors("BILLSOURCE_" + model.FormKey); + } + if (!dataCaches.GetValue(gridControl, "BaseGridRightMenus", out DataTable dtBaseGridRightMenus)) + { + dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCE_" + model.FormKey); + } + gridControl.SetReadOnlyColumns(dtSourceColumns, GridCustomColumnStruct.BillSourceGridView + model.FormKey); + gridControl.SetGridRowColors(dtBaseGridRowColors); + gridControl.SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridControlRightCallback); + //gridControl.GridView.SelectionChanged += new SelectionChangedEventHandler(OnGridControlSelectionChanged); + //gridControl.GridView.FocusedRowObjectChanged += OnFocusedRowObjectChanged; + if (model.DetailsDoubleClick) + { + gridControl.GridView.DoubleClick += OnSourceGridViewDoubleClick; // 2023-3-11 增加双击配置 + } + else + { + gridControl.GridView.RowCellClick += OnGridViewRowCellClick; // 2019-11-12 cmd提出改为行点击事件,否则会出现保存提交后,单据管理无法查询出数据 + } + + if (BillModel.IsBillSourceCheck == 1) + { + GridDragGrid.GridAddCheckBox(gridControl.GridView); + } + if (model.SourceType == 0) + { + //来源拖拽到主表 + if (this.BillModel.DetailTreeTable) + { + GridDragTreeGrid dragDetailGrid = new GridDragTreeGrid(gridControl.GridView, (this.gcMain as TreeGridControlEx).TreeListObj); + dragDetailGrid.CanDragParentNode = true; + dragDetailGrid.NeglectingNodes = true; + dragDetailGrid.OnDragComplete += DragDetailGrid_OnDragMainGridCompleted; + } + else + { + GridDragGrid dragMainGrid = new GridDragGrid(gridControl.GridView, this.gcMain.GridView); + dragMainGrid.OnDragComplete += new GridFragGridCompleteEventHandler(OnDragMainGridCompleted); + } + } + + tabPage.Controls.Add(gridControl); + } + } + + + + #endregion #region 加载来源明细 @@ -2089,22 +2205,19 @@ namespace Lskj.PubBill - if (!string.IsNullOrWhiteSpace(model.DetailMenuCode)) + if (!string.IsNullOrWhiteSpace(model.DetailModeCode)) { //来源明细配置了模块号,根据模块号创建对应的ModuleGridEx //ModuleGridEx主要是用保存的功能,数据源sql还是根据配置的为准 - DataRow modelRow = MainImpl.GetSystemdllTab(model.DetailMenuCode);//获取模块信息 + DataRow modelRow = MainImpl.GetSystemdllTab(model.DetailModeCode);//获取模块信息 if (modelRow == null) { - MessageUtil.Show($"没有找到编号为 {model.DetailMenuCode} 的模块信息"); + MessageUtil.Show($"没有找到编号为 {model.DetailModeCode} 的模块信息"); gridDetail.Parent = gridDetail; continue; } ModuleModel sysModel = new ModuleModel(modelRow); - //设置主表sql - //model.SourceSql = sysModel.MenuSql; - DynamicModuleModel dyncModel = new DynamicModuleModel(new[] { sysModel.MenuName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName, this.SysModel.Privilege, sysModel.ModeCode, "0" }); @@ -3942,6 +4055,14 @@ namespace Lskj.PubBill } else { + if (unionModel.GridDetailModel != null && !string.IsNullOrWhiteSpace(unionModel.ParmaryKey)&& rowItem!=null) + { + //来源主表配置的模块,来源明细sql要拼接条件 + string fieldName = !string.IsNullOrEmpty(unionModel.GridDetailModel.UnionParentField) && rowItem.Table.Columns.Contains(unionModel.GridDetailModel.UnionParentField) ? unionModel.GridDetailModel.UnionParentField : unionModel.ParmaryKey; + DetailSql = ReplaceHelper.ReplaceWhereCond(DetailSql) + string.Format(" and {0}='{1}'", unionModel.GridDetailModel.UnionValue, rowItem[fieldName]+""); + + } + //有复选框的页签在刷新前清空选中行,否则合计在刷新数据源后不会自带改变 @@ -6927,7 +7048,7 @@ namespace Lskj.PubBill { string addSql = ReplaceHelper.ReplaceRowParam(rowItem, ReplaceHelper.ReplaceUserInfo(unionModel.AddDataSql)); DataTable dataTable = MainImpl.GetDataTableResult(addSql); - DragAddTable(dataTable, (int.Parse((this.gcMain as TreeGridControlEx).GetNewNodesId()) - 1) + "");////上方的新增行的id默认是最大的 + DragAddTable(dataTable, (this.gcMain as TreeGridControlEx).GetLastNodesId(Pid));////上方的新增行的id默认是最大的 } } } @@ -8795,7 +8916,7 @@ namespace Lskj.PubBill //添加拖拽行对应的数据源 string addSql = ReplaceHelper.ReplaceRowParam(e.GridViewSelectRows, ReplaceHelper.ReplaceUserInfo(unionModel.AddDataSql)); DataTable dataTable = MainImpl.GetDataTableResult(addSql); - DragAddTable(dataTable, (int.Parse((this.gcMain as TreeGridControlEx).GetNewNodesId()) - 1) + "");//上方的新增行的id默认是最大的 + DragAddTable(dataTable, (this.gcMain as TreeGridControlEx).GetLastNodesId(Pid));//上方的新增行的id默认是最大的 } } this.gcMain.GridView.SelectRowHandler(oldRowHandle); @@ -8833,36 +8954,46 @@ namespace Lskj.PubBill //数据源的id和pid全部加上目标节点(加上后当前数据源就是目标节点的子节点数据源) if (dataTable.Columns.Contains(ParentFieldName) && dataTable.Columns.Contains(KeyFieldName)) { - //当前树表格中最大的id号 - int NodeId = int.Parse((this.gcMain as TreeGridControlEx).GetNewNodesId()) - 1; - //当前树表格中如果id为null,要赋值的id值(节点id不能为null) - int NewNodeId = int.Parse((this.gcMain as TreeGridControlEx).GetNewNodesId()); + if (this.BillModel.NewNodeRules) + { + dataTable = (this.gcMain as TreeGridControlEx).PrepareNodeIdsForInsert(dataTable, Pid); + } + else + { + //当前树表格中最大的id号 + int NodeId = int.Parse((this.gcMain as TreeGridControlEx).GetNewNodesId()) - 1; + //当前树表格中如果id为null,要赋值的id值(节点id不能为null) + int NewNodeId = int.Parse((this.gcMain as TreeGridControlEx).GetNewNodesId()); + + //根据当前的节点号,改变新增数据源中的节点号 + foreach (DataRow rowItem in dataTable.Rows) + { + // 新增表格中的数据id全部加上最大id号,如果是空就默认去赋最大id+1的值 + if (!string.IsNullOrWhiteSpace(rowItem[KeyFieldName] + "")) + { + rowItem[KeyFieldName] = int.Parse(rowItem[KeyFieldName] + "") + NodeId; + } + else + { + rowItem[KeyFieldName] = NewNodeId; + NewNodeId++; + } + + //pid为0或者null的改成目标节点的节点号,有值的默认加上最大id值 + if (string.IsNullOrWhiteSpace(rowItem[ParentFieldName] + "") || int.Parse(rowItem[ParentFieldName] + "") == 0) + { + rowItem[ParentFieldName] = Pid; + + } + else if (int.Parse(rowItem[ParentFieldName] + "") > 0) + { + rowItem[ParentFieldName] = int.Parse(rowItem[ParentFieldName] + "") + NodeId; + } + } + } - //根据当前的节点号,改变新增数据源中的节点号 foreach (DataRow rowItem in dataTable.Rows) { - // 新增表格中的数据id全部加上最大id号,如果是空就默认去赋最大id+1的值 - if (!string.IsNullOrWhiteSpace(rowItem[KeyFieldName] + "")) - { - rowItem[KeyFieldName] = int.Parse(rowItem[KeyFieldName] + "") + NodeId; - } - else - { - rowItem[KeyFieldName] = NewNodeId; - NewNodeId++; - } - - //pid为0或者null的改成目标节点的节点号,有值的默认加上最大id值 - if (string.IsNullOrWhiteSpace(rowItem[ParentFieldName] + "") || int.Parse(rowItem[ParentFieldName] + "") == 0) - { - rowItem[ParentFieldName] = Pid; - - } - else if (int.Parse(rowItem[ParentFieldName] + "") > 0) - { - rowItem[ParentFieldName] = int.Parse(rowItem[ParentFieldName] + "") + NodeId; - } - DataRow newRow = TreeTable.NewRow(); newRow.BeginEdit(); // 赋值明细字段 @@ -9171,9 +9302,9 @@ namespace Lskj.PubBill } } (this.gcMain as TreeGridControlEx).TreeListObj.EndUpdate(); - if (string.IsNullOrWhiteSpace(newRow[(this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName] + "")) + if (this.BillModel.NewNodeRules || string.IsNullOrWhiteSpace(newRow[(this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName] + "")) { - newRow[(this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName] = (this.gcMain as TreeGridControlEx).GetNewNodesId();//节点id为空,就默认给当前数据源最大id+1 + newRow[(this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName] = (this.gcMain as TreeGridControlEx).GetNewNodesId(Pid);//节点id为空,就默认生成节点id } if (!string.IsNullOrWhiteSpace(Pid)) @@ -9338,7 +9469,13 @@ namespace Lskj.PubBill LogHelper.Instance.WriteError(ex); } } - // newRow[(this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName] = (this.gcMain as TreeGridControlEx).GetNewNodesId();//节点id + if (this.BillModel.NewNodeRules) + { + string keyFieldName = (this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName; + string parentFieldName = (this.gcMain as TreeGridControlEx).TreeListObj.ParentFieldName; + newRow[keyFieldName] = (this.gcMain as TreeGridControlEx).GetNewNodesId("0", gridTable); + newRow[parentFieldName] = "0"; + } newRow.EndEdit(); gridTable.Rows.Add(newRow); @@ -10336,4 +10473,4 @@ namespace Lskj.PubBill } -} \ No newline at end of file +} diff --git a/插件库/Lskj.PubBill/Model/BillSourceModel.cs b/插件库/Lskj.PubBill/Model/BillSourceModel.cs index 88da356..26fe668 100644 --- a/插件库/Lskj.PubBill/Model/BillSourceModel.cs +++ b/插件库/Lskj.PubBill/Model/BillSourceModel.cs @@ -61,9 +61,11 @@ namespace Lskj.PubBill.Model public string Orderid;// 来源页签序号 - public string DetailMenuCode;// 来源模块号 + public string SourceModeCode;// 来源模块号 + public string DetailModeCode;// 来源明细模块号 + public BillSourceModel(DataRow item) { @@ -110,7 +112,8 @@ namespace Lskj.PubBill.Model this.DragAndSave = item.Table.Columns.Contains("DragAndSave") && "1".Equals(item["DragAndSave"] + "") ? true : false; this.TreeInhibitSort = item.Table.Columns.Contains("TreeInhibitSort") && "1".Equals(item["TreeInhibitSort"] + "") ? true : false; this.Orderid = item.Table.Columns.Contains("Orderid") ? item["Orderid"] + "" : ""; - this.DetailMenuCode = item.Table.Columns.Contains("DetailMenuCode") ? item["DetailMenuCode"] + "" : ""; + this.SourceModeCode = item.Table.Columns.Contains("SourceModeCode") ? item["SourceModeCode"] + "" : ""; + this.DetailModeCode = item.Table.Columns.Contains("DetailModeCode") ? item["DetailModeCode"] + "" : ""; } /// /// 改变来源类型 @@ -129,5 +132,24 @@ namespace Lskj.PubBill.Model { this.sourceDetailType = sourceDetailType; } + + /// + /// 改变来源主表sql + /// + /// + public void ChangeSourceSql(string Sql) + { + this.SourceSql = Sql; + } + + /// + /// 改变来源明细sql + /// + /// + public void ChangeSourceDetailSql(string Sql) + { + this.DetailSql = Sql; + } + } } diff --git a/插件库/Lskj.PubBill/Model/BillSourceUnionModel.cs b/插件库/Lskj.PubBill/Model/BillSourceUnionModel.cs index bc20bea..4ecdeae 100644 --- a/插件库/Lskj.PubBill/Model/BillSourceUnionModel.cs +++ b/插件库/Lskj.PubBill/Model/BillSourceUnionModel.cs @@ -54,10 +54,7 @@ namespace Lskj.PubBill.Model /// 单据来源明细表格的明细 /// public GridControlEx GridDetailDetailControlObj; - /// - /// 单据来源明细模块 - /// - public ModuleGridEx GridDetailModuleGridEx; + public bool IsChange = false; @@ -72,5 +69,18 @@ namespace Lskj.PubBill.Model public string AddDataCondition; + /// + /// 单据来源明细模块 + /// + public ModuleGridEx GridDetailModuleGridEx; + /// + /// 主表配置模块号的情况下,对应的明细选项 + /// + public GridDetailModel GridDetailModel; + /// + /// 来源主表主键 + /// + public string ParmaryKey; + } } diff --git a/插件库/Lskj.PubBillManagement/BillModule.Designer.cs b/插件库/Lskj.PubBillManagement/BillModule.Designer.cs new file mode 100644 index 0000000..e93b354 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/BillModule.Designer.cs @@ -0,0 +1,215 @@ +namespace Lskj.PubBillManagement +{ + partial class BillModule + { + /// + /// 必需的设计器变量。 + /// + private System.ComponentModel.IContainer components = null; + + /// + /// 清理所有正在使用的资源。 + /// + /// 如果应释放托管资源,为 true;否则为 false。 + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region 组件设计器生成的代码 + + /// + /// 设计器支持所需的方法 - 不要 + /// 使用代码编辑器修改此方法的内容。 + /// + private void InitializeComponent() + { + this.barManager1 = new DevExpress.XtraBars.BarManager(); + this.barDockControl1 = new DevExpress.XtraBars.BarDockControl(); + this.barDockControl2 = new DevExpress.XtraBars.BarDockControl(); + this.barDockControl3 = new DevExpress.XtraBars.BarDockControl(); + this.barDockControl5 = new DevExpress.XtraBars.BarDockControl(); + this.pmFP = new DevExpress.XtraBars.PopupMenu(); + this.pmBillExp = new DevExpress.XtraBars.PopupMenu(); + this.pmBill = new DevExpress.XtraBars.PopupMenu(); + this.pMprint = new DevExpress.XtraBars.PopupMenu(); + this.pMenu = new DevExpress.XtraBars.PopupMenu(); + this.tb_buttom = new Lskj.Control.TabControlEx(); + this.pl_Main = new DevExpress.XtraEditors.PanelControl(); + this.xtc_main_container = new DevExpress.XtraTab.XtraTabControl(); + this.ssc_main = new DevExpress.XtraEditors.SplitContainerControl(); + ((System.ComponentModel.ISupportInitialize)(this.barManager1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pmFP)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pmBillExp)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pmBill)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pMprint)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pMenu)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pl_Main)).BeginInit(); + this.pl_Main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.xtc_main_container)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.ssc_main)).BeginInit(); + this.ssc_main.SuspendLayout(); + this.SuspendLayout(); + // + // barManager1 + // + this.barManager1.DockControls.Add(this.barDockControl1); + this.barManager1.DockControls.Add(this.barDockControl2); + this.barManager1.DockControls.Add(this.barDockControl3); + this.barManager1.DockControls.Add(this.barDockControl5); + this.barManager1.Form = this; + this.barManager1.MaxItemId = 0; + // + // barDockControl1 + // + this.barDockControl1.CausesValidation = false; + this.barDockControl1.Dock = System.Windows.Forms.DockStyle.Top; + this.barDockControl1.Location = new System.Drawing.Point(0, 0); + this.barDockControl1.Size = new System.Drawing.Size(1511, 0); + // + // barDockControl2 + // + this.barDockControl2.CausesValidation = false; + this.barDockControl2.Dock = System.Windows.Forms.DockStyle.Bottom; + this.barDockControl2.Location = new System.Drawing.Point(0, 730); + this.barDockControl2.Size = new System.Drawing.Size(1511, 0); + // + // barDockControl3 + // + this.barDockControl3.CausesValidation = false; + this.barDockControl3.Dock = System.Windows.Forms.DockStyle.Left; + this.barDockControl3.Location = new System.Drawing.Point(0, 0); + this.barDockControl3.Size = new System.Drawing.Size(0, 730); + // + // barDockControl5 + // + this.barDockControl5.CausesValidation = false; + this.barDockControl5.Dock = System.Windows.Forms.DockStyle.Right; + this.barDockControl5.Location = new System.Drawing.Point(1511, 0); + this.barDockControl5.Size = new System.Drawing.Size(0, 730); + // + // pmFP + // + this.pmFP.Manager = this.barManager1; + this.pmFP.Name = "pmFP"; + // + // pmBillExp + // + this.pmBillExp.Manager = this.barManager1; + this.pmBillExp.Name = "pmBillExp"; + // + // pmBill + // + this.pmBill.Manager = this.barManager1; + this.pmBill.Name = "pmBill"; + // + // pMprint + // + this.pMprint.Manager = this.barManager1; + this.pMprint.Name = "pMprint"; + // + // pMenu + // + this.pMenu.Manager = this.barManager1; + this.pMenu.Name = "pMenu"; + // + // tb_buttom + // + this.tb_buttom.Dock = System.Windows.Forms.DockStyle.Fill; + this.tb_buttom.Location = new System.Drawing.Point(0, 0); + this.tb_buttom.Name = "tb_buttom"; + this.tb_buttom.Size = new System.Drawing.Size(1511, 280); + this.tb_buttom.TabIndex = 25; + this.tb_buttom.Load += new System.EventHandler(this.tb_buttom_Load); + // + // pl_Main + // + this.pl_Main.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_Main.Appearance.Options.UseBackColor = true; + this.pl_Main.Controls.Add(this.xtc_main_container); + this.pl_Main.Dock = System.Windows.Forms.DockStyle.Fill; + this.pl_Main.Location = new System.Drawing.Point(0, 0); + this.pl_Main.Name = "pl_Main"; + this.pl_Main.Size = new System.Drawing.Size(1511, 445); + this.pl_Main.TabIndex = 5; + // + // xtc_main_container + // + this.xtc_main_container.Appearance.BackColor = System.Drawing.Color.Transparent; + this.xtc_main_container.Appearance.Options.UseBackColor = true; + this.xtc_main_container.Dock = System.Windows.Forms.DockStyle.Fill; + this.xtc_main_container.HeaderLocation = DevExpress.XtraTab.TabHeaderLocation.Bottom; + this.xtc_main_container.Location = new System.Drawing.Point(2, 2); + this.xtc_main_container.Name = "xtc_main_container"; + this.xtc_main_container.Size = new System.Drawing.Size(1507, 441); + this.xtc_main_container.TabIndex = 0; + this.xtc_main_container.SelectedPageChanged += new DevExpress.XtraTab.TabPageChangedEventHandler(this.OnTabSelectedPageChanged); + // + // ssc_main + // + this.ssc_main.Appearance.BackColor = System.Drawing.Color.Transparent; + this.ssc_main.Appearance.Options.UseBackColor = true; + this.ssc_main.CollapsePanel = DevExpress.XtraEditors.SplitCollapsePanel.Panel2; + this.ssc_main.Dock = System.Windows.Forms.DockStyle.Fill; + this.ssc_main.Horizontal = false; + this.ssc_main.Location = new System.Drawing.Point(0, 0); + this.ssc_main.Name = "ssc_main"; + this.ssc_main.Panel1.Controls.Add(this.pl_Main); + this.ssc_main.Panel1.Text = "Panel1"; + this.ssc_main.Panel2.Controls.Add(this.tb_buttom); + this.ssc_main.Panel2.Text = "Panel2"; + this.ssc_main.Size = new System.Drawing.Size(1511, 730); + this.ssc_main.SplitterPosition = 445; + this.ssc_main.TabIndex = 0; + this.ssc_main.Text = "splitContainerControl1"; + this.ssc_main.SplitterMoved += new System.EventHandler(this.OnMainSplitterMoved); + // + // BillModule + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.Controls.Add(this.ssc_main); + this.Controls.Add(this.barDockControl3); + this.Controls.Add(this.barDockControl5); + this.Controls.Add(this.barDockControl2); + this.Controls.Add(this.barDockControl1); + this.Name = "BillModule"; + this.Size = new System.Drawing.Size(1511, 730); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.OnFrmMainKeyDown); + ((System.ComponentModel.ISupportInitialize)(this.barManager1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pmFP)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pmBillExp)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pmBill)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pMprint)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pMenu)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pl_Main)).EndInit(); + this.pl_Main.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.xtc_main_container)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.ssc_main)).EndInit(); + this.ssc_main.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + + #endregion + private DevExpress.XtraBars.PopupMenu pMenu; + private DevExpress.XtraBars.BarManager barManager1; + private DevExpress.XtraBars.BarDockControl barDockControl1; + private DevExpress.XtraBars.BarDockControl barDockControl2; + private DevExpress.XtraBars.BarDockControl barDockControl3; + private DevExpress.XtraBars.BarDockControl barDockControl5; + private DevExpress.XtraBars.PopupMenu pmBillExp; + private DevExpress.XtraBars.PopupMenu pmBill; + private DevExpress.XtraBars.PopupMenu pMprint; + private DevExpress.XtraBars.PopupMenu pmFP; + private DevExpress.XtraEditors.SplitContainerControl ssc_main; + private DevExpress.XtraEditors.PanelControl pl_Main; + private DevExpress.XtraTab.XtraTabControl xtc_main_container; + private Control.TabControlEx tb_buttom; + } +} diff --git a/插件库/Lskj.PubBillManagement/BillModule.cs b/插件库/Lskj.PubBillManagement/BillModule.cs new file mode 100644 index 0000000..bb2b6de --- /dev/null +++ b/插件库/Lskj.PubBillManagement/BillModule.cs @@ -0,0 +1,2474 @@ +using DevExpress.Data; +using DevExpress.Utils; +using DevExpress.XtraBars; +using DevExpress.XtraEditors; +using DevExpress.XtraGrid.Columns; +using DevExpress.XtraGrid.Views.Base; +using DevExpress.XtraGrid.Views.Grid; +using DevExpress.XtraTab; +using DevExpress.XtraTreeList.Columns; +using DevExpress.XtraTreeList.Nodes; +using Lskj.Business; +using Lskj.Business.Impl; +using Lskj.Control; +using Lskj.Control.BrowserSetting; +using Lskj.Control.Model; +using Lskj.Core; +using Lskj.Data; +using Lskj.Model; +using Lskj.PubBillManagement.Model; +using Lskj.Util; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Lskj.PubBillManagement +{ + public partial class BillModule : UserControl + { + /// + /// 是否为初始化创建 + /// + private bool _isInitFinish; + /// + /// 是否加载右侧控件数据 + /// + private bool _isLoadRightControlValue = true; + /// + /// 是否手动选择了模版 + /// + private bool _isSelectedTemplete; + /// + /// 是否直接打印 + /// + private bool _isExcPrint; + /// + /// 是否选择关联下发 + /// + private bool _isCheck; + /// + /// 主打印Sql + /// + private string _mainPrintSql; + private string guidField = "xxxxx_guid"; + /// + /// 主键字段 + /// + private string mRecordPrimaryField; + /// + /// 单据水印 + /// + private WaterMark _waterMark; + /// + /// 导入单据明细数据、导入单据明细并更新 + /// + private BarButtonItem _itemImport, _itemImportUpdate; + /// + /// 打印主sql中关联打印次数返回条件 + /// + private string _printModeCond; + /// + /// 打印完成后添加数据用到的参数: 表名,列前缀,主键字段,主键值,模块编号,主打印Sql + /// + private List _printSaveParams; + /// + /// 单据明细列 + /// + private DataTable _detailColumns; + private bool IsCopying = false; + + + protected DataRow BillRowItem; + /// + /// 主表控件 + /// + public MyControl ControlObj; + /// + /// 入口参数 + /// + protected DynamicBillModel SysModel; + /// + /// 是否为Brp模版 + /// + /// true if this instance is BRP templete; otherwise, false. + protected bool IsBrpTemplete { get { return SysModel is DynamicBillBrpModel; } } + /// + /// + /// + public BillModel BillModel; + /// + /// 数量名称 + /// + public string NumberMc; + /// + /// 红字单据的分配管理模块 + /// + public string rdRedUnionCode; + /// + /// 蓝字单据的分配管理模块 + /// + public string rdBlueUnionCode; + /// + /// 蓝字单据的分配管理模块 + /// + Dictionary pageNumKey = new Dictionary(); + /// + /// 是否拖拽换行展示 + /// + public bool isDragWrap = true; + /// + /// 触发主表改变刷新来源限制 + /// + private bool IsBillMaster = true; + /// + /// 是否执行了加载储存过程 + /// + //public bool ProcessExists = false; + /// + /// 保存或修改时报错信息 + /// + public string SaveErrorMessage = string.Empty; + /// + /// 单据明细删除的行 + /// + // private Dictionary ToWithdrawRows = new Dictionary(); + private List> ToWithdrawRows = new List>(); + /// + ///改变颜色行 + /// + private List ChangeColorRow = new List(); + /// + /// + /// + public string AssociatedField = string.Empty; + /// + /// 注册设置公共事件私有类 + /// + private static PubEvenImpl _eventHandler; + /// + /// 注册设置公共事件类 + /// + private static PubEvenImpl eventHandler; + /// + /// 当前人员是否有导出权限 + /// + public bool ExportPermission; + /// + /// 是否显示单据管理条数 + /// + public bool IsBillShowCount = false; + /// + /// 来源明细的页面名字后缀(设置成全局变量,更好的处理语言翻译的情况) + /// + public string DetailedSuffix = Business.Impl.LanguageTranslation.Translatable ? "-" + Business.Impl.LanguageTranslation.GetTranslatedText("明细") : "-明细"; + /// + /// 数量后缀 + /// + public string QuantitySuffix = Business.Impl.LanguageTranslation.Translatable ? Business.Impl.LanguageTranslation.GetTranslatedText("条") + ")" : "条)"; + /// + /// 新增 + /// + public string addText = Business.Impl.LanguageTranslation.Translatable ? "(" + Business.Impl.LanguageTranslation.GetTranslatedText("新增") + ")" : "(新增)"; + /// + /// 修改 + /// + public string updateText = Business.Impl.LanguageTranslation.Translatable ? "(" + Business.Impl.LanguageTranslation.GetTranslatedText("修改") + ")" : "(修改)"; + + + /// + /// 单据来源控件集合 + /// + public Dictionary BillModuleModelDic = new Dictionary(); + /// + /// 主表动态生成的日期列 + /// + public List DateColumnList = new List(); + /// + /// 主表动态生成的合计列 + /// + public GridColumn SumGridColumn = new GridColumn(); + /// + /// 附加右键菜单集合 + /// + public List itemCommonList = new List(); + /// + /// 是否已经添加了多行汇总 + /// + public bool MultiLineSummary; + /// + /// 扫码框 + /// + public TextEdit ScanCodeTextEdit = null; + /// + /// 初始化时选中的页签 + /// + public XtraTabPage InitialSelectionTab = null; + /// + /// 当前操作的ImageEdit + /// + private LabelImageEdit _imageEdit; + /// + /// 当前来源明细中变色行 + /// + private HashSet ColorHandles = new HashSet(); + /// + /// 保存验证条件表 + /// + public DataTable SaveCondTab = new DataTable(); + + + + public BillModule() + { + InitializeComponent(); + } + + #region 初始化操作 + /// + /// 说明:窗口加载 + /// 创建人:龚宇超 + /// 创建日期:2017-11-23 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The instance containing the event data. + public void OnLoad(DynamicBillModel Model) + { + try + { + this.SysModel = Model;// 单据动态链接库参数,入口参数 + this._isInitFinish = false;// 是否为初始化创建 + this.ssc_main.Visible = false; //获取或设置一个值,该值指示是否显示该控件及其所有子控件。 + //this.ProcessExists = (Lskj.Data.Caches.CacheSYSConfig.Instance().JudgeProcessExists() && SystemInfo.Instance.isExecload); + + + + Dictionary dataCaches = Model != null ? Model.DataCaches : null; + dataCaches.GetValue(this, "DataCaches", out bool _);//等待缓存数据加载完成 + this.InitializeSetting();//初始化系统配置 + this.InitializeControl();//初始化控件 + this.InitlizeSpiltLocation(); + + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError("单据初始化窗体失败!", ex); + MessageUtil.Show(ex.StackTrace); + } + finally + { + this._isInitFinish = true; + this.ssc_main.Visible = true; + } + } + + + /// + /// 获取数据源缓存 + /// + /// + public void GetDataCaches(Dictionary cachesDic) + { + //获取通用数据 + Task sysModelTask = cachesDic.GetTask(this, "SysModel"); + Task systemDllRowTask = cachesDic.GetTask(this, "SystemDllRow"); + Task dynamicModelTask = cachesDic.GetTask(this, "DynamicModel"); + Task getDataCachesTask = cachesDic.AddTask(this, "DataCaches", new Task(() => + { + DynamicBillModel dynamicModel = (DynamicBillModel)dynamicModelTask.Result; + #region InitializeSetting初始化系统配置 + Task billInfoRowTask = cachesDic.AddTask(this, "BillInfo", new Task(() => + { + return BillImpl.GetBillInfo(dynamicModel.ModuleCode);//获取单个模块信息 + })); + Task billModelTask = cachesDic.AddTask(this, "BillModel", new Task(() => + { + BillModel model = null; + if (billInfoRowTask.Result != null) + { + model = new BillModel(billInfoRowTask.Result); + } + return model; + })); + BillModel billModel = billModelTask.Result; + if (billModel != null) + { + Task masterPreFixTask = cachesDic.AddTask(this, "MasterPreFix", new Task(() => + { + return BaseImpl.GetColumnPrefix(billModel.MasterTable);// 主表列前缀 + })); + Task detailPreFixTask = cachesDic.AddTask(this, "DetailPreFix", new Task(() => + { + return BaseImpl.GetColumnPrefix(billModel.DetailTable);// 明细表列前缀 + })); + } + Task menuConfigTabTask = cachesDic.AddTask(this, "MenuConfigTab", new Task(() => + { + DataRow dataRow = BaseImpl.GetMenuConfigTab(dynamicModel.ModuleId); + if (dataRow != null) + { + billModel.BillSourceIds = dataRow.Table.Columns.Contains("BillSourceIds") ? (dataRow["BillSourceIds"] + "").Trim(',') : string.Empty; + billModel.BillFlag = dataRow.Table.Columns.Contains("BillFlag") && !string.IsNullOrEmpty(dataRow["BillFlag"] + "") ? Convert.ToInt32(dataRow["BillFlag"] + "") : -1; + //billModel + } + return dataRow;//获取菜单其他配置 + })); + #region GetPrintOtherParam获取打印其他参数 + if (string.IsNullOrEmpty(billModel.PrintSql) && billModel.PrintSql.Contains("<<")) + { + string[] strs = billModel.PrintSql.Split(new[] { ">>" }, 2, StringSplitOptions.None); + _mainPrintSql = strs[1]; + _printModeCond = strs[0].Replace("<<", ""); + } + if (!string.IsNullOrEmpty(_printModeCond) && _printModeCond.IndexOf(';') > 0) + { + string[] str = _printModeCond.Split(';'); + Task printOtherSystemRowTask = cachesDic.AddTask(this, "PrintOtherSystemRow", new Task(() => + { + return AttachImpl.GetSystemModule(str[0]); + })); + Task printOtherColumnPrefixTask = cachesDic.AddTask(this, "PrintOtherColumnPrefix", new Task(() => + { + string tableName = printOtherSystemRowTask.Result["TableName"] + ""; + return BaseImpl.GetColumnPrefix(tableName); + })); + Task printOtherPrimaryKeyTask = cachesDic.AddTask(this, "PrintOtherPrimaryKey", new Task(() => + { + string modetype = printOtherSystemRowTask.Result["modType"] + ""; + return modetype == "1" ? BaseImpl.GetBasePrimaryKey(str[0]) : printOtherColumnPrefixTask.Result + "billdocument_id"; + })); + Task printOtherIsExcPrintTask = cachesDic.AddTask(this, "PrintOtherIsExcPrint", new Task(() => + { + string modetype = printOtherSystemRowTask.Result["modType"] + ""; + switch (modetype) + { + case "1": + ModuleModel mode = new ModuleModel(MainImpl.GetSystemdllTab(str[0])); + if (mode != null) + { + return mode.PrintType == 3; + } + break; + case "2": + BaseAccraditationModel model = new BaseAccraditationModel(BillAuditImpl.GetPubAuditProperty(str[0])); + if (model != null) + { + return model.BillPrintType == 3; + } + break; + } + return false; + })); + } + #endregion + Task billSettingTask = cachesDic.AddTask(this, "BillSetting", new Task(() => + { + BillImpl.InitBillSetting(billModel); + return true; + })); + #endregion + + + if (billModel.PanelWidth > 0) + { + #region InitializeBillSource初始化单据来源 + Task> detailTask = cachesDic.AddTask(this, "Details", new Task>(() => + { + List details = new List(); + DataTable table = BaseAuditImpl.GetAttachTabs(dynamicModel.ModuleCode, "100", " and orderid < 0 "); + foreach (DataRow item in table.Rows) + { + GridDetailModel gridDetailModel = new GridDetailModel(item, null, GridCustomColumnStruct.BillSourceDetailAttachGridView); + details.Add(gridDetailModel); + Task addGridColumnsTask = cachesDic.AddTask(gridDetailModel, "GridColumns", new Task(() => + { + DataTable gridColumns = BaseAuditImpl.GetBottomBasicInformation(item["formKey"] + ""); + gridDetailModel.GridColumns = gridColumns; + return gridColumns; + })); + } + return details; + })); + Task sourcesTask = cachesDic.AddTask(this, "Sources", new Task(() => + { + DataRow menuConfigRow = menuConfigTabTask.Result; + string SourceIds = (billModel.BillSourceIds + "").Trim(','); + if (!string.IsNullOrWhiteSpace(dynamicModel.SourceDetailsID)) + { + SourceIds = (SourceIds + "," + dynamicModel.SourceDetailsID).Trim(','); + } + return BillImpl.GetSources(dynamicModel.ModuleCode, SourceIds);//获取单据来源 + })); + cachesDic.AddTask(tb_buttom, "DynamicModel", dynamicModelTask); + cachesDic.AddTask(tb_buttom, "Details", detailTask); + tb_buttom.GetDataCaches(cachesDic); + Task initSourcesTask = cachesDic.AddTask(this, "InitSourcesTask", new Task(() => + { + Hashtable htTable = sourcesTask.Result; + DataTable masterTable = htTable["master"] as DataTable; + DataTable detailTable = htTable["detail"] as DataTable; + for (int i = 0; i < masterTable.Rows.Count; i++) + { + DataRow sourceModelRow = masterTable.Rows[i]; + BillModuleModel billModuleModel = new BillModuleModel(); + BillSourceModel model = new BillSourceModel(sourceModelRow); + billModuleModel.SourceModel = model; + Task customQueryFieldsTask = cachesDic.AddTask(model, "CustomQueryFields", new Task(() => + { + return BaseModuleImpl.GetCustomQueryFields(model.FormKey); + })); + #region 加载来源表头 + GridControlEx gridControl = null; + TreeViewEx treeView = null; + if (model.SourceType == 1) + { + // 来源为树类型 + treeView = new TreeViewEx(); + billModuleModel.SourceControl = treeView; + Task bindTreeTableTask = cachesDic.AddTask(treeView, "BindTreeTable", new Task(() => + { + return BaseImpl.GetDataTableResult(model.SourceSql); + })); + } + else if (model.SourceType == 5) + { + model.ChangeSourceType(2);//单据来源显示条数 + } + else if (model.SourceType == 3 || model.SourceType == 4) + { + gridControl = new TreeGridControlEx(); + billModuleModel.SourceControl = gridControl; + Task sourceColumnsTask = cachesDic.AddTask(gridControl, "SourceColumns", new Task(() => + { + return BillImpl.GetSourceColumns(model.Id); + })); + Task sourceGridRowColorsTask = cachesDic.AddTask(gridControl, "BaseGridRowColors", new Task(() => + { + return BaseModuleImpl.GetBaseGridRowColors("BILLSOURCE_" + model.FormKey); + })); + Task sourceGridRightMenusTask = cachesDic.AddTask(gridControl, "BaseGridRightMenus", new Task(() => + { + return BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCE_" + model.FormKey); + })); + } + else + { + // 来源为表格类型 + gridControl = new GridControlEx(); + billModuleModel.SourceControl = gridControl; + Task sourceColumnsTask = cachesDic.AddTask(gridControl, "SourceColumns", new Task(() => + { + return BillImpl.GetSourceColumns(model.Id); + })); + //创建表格列 + cachesDic.AddTask(gridControl, "DynamicModel", dynamicModelTask); + gridControl.GetDataCaches(cachesDic, GridCustomColumnStruct.BillSourceGridView + model.FormKey); + Task sourceGridRowColorsTask = cachesDic.AddTask(gridControl, "BaseGridRowColors", new Task(() => + { + return BaseModuleImpl.GetBaseGridRowColors("BILLSOURCE_" + model.FormKey); + })); + Task sourceGridRightMenusTask = cachesDic.AddTask(gridControl, "BaseGridRightMenus", new Task(() => + { + return BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCE_" + model.FormKey); + })); + } + #endregion + #region 加载来源明细 + GridControlEx gridDetail = new GridControlEx(); + if (model.sourceDetailType.Equals("1")) + { + //明细为树表格 + gridDetail = new TreeGridControlEx(); + billModuleModel.SourceDetailControl = gridDetail; + //创建表格列 + cachesDic.AddTask(gridDetail, "DynamicModel", dynamicModelTask); + gridDetail.GetDataCaches(cachesDic, GridCustomColumnStruct.BillSourceDetailGridView + model.FormKey); + Task detailGridRowColorsTask = cachesDic.AddTask(gridDetail, "BaseGridRowColors", new Task(() => + { + return BaseModuleImpl.GetBaseGridRowColors("SOURCEDETAIL_" + model.FormKey); + })); + Task detailGridRightMenusTask = cachesDic.AddTask(gridDetail, "BaseGridRightMenus", new Task(() => + { + return BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDT_" + model.FormKey); + })); + + } + else + { + gridDetail = new GridControlEx(); + billModuleModel.SourceDetailControl = gridDetail; + //创建表格列 + cachesDic.AddTask(gridDetail, "DynamicModel", dynamicModelTask); + gridDetail.GetDataCaches(cachesDic, GridCustomColumnStruct.BillSourceDetailGridView + model.FormKey); + Task detailGridRowColorsTask = cachesDic.AddTask(gridDetail, "BaseGridRowColors", new Task(() => + { + return BaseModuleImpl.GetBaseGridRowColors("SOURCEDETAIL_" + model.FormKey); + })); + Task detailGridRightMenusTask = cachesDic.AddTask(gridDetail, "BaseGridRightMenus", new Task(() => + { + return BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDT_" + model.FormKey); + })); + //明细的明细(明细分成左右2个) + if (!string.IsNullOrEmpty(model.SourceDetailsDetailsSql)) + { + GridControlEx gridDetail_Details = new GridControlEx(); + billModuleModel.SourceDetailDetailControl = gridDetail_Details; + //创建只读列 + Task detailDetailsTask = cachesDic.AddTask(gridDetail_Details, "DetailDetails", new Task(() => + { + return BaseModuleImpl.getDetail_Details(model.FormKey); + })); + //创建表格列 + cachesDic.AddTask(gridDetail_Details, "DynamicModel", dynamicModelTask); + gridDetail_Details.GetDataCaches(cachesDic); + Task detailDetailsGridRightMenusTask = cachesDic.AddTask(gridDetail_Details, "BaseGridRightMenus", new Task(() => + { + return BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDTX_" + model.FormKey); + })); + } + } + #endregion + BillModuleModelDic.Add(sourceModelRow, billModuleModel); + #region 加载来源条件 + Task searchControlTask = cachesDic.AddTask(sourceModelRow, "SearchControl", new Task(() => + { + DataTable controls = customQueryFieldsTask.Result; + MyControl searchControl = null; + if (model.SourceType != 1 || (controls != null && controls.Rows.Count > 0)) + { + // 创建自定义条件 + string searchSql = model.SourceType == 1 ? Regex.Replace(model.DetailSql, "{speciesno}", "", RegexOptions.IgnoreCase) : model.SourceSql; + searchControl = new MyControl(searchSql, gridControl == null ? gridDetail : gridControl, treeView); + searchControl.Model = dynamicModel; + searchControl.OtherParams = dynamicModel.OtherParams(); + cachesDic.AddTask(searchControl, "DynamicModel", dynamicModelTask); + cachesDic.AddTask(searchControl, "ControlsTable", customQueryFieldsTask); + searchControl.GetSearchDataCaches(cachesDic); + } + return searchControl; + })); + #endregion + } + return true; + })); + #endregion + } + return true; + })); + #endregion + } + + + /// + /// 说明:初始化分割条位置 + /// 创建人:龚宇超 + /// 创建日期:2018-03-06 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InitlizeSpiltLocation() + { + try + { + // 设置单据来源底部高度 + if (this.BillModel.PanelHeight == 0) + { + // 隐藏来源明细 + this.ssc_main.PanelVisibility = SplitPanelVisibility.Panel1; + } + else + { + string height = IniHelper.Read(string.Format("bill_height_{0}", this.SysModel.ModuleCode)); + if (!string.IsNullOrEmpty(height)) + this.ssc_main.SplitterPosition = Convert.ToInt32(height); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + } + + } + /// + /// 说明:初始化系统配置 + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InitializeSetting() + { + Dictionary dataCaches = SysModel != null ? SysModel.DataCaches : null; + if (!dataCaches.GetValue(this, "BillInfo", out DataRow modelRow)) + { + modelRow = BillImpl.GetBillInfo(this.SysModel.ModuleCode);//获取单个模块信息 + } + if (modelRow == null) + { + throw new Exception("模块编号[" + this.SysModel.ModuleCode + "],配置错误!\r\n该模块信息未找到!"); + } + if (!dataCaches.GetValue(this, "BillModel", out BillModel)) + { + this.BillModel = new BillModel(modelRow);//初始化类的新实例。 + } + + if (this.BillModel != null) + { + this.BillModel.TypeName = string.IsNullOrEmpty(SysModel.BillMasterSql) ? this.SysModel.FormText : this.BillModel.TypeName;// 模块名称 + if (!string.IsNullOrWhiteSpace(this.SysModel.DocumentName)) this.BillModel.TypeName = this.SysModel.DocumentName; + + if (!dataCaches.GetValue(this, "MasterPreFix", out string masterPreFix)) + { + masterPreFix = BaseImpl.GetColumnPrefix(this.BillModel.MasterTable);// 主表列前缀 + } + this.BillModel.MasterPreFix = masterPreFix; + if (!dataCaches.GetValue(this, "DetailPreFix", out string detailPreFix)) + { + detailPreFix = BaseImpl.GetColumnPrefix(this.BillModel.DetailTable);// 明细表列前缀 + } + this.BillModel.DetailPreFix = detailPreFix; + this.BillModel.DetailOrderField = this.BillModel.DetailPreFix + "lsidx_id";// 单据来源id + if (SystemInfo.Instance.IsNotBillDetailOrder)//禁用排序 + this.BillModel.DetailOrderField = string.Empty; + } + if (!dataCaches.GetValue(this, "MenuConfigTab", out DataRow menuRow)) + { + menuRow = BaseImpl.GetMenuConfigTab(this.SysModel.ModuleId);//获取菜单其他配置 + } + if (menuRow != null) + { + this.BillModel.BillSourceIds = menuRow.Table.Columns.Contains("BillSourceIds") ? (menuRow["BillSourceIds"] + "").Trim(',') : string.Empty; + this.BillModel.BillFlag = menuRow.Table.Columns.Contains("BillFlag") && !string.IsNullOrEmpty(menuRow["BillFlag"] + "") ? Convert.ToInt32(menuRow["BillFlag"] + "") : -1; + } + if (this.SysModel.HideSource) + { + this.BillModel.PanelWidth = 0; + this.BillModel.PanelHeight = 0; + } + + if (!dataCaches.GetValue(this, "BillSetting", out bool _)) + { + BillImpl.InitBillSetting(this.BillModel); + } + } + + /// + /// 说明:初始化控件 + /// 创建人:龚宇超 + /// 创建日期:2017-11-23 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InitializeControl() + { + this.InitializeBillSource();//初始化单据来源 + } + + + /// + /// 点击第一个默认新增行新增默认数据 + /// + /// + /// + private void GridView_MouseDown(object sender, MouseEventArgs e) + { + + } + + + /// + /// 说明:初始化单据来源 + /// 创建人:龚宇超 + /// 创建日期:2017-11-28 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InitializeBillSource() + { + this.xtc_main_container.TabPages.Clear(); + + Dictionary dataCaches = SysModel != null ? SysModel.DataCaches : null; + if (!dataCaches.GetValue(this, "Details", out List attachModels)) + { + attachModels = GetAttachTabs(); + } + if (!dataCaches.GetValue(this, "Sources", out Hashtable htTable)) + { + string SourceIds = (this.BillModel.BillSourceIds + "").Trim(','); + if (!string.IsNullOrWhiteSpace(this.SysModel.SourceDetailsID)) + { + SourceIds = (SourceIds + "," + this.SysModel.SourceDetailsID).Trim(','); + } + htTable = BillImpl.GetSources(this.SysModel.ModuleCode, SourceIds);//获取单据来源 + } + DataTable masterTable = htTable["master"] as DataTable; + DataTable detailTable = htTable["detail"] as DataTable; + + + + + /* 构造原理 + * 1. 假如存在附加信息,则底部显示来源明细(来源明细摆放在标签第一个位置)+多标签,假如标签只有一个则隐藏标签头. + * 2. 假如不存在附加信息,则底部只显示来源明细. + **/ + if (attachModels.Count > 0) + { + this.tb_buttom.Model = this.SysModel; + this.tb_buttom.ParentControlEx = this.ControlObj; + //this.tb_buttom.ParentGridEx = this.gcMain; + if (this.BillModel.RefreshSelectedDetail) + { + //配置了只刷新当前页签后,切换页签时刷新 + this.tb_buttom.TabControlObj.SelectedPageChanged += TabControlObj_SelectedPageChanged; + } + this.tb_buttom.InitTabPages(attachModels); + + } + else + { + this.tb_buttom.TabControlObj.ShowTabHeader = DevExpress.Utils.DefaultBoolean.False; + } + dataCaches.GetValue(this, "InitSourcesTask", out bool _); + + int SerialNumber = 0; + for (int i = 0; i < masterTable.Rows.Count; i++) + { + DataRow sourceModelRow = masterTable.Rows[i]; + BillModuleModel billModuleModel = BillModuleModelDic.ContainsKey(sourceModelRow) ? BillModuleModelDic[sourceModelRow] : new BillModuleModel(); + BillSourceModel model = billModuleModel.SourceModel != null ? billModuleModel.SourceModel : new BillSourceModel(sourceModelRow); + object sourceControl = billModuleModel.SourceControl != null ? billModuleModel.SourceControl : null; + object sourceDetailControl = billModuleModel.SourceDetailControl != null ? billModuleModel.SourceDetailControl : null; + object sourceDetailDetailControl = billModuleModel.SourceDetailDetailControl != null ? billModuleModel.SourceDetailDetailControl : null; + BillSourceUnionModel unionModel = new BillSourceUnionModel(); + if (!dataCaches.GetValue(model, "CustomQueryFields", out DataTable controls)) + { + controls = BaseModuleImpl.GetCustomQueryFields(model.FormKey); + } + + + XtraTabPage tabPage = new XtraTabPage(); + tabPage.Text = model.UserName; + + //只加载单据管理类型 + if (!(model.SourceType == 2 || model.SourceType == 4)) continue; + + + #region 加载来源表头 + GridControlEx gridControl = null; + TreeViewEx treeView = null; + + if (model.SourceType == 1) + { + // 来源为树类型 + treeView = sourceControl != null ? (TreeViewEx)sourceControl : new TreeViewEx(); + treeView.BorderStyle = BorderStyle.None; + treeView.Dock = DockStyle.Fill; + treeView.TreeNodeKeyField = model.SourceKeyField; + treeView.TreeNodeTextField = model.SourceResult; + if (!dataCaches.GetValue(treeView, "BindTreeTable", out DataTable bindTreeTable)) + { + bindTreeTable = BaseImpl.GetDataTableResult(model.SourceSql); + } + treeView.TreeInhibitSort = model.TreeInhibitSort; + treeView.BindTreeView(bindTreeTable); + treeView.TreeNodeSelectAfter += new TreeViewEventHandler(OnTreeNodeSelectAfter); + + tabPage.Controls.Add(treeView); + } + else if (model.SourceType == 5) + { + model.ChangeSourceType(2);//单据来源显示条数 + this.IsBillShowCount = true; + } + else if (model.SourceType == 3 || model.SourceType == 4) + { + //类型为3,是树表格类型的单据管理。 + //类型为4,是树表格类型的数据来源 + gridControl = sourceControl != null ? (TreeGridControlEx)sourceControl : new TreeGridControlEx(); + gridControl.Dock = DockStyle.Fill; + gridControl.BorderStyle = System.Windows.Forms.BorderStyle.None; + gridControl.Model = this.SysModel; + + if (!dataCaches.GetValue(gridControl, "SourceColumns", out DataTable dtSourceColumns)) + { + dtSourceColumns = BillImpl.GetSourceColumns(model.Id); + } + if (!dataCaches.GetValue(gridControl, "BaseGridRowColors", out DataTable dtBaseGridRowColors)) + { + dtBaseGridRowColors = BaseModuleImpl.GetBaseGridRowColors("BILLSOURCE_" + model.FormKey); + } + if (!dataCaches.GetValue(gridControl, "BaseGridRightMenus", out DataTable dtBaseGridRightMenus)) + { + dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCE_" + model.FormKey); + } + + //节点编号 + if (!string.IsNullOrWhiteSpace(model.SourceKeyFieldName)) (gridControl as TreeGridControlEx).TreeListObj.KeyFieldName = model.SourceKeyFieldName; + //父节点编号 + if (!string.IsNullOrWhiteSpace(model.SourceParentFieldName)) (gridControl as TreeGridControlEx).TreeListObj.ParentFieldName = model.SourceParentFieldName; + + gridControl.SetReadOnlyColumns(dtSourceColumns, GridCustomColumnStruct.BillSourceGridView + model.FormKey); + gridControl.SetGridRowColors(dtBaseGridRowColors); + //gridControl.SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridControlRightCallback); + (gridControl as TreeGridControlEx).SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridControlRightCallback); + unionModel.TreeGridControlObj = gridControl as TreeGridControlEx; + unionModel.TreeGridControlObj.TreeListObj.FocusedNodeChanged += new DevExpress.XtraTreeList.FocusedNodeChangedEventHandler(OnTreeListObjFocusedNodeChanged); + + + if (BillModel.IsBillSourceCheck == 1) + { + GridDragGrid.TreeListAddCheckBox((gridControl as TreeGridControlEx).TreeListObj); + } + tabPage.Controls.Add(gridControl); + } + else + { + // 来源为表格类型 + gridControl = sourceControl != null ? (GridControlEx)sourceControl : new GridControlEx(); + gridControl.BorderStyle = BorderStyle.None; + gridControl.Model = this.SysModel; + gridControl.Dock = DockStyle.Fill; + gridControl.ExportPermission = this.BillModel.ExportPermission; + + if (model.LoadFilter) + { + gridControl.GridView.OptionsView.ShowAutoFilterRow = true; + } + if (!dataCaches.GetValue(gridControl, "SourceColumns", out DataTable dtSourceColumns)) + { + dtSourceColumns = BillImpl.GetSourceColumns(model.Id); + } + if (!dataCaches.GetValue(gridControl, "BaseGridRowColors", out DataTable dtBaseGridRowColors)) + { + dtBaseGridRowColors = BaseModuleImpl.GetBaseGridRowColors("BILLSOURCE_" + model.FormKey); + } + if (!dataCaches.GetValue(gridControl, "BaseGridRightMenus", out DataTable dtBaseGridRightMenus)) + { + dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCE_" + model.FormKey); + } + gridControl.SetReadOnlyColumns(dtSourceColumns, GridCustomColumnStruct.BillSourceGridView + model.FormKey); + gridControl.SetGridRowColors(dtBaseGridRowColors); + gridControl.SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridControlRightCallback); + //gridControl.GridView.SelectionChanged += new SelectionChangedEventHandler(OnGridControlSelectionChanged); + //gridControl.GridView.FocusedRowObjectChanged += OnFocusedRowObjectChanged; + //if (model.DetailsDoubleClick) + //{ + // gridControl.GridView.DoubleClick += OnSourceGridViewDoubleClick; // 2023-3-11 增加双击配置 + //} + //else + //{ + // gridControl.GridView.RowCellClick += OnGridViewRowCellClick; // 2019-11-12 cmd提出改为行点击事件,否则会出现保存提交后,单据管理无法查询出数据 + //} + + gridControl.GridView.RowCellClick += OnGridViewRowCellClick; // 2019-11-12 cmd提出改为行点击事件,否则会出现保存提交后,单据管理无法查询出数据 + + gridControl.GridView.DoubleClick += OnSourceGridViewDoubleClick;//双击事件改成打开单据主消息控件 + + + if (BillModel.IsBillSourceCheck == 1) + { + GridDragGrid.GridAddCheckBox(gridControl.GridView); + } + tabPage.Controls.Add(gridControl); + } + #endregion + + #region 加载来源明细 + XtraTabPage tabDetail = new XtraTabPage(); + + if (SystemInfo.Instance.GridRowFontSize > 0) + { + //页签大小 + FontFamily fontFamily = tabDetail.Appearance.Header.Font.FontFamily; + tabDetail.Appearance.Header.Font = new System.Drawing.Font(fontFamily, SystemInfo.Instance.GridRowFontSize); + } + + DataRow[] detailColumns = detailTable.Select("sourceId=" + model.Id); + + + //明细为表格 + GridControlEx gridDetail = new GridControlEx(); + + + + if (!string.IsNullOrWhiteSpace(model.DetailMenuCode)) + { + //来源明细配置了模块号,根据模块号创建对应的ModuleGridEx + //ModuleGridEx主要是用保存的功能,数据源sql还是根据配置的为准 + DataRow modelRow = MainImpl.GetSystemdllTab(model.DetailMenuCode);//获取模块信息 + if (modelRow == null) + { + MessageUtil.Show($"没有找到编号为 {model.DetailMenuCode} 的模块信息"); + gridDetail.Parent = gridDetail; + continue; + } + + ModuleModel sysModel = new ModuleModel(modelRow); + //设置主表sql + //model.SourceSql = sysModel.MenuSql; + + DynamicModuleModel dyncModel = new DynamicModuleModel(new[] + { sysModel.MenuName, ERPInfo.Instance.UserId, ERPInfo.Instance.UserName, + this.SysModel.Privilege, sysModel.ModeCode, "0" }); + + ModuleGridEx gridEx = new ModuleGridEx(); + gridEx.Dock = DockStyle.Fill; + if (model.SourceType == 1) + { + gridEx.LeftTreeViewEx = treeView; + } + else + { + gridEx.LeftGridEx = gridControl; + gridEx.ParentGridEx = gridControl; + } + gridEx.ParentKeyField = model.SourceKeyField; + gridEx.ParentUnionField = model.SourceKeyField; + + gridEx.VisibleSearchPanel = false;//禁止上方搜索 + gridEx.InitializeControl(sysModel, dyncModel); + + + gridDetail = gridEx.GridControlObj; + gridEx.Parent = tabDetail; + unionModel.GridDetailModuleGridEx = gridEx; + + if (sysModel.TreeAutoMultiHeader == 1) model.ChangeSourceDetailType("1"); + + + + if (SerialNumber == 0) + { + this.tb_buttom.TabControlObj.TabPages.Insert(0, tabDetail); + this.tb_buttom.TabControlObj.SelectedTabPageIndex = 0; + if (attachModels.Count > 0) + this.tb_buttom.TabControlObj.TabPages[0].Text = model.UserName + DetailedSuffix; + } + + } + else + { + if (model.sourceDetailType.Equals("1")) + { + //明细为树表格 + gridDetail = sourceDetailControl != null ? (TreeGridControlEx)sourceDetailControl : new TreeGridControlEx(); + gridDetail.Model = this.SysModel; + gridDetail.Dock = DockStyle.Fill; + gridDetail.SetReadOnlyColumns(detailColumns == null || detailColumns.Length == 0 ? new DataTable() : detailColumns.CopyToDataTable(), GridCustomColumnStruct.BillSourceDetailGridView + model.FormKey); + if (!dataCaches.GetValue(gridDetail, "BaseGridRowColors", out DataTable dtBaseGridRowColors)) + { + dtBaseGridRowColors = BaseModuleImpl.GetBaseGridRowColors("SOURCEDETAIL_" + model.FormKey); + } + if (!dataCaches.GetValue(gridDetail, "BaseGridRightMenus", out DataTable dtBaseGridRightMenus)) + { + dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDT_" + model.FormKey); + } + gridDetail.SetGridRowColors(dtBaseGridRowColors); + gridDetail.SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridDetailRightMenuCallback); + gridDetail.Parent = tabDetail; + gridDetail.BorderStyle = System.Windows.Forms.BorderStyle.None; + + if (SerialNumber == 0) + { + this.tb_buttom.TabControlObj.TabPages.Insert(0, tabDetail); + this.tb_buttom.TabControlObj.SelectedTabPageIndex = 0; + if (attachModels.Count > 0) + this.tb_buttom.TabControlObj.TabPages[0].Text = model.UserName + DetailedSuffix; + } + + if (BillModel.IsBillDetailCheck == 1)//加载复选框 + { + GridDragGrid.TreeListAddCheckBox((gridDetail as TreeGridControlEx).TreeListObj); + } + } + else + { + + gridDetail = sourceDetailControl != null ? (GridControlEx)sourceDetailControl : new GridControlEx(); + gridDetail.Model = this.SysModel; + gridDetail.Dock = DockStyle.Fill; + gridDetail.SetReadOnlyColumns(detailColumns == null || detailColumns.Length == 0 ? new DataTable() : detailColumns.CopyToDataTable(), GridCustomColumnStruct.BillSourceDetailGridView + model.FormKey); + + if (model.DetailedLoadFilter) + { + gridDetail.GridView.OptionsView.ShowAutoFilterRow = true; + } + if (!dataCaches.GetValue(gridDetail, "BaseGridRowColors", out DataTable dtBaseGridRowColors)) + { + dtBaseGridRowColors = BaseModuleImpl.GetBaseGridRowColors("SOURCEDETAIL_" + model.FormKey); + } + if (!dataCaches.GetValue(gridDetail, "BaseGridRightMenus", out DataTable dtBaseGridRightMenus)) + { + dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDT_" + model.FormKey); + } + gridDetail.SetGridRowColors(dtBaseGridRowColors); + gridDetail.SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridDetailRightMenuCallback); + + //明细的明细(明细分成左右2个) + if (!string.IsNullOrEmpty(model.SourceDetailsDetailsSql)) + { + GridControlEx gridDetail_Details = sourceDetailDetailControl != null ? (GridControlEx)sourceDetailDetailControl : new GridControlEx(); + gridDetail_Details.Model = this.SysModel; + gridDetail_Details.Dock = DockStyle.Fill; + //创建只读列 + if (!dataCaches.GetValue(gridDetail_Details, "Detail_Details", out DataTable dataTable)) + { + dataTable = BaseModuleImpl.getDetail_Details(model.FormKey); + } + gridDetail_Details.SetReadOnlyColumns(dataTable); + //设置右键 + if (!dataCaches.GetValue(gridDetail_Details, "BaseGridRightMenus", out DataTable dttBaseGridRightMenus)) + { + dttBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus("BILLSOURCEDTX_" + model.FormKey); + } + gridDetail_Details.SetGridRightMenus(dttBaseGridRightMenus, this.SysModel, OnGridDetailRightMenuCallback); + //明细点击 更新 明细的明细 + gridDetail.GridView.FocusedRowObjectChanged += GridView_FocusedRowObjectChanged; + gridDetail.GridView.Tag = model.SourceDetailsDetailsSql; + //创建SplitContainerControl控件,让下方可以左右拖动 + SplitContainerControl splitContainerControl = new DevExpress.XtraEditors.SplitContainerControl(); + splitContainerControl.Dock = DockStyle.Fill; + splitContainerControl.Panel1.Controls.Add(gridDetail); + gridDetail.BorderStyle = System.Windows.Forms.BorderStyle.None; + splitContainerControl.Panel2.Controls.Add(gridDetail_Details); + gridDetail_Details.BorderStyle = System.Windows.Forms.BorderStyle.None; + + splitContainerControl.SplitterMoved += new System.EventHandler(this.OnDetailsSplitterMoved); + string newwidth = IniHelper.Read(string.Format("bill_Details_Width_{0}", this.SysModel.ModuleCode));//通过Key获取Value值 + if (!string.IsNullOrEmpty(newwidth)) + { + splitContainerControl.SplitterPosition = Convert.ToInt32(newwidth); + } + else + { + int width = this.tb_buttom.Width;//获取控件宽度 + splitContainerControl.SplitterPosition = width / 2;//然后将分割位置设置在宽度一半位置 + } + + + splitContainerControl.Parent = tabDetail; + unionModel.GridDetailDetailControlObj = gridDetail_Details; + } + else + { + gridDetail.Parent = tabDetail; + gridDetail.BorderStyle = System.Windows.Forms.BorderStyle.None; + + } + + if (SerialNumber == 0) + { + this.tb_buttom.TabControlObj.TabPages.Insert(0, tabDetail); + this.tb_buttom.TabControlObj.SelectedTabPageIndex = 0; + if (attachModels.Count > 0) + this.tb_buttom.TabControlObj.TabPages[0].Text = model.UserName + DetailedSuffix; + } + if (BillModel.IsBillDetailCheck == 1)//加载复选框 + { + GridDragGrid.GridAddCheckBox(gridDetail.GridView); + } + } + } + + + + + + + + #endregion + + #region 加载来源条件 + if (model.SourceType == 1 && (controls == null || controls.Rows.Count == 0)) + { + //// 设置默认下拉列表框 + //DataTable columnTable = detailTable.Select("sourceId=" + model.Id + " and isnull(isVisible,0)=0").CopyToDataTable(); + //this.lceCombobox.ValueMember = this.lceCombobox.ValueField = "fieldName"; + //this.lceCombobox.TextField = "userName"; + //this.lceCombobox.SetDataSource(columnTable); + //this.lceCombobox.TextEdit.SelectedIndex = 0; + + //this.pl_treeview_detault_search.Dock = DockStyle.Bottom; + //this.pl_treeview_detault_search.Visible = true; + + //tabPage.Controls.Add(pl_treeview_detault_search); + } + else + { + // 创建自定义条件 + string searchSql = model.SourceType == 1 ? Regex.Replace(model.DetailSql, "{speciesno}", "", RegexOptions.IgnoreCase) : model.SourceSql; + PanelControl searchPanel = new PanelControl(); + if (!dataCaches.GetValue(sourceModelRow, "SearchControl", out MyControl searchControl)) + { + searchControl = new MyControl(searchSql, gridControl == null ? gridDetail : gridControl, treeView); + } + searchControl.OnSearchBeforeCallBack += new SearchEventHandler(OnSearchBefore); + searchControl.OnSearchAfterCallBack += new EventHandler(OnSearchAfterd); + if (SerialNumber == 0 && !SystemInfo.Instance.IsBillSourceRefushTag.Equals("1") && string.IsNullOrWhiteSpace(this.BillModel.InitialRefreshId)) + { + // 第一个页面要刷新数据,所以绑定事件用于初始化完成后在查询数据 + searchControl.OnDataSourceBindCallBack += new EventHandler(OnFirstPageDataSourceBindCallBack); + } + if (!string.IsNullOrWhiteSpace(this.BillModel.InitialRefreshId) && this.BillModel.InitialRefreshId.Equals(model.Id + "")) + { + searchControl.OnDataSourceBindCallBack += SearchControl_OnDataSourceBindCallBack; + InitialSelectionTab = tabPage; + } + + searchControl.ParentUnionField = model.SourceKeyField; + + searchPanel.Dock = DockStyle.Top; + searchPanel.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + searchPanel.BackColor = Color.Transparent; + searchPanel.Parent = tabPage; + searchControl.OtherParams = this.SysModel.OtherParams(); + searchPanel.Height = searchControl.InitSearchControl(controls, searchPanel); + unionModel.SearchObj = searchControl; + } + #endregion + + unionModel.GridControlObj = gridControl; + + if (model.sourceDetailType.Equals("1")) + { + unionModel.TreeGridDetailControlObj = (gridDetail as TreeGridControlEx); + } + else + { + unionModel.GridDetailControlObj = gridDetail; + } + + + + + unionModel.ModelObj = model; + unionModel.TreeViewObj = treeView; + if (SerialNumber == 0) + unionModel.IsChange = true; + tabPage.Tag = unionModel; + if (model.SourceType == 0 && !model.DisableShowSourceCount) + { + // 模块要查看具体条数 + unionModel.SearchObj.OnDataSourceBindCallBack += new EventHandler(OnPageDataSourceBindCallBack); + pageNumKey.Add(unionModel.SearchObj, tabPage); + } + this.xtc_main_container.TabPages.Add(tabPage); + SerialNumber++; + } + + + } + + + + + + + + + /// + /// 点击来源明细,加载明细的明细 + /// + /// + /// + private void GridView_FocusedRowObjectChanged(object sender, FocusedRowObjectChangedEventArgs e) + { + try + { + + GridView gridView = sender as GridView; + DataRow rowItem = gridView.GetFocusedDataRow(); + string sql = gridView.Tag + ""; + BillSourceUnionModel unionModel = this.xtc_main_container.SelectedTabPage.Tag as BillSourceUnionModel; + if (unionModel.GridDetailDetailControlObj != null) + { + unionModel.GridDetailDetailControlObj.gridControl.DataSource = BillImpl.GetDataTableResult(ReplaceHelper.ReplaceRowParam(rowItem, sql)); + } + } + catch (Exception ex) + { + MessageUtil.Show(ex); + } + + + } + + + + + + + + + + + + + + #region 单据来源相关 + /// + /// 说明:刷新当前选中的TabPage + /// 创建人:龚宇超 + /// 创建日期:2018-06-29 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// + private void RefreshSelectedSource() + { + if (this.xtc_main_container.SelectedTabPage == null) return;//来源选择为null(不显示左侧来源)。不执行下方刷新 + + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + BillSourceUnionModel model = tabPage.Tag as BillSourceUnionModel; + if (model.GridControlObj != null) this.RefreshSource(model); + if (BillModel.drgFinishHide == "1") + { + if (model.ModelObj.SourceType == 1) + { + string sqlValue = ReplaceHelper.ReplaceUserInfo(ReplaceHelper.ReplaceWhereCond(model.ModelObj.DetailSql)); + sqlValue = sqlValue.Replace("#", ""); + sqlValue = this.ControlObj.ReplaceControlValue(sqlValue); + sqlValue = ReplaceHelper.ReplaceParamToValue(sqlValue, model.TreeViewObj.GetSelectValue()); + model.GridDetailControlObj.GridControl.DataSource = BillImpl.GetDataTableResult(sqlValue); + } + else + { + this.RefreshSourceDetail(model); + } + } + if (model.ModelObj.SourceType == 0 && model.SearchObj.GridRowCount > 0) tabPage.Text = model.ModelObj.UserName + "(" + model.SearchObj.GridRowCount + QuantitySuffix; + } + /// + /// 说明:刷新单据来源主表,未传递时,默认刷新 + /// 创建人:龚宇超 + /// 创建日期:2017-12-13 + /// 修改人: + /// 修改日期: + /// 修改备注:gcMain + /// 版本:1.0 + /// + /// The union model. + /// XtraTabPage. + private void RefreshSource(BillSourceUnionModel unionModel = null) + { + if (unionModel == null || unionModel.SearchObj == null) return; + unionModel.SearchObj.SearchLastGrid(); + + + } + + + + /// + /// 说明:刷新单据来源明细 + /// 创建人:龚宇超 + /// 创建日期:2017-11-30 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The union model. + private void RefreshSourceDetail(BillSourceUnionModel unionModel) + { + if (unionModel == null) return; + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + + if (unionModel.ModelObj.SourceType == 1) + { + // 树加载明细 + //string fieldName = this.lceCombobox.EditValue; + //string fieldValue = this.textEdit1.Text.Trim(); + string fieldName = string.Empty; + string fieldValue = string.Empty; + string checkStrs = unionModel.TreeViewObj.GetCheckValues(); + string sqlValue = ReplaceHelper.ReplaceParamToValue(ReplaceHelper.ReplaceUserInfo(unionModel.ModelObj.DetailSql), unionModel.TreeViewObj.GetSelectNodeValue()); + + if (!string.IsNullOrEmpty(checkStrs)) + checkStrs = " and SpeciesNo in (" + checkStrs.TrimEnd(',') + ")"; + sqlValue = string.Format("select * from ({0}) temp where 1=1 ", ReplaceHelper.ReplaceWhereCond(sqlValue) + checkStrs) + string.Format(" and ({0} like '%{1}%' or dbo.P_getpy({0}) like '%{1}%')", fieldName, fieldValue); + + try + { + WaitForm.ShowForm(); + unionModel.GridDetailControlObj.GridControl.DataSource = BillImpl.GetDataTableResult(sqlValue); + } + catch (Exception ex) + { + MessageUtil.Show(ex); + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError(BillModel.TypeName + "模块刷新树加载明细出错!", ex); + } + finally + { + WaitForm.HideForm(); + } + } + else + { + // 加载明细 + try + { + WaitForm.ShowForm(); + + + DataRow rowItem = unionModel.GridControlObj.GridView.GetFocusedDataRow(); + //unionModel.GridDetailControlObj.GridControl.DataSource = rowItem == null + // ? new DataTable() : BillImpl.GetDataTableResult(ReplaceHelper.ReplaceRowParam(rowItem, unionModel.ModelObj.DetailSql)); + if (unionModel.ModelObj.SourceType == 3 || unionModel.ModelObj.SourceType == 4) + { + rowItem = unionModel.TreeGridControlObj.GetViewFocusedDataRow(); + } + + + string DetailSql = unionModel.ModelObj.DetailSql; + DetailSql = ReplaceHelper.ReplaceUserInfo(DetailSql); + DetailSql = ReplaceHelper.ReplaceWhereCond(DetailSql); + DetailSql = ReplaceHelper.ReplaceRowParam(rowItem, DetailSql); + if (unionModel.SearchObj != null) + DetailSql = unionModel.SearchObj.ReplaceParentControlValue(DetailSql); + + if (unionModel.ModelObj.sourceDetailType == "1") + { + unionModel.TreeGridDetailControlObj.SetGridViewDataSource(rowItem == null + ? new DataTable() : BillImpl.GetDataTableResult(DetailSql)); + } + else + { + + + //有复选框的页签在刷新前清空选中行,否则合计在刷新数据源后不会自带改变 + if (unionModel.GridDetailControlObj.GridView.OptionsSelection.MultiSelectMode == GridMultiSelectMode.CheckBoxRowSelect && unionModel.GridDetailControlObj.GridView.OptionsSelection.MultiSelect == true) + { + //int[] selectIndexs = unionModel.GridDetailControlObj.GridView.GetSelectedRows(); + unionModel.GridDetailControlObj.GridView.ClearSelection(); + } + + unionModel.GridDetailControlObj.GridControl.DataSource = rowItem == null + ? new DataTable() : BillImpl.GetDataTableResult(DetailSql); + } + + if (unionModel.GridDetailModuleGridEx != null) + { + unionModel.GridDetailModuleGridEx.GridControlObj.LastSearchSql = DetailSql; + } + + + DataTable table = null; + if (unionModel.ModelObj.sourceDetailType == "1") + { + table = unionModel.TreeGridDetailControlObj.TreeListObj.DataSource as DataTable; + } + else + { + table = unionModel.GridDetailControlObj.GridControl.DataSource as DataTable; + } + + if (table != null && !table.Columns.Contains("_check")) + { + table.Columns.Add("_check", typeof(bool)); + foreach (DataRow row in table.Rows) + { + row["_check"] = 0; + } + } + + + + if (tb_buttom.TabControlObj.TabPages.Count > 0) + { + for (int i = 0; i < this.tb_buttom.TabControlObj.TabPages.Count; i++) + { + XtraTabPage page = this.tb_buttom.TabControlObj.TabPages[i]; + if (i == 0) continue; + if (rowItem != null && page != null) + { + this.SetTabPageDataSource(page, rowItem); + } + } + //foreach (XtraTabPage AttachPage in this.tb_buttom.TabControlObj.TabPages) + //{ + // GridDetailModel model = tb_buttom.GetGridDetailModel(AttachPage); + // if (model == null) continue; + // string sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, model.DetailSql); + // this.tb_buttom.SetGridDataSource(AttachPage, sqlValue); + //} + } + } + catch (Exception ex) + { + MessageUtil.Show(ex); + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError(BillModel.TypeName + "模块加载明细出错!", ex); + } + finally + { + WaitForm.HideForm(); + } + } + } + /// + /// 说明:刷新单据来源 + /// 创建人:龚宇超 + /// 创建日期:2019-12-16 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void SaveRefreshSource() + { + foreach (XtraTabPage tabPage in this.xtc_main_container.TabPages) + { + BillSourceUnionModel model = tabPage.Tag as BillSourceUnionModel; + if (model != null && model.GridControlObj != null && model.ModelObj.SaveRefreshFlag) + { + this.RefreshSource(model); + this.RefreshSourceDetail(model); + } + } + } + + + + + + /// + /// 说明: + /// 创建人:龚宇超 + /// 创建日期:2017-11-30 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// true if XXXX, false otherwise. + private bool ValidateDetailCond(DataRow rowItem, BillSourceUnionModel unionModel) + { + bool validate = false; + + try + { + string detailCond = ReplaceHelper.ReplaceRowParam(rowItem, unionModel.ModelObj.DetailEnableCond); + detailCond = detailCond.ToLower();//2025-09-08 赵坤表示条件全部转成小写判断。 来源明细中不能配置单元格类型(不能配置 复选框条件 {xxx}=0 ),只能写{xxx}='Ture'。这种bit类型容易忘记大小的情况 + if (detailCond.Contains("#")) + { + List condition = ReplaceHelper.GetParamFields(detailCond); + foreach (string item in condition) + { + string fieldValue = this.ControlObj.GetControlValue(item.Replace("{#", "").Replace("}", "")); + detailCond = detailCond.Replace(item, fieldValue); + } + } + if (detailCond.StartsWith("@") || detailCond.StartsWith("!")) + { + validate = "1".Equals(BaseImpl.GetDefaultValue(detailCond)); + } + else + { + + validate = ReplaceHelper.EvalCond(detailCond); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteLog(ex.StackTrace); + LogUtil.WriteError("验证多条添加条件出错!", ex); + //MessageUtil.Show(ResourceKeys.CondtionError + "\r\n" + unionModel.ModelObj.DetailEnableCond); + } + return validate; + } + /// + /// 说明:单据来源右键菜单执行完后刷新 + /// 创建人:龚宇超 + /// 创建日期:2017-12-11 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnGridControlRightCallback(object sender, EventArgs e) + { + this.RefreshSelectedSource(); + + // 执行右键菜单后刷新单据状态2020-03-23 + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + BillSourceUnionModel model = tabPage.Tag as BillSourceUnionModel; + } + /// + /// 说明:获取单据管理的单据来源标签 + /// 创建人:龚宇超 + /// 创建日期:2017-12-13 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private BillSourceUnionModel GetBillSourceManager() + { + foreach (XtraTabPage item in this.xtc_main_container.TabPages) + { + BillSourceUnionModel model = item.Tag as BillSourceUnionModel; + if (model.ModelObj.SourceType == 2) + return model; + } + return null; + } + /// + /// 说明:初始化附加信息 + /// 创建人:龚宇超 + /// 创建日期:2018-04-26 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private List GetAttachTabs() + { + List details = new List(); + + DataTable table = BaseAuditImpl.GetAttachTabs(this.SysModel.ModuleCode, "100", " and orderid < 0 "); + foreach (DataRow item in table.Rows) + { + DataTable gridColumns = BaseAuditImpl.GetBottomBasicInformation(item["formKey"] + ""); + details.Add(new GridDetailModel(item, gridColumns, GridCustomColumnStruct.BillSourceDetailAttachGridView)); + } + + return details; + } + #endregion + + + + #region 事件相关 + /// + /// 说明:打印完成后回调 + /// 创建人:龚宇超 + /// 创建日期:2018-07-05 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The e. + private void OnReportPrintAfter(object sender, EventArgs e) + { + //打印完成后添加数据库 + if (_printSaveParams != null && _printSaveParams.Count > 0) + { + int result = BaseModuleImpl.SavePrintRecord(_printSaveParams[0], _printSaveParams[1], _printSaveParams[2], _printSaveParams[3], _printSaveParams[4]); + } + + } + /// + /// 说明: + /// 创建人:龚宇超 + /// 创建日期:2017-11-28 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnFrmMainKeyDown(object sender, KeyEventArgs e) + { + // 窗口获取按键则表格按键中断.有时间处理 + if (e.Modifiers.CompareTo(Keys.Control) == 0) + { + if (e.KeyCode == Keys.Down) + this.ssc_main.Collapsed = true; + if (e.KeyCode == Keys.Up) + this.ssc_main.Collapsed = false; + } + } + /// + /// 说明:树节点选中刷新明细 + /// 创建人:龚宇超 + /// 创建日期:2017-12-01 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnTreeNodeSelectAfter(object sender, TreeViewEventArgs e) + { + TreeView tree = (TreeView)sender; + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + BillSourceUnionModel unionModel = tabPage.Tag as BillSourceUnionModel; + if (unionModel != null) + { + WaitForm.ShowForm(); + try + { + + + string sqlValue = ReplaceHelper.ReplaceUserInfo(ReplaceHelper.ReplaceWhereCond(unionModel.ModelObj.DetailSql)); + sqlValue = sqlValue.Replace("#", ""); + sqlValue = this.ControlObj.ReplaceControlValue(sqlValue); + if (unionModel.SearchObj != null) sqlValue = unionModel.SearchObj.ReplaceControlValue(sqlValue); + sqlValue = ReplaceHelper.ReplaceParamToValue(sqlValue, e.Node.Name); + + if (unionModel.GridDetailModuleGridEx != null) + { + unionModel.GridDetailModuleGridEx.GridControlObj.LastSearchSql = sqlValue; + } + + if (unionModel.ModelObj.sourceDetailType == "1" && unionModel.TreeGridDetailControlObj.TreeListObj != null) + { + unionModel.TreeGridDetailControlObj.TreeListObj.DataSource = BillImpl.GetDataTableResult(sqlValue); + } + else + { + unionModel.GridDetailControlObj.GridControl.DataSource = BillImpl.GetDataTableResult(sqlValue); + } + + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError(BillModel.TypeName + "模块选中树节点" + tree.SelectedNode.Text + "刷新明细失败!", ex); + } + finally + { + WaitForm.HideForm(); + } + } + } + /// + /// 说明:单据来源切换Tab标签 + /// 创建人:龚宇超 + /// 创建日期:2017-11-28 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnTabSelectedPageChanged(object sender, TabPageChangedEventArgs e) + { + try + { + if (_isInitFinish && !SystemInfo.Instance.IsBillSourceRefushTag.Equals("1")) + { + BillSourceUnionModel unionModel = e.Page.Tag as BillSourceUnionModel; + if (unionModel != null) + { + this.RefreshSelectedSource(); + this.tb_buttom.TabControlObj.TabPages[0].Controls.Clear(); + if (unionModel.GridDetailModuleGridEx != null) + { + this.tb_buttom.TabControlObj.TabPages[0].Controls.Add(unionModel.GridDetailModuleGridEx); + } + else if (unionModel.GridDetailDetailControlObj == null) + { + this.tb_buttom.TabControlObj.TabPages[0].Controls.Add(unionModel.GridDetailControlObj != null ? unionModel.GridDetailControlObj : unionModel.TreeGridDetailControlObj); + } + else + { + //this.tb_buttom.TabControlObj.TabPages[0].Controls.Add(unionModel.GridDetailDetailControlObj); + //创建SplitContainerControl控件,让下方可以左右拖动 + SplitContainerControl splitContainerControl = new DevExpress.XtraEditors.SplitContainerControl(); + splitContainerControl.Dock = DockStyle.Fill; + splitContainerControl.Panel1.Controls.Add(unionModel.GridDetailControlObj); + splitContainerControl.Panel2.Controls.Add(unionModel.GridDetailDetailControlObj); + int width = this.tb_buttom.Width;//获取控件宽度 + splitContainerControl.SplitterPosition = width / 2;//然后将分割位置设置在宽度一半位置 + this.tb_buttom.TabControlObj.TabPages[0].Controls.Add(splitContainerControl); + } + this.tb_buttom.TabControlObj.TabPages[0].Text = unionModel.ModelObj.UserName + DetailedSuffix; + if (unionModel.IsChange == false) + { + AutoSizeChange.ControllInitializeSize(this.tb_buttom.TabControlObj.TabPages[0]); + unionModel.IsChange = true; + } + } + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError("单据切换标签失败!", ex); + } + } + /// + /// 说明:单据来源树结构默认查询条件 + /// 创建人:龚宇超 + /// 创建日期:2017-11-28 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnTreeSearchClick(object sender, EventArgs e) + { + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + + this.RefreshSourceDetail(tabPage.Tag as BillSourceUnionModel); + } + + /// + /// 单据来源树 条件框回车查询 + /// + /// + /// + private void OnTreeConditionKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + this.OnTreeSearchClick(null, null); + } + + } + + + /// + /// 说明:第一个页签初始化完成刷新数据 + /// 创建人:龚宇超 + /// 创建日期: + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + private void OnFirstPageDataSourceBindCallBack(object sender, EventArgs e) + { + try + { + if (IsBillMaster) + { + this.RefreshSelectedSource(); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError("单据切换标查询失败!", ex); + } + } + /// + /// 说明:第一个页签初始化完成刷新数据 + /// 创建人:龚宇超 + /// 创建日期: + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + private void OnPageDataSourceBindCallBack(object sender, EventArgs e) + { + try + { + MyControl searchControl = sender as MyControl; + XtraTabPage tabPage = pageNumKey[searchControl]; + if (tabPage.TabIndex == 0) return; + BillSourceUnionModel unionModel = tabPage.Tag as BillSourceUnionModel; + string searchSql = unionModel.ModelObj.SourceSql; + searchSql = ReplaceHelper.ReplaceUserInfo(searchSql); + searchSql = ReplaceHelper.ReplaceWhereCond(searchSql); + searchSql = unionModel.SearchObj.SetSearchSqlValue(searchSql, true, true); + // 查找FROM子句的位置 + int fromIndex = searchSql.IndexOf("FROM", StringComparison.OrdinalIgnoreCase); + if (fromIndex != -1) + { + // 生成优化后的SQL查询 + string optimizedSql = "SELECT COUNT(*) " + searchSql.Substring(fromIndex); + searchSql = optimizedSql; + } + DataTable dt = MainImpl.GetDataTableResult(searchSql); + if (dt.Rows.Count > 0) tabPage.Text += "(" + dt.Rows[0][0] + QuantitySuffix; + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError("单据条件绑定失败失败!", ex); + } + } + + /// + /// 跳转到指定页签,并执行配置条件的搜索 + /// + /// + /// + private void SearchControl_OnDataSourceBindCallBack(object sender, EventArgs e) + { + if (InitialSelectionTab != null) + { + this.xtc_main_container.SelectedTabPage = InitialSelectionTab; + BillSourceUnionModel model = InitialSelectionTab.Tag as BillSourceUnionModel; + if (model.SearchObj != null) model.SearchObj.SearchGrid(); + } + } + + /// + /// 说明:单据来源选中行,加载明细 + /// 创建人:龚宇超 + /// 创建日期:2017-11-30 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnGridControlSelectionChanged(object sender, SelectionChangedEventArgs e) + { + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + + this.RefreshSourceDetail(tabPage.Tag as BillSourceUnionModel); + } + /// + /// 说明:单据来源选中行,加载明细 + /// 创建人:龚宇超 + /// 创建日期:2017-11-30 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnGridViewRowCellClick(object sender, RowCellClickEventArgs e) + { + + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + BillSourceUnionModel unionModel = tabPage.Tag as BillSourceUnionModel; + this.RefreshSourceDetail(unionModel); + } + + + + + private void OnSourceGridViewDoubleClick(object sender, EventArgs e) + { + + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + BillSourceUnionModel unionModel = tabPage.Tag as BillSourceUnionModel; + //this.RefreshSourceDetail(unionModel); + DataRow rowItem = unionModel.GridControlObj.GridView.GetFocusedDataRow(); + if (rowItem == null) + return; + //单据号 + string billno = rowItem[BillModel.PrimaryKey] + ""; + + DynamicBillModel model = CloneDynamicBillModel(this.SysModel); + model.BillOrderNo = billno; + FrmBill frmBill = new FrmBill(model); + frmBill.Text = string.Format("{0}-详情[单据编号:{1}]", this.BillModel.TypeName, billno); + frmBill.ShowDialog(); + //刷新界面 + unionModel.SearchObj.SearchLastGrid(); + + } + + + // + /// 复制单据动态参数,保留原对象的运行时配置和缓存。 + /// + private static DynamicBillModel CloneDynamicBillModel(DynamicBillModel source) + { + if (source == null) + return null; + + MethodInfo method = typeof(object).GetMethod( + "MemberwiseClone", + BindingFlags.Instance | BindingFlags.NonPublic); + + return method.Invoke(source, null) as DynamicBillModel; + } + + + + /// + /// 说明:单据明细选中刷新附件明细 + /// 创建人:王一帆 + /// 创建日期:2021-06-30 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OngcMainRowCellClick(object sender, RowCellClickEventArgs e) + { + if (this.tb_buttom.TabControlObj.TabPages.Count > 1) + { + SetDetailGridDataSource(); + } + } + + + + /// + /// 切换下方附加模块页签时,刷新当前页签 + /// + /// + /// + private void TabControlObj_SelectedPageChanged(object sender, TabPageChangedEventArgs e) + { + if (this.tb_buttom.TabControlObj.TabPages.Count > 1) + { + SetDetailGridDataSource(); + } + } + + /// + /// 说明:获取底部多标签数据 + /// 创建人:龚宇超 + /// 创建日期:2017-12-19 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + public void SetDetailGridDataSource() + { + DataRow rowItem = null; + //DataRow rowItem = this.gcMain.GridView.GetFocusedDataRow(); + //if (this.BillModel.DetailTreeTable) + //{ + // rowItem = (this.gcMain as TreeGridControlEx).GetViewFocusedDataRow(); + //} + int i = 0; + foreach (XtraTabPage page in this.tb_buttom.TabControlObj.TabPages) + { + if (i == 0) + { + i++; + continue; + } + if (this.BillModel.RefreshSelectedDetail && page != tb_buttom.TabControlObj.SelectedTabPage) + { + continue; + } + if (rowItem != null && page != null) + { + this.SetTabPageDataSource(page, rowItem); + } + } + } + + + + + /// + /// 说明:设置表格数据 + /// 创建人:龚宇超 + /// 创建日期:2018-01-29 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The tab page. + /// The grid control. + public void SetTabPageDataSource(XtraTabPage tabPage, DataRow rowItem) + { + + GridDetailModel model = this.tb_buttom.GetGridDetailModel(tabPage); + if (rowItem != null && model != null) + { + if (tabPage.Tag is ModuleWebView) + { + // 加载网页 + string url = ReplaceHelper.ReplaceRowParam(rowItem, ReplaceHelper.ReplaceUserInfo(model.DetailSql)); + url = url.StartsWith("http") ? url : SystemInfo.Instance.OAUrl + url; + ModuleWebView webView = tabPage.Tag as ModuleWebView; + webView.Dock = DockStyle.Fill; + webView.Tag = model; + webView.Navigate(url); + } + else if (tabPage.Tag is FrmWebBrowser) + { + // 加载网页 + string url = ReplaceHelper.ReplaceRowParam(rowItem, ReplaceHelper.ReplaceUserInfo(model.DetailSql)); + url = url.StartsWith("http") ? url : SystemInfo.Instance.OAUrl + url; + FrmWebBrowser webView = tabPage.Tag as FrmWebBrowser; + webView.Dock = DockStyle.Fill; + webView.Tag = model; + webView.LoadUrl(url); + } + else if (tabPage.Tag is FrmMiniBlink) + { + // 加载网页 + string url = ReplaceHelper.ReplaceRowParam(rowItem, ReplaceHelper.ReplaceUserInfo(model.DetailSql)); + url = url.StartsWith("http") ? url : SystemInfo.Instance.OAUrl + url; + FrmMiniBlink webView = tabPage.Tag as FrmMiniBlink; + webView.Dock = DockStyle.Fill; + webView.Tag = model; + webView.LoadUrl(url); + } + else if (tabPage.Tag is TabMultipledetails) + { + TabMultipledetails tabMultipledetails = tabPage.Tag as TabMultipledetails; + tabMultipledetails.SetConditionValues(rowItem); + + GridControlEx grdExMain = (tabMultipledetails.SplitMain.Panel1.Tag as GridControlEx); + GridDetailModel MainModel = grdExMain.Tag as GridDetailModel; + string searchMainSql = this.GetSearchSql(MainModel, rowItem); + DataTable firstTable = MainImpl.GetDataTableResult(searchMainSql); + grdExMain.LastSearchSql = searchMainSql; + grdExMain.SetGridViewDataSource(firstTable); + + if (tabMultipledetails.SplitMain.Panel2.Tag is GridControlEx) + { + GridControlEx grdExAdditional = (tabMultipledetails.SplitMain.Panel2.Tag as GridControlEx); + GridDetailModel AdditionalModel = grdExAdditional.Tag as GridDetailModel; + string searchAddSql = this.GetSearchSql(AdditionalModel, rowItem); + if (!MainModel.IsUnioDetail) + { + grdExAdditional.LastSearchSql = searchAddSql; + grdExAdditional.SetGridViewDataSource(MainImpl.GetDataTableResult(searchAddSql)); + } + //右侧是左侧的明细,左侧没有数据时。右侧赋空值(因为无法触发左侧行改变事件) + if (MainModel.IsUnioDetail && firstTable.Rows.Count == 0) + { + grdExAdditional.LastSearchSql = ""; + grdExAdditional.SetGridViewDataSource(new DataTable()); + } + } + else if (tabMultipledetails.SplitMain.Panel2.Tag is ChartControlEx) + { + ChartControlEx grdExAdditional = (tabMultipledetails.SplitMain.Panel2.Tag as ChartControlEx); + GridDetailModel AdditionalModel = grdExAdditional.Tag as GridDetailModel; + string searchAddSql = this.GetSearchSql(AdditionalModel, rowItem); + DataTable table = MainImpl.GetDataTableResult(searchAddSql); + grdExAdditional.CreateChart(table); + } + + tabPage.Text = MainModel.DetailName + "(" + firstTable.Rows.Count + QuantitySuffix; + //tabPage.Text = MainModel.DetailName + "(" + firstTable.Rows.Count + "条)"; + //tabPage.Appearance.Header.ForeColor = firstTable.Rows.Count > 0 ? Color.Red : Color.FromArgb(0, 0, 0); + } + else + { + string searchSql = this.GetSearchSql(model, rowItem); + if (tabPage.Tag is GridControlEx) + { + (tabPage.Tag as GridControlEx).LastSearchSql = searchSql; + } + this.tb_buttom.SetGridDataSource(tabPage, MainImpl.GetDataTableResult(searchSql)); + if (tabPage.Tag is GridControlEx && (tabPage.Tag as GridControlEx).ParentControl != null) + (tabPage.Tag as GridControlEx).ParentControl.SetAllControlValue(rowItem); + //配置明细直接根据条件加载 + if (model.SystemModel != null && 1 == model.SystemModel.isFirstLoad) + { + (tabPage.Tag as GridControlEx).ParentControl.SearchGrid(); + GridControlEx gridControlEx = tabPage.Tag as GridControlEx; + + if (gridControlEx.CustomGroupBandEx != null) + { + tabPage.Text = model.DetailName + "(" + gridControlEx.CustomGroupBandEx.DataRowCount() + QuantitySuffix; + } + else if (gridControlEx.CustomGroupTreeBandEx != null) + { + tabPage.Text = model.DetailName + "(" + gridControlEx.CustomGroupTreeBandEx.DataRowCount() + QuantitySuffix; + } + else + { + tabPage.Text = model.DetailName + "(" + (tabPage.Tag as GridControlEx).ParentControl.GridRowCount + QuantitySuffix; + } + //tabPage.Text = gridControlEx.CustomGroupBandEx != null ? model.DetailName + "(" + gridControlEx.CustomGroupBandEx.DataRowCount() + "条)" : model.DetailName + "(" + (tabPage.Tag as GridControlEx).ParentControl.GridRowCount + "条)"; + //tabPage.Text = model.DetailName + "(" + (tabPage.Tag as GridControlEx).ParentControl.GridRowCount + "条)"; + } + //附加信息根据主表明细选中行,判断配置的按钮条件 + Object moduleObject = tabPage.Controls.Cast().FirstOrDefault(); + ModuleGridEx moduleGridEx = null; + if (moduleObject is ModuleGridEx) + { + moduleGridEx = moduleObject as ModuleGridEx; + moduleGridEx.ParentButtonState(rowItem); + } + + } + } + + } + /// + /// 说明:获取查询条件 + /// 创建人:龚宇超 + /// 创建日期:2017-11-22 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The model. + /// The row item. + /// System.String. + protected string GetSearchSql(GridDetailModel model, DataRow rowItem) + { + string fieldName = !string.IsNullOrEmpty(model.UnionParentField) && rowItem.Table.Columns.Contains(model.UnionParentField) ? model.UnionParentField : BillModel.PrimaryKey; + string sqlValue = model.IsReadOnly || model.IsChart ? model.DetailSql : model.SystemModel.MenuSql; + string unioValue = string.Empty; + unioValue = rowItem.Table.Columns.Contains(fieldName) ? rowItem[fieldName] + "" : string.Empty; + if (this.ControlObj != null && string.IsNullOrEmpty(unioValue)) + { + unioValue = !string.IsNullOrEmpty(model.UnionParentField) && this.ControlObj.FindControl(model.UnionParentField) != null ? this.ControlObj.GetControlValue(model.UnionParentField) : unioValue; + } + sqlValue = ReplaceHelper.ReplaceRowParam(rowItem, sqlValue); + sqlValue = this.ControlObj.ReplaceControlValue(sqlValue);//后替换主表内容 + if (ReplaceHelper.IsSelect(sqlValue) && !string.IsNullOrEmpty(model.UnionValue)) + { + sqlValue = ReplaceHelper.ReplaceWhereCond(sqlValue) + string.Format(" and {0}='{1}'", model.UnionValue, unioValue); + } + if (!string.IsNullOrEmpty(model.UnionCond)) + { + string UnionCond = ReplaceHelper.ReplaceRowParam(rowItem, model.UnionCond); + sqlValue += UnionCond; + } + return sqlValue; + } + /// + /// 说明:单据来源选中行,加载明细 + /// 创建人:龚宇超 + /// 创建日期:2019-07-25 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + private void OnTreeListObjFocusedNodeChanged(object sender, DevExpress.XtraTreeList.FocusedNodeChangedEventArgs e) + { + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + + this.RefreshSourceDetail(tabPage.Tag as BillSourceUnionModel); + } + /// + /// 说明:单据来源明细右键菜单执行后刷新数据 + /// 创建人:龚宇超 + /// 创建日期:2017-12-19 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnGridDetailRightMenuCallback(object sender, EventArgs e) + { + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + + this.RefreshSourceDetail(tabPage.Tag as BillSourceUnionModel); + } + + + + + + /// + /// 说明:分割条移动保存位置 + /// 创建人:龚宇超 + /// 创建日期:2018-03-06 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnMainSplitterMoved(object sender, EventArgs e) + { + if (this._isInitFinish) + { + IniHelper.Write(string.Format("bill_height_{0}", this.SysModel.ModuleCode), this.ssc_main.SplitterPosition + ""); + } + } + /// + /// 说明:明细分割条移动保存位置 + /// 创建人:龚宇超 + /// 创建日期:2018-03-06 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnDetailsSplitterMoved(object sender, EventArgs e) + { + if (this._isInitFinish) + { + SplitContainerControl splitContainerControl = sender as SplitContainerControl; + IniHelper.Write(string.Format("bill_Details_Width_{0}", this.SysModel.ModuleCode), splitContainerControl.SplitterPosition + ""); + } + } + /// + /// 说明:单据来源查询之前处理 + /// 创建人:龚宇超 + /// 创建日期:2018-03-06 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The e. + private void OnSearchBefore(object sender, SearchArgs e) + { + + // 用户搜索时不加载右侧控件值,只有点击、人为选中行在加载右侧控件值. + this._isLoadRightControlValue = false; + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + BillSourceUnionModel unionModel = tabPage.Tag as BillSourceUnionModel; + if (!unionModel.SearchObj.VerifyNull()) + { + e.Continue = false; + } + } + /// + /// 说明:单据来源查询完成 + /// 创建人:龚宇超 + /// 创建日期:2018-03-06 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + /// + private void OnSearchAfterd(object sender, EventArgs e) + { + this._isLoadRightControlValue = true; + + XtraTabPage tabPage = this.xtc_main_container.SelectedTabPage; + BillSourceUnionModel unionModel = tabPage.Tag as BillSourceUnionModel; + if (unionModel.ModelObj.SourceType == 1) + { + if (unionModel.TreeViewObj != null && unionModel.SearchObj.MainGridEx != null) + { + string sql = ReplaceHelper.ReplaceUserInfo(unionModel.SearchObj.MainGridEx.LastSearchSql); + + //和上一次查询sql相同就不再次查询了 + if (!unionModel.SearchObj.MainGridEx.LastSearchSql.Equals(sql)) + { + unionModel.SearchObj.MainGridEx.SetGridViewDataSource(BaseImpl.GetDataTableResult(sql)); + } + } + } + else + { + if (unionModel.GridControlObj != null) + { + + string sql = ReplaceHelper.ReplaceUserInfo(unionModel.GridControlObj.LastSearchSql); + + if (SubstringCount(sql, "#") > 1) + { + string fixedSql = sql.Substring(sql.IndexOf('#'), sql.LastIndexOf('#') + 1 - sql.IndexOf('#')); + string billMainCode = sql.Substring(sql.IndexOf('#'), sql.LastIndexOf('#') + 1 - sql.IndexOf('#')).Replace("#", ""); + var paramList = ReplaceHelper.GetParamFields(billMainCode); + bool isCondReplace = true; + foreach (string item in paramList) + { + string field = item.Replace("{", "").Replace("}", ""); + if (ControlObj.FindControl(field) != null) + { + string value = ControlObj.GetControlValue(field); + if (string.IsNullOrEmpty(value)) isCondReplace = false; + billMainCode = billMainCode.Replace(item, value); + } + } + if (!isCondReplace) + { + sql = sql.Replace(fixedSql, "1=1"); + } + else + { + sql = sql.Replace(fixedSql, billMainCode); + + } + } + int oldRowHandle = 0; + if (unionModel.GridControlObj.GridView != null) + { + oldRowHandle = unionModel.GridControlObj.GridView.FocusedRowHandle; + } + + //和上一次查询sql相同就不再次查询了 + if (!unionModel.GridControlObj.LastSearchSql.Equals(sql)) + { + unionModel.GridControlObj.gridControl.DataSource = BaseImpl.GetDataTableResult(sql); + unionModel.GridControlObj.GridView.SelectRowHandler(oldRowHandle); + } + + //如果没有数据,显示 (0条) + //(unionModel.ModelObj.SourceType == 0 || this.IsBillShowCount) && unionModel.SearchObj.GridRowCount > 0 + if (unionModel.ModelObj.SourceType == 0 || this.IsBillShowCount) tabPage.Text = unionModel.ModelObj.UserName + "(" + unionModel.SearchObj.GridRowCount + QuantitySuffix; + + RefreshSourceDetail(unionModel); + } + + } + + } + /// + /// 说明:判断字符串出现次数 + /// 创建人:龚宇超 + /// 创建日期: + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The string. + /// The substring. + /// System.Int32. + private static int SubstringCount(string str, string substring) + { + if (str.Contains(substring)) + { + string strReplaced = str.Replace(substring, ""); + return (str.Length - strReplaced.Length) / substring.Length; + } + + return 0; + } + + + #endregion + + + + #region + + private void tb_buttom_Load(object sender, EventArgs e) + { + + } + #endregion + + + + + + + + /// + /// 说明:检查可用条件 + /// 创建人:龚宇超 + /// 创建日期:2017-11-09 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The cond. + /// The data row. + /// true if XXXX, false otherwise. + private bool ValidateCond(string cond, DataRow dataRow) + { + bool result = false; + string condition = cond; + try + { + if (string.IsNullOrWhiteSpace(cond)) return true;//如果值是空格或者空行,默认正确 + cond = ReplaceHelper.ReplaceRowParam(dataRow, cond); + if (cond.StartsWith("@") || cond.StartsWith("!")) + { + result = "1".Equals(BaseImpl.GetDefaultValue(cond)); + } + else if (dataRow == null) + { + result = ReplaceHelper.EvalCond(cond); + } + else + { + result = ReplaceHelper.ReplaceRowParamCond(dataRow, cond); + } + return result; + } + catch (Exception ex) + { + + } + return result; + } + + + /// + /// 设置打印按钮条件 + /// + /// + public bool SetPrintButton(DataRow rowItem) + { + try + { + bool result = false; + //判断打印按钮条件 + if (!string.IsNullOrWhiteSpace(this.BillModel.PrintingConditions)) + { + if (rowItem == null) return result; + + string cond = ReplaceHelper.ReplaceRowParam(rowItem, this.BillModel.PrintingConditions); + if (cond.StartsWith("@") || cond.StartsWith("!")) + { + result = "1".Equals(BaseImpl.GetDefaultValue(cond)); + } + else + { + result = ReplaceHelper.ReplaceRowParamCond(rowItem, cond); + } + return result; + } + else + { + return true; + } + } + catch (Exception ex) + { + return false; + } + } + + + + + + + } +} \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/BillModule.resx b/插件库/Lskj.PubBillManagement/BillModule.resx new file mode 100644 index 0000000..d11908a --- /dev/null +++ b/插件库/Lskj.PubBillManagement/BillModule.resx @@ -0,0 +1,141 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 642, 21 + + + 59 + + + 1078, 23 + + + 873, 21 + + + 983, 21 + + + 773, 21 + + + 548, 21 + + \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/DllBaseClass.cs b/插件库/Lskj.PubBillManagement/DllBaseClass.cs new file mode 100644 index 0000000..98fd4f2 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/DllBaseClass.cs @@ -0,0 +1,64 @@ +/****************************** +* 说明:单据模版入口 +* 创建人:龚宇超 +* 创建日期:2017-11-23 +* 修改人: +* 修改日期: +* 修改备注: +* 版本:1.0.0.0 +******************************/ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Lskj.Util; +using System.Windows.Forms; +using Lskj.Model; +using Lskj.Business; +using Lskj.Business.Impl; +using System.Collections; + +namespace Lskj.PubBillManagement +{ + /// + /// 单据模版入口 + /// + public class DllBaseClass : IForm + { + public DllBaseClass() + { + + } + + public DllBaseClass(string[] obj) + { + try + { + FrmMain main = new FrmMain(); + DynamicBillModel moduleModel = new DynamicBillModel(obj); + main.SysModel = moduleModel; + moduleModel.DataCaches = new Dictionary(); + if (SystemInfo.Instance.OptimizationSpeed) main.GetDataCaches(moduleModel.DataCaches); + GridEnum gridEnum = GridEnum.GridView; + if (!moduleModel.DataCaches.GetValue(main, "FormType", out int formType)) + { + formType = BaseImpl.GetBillDetailType(moduleModel.ModuleCode); + } + if (formType == 1) + { + gridEnum = GridEnum.BandedGridView; + } + main.SysModel.GridEnumObj = gridEnum; + this.SubForm = main; + + } + catch (Exception ex) + { + LogUtil.WriteError("Lskj.PubBillManagement.dll--参数错误-->" + obj.ToString(), ex); + } + + } + + public Form SubForm { get; set; } + } +} diff --git a/插件库/Lskj.PubBillManagement/FrmAdd.Designer.cs b/插件库/Lskj.PubBillManagement/FrmAdd.Designer.cs new file mode 100644 index 0000000..69a4591 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmAdd.Designer.cs @@ -0,0 +1,81 @@ + +namespace Lskj.PubBillManagement +{ + partial class FrmAdd + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.txtEdit = new DevExpress.XtraEditors.TextEdit(); + this.label1 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.txtEdit.Properties)).BeginInit(); + this.SuspendLayout(); + // + // txtEdit + // + this.txtEdit.EditValue = "1"; + this.txtEdit.Location = new System.Drawing.Point(12, 39); + this.txtEdit.Name = "txtEdit"; + this.txtEdit.Properties.Appearance.Font = new System.Drawing.Font("微软雅黑", 12F); + this.txtEdit.Properties.Appearance.Options.UseFont = true; + this.txtEdit.Size = new System.Drawing.Size(198, 28); + this.txtEdit.TabIndex = 25; + this.txtEdit.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtEdit_KeyDown); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(10, 14); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(77, 12); + this.label1.TabIndex = 22; + this.label1.Text = "请输入数量:"; + // + // FrmAddRole + // + this.Appearance.BackColor = System.Drawing.SystemColors.Control; + this.Appearance.Options.UseBackColor = true; + this.Appearance.Options.UseFont = true; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(219, 96); + this.Controls.Add(this.txtEdit); + this.Controls.Add(this.label1); + this.Margin = new System.Windows.Forms.Padding(2); + this.Name = "FrmAddRole"; + this.Text = ""; + ((System.ComponentModel.ISupportInitialize)(this.txtEdit.Properties)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private DevExpress.XtraEditors.TextEdit txtEdit; + private System.Windows.Forms.Label label1; + } +} \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmAdd.cs b/插件库/Lskj.PubBillManagement/FrmAdd.cs new file mode 100644 index 0000000..e1f6d26 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmAdd.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Lskj.Control; +using Lskj.Business; +using Lskj.Business.Impl; + +namespace Lskj.PubBillManagement +{ + public partial class FrmAdd : BaseForm + { + public int Quantity; + public Label LabelObj { get { return label1; } } + + public FrmAdd() + { + InitializeComponent(); + } + + /// + /// 说明:确定事件 + /// 创建人:龚宇超 + /// 创建日期:2019-06-21 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + void OnBtnOKClick(object sender, EventArgs e) + { + try + { + string text=this.txtEdit.Text; + if (string.IsNullOrWhiteSpace(text)) text = "0"; + if (!this.IsDigitsOnly(text)) + { + MessageUtil.Show("请输入数字"); + } + + this.Quantity = int.Parse(text); + this.Close(); + this.DialogResult = System.Windows.Forms.DialogResult.OK; + } + catch (Exception ex) + { + LogUtil.WriteError("确定事件出错!", ex); + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + } + + + } + /// + /// 说明:取消事件 + /// 创建人:龚宇超 + /// 创建日期:2019-06-21 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + void OnBtnCancelClick(object sender, EventArgs e) + { + this.Close(); + } + + + bool IsDigitsOnly(string input) + { + foreach (char c in input) + { + if (!char.IsDigit(c)) + return false; + } + return true; + } + + private void txtEdit_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + string text = this.txtEdit.Text; + + if (string.IsNullOrWhiteSpace(text)) return; + + if (!this.IsDigitsOnly(text)) + { + MessageUtil.Show("请输入数字"); + } + if (int.Parse(text) > 0) + { + this.Quantity = int.Parse(text); + this.Close(); + this.DialogResult = System.Windows.Forms.DialogResult.OK; + } + else + { + MessageUtil.Show("请检查输入数量"); + } + } + } + } +} diff --git a/插件库/Lskj.PubBillManagement/FrmAdd.resx b/插件库/Lskj.PubBillManagement/FrmAdd.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmAdd.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmBill.Designer.cs b/插件库/Lskj.PubBillManagement/FrmBill.Designer.cs new file mode 100644 index 0000000..05622db --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmBill.Designer.cs @@ -0,0 +1,639 @@ + +namespace Lskj.PubBillManagement +{ + partial class FrmBill + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.pl_main = new DevExpress.XtraEditors.PanelControl(); + this.pl_main_center = new DevExpress.XtraEditors.PanelControl(); + this.pl_main_center_detail = new DevExpress.XtraEditors.PanelControl(); + this.gcMain = new Lskj.Control.GridControlEx(); + this.pl_main_center_master = new DevExpress.XtraEditors.XtraScrollableControl(); + this.pl_main_bottom = new DevExpress.XtraEditors.PanelControl(); + this.dbpFP = new DevExpress.XtraEditors.DropDownButton(); + this.btnRefresh = new DevExpress.XtraEditors.SimpleButton(); + this.btnHiding = new DevExpress.XtraEditors.SimpleButton(); + this.btnHelp = new DevExpress.XtraEditors.SimpleButton(); + this.pl_templete = new DevExpress.XtraEditors.PanelControl(); + this.cb_templete = new DevExpress.XtraEditors.ComboBoxEdit(); + this.lbl_templete = new DevExpress.XtraEditors.LabelControl(); + this.pl_input = new DevExpress.XtraEditors.PanelControl(); + this.cb_input = new DevExpress.XtraEditors.ComboBoxEdit(); + this.txt_input = new DevExpress.XtraEditors.TextEdit(); + this.labelControl2 = new DevExpress.XtraEditors.LabelControl(); + this.btn_input = new DevExpress.XtraEditors.SimpleButton(); + this.dpbImport = new DevExpress.XtraEditors.DropDownButton(); + this.btnBillAdd = new DevExpress.XtraEditors.SimpleButton(); + this.btnBillApply = new DevExpress.XtraEditors.SimpleButton(); + this.dpCopyBill = new DevExpress.XtraEditors.DropDownButton(); + this.btnPrint = new DevExpress.XtraEditors.DropDownButton(); + this.dpbTools = new DevExpress.XtraEditors.DropDownButton(); + this.btnDelete = new DevExpress.XtraEditors.SimpleButton(); + this.btnBillSave = new DevExpress.XtraEditors.SimpleButton(); + this.pl_main_top = new DevExpress.XtraEditors.PanelControl(); + this.pl_main_top_center = new DevExpress.XtraEditors.PanelControl(); + this.lbTitle = new System.Windows.Forms.Label(); + this.pl_main_top_right = new DevExpress.XtraEditors.PanelControl(); + this.lblOrderNo = new DevExpress.XtraEditors.LabelControl(); + this.labelControl1 = new DevExpress.XtraEditors.LabelControl(); + this.pl_main_top_left = new DevExpress.XtraEditors.PanelControl(); + this.pl_red = new DevExpress.XtraEditors.PanelControl(); + this.rdRed = new System.Windows.Forms.RadioButton(); + this.pl_blue = new DevExpress.XtraEditors.PanelControl(); + this.rdBlue = new System.Windows.Forms.RadioButton(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main)).BeginInit(); + this.pl_main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_center)).BeginInit(); + this.pl_main_center.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_center_detail)).BeginInit(); + this.pl_main_center_detail.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_bottom)).BeginInit(); + this.pl_main_bottom.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_templete)).BeginInit(); + this.pl_templete.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.cb_templete.Properties)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pl_input)).BeginInit(); + this.pl_input.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.cb_input.Properties)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txt_input.Properties)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_top)).BeginInit(); + this.pl_main_top.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_top_center)).BeginInit(); + this.pl_main_top_center.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_top_right)).BeginInit(); + this.pl_main_top_right.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_top_left)).BeginInit(); + this.pl_main_top_left.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_red)).BeginInit(); + this.pl_red.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_blue)).BeginInit(); + this.pl_blue.SuspendLayout(); + this.SuspendLayout(); + // + // pl_main + // + this.pl_main.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_main.Appearance.Options.UseBackColor = true; + this.pl_main.Controls.Add(this.pl_main_center); + this.pl_main.Controls.Add(this.pl_main_bottom); + this.pl_main.Controls.Add(this.pl_main_top); + this.pl_main.Dock = System.Windows.Forms.DockStyle.Fill; + this.pl_main.Location = new System.Drawing.Point(0, 0); + this.pl_main.Name = "pl_main"; + this.pl_main.Size = new System.Drawing.Size(1260, 613); + this.pl_main.TabIndex = 2; + // + // pl_main_center + // + this.pl_main_center.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_main_center.Appearance.Options.UseBackColor = true; + this.pl_main_center.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_main_center.Controls.Add(this.pl_main_center_detail); + this.pl_main_center.Controls.Add(this.pl_main_center_master); + this.pl_main_center.Dock = System.Windows.Forms.DockStyle.Fill; + this.pl_main_center.Location = new System.Drawing.Point(2, 40); + this.pl_main_center.Name = "pl_main_center"; + this.pl_main_center.Size = new System.Drawing.Size(1256, 534); + this.pl_main_center.TabIndex = 2; + // + // pl_main_center_detail + // + this.pl_main_center_detail.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_main_center_detail.Appearance.Options.UseBackColor = true; + this.pl_main_center_detail.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_main_center_detail.Controls.Add(this.gcMain); + this.pl_main_center_detail.Dock = System.Windows.Forms.DockStyle.Fill; + this.pl_main_center_detail.Location = new System.Drawing.Point(0, 164); + this.pl_main_center_detail.Name = "pl_main_center_detail"; + this.pl_main_center_detail.Size = new System.Drawing.Size(1256, 370); + this.pl_main_center_detail.TabIndex = 5; + // + // gcMain + // + this.gcMain.AdapterObj = null; + this.gcMain.BackColor = System.Drawing.Color.Transparent; + this.gcMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.gcMain.Location = new System.Drawing.Point(0, 0); + this.gcMain.Margin = new System.Windows.Forms.Padding(5); + this.gcMain.Name = "gcMain"; + this.gcMain.SiftEnumObj = Lskj.Control.GridControlEx.HeaderSiftEnum.Sum; + this.gcMain.Size = new System.Drawing.Size(1256, 370); + this.gcMain.SysModel = null; + this.gcMain.TabIndex = 0; + // + // pl_main_center_master + // + this.pl_main_center_master.AutoScroll = false; + this.pl_main_center_master.Dock = System.Windows.Forms.DockStyle.Top; + this.pl_main_center_master.Location = new System.Drawing.Point(0, 0); + this.pl_main_center_master.Name = "pl_main_center_master"; + this.pl_main_center_master.Size = new System.Drawing.Size(1256, 164); + this.pl_main_center_master.TabIndex = 6; + // + // pl_main_bottom + // + this.pl_main_bottom.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_main_bottom.Appearance.Options.UseBackColor = true; + this.pl_main_bottom.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_main_bottom.Controls.Add(this.dbpFP); + this.pl_main_bottom.Controls.Add(this.btnRefresh); + this.pl_main_bottom.Controls.Add(this.btnHiding); + this.pl_main_bottom.Controls.Add(this.btnHelp); + this.pl_main_bottom.Controls.Add(this.pl_templete); + this.pl_main_bottom.Controls.Add(this.pl_input); + this.pl_main_bottom.Controls.Add(this.dpbImport); + this.pl_main_bottom.Controls.Add(this.btnBillAdd); + this.pl_main_bottom.Controls.Add(this.btnBillApply); + this.pl_main_bottom.Controls.Add(this.dpCopyBill); + this.pl_main_bottom.Controls.Add(this.btnPrint); + this.pl_main_bottom.Controls.Add(this.dpbTools); + this.pl_main_bottom.Controls.Add(this.btnDelete); + this.pl_main_bottom.Controls.Add(this.btnBillSave); + this.pl_main_bottom.Dock = System.Windows.Forms.DockStyle.Bottom; + this.pl_main_bottom.Location = new System.Drawing.Point(2, 574); + this.pl_main_bottom.Name = "pl_main_bottom"; + this.pl_main_bottom.Size = new System.Drawing.Size(1256, 37); + this.pl_main_bottom.TabIndex = 1; + // + // dbpFP + // + this.dbpFP.AllowFocus = false; + this.dbpFP.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.dbpFP.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.dbpFP.Appearance.Options.UseFont = true; + this.dbpFP.Location = new System.Drawing.Point(395, 7); + this.dbpFP.Name = "dbpFP"; + this.dbpFP.Size = new System.Drawing.Size(58, 26); + this.dbpFP.TabIndex = 34; + this.dbpFP.Text = "分配"; + // + // btnRefresh + // + this.btnRefresh.AllowFocus = false; + this.btnRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnRefresh.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnRefresh.Appearance.Options.UseFont = true; + this.btnRefresh.Location = new System.Drawing.Point(459, 7); + this.btnRefresh.Name = "btnRefresh"; + this.btnRefresh.Size = new System.Drawing.Size(74, 26); + this.btnRefresh.TabIndex = 33; + this.btnRefresh.Text = "刷新列数据"; + // + // btnHiding + // + this.btnHiding.AllowFocus = false; + this.btnHiding.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnHiding.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnHiding.Appearance.Options.UseFont = true; + this.btnHiding.Location = new System.Drawing.Point(535, 7); + this.btnHiding.Name = "btnHiding"; + this.btnHiding.Size = new System.Drawing.Size(67, 26); + this.btnHiding.TabIndex = 32; + this.btnHiding.Text = "隐藏主表"; + this.btnHiding.Visible = false; + // + // btnHelp + // + this.btnHelp.AllowFocus = false; + this.btnHelp.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnHelp.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnHelp.Appearance.Options.UseFont = true; + this.btnHelp.Location = new System.Drawing.Point(604, 7); + this.btnHelp.Name = "btnHelp"; + this.btnHelp.Size = new System.Drawing.Size(67, 26); + this.btnHelp.TabIndex = 30; + this.btnHelp.Text = "帮助文档"; + // + // pl_templete + // + this.pl_templete.Controls.Add(this.cb_templete); + this.pl_templete.Controls.Add(this.lbl_templete); + this.pl_templete.Location = new System.Drawing.Point(3, 3); + this.pl_templete.LookAndFeel.SkinName = "VS2010"; + this.pl_templete.LookAndFeel.Style = DevExpress.LookAndFeel.LookAndFeelStyle.Style3D; + this.pl_templete.Name = "pl_templete"; + this.pl_templete.Size = new System.Drawing.Size(195, 29); + this.pl_templete.TabIndex = 29; + this.pl_templete.Visible = false; + // + // cb_templete + // + this.cb_templete.Location = new System.Drawing.Point(58, 4); + this.cb_templete.Name = "cb_templete"; + this.cb_templete.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { + new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)}); + this.cb_templete.Properties.DropDownRows = 8; + this.cb_templete.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor; + this.cb_templete.Size = new System.Drawing.Size(133, 20); + this.cb_templete.TabIndex = 19; + // + // lbl_templete + // + this.lbl_templete.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lbl_templete.Location = new System.Drawing.Point(5, 8); + this.lbl_templete.Name = "lbl_templete"; + this.lbl_templete.Size = new System.Drawing.Size(48, 12); + this.lbl_templete.TabIndex = 16; + this.lbl_templete.Text = "选择模版"; + // + // pl_input + // + this.pl_input.Controls.Add(this.cb_input); + this.pl_input.Controls.Add(this.txt_input); + this.pl_input.Controls.Add(this.labelControl2); + this.pl_input.Controls.Add(this.btn_input); + this.pl_input.Location = new System.Drawing.Point(3, 3); + this.pl_input.LookAndFeel.SkinName = "VS2010"; + this.pl_input.LookAndFeel.Style = DevExpress.LookAndFeel.LookAndFeelStyle.Style3D; + this.pl_input.Name = "pl_input"; + this.pl_input.Size = new System.Drawing.Size(280, 29); + this.pl_input.TabIndex = 27; + this.pl_input.Visible = false; + // + // cb_input + // + this.cb_input.Location = new System.Drawing.Point(58, 4); + this.cb_input.Name = "cb_input"; + this.cb_input.Properties.Buttons.AddRange(new DevExpress.XtraEditors.Controls.EditorButton[] { + new DevExpress.XtraEditors.Controls.EditorButton(DevExpress.XtraEditors.Controls.ButtonPredefines.Combo)}); + this.cb_input.Properties.DropDownRows = 8; + this.cb_input.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.DisableTextEditor; + this.cb_input.Size = new System.Drawing.Size(79, 20); + this.cb_input.TabIndex = 19; + // + // txt_input + // + this.txt_input.Location = new System.Drawing.Point(149, 4); + this.txt_input.Name = "txt_input"; + this.txt_input.Properties.Appearance.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.txt_input.Properties.Appearance.Options.UseFont = true; + this.txt_input.Size = new System.Drawing.Size(98, 20); + this.txt_input.TabIndex = 18; + // + // labelControl2 + // + this.labelControl2.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.labelControl2.Location = new System.Drawing.Point(5, 8); + this.labelControl2.Name = "labelControl2"; + this.labelControl2.Size = new System.Drawing.Size(48, 12); + this.labelControl2.TabIndex = 16; + this.labelControl2.Text = "快速录入"; + // + // btn_input + // + this.btn_input.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btn_input.Appearance.Options.UseFont = true; + this.btn_input.Location = new System.Drawing.Point(249, 4); + this.btn_input.Name = "btn_input"; + this.btn_input.Size = new System.Drawing.Size(27, 21); + this.btn_input.TabIndex = 13; + this.btn_input.Text = ">>"; + // + // dpbImport + // + this.dpbImport.AllowFocus = false; + this.dpbImport.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.dpbImport.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.dpbImport.Appearance.Options.UseFont = true; + this.dpbImport.DropDownArrowStyle = DevExpress.XtraEditors.DropDownArrowStyle.Show; + this.dpbImport.Location = new System.Drawing.Point(749, 7); + this.dpbImport.Name = "dpbImport"; + this.dpbImport.Size = new System.Drawing.Size(74, 26); + this.dpbImport.TabIndex = 26; + this.dpbImport.Text = "导入导出"; + // + // btnBillAdd + // + this.btnBillAdd.AllowFocus = false; + this.btnBillAdd.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnBillAdd.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnBillAdd.Appearance.Options.UseFont = true; + this.btnBillAdd.Location = new System.Drawing.Point(901, 7); + this.btnBillAdd.Name = "btnBillAdd"; + this.btnBillAdd.Size = new System.Drawing.Size(67, 26); + this.btnBillAdd.TabIndex = 19; + this.btnBillAdd.Text = "新建单据"; + // + // btnBillApply + // + this.btnBillApply.AllowFocus = false; + this.btnBillApply.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnBillApply.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnBillApply.Appearance.Options.UseFont = true; + this.btnBillApply.Location = new System.Drawing.Point(1108, 7); + this.btnBillApply.Name = "btnBillApply"; + this.btnBillApply.Size = new System.Drawing.Size(67, 26); + this.btnBillApply.TabIndex = 25; + this.btnBillApply.Text = "保存提交"; + // + // dpCopyBill + // + this.dpCopyBill.AllowFocus = false; + this.dpCopyBill.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.dpCopyBill.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.dpCopyBill.Appearance.Options.UseFont = true; + this.dpCopyBill.DropDownArrowStyle = DevExpress.XtraEditors.DropDownArrowStyle.Show; + this.dpCopyBill.Location = new System.Drawing.Point(825, 7); + this.dpCopyBill.Name = "dpCopyBill"; + this.dpCopyBill.Size = new System.Drawing.Size(74, 26); + this.dpCopyBill.TabIndex = 24; + this.dpCopyBill.Text = "复制单据"; + // + // btnPrint + // + this.btnPrint.AllowFocus = false; + this.btnPrint.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnPrint.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnPrint.Appearance.Options.UseFont = true; + this.btnPrint.DropDownArrowStyle = DevExpress.XtraEditors.DropDownArrowStyle.Show; + this.btnPrint.Location = new System.Drawing.Point(1177, 7); + this.btnPrint.Name = "btnPrint"; + this.btnPrint.Size = new System.Drawing.Size(74, 26); + this.btnPrint.TabIndex = 23; + this.btnPrint.Text = "打印单据"; + // + // dpbTools + // + this.dpbTools.AllowFocus = false; + this.dpbTools.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.dpbTools.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.dpbTools.Appearance.Options.UseFont = true; + this.dpbTools.DropDownArrowStyle = DevExpress.XtraEditors.DropDownArrowStyle.Show; + this.dpbTools.Location = new System.Drawing.Point(673, 7); + this.dpbTools.Name = "dpbTools"; + this.dpbTools.Size = new System.Drawing.Size(74, 26); + this.dpbTools.TabIndex = 22; + this.dpbTools.Text = "常用工具"; + // + // btnDelete + // + this.btnDelete.AllowFocus = false; + this.btnDelete.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnDelete.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnDelete.Appearance.Options.UseFont = true; + this.btnDelete.Location = new System.Drawing.Point(970, 7); + this.btnDelete.Name = "btnDelete"; + this.btnDelete.Size = new System.Drawing.Size(67, 26); + this.btnDelete.TabIndex = 20; + this.btnDelete.Text = "删除记录"; + // + // btnBillSave + // + this.btnBillSave.AllowFocus = false; + this.btnBillSave.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnBillSave.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnBillSave.Appearance.Options.UseFont = true; + this.btnBillSave.Location = new System.Drawing.Point(1039, 7); + this.btnBillSave.Name = "btnBillSave"; + this.btnBillSave.Size = new System.Drawing.Size(67, 26); + this.btnBillSave.TabIndex = 21; + this.btnBillSave.Text = "保存单据"; + // + // pl_main_top + // + this.pl_main_top.Appearance.BackColor = System.Drawing.SystemColors.Control; + this.pl_main_top.Appearance.Options.UseBackColor = true; + this.pl_main_top.Controls.Add(this.pl_main_top_center); + this.pl_main_top.Controls.Add(this.pl_main_top_right); + this.pl_main_top.Controls.Add(this.pl_main_top_left); + this.pl_main_top.Dock = System.Windows.Forms.DockStyle.Top; + this.pl_main_top.Location = new System.Drawing.Point(2, 2); + this.pl_main_top.Name = "pl_main_top"; + this.pl_main_top.Size = new System.Drawing.Size(1256, 38); + this.pl_main_top.TabIndex = 0; + // + // pl_main_top_center + // + this.pl_main_top_center.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_main_top_center.Appearance.Options.UseBackColor = true; + this.pl_main_top_center.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_main_top_center.Controls.Add(this.lbTitle); + this.pl_main_top_center.Dock = System.Windows.Forms.DockStyle.Fill; + this.pl_main_top_center.Location = new System.Drawing.Point(162, 2); + this.pl_main_top_center.Name = "pl_main_top_center"; + this.pl_main_top_center.Size = new System.Drawing.Size(902, 34); + this.pl_main_top_center.TabIndex = 3; + // + // lbTitle + // + this.lbTitle.BackColor = System.Drawing.Color.Transparent; + this.lbTitle.Dock = System.Windows.Forms.DockStyle.Fill; + this.lbTitle.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.lbTitle.ForeColor = System.Drawing.Color.Blue; + this.lbTitle.Location = new System.Drawing.Point(0, 0); + this.lbTitle.Name = "lbTitle"; + this.lbTitle.Size = new System.Drawing.Size(902, 34); + this.lbTitle.TabIndex = 1; + this.lbTitle.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + // + // pl_main_top_right + // + this.pl_main_top_right.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_main_top_right.Appearance.Options.UseBackColor = true; + this.pl_main_top_right.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_main_top_right.Controls.Add(this.lblOrderNo); + this.pl_main_top_right.Controls.Add(this.labelControl1); + this.pl_main_top_right.Dock = System.Windows.Forms.DockStyle.Right; + this.pl_main_top_right.Location = new System.Drawing.Point(1064, 2); + this.pl_main_top_right.Name = "pl_main_top_right"; + this.pl_main_top_right.Size = new System.Drawing.Size(190, 34); + this.pl_main_top_right.TabIndex = 2; + // + // lblOrderNo + // + this.lblOrderNo.Appearance.BackColor = System.Drawing.Color.Transparent; + this.lblOrderNo.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Underline); + this.lblOrderNo.Appearance.ForeColor = System.Drawing.Color.Blue; + this.lblOrderNo.Location = new System.Drawing.Point(67, 19); + this.lblOrderNo.Name = "lblOrderNo"; + this.lblOrderNo.Size = new System.Drawing.Size(90, 12); + this.lblOrderNo.TabIndex = 1; + this.lblOrderNo.Text = "XTC170112010001"; + // + // labelControl1 + // + this.labelControl1.Appearance.BackColor = System.Drawing.Color.Transparent; + this.labelControl1.Appearance.Font = new System.Drawing.Font("宋体", 9F); + this.labelControl1.Appearance.ForeColor = System.Drawing.Color.Blue; + this.labelControl1.Location = new System.Drawing.Point(7, 19); + this.labelControl1.Name = "labelControl1"; + this.labelControl1.Size = new System.Drawing.Size(54, 12); + this.labelControl1.TabIndex = 0; + this.labelControl1.Text = "单据编号:"; + // + // pl_main_top_left + // + this.pl_main_top_left.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_main_top_left.Appearance.Options.UseBackColor = true; + this.pl_main_top_left.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_main_top_left.Controls.Add(this.pl_red); + this.pl_main_top_left.Controls.Add(this.pl_blue); + this.pl_main_top_left.Dock = System.Windows.Forms.DockStyle.Left; + this.pl_main_top_left.Location = new System.Drawing.Point(2, 2); + this.pl_main_top_left.Name = "pl_main_top_left"; + this.pl_main_top_left.Size = new System.Drawing.Size(160, 34); + this.pl_main_top_left.TabIndex = 1; + // + // pl_red + // + this.pl_red.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_red.Appearance.Options.UseBackColor = true; + this.pl_red.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_red.Controls.Add(this.rdRed); + this.pl_red.Dock = System.Windows.Forms.DockStyle.Left; + this.pl_red.Location = new System.Drawing.Point(80, 0); + this.pl_red.Name = "pl_red"; + this.pl_red.Size = new System.Drawing.Size(80, 34); + this.pl_red.TabIndex = 3; + // + // rdRed + // + this.rdRed.AutoSize = true; + this.rdRed.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.rdRed.ForeColor = System.Drawing.Color.Red; + this.rdRed.Location = new System.Drawing.Point(6, 12); + this.rdRed.Name = "rdRed"; + this.rdRed.Size = new System.Drawing.Size(71, 16); + this.rdRed.TabIndex = 3; + this.rdRed.Text = "红字单据"; + this.rdRed.UseVisualStyleBackColor = true; + // + // pl_blue + // + this.pl_blue.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_blue.Appearance.Options.UseBackColor = true; + this.pl_blue.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_blue.Controls.Add(this.rdBlue); + this.pl_blue.Dock = System.Windows.Forms.DockStyle.Left; + this.pl_blue.Location = new System.Drawing.Point(0, 0); + this.pl_blue.Name = "pl_blue"; + this.pl_blue.Size = new System.Drawing.Size(80, 34); + this.pl_blue.TabIndex = 2; + // + // rdBlue + // + this.rdBlue.AutoSize = true; + this.rdBlue.Checked = true; + this.rdBlue.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134))); + this.rdBlue.ForeColor = System.Drawing.Color.Blue; + this.rdBlue.Location = new System.Drawing.Point(7, 12); + this.rdBlue.Name = "rdBlue"; + this.rdBlue.Size = new System.Drawing.Size(71, 16); + this.rdBlue.TabIndex = 2; + this.rdBlue.TabStop = true; + this.rdBlue.Text = "蓝字单据"; + this.rdBlue.UseVisualStyleBackColor = true; + // + // FrmBill + // + this.Appearance.BackColor = System.Drawing.SystemColors.Control; + this.Appearance.Options.UseBackColor = true; + this.Appearance.Options.UseFont = true; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1260, 613); + this.Controls.Add(this.pl_main); + this.Name = "FrmBill"; + this.Text = "FrmBill"; + ((System.ComponentModel.ISupportInitialize)(this.pl_main)).EndInit(); + this.pl_main.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_center)).EndInit(); + this.pl_main_center.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_center_detail)).EndInit(); + this.pl_main_center_detail.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_bottom)).EndInit(); + this.pl_main_bottom.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_templete)).EndInit(); + this.pl_templete.ResumeLayout(false); + this.pl_templete.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.cb_templete.Properties)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pl_input)).EndInit(); + this.pl_input.ResumeLayout(false); + this.pl_input.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.cb_input.Properties)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txt_input.Properties)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_top)).EndInit(); + this.pl_main_top.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_top_center)).EndInit(); + this.pl_main_top_center.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_top_right)).EndInit(); + this.pl_main_top_right.ResumeLayout(false); + this.pl_main_top_right.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main_top_left)).EndInit(); + this.pl_main_top_left.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_red)).EndInit(); + this.pl_red.ResumeLayout(false); + this.pl_red.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_blue)).EndInit(); + this.pl_blue.ResumeLayout(false); + this.pl_blue.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private DevExpress.XtraEditors.PanelControl pl_main; + private DevExpress.XtraEditors.PanelControl pl_main_center; + private DevExpress.XtraEditors.PanelControl pl_main_center_detail; + private Control.GridControlEx gcMain; + private DevExpress.XtraEditors.XtraScrollableControl pl_main_center_master; + public DevExpress.XtraEditors.PanelControl pl_main_bottom; + private DevExpress.XtraEditors.DropDownButton dbpFP; + private DevExpress.XtraEditors.SimpleButton btnRefresh; + private DevExpress.XtraEditors.SimpleButton btnHiding; + private DevExpress.XtraEditors.SimpleButton btnHelp; + private DevExpress.XtraEditors.PanelControl pl_templete; + private DevExpress.XtraEditors.ComboBoxEdit cb_templete; + private DevExpress.XtraEditors.LabelControl lbl_templete; + private DevExpress.XtraEditors.PanelControl pl_input; + private DevExpress.XtraEditors.ComboBoxEdit cb_input; + private DevExpress.XtraEditors.TextEdit txt_input; + private DevExpress.XtraEditors.LabelControl labelControl2; + private DevExpress.XtraEditors.SimpleButton btn_input; + private DevExpress.XtraEditors.DropDownButton dpbImport; + private DevExpress.XtraEditors.SimpleButton btnBillAdd; + private DevExpress.XtraEditors.SimpleButton btnBillApply; + private DevExpress.XtraEditors.DropDownButton dpCopyBill; + private DevExpress.XtraEditors.DropDownButton btnPrint; + private DevExpress.XtraEditors.DropDownButton dpbTools; + private DevExpress.XtraEditors.SimpleButton btnDelete; + private DevExpress.XtraEditors.SimpleButton btnBillSave; + private DevExpress.XtraEditors.PanelControl pl_main_top; + private DevExpress.XtraEditors.PanelControl pl_main_top_center; + private System.Windows.Forms.Label lbTitle; + private DevExpress.XtraEditors.PanelControl pl_main_top_right; + private DevExpress.XtraEditors.LabelControl lblOrderNo; + private DevExpress.XtraEditors.LabelControl labelControl1; + private DevExpress.XtraEditors.PanelControl pl_main_top_left; + private DevExpress.XtraEditors.PanelControl pl_red; + private System.Windows.Forms.RadioButton rdRed; + private DevExpress.XtraEditors.PanelControl pl_blue; + private System.Windows.Forms.RadioButton rdBlue; + } +} \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmBill.cs b/插件库/Lskj.PubBillManagement/FrmBill.cs new file mode 100644 index 0000000..8670557 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmBill.cs @@ -0,0 +1,6638 @@ +using DevExpress.Data; +using DevExpress.Utils; +using DevExpress.XtraBars; +using DevExpress.XtraEditors; +using DevExpress.XtraGrid.Columns; +using DevExpress.XtraGrid.Views.Base; +using DevExpress.XtraGrid.Views.Grid; +using DevExpress.XtraTab; +using DevExpress.XtraTreeList.Columns; +using DevExpress.XtraTreeList.Nodes; +using Lskj.Business; +using Lskj.Business.Impl; +using Lskj.Control; +using Lskj.Control.BrowserSetting; +using Lskj.Control.Model; +using Lskj.Core; +using Lskj.Data; +using Lskj.Model; +using Lskj.PubBillManagement.Model; +using Lskj.Util; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using System; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace Lskj.PubBillManagement +{ + public partial class FrmBill : BaseForm + { + /// + /// 是否为初始化创建 + /// + private bool _isInitFinish; + /// + /// 是否加载右侧控件数据 + /// + private bool _isLoadRightControlValue = true; + /// + /// 是否手动选择了模版 + /// + private bool _isSelectedTemplete; + /// + /// 是否直接打印 + /// + private bool _isExcPrint; + /// + /// 是否选择关联下发 + /// + private bool _isCheck; + /// + /// 主打印Sql + /// + private string _mainPrintSql; + private string guidField = "xxxxx_guid"; + /// + /// 主键字段 + /// + private string mRecordPrimaryField; + /// + /// 单据水印 + /// + private WaterMark _waterMark; + /// + /// 导入单据明细数据、导入单据明细并更新 + /// + private BarButtonItem _itemImport, _itemImportUpdate; + /// + /// 打印主sql中关联打印次数返回条件 + /// + private string _printModeCond; + /// + /// 打印完成后添加数据用到的参数: 表名,列前缀,主键字段,主键值,模块编号,主打印Sql + /// + private List _printSaveParams; + /// + /// 单据明细列 + /// + private DataTable _detailColumns; + private bool IsCopying = false; + + + protected DataRow BillRowItem; + /// + /// 主表控件 + /// + public MyControl ControlObj; + /// + /// 入口参数 + /// + protected DynamicBillModel SysModel; + /// + /// 是否为Brp模版 + /// + /// true if this instance is BRP templete; otherwise, false. + protected bool IsBrpTemplete { get { return SysModel is DynamicBillBrpModel; } } + /// + /// + /// + public BillModel BillModel; + /// + /// 快速扫码控件 + /// + /// The main bottom input object. + public PanelControl MainBottomInputObj { get { return this.pl_input; } } + /// + /// Brp模版控件 + /// + /// The main bottom templete object. + public PanelControl MainBottomTempleteObj { get { return this.pl_templete; } } + /// + /// 明细表格数据 + /// + /// The main bottom templete object. + public GridControlEx gcMainDetilObj { get { return this.gcMain; } } + + /// + /// Brp模版控件 + /// + /// 扫码框 + public TextEdit txtinputobj { get { return this.txt_input; } } + /// + /// 数量名称 + /// + public string NumberMc; + /// + /// 红字单据的分配管理模块 + /// + public string rdRedUnionCode; + /// + /// 蓝字单据的分配管理模块 + /// + public string rdBlueUnionCode; + /// + /// 是否拖拽换行展示 + /// + public bool isDragWrap = true; + /// + /// 是否执行了加载储存过程 + /// + //public bool ProcessExists = false; + /// + /// 保存或修改时报错信息 + /// + public string SaveErrorMessage = string.Empty; + /// + /// 单据明细删除的行 + /// + // private Dictionary ToWithdrawRows = new Dictionary(); + private List> ToWithdrawRows = new List>(); + /// + ///改变颜色行 + /// + private List ChangeColorRow = new List(); + /// + /// + /// + public string AssociatedField = string.Empty; + /// + /// 注册设置公共事件私有类 + /// + private static PubEvenImpl _eventHandler; + /// + /// 注册设置公共事件类 + /// + private static PubEvenImpl eventHandler; + /// + /// 当前人员是否有导出权限 + /// + public bool ExportPermission; + /// + /// 新增 + /// + public string addText = Business.Impl.LanguageTranslation.Translatable ? "(" + Business.Impl.LanguageTranslation.GetTranslatedText("新增") + ")" : "(新增)"; + /// + /// 修改 + /// + public string updateText = Business.Impl.LanguageTranslation.Translatable ? "(" + Business.Impl.LanguageTranslation.GetTranslatedText("修改") + ")" : "(修改)"; + /// + /// 主表动态生成的日期列 + /// + public List DateColumnList = new List(); + /// + /// 主表动态生成的合计列 + /// + public GridColumn SumGridColumn = new GridColumn(); + /// + /// 附加右键菜单集合 + /// + public List itemCommonList = new List(); + /// + /// 是否已经添加了多行汇总 + /// + public bool MultiLineSummary; + /// + /// 扫码框 + /// + public TextEdit ScanCodeTextEdit = null; + /// + /// 当前操作的ImageEdit + /// + private LabelImageEdit _imageEdit; + /// + /// 保存验证条件表 + /// + public DataTable SaveCondTab = new DataTable(); + private BarManager barManager1; + private PopupMenu pMenu; + private PopupMenu pmBillExp; + private PopupMenu pmBill; + private PopupMenu pMprint; + private PopupMenu pmFP; + + /// + /// 单据保存或提交成功后通知来源界面刷新。 + /// + public event EventHandler BillChanged; + + public FrmBill() + { + InitializeComponent(); + InitializeMainEvents(); + } + + public FrmBill(DynamicBillModel model) + : this() + { + OnLoad(model); + } + + private void InitializeMainEvents() + { + this.dbpFP.Click += new EventHandler(this.OnBtnFPOldClick); + this.btnRefresh.Click += new EventHandler(this.btnRefresh_Click); + this.btnHiding.Click += new EventHandler(this.OnMainTableHiding); + this.btnHelp.Click += new EventHandler(this.OnHelpClick); + this.cb_templete.QueryCloseUp += new CancelEventHandler(this.cb_templete_QueryCloseUp); + this.cb_templete.Click += new EventHandler(this.OnTempleteClick); + this.txt_input.KeyDown += new KeyEventHandler(this.OnInputKeyDown); + this.btn_input.Click += new EventHandler(this.OnInputClick); + this.btnBillAdd.Click += new EventHandler(this.OnBillAddClick); + this.btnBillApply.Click += new EventHandler(this.OnBillApplyClick); + this.dpbTools.Click += new EventHandler(this.OnToolsClick); + this.btnDelete.Click += new EventHandler(this.OnDeleteClick); + this.btnBillSave.Click += new EventHandler(this.OnBillSaveClick); + this.lbTitle.Paint += new PaintEventHandler(this.OnLabelTitlePaint); + this.rdRed.Click += new EventHandler(this.OnRedStateClick); + this.rdBlue.Click += new EventHandler(this.OnBlueStateClick); + this.pl_main_center_master.Click += new EventHandler(this.OnMainFocusAfter); + this.KeyDown += new KeyEventHandler(this.OnFrmMainKeyDown); + } + + private void InitializePopupMenus() + { + if (this.barManager1 != null) return; + if (this.components == null) + { + this.components = new Container(); + } + this.barManager1 = new BarManager(this.components); + this.barManager1.Form = this; + this.pmFP = new PopupMenu(this.components) { Manager = this.barManager1 }; + this.pmBillExp = new PopupMenu(this.components) { Manager = this.barManager1 }; + this.pmBill = new PopupMenu(this.components) { Manager = this.barManager1 }; + this.pMprint = new PopupMenu(this.components) { Manager = this.barManager1 }; + this.pMenu = new PopupMenu(this.components) { Manager = this.barManager1 }; + this.dbpFP.DropDownControl = this.pmFP; + this.dpbImport.DropDownControl = this.pmBillExp; + this.dpCopyBill.DropDownControl = this.pmBill; + this.btnPrint.DropDownControl = this.pMprint; + this.dpbTools.DropDownControl = this.pMenu; + this.txt_input.MenuManager = this.barManager1; + } + + protected virtual void OnBillChanged(EventArgs e) + { + EventHandler handler = BillChanged; + if (handler != null) handler(this, e); + } + + /// + /// 说明:窗口加载 + /// 创建人:龚宇超 + /// 创建日期:2017-11-23 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The instance containing the event data. + public void OnLoad(DynamicBillModel Model) + { + try + { + this.SysModel = Model;// 单据动态链接库参数,入口参数 + this._isInitFinish = false;// 是否为初始化创建 + this.pl_main.Visible = false; //获取或设置一个值,该值指示是否显示该控件及其所有子控件。 + //this.ProcessExists = (Lskj.Data.Caches.CacheSYSConfig.Instance().JudgeProcessExists() && SystemInfo.Instance.isExecload); + + if (true)//5.0控件样式 + { + this.pl_main_bottom.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_main_bottom.BackColor = Color.FromArgb(240, 240, 240); + this.pl_main_bottom.LookAndFeel.UseDefaultLookAndFeel = false; + this.pl_main_bottom.LookAndFeel.UseWindowsXPTheme = true; + } + + Dictionary dataCaches = Model != null ? Model.DataCaches : null; + dataCaches.GetValue(this, "DataCaches", out bool _);//等待缓存数据加载完成 + this.InitializeSetting();//初始化系统配置 + this.InitializePopupMenus(); + this.InitializeControl();//初始化控件 + + this.gcMain.GridView.KeyDown += new KeyEventHandler(OnToWithdraw); + this.gcMain.GridView.GridControl.ProcessGridKey += new KeyEventHandler(OnGridControlKye); + + this.gcMain.ExportPermission = this.BillModel.ExportPermission; + + this.CalculateCoordinates(); + + //单据明细推拽 + if (this.BillModel.DraggingOrder && !string.IsNullOrWhiteSpace(this.BillModel.DetailOrderField)) + { + this.gcMain.InitializedragState(this.BillModel.DetailOrderField); + } + + //非中文替换(红蓝单据等固定信息) + if (Business.Impl.LanguageTranslation.Translatable) + { + this.rdBlue.Text = Business.Impl.LanguageTranslation.GetTranslatedText(this.rdBlue.Text); + this.rdRed.Text = Business.Impl.LanguageTranslation.GetTranslatedText(this.rdRed.Text); + this.labelControl1.Text = Business.Impl.LanguageTranslation.GetTranslatedText(this.labelControl1.Text); + } + + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError("单据初始化窗体失败!", ex); + MessageUtil.Show(ex.StackTrace); + } + finally + { + this._isInitFinish = true; + this.pl_main.Visible = true; + if (this.BillModel != null && (this.BillModel.MainVerticalScroll || this.BillModel.MainHorizontalScrolling)) + { + this.pl_main_center_master.AutoScroll = true; + this.pl_main_center_master.VerticalScroll.Visible = this.BillModel.MainVerticalScroll;//隐藏纵向滚动条 + this.pl_main_center_master.HorizontalScroll.Visible = this.BillModel.MainHorizontalScrolling;//隐藏横向滚动条 + } + + } + } + /// + /// 说明:初始化系统配置 + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InitializeSetting() + { + Dictionary dataCaches = SysModel != null ? SysModel.DataCaches : null; + if (!dataCaches.GetValue(this, "BillInfo", out DataRow modelRow)) + { + modelRow = BillImpl.GetBillInfo(this.SysModel.ModuleCode);//获取单个模块信息 + } + if (modelRow == null) + { + //MessageUtil.Show("模块编号[" + this.SysModel.ModuleCode + "],配置错误!\r\n该模块信息未找到!"); + //return; + throw new Exception("模块编号[" + this.SysModel.ModuleCode + "],配置错误!\r\n该模块信息未找到!"); + } + if (!dataCaches.GetValue(this, "BillModel", out BillModel)) + { + this.BillModel = new BillModel(modelRow);//初始化类的新实例。 + } + + if (this.BillModel != null) + { + this.BillModel.TypeName = string.IsNullOrEmpty(SysModel.BillMasterSql) ? this.SysModel.FormText : this.BillModel.TypeName;// 模块名称 + if (!string.IsNullOrWhiteSpace(this.SysModel.DocumentName)) this.BillModel.TypeName = this.SysModel.DocumentName; + + if (!dataCaches.GetValue(this, "MasterPreFix", out string masterPreFix)) + { + masterPreFix = BaseImpl.GetColumnPrefix(this.BillModel.MasterTable);// 主表列前缀 + } + this.BillModel.MasterPreFix = masterPreFix; + if (!dataCaches.GetValue(this, "DetailPreFix", out string detailPreFix)) + { + detailPreFix = BaseImpl.GetColumnPrefix(this.BillModel.DetailTable);// 明细表列前缀 + } + this.BillModel.DetailPreFix = detailPreFix; + this.BillModel.DetailOrderField = this.BillModel.DetailPreFix + "lsidx_id";// 单据来源id + if (SystemInfo.Instance.IsNotBillDetailOrder)//禁用排序 + this.BillModel.DetailOrderField = string.Empty; + } + if (!dataCaches.GetValue(this, "MenuConfigTab", out DataRow menuRow)) + { + menuRow = BaseImpl.GetMenuConfigTab(this.SysModel.ModuleId);//获取菜单其他配置 + } + if (menuRow != null) + { + this.BillModel.BillSourceIds = menuRow.Table.Columns.Contains("BillSourceIds") ? (menuRow["BillSourceIds"] + "").Trim(',') : string.Empty; + this.BillModel.BillFlag = menuRow.Table.Columns.Contains("BillFlag") && !string.IsNullOrEmpty(menuRow["BillFlag"] + "") ? Convert.ToInt32(menuRow["BillFlag"] + "") : -1; + } + if (this.SysModel.HideSource) + { + this.BillModel.PanelWidth = 0; + this.BillModel.PanelHeight = 0; + } + + + //获取打印其他参数 + GetPrintOtherParam(); + if (!dataCaches.GetValue(this, "BillSetting", out bool _)) + { + BillImpl.InitBillSetting(this.BillModel); + } + + if (this.BillModel.IsBrp) + { + this.MainBottomInputObj.Visible = false; + this.MainBottomTempleteObj.Visible = true; + } + + //显示筛选行 + if (this.BillModel.LoadFilter) this.gcMain.GridView.OptionsView.ShowAutoFilterRow = true; + //树表格 + if (this.BillModel.DetailTreeTable) + { + this.pl_main_center_detail.Controls.Clear(); + this.gcMain = new TreeGridControlEx(); + this.gcMain.Dock = DockStyle.Fill; + this.pl_main_center_detail.Controls.Add(this.gcMain); + (this.gcMain as TreeGridControlEx).Expansion = this.BillModel.DetailTreeTableExpansion; + (this.gcMain as TreeGridControlEx).AddRightButton(); + //节点编号 + (this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName = "tap_id"; + //父节点编号 + (this.gcMain as TreeGridControlEx).TreeListObj.ParentFieldName = "tap_pid"; + (this.gcMain as TreeGridControlEx).SortField = this.BillModel.DetailOrderField; + //(this.gcMain as TreeGridControlEx).TreeTableDragCondition = this.BillModel.TreeTableDragCondition; + + (this.gcMain as TreeGridControlEx).InitializedragState(); + } + + + } + /// + /// 说明:初始化分配关联模块 + /// 创建人:王一帆 + /// 创建日期:2020-02-18 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InitializeUnionCode() + { + if (this.BillModel.PopupUnionCode.Contains(",")) + { + string[] UnionCodeSplit = this.BillModel.PopupUnionCode.Split(','); + if (UnionCodeSplit.Length >= 1) + { + this.BillModel.PopupUnionCode = this.BillModel.BillFlag == 1 ? UnionCodeSplit[1] + "" : UnionCodeSplit[0] + ""; + rdBlueUnionCode = UnionCodeSplit[0] + ""; + rdRedUnionCode = UnionCodeSplit[1] + ""; + } + } + else + { + rdBlueUnionCode = rdRedUnionCode = this.BillModel.PopupUnionCode; + } + } + /// + /// 说明:初始化控件 + /// 创建人:龚宇超 + /// 创建日期:2017-11-23 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InitializeControl() + { + if (this.IsBrpTemplete || this.BillModel.IsBrp)// 是否为Brp模版 + this.InitializeTemplete(); + + this.InitializeStatus();//初始化红蓝字单 + this.InitializeOper();//初始化常用操作等功能 + this.InitializeBillInfo();//初始化单据控件信息 + + } + + /// + /// 说明:初始化红蓝字单 + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InitializeStatus() + { + // 初始化红、蓝单 + if (this.BillModel.BillFlag == 0) + { + this.rdBlue.Checked = true; + this.rdRed.Checked = false; + this.lbTitle.ForeColor = Color.Blue; + this.pl_red.Visible = false; + } + if (this.BillModel.BillFlag == 1) + { + this.rdRed.Checked = true; + this.rdBlue.Checked = false; + this.lbTitle.ForeColor = Color.Red; + this.pl_blue.Visible = false; + } + this.dpCopyBill.Enabled = this.BillModel.CanCopy; + this.dpbImport.Enabled = this.BillModel.CanImport || this.BillModel.CanExport; + + if (this.SysModel.HasReadPrivilege()) + this.pl_main_bottom.Enabled = false; + InitializeUnionCode();//根据红蓝字段更新分配 + this.dbpFP.Visible = !string.IsNullOrWhiteSpace(this.BillModel.PopupUnionCode); + } + /// + /// 说明:初始化常用操作等功能 + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InitializeOper() + { + BarButtonItem itemCopyMaster = new BarButtonItem(); + itemCopyMaster.Caption = "复制表头信息"; + itemCopyMaster.ItemClick += new ItemClickEventHandler(OnCopyMasterItemClick); + BarButtonItem itemCopyAll = new BarButtonItem(); + itemCopyAll.Caption = "复制整单信息"; + itemCopyAll.ItemClick += new ItemClickEventHandler(OnCopyAllItemClick); + BarButtonItem itemExport = new BarButtonItem(); + itemExport.Caption = "导出Excel文件"; + itemExport.ItemClick += new ItemClickEventHandler(OnExportItemClick); + BarButtonItem itemFPBatch = new BarButtonItem(); + itemFPBatch.Caption = "批量分配"; + itemFPBatch.ItemClick += new ItemClickEventHandler(OnBtnFPNewClick); + this._itemImport = new BarButtonItem(); + this._itemImport.Caption = "导入Excel文件"; + this._itemImport.ItemClick += new ItemClickEventHandler(OnImportItemClick); + this._itemImportUpdate = new BarButtonItem(); + this._itemImportUpdate.Caption = "导入Excel文件(更新)"; + this._itemImportUpdate.ItemClick += new ItemClickEventHandler(OnImportUpdateItemClick); + + // 复制单据 + this.pmBill.AddItems(new BarItem[] { itemCopyMaster, itemCopyAll }); + // 导入导出 + if (this.BillModel.CanExport && this.BillModel.ExportPermission) + { + this.pmBillExp.AddItem(itemExport); + } + if (this.BillModel.CanImport) + { + this.pmBillExp.AddItems(new BarItem[] { _itemImport, _itemImportUpdate }); + } + //分配 + this.pmFP.AddItems(new BarItem[] { itemFPBatch }); + // 打印模版 + string[] files = this.BillModel.PrintFile.Split('|'); + for (int i = 0; i < files.Length; i++) + { + string fileName = files[i]; + if (!string.IsNullOrWhiteSpace(fileName)) + { + BarButtonItem itemPrint = new BarButtonItem(); + int index = i + 1; + itemPrint.Caption = files[i].Replace(".rmf", "").Replace(".frx", ""); + itemPrint.Tag = files[i]; + itemPrint.ItemClick += new ItemClickEventHandler(OnPrintItemClick); + pMprint.AddItem(itemPrint); + } + } + + // 常用工具 + Dictionary dataCaches = SysModel != null ? SysModel.DataCaches : null; + if (!dataCaches.GetValue(this, "OperBaseGridRightMenus", out DataTable tableCommon)) + { + tableCommon = BaseModuleImpl.GetBaseGridRightMenus(this.SysModel.ModuleCode, ModuleType.BillDetail);//获取右键菜单数据 + } + int j = 0, x = 0; + foreach (DataRow item in tableCommon.Rows) + { + if (j > 1) + { + BarButtonItem itemCommon = new BarButtonItem(); + itemCommon.Caption = item["menuname"] + ""; + itemCommon.Tag = item; + itemCommon.ItemClick += new ItemClickEventHandler(OnCommonItemClick); + if (tableCommon.Columns.Contains("menuCond")) + { + itemCommon.Enabled = ValidateCond(item["menuCond"] + "", null); + } + pMenu.AddItem(itemCommon); + } + else + { + SimpleButton itemCommon = new SimpleButton(); + //itemCommon.AutoSize = true; + itemCommon.Text = item["menuname"] + ""; + itemCommon.Tag = item; + itemCommon.Size = new System.Drawing.Size(67, 26); + itemCommon.Font = new Font("宋体", 9); + itemCommon.Click += new EventHandler(itemCommon_Click); + int inputWidth = pl_input.Visible ? pl_input.Width : 0; + itemCommon.Location = new Point(x + 6 + inputWidth, 6); + pl_main_bottom.Controls.Add(itemCommon); + x += itemCommon.Width + 6; + + if (tableCommon.Columns.Contains("menuCond")) + { + itemCommon.Enabled = ValidateCond(item["menuCond"] + "", null); + } + itemCommonList.Add(itemCommon); + j++; + } + + } + } + /// + /// 说明:常用工具点击 + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void itemCommon_Click(object sender, EventArgs e) + { + try + { + SimpleButton btn = sender as SimpleButton; + DataRow rowItem = btn.Tag as DataRow; + GridRightMenuModel model = new GridRightMenuModel(rowItem); + + if (!string.IsNullOrWhiteSpace(model.ClickCond)) + { + string clickCond = this.ControlObj.ReplaceControlValue(model.ClickCond) + ""; + bool condResult = ValidateCond(clickCond, null); + if (!condResult) return; + } + + if (rowItem["dllname"].Equals("Lskj.PubBomImport.dll")) + { + if ((model.ParamList[7] + "").Equals("3")) + { + if (!this.BillSave(0, false)) + { + return; + } + } + } + StaticControl.RightMenuGridView = gcMain.GridView; + StaticControl.Comprefix = this.BillModel.DetailPreFix; + CommonMenu menu = new CommonMenu(this.SysModel, this.ControlObj, this.gcMain); + menu.ApplyBefore += new CommonToolApplyEventHandler(OnMenuApplyBefore); + menu.DynamicLinkAfter += new CommonToolAfterDynamicLinkEventHandler(OnDynamicLinkAfter); + menu.Apply(rowItem); + + if (StaticControl.ReturnRowLisy.Count > 0) + { + DataRow[] dataRows = StaticControl.ReturnRowLisy.ToArray(); + foreach (DataRow item in dataRows) + { + if (this.BillModel.DetailTreeTable) + { + this.AddRowToTreeGridControl(item, "0"); + } + else + { + this.AddRowToGridView(item); + } + } + } + + if (model != null && model.Refresh) + { + string billNo = this.lblOrderNo.Text.Trim(); + this.SetBillStatus(BillImpl.GetDataRowResult(string.Format("select * from {0} where {1}='{2}'", BillModel.MasterTable, BillModel.PrimaryKey, billNo))); + if (ControlObj != null && ControlObj.ParentPanel != null) + { + ControlObj.ParentPanel.Invalidate(); + ControlObj.ParentPanel.Update(); + } + } + + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + } + + } + + /// + /// 说明:初始化单据控件信息 + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InitializeBillInfo() + { + Dictionary dataCaches = SysModel != null ? SysModel.DataCaches : null; + if (!dataCaches.GetValue(this, "ControlLocation", out DataTable controls)) + { + controls = BaseModuleImpl.GetControlLocation(this.BillModel.FormKey, this.SysModel.ModuleCode); + if (!string.IsNullOrWhiteSpace(this.BillModel.BillSourceControlName)) + { + var targetRow = controls.AsEnumerable() + .FirstOrDefault(row => row.Field("fieldName").Equals(this.BillModel.BillSourceControlName, StringComparison.OrdinalIgnoreCase)); + if (targetRow != null) + { + targetRow["fieldTypeId"] = "-11"; + } + } + } + if (!dataCaches.GetValue(this, "AddGroupData", out DataTable groups)) + { + groups = BaseModuleImpl.GetAddGroupData(this.BillModel.FormKey);//获取主信息分组数据 + } + if (!dataCaches.GetValue(this, "ControlObj", out ControlObj)) + { + this.ControlObj = new MyControl() { Model = SysModel };//主表控件 + } + + //this.ControlObj = new MyControl();//// 主表控件 + this.ControlObj.OpenDocumentSource += OpenTheSourcePopup; + this.ControlObj.OtherParams = this.SysModel.OtherParams(); + this.ControlObj.InitControl(controls, this.pl_main_center_master, groups); + this.ControlObj.refGridLookUpData = this.BillModel.RefGridLookUpData;//2023-3-17,新增单据时刷新下拉框数据源 + this.ControlObj.OnDataSourceBindCallBack += new EventHandler(OnInitializeHeaderCallBack); + + this.pl_main_center_master.Height = (this.BillModel.ParentHeight - 36) > this.pl_main_center_master.Height ? this.pl_main_center_master.Height : this.BillModel.ParentHeight - 36; + + //设置图片框的上传和删除事件 + this.SetImageEvent(controls); + + // 初始化明细 + // 创建多表头,默认标准表格 + if (this.SysModel.GridEnumObj == GridEnum.BandedGridView || this.BillModel.AutoMultiHeader == 1) + { + this.pl_main_center_detail.Controls.Clear(); + this.gcMain = new BandedGridControlEx(); + this.gcMain.Model = this.SysModel; + this.gcMain.Dock = DockStyle.Fill; + this.pl_main_center_detail.Controls.Add(this.gcMain); + } + + if (!dataCaches.GetValue(this, "DetailColumns", out _detailColumns)) + { + _detailColumns = BillImpl.GetDetailColumns(this.SysModel.ModuleCode);//初始化单据明细列 + if (this.SysModel.GridEnumObj == GridEnum.BandedGridView || this.BillModel.AutoMultiHeader == 1) + { + //多表头sql要增加一个判断,否则多表头会出错 + _detailColumns = BillImpl.GetDetailColumns(this.SysModel.ModuleCode, true);//初始化单据明细列 + } + } + this.gcMain.DisableFieldSources = this.BillModel.DisableFieldSources; + this.gcMain.Model = this.SysModel; + this.gcMain.ParentControl = this.ControlObj;//把主表控件赋给 单据主表控件、基础档案查询条件控件等等 + this.gcMain.SetEditColumns(_detailColumns, GridCustomColumnStruct.BillDetailGridView + this.BillModel.FormKey);//设置可编辑列 + if (this.BillModel.IsBillMainDetailCheck == 1)//加载明细复选框 + { + if (this.BillModel.DetailTreeTable) + { + GridDragGrid.TreeListAddCheckBox((this.gcMain as TreeGridControlEx).TreeListObj); + } + else + { + GridDragGrid.GridAddCheckBox(this.gcMain.GridView); + } + } + + if (!dataCaches.GetValue(gcMain, "BaseGridRowColors", out DataTable dtBaseGridRowColors)) + { + dtBaseGridRowColors = BaseModuleImpl.GetBaseGridRowColors("BILLDETAIL_" + this.BillModel.FormKey); + } + this.gcMain.SetGridRowColors(dtBaseGridRowColors); + //触发右键回调 + this.gcMain.OnAfterLinkCilk += OnAfterLinkCilkCall; + if (!dataCaches.GetValue(gcMain, "BaseGridRightMenus", out DataTable dtBaseGridRightMenus)) + { + dtBaseGridRightMenus = BaseModuleImpl.GetBaseGridRightMenus("BILLDETAIL_" + this.SysModel.ModuleCode); + } + if (this.gcMain is BandedGridControlEx)// 判断是不是多表头表格 + { + //设置表格右键菜单 + (this.gcMain as BandedGridControlEx).SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridViewRightCallBack, this.ControlObj); + (this.gcMain as BandedGridControlEx).GridView.ShowingEditor += new CancelEventHandler(OnGridViewShowingEditor); + } + else if (this.BillModel.DetailTreeTable) + { + (this.gcMain as TreeGridControlEx).SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridViewRightCallBack, this.ControlObj, (this.gcMain as TreeGridControlEx).MenuStrip); + //(this.gcMain as TreeGridControlEx).TreeListObj.DoubleClick += new EventHandler(OnGridViewDoubleClick);//和下方行单击事件功能一致(TreeListObj_MouseClick),同样的sql会重复执行。先注释 2025-06-30 + (this.gcMain as TreeGridControlEx).TreeListObj.ShowingEditor += new CancelEventHandler(OnGridViewShowingEditor); + } + else + { + this.gcMain.SetGridRightMenus(dtBaseGridRightMenus, this.SysModel, OnGridViewRightCallBack, this.ControlObj); + //this.gcMain.GridView.DoubleClick += new EventHandler(OnGridViewDoubleClick);//和下方行单击事件功能一致(OngcMainRowCellClick),同样的sql会重复执行。先注释 2025-06-30 + this.gcMain.GridView.ShowingEditor += new CancelEventHandler(OnGridViewShowingEditor); + } + + if (!dataCaches.GetValue(this, "SaveCondTab", out this.SaveCondTab)) + { + this.SaveCondTab = BaseModuleImpl.GetClientCond(this.SysModel.ModuleCode); + } + + + if (this.BillModel.DefaultAddEmptyRow) + { + this.gcMain.GridView.OptionsView.NewItemRowPosition = NewItemRowPosition.Bottom; + if (SystemInfo.Instance.IsAddEmptyRowOldTag) + { + this.gcMain.GridView.MouseDown += GridView_MouseDown; + this.gcMain.GridView.FocusedRowChanged += GridView_FocusedRowChanged; + } + else + { + this.gcMain.GridView.InitNewRow += new InitNewRowEventHandler(OnGridViewInitNewRow); + } + //this.gcMain.GridView.InitNewRow += new InitNewRowEventHandler(OnGridViewInitNewRow); + //this.gcMain.GridView.OptionsView.NewItemRowPosition = NewItemRowPosition.Bottom; + //this.gcMain.GridView.MouseDown += GridView_MouseDown; + //this.gcMain.GridView.FocusedRowChanged += GridView_FocusedRowChanged; + } + //程序若配置扫码框则回车换行 + if (this._detailColumns.Rows.Cast().FirstOrDefault(x => x["fieldsqltag"].ToString() == ControlType.LabSacn + "") != null) + { + this.gcMain.GridView.CellValueChanged += new CellValueChangedEventHandler(OnGridViewCellValueChanged); + } + + this.gcMain.GridControl.DataSourceChanged += OnGcMainDataSourceChanged; + this.gcMain.OnAllAfterParseCallBack += OnAllAfterParseCallBack; + } + + /// + /// 表格触发右键功能 + /// + /// + /// + private void OnAfterLinkCilkCall(object sender, EventArgs e) + { + string unioright = sender + ""; + DataRow rightrowitem = this.gcMain.gridViewRightMenu.MenuTable.Rows.Cast().FirstOrDefault(x => (x["orderid"] + "").Equals(unioright)); + + GridRightMenuModel model = new GridRightMenuModel(rightrowitem); + DataRow rowItem = this.gcMain.GetViewFocusedDataRow(); + if (!string.IsNullOrWhiteSpace(model.MenuCond)) + { + //判断条件 + DataRow row = this.gcMain.GridView.GetFocusedDataRow(); + string cond = ReplaceHelper.ReplaceRowParam(row, model.MenuCond); + bool condResult = ValidateCond(cond, null); + if (!condResult) return; + } + + CommonMenu menu = new CommonMenu(this.SysModel, ControlObj, this.gcMain); + menu.Apply(rightrowitem); + } + + /// + /// 说明:数据绑定后判断是否是右键打开模块赋值 + /// 创建人:王一帆 + /// 创建日期:2020-03-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnInitializeHeaderCallBack(object sender, EventArgs e) + { + // 通过右键菜单打开单据时,判断修改还是新增 + if (!string.IsNullOrEmpty(this.SysModel.BillOrderNo)) + { + // 修改 + string sqlValue = "select * from " + this.BillModel.MasterTable + " where 1=1"; + string sqlCond = string.Format(" and {0}='{1}'", this.BillModel.PrimaryKey, this.SysModel.BillOrderNo); + DataTable masterTable = BillImpl.GetDataTableResult(sqlValue + sqlCond); + + this.SetBillStatus(masterTable.Rows.Count > 0 ? masterTable.Rows[0] : null); + } + else + { + this.SetBillStatus(null); + // 新增 + if (!string.IsNullOrEmpty(this.SysModel.BillMasterSql)) + { + // 处理单据表头数据 + DataRow row = BillImpl.GetDataRowResult(this.SysModel.BillMasterSql); + if (row != null) + { + if (row.Table.Columns.Contains(this.BillModel.RtagidKey)) + { + string Rtagid = row[this.BillModel.RtagidKey] + ""; + // 初始化红、蓝单 + if (Rtagid.Equals("0")) + { + this.rdBlue.Checked = true; + this.rdRed.Checked = false; + this.lbTitle.ForeColor = Color.Blue; + this.pl_red.Visible = false; + this.pl_blue.Visible = true; + } + else if (Rtagid.Equals("1")) + { + this.rdRed.Checked = true; + this.rdBlue.Checked = false; + this.lbTitle.ForeColor = Color.Red; + this.pl_blue.Visible = false; + this.pl_red.Visible = true; + } + + } + + + this.ControlObj.SetAllControlValue(row);//去掉第二个参数true,参数8进入的sql固定不默认赋值 + // 设置Brp模版 + if (this.IsBrpTemplete || this.BillModel.IsBrp) + { + this.SetTempleteSelectedValue(row["brpId"] + ""); + } + } + } + if (!string.IsNullOrEmpty(this.SysModel.BillMasterSql)) + { + // 处理单据明细数据 + if (!this.SysModel.BillDetailSql.StartsWith("*")) this.AddMultiRowToGridView(BillImpl.GetDataTableResult(this.SysModel.BillDetailSql)); + } + } + } + + private void AddDataColumns() + { + foreach (GridColumn gridColumn in gcMain.GridView.Columns) + { + gridColumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.Left; + } + int dayCount = 0; + BaseUserControl baseUserControl = ControlObj.FindControl("bom_rdm_tianshu"); + if (baseUserControl != null) + { + int.TryParse(baseUserControl.EditText, out dayCount); + } + if (dayCount <= 0) + { + dayCount = 7; + } + if (DateColumnList.Count != dayCount) + { + foreach (GridColumn item in DateColumnList) + { + gcMain.GridView.Columns.Remove(item); + } + gcMain.GridView.Columns.Remove(SumGridColumn); + DateColumnList.Clear(); + for (int i = 0; i < dayCount; i++) + { + GridColumn gridColumn = new GridColumn(); + gridColumn.AppearanceCell.Options.UseTextOptions = true; + gridColumn.AppearanceCell.TextOptions.HAlignment = HorzAlignment.Center; + gridColumn.AppearanceHeader.Options.UseTextOptions = true; + gridColumn.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center; + gridColumn.OptionsColumn.AllowMove = false; + gridColumn.OptionsColumn.AllowSize = false; + gridColumn.OptionsFilter.AllowFilter = false; + gridColumn.OptionsColumn.AllowMerge = DefaultBoolean.False; + gridColumn.OptionsColumn.AllowSort = DefaultBoolean.False; + gridColumn.FieldName = $"DDay_{i}"; + gridColumn.Width = 70; + gridColumn.DisplayFormat.FormatType = FormatType.Numeric; + gridColumn.DisplayFormat.FormatString = "{0:#,##0.####}"; + gridColumn.Visible = true; + gridColumn.SummaryItem.SummaryType = SummaryItemType.Sum; + gridColumn.SummaryItem.DisplayFormat = "{0:#,##0.####}"; + gcMain.GridView.Columns.Add(gridColumn); + DateColumnList.Add(gridColumn); + } + GridColumn sumGridColumn = new GridColumn(); + sumGridColumn.AppearanceCell.Options.UseTextOptions = true; + sumGridColumn.AppearanceCell.TextOptions.HAlignment = HorzAlignment.Center; + sumGridColumn.AppearanceHeader.Options.UseTextOptions = true; + sumGridColumn.AppearanceHeader.TextOptions.HAlignment = HorzAlignment.Center; + sumGridColumn.OptionsColumn.AllowEdit = false; + sumGridColumn.OptionsColumn.AllowMove = false; + sumGridColumn.OptionsColumn.AllowSize = false; + sumGridColumn.OptionsFilter.AllowFilter = false; + sumGridColumn.OptionsColumn.AllowMerge = DefaultBoolean.False; + sumGridColumn.OptionsColumn.AllowSort = DefaultBoolean.False; + sumGridColumn.FieldName = $"workingsum"; + sumGridColumn.Caption = $"工时合计"; + sumGridColumn.Width = 70; + sumGridColumn.DisplayFormat.FormatType = FormatType.Numeric; + sumGridColumn.DisplayFormat.FormatString = "{0:#,##0.####}"; + sumGridColumn.Visible = true; + sumGridColumn.SummaryItem.SummaryType = SummaryItemType.Sum; + sumGridColumn.SummaryItem.DisplayFormat = "{0:#,##0.####}"; + SumGridColumn = sumGridColumn; + gcMain.GridView.Columns.Add(sumGridColumn); + } + } + + /// + /// 根据日期修改列状态 + /// + /// + private void UpdateDynamicColumns() + { + DateTime currentDate = DateTime.Now; + BaseUserControl dateUserControl = ControlObj.FindControl("bom_rdm_ksdt"); + if (dateUserControl is LabelDateEdit labelDateEdit) + { + currentDate = labelDateEdit.TextEdit.DateTime; + } + + int dayCount = 0; + BaseUserControl baseUserControl = ControlObj.FindControl("bom_rdm_tianshu"); + if (baseUserControl != null) + { + int.TryParse(baseUserControl.EditText, out dayCount); + } + if (dayCount <= 0) + { + dayCount = 7; + } + + DateTime endDate = currentDate.AddDays(dayCount); // 保持你的原逻辑 + + var view = gcMain.GridView; + view.BeginUpdate(); + try + { + // 1) 更新每个日期列的显示属性,并确保“动态列不固定” + for (int i = 0; i < DateColumnList.Count; i++) + { + GridColumn gridColumn = DateColumnList[i]; + DateTime dateForColumn = currentDate.AddDays(i); + + if (dateForColumn <= endDate) + { + gridColumn.FieldName = dateForColumn.ToString("yyyy-MM-dd"); + gridColumn.Caption = dateForColumn.ToString("MM-dd"); + gridColumn.Visible = true; + gridColumn.Tag = dateForColumn; + + // 关键:动态日期列不要固定,让它参与水平滚动 + gridColumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.None; + } + else + { + gridColumn.Visible = false; + } + } + + // 合计列也不要固定(保持可水平滚动) + if (SumGridColumn != null) + SumGridColumn.Fixed = DevExpress.XtraGrid.Columns.FixedStyle.None; + + // 2) 明确“从左到右”的可见顺序 + // 先找到左侧固定列的最大 VisibleIndex,动态列排在它们之后 + int baseIndex = 0; + foreach (GridColumn c in view.Columns) + { + if (c.Visible && c.Fixed == DevExpress.XtraGrid.Columns.FixedStyle.Left) + baseIndex = Math.Max(baseIndex, c.VisibleIndex + 1); + } + + // 起始日期在左,依次向右:start, start+1, ... + int run = 0; + for (int i = 0; i < DateColumnList.Count; i++) + { + var col = DateColumnList[i]; + if (!col.Visible) continue; + col.VisibleIndex = baseIndex + run; + run++; + } + + // 合计列放在日期列最后 + if (SumGridColumn != null && SumGridColumn.Visible) + SumGridColumn.VisibleIndex = baseIndex + run; + } + finally + { + view.EndUpdate(); + } + } + + /// + /// 新增汇总数据(日期修改后) + /// + private void UpdateSummaryData(DataTable table = null) + { + DataTable dataTable = new DataTable(); + if (table != null) + { + dataTable = table; + } + else + { + dataTable = this.gcMain.GridControl.DataSourceTable(); + } + if (dataTable != null && dataTable.Columns.Contains("num")) + { + MultiLineSummary = true; + gcMain.GridView.OptionsView.ShowFooter = true; + DataRow[] dataRows = dataTable.Select("num='999'"); + DataRow dataRow = dataRows != null && dataRows.Length > 0 ? dataRows[0] : null; + gcMain.AddHeadquarters(dataRow); + } + else if (MultiLineSummary) + { + MultiLineSummary = false; + //清空新加的汇总列 + gcMain.AddHeadquarters(); + } + + } + + + /// + /// 说明:表格编辑时,判断是否是否编辑 + /// 创建人:王一帆 + /// 创建日期:2020-03-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnGridViewShowingEditor(object sender, CancelEventArgs e) + { + try + { + GridColumnModel gridColumnModel = null; + DataRow rowItem = null; + if (this.BillModel.DetailTreeTable) + { + DevExpress.XtraTreeList.TreeList treeList = (DevExpress.XtraTreeList.TreeList)sender; + TreeListColumn treeListColumn = treeList.FocusedColumn; + if (treeListColumn.Tag != null) + { + gridColumnModel = (GridColumnModel)treeListColumn.Tag; + } + rowItem = (this.gcMain as TreeGridControlEx).GetViewFocusedDataRow(); + } + else + { + GridView gridView = (GridView)sender; + GridColumn gridColumn = gridView.FocusedColumn; + + if (gridColumn.Tag != null) + { + gridColumnModel = (GridColumnModel)gridColumn.Tag; + + } + rowItem = this.gcMain.GridView.GetDataRow(this.gcMain.GridView.FocusedRowHandle); + } + + + if (gridColumnModel != null && !string.IsNullOrEmpty(gridColumnModel.DisableCond)) + { + //e.Cancel = !ReplaceHelper.EvalCond(ReplaceHelper.ReplaceRowParam(focusedRow, gridColumnModel.DisableCond)); + //e.Cancel = !ValidateCond(gridColumnModel.DisableCond, focusedRow); + string UpdateCond = this.ControlObj.ReplaceParentControlValue(gridColumnModel.DisableCond); + UpdateCond = ReplaceHelper.ReplaceRowParam(rowItem, UpdateCond); + if (!ReplaceHelper.EvalCond(UpdateCond)) + { + e.Cancel = true;//该行不可编辑 + } + } + if (!string.IsNullOrWhiteSpace(BillModel.UpdateDetailCond)) + { + string UpdateCond = this.ControlObj.ReplaceParentControlValue(BillModel.UpdateDetailCond); + UpdateCond = ReplaceHelper.ReplaceRowParam(rowItem, UpdateCond); + if (!ReplaceHelper.EvalCond(UpdateCond)) + { + e.Cancel = true;//该行不可编辑 + } + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + + } + + + } + + /// + /// 虚拟行点击添加 + /// + /// + private void InitNewRowMethod(object sender) + { + GridView view = sender as DevExpress.XtraGrid.Views.Grid.GridView; + DataTable gridTable = (this.gcMain.GridControl.DataSource as DataTable).TrimDeleteRows(); + DataRow tmpRow = gridTable.NewRow(); + gridTable.Rows.Add(tmpRow); + int position = gridTable.Rows.Count - 1; + foreach (DataRow dr in _detailColumns.Rows) + { + GridColumnModel model = new GridColumnModel(dr); + string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); + + + if (model.DefaultValue.Contains("{#")) + { + fieldValue = this.ControlObj.ReplaceParentControlValue(model.DefaultValue); + if (!string.IsNullOrEmpty(fieldValue)) + { + tmpRow[model.FieldName] = fieldValue; + } + } + else if (!string.IsNullOrEmpty(model.DefaultValue)) + { + if (model.DefaultValue.Contains("{ROW")) + { + if (position > 0) + { + + fieldValue = ReplaceHelper.GetParamFields(model.DefaultValue)[0]; + fieldValue = fieldValue.Replace("}", "").Replace("{", ""); + fieldValue = fieldValue.Substring(fieldValue.IndexOf('_') + 1); + string topFieldValue = gridTable.Rows[position - 1][fieldValue] + ""; + if (gridTable.Columns[model.FieldName].DataType == typeof(DateTime)) + { + if (!string.IsNullOrEmpty(topFieldValue)) tmpRow[model.FieldName] = Convert.ToDateTime(topFieldValue); + } + else + { + tmpRow[model.FieldName] = topFieldValue; + } + } + } + else + { + tmpRow[model.FieldName] = fieldValue; + } + } + } + gridTable.OrderBy(this.BillModel.DetailOrderField); + + if (tmpRow.Table.Columns.Contains(this.BillModel.DetailOrderField) && gridTable.Rows.Count == 0) + { + tmpRow[this.BillModel.DetailOrderField] = 1; + } + + this.gcMain.GridView.UpdateCurrentRow(); + this.gcMain.GridView.ShowEditor(); + } + /// + /// 切换行判断是否是虚拟行数据进行数据填充 + /// + /// + /// + private void GridView_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e) + { + DataTable gridTable = (this.gcMain.GridControl.DataSource as DataTable).TrimDeleteRows(); + int _rowNumber = this.gcMain.GridView.FocusedRowHandle; + int _prvFocused = e.PrevFocusedRowHandle; + int indexNumber = this.gcMain.GridView.RowCount; + if (_rowNumber < 0 && _prvFocused != gridTable.Rows.Count) + { + InitNewRowMethod(sender); + this.gcMain.GridView.FocusedRowHandle = indexNumber - 1; + } + } + /// + /// 说明:单据重写明细回车事件(用于扫码回车移动至下一行数据) + /// 创建人:王一帆 + /// 创建日期:2021-06-08 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + protected void OnGridViewCellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) + { + if (isDragWrap) + { + int _rowNumber = this.gcMain.GridView.FocusedRowHandle; + GridColumn focusColumn = this.gcMain.GridView.FocusedColumn; + GridColumnModel Columnmodel = focusColumn.Tag as GridColumnModel; + + if (Columnmodel.FieldType == ControlType.LabSacn) + { + this.gcMain.GridView.OptionsNavigation.EnterMoveNextColumn = false; + if (this.BillModel.DefaultAddEmptyRow && _rowNumber + 1 == this.gcMain.GridView.DataRowCount) + { + DataTable gridTable = (this.gcMain.GridView.GridControl.DataSource as DataTable).TrimDeleteRows(); + DataRow tmpRow = gridTable.NewRow(); + gridTable.Rows.Add(tmpRow); + int position = gridTable.Rows.Count - 1; + foreach (DataRow dr in _detailColumns.Rows) + { + GridColumnModel model = new GridColumnModel(dr); + string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); + if (model.DefaultValue.Contains("{#")) + { + fieldValue = this.ControlObj.ReplaceParentControlValue(model.DefaultValue); + if (!string.IsNullOrEmpty(fieldValue)) + { + tmpRow[model.FieldName] = fieldValue; + } + } + else if (!string.IsNullOrEmpty(model.DefaultValue)) + { + if (model.DefaultValue.Contains("{ROW")) + { + if (position > 0) + { + + fieldValue = ReplaceHelper.GetParamFields(model.DefaultValue)[0]; + fieldValue = fieldValue.Replace("}", "").Replace("{", ""); + fieldValue = fieldValue.Substring(fieldValue.IndexOf('_') + 1); + string topFieldValue = gridTable.Rows[position - 1][fieldValue] + ""; + if (gridTable.Columns[model.FieldName].DataType == typeof(DateTime)) + { + if (!string.IsNullOrEmpty(topFieldValue)) tmpRow[model.FieldName] = Convert.ToDateTime(topFieldValue); + } + else + { + tmpRow[model.FieldName] = topFieldValue; + } + } + } + else + { + tmpRow[model.FieldName] = fieldValue; + } + } + } + gridTable.OrderBy(this.BillModel.DetailOrderField); + + if (tmpRow.Table.Columns.Contains(this.BillModel.DetailOrderField) && gridTable.Rows.Count == 0) + { + tmpRow[this.BillModel.DetailOrderField] = 1; + } + + this.gcMain.GridView.UpdateCurrentRow(); + this.gcMain.GridView.ShowEditor(); + } + int ColumnIndex = this.gcMain.GridView.FocusedColumn.VisibleIndex;//焦点列的坐标 + this.gcMain.GridView.FocusedRowHandle = _rowNumber + 1; + this.gcMain.GridView.FocusedColumn.VisibleIndex = ColumnIndex; + //this.gridView.OptionsNavigation.EnterMoveNextColumn = true; + } + else + { + this.gcMain.GridView.OptionsNavigation.EnterMoveNextColumn = true; + } + } + } + + + /// + /// 说明:验证单据是否修改过 + /// 创建人:龚宇超 + /// 创建日期: + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void VerfyBillUpdated() + { + bool isUpdateDetailed = false; + DataTable table = this.gcMain.gridControl.DataSource as DataTable; + if (table != null && table.Rows.Count > 0) + { + DataRow updateRow = table.Rows.Cast().FirstOrDefault(x => x.RowState != DataRowState.Unchanged); + isUpdateDetailed = updateRow != null; + } + if (this.BillRowItem != null && (this.ControlObj.VerifyUpdated() || isUpdateDetailed)) + { + bool isReadOnly2 = !string.IsNullOrEmpty(this.BillModel.ModifyCond) && !ReplaceHelper.ReplaceRowParamCond(this.BillRowItem, this.BillModel.ModifyCond); + if (!isReadOnly2) + { + if (MessageUtil.Show(ResourceKeys.DataChanged, MessageBoxButtons.YesNo) == DialogResult.Yes) + { + this.BillSave(); + } + } + } + } + + /// + /// 说明:初始化单据按钮状态 + /// 创建人:龚宇超 + /// 创建日期:2017-12-04 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// if set to true [is edit]. + private void SetBillStatus(DataRow rowItem) + { + if (this.BillModel.unableToSave.Contains(SysModel.UserName)) + { + this.btnBillSave.Hide(); + foreach (System.Windows.Forms.Control control in pl_main_bottom.Controls) + { + + if (control.Location.X < btnBillSave.Location.X && control is DevExpress.XtraEditors.SimpleButton && control.Name != "btn_input") + { + control.Location = new Point(control.Location.X + btnBillSave.Width, control.Location.Y); + } + } + } + if (rowItem != null) + { + // 单据为修改状态,无需设置赋值时不需要计算面板属性 + bool isReadOnly = !string.IsNullOrEmpty(this.BillModel.ModifyCond) && !ReplaceHelper.ReplaceRowParamCond(rowItem, this.BillModel.ModifyCond); + this.ControlObj.CanExecControl = false; // 单据为修改状态时,无需计算面板属性 + this.lbTitle.Text = this.BillModel.TypeName + updateText; + this.lblOrderNo.Text = rowItem[this.BillModel.PrimaryKey] + ""; + this.rdBlue.Checked = "0".Equals(rowItem[this.BillModel.RtagidKey] + ""); + this.rdRed.Checked = "1".Equals(rowItem[this.BillModel.RtagidKey] + ""); + this.BillModel.SaveState = true; + this.rdBlue.Enabled = this.rdRed.Enabled = false; + this._itemImport.Enabled = this._itemImportUpdate.Enabled = !isReadOnly; + this.ControlObj.SetReadOnlyAllControl(isReadOnly); + this.ControlObj.SetAllControlValue(rowItem); + this.dbpFP.Enabled = this.btnDelete.Enabled = this.btnBillSave.Enabled = this.btnBillApply.Enabled = !isReadOnly; + this.ControlObj.CanExecControl = true; + this.cb_input.Enabled = this.btn_input.Enabled = this.txt_input.Enabled = !isReadOnly; + foreach (SimpleButton item in itemCommonList) + { + if (item.Visible == true && item.Tag is DataRow rightRow) + { + string menuCode = rightRow["menuCond"] + ""; + if (!string.IsNullOrEmpty(menuCode)) + { + item.Enabled = ValidateCond(menuCode, rowItem); ; + } + } + } + this.BillRowItem = rowItem; + // 设置Brp模版 + if (this.IsBrpTemplete || this.BillModel.IsBrp) + { + this.SetTempleteSelectedValue(rowItem["brpId"] + ""); + this.cb_templete.Enabled = !isReadOnly; + } + this.BillModel.PopupUnionCode = rdBlue.Checked ? rdBlueUnionCode : rdRedUnionCode; + this.dbpFP.Visible = !string.IsNullOrWhiteSpace(this.BillModel.PopupUnionCode); + this.labelControl1.ForeColor = this.lblOrderNo.ForeColor = this.lbTitle.ForeColor = rdBlue.Checked ? Color.Blue : Color.Red; + this.gcMain.GridView.OptionsBehavior.Editable = !isReadOnly; + // 上一次查询 + int oldRowHandle = this.gcMain.GridView.FocusedRowHandle; + //获取数据源并排序 + DataTable dt = BillImpl.GetDataTableResult(ReplaceHelper.ReplaceRowParam(rowItem, this.BillModel.DetailSql)); + if (dt.Columns.Contains(this.BillModel.DetailOrderField)) + { + DataView dataView = dt.AsDataView(); + dataView.Sort = this.BillModel.DetailOrderField; + dt = dataView.ToTable(); + dt.AcceptChanges(); + } + + if (this.BillModel.DetailTreeTable) + { + //判断是否有tap_id和tap_pid + (this.gcMain as TreeGridControlEx).SetGridViewDataSourceGenerateID(dt); + this.gcMain.GridView.SelectRowHandler(oldRowHandle); + } + else + { + this.gcMain.GridControl.DataSource = dt; + this.gcMain.GridView.SelectRowHandler(oldRowHandle); + if (this.BillModel.SelectLast && dt.Rows.Count > 0) + { + this.gcMain.GridView.SelectRowHandler(dt.Rows.Count - 1); + } + } + + + RefreshPrindMenu(); + + BaseUserControl userControl = this.ControlObj.FindControl(this.BillModel.RtagidKey); + if (userControl != null) + { + userControl.EditText = this.rdRed.Checked ? "1" : "0"; + } + } + else + { + // 单据为新增状态 + this.dbpFP.Enabled = this.btnDelete.Enabled = this.btnBillSave.Enabled = this.btnBillApply.Enabled = true; + this.lbTitle.Text = this.BillModel.TypeName + addText; + this.lblOrderNo.Text = BillImpl.GetBillNo(this.BillModel.BillSeq); + this._itemImport.Enabled = this._itemImportUpdate.Enabled = true; + this.cb_input.Enabled = this.btn_input.Enabled = this.txt_input.Enabled = true; + this.cb_templete.Enabled = true; + this.BillModel.SaveState = false; + this.ControlObj.SetReadOnlyAllControl(false); + this.rdBlue.Enabled = this.rdRed.Enabled = true; + foreach (SimpleButton item in itemCommonList) + { + if (item.Visible == true && item.Tag is DataRow rightRow) + { + string menuCode = rightRow["menuCond"] + ""; + if (!string.IsNullOrEmpty(menuCode)) + { + item.Enabled = ValidateCond(menuCode, rowItem); ; + } + } + } + + // 通过右键菜单打开单据,假如明细有数据则在初始化时使用传入数据. + if (this.BillModel.DetailTreeTable) + { + (this.gcMain as TreeGridControlEx).TreeListObj.OptionsBehavior.Editable = true; + (this.gcMain as TreeGridControlEx).SetGridViewDataSourceGenerateID(BillImpl.GetDataTableResult(this.BillModel.DetailSql)); + } + else + { + this.gcMain.GridView.OptionsBehavior.Editable = true; + this.gcMain.GridControl.DataSource = BillImpl.GetDataTableResult(this.BillModel.DetailSql); + } + + BaseUserControl userControl = this.ControlObj.FindControl(this.BillModel.RtagidKey); + if (userControl != null) + { + userControl.EditText = this.rdRed.Checked ? "1" : "0"; + } + } + + //设置打印按钮状态 + this.btnPrint.Enabled = this.SetPrintButton(rowItem); + + this._waterMark = new WaterMark(this.BillModel.MasterPreFix, rowItem); + this.lbTitle.Invalidate(); + + } + /// + /// 说明:点击蓝字单据 + /// 创建人:龚宇超 + /// 创建日期:2017-11-23 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnBlueStateClick(object sender, EventArgs e) + { + this.rdRed.Checked = false; + this.labelControl1.ForeColor = this.lblOrderNo.ForeColor = this.lbTitle.ForeColor = Color.Blue; + this.dbpFP.Visible = !string.IsNullOrWhiteSpace(rdBlueUnionCode); + this.BillModel.PopupUnionCode = rdBlueUnionCode; + + BaseUserControl userControl = this.ControlObj.FindControl(this.BillModel.RtagidKey); + if (userControl != null) + { + userControl.EditText = "0"; + } + } + /// + /// 说明:点击红字单据 + /// 创建人:龚宇超 + /// 创建日期:2017-11-23 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnRedStateClick(object sender, EventArgs e) + { + this.rdBlue.Checked = false; + this.labelControl1.ForeColor = this.lblOrderNo.ForeColor = this.lbTitle.ForeColor = Color.Red; + this.dbpFP.Visible = !string.IsNullOrWhiteSpace(rdRedUnionCode); + this.BillModel.PopupUnionCode = rdRedUnionCode; + + BaseUserControl userControl = this.ControlObj.FindControl(this.BillModel.RtagidKey); + if (userControl != null) + { + userControl.EditText = "1"; + } + } + /// + /// 说明:复制表头数据 + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnCopyMasterItemClick(object sender, ItemClickEventArgs e) + { + this.dbpFP.Enabled = this.btnDelete.Enabled = this.btnBillSave.Enabled = this.btnBillApply.Enabled = true; + this.lbTitle.Text = this.BillModel.TypeName + addText; + this.lbTitle.Invalidate(); + this.lblOrderNo.Text = BillImpl.GetBillNo(this.BillModel.BillSeq); + this.BillModel.SaveState = false; + this.rdBlue.Enabled = this.rdRed.Enabled = true; + this.cb_input.Enabled = this.btn_input.Enabled = this.txt_input.Enabled = true; + this._itemImport.Enabled = this._itemImportUpdate.Enabled = true; + this.cb_templete.Enabled = true; + this.ControlObj.CopyControlValue(this.BillModel.CancelCopyAssociation); + this.ControlObj.SetReadOnlyAllControl(false); + + if (this.BillModel.DetailTreeTable) + { + ((this.gcMain as TreeGridControlEx).TreeListObj.DataSource as DataTable).Clear(); + (this.gcMain as TreeGridControlEx).TreeListObj.OptionsBehavior.Editable = true; + } + else + { + this.gcMain.GridControl.DataSourceTable().Clear(); + this.gcMain.GridView.OptionsBehavior.Editable = true; + + } + + if (ScanCodeTextEdit != null) ScanCodeTextEdit.Focus(); + this._waterMark = new WaterMark(this.BillModel.MasterPreFix, null); + } + /// + /// 说明:复制整单 + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnCopyAllItemClick(object sender, ItemClickEventArgs e) + { + try + { + WaitForm.ShowForm(ResourceKeys.Handing); + DataTable gridTable = (this.gcMain.GridControl.DataSource as DataTable).TrimDeleteRows(); + if (this.BillModel.DetailTreeTable) + { + gridTable = ((this.gcMain as TreeGridControlEx).TreeListObj.DataSource as DataTable).TrimDeleteRows(); + } + this.dbpFP.Enabled = this.btnDelete.Enabled = this.btnBillSave.Enabled = this.btnBillApply.Enabled = true; + this.lbTitle.Text = this.BillModel.TypeName + addText; + this.lbTitle.Invalidate(); + this.lblOrderNo.Text = BillImpl.GetBillNo(this.BillModel.BillSeq); + this.rdBlue.Enabled = this.rdRed.Enabled = true; + this.cb_input.Enabled = this.btn_input.Enabled = this.txt_input.Enabled = true; + this._itemImport.Enabled = this._itemImportUpdate.Enabled = true; + this.cb_templete.Enabled = true; + this.ControlObj.CopyControlValue(this.BillModel.CancelCopyAssociation); + this.ControlObj.SetReadOnlyAllControl(false); + this._waterMark = new WaterMark(this.BillModel.MasterPreFix, null); + if (!gridTable.Columns.Contains(ERPInfo.Instance.isAddRows)) + { + gridTable.Columns.Add(ERPInfo.Instance.isAddRows, typeof(String)); + } + // 处理单据明细 + DataTable detailTable = this.gcMain.GridControl.DataSourceTable(); + if (this.BillModel.DetailTreeTable) + { + detailTable = (this.gcMain as TreeGridControlEx).GetGridViewDataSource(); + } + bool canCopy = false; + string defaultValue = string.Empty; + + + if (this.BillModel.DetailTreeTable) + { + if (detailTable.Columns.Contains(this.BillModel.PrimaryDetailKey)) + { + (this.gcMain as TreeGridControlEx).TreeListObj.BeginUpdate(); + foreach (TreeListNode item in (this.gcMain as TreeGridControlEx).TreeListObj.Nodes) + { + //根据后台列配置可否复制 + if (_detailColumns.Columns.Contains("canCopy")) + { + //int index = detailTable.Rows.IndexOf(item); + foreach (DataRow dr in _detailColumns.Rows) + { + canCopy = !string.IsNullOrEmpty(dr["canCopy"] + "") ? "1".Equals(dr["canCopy"] + "") : false; + if (!canCopy) + { + TreeListColumn column = (this.gcMain as TreeGridControlEx).TreeListObj.Columns.ColumnByFieldName(dr["fieldName"] + ""); + //TreeListNode node = treeList.GetNode(rowIndex); + defaultValue = this.ControlObj.ReplaceParentControlValue(dr["defaultdate"] + ""); + defaultValue = BaseImpl.GetDefaultValue(defaultValue); + if (!string.IsNullOrEmpty(defaultValue)) + { + item.SetValue(column, defaultValue); + } + else + { + item.SetValue(column, DBNull.Value); + } + } + } + } + item[this.BillModel.PrimaryDetailKey] = this.lblOrderNo.Text; + } + (this.gcMain as TreeGridControlEx).TreeListObj.EndUpdate(); + } + (this.gcMain as TreeGridControlEx).TreeListObj.OptionsBehavior.Editable = true; + this.BillModel.SaveState = false; + } + else + { + if (detailTable.Columns.Contains(this.BillModel.PrimaryDetailKey)) + { + this.gcMain.GridView.BeginUpdate(); + foreach (DataRow item in detailTable.Rows) + { + //根据后台列配置可否复制 + if (_detailColumns.Columns.Contains("canCopy")) + { + int index = detailTable.Rows.IndexOf(item); + foreach (DataRow dr in _detailColumns.Rows) + { + canCopy = !string.IsNullOrEmpty(dr["canCopy"] + "") ? "1".Equals(dr["canCopy"] + "") : false; + if (!canCopy) + { + GridColumn column = this.gcMain.GridView.Columns.ColumnByFieldName(dr["fieldName"] + ""); + defaultValue = this.ControlObj.ReplaceParentControlValue(dr["defaultdate"] + ""); + defaultValue = BaseImpl.GetDefaultValue(defaultValue); + if (!string.IsNullOrEmpty(defaultValue)) + { + this.gcMain.GridView.SetRowCellValue(index, column, defaultValue); + } + else + { + this.gcMain.GridView.SetRowCellValue(index, column, DBNull.Value); + } + } + } + } + item[this.BillModel.PrimaryDetailKey] = this.lblOrderNo.Text; + } + this.gcMain.GridView.EndUpdate(); + } + this.gcMain.GridView.OptionsBehavior.Editable = true; + this.BillModel.SaveState = false; + } + if (ScanCodeTextEdit != null) ScanCodeTextEdit.Focus(); + + } + catch (Exception ex) + { + + } + finally + { + WaitForm.HideForm(); + } + } + /// + /// 说明:导出Excel + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnExportItemClick(object sender, ItemClickEventArgs e) + { + LogUtil.WriteDebug(this.SysModel.ModuleCode, "导出数据", this.SysModel.FormText, "单据明细导出", this.SysModel.ModuleId + ""); + + + if (this.BillModel.DetailTreeTable) + { + (this.gcMain as TreeGridControlEx).TreeListObj.ToTreeExcel(this.SysModel.FormText); + } + else + { + this.gcMain.GridControl.ToExcel(this.SysModel.FormText); + } + + + } + /// + /// 说明:从Excel导入 + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnImportItemClick(object sender, ItemClickEventArgs e) + { + OpenFileDialog dialog = new OpenFileDialog(); + dialog.Title = "选择导入文件"; + //dialog.Filter = "Excel文件(*.xls)|*.xls"; + dialog.Filter = SystemInfo.Instance.IsXlsxFirst ? "Excel文件(*.xlsx)|*.xlsx|Excel文件(*.xls)|*.xls" : + "Excel文件(*.xls)|*.xls|Excel文件(*.xlsx)|*.xlsx"; + + DialogResult result = dialog.ShowDialog(); + if (result == DialogResult.OK) + { + string fileName = dialog.FileName; + string colFields = this.gcMain.GridView.Columns.ToString(','); + + if (this.BillModel.DetailTreeTable) + { + DataTable DataImportTable = (this.gcMain as TreeGridControlEx).TreeListObj.ToExcelTreeDataTable(fileName, colFields, true, true); + DataTable NewTable = (this.gcMain as TreeGridControlEx).GetGridViewDataSource(); + TreeListColumnCollection gridColumns = (this.gcMain as TreeGridControlEx).TreeListObj.Columns; + //父节点名称 + string ParentFieldName = (this.gcMain as TreeGridControlEx).TreeListObj.ParentFieldName; + //节点名称 + string KeyFieldName = (this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName; + + if (!DataImportTable.Columns.Contains(ParentFieldName)) DataImportTable.Columns.Add(ParentFieldName); + if (!DataImportTable.Columns.Contains(KeyFieldName)) DataImportTable.Columns.Add(KeyFieldName); + + AddRowsToTreeGridControl(DataImportTable, null); + } + else + { + DataTable DataImportTable = this.gcMain.GridView.ToExcelDataTable(fileName, colFields, true, true); + DataTable NewTable = this.gcMain.GridControl.DataSourceTable(); + GridColumnCollection gridColumns = this.gcMain.GridView.Columns; + foreach (DataRow rowItem in DataImportTable.Rows) + { + DataRow newRow = NewTable.NewRow(); + foreach (GridColumn col in gridColumns) + { + if ("id".Equals(col.FieldName) || col.FieldName.Equals(this.BillModel.PrimaryKey)) continue; + if (rowItem.Table.Columns.Contains(col.FieldName)) + { + // 列中是否包含对应字段,包含则使用值 + newRow[col.FieldName] = rowItem[col.FieldName]; + } + else + { + // 未包含字段,则使用控件默认值. + GridColumnModel model = col.Tag as GridColumnModel; + string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); + if (model.DefaultValue.Contains("{#")) + { + fieldValue = this.ControlObj.ReplaceParentControlValue(model.DefaultValue); + + } + if (!string.IsNullOrEmpty(fieldValue)) + { + newRow[col.FieldName] = fieldValue; + } + } + } + NewTable.Rows.Add(newRow); + } + this.gcMain.GridControl.DataSource = NewTable; + } + + + } + } + /// + /// 说明:导入Excel文件(更新) + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnImportUpdateItemClick(object sender, ItemClickEventArgs e) + { + + } + + /// + /// 说明:验证可操作条件 + /// 创建人:龚宇超 + /// 创建日期:2018-03-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnToolsClick(object sender, EventArgs e) + { + foreach (BarItemLink itemLink in pMenu.ItemLinks) + { + DataRow rowItem = itemLink.Item.Tag as DataRow; + if (rowItem != null) + { + string menuCond = rowItem["MenuCond"] + ""; + string menuCaption = itemLink.Caption; + + if (!string.IsNullOrEmpty(menuCond)) + { + try + { + bool result = true; + menuCond = ReplaceHelper.ReplaceParamToValue(menuCond, "{" + this.BillModel.PrimaryKey + "}", this.lblOrderNo.Text.Trim()); + + if (menuCond.StartsWith("@") || menuCond.StartsWith("!")) + { + result = "1".Equals(BaseImpl.GetDefaultValue(menuCond)); + } + else + { + menuCond = this.ControlObj.ReplaceControlValue(menuCond); + if (this.BillRowItem != null) + menuCond = ReplaceHelper.ReplaceRowParam(this.BillRowItem, menuCond); + menuCond = ReplaceHelper.ReplaceParamToValue(menuCond, "0"); // 未替换的参数所有替换为0 + + result = ReplaceHelper.EvalCond(menuCond); + } + itemLink.Item.Enabled = result; + } + catch (Exception ex) + { + MessageUtil.Show("[" + menuCaption + "] " + ResourceKeys.SetRightMenuCondFault); + LogHelper.Instance.WriteError(ex); + } + } + } + } + } + /// + /// 说明:常用工具点击 + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnCommonItemClick(object sender, ItemClickEventArgs e) + { + DataRow rowItem = e.Item.Tag as DataRow; + + CommonMenu menu = new CommonMenu(this.SysModel, this.ControlObj, null); + menu.ApplyBefore += new CommonToolApplyEventHandler(OnMenuApplyBefore); + menu.DynamicLinkAfter += new CommonToolAfterDynamicLinkEventHandler(OnDynamicLinkAfter); + menu.Apply(rowItem); + } + /// + /// 说明:执行前单独替换BilldocumentId + /// 创建人:龚宇超 + /// 创建日期:2018-03-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The e. + protected void OnMenuApplyBefore(ApplyArgs e) + { + string[] paramList = new string[e.MemuModel.ParamList.Count]; + + for (int i = 0; i < e.MemuModel.ParamList.Count; i++) + { + string item = e.MemuModel.ParamList[i]; + List condition = ReplaceHelper.GetParamFields(item); + foreach (string cond in condition) + { + string value = this.BillModel.PrimaryKey.Equals(cond.Replace("{", "").Replace("}", "").ToLower(), StringComparison.OrdinalIgnoreCase) ? this.lblOrderNo.Text.Trim() : cond; + item = item.Replace(cond, value); ; + } + paramList[i] = item; + } + e.MemuModel.ParamList = paramList.ToList(); + } + /// + /// 动态链接库执行完成后 + /// + /// + protected void OnDynamicLinkAfter(object sender, ApplyArgs e) + { + try + { + if (!string.IsNullOrWhiteSpace(e.MemuModel.ResultSQL)) + { + string resultSql = e.MemuModel.ResultSQL; + if (e.DialogModel != null && e.DialogModel.DialogDllName.Equals("lskj.pubadd.dll", StringComparison.OrdinalIgnoreCase) && e.DialogModel.PubDialogType == DialogType.PubAddRecord) + { + if (e.DialogModel.ReturnTag != null && e.DialogModel.ReturnTag is MyControl) + { + MyControl addControlObj = e.DialogModel.ReturnTag as MyControl; + resultSql = addControlObj.ReplaceControlValue(resultSql); + } + resultSql = this.ControlObj.ReplaceControlValue(resultSql); + DataTable dataTable = MainImpl.GetDataTableResult(resultSql); + foreach (DataRow item in dataTable.Rows) + { + this.AddRowToGridView(item); + } + } + else + { + resultSql = this.ControlObj.ReplaceControlValue(resultSql); + DataTable dataTable = MainImpl.GetDataTableResult(resultSql); + foreach (DataRow item in dataTable.Rows) + { + this.AddRowToGridView(item, false); + } + } + } + if (e.DialogModel != null && e.DialogModel.DialogDllName.Equals("Lskj.PubBomImport.dll", StringComparison.OrdinalIgnoreCase)) + { + if (e.DialogModel.ReturnTag != null && e.DialogModel.ReturnTag is BomImpRtnModel impRtnModel) + { + if (impRtnModel.ShowType.Equals("1") || impRtnModel.ShowType.Equals("2") || impRtnModel.ShowType.Equals("3") || impRtnModel.ShowType.Equals("5") || impRtnModel.ShowType.Equals("6") || impRtnModel.ShowType.Equals("7") || impRtnModel.ShowType.Equals("8") || impRtnModel.ShowType.Equals("9"))//执行保存 + { + CommonMenu menu = (CommonMenu)sender; + menu.issuccess = impRtnModel.CanSave; + } + else if (impRtnModel.ShowType.Equals("0") || impRtnModel.ShowType.Equals("00") || impRtnModel.ShowType.Equals("000"))//返回文件 + { + ControlModel controlModel = ControlObj.ControlModels.Where(n => n.LabelText.Equals("物料编码")).FirstOrDefault(); + if (controlModel == null) + { + MessageUtil.Show($"物料编码不存在"); + return; + } + string mxProductId = ControlObj.GetControlValue(controlModel); + if (string.IsNullOrEmpty(mxProductId)) + { + MessageUtil.Show($"物料编码必填"); + return; + } + ControlModel modeControlModel = ControlObj.ControlModels.Where(n => n.LabelText.Equals("上传模式")).FirstOrDefault(); + string addMode = ControlObj.GetControlValue(modeControlModel); + if (impRtnModel.ShowType.Equals("1") && string.IsNullOrEmpty(addMode)) + { + MessageUtil.Show($"上传模式必填"); + return; + } + ControlModel sepciesNoControlModel = ControlObj.ControlModels.Where(n => n.LabelText.Equals("文件分类")).FirstOrDefault(); + string sepciesNo = ControlObj.GetControlValue(sepciesNoControlModel); + if ((impRtnModel.ShowType.Equals("1") || impRtnModel.ShowType.Equals("6")) && string.IsNullOrEmpty(sepciesNo)) + { + MessageUtil.Show($"文件分类必填"); + return; + } + ControlModel fileIDControlModel = ControlObj.ControlModels.Where(n => n.LabelText.Equals("文件ID")).FirstOrDefault(); + string fileID = ControlObj.GetControlValue(fileIDControlModel); + ControlModel oldPIDControlModel = ControlObj.ControlModels.Where(n => n.LabelText.Equals("旧编码")).FirstOrDefault(); + string oldPID = ControlObj.GetControlValue(oldPIDControlModel); + DataTable sourceTable = gcMain.gridControl.DataSourceTable(); + if (impRtnModel.ShowType.Equals("000") && sourceTable.Rows.Cast().Where(n => n.RowState != DataRowState.Deleted).Count() > 0) + { + MessageUtil.Show($"只能选择单个文件,请删除后再添加"); + return; + } + if (sourceTable != null && impRtnModel.FileNames != null) + { + string afterBomFieldName = impRtnModel.AfterBomFieldName; + if (!sourceTable.Columns.Contains("BomFieldNameDir")) + { + sourceTable.Columns.Add("BomFieldNameDir"); + } + if (!sourceTable.Columns.Contains("BomFieldNamePath")) + { + sourceTable.Columns.Add("BomFieldNamePath"); + } + if (!sourceTable.Columns.Contains("BomMxMainProduct")) + { + sourceTable.Columns.Add("BomMxMainProduct"); + } + if (!sourceTable.Columns.Contains("BomMxAddState")) + { + sourceTable.Columns.Add("BomMxAddState"); + } + if (!sourceTable.Columns.Contains("qms_laddf_mode")) + { + sourceTable.Columns.Add("qms_laddf_mode"); + } + if (!sourceTable.Columns.Contains("BomAddSpeciesNo")) + { + sourceTable.Columns.Add("BomAddSpeciesNo"); + } + if (!sourceTable.Columns.Contains("BomAddChangeFileId")) + { + sourceTable.Columns.Add("BomAddChangeFileId"); + } + if (!sourceTable.Columns.Contains("BomAddOldProductId")) + { + sourceTable.Columns.Add("BomAddOldProductId"); + } + DataTable dataTable = new DataTable(); + dataTable.Columns.Add(afterBomFieldName); + dataTable.Columns.Add("BomFieldNameDir"); + dataTable.Columns.Add("BomFieldNamePath"); + dataTable.Columns.Add("BomMxMainProduct"); + dataTable.Columns.Add("BomMxAddState"); + dataTable.Columns.Add("qms_laddf_mode"); + dataTable.Columns.Add("BomAddSpeciesNo"); + dataTable.Columns.Add("BomAddChangeFileId"); + dataTable.Columns.Add("BomAddOldProductId"); + IEnumerable rowsIEnumerable = sourceTable.Rows.Cast().Where(n => n.RowState != DataRowState.Deleted); + foreach (string fileName in impRtnModel.FileNames) + { + string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName).Trim(); + //找到code相同的行 + DataRow selectRow = rowsIEnumerable.Where(n => (n[afterBomFieldName] + "").Trim().Equals(fileNameWithoutExtension, StringComparison.OrdinalIgnoreCase)).FirstOrDefault(); + if (selectRow != null) + { + //MessageUtil.Show($"{fileNameWithoutExtension}已存在,不允许重复创建"); + continue; + } + //DataRow productRow = BaseImpl.GetDataRowResult($"select top 1 billdocument_id from bom_BillTab where productid like '{code}%'"); + //if (productRow != null) + //{ + // MessageUtil.Show($"{code}已存在,不允许重复创建"); + // return; + //} + DataRow addRow = dataTable.NewRow(); + addRow[afterBomFieldName] = Path.GetFileName(fileName); + addRow["BomFieldNameDir"] = fileName; + addRow["BomFieldNamePath"] = Path.GetFileName(fileName); + addRow["BomMxMainProduct"] = mxProductId; + addRow["qms_laddf_mode"] = addMode; + addRow["BomAddSpeciesNo"] = sepciesNo; + addRow["BomAddChangeFileId"] = fileID; + addRow["BomAddOldProductId"] = oldPID; + addRow["BomMxAddState"] = this.BillModel.SaveState ? "修改" : "新增"; + dataTable.Rows.Add(addRow); + } + foreach (DataRow item in dataTable.Rows) + { + DataRow sourceRow = this.AddRowToGridView(item, true); + sourceRow["BomFieldNameDir"] = item["BomFieldNameDir"] + ""; + sourceRow["BomFieldNamePath"] = item["BomFieldNamePath"] + ""; + sourceRow["BomMxMainProduct"] = item["BomMxMainProduct"] + ""; + sourceRow["BomMxAddState"] = item["BomMxAddState"] + ""; + sourceRow["qms_laddf_mode"] = item["qms_laddf_mode"] + ""; + sourceRow["BomAddSpeciesNo"] = item["BomAddSpeciesNo"] + ""; + sourceRow["BomAddChangeFileId"] = item["BomAddChangeFileId"] + ""; + sourceRow["BomAddOldProductId"] = item["BomAddOldProductId"] + ""; + } + } + } + } + } + } + catch (Exception) + { + } + } + /// + /// 说明:打印完成需要参数 + /// 创建人:龚宇超 + /// 创建日期:2018-07-09 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + protected void GetPrintOtherParam() + { + Dictionary dataCaches = SysModel != null ? SysModel.DataCaches : null; + //取得打印完成后的参数 + if (!string.IsNullOrEmpty(this.BillModel.PrintSql) && this.BillModel.PrintSql.Contains("<<")) + { + string[] strs = this.BillModel.PrintSql.Split(new[] { ">>" }, 2, StringSplitOptions.None); + _mainPrintSql = strs[1]; + _printModeCond = strs[0].Replace("<<", ""); + } + if (!string.IsNullOrEmpty(_printModeCond) && _printModeCond.IndexOf(';') > 0) + { + string[] str = _printModeCond.Split(';'); + if (!dataCaches.GetValue(this, "PrintOtherSystemRow", out DataRow item)) + { + item = AttachImpl.GetSystemModule(str[0]); + } + if (item == null) return; + string tableName = item["TableName"] + ""; + string modetype = item["modType"] + ""; + if (!dataCaches.GetValue(this, "PrintOtherColumnPrefix", out string comprefix)) + { + comprefix = BaseImpl.GetColumnPrefix(tableName); + } + if (!dataCaches.GetValue(this, "PrintOtherPrimaryKey", out string primaryKey)) + { + primaryKey = modetype == "1" ? BaseImpl.GetBasePrimaryKey(str[0]) : comprefix + "billdocument_id"; + } + //表名,列前缀,主键字段,主键值,模块编号,主打印Sql + _printSaveParams = new List() { tableName, comprefix, primaryKey, str[1], str[0], _mainPrintSql }; + + //判断是否直接打印 modetype 区别单据和基础档案模块 + if (!dataCaches.GetValue(this, "PrintOtherIsExcPrint", out _isExcPrint)) + { + switch (modetype) + { + case "1": + ModuleModel mode = new ModuleModel(MainImpl.GetSystemdllTab(str[0])); + if (mode != null) _isExcPrint = mode.PrintType == 3; + break; + case "2": + BaseAccraditationModel model = new BaseAccraditationModel(BillAuditImpl.GetPubAuditProperty(str[0])); + if (model != null) _isExcPrint = model.BillPrintType == 3; + break; + } + } + } + } + /// + /// 说明:打印模版 + /// 创建人:龚宇超 + /// 创建日期:2017-11-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnPrintItemClick(object sender, ItemClickEventArgs e) + { + string printFile = e.Item.Tag + ""; + string printPath = PubUtil.PrintFileAbsolutelyPath; + + if (!File.Exists(printPath)) + { + MessageUtil.Show(ResourceKeys.NotFoundPrintFile); + return; + } + + bool isPrint = this.BillModel.SaveState; + if (!isPrint) + { + if (MessageUtil.Show(ResourceKeys.BillNotSavedAndNotPrint, MessageBoxButtons.YesNo) == DialogResult.Yes) + isPrint = this.BillSave(); + } + + if (isPrint) + { + try + { + // 判断是否满足打印条件 + + //DataRow masterRow = BillImpl.GetDataRowResult(this.BillModel.MasterSql.Replace("{" + this.BillModel.PrimaryKey + "}", this.lblOrderNo.Text)); + DataRow masterRow = BillImpl.GetDataRowResult(string.Format("select * from {0} where {1}='{2}'", BillModel.MasterTable, BillModel.PrimaryKey, this.lblOrderNo.Text)); + if (masterRow == null) + { + MessageUtil.Show(ResourceKeys.DataNotFount); + return; + } + + if (!ReplaceHelper.ReplaceRowParamCond(masterRow, this.BillModel.PrintCond)) + { + MessageUtil.Show(ResourceKeys.DisSatisfyPrintCond); + return; + } + + string tmpSql = ReplaceHelper.ReplaceRowParam(masterRow, this.BillModel.PrintSql); + string tmpSql1 = ReplaceHelper.ReplaceRowParam(masterRow, this.BillModel.PrintSql1); + string tmpSql2 = ReplaceHelper.ReplaceRowParam(masterRow, this.BillModel.PrintSql2); + + if (printFile.Contains(PrintUtil.TemplateFlag)) + { + //主Sql + string mainSql = string.Empty; + List tmpSqls = new List(); + if (_printSaveParams != null && _printSaveParams.Count > 0) + { + _printSaveParams[5] = mainSql = ReplaceHelper.ReplaceRowParam(masterRow, _mainPrintSql); + _printSaveParams[3] = masterRow.Table.Columns.Contains(_printSaveParams[2] + "") ? masterRow[_printSaveParams[2]] + "" : masterRow[BillModel.PrimaryKey] + ""; + tmpSqls.Add(mainSql); + tmpSqls.Add(tmpSql1); + tmpSqls.AddRange(tmpSql2.Split(';').ToList()); + } + else + { + if (!string.IsNullOrWhiteSpace(tmpSql)) tmpSqls.Add(tmpSql); + if (!string.IsNullOrWhiteSpace(tmpSql1)) tmpSqls.Add(tmpSql1); + if (!string.IsNullOrWhiteSpace(tmpSql2)) tmpSqls.AddRange(tmpSql2.Split(';').ToList()); + } + PrintUtil.OnAfterPrint -= new EventHandler(OnReportPrintAfter); + PrintUtil.OnAfterPrint += new EventHandler(OnReportPrintAfter); + PrintUtil.FastReportPrint(tmpSqls, printFile, _isExcPrint); + } + else + { + DelphiHelper.LoadDelphiDll(printPath, printPath, printFile, tmpSql, tmpSql1, this.BillModel.PrintFileType, tmpSql2); + } + //LogUtil.WriteDebug(this.SysModel.ModuleCode, "打印", "单据打印:" + printFile.Replace(".rmf", "").Replace(".frx", ""), "打印格式:" + printFile); + if (ScanCodeTextEdit != null) ScanCodeTextEdit.Focus(); + } + catch (Exception ex) + { + MessageUtil.Show(ex.Message + "\r\n" + ex.StackTrace); + LogUtil.WriteError(ResourceKeys.BillModule + "打印模板错误", ex); + LogHelper.Instance.WriteError(ex); + } + } + } + + /// + /// 说明:计算列关联字段 + /// 创建人:龚宇超 + /// 创建日期:2017-12-18 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The model. + /// The field value. + protected virtual void SetUnionValue(GridColumnModel model, string fieldValue, DataRow rowItem) + { + DataTable table = this.gcMain.gridControl.DataSourceTable(); + //DataRow rowItem = this.gridView.GetFocusedDataRow(); + string unionValues = model.UnionValues; + if (rowItem != null && model != null) + { + unionValues = ReplaceHelper.ReplaceRowParam(rowItem, unionValues.Replace("{" + model.FieldName + "}", fieldValue)); + if (this.ControlObj != null) + { + unionValues = ControlObj.ReplaceParentControlValue(unionValues); + } + try + { + string[] fields = model.UnionFields.Trim(',').Split(','); + DataRow rowResult = BaseImpl.GetDataRowResult(unionValues); + if (rowResult != null) + { + for (int i = 0; i < fields.Length; i++) + { + string field = fields[i]; + string value = rowResult.Table.Columns.Contains(field) ? rowResult[field] + "" : null; + rowItem[field] = value; + } + } + else + { + // 设置为空 + for (int i = 0; i < fields.Length; i++) + { + string field = fields[i]; + rowItem[field] = DBNull.Value; + } + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError("计算列关联字段--错误-->" + unionValues, ex); + } + } + } + /// + /// 说明:禁用控件条件 + /// 创建人:龚宇超 + /// 创建日期:2019-01-22 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The model. + /// The field value. + protected virtual void SetDisableColumn(GridColumnModel model, string fieldValue, DataRow rowItem) + { + if (model.EnableCond != string.Empty) + { + List columns = this.gcMain.ObjmControlList.FindAll(x => x.EnableCond.Contains("{" + model.FieldName + "}")).ToList(); + foreach (GridColumnModel item in columns) + { + try + { + string disableCond = ReplaceHelper.ReplaceRowParam(rowItem, item.EnableCond.Replace("{" + model.FieldName + "}", fieldValue)); + string diaableType = item.DisableType; + if (this.BillModel.DetailTreeTable) + { + (this.gcMain as TreeGridControlEx).TreeListObj.Columns.ColumnByFieldName(model.FieldName).Visible = ("true".Equals(EvalHelper.Eval(ReplaceHelper.ReplaceEvalCond(disableCond)) + "", StringComparison.OrdinalIgnoreCase)); + } + else + { + this.gcMain.GridView.Columns.ColumnByFieldName(model.FieldName).Visible = ("true".Equals(EvalHelper.Eval(ReplaceHelper.ReplaceEvalCond(disableCond)) + "", StringComparison.OrdinalIgnoreCase)); + } + } + catch (Exception) + { + } + } + } + } + /// + /// 说明:计算列计算公式 + /// 创建人:龚宇超 + /// 创建日期:2017-12-18 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The model. + /// The field value. + protected virtual void SetCalcValue(GridColumnModel model, string fieldValue, DataRow rowItem) + { + try + { + DataTable table = this.gcMain.gridControl.DataSourceTable(); + if (rowItem != null && model != null) + { + List calcModels = this.gcMain.ObjmControlList.FindAll(x => !string.IsNullOrEmpty(x.CalcExpr)).OrderBy(y => y.CalcOrder).ToList(); + + foreach (GridColumnModel gridModel in calcModels) + { + // 计算顺序小于当前控件则不计算 + if (gridModel.CalcOrder < model.CalcOrder) continue; + + if (!gridModel.FieldName.Equals(model.FieldName, StringComparison.OrdinalIgnoreCase)) + { + bool isTruncate = false; + string calcExpr = gridModel.CalcExpr; + if (calcExpr.StartsWith("@truncate:")) + { + calcExpr = calcExpr.Substring(10); + isTruncate = true; + } + + try + { + if (this.ControlObj != null) + calcExpr = ControlObj.ReplaceParentControlValue(calcExpr); + + calcExpr = ReplaceHelper.ReplaceRowParam(rowItem, calcExpr); + //EvalHelper.Eval2(ReplaceHelper.ReplaceEvalCond(calcExpr)) + "" + string result = EvalHelper.Eval2(ReplaceHelper.ReplaceEvalCond(calcExpr)) + ""; + if (isTruncate) + { + result += result.Contains(".") ? "0000000000" : ".0000000000"; + rowItem[gridModel.FieldName] = result.Substring(0, result.IndexOf(".")) + result.Substring(result.IndexOf("."), model.Decimals + 1); + //this.gridView.SetRowCellValue(this.gridView.FocusedRowHandle, this.gridView.Columns[gridModel.FieldName], result.Substring(0, result.IndexOf(".")) + result.Substring(result.IndexOf("."), model.Decimals + 1)); + } + else + { + try + { + double d = 0; + if (!string.IsNullOrEmpty(result) && + !"NaN".Equals(result, StringComparison.OrdinalIgnoreCase) && + !"非数字".Equals(result, StringComparison.OrdinalIgnoreCase) && + !"undefined".Equals(result, StringComparison.OrdinalIgnoreCase) && + result != "∞" && result != "-∞" && + !"正无穷大".Equals(result, StringComparison.OrdinalIgnoreCase) && + !"负无穷大".Equals(result, StringComparison.OrdinalIgnoreCase) && + double.TryParse(result, out d)) + { + if (string.IsNullOrEmpty(gridModel.DataFormat)) + { + result = Math.Round(Convert.ToDouble(d), model.Decimals, MidpointRounding.AwayFromZero) + ""; + } + else + { + //计算后先执行保存小数位数 + result = string.Format("{0:" + gridModel.DataFormat + "}", Convert.ToDecimal(result)); + } + if (model.FieldType == 7 && result.Contains('%')) + { + result = (double.Parse(result.Replace("%", "")) * 0.01).ToString(); + } + rowItem[gridModel.FieldName] = result; + // 判断计算列有无关联值 + GridColumnModel UnionModel = calcModels.FirstOrDefault(x => x.FieldName == gridModel.FieldName); + if (!string.IsNullOrEmpty(UnionModel.UnionFields)) + { + this.SetUnionValue(UnionModel, rowItem[gridModel.FieldName] + "", rowItem); + } + //this.gridView.SetRowCellValue(this.gridView.FocusedRowHandle, this.gridView.Columns[gridModel.FieldName], result); + } + } + catch (Exception) + { + + } + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError("计算列计算公式--错误-->" + rowItem[gridModel.FieldName], ex); + } + } + } + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + string Message = ErrorMessage.PromptErrorMessage(ex); + // MessageUtil.Show(Message,ex.Message); + } + } + + /// + /// 说明:添加行到单据明细中 + /// 创建人:龚宇超 + /// 创建日期:2017-11-30 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The row item. + /// The union model. + private DataRow AddRowToGridView(DataRow rowItem, bool dataProcessing = true) + { + GridColumnCollection gridColumns = this.gcMain.GridView.Columns; + DataTable gridTable = (this.gcMain.GridControl.DataSource as DataTable).TrimDeleteRows(); + if (!gridTable.Columns.Contains(ERPInfo.Instance.isAddRows)) + { + gridTable.Columns.Add(ERPInfo.Instance.isAddRows, typeof(String)); + } + string repeatProduct = this.gcMain.GridView.Columns["ProductId"] != null && rowItem.Table.Columns.Contains("ProductId") ? "ProductId" : this.BillModel.DetailPreFix + "ProductId"; + AssociatedField = repeatProduct; + if ("1".Equals(this.BillModel.DetailDoubleClickTip) && rowItem.Table.Columns.Contains(repeatProduct)) + { + + //上面方法无法处理大小写,改成搜索的形式 + DataTable dt = this.gcMain.gridControl.DataSourceTable(); + if (dt != null && dt.Rows.Count > 0 && dt.Columns.Contains(repeatProduct)) + { + DataRow[] drs = dt.Select(repeatProduct + "='" + rowItem[repeatProduct] + "'"); + if (drs.Length >= 1) + { + DialogResult dialog = MessageUtil.Show(ResourceKeys.ProductIsRepet, MessageBoxButtons.YesNo); + if (dialog != DialogResult.Yes) + { + return null; + } + } + } + } + DataRow newRow = gridTable.NewRow(); + //if (gridTable.Columns.Contains(guidField)) + //{ + // newRow[guidField] = Guid.NewGuid().ToString(); + //} + //2024-1-29改成>=,之前为>导致选中第一行只会添加到最后一行(测试空白行没有影响) + int position = this.gcMain.GridView.FocusedRowHandle >= 0 ? gridTable.Rows.Count > 0 ? this.gcMain.GridView.FocusedRowHandle : 0 : gridTable.Rows.Count - 1; + bool isLastRow = this.gcMain.GridView.IsLastVisibleRow; + this.gcMain.GridView.BeginDataUpdate(); + GridView gridView = this.gcMain.GridView; + // 赋值明细字段 + foreach (GridColumn col in gridColumns) + { + try + { + // 未包含字段,则使用控件默认值. + GridColumnModel model = col.Tag as GridColumnModel; + if (model == null) + { + if (rowItem.Table.Columns.Contains(col.FieldName)) + { + // 来源列中是否包含对应字段,包含则使用值 + newRow[col.FieldName] = rowItem[col.FieldName]; + } + continue; + } + if (rowItem.Table.Columns.Contains(col.FieldName)) + { + // 来源列中是否包含对应字段,包含则使用值 + newRow[col.FieldName] = rowItem[col.FieldName]; + if (dataProcessing) + { + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, rowItem[col.FieldName] + "", newRow); + } + SetCalcValue(model, rowItem[col.FieldName] + "", newRow); + } + + } + else + { + + if (col.FieldName.Contains("_Ls")) + { + string[] unioFielName = col.FieldName.Split('_'); + string UnioValue = unioFielName[unioFielName.Length - 1]; + DataColumn grid = rowItem.Table.Columns.Cast().FirstOrDefault(x => x.ColumnName.Split('_')[x.ColumnName.Split('_').Length - 1].Equals(UnioValue)); + if (dataProcessing) + { + if (grid != null && !string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, rowItem[col.FieldName] + "", newRow); + } + SetCalcValue(model, rowItem[col.FieldName] + "", newRow); + } + + } + else + { + string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); + //int nowPositon = !isLastRow ? position : gridTable.Rows.Count - 1; + + if (model.DefaultValue.Contains("{#")) + { + fieldValue = this.ControlObj.ReplaceParentControlValue(model.DefaultValue); + if (fieldValue.StartsWith("@")) + { + fieldValue = BaseImpl.GetDefaultValue(fieldValue); + } + if (!string.IsNullOrEmpty(fieldValue)) + { + newRow[col.FieldName] = fieldValue; + if (dataProcessing) + { + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, newRow[col.FieldName] + "", newRow); + } + SetCalcValue(model, newRow[col.FieldName] + "", newRow); + } + //计算规则配置在结果字段上,所以无需验证当前操作控件 + //this.gcMain.GridView.SetFocusedRowCellValue(col, fieldValue); + } + } + else if (!string.IsNullOrEmpty(model.DefaultValue)) + { + if (string.IsNullOrEmpty(newRow[col.FieldName] + "") || this.BillModel.DragFixedDefault) + { + newRow[col.FieldName] = fieldValue; + } + if (dataProcessing) + { + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, newRow[col.FieldName] + "", newRow); + } + SetCalcValue(model, newRow[col.FieldName] + "", newRow); + //this.gcMain.GridView.SetFocusedRowCellValue(col, fieldValue); + } + } + } + } + SetDisableColumn(model, newRow[col.FieldName] + "", newRow); + //GridColumnModel model = col.Tag as GridColumnModel; + if (model.LimitLength > 0) + { + DataRow HandleRow = newRow; + int MaxInputLength = System.Text.Encoding.Default.GetBytes(newRow[col.FieldName] + "").Length; + if (model.LimitLength < MaxInputLength) + HandleRow.SetColumnError(HandleRow.Table.Columns[col.ColumnHandle], "当前输入文本超过设定长度!");//满足条件设置错误信息 + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + //LogUtil.WriteError(col.FieldName + "添加出错!", ex); + } + } + this.gcMain.GridView.EndDataUpdate(); + + if (SystemInfo.Instance.BillAddAtTheEnd) isLastRow = true; + + if (!isLastRow) + { + // 插入数据行 + gridTable.Rows.InsertAt(newRow, position + 1); + this.gcMain.GridView.ClearSelection(); + this.gcMain.GridView.SelectRowHandler(position + 1); + } + else + { + // 添加数据行 + gridTable.Rows.Add(newRow); + this.gcMain.GridView.ClearSelection(); + this.gcMain.GridView.SelectRowHandler(gridTable.Rows.Count - 1); + } + + + // 插入数据后 + //if (isLastRow) + //{ + // this.gcMain.GridView.ClearSelection(); + // this.gcMain.GridView.SelectRowHandler(position + 1); + //} + if (!string.IsNullOrEmpty(NumberMc) && gridTable.Columns.Contains(mRecordPrimaryField)) + { + DataRow[] rt = gridTable.Rows.Cast().Where(x => (newRow[BillModel.DetailPreFix + "ProductId"] + "").Equals(x[BillModel.DetailPreFix + "ProductId"] + "") && !string.IsNullOrEmpty(x[mRecordPrimaryField] + "")).ToArray(); + foreach (DataRow item in rt) + { + if (newRow != null) + { + newRow[NumberMc] = Convert.ToDouble(newRow[NumberMc]) - Convert.ToDouble(item[NumberMc]); + } + this.gcMain.OnGridViewCellValueChanged(this.gcMain, new CellValueChangedEventArgs(position + 1, this.gcMain.GridView.Columns[NumberMc], newRow[NumberMc] + "")); + this.gcMain.GridView.UpdateCurrentRow(); + this.gcMain.GridView.ShowEditor(); + if (Convert.ToDouble(newRow[NumberMc] + "") == 0.0) + { + gridTable.Rows.Remove(newRow); + MessageUtil.Show("数量已分配完毕!无需再进行拖拽!"); + } + } + } + gridTable.OrderBy(this.BillModel.DetailOrderField); + this.gcMain.GridView.UpdateCurrentRow(); + this.gcMain.GridView.ShowEditor(); + return newRow; + } + /// + /// 说明:添加多行到单据明细中 + /// 创建人:龚宇超 + /// 创建日期:2017-11-30 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The row item. + /// The union model. + private void AddRowsToGridView(DataTable dataTable, BillSourceUnionModel unionModel) + { + WaitForm.ShowForm(); + GridColumnCollection gridColumns = this.gcMain.GridView.Columns; + DataTable gridTable = (this.gcMain.GridControl.DataSource as DataTable).TrimDeleteRows().Copy(); + if (!gridTable.Columns.Contains(ERPInfo.Instance.isAddRows)) + { + gridTable.Columns.Add(ERPInfo.Instance.isAddRows, typeof(String)); + } + int position = this.gcMain.GridView.FocusedRowHandle; + bool isLastRow = this.gcMain.GridView.IsLastVisibleRow; + bool onlyOne = true; + foreach (DataRow rowItem in dataTable.Rows) + { + if (unionModel == null || ValidateDetailCond(rowItem, unionModel)) + { + string repeatProduct = this.gcMain.GridView.Columns["ProductId"] != null && dataTable.Columns.Contains("ProductId") ? "ProductId" : this.BillModel.DetailPreFix + "ProductId"; + AssociatedField = repeatProduct; + if ("1".Equals(this.BillModel.DetailDoubleClickTip) && this.gcMain.GridView.Columns[repeatProduct] != null && dataTable.Columns.Contains(repeatProduct)) + { + // 需要提示编码重复 + //GridView view = this.gcMain.GridView; + //bool result = (view.LocateByValue(repeatProduct, rowItem[repeatProduct], null) >= 0) | + // (view.LocateByValue(repeatProduct, rowItem[repeatProduct], null) >= 0) | + // (view.LocateByValue(repeatProduct, rowItem[repeatProduct], null) >= 0) | + // (view.LocateByValue(repeatProduct, rowItem[repeatProduct], null) >= 0); + //if (result) + //{ + // DialogResult dialog = MessageUtil.Show(ResourceKeys.ProductIsRepet, MessageBoxButtons.YesNo); + // if (dialog != DialogResult.Yes) + // return; + //} + + //上面方法无法处理大小写,改成搜索的形式 + DataTable dt = this.gcMain.gridControl.DataSourceTable(); + if (dt != null && dt.Rows.Count > 0 && dt.Columns.Contains(repeatProduct)) + { + DataRow[] drs = dt.Select(repeatProduct + "='" + rowItem[repeatProduct] + "'"); + if (drs.Length >= 1) + { + DialogResult dialog = MessageUtil.Show(ResourceKeys.ProductIsRepet, MessageBoxButtons.YesNo); + if (dialog != DialogResult.Yes) + return; + } + } + + } + + DataRow newRow = gridTable.NewRow(); + newRow.BeginEdit(); + // 赋值明细字段 + foreach (GridColumn col in gridColumns) + { + try + { + GridColumnModel model = col.Tag as GridColumnModel; + if (model == null) continue; + if (dataTable.Columns.Contains(col.FieldName)) + { + // 来源列中是否包含对应字段,包含则使用值 + newRow[col.FieldName] = rowItem[col.FieldName]; + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, rowItem[col.FieldName] + "", newRow); + } + SetCalcValue(model, rowItem[col.FieldName] + "", newRow); + + } + else + { + // 未包含字段,则使用控件默认值. + if (col.FieldName.Contains("_Ls")) + { + string[] unioFielName = col.FieldName.Split('_'); + string UnioValue = unioFielName[unioFielName.Length - 1]; + DataColumn grid = dataTable.Columns.Cast().FirstOrDefault(x => x.ColumnName.Split('_')[x.ColumnName.Split('_').Length - 1].Equals(UnioValue)); + if (grid != null && !string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, rowItem[col.FieldName] + "", newRow); + } + SetCalcValue(model, rowItem[col.FieldName] + "", newRow); + + } + else + { + string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); + //int nowPositon = !isLastRow ? position : gridTable.Rows.Count - 1; + if (model.DefaultValue.Contains("{#")) + { + fieldValue = this.ControlObj.ReplaceParentControlValue(model.DefaultValue); + if (!string.IsNullOrEmpty(fieldValue)) + { + newRow[col.FieldName] = fieldValue; + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, fieldValue + "", newRow); + } + SetCalcValue(model, fieldValue + "", newRow); + + //计算规则配置在结果字段上,所以无需验证当前操作控件 + //this.gcMain.GridView.SetFocusedRowCellValue(col, fieldValue); + } + } + else if (!string.IsNullOrEmpty(model.DefaultValue)) + { + + if (string.IsNullOrEmpty(newRow[col.FieldName] + "") || this.BillModel.DragFixedDefault) + { + newRow[col.FieldName] = fieldValue; + } + + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, newRow[col.FieldName] + "", newRow); + } + SetCalcValue(model, newRow[col.FieldName] + "", newRow); + + //this.gcMain.GridView.SetFocusedRowCellValue(col, fieldValue); + } + } + } + SetDisableColumn(model, newRow[col.FieldName] + "", newRow); + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + //LogUtil.WriteError(col.FieldName + "添加出错!", ex); + } + } + newRow.EndEdit(); + + if (SystemInfo.Instance.BillAddAtTheEnd) isLastRow = true; + + if (!isLastRow) + { + // 插入数据行 + gridTable.Rows.InsertAt(newRow, position); + //this.gcMain.GridView.ClearSelection(); + //this.gcMain.GridView.SelectRowHandler(position); + } + else + { + // 添加数据行 + gridTable.Rows.Add(newRow); + // this.gcMain.GridView.ClearSelection(); + // this.gcMain.GridView.SelectRowHandler(gridTable.Rows.Count - 1); + } + position++; + //if (isLastRow) + //{ + // this.gcMain.GridView.ClearSelection(); + // this.gcMain.GridView.SelectRowHandler(position + 1); + //} + if (!string.IsNullOrEmpty(NumberMc) && gridTable.Columns.Contains(mRecordPrimaryField)) + { + DataRow[] rt = gridTable.Rows.Cast().Where(x => (newRow[BillModel.DetailPreFix + "ProductId"] + "").Equals(x[BillModel.DetailPreFix + "ProductId"] + "") && !string.IsNullOrEmpty(x[mRecordPrimaryField] + "")).ToArray(); + foreach (DataRow item in rt) + { + if (newRow != null) + { + newRow[NumberMc] = Convert.ToDouble(newRow[NumberMc]) - Convert.ToDouble(item[NumberMc]); + } + this.gcMain.OnGridViewCellValueChanged(this.gcMain, new CellValueChangedEventArgs(position + 1, this.gcMain.GridView.Columns[NumberMc], newRow[NumberMc] + "")); + this.gcMain.GridView.UpdateCurrentRow(); + this.gcMain.GridView.ShowEditor(); + if (Convert.ToDouble(newRow[NumberMc] + "") == 0.0) + { + gridTable.Rows.Remove(newRow); + MessageUtil.Show("数量已分配完毕!无需再进行拖拽!"); + } + } + } + } + else + { + if (onlyOne) + { + onlyOne = false; + if (!string.IsNullOrEmpty(unionModel.ModelObj.DetailEnableMsg)) + { + if (unionModel.ModelObj.DetailEnableMsg.StartsWith("select", StringComparison.OrdinalIgnoreCase) || + unionModel.ModelObj.DetailEnableMsg.StartsWith("exec", StringComparison.OrdinalIgnoreCase)) + { + MessageUtil.Show(BaseImpl.GetResult(unionModel.ModelObj.DetailEnableMsg) + ""); + } + else + { + MessageUtil.Show(unionModel.ModelObj.DetailEnableMsg); + } + } + } + } + } + this.gcMain.GridControl.DataSource = gridTable; + if (position >= 0) + this.gcMain.GridView.SelectRowHandler(position); + else + this.gcMain.GridView.SelectRowHandler(gridTable.Rows.Count - 1); + //this.gcMain.GridView.SelectRowHandler(position); + gridTable.OrderBy(this.BillModel.DetailOrderField); + this.gcMain.GridView.UpdateCurrentRow(); + this.gcMain.GridView.ShowEditor(); + WaitForm.HideForm(); + } + + /// + /// 添加多行数据到单据明细中,禁用所有关联和默认值的获取 + /// + /// + /// + private void AddRowsToGridViewFast(DataRow[] rowItems) + { + try + { + DataTable gridTable = (this.gcMain.GridControl.DataSource as DataTable).TrimDeleteRows(); + foreach (DataRow rowItem in rowItems) + { + DataRow dataRow = gridTable.NewRow(); + foreach (DataColumn column in gridTable.Columns) + { + if (rowItem.Table.Columns.Contains(column.ColumnName)) + { + dataRow[column] = rowItem[column.ColumnName]; + } + } + gridTable.Rows.Add(dataRow); + } + } + catch (Exception ex) + { + MessageUtil.Show(ex.Message); + } + } + /// + /// 说明:添加多条数据到单据明细 + /// 创建人:龚宇超 + /// 创建日期:2018-05-30 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The table. + private void AddMultiRowToGridView(DataTable table, BillSourceUnionModel unionModel = null) + { + if (table == null) return; + if (this.BillModel.DetailTreeTable) + { + this.AddRowsToTreeGridControl(table, unionModel); + } + else + { + + if (!this.BillModel.IsFastDragAddDetail) + { + this.AddRowsToGridView(table, unionModel); + } + else + { + // 全部行转数组 + DataRow[] dragRows = table.Select(); + this.AddRowsToGridViewFast(dragRows); + } + + } + + + Application.DoEvents(); + } + /// + /// 说明:是否允许添加明细 + /// 创建人:龚宇超 + /// 创建日期:2018-06-06 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// true if this instance [can add detail row]; otherwise, false. + private bool CanAddDetailRow() + { + // 检测是否正在筛选数据 + if (!string.IsNullOrEmpty(gcMain.GridView.FindFilterText.Trim()) || + !string.IsNullOrEmpty(gcMain.GridView.FilterPanelText.Trim())) + { + if (MessageUtil.Show(ResourceKeys.GridViewSearching, MessageBoxButtons.YesNo) == DialogResult.Yes) + { + this.gcMain.GridView.FindFilterText = ""; + return true; + } + return false; + } + // 检测是否点击了排序表格 + if (this.gcMain.GridView.HasSortColumn()) + { + //if (MessageUtil.Show(ResourceKeys.GridViewColumnSorting, MessageBoxButtons.YesNo) == DialogResult.Yes) + //{ + this.gcMain.GridView.Columns.ClearAllSort(); + // return true; + //} + //return false; + } + // 检测是否为提交或者终审模块 + string text = Business.Impl.LanguageTranslation.Translatable ? Business.Impl.LanguageTranslation.GetTranslatedText("已终审") : "已终审"; + if (_waterMark.Text.Contains(text) && !this.BillModel.BillFinalReviewAdd) + { + MessageUtil.Show(ResourceKeys.AddBillDetailed); + return false; + } + return true; + } + + /// + /// 说明:单据明细撤回操作 + /// 创建人:曹屹峰 + /// 创建日期:2021-11-09 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void OnToWithdraw(object sender, KeyEventArgs e) + { + if (e.Control && e.KeyCode == Keys.Z) + { + if (ToWithdrawRows.Count < 1) return; + DataTable gridTable = (this.gcMain.GridControl.DataSource as DataTable).TrimDeleteRows(); + Dictionary undo = ToWithdrawRows[ToWithdrawRows.Count - 1]; + foreach (int key in undo.Keys) + { + DataRow dr = gridTable.NewRow(); + dr.ItemArray = undo[key].ItemArray; + gridTable.Rows.InsertAt(dr, key); + this.gcMain.GridView.ClearSelection(); + this.gcMain.GridView.SelectRowHandler(key); + } + gridTable.OrderBy(this.BillModel.DetailOrderField); + ToWithdrawRows.RemoveAt(ToWithdrawRows.Count - 1); + } + if (e.Alt) + { + GridView gridView = sender as GridView; + if (gridView == null) return; + if (e.KeyCode == Keys.Up) + { + DataTable dtTable = gcMain.gridControl.DataSource as DataTable; + if (gridView.FocusedRowHandle > 0 && dtTable.Columns.Contains(this.BillModel.DetailOrderField)) + { + dtTable = SwapRow(gridView.FocusedRowHandle, gridView.FocusedRowHandle - 1, dtTable); + dtTable.OrderBy(this.BillModel.DetailOrderField); + //DataTableOrderBy(dtTable); + } + } + else if (e.KeyCode == Keys.Down) + { + DataTable dtTable = gcMain.gridControl.DataSource as DataTable; + if (gridView.FocusedRowHandle < dtTable.Rows.Count - 1 && dtTable.Columns.Contains(this.BillModel.DetailOrderField)) + { + dtTable = SwapRow(gridView.FocusedRowHandle, gridView.FocusedRowHandle + 1, dtTable); + dtTable.OrderBy(this.BillModel.DetailOrderField); + //DataTableOrderBy(dtTable); + } + } + } + } + private DataTable SwapRow(int index1, int index2, DataTable dt) + { + DataRow dr = dt.NewRow(); + dr.ItemArray = dt.Rows[index1].ItemArray; + dt.Rows[index1].ItemArray = dt.Rows[index2].ItemArray; + dt.Rows[index2].ItemArray = dr.ItemArray; + return dt; + } + private void DataTableOrderBy(DataTable dtTable) + { + try + { + if (dtTable.Columns.Contains(this.BillModel.DetailOrderField)) + { + for (int i = 0; i < dtTable.Rows.Count; i++) + { + DataRow row = dtTable.Rows[i]; + if (row.RowState != DataRowState.Deleted) + { + row[this.BillModel.DetailOrderField] = (i + 1); + } + } + } + } + catch (Exception) + { + } + } + + /// + /// 说明: + /// 创建人:龚宇超 + /// 创建日期:2017-11-30 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// true if XXXX, false otherwise. + private bool ValidateDetailCond(DataRow rowItem, BillSourceUnionModel unionModel) + { + bool validate = false; + + try + { + string detailCond = ReplaceHelper.ReplaceRowParam(rowItem, unionModel.ModelObj.DetailEnableCond); + detailCond = detailCond.ToLower();//2025-09-08 赵坤表示条件全部转成小写判断。 来源明细中不能配置单元格类型(不能配置 复选框条件 {xxx}=0 ),只能写{xxx}='Ture'。这种bit类型容易忘记大小的情况 + if (detailCond.Contains("#")) + { + List condition = ReplaceHelper.GetParamFields(detailCond); + foreach (string item in condition) + { + string fieldValue = this.ControlObj.GetControlValue(item.Replace("{#", "").Replace("}", "")); + detailCond = detailCond.Replace(item, fieldValue); + } + } + if (detailCond.StartsWith("@") || detailCond.StartsWith("!")) + { + validate = "1".Equals(BaseImpl.GetDefaultValue(detailCond)); + } + else + { + + validate = ReplaceHelper.EvalCond(detailCond); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteLog(ex.StackTrace); + LogUtil.WriteError("验证多条添加条件出错!", ex); + //MessageUtil.Show(ResourceKeys.CondtionError + "\r\n" + unionModel.ModelObj.DetailEnableCond); + } + return validate; + } + /// + /// 说明:获取添加表头数据 + /// 创建人:龚宇超 + /// 创建日期:2017-12-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The parmary value. + /// System.String. + private string GetAddRecord(ref string parmaryValue) + { + if (BillModel.NewVer == 0 || BillModel.SaveVerifyBillNo) + { + // 检查当前的单据号是否已被占用. + string newBillNo = BillImpl.GetBillNo(this.BillModel.BillSeq); + + if (!parmaryValue.Equals(newBillNo)) + { + if (MessageUtil.Show(ResourceKeys.BillRecordRepeat, MessageBoxButtons.YesNo) == DialogResult.No) + { + return string.Empty; + } + else + { + this.lblOrderNo.Text = newBillNo; + parmaryValue = newBillNo; + } + } + } + + StringBuilder fieldBuilder = new StringBuilder(); + StringBuilder valueBuilder = new StringBuilder(); + + //DataTable DetailedProperties = BaseImpl.GetDataTableResult(string.Format("select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH from information_schema.columns where table_name = '{0}'", BillModel.MasterTable)); + DataTable DetailedProperties = MainImpl.GetDatabaseProperty(BillModel.MasterTable); + + string errorMessage = string.Empty;//数据不符合数据库规范的信息 + foreach (ControlModel model in this.ControlObj.ControlModels) + { + if (!model.IsSave || + model.FieldName.Equals(BillModel.PrimaryKey, StringComparison.OrdinalIgnoreCase) || + model.FieldName.Equals(BillModel.RtagidKey, StringComparison.OrdinalIgnoreCase) || + model.FieldType == ControlType.LabPic || + model.FieldType == ControlType.LabPicEx || + model.FieldType == ControlType.LabPrompt) + continue; + + if (string.IsNullOrWhiteSpace(model.FieldName)) continue; + + string fieldValue = this.ControlObj.GetControlValue(model); + if (SystemInfo.Instance.TrimWhiteSpace) + fieldValue = fieldValue.Trim(); + if (fieldValue == "****") continue; + + errorMessage = errorMessage + DatabaseFormatJudgment.SaveOrModifyBalidation(DetailedProperties, model, fieldValue); + if (string.IsNullOrEmpty(fieldValue) && model.Isintordecimal) fieldValue = "0";//数值保存时为空的话默认保存为0; + + fieldBuilder.Append(model.FieldName + ","); + valueBuilder.Append(string.IsNullOrEmpty(fieldValue) ? this.ControlObj.GetNullValue(model) : string.Format("N'{0}',", fieldValue)); + + + + } + if (!string.IsNullOrWhiteSpace(errorMessage)) SaveErrorMessage = "表头错误:" + errorMessage; + // 增加主键 + fieldBuilder.Append(BillModel.PrimaryKey); + valueBuilder.Append("N'" + parmaryValue + "'"); + // 增加红蓝字单标记 + fieldBuilder.Append("," + BillModel.RtagidKey); + valueBuilder.Append(",N'" + (rdRed.Checked ? 1 : 0) + "'"); + + return string.Format("insert into {0}({1}) values ({2})", BillModel.MasterTable, fieldBuilder.ToString().TrimEnd(','), valueBuilder.ToString().TrimEnd(',')); + } + /// + /// 说明:获取修改表头数据 + /// 创建人:龚宇超 + /// 创建日期:2017-12-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// 单据值. + /// System.String. + private string GetUpdateRecord(string parmaryValue) + { + StringBuilder updateBuilder = new StringBuilder(); + + + //DataTable DetailedProperties = BaseImpl.GetDataTableResult(string.Format("select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH from information_schema.columns where table_name = '{0}'", BillModel.MasterTable)); + DataTable DetailedProperties = MainImpl.GetDatabaseProperty(BillModel.MasterTable); + + string errorMessage = string.Empty;//数据不符合数据库规范的信息 + // 修改单据 + foreach (ControlModel model in this.ControlObj.ControlModels) + { + if (!model.IsSave || + model.FieldName.Equals(BillModel.RtagidKey, StringComparison.OrdinalIgnoreCase) || + model.FieldType == ControlType.LabPic || + model.FieldType == ControlType.LabPicEx || + model.FieldType == ControlType.LabPrompt) + continue; + + if (string.IsNullOrWhiteSpace(model.FieldName)) continue; + + BaseUserControl userControl = this.ControlObj.FindControl(model); + if (userControl != null) + { + string fieldValue = this.ControlObj.GetControlValue(model); + if (SystemInfo.Instance.TrimWhiteSpace) + fieldValue = fieldValue.Trim(); + if (fieldValue == "****") continue; + + errorMessage = errorMessage + DatabaseFormatJudgment.SaveOrModifyBalidation(DetailedProperties, model, fieldValue); + if (string.IsNullOrEmpty(fieldValue) && model.Isintordecimal) fieldValue = "0";//数值保存时为空的话默认保存为0; + + updateBuilder.Append(string.IsNullOrEmpty(fieldValue) ? string.Format("{0}={1}", model.FieldName, this.ControlObj.GetNullValue(model)) : string.Format("{0}=N'{1}',", model.FieldName, fieldValue.Contains("'") ? fieldValue.Replace("'", "''") : fieldValue)); + + } + + } + if (!string.IsNullOrWhiteSpace(errorMessage)) SaveErrorMessage = "表头错误:" + errorMessage; + return string.Format("update {0} set {1} where {2}='{3}'", BillModel.MasterTable, updateBuilder.ToString().TrimEnd(','), BillModel.PrimaryKey, parmaryValue); + } + + /// + /// 说明:获取保存明细数据 + /// 创建人:龚宇超 + /// 创建日期:2017-12-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// System.String. + private StringBuilder GetDetailRecord(string guid, string billNo, List addRowList) + { + // 构造明细 + StringBuilder detailBuilder = new StringBuilder(); + DataTable detailTable = this.gcMain.GridControl.DataSourceTable().TrimDeleteRows(); + if (this.BillModel.DetailTreeTable) + { + detailTable = ((this.gcMain as TreeGridControlEx).TreeListObj.DataSource as DataTable).TrimDeleteRows(); + } + + //string Autogrowcolumn = SqlHelper.ExecuteScalar(string.Format("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='{0}' AND COLUMNPROPERTY(OBJECT_ID('{0}'),COLUMN_NAME,'IsIdentity')=1", BillModel.DetailTable)) + ""; ;//自增长列 + //DataTable DetailedProperties = BaseImpl.GetDataTableResult(string.Format("select COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH from information_schema.columns where table_name = '{0}'", BillModel.DetailTable + "_temp"));//单据明细性表 + + string Autogrowcolumn = MainImpl.GetAutogrowcolumn(BillModel.DetailTable); + DataTable DetailedProperties = MainImpl.GetDatabaseProperty(BillModel.DetailTable + "_temp");//单据明细性表 + + //主键 + //DataTable primaryKeydt = BaseImpl.GetDataTableResult(string.Format("SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_NAME='{0}'", BillModel.DetailTable)); + //string primaryKey = string.Empty; + //bool AddPrimaryKey = false; + //if (primaryKeydt.Rows.Count > 0) + //{ + // primaryKey = primaryKeydt.Rows[0]["COLUMN_NAME"] + ""; + //} + //if (!string.IsNullOrWhiteSpace(primaryKey)) + //{ + // DataTable dt = this.gcMain.gridControl.DataSource as DataTable; + // if (dt.Columns.Contains(primaryKey)) + // { + // AddPrimaryKey = true; + // } + //} + + if (detailTable.Rows.Count > 0) + { + int lineNumber = 1; + DataTable BillColumns = BaseImpl.GetDataTableResult(string.Format("select * from {0} where 1<>1", BillModel.DetailTable)); + DataTable BillTempColumns = BaseImpl.GetDataTableResult(string.Format("select * from {0} where 1<>1", BillModel.DetailTable + "_temp")); + foreach (DataRow dataRow in detailTable.Rows) + { + string errorMessage = string.Empty;//数据不符合数据库规范的信息 + StringBuilder fields = new StringBuilder(); + StringBuilder values = new StringBuilder(); + string detailSql = @"insert into " + BillModel.DetailTable + "_temp" + "({0}) values({1});"; + fields.Append("sysstr,"); + values.Append("'" + guid + "',"); + + foreach (DataColumn item in BillColumns.Columns) + { + //GridColumn col = this.gcMain.GridView.VisibleColumns.OfType().FirstOrDefault(x => x.FieldName == item.ColumnName); + //if (col == null) + //{ + // continue; + //} + if (item.ColumnName.Equals(guidField) || item.ColumnName.Equals(mRecordPrimaryField) || item.ColumnName.Equals(ERPInfo.Instance.isAddRows)) continue; + if (!BillTempColumns.Columns.Contains(item.ColumnName)) + { + string type = "varchar(100)"; + if (item.DataType == typeof(DateTime)) + { + type = "datetime"; + } + BaseImpl.ExecSqlValue(string.Format("alter table {0} add {1} {2}", BillModel.DetailTable + "_temp", item.ColumnName, type)); + } + + if (this.BillModel.DetailTreeTable) + { + TreeListColumn[] TreeListColumns = (this.gcMain as TreeGridControlEx).TreeListObj.Columns.Cast().Where(x => x.FieldName.Equals(item.Caption, StringComparison.OrdinalIgnoreCase)).ToArray(); + if (TreeListColumns.Count() == 0 && item.Caption.Equals(BillModel.PrimaryDetailKey)) + { + string primaryValues = dataRow[BillModel.PrimaryDetailKey] + ""; + if (!string.IsNullOrWhiteSpace(primaryValues)) + { + fields.Append(item.ColumnName + ","); + values.Append("N'" + primaryValues.Replace("'", "''") + "',"); + } + } + if (TreeListColumns.Count() == 0) continue; + } + else + { + GridColumn[] gridColumns = gcMain.GridView.Columns.Cast().Where(x => x.FieldName.Equals(item.Caption, StringComparison.OrdinalIgnoreCase)).ToArray(); + + if (gridColumns.Count() == 0 && item.Caption.Equals(BillModel.PrimaryDetailKey)) + { + string primaryValues = dataRow[BillModel.PrimaryDetailKey] + ""; + if (!string.IsNullOrWhiteSpace(primaryValues)) + { + fields.Append(item.ColumnName + ","); + values.Append("N'" + primaryValues.Replace("'", "''") + "',"); + } + } + if (gridColumns.Count() == 0) continue; + } + + + fields.Append(item.ColumnName + ","); + string fieldValue = dataRow.Table.Columns.Contains(item.ColumnName) ? dataRow[item.ColumnName] + "" : string.Empty; + if (addRowList != null && addRowList.Contains(dataRow) && Autogrowcolumn.Equals(item.ColumnName)) + { + fieldValue = ""; + }; + //if (SystemInfo.Instance.TrimWhiteSpace) + // fieldValue = fieldValue.Trim(); + if (item.ColumnName.Equals(BillModel.PrimaryDetailKey, StringComparison.OrdinalIgnoreCase)) + fieldValue = billNo; + if (!string.IsNullOrWhiteSpace(fieldValue)) + { + values.Append(item.DataType == typeof(DateTime) ? "'" + Convert.ToDateTime(fieldValue).ToString("yyyy-MM-dd HH:mm:ss") + "'," : fieldValue.Contains("'") ? "N'" + fieldValue.Replace("'", "''") + "'," : "N'" + fieldValue + "',"); + } + else + { + if (item.DataType == typeof(Decimal) || + item.DataType == typeof(Double) || + item.DataType == typeof(Int16) || + item.DataType == typeof(Int32) || + item.DataType == typeof(Int64)) + values.Append("0,"); + else if (item.DataType == typeof(DateTime)) + { + values.Append("NULL,"); + } + else + { + values.Append("'',"); + + } + + } + errorMessage = errorMessage + DatabaseFormatJudgment.SaveOrModifyBalidation(_detailColumns, DetailedProperties, dataRow, item, fieldValue); + + //SaveErrorMessage = SaveErrorMessage +(string.IsNullOrWhiteSpace(DatabaseFormatJudgment.SaveOrModifyBalidation(_detailColumns, DetailedProperties, dataRow, item, fieldValue))?"":); + } + + + + detailBuilder.AppendFormat(detailSql, fields.ToString().Trim(','), values.ToString().Trim(',')); + if (!string.IsNullOrWhiteSpace(errorMessage)) errorMessage = "第" + lineNumber + "行:" + errorMessage; + SaveErrorMessage = SaveErrorMessage + errorMessage; + lineNumber++; + } + } + return detailBuilder; + } + /// + /// 说明:保存单据 + /// 创建人:龚宇超 + /// 创建日期:2018-04-20 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// 是否继续执行(0.1). + /// 是否显示成功提示信息 + /// true if XXXX, false otherwise. + private bool BillSave(int comfirm = 0, bool canTipMsg = true) + { + bool saveResult = false; + if (this.ControlObj.VerifyNull()) + { + //保存前执行某个右键 + if (!string.IsNullOrEmpty(BillModel.BeforeBillSaveExec)) + { + DataRow menuRow = BaseModuleImpl.GetBaseGridRightMenuById(BillModel.BeforeBillSaveExec); + if (menuRow != null) + { + DataTable table = gcMain.gridControl.DataSourceTable(); + ControlModel modeControlModel = ControlObj.ControlModels.Where(n => n.LabelText.Equals("上传模式")).FirstOrDefault(); + string addMode = ControlObj.GetControlValue(modeControlModel); + if (modeControlModel != null && table.Columns.Contains("qms_laddf_mode")) + { + foreach (DataRow item in table.Rows) + { + item["qms_laddf_mode"] = addMode; + } + } + ControlModel speciesNoControlModel = ControlObj.ControlModels.Where(n => n.LabelText.Equals("文件分类")).FirstOrDefault(); + string speciesNo = ControlObj.GetControlValue(speciesNoControlModel); + if (speciesNoControlModel != null && table.Columns.Contains("BomAddSpeciesNo")) + { + foreach (DataRow item in table.Rows) + { + item["BomAddSpeciesNo"] = speciesNo; + } + } + CommonMenu menu = new CommonMenu(this.SysModel, this.ControlObj, this.gcMain); + menu.ApplyBefore += new CommonToolApplyEventHandler(OnMenuApplyBefore); + menu.DynamicLinkAfter += new CommonToolAfterDynamicLinkEventHandler(OnDynamicLinkAfter); + StaticControl.RightMenuGridView = gcMain.GridView; + StaticControl.Comprefix = this.BillModel.DetailPreFix; + StaticControl.RightMenuMyControl = ControlObj; + menu.Apply(menuRow); + if (!menu.issuccess) + { + return false; + } + } + } + //记录表格状态 + List addRowList = new List(); + DataTable sourceTable = gcMain.GridControl.DataSourceTable(); + foreach (DataRow dataRow in sourceTable.Rows) + { + if (dataRow.RowState == DataRowState.Added) + { + addRowList.Add(dataRow); + } + } + // 保存之前先进行表格更新 + if (this.BillModel.DetailTreeTable) + { + (this.gcMain as TreeGridControlEx).TreeListObj.PostEditor(); + //(this.gcMain as TreeGridControlEx).TreeListObj.UpdateCurrentRow(); + } + else + { + this.gcMain.GridView.PostEditor(); + this.gcMain.GridView.UpdateCurrentRow(); + } + //虚构一个保存存储过程 + DataTable tvp = new DataTable(); + //更新前进行数据源筛选 + if (DateColumnList.Count > 0) + { + // 创建临时表 + tvp.Columns.Add("lblOrderNo", typeof(string)); // 固定主键 + tvp.Columns.Add("billdocument_id", typeof(string)); // 固定主键 + tvp.Columns.Add("showday", typeof(string)); + tvp.Columns.Add("amount", typeof(decimal)); + + // 获取主数据源 + DataTable mainDataSource = gcMain.GridControl.DataSourceTable(); + if (mainDataSource.Columns.Contains(BillModel.DetailUUIDKey)) + { + // 遍历主数据源 + foreach (DataRow row in mainDataSource.Rows) + { + if (row.RowState == DataRowState.Modified || row.RowState == DataRowState.Added) + { + // 提取 billdocument_id + string key = row[BillModel.DetailUUIDKey].ToString(); + if (!string.IsNullOrEmpty(key)) + { + // 遍历列并处理虚拟列 + foreach (GridColumn col in DateColumnList) + { + // 检查值是否发生变化 + bool isVerifyupd = true; + if (row.RowState == DataRowState.Modified) + { + object originalValue = row[col.FieldName, DataRowVersion.Original]; + object currentValue = row[col.FieldName, DataRowVersion.Current]; + isVerifyupd = !object.Equals(originalValue, currentValue); + } + + if (isVerifyupd) + { + // 解析金额 + decimal newAmount = 0m; + if (row[col.FieldName] != DBNull.Value && !string.IsNullOrWhiteSpace(row[col.FieldName].ToString())) + { + decimal.TryParse(row[col.FieldName].ToString(), out newAmount); + } + // 插入数据到临时表 + DataRow dr = tvp.NewRow(); + dr["billdocument_id"] = key; + dr["showday"] = col.FieldName; //列名如 "2025-03-06" + dr["amount"] = newAmount; + tvp.Rows.Add(dr); + } + } + } + } + } + } + } + try + { + if (this.gcMain.VerifyNull()) + { + if (this.gcMain.RepeatedVerificationNames.Count > 0 && this.gcMain.VerifyDuplicateColumns()) + { + MessageUtil.Show("表格中数据内容重复,保存失败!"); + return saveResult; + } + //if(!VerificationCond()) return saveResult; + + WaitForm.ShowForm(ResourceKeys.DataSaving); + string billNo = this.lblOrderNo.Text.Trim(); + string detailGuid = Guid.NewGuid().ToString(); + + string masterSql = BillModel.SaveState ? GetUpdateRecord(billNo) : GetAddRecord(ref billNo); + string detailSql = GetDetailRecord(detailGuid, billNo, addRowList).ToString(); + // 检查单据头数据合法性 + if (string.IsNullOrEmpty(masterSql)) return false; + + // 验证明细合法性 + if (string.IsNullOrEmpty(detailSql) && !this.BillModel.SaveNullDetail) + { + MessageUtil.Show(ResourceKeys.BillDetailIsNotNull); + return false; + } + + + string tipMsg = string.Empty; + int result = BillImpl.BillSave(masterSql, detailSql, BillModel.DetailTable, ref billNo, detailGuid, BillModel.BillSeq, BillModel.SaveState ? 2 : 1, comfirm, out tipMsg, 0, this.BillModel.NewVer); + WaitForm.HideForm(); + switch (result) + { + case 1: + // 保存成功 + if (canTipMsg) MessageUtil.Show(BillModel.TypeName + ResourceKeys.SaveSuccess); + if (ApiHelper.IsExecEventApi(Interface.Api.OperateEvent.AfterModuleDataChange, this.SysModel.ModuleCode, 0)) + { + ApiHelper apiHelper = new ApiHelper(this.SysModel.ModuleCode, billNo, BillModel.PrimaryKey, BillModel.MasterTable, 0); + switch (BillModel.SaveState) + { + case false: + apiHelper.OnEvent(Interface.Api.OperateEvent.AfterModuleDataChange, Interface.Api.ActionType.Add);//添加 + break; + case true: + apiHelper.OnEvent(Interface.Api.OperateEvent.AfterModuleDataChange, Interface.Api.ActionType.Update);//更新 + break; + } + if (!apiHelper.apiHandler.GetApiSuccess(apiHelper.apiHandlerModels) && canTipMsg) + { + MessageUtil.Show(apiHelper.apiResutMsg); + } + } + this.lblOrderNo.Text = billNo; + this.SetBillStatus(BillImpl.GetDataRowResult(string.Format("select * from {0} where {1}='{2}'", BillModel.MasterTable, BillModel.PrimaryKey, billNo))); + saveResult = true; + OnBillChanged(EventArgs.Empty); + RefreshPrindMenu(); + + //保存完成后所有数据源进行拼接执行保存 + if (tvp != null && tvp.Rows.Count > 0) + { + if (gcMain.jhrowitem != null) + { + // 插入数据到临时表 + DataRow dr = tvp.NewRow(); + dr["lblOrderNo"] = billNo; + dr["billdocument_id"] = "计划文件" + gcMain.jhrowitem.ToJsonObject(); + if (DateColumnList.Count > 0 && DateColumnList[0].Tag is DateTime dateTime) + { + dr["showday"] = dateTime.ToString("yyyy-MM-dd"); //日期 + } + tvp.Rows.Add(dr); + + } + foreach (DataRow item in tvp.Rows) + { + item["lblOrderNo"] = billNo; + } + + // 调用存储过程保存变更数据 + string msg; + int ret = SaveDayPlanChanges(tvp, out msg); + if (ret != 1) + { + MessageUtil.Show("保存失败:" + msg); + } + OnGcMainDataSourceChanged(gcMain.GridView, null);//手动刷新日期合计数据源 + } + break; + case 9: + // 继续执行保存 + if (string.IsNullOrWhiteSpace(tipMsg)) tipMsg = "保存单据临时表失败"; + if (MessageUtil.Show(tipMsg, MessageBoxButtons.YesNo) == DialogResult.Yes) + saveResult = this.BillSave(1, canTipMsg); + break; + default: + // 保存失败 + SaveErrorMessage = SaveErrorMessage + "\r\n" + "出错原因:\r\n" + tipMsg; + MessageUtil.Show(BillModel.TypeName + ResourceKeys.SaveFault + "\r\n" + SaveErrorMessage); + SaveErrorMessage = string.Empty; + + if (tipMsg.Contains("ruleid") && false) + { + string ruleid = tipMsg.Split(',')[0].Replace("ruleid", "").Replace("=", "").Trim(); + string sql = string.Format("select * from p_systembusinesslogictab where id = '{0}'", ruleid); + string rulesModid = string.Empty; + string rulesParam = this.ControlObj.ReplaceParentControlValue(ReplaceHelper.ReplaceUserInfo("")); + + } + + if (tipMsg.StartsWith("@") && false) + { + //根据tipMsg中数据找到pMenu中对应的右键 + foreach (BarItemLink itemLink in pMenu.ItemLinks) + { + if (false) + { + ErrorRestriction errorRestriction = new ErrorRestriction(tipMsg, this.SysModel, this.ControlObj, itemLink, this.BillModel, this.lblOrderNo.Text.Trim()); + DialogResult drr = errorRestriction.ShowDialog(); + errorRestriction.Dispose(); + } + } + } + break; + } + } + } + catch (Exception ex) + { + + if (string.IsNullOrWhiteSpace(SaveErrorMessage)) + { + MessageUtil.Show(ex.Message); + } + else + { + MessageUtil.Show("保存单据失败!\r\n" + SaveErrorMessage); + } + SaveErrorMessage = string.Empty; + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError("保存单据失败!", ex); + } + finally + { + WaitForm.HideForm(); + } + } + return saveResult; + } + + /// + /// 说明:通过配置条件刷新打印菜单 + /// 创建人:王一帆 + /// 创建日期:2020-04-10 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The hint MSG. + /// true if XXXX, false otherwise. + public void RefreshPrindMenu() + { + if (!string.IsNullOrWhiteSpace(BillModel.BillPrintTag)) + { + pMprint.ClearLinks(); + // 打印模版 + DataRow rowItem = this.gcMain.GridView.GetDataRow(this.gcMain.GridView.FocusedRowHandle); + string BillPrintTag = this.ControlObj.ReplaceParentControlValue(BillModel.BillPrintTag); + BillPrintTag = ReplaceHelper.ReplaceRowParam(rowItem, BillPrintTag); + // BillPrintTag = ReplaceHelper.ReplaceParamToValue(BillPrintTag,this.lblOrderNo.Text.Trim()); + string value = MainImpl.GetResult(ReplaceHelper.ReplaceRowParam(rowItem, BillPrintTag)) + ""; + string[] files = value.Split('|'); + for (int i = 0; i < files.Length; i++) + { + string fileName = files[i]; + if (!string.IsNullOrWhiteSpace(fileName)) + { + BarButtonItem itemPrint = new BarButtonItem(); + int index = i + 1; + itemPrint.Caption = files[i].Replace(".rmf", "").Replace(".frx", ""); + itemPrint.Tag = files[i]; + itemPrint.ItemClick += new ItemClickEventHandler(OnPrintItemClick); + pMprint.AddItem(itemPrint); + } + } + } + } + /// + /// 说明:单据提交 + /// 创建人:龚宇超 + /// 创建日期:2017-12-13 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The hint MSG. + /// true if XXXX, false otherwise. + private void BillApply(string hintMsg, int comfirm = 0) + { + try + { + WaitForm.ShowForm(ResourceKeys.Handing); + string tipMsg = string.Empty; + string billNo = this.lblOrderNo.Text.Trim(); + if (ApiHelper.IsExecEventApi(Interface.Api.OperateEvent.BeforeModuleAuditStateChange, this.SysModel.ModuleCode, 0)) + { + ApiHelper apiHelper = new ApiHelper(this.SysModel.ModuleCode, billNo, this.BillModel.PrimaryKey, this.BillModel.MasterTable, 0); + apiHelper.OnEvent(Interface.Api.OperateEvent.BeforeModuleAuditStateChange, Interface.Api.ActionType.Submit);//提交 + if (!apiHelper.apiHandler.GetApiSuccess(apiHelper.apiHandlerModels)) + { + MessageUtil.Show(ResourceKeys.ApplyFault + "\r\n" + apiHelper.apiResutMsg); + return; + } + } + int result = BillImpl.BillApply(this.SysModel.ModuleCode, billNo, "", 1, out tipMsg, comfirm); + WaitForm.HideForm(); + switch (result) + { + case 1: + // 提交成功 + if (!this.BillModel.DisableSubmitPrompt) MessageUtil.Show(BillModel.TypeName + ResourceKeys.ApplySuccess); + this.SetBillStatus(BillImpl.GetDataRowResult(string.Format("select * from {0} where {1}='{2}'", BillModel.MasterTable, BillModel.PrimaryKey, billNo))); + OnBillChanged(EventArgs.Empty); + + if (this.BillModel.ApplyRefresh) + { + this.SetBillStatus(null); + this.ControlObj.ResetControlValue(); + } + if (ApiHelper.IsExecEventApi(Interface.Api.OperateEvent.AfterModuleAuditStateChange, this.SysModel.ModuleCode, 0)) + { + ApiHelper apiHelper = new ApiHelper(this.SysModel.ModuleCode, billNo, this.BillModel.PrimaryKey, this.BillModel.MasterTable, 0); + apiHelper.OnEvent(Interface.Api.OperateEvent.AfterModuleAuditStateChange, Interface.Api.ActionType.Submit);//提交 + if (!apiHelper.apiHandler.GetApiSuccess(apiHelper.apiHandlerModels)) + { + MessageUtil.Show(apiHelper.apiResutMsg); + } + } + if (BillModel.IsApplyAferAdd || SystemInfo.Instance.BillNewAfterCommit) + { + this.OnBillAddClick(this.btnBillAdd, null); + //this.btnBillAdd.PerformClick(); + } + // 推送消息 + PushHelper push = new PushHelper(billNo, "0", this.SysModel.ModuleCode, "", "", 0); + push.Push_Bill_Oper_Message(); + + break; + case 9: + // 继续执行保存 + if (string.IsNullOrWhiteSpace(tipMsg)) tipMsg = "提交单据失败"; + if (MessageUtil.Show(tipMsg, MessageBoxButtons.YesNo) == DialogResult.Yes) + this.BillApply("", 1); + break; + case 99: + // 继续执行提交 + if (MessageUtil.Show(tipMsg, MessageBoxButtons.YesNo) == DialogResult.Yes) + { + FrmPrompt prompt = new FrmPrompt(tipMsg); + prompt.Size = new Size(300, 200); + + DialogResult dialog = prompt.ShowDialog(); + if (dialog == DialogResult.OK) + { + this.BillApply(prompt.PromptMsg); + } + } + break; + default: + // 提交失败 + MessageUtil.Show(BillModel.TypeName + ResourceKeys.ApplyFault + "\r\n" + tipMsg); + break; + } + } + catch + { + throw; + } + finally + { + WaitForm.HideForm(); + } + } + /// + /// 说明:点击空白界面后需要获取焦点 + /// 创建人:王一帆 + /// 创建日期:2020-09-04 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void OnMainFocusAfter(object sender, EventArgs e) + { + this.pl_main_center_master.Focus(); + } + /// + /// 说明:打印完成后回调 + /// 创建人:龚宇超 + /// 创建日期:2018-07-05 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The e. + private void OnReportPrintAfter(object sender, EventArgs e) + { + //打印完成后添加数据库 + if (_printSaveParams != null && _printSaveParams.Count > 0) + { + int result = BaseModuleImpl.SavePrintRecord(_printSaveParams[0], _printSaveParams[1], _printSaveParams[2], _printSaveParams[3], _printSaveParams[4]); + } + + } + /// + /// 说明: + /// 创建人:龚宇超 + /// 创建日期:2017-11-28 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnFrmMainKeyDown(object sender, KeyEventArgs e) + { + } + + /// + /// 主表数据源改变时 + /// + /// + /// + private void OnGcMainDataSourceChanged(object sender, EventArgs e) + { + if (DateColumnList.Count > 0 && DateColumnList[0].Tag is DateTime dateTime) + { + string billNo = this.lblOrderNo.Text; + this.gcMain.GridControl.DataSourceChanged -= OnGcMainDataSourceChanged; + DataTable dataTable = gcMain.GridControl.DataSource as DataTable; + if (dataTable != null) + { + //DataTable dataMain = dataTable.Copy(); + //string sqlValue = "select * from RD_worktimetab where 1 = 1"; + //sqlValue = $"{sqlValue} and lblOrderNo = '{billNo}' and showday >= '{dateTime.ToString("yyyy-MM-dd")}'"; + //DataTable dataDayPlan = BaseImpl.GetDataTableResult(sqlValue); + //---------- 查询①:渲染表格排程” ---------- + string sqlExcludePlan = "SELECT * FROM RD_worktimetab WHERE 1 = 1"; + sqlExcludePlan += $" AND lblOrderNo = '{billNo}'"; + sqlExcludePlan += $" AND showday >= '{dateTime:yyyy-MM-dd}'"; + sqlExcludePlan += " AND billdocument_id NOT LIKE N'计划文件%'"; + // 获取结果 + DataTable dataNoPlanFile = BaseImpl.GetDataTableResult(sqlExcludePlan); + // ---------- 查询②:只包含“计划文件” ---------- + string sqlIncludePlan = "SELECT billdocument_id FROM RD_worktimetab WHERE 1 = 1"; + sqlIncludePlan += $" AND lblOrderNo = '{billNo}'"; + sqlIncludePlan += $" AND showday >= '{dateTime:yyyy-MM-dd}'"; + sqlIncludePlan += " AND billdocument_id LIKE N'计划文件%'"; + // 获取结果 + DataTable dataOnlyPlanFile = BaseImpl.GetDataTableResult(sqlIncludePlan); + MergeMainDataWithDayPlan(dataTable, dataNoPlanFile, dateTime); + //若存在缓存计划数据则渲染合计 + if (dataOnlyPlanFile.Rows.Count > 0) + { + string jhrowtiemjson = (dataOnlyPlanFile.Rows[0]["billdocument_id"] + "").Replace("计划文件", ""); + try + { + JObject rowObject = JsonConvert.DeserializeObject(jhrowtiemjson); + JArray jArray = new JArray(); + jArray.Add(rowObject); + DataRow jhrowitem = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(jArray)).Rows[0]; + //渲染计划合计 + gcMain.AddHeadquarters(jhrowitem); + } + catch (Exception) + { + } + } + //else + //{ + // gcMain.AddHeadquarters(null); + //} + gcMain.RefreshHeaderColor(); + this.gcMain.GridControl.DataSource = null; + this.gcMain.GridControl.DataSource = dataTable; + } + this.gcMain.GridControl.DataSourceChanged += OnGcMainDataSourceChanged; + } + } + + /// + /// 保存日计划变更数据(批量保存)。 + /// 调用存储过程 usp_MergeDayPlanChanges,将所有变更记录一次性提交到数据库。 + /// 通过 TVP 参数传递数据,同时捕获输出参数 @msg 和返回值。 + /// + /// 包含所有变更记录的 DataTable,必须与 dbo.DayPlanChangeType 定义一致 + /// 输出提示信息,存储过程执行后的返回消息 + /// 存储过程返回值,成功返回 1,失败返回 0 + public int SaveDayPlanChanges(DataTable tvp, out string message) + { + // 创建输出参数 @msg + SqlParameter pMsg = new SqlParameter("@msg", SqlDbType.VarChar, 2000) + { + Direction = ParameterDirection.Output + }; + // 创建返回值参数 @return + SqlParameter returnValue = new SqlParameter("@return", SqlDbType.Int) + { + Direction = ParameterDirection.ReturnValue + }; + // 创建 TVP 参数,名称必须与存储过程参数一致 + SqlParameter tvpParam = new SqlParameter("@DayPlanChanges", SqlDbType.Structured) + { + TypeName = "dbo.DayPlanChangeTVP", + Value = tvp + }; + // 构造参数数组 + SqlParameter[] parameters = new SqlParameter[] { tvpParam, pMsg, returnValue }; + // 执行存储过程,此处调用 ExecuteNonQuery 即可,不需要返回数据集 + // 请确保 DBUtil.ExecuteNonQuery 方法能够传递参数并执行存储过程 + BaseImpl.ExecProcedure("usp_MergeDayPlanChanges2025", parameters); + // 获取输出参数 @msg 中的提示信息 + message = pMsg.Value.ToString(); + // 获取存储过程的返回值 + int result = Convert.ToInt32(returnValue.Value); + return result; + } + + /// + /// 计划明细与主数据合并: + /// 1) 按 起算 7 天动态生成列; + /// 2) 把 dataDayPlan 中对应日期的 amount 值填入主表; + /// 3) 计算行级合计写入 “heji” 列。 + /// + private DataTable MergeMainDataWithDayPlan(DataTable dataMain, DataTable dataDayPlan, DateTime startDate) + { + const string rightPrimaryKey = "billdocument_id"; // dataDayPlan 主键 + const string dateField = "showday"; + const string amountField = "amount"; + string topPrimaryKey = BillModel.DetailUUIDKey; // dataMain 主键 + + int dayCount = 0; + BaseUserControl baseUserControl = ControlObj.FindControl("bom_rdm_tianshu"); + if (baseUserControl != null) + { + int.TryParse(baseUserControl.EditText, out dayCount); + } + if (dayCount <= 0) + { + dayCount = 7; + } + DateTime endDate = startDate.AddDays(dayCount); + + // ---------- 1. 预索引 dataDayPlan:billdocument_id -> List ---------- + var dayPlanMap = new Dictionary>(); + foreach (DataRow row in dataDayPlan.Rows) + { + string billId = row[rightPrimaryKey].ToString(); + if (!dayPlanMap.TryGetValue(billId, out var list)) + { + list = new List(); + dayPlanMap[billId] = list; + } + list.Add(row); + } + + // ---------- 2. 为主表添加日期列和合计列 ---------- + for (DateTime d = startDate; d <= endDate; d = d.AddDays(1)) + { + string colName = d.ToString("yyyy-MM-dd"); + if (!dataMain.Columns.Contains(colName)) + dataMain.Columns.Add(colName, typeof(decimal)); + } + if (!dataMain.Columns.Contains("workingsum")) + dataMain.Columns.Add("workingsum", typeof(decimal)); + + // ---------- 3. 预构建填充映射:主键 -> (日期列名, 金额) ---------- + var dataMap = new Dictionary>(); + foreach (DataRow mainRow in dataMain.Rows) + { + string key = mainRow[topPrimaryKey].ToString(); + var inner = new Dictionary(); + dataMap[key] = inner; + + if (dayPlanMap.TryGetValue(key, out var rows)) + { + foreach (DataRow dayRow in rows) + { + if (dayRow[dateField] == DBNull.Value) continue; + + DateTime d = Convert.ToDateTime(dayRow[dateField]); + if (d < startDate || d > endDate) continue; + + string col = d.ToString("yyyy-MM-dd"); + if (!dataMain.Columns.Contains(col)) continue; + + if (decimal.TryParse(dayRow[amountField]?.ToString(), out decimal amt)) + inner[col] = amt; + } + } + } + + // ---------- 4. 一次性填充并计算行合计 ---------- + foreach (DataRow mainRow in dataMain.Rows) + { + string key = mainRow[topPrimaryKey].ToString(); + decimal rowSum = 0m; + + if (dataMap.TryGetValue(key, out var inner)) + { + foreach (var kv in inner) + { + mainRow[kv.Key] = kv.Value; + rowSum += kv.Value; + } + } + + mainRow["workingsum"] = rowSum; // 行汇总 + } + + return dataMain; + } + + /// + /// 构建带日期的数据源 + /// + /// + /// + /// + /// + private void UpdateRowWithDayPlan(DataRow focusedRow, DataTable dataDayPlan, DateTime startDate) + { + string rightPrimaryKey = "billdocument_id"; + string dateField = "showday"; + string amountField = "amount"; + string topPrimaryKey = BillModel.DetailUUIDKey; + + int dayCount = 0; + BaseUserControl baseUserControl = ControlObj.FindControl("bom_rdm_tianshu"); + if (baseUserControl != null) + { + int.TryParse(baseUserControl.EditText, out dayCount); + } + if (dayCount <= 0) + { + dayCount = 7; + } + + DateTime endDate = startDate.AddDays(dayCount); // 计算结束日期 + // **1. 预索引 dataDayPlan 数据(billdocument_id -> 该 key 相关的所有行)** + Dictionary> dayPlanMap = new Dictionary>(); + foreach (DataRow row in dataDayPlan.Rows) + { + string billId = row[rightPrimaryKey].ToString(); + if (!dayPlanMap.ContainsKey(billId)) + { + dayPlanMap[billId] = new List(); + } + dayPlanMap[billId].Add(row); + } + // **2. 预构建主数据的列** + for (DateTime dt = startDate; dt <= endDate; dt = dt.AddDays(1)) + { + string colName = dt.ToString("yyyy-MM-dd"); + if (!focusedRow.Table.Columns.Contains(colName)) + { + focusedRow.Table.Columns.Add(colName, typeof(decimal)); // 确保列存在 + } + } + // **3. 预构建数据填充映射表** + Dictionary> dataMap = new Dictionary>(); + string key = focusedRow[topPrimaryKey].ToString(); + if (!dataMap.ContainsKey(key)) + { + dataMap[key] = new Dictionary(); + } + // **查找 key 关联的时间数据** + if (dayPlanMap.ContainsKey(key)) + { + foreach (DataRow dayRow in dayPlanMap[key]) + { + if (dayRow[dateField] != DBNull.Value) + { + DateTime dayValue = Convert.ToDateTime(dayRow[dateField]); + string colName = dayValue.ToString("yyyy-MM-dd"); + if (dayValue >= startDate && dayValue <= endDate && focusedRow.Table.Columns.Contains(colName)) + { + decimal.TryParse(dayRow[amountField] + "", out decimal amountValue); + dataMap[key][colName] = amountValue; + } + } + } + } + // **4. 一次性填充 DataTable(避免逐行赋值带来的性能问题)** + if (dataMap.ContainsKey(key)) + { + foreach (var col in dataMap[key]) + { + focusedRow[col.Key] = col.Value; + } + } + } + + /// + /// 说明:单据空行新增时初始化默认值 + /// 创建人:dl + /// 创建日期:2019-01-29 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + private void OnGridViewInitNewRow(object sender, InitNewRowEventArgs e) + { + GridView view = sender as DevExpress.XtraGrid.Views.Grid.GridView; + DataTable gridTable = (this.gcMain.GridControl.DataSource as DataTable).TrimDeleteRows(); + DataRow tmpRow = view.GetDataRow(e.RowHandle); + GridColumnCollection gridColumns = view.Columns; + //gridTable.Rows.Add(tmpRow); + int position = gridTable.Rows.Count; + foreach (GridColumn col in gridColumns) + { + GridColumnModel model = col.Tag as GridColumnModel; + if (model == null) + { + continue; + } + string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); + + if (model.DefaultValue.Contains("{#")) + { + fieldValue = this.ControlObj.ReplaceParentControlValue(model.DefaultValue); + if (!string.IsNullOrEmpty(fieldValue)) + { + tmpRow[col.FieldName] = fieldValue; + view.SetFocusedRowCellValue(col, fieldValue); + } + } + else if (!string.IsNullOrEmpty(model.DefaultValue)) + { + + tmpRow[col.FieldName] = fieldValue; + view.SetFocusedRowCellValue(col, fieldValue); + + if (model.DefaultValue.Contains("{ROW")) + { + if (position > 0) + { + + fieldValue = ReplaceHelper.GetParamFields(model.DefaultValue)[0]; + fieldValue = fieldValue.Replace("}", "").Replace("{", ""); + fieldValue = fieldValue.Substring(fieldValue.IndexOf('_') + 1); + string topFieldValue = gridTable.Rows[position - 1][fieldValue] + ""; + if (gridTable.Columns[model.FieldName].DataType == typeof(DateTime)) + { + if (!string.IsNullOrEmpty(topFieldValue)) + { + tmpRow[model.FieldName] = Convert.ToDateTime(topFieldValue); + view.SetFocusedRowCellValue(col, topFieldValue); + } + } + else + { + tmpRow[model.FieldName] = topFieldValue; + view.SetFocusedRowCellValue(col, topFieldValue); + } + } + } + else + { + tmpRow[model.FieldName] = fieldValue; + view.SetFocusedRowCellValue(col, fieldValue); + } + + } + } + //设置序号 + gridTable.OrderBy(this.BillModel.DetailOrderField, false); + //设置当前行序号 + if (gridTable != null && gridTable.Rows.Count > 0 && !string.IsNullOrEmpty(this.BillModel.DetailOrderField) && gridTable.Columns.Contains(this.BillModel.DetailOrderField)) + { + bool getMaxIndex = int.TryParse(gridTable.Rows.Cast().Max(n => n[this.BillModel.DetailOrderField]) + "", out int maxIndex); + if (getMaxIndex) + { + tmpRow[this.BillModel.DetailOrderField] = maxIndex + 1; + } + } + if (gridTable.Columns.Contains(this.BillModel.DetailOrderField) && gridTable.Rows.Count == 0) + { + tmpRow[this.BillModel.DetailOrderField] = 1; + } + //this.gcMain.GridView.UpdateCurrentRow(); + //this.gcMain.GridView.ShowEditor(); + } + /// + /// 说明:右键菜单执行后刷新数据,刷新规则按照上一次查询条件刷新 + /// 创建人:龚宇超 + /// 创建日期:2017-11-02 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + private void OnGridViewRightCallBack(object sender, EventArgs e) + { + string billNo = this.lblOrderNo.Text.Trim(); + this.SetBillStatus(BillImpl.GetDataRowResult(string.Format("select * from {0} where {1}='{2}'", BillModel.MasterTable, BillModel.PrimaryKey, billNo))); + } + /// + /// 说明:重绘单据水印 + /// 创建人:龚宇超 + /// 创建日期:2017-12-04 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnLabelTitlePaint(object sender, PaintEventArgs e) + { + if (this._waterMark != null) + { + GraphicsText graphicsText = new GraphicsText(); + graphicsText.Graphics = e.Graphics; + + // 绘制围绕点旋转的文本 + StringFormat format = new StringFormat(); + format.Alignment = StringAlignment.Center; + format.LineAlignment = StringAlignment.Center; + + // 绘制单据状态文本 + if (!string.IsNullOrEmpty(this._waterMark.Text)) + { + + + if (Business.Impl.LanguageTranslation.Translatable) + { + graphicsText.DrawString(this._waterMark.Text, new Font("宋体", 12, FontStyle.Bold), new SolidBrush(Color.Red), new PointF(50, 21), format, 0f); + // 测量文本实际尺寸(含字体和格式影响) + SizeF textSize = e.Graphics.MeasureString(this._waterMark.Text, new Font("宋体", 12, FontStyle.Bold), new SizeF(float.MaxValue, float.MaxValue), format); + int rectWidth = (int)textSize.Width + 10; + int rectHeight = (int)textSize.Height + 5; + // 文本中心点是(50,21),计算边框左上角坐标(确保边框围绕文本居中) + int rectX = 50 - rectWidth / 2; + int rectY = 21 - rectHeight / 2; + + e.Graphics.DrawRectangle(new Pen(Color.Red, 2f), new Rectangle(rectX, rectY, rectWidth, 21)); + } + else + { + graphicsText.DrawString(this._waterMark.Text, new Font("宋体", 12, FontStyle.Bold), new SolidBrush(Color.Red), new PointF(50, 21), format, -15f); + + e.Graphics.TranslateTransform(0, 0); + e.Graphics.RotateTransform(-15f); + e.Graphics.DrawRectangle(new Pen(Color.Red, 2f), new Rectangle(14, 20, 55, 21)); + } + + } + + // 绘制打印次数文本 + e.Graphics.ResetTransform(); + if (!string.IsNullOrEmpty(this._waterMark.Print)) + { + + + if (Business.Impl.LanguageTranslation.Translatable) + { + graphicsText.DrawString(this._waterMark.Print, new Font("宋体", 11, FontStyle.Bold), new SolidBrush(Color.Red), new PointF((this.lbTitle.Width - 70), 21), format, 0f); + // 测量文本实际尺寸(含字体和格式影响) + SizeF textSize = e.Graphics.MeasureString(this._waterMark.Print, new Font("宋体", 11, FontStyle.Bold), new SizeF(float.MaxValue, float.MaxValue), format); + int rectWidth = (int)textSize.Width + 10; + int rectHeight = (int)textSize.Height + 5; + // 文本中心点是(this.lbTitle.Width - 70,21),计算边框左上角坐标(确保边框围绕文本居中) + int rectX = (this.lbTitle.Width - 70) - rectWidth / 2; + int rectY = 21 - rectHeight / 2; + + e.Graphics.DrawRectangle(new Pen(Color.Red, 2f), new Rectangle(rectX, rectY, rectWidth, 21)); + } + else + { + graphicsText.DrawString(this._waterMark.Print, new Font("宋体", 11, FontStyle.Bold), new SolidBrush(Color.Red), new PointF((this.lbTitle.Width - 70), 21), format, -15f); + e.Graphics.TranslateTransform(this.lbTitle.Width - 70, 21); + e.Graphics.RotateTransform(-15f); + e.Graphics.DrawRectangle(new Pen(Color.Red, 2f), new Rectangle(-35, -14, 70, 21)); + } + + } + + // 绘制收款文本 + e.Graphics.ResetTransform(); + if (!string.IsNullOrEmpty(this._waterMark.Collect)) + { + + + if (Business.Impl.LanguageTranslation.Translatable) + { + graphicsText.DrawString(this._waterMark.Collect, new Font("宋体", 12, FontStyle.Bold), new SolidBrush(Color.Red), new PointF((this.lbTitle.Width - 170), 21), format, 0f); + // 测量文本实际尺寸(含字体和格式影响) + SizeF textSize = e.Graphics.MeasureString(this._waterMark.Collect, new Font("宋体", 12, FontStyle.Bold), new SizeF(float.MaxValue, float.MaxValue), format); + int rectWidth = (int)textSize.Width + 10; + int rectHeight = (int)textSize.Height + 5; + // 文本中心点是(this.lbTitle.Width - 170,21),计算边框左上角坐标(确保边框围绕文本居中) + int rectX = (this.lbTitle.Width - 170) - rectWidth / 2; + int rectY = 21 - rectHeight / 2; + + e.Graphics.DrawRectangle(new Pen(Color.Red, 2f), new Rectangle(rectX, rectY, rectWidth, 21)); + } + else + { + graphicsText.DrawString(this._waterMark.Collect, new Font("宋体", 12, FontStyle.Bold), new SolidBrush(Color.Red), new PointF((this.lbTitle.Width - 170), 21), format, -15f); + + e.Graphics.TranslateTransform(this.lbTitle.Width - 100, 21); + e.Graphics.RotateTransform(-15f); + e.Graphics.DrawRectangle(new Pen(Color.Red, 2f), new Rectangle(-100, -32, 55, 21)); + } + + + } + } + } + /// + /// 说明:新增单据 + /// 创建人:龚宇超 + /// 创建日期:2017-12-14 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnBillAddClick(object sender, EventArgs e) + { + if (!this.BillModel.SaveState && this.gcMain.DataRowCount() > 0) + { + DialogResult result = MessageUtil.Show(("数据未保存,是否确定新建单据?"), MessageBoxButtons.YesNo); + if (result == DialogResult.Yes) + { + this.SetBillStatus(null); + this.ControlObj.ResetControlValue(this.BillModel.ManuallyTriggerCorrelation, true); + } + } + else + { + this.SetBillStatus(null); + this.ControlObj.ResetControlValue(this.BillModel.ManuallyTriggerCorrelation, true); + } + if (ScanCodeTextEdit != null) ScanCodeTextEdit.Focus(); + } + + /// + /// 关闭时判断是否存在为保存新增单据 + /// + /// + public bool closeTheJudgment() + { + //if(this.ControlObj.VerifyUpdated()) + if (!this.BillModel.SaveState && this.gcMain.DataRowCount() > 0) + { + return true; + } + return false; + + } + + + /// + /// 说明:删除明细记录 + /// 创建人:龚宇超 + /// 创建日期:2017-12-05 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnDeleteClick(object sender, EventArgs e) + { + try + { + //树表格删除 + if (this.BillModel.DetailTreeTable) + { + string deleteCond = this.ControlObj.ReplaceParentControlValue(BillModel.DeleteDetailCond); + (this.gcMain as TreeGridControlEx).DeleteSelectedRows(deleteCond); + return; + } + + + + int[] rows = this.gcMain.GridView.GetSelectedRows(); + if (rows.Length < 1) + return; + + DataTable dt = this.gcMain.GridView.GetGridViewFilteredAndSortedDataToDataTable(); + + + if (string.IsNullOrEmpty(BillModel.DeleteDetailCond)) + { + DialogResult result = MessageUtil.Show(string.Format(ResourceKeys.DeleteRows, rows.Length), MessageBoxButtons.YesNo); + if (result == DialogResult.Yes) + { + //保存删除的行和对应的行号 + //撤销多次 + Dictionary undo = new Dictionary(); + for (int i = 0; i < rows.Length; i++) + { + DataRow rowItem = this.gcMain.GridView.GetDataRow(rows[i]); + DataRow dr = dt.NewRow(); + dr.ItemArray = rowItem.ItemArray; + undo.Add(rows[i], dr); + } + ToWithdrawRows.Add(undo); + this.gcMain.GridView.Columns.ClearAllSort(); + this.gcMain.GridView.DeleteSelectedRows(); + this.gcMain.GridView.ClearSelection(); + this.gcMain.GridView.SelectRow(this.gcMain.GridView.FocusedRowHandle); + this.gcMain.GridControl.DataSourceTable().OrderBy(this.BillModel.DetailOrderField); + } + } + else + { + string successMsg = string.Empty, faultMsg = string.Empty; + string deleteCond = this.ControlObj.ReplaceParentControlValue(BillModel.DeleteDetailCond); + List deleteRows = new List(); + List faultInts = new List(); + //ToWithdrawRows.Clear();//清空上一次记录的删除行 + Dictionary undo = new Dictionary(); + + foreach (int rowIndex in rows) + { + DataRow rowItem = this.gcMain.GridView.GetDataRow(rowIndex); + + string deleteCond2 = ReplaceHelper.ReplaceRowParam(rowItem, deleteCond); + + if (ReplaceHelper.EvalCond(deleteCond2)) + { + deleteRows.Add(rowItem); + DataRow dr = dt.NewRow(); + dr.ItemArray = rowItem.ItemArray; + undo.Add(rowIndex, dr); + + } + else + { + faultInts.Add(rowIndex); + } + } + ToWithdrawRows.Add(undo); + DataTable table = this.gcMain.GridControl.DataSourceTable(); + foreach (DataRow item in deleteRows) + { + table.Rows.Remove(item); + } + + if (faultInts != null && faultInts.Count > 0) + { + MessageUtil.Show("发现如下:" + string.Join(",", faultInts.ToArray()) + "行不满足条件无法删除!"); + } + else + { + MessageUtil.Show("删除成功!"); + } + } + if (ScanCodeTextEdit != null) ScanCodeTextEdit.Focus(); + return; + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + } + + } + + + + /// + /// 说明:单据保存 + /// 创建人:龚宇超 + /// 创建日期:2017-12-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnBillSaveClick(object sender, EventArgs e) + { + try + { + if (this.BillSave()) + { + ToWithdrawRows.Clear(); + } + if (ScanCodeTextEdit != null) ScanCodeTextEdit.Focus(); + } + catch (Exception ex) + { + MessageUtil.Show(ex); + } + } + /// + /// 说明:单据保存提交 + /// 创建人:龚宇超 + /// 创建日期:2017-12-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnBillApplyClick(object sender, EventArgs e) + { + try + { + DialogResult result = MessageUtil.Show(ResourceKeys.BillApply, MessageBoxButtons.YesNo); + if (result == DialogResult.Yes) + { + if (this.BillSave(0, false)) + { + ToWithdrawRows.Clear(); + this.BillApply(""); + } + } + if (ScanCodeTextEdit != null) ScanCodeTextEdit.Focus(); + return; + } + catch (Exception ex) + { + MessageUtil.Show(ex); + } + + } + /// + /// 说明:帮助文档 + /// 创建人:龚宇超 + /// 创建日期:2020-01-15 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + private void OnHelpClick(object sender, EventArgs e) + { + WebBrowserUtil.StartWebBrowser(this.SysModel.ModuleCode, this.BillModel.TypeName); + } + + /// + /// 说明:分配明细 + /// 创建人:龚宇超 + /// 创建日期:2020-01-15 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnBtnFPOldClick(object sender, EventArgs e) + { + this.gcMain.GridView.PostEditor(); + FPOld(); + } + private void OnBtnFPNewClick(object sender, EventArgs e) + { + this.gcMain.GridView.PostEditor(); + FPNew(); + } + + /// + /// 新版分配 + /// + private void FPNew(int rowHandle = 0) + { + try + { + this.gcMain.GridView.FocusedRowHandle = rowHandle; + DataTable table = this.gcMain.GridControl.DataSource as DataTable; + if (!table.Columns.Contains(guidField)) + { + table.Columns.Add(guidField, typeof(string)); + } + string[] args = { this.SysModel.FormText, this.SysModel.UserId, this.SysModel.UserName, this.SysModel.Privilege, this.SysModel.ModuleCode, this.SysModel.ModuleId + "", this.BillModel.PopupUnionCode, "1000" }; + DynamicBaseSelectModel baseModel = new DynamicBaseSelectModel(args); + using (FrmBaseSelectBatch frmSelect = new FrmBaseSelectBatch(baseModel, this.ControlObj, this.gcMain)) + { + frmSelect.Text = this.BillModel.TypeName; + frmSelect.InitControl(); + frmSelect.OnAfterFPCallback += OnAfterFPCallback; + DataRow rowItem = this.gcMain.GridView.GetFocusedDataRow(); + if (rowItem == null) + { + return; + } + rowItem[guidField] = Guid.NewGuid().ToString(); + if (!string.IsNullOrEmpty(mRecordPrimaryField) && table.Columns.Contains(this.mRecordPrimaryField)) + { + // 检查数据是否为分配后的行 + if (!string.IsNullOrEmpty(rowItem[this.mRecordPrimaryField] + "")) + { + if (this.gcMain.GridView.FocusedRowHandle + 1 <= this.gcMain.GridView.RowCount - 1) + { + int focusedRowHandle = this.gcMain.GridView.FocusedRowHandle + 1; + this.gcMain.GridView.FocusedRowHandle = focusedRowHandle; + if (this.gcMain.GridView.FocusedRowHandle == focusedRowHandle) + { + FPNew(focusedRowHandle); + } + else + { + MessageUtil.Show("全部分配完毕"); + } + } + return; + } + } + if (!string.IsNullOrEmpty(mRecordPrimaryField)) + { + frmSelect.FpRows = table.Rows.Cast().Where(x => (rowItem[guidField] + "").Equals(x[guidField] + "")).ToArray(); + if (frmSelect.FpRows != null && frmSelect.FpRows.Length > 0) + { + List rows = frmSelect.FpRows.ToList(); + rows.Remove(rowItem); + frmSelect.FpRows = rows.ToArray(); + } + if (table.Columns.Contains(mRecordPrimaryField)) + { + frmSelect.FpOtherRows = table.Rows.Cast().Where(x => !(rowItem[guidField] + "").Equals(x[guidField] + "") && !string.IsNullOrEmpty(x[mRecordPrimaryField] + "")).ToArray(); + } + } + frmSelect.InitData(rowItem); + frmSelect.OnBtnFPClick(null, null); + //frmSelect.ShowDialog(); + } + } + catch (Exception ex) + { + MessageUtil.Show(ex.Message); + } + } + /// + /// 分配完成后回调 + /// + /// + /// + private void OnAfterFPCallback(object sender, EventArgs e) + { + WaitForm.ShowForm(); + try + { + // 临时禁用新增行(空白行) + if (this.BillModel.DefaultAddEmptyRow) this.gcMain.GridView.OptionsView.NewItemRowPosition = NewItemRowPosition.None; + DataRow rowItem = this.gcMain.GridView.GetFocusedDataRow(); + if (rowItem == null) + { + return; + } + DataTable table = this.gcMain.GridControl.DataSource as DataTable; + FrmBaseSelectBatch frmSelect = (FrmBaseSelectBatch)sender; + rowItem[guidField] = Guid.NewGuid().ToString(); + if (!string.IsNullOrEmpty(mRecordPrimaryField) && table.Columns.Contains(this.mRecordPrimaryField)) + { + // 检查数据是否为分配后的行 + if (!string.IsNullOrEmpty(rowItem[this.mRecordPrimaryField] + "")) + { + if (this.gcMain.GridView.FocusedRowHandle + 1 <= this.gcMain.GridView.RowCount - 1) + { + this.gcMain.GridView.FocusedRowHandle += 1; + OnAfterFPCallback(sender, e); + } + return; + } + } + if (!string.IsNullOrEmpty(mRecordPrimaryField)) + { + frmSelect.FpRows = table.Rows.Cast().Where(x => (rowItem[guidField] + "").Equals(x[guidField] + "")).ToArray(); + if (frmSelect.FpRows != null && frmSelect.FpRows.Length > 0) + { + List rows = frmSelect.FpRows.ToList(); + rows.Remove(rowItem); + frmSelect.FpRows = rows.ToArray(); + } + if (table.Columns.Contains(mRecordPrimaryField)) + { + frmSelect.FpOtherRows = table.Rows.Cast().Where(x => !(rowItem[guidField] + "").Equals(x[guidField] + "") && !string.IsNullOrEmpty(x[mRecordPrimaryField] + "")).ToArray(); + } + } + frmSelect.InitData(rowItem); + bool success = frmSelect.FP(); + if (success) + { + if (frmSelect.SelectedRows != null && frmSelect.SelectedRows.Length > 0) + { + // 增加标识列 + if (!table.Columns.Contains(frmSelect.RecordPrimaryField)) + { + this.mRecordPrimaryField = frmSelect.RecordPrimaryField; + table.Columns.Add(this.mRecordPrimaryField, typeof(String)); + } + foreach (DataRow item in frmSelect.SelectedRows) + { + DataRow newRow = table.NewRow(); + newRow.ItemArray = rowItem.ItemArray; + newRow[guidField] = rowItem[guidField]; + DataColumn IsIdentCol = newRow.Table.Columns.Cast().FirstOrDefault(x => x.ColumnName == BaseImpl.GetResult(string.Format("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='{0}' AND COLUMNPROPERTY(OBJECT_ID('{0}'),COLUMN_NAME,'IsIdentity')=1", BillModel.DetailTable)) + ""); + //自增长列分配按空值取 + if (IsIdentCol != null) + { + if (IsIdentCol.DataType == typeof(Decimal) || + IsIdentCol.DataType == typeof(Double) || + IsIdentCol.DataType == typeof(Int16) || + IsIdentCol.DataType == typeof(Int32) || + IsIdentCol.DataType == typeof(Int64)) + { + newRow[IsIdentCol.ColumnName] = 0; + } + } + foreach (DataColumn col in item.Table.Columns) + { + if (table.Columns.Contains(col.ColumnName)) + { + //newRow[col.ColumnName] = item[col.ColumnName]; + newRow[col.ColumnName] = item[col.ColumnName]; + GridColumn column = this.gcMain.GridView.Columns[col.ColumnName]; + if (column != null) + { + GridColumnModel model = column.Tag as GridColumnModel; + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, rowItem[column.FieldName] + "", newRow); + } + SetCalcValue(model, rowItem[column.FieldName] + "", newRow); + } + } + } + newRow[frmSelect.AmountField] = item[frmSelect.AmountField]; + newRow[frmSelect.RecordPrimaryField] = item[frmSelect.RecordPrimaryField]; + table.Rows.Add(newRow); + } + NumberMc = frmSelect.AmountField; + table.Rows.Remove(rowItem); + // 重排顺序 + table.OrderBy(this.BillModel.DetailOrderField); + this.gcMain.GridView.UpdateCurrentRow(); + this.gcMain.GridView.ShowEditor(); + if (frmSelect.isNextOne) + { + int SourceRowIndex = this.gcMain.GridView.GetFocusedDataSourceRowIndex(); + DataRow[] a = table.Rows.Cast().Where(x => string.IsNullOrEmpty(x[guidField].ToString())).ToArray(); + if (a.Length != 0) + { + this.gcMain.GridView.FocusedRowHandle = SourceRowIndex; + OnAfterFPCallback(sender, e); + } + else + { + MessageUtil.Show("全部分配完毕"); + // frmSelect.SelectRowItem = null; + } + } + } + } + else + { + if (this.gcMain.GridView.FocusedRowHandle + 1 <= this.gcMain.GridView.RowCount - 1) + { + this.gcMain.GridView.FocusedRowHandle += 1; + OnAfterFPCallback(sender, e); + } + else + { + MessageUtil.Show("全部分配完毕"); + } + } + } + catch (Exception) + { + throw; + } + finally + { + // 重新开启新增行(空白行) + if (this.BillModel.DefaultAddEmptyRow) this.gcMain.GridView.OptionsView.NewItemRowPosition = NewItemRowPosition.Bottom; + WaitForm.HideForm(); + } + } + + /// + /// 老版分配 + /// + private void FPOld() + { + try + { + DataRow rowItem = this.gcMain.GridView.GetFocusedDataRow(); + if (rowItem == null) + { + MessageUtil.Show("请先选择一条明细在进行分配!"); + return; + } + DataTable table = this.gcMain.GridControl.DataSource as DataTable; + if (!table.Columns.Contains(guidField)) + { + table.Columns.Add(guidField, typeof(string)); + } + rowItem[guidField] = Guid.NewGuid().ToString(); ; + if (!string.IsNullOrEmpty(mRecordPrimaryField) && table.Columns.Contains(this.mRecordPrimaryField)) + { + // 检查数据是否为分配后的行 + if (!string.IsNullOrEmpty(rowItem[this.mRecordPrimaryField] + "") && !this.BillModel.IgnoreAllocated) + { + MessageUtil.Show("该行数据为已分配后的数据,无需分配!"); + return; + } + } + string[] args = { this.SysModel.FormText, this.SysModel.UserId, this.SysModel.UserName, this.SysModel.Privilege, this.SysModel.ModuleCode, this.SysModel.ModuleId + "", this.BillModel.PopupUnionCode, "1000" }; + DynamicBaseSelectModel baseModel = new DynamicBaseSelectModel(args); + using (FrmBaseSelect frmSelect = new FrmBaseSelect(baseModel, this.ControlObj, this.gcMain)) + { + //if (frmSelect.SelectRowItem == null) + //{ + // frmSelect = new FrmBaseSelect(baseModel, this.ControlObj, this.gcMain); + //} + frmSelect.Text = this.BillModel.TypeName; + frmSelect.SelectRowItem = rowItem; + bool isNextOne = false; + if (!string.IsNullOrEmpty(mRecordPrimaryField)) + { + frmSelect.FpRows = table.Rows.Cast().Where(x => (rowItem[guidField] + "").Equals(x[guidField] + "")).ToArray(); + if (frmSelect.FpRows != null && frmSelect.FpRows.Length > 0) + { + List rows = frmSelect.FpRows.ToList(); + rows.Remove(rowItem); + frmSelect.FpRows = rows.ToArray(); + } + if (table.Columns.Contains(mRecordPrimaryField)) + { + frmSelect.FpOtherRows = table.Rows.Cast().Where(x => !(rowItem[guidField] + "").Equals(x[guidField] + "") && !string.IsNullOrEmpty(x[mRecordPrimaryField] + "")).ToArray(); + } + } + if (frmSelect.ShowDialog() == DialogResult.OK) + { + if (frmSelect.SelectedRows != null && frmSelect.SelectedRows.Length > 0) + { + //if (frmSelect.isNextOne) + //{ + // isNextOne = true; + //} + //else + //{ + // isNextOne = false; + //} + // 增加标识列 + if (!table.Columns.Contains(frmSelect.RecordPrimaryField)) + { + this.mRecordPrimaryField = frmSelect.RecordPrimaryField; + table.Columns.Add(this.mRecordPrimaryField, typeof(String)); + } + + foreach (DataRow item in frmSelect.SelectedRows) + { + DataRow newRow = table.NewRow(); + newRow.ItemArray = rowItem.ItemArray; + newRow[guidField] = rowItem[guidField]; + DataColumn IsIdentCol = newRow.Table.Columns.Cast().FirstOrDefault(x => x.ColumnName == BaseImpl.GetResult(string.Format("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.columns WHERE TABLE_NAME='{0}' AND COLUMNPROPERTY(OBJECT_ID('{0}'),COLUMN_NAME,'IsIdentity')=1", BillModel.DetailTable)) + ""); + //自增长列分配按空值取 + if (IsIdentCol != null) + { + if (IsIdentCol.DataType == typeof(Decimal) || + IsIdentCol.DataType == typeof(Double) || + IsIdentCol.DataType == typeof(Int16) || + IsIdentCol.DataType == typeof(Int32) || + IsIdentCol.DataType == typeof(Int64)) + { + newRow[IsIdentCol.ColumnName] = 0; + } + } + foreach (DataColumn col in item.Table.Columns) + { + if (table.Columns.Contains(col.ColumnName)) + { + //newRow[col.ColumnName] = item[col.ColumnName]; + newRow[col.ColumnName] = item[col.ColumnName]; + GridColumn column = this.gcMain.GridView.Columns[col.ColumnName]; + if (column != null) + { + GridColumnModel model = column.Tag as GridColumnModel; + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, rowItem[column.FieldName] + "", newRow); + } + SetCalcValue(model, rowItem[column.FieldName] + "", newRow); + } + } + } + newRow[frmSelect.AmountField] = item[frmSelect.AmountField]; + newRow[frmSelect.RecordPrimaryField] = item[frmSelect.RecordPrimaryField]; + table.Rows.Add(newRow); + } + NumberMc = frmSelect.AmountField; + //double syAmount = frmSelect.GetSyAmount(); + //if (syAmount > 0) + //{ + // rowItem[frmSelect.AmountField] = frmSelect.GetSyAmount(); + //} + //else + //{ + // table.Rows.Remove(rowItem); + //} + table.Rows.Remove(rowItem); + // 重排顺序 + table.OrderBy(this.BillModel.DetailOrderField); + this.gcMain.GridView.UpdateCurrentRow(); + this.gcMain.GridView.ShowEditor(); + } + } + if (frmSelect.isNextOne) + { + int SourceRowIndex = this.gcMain.GridView.GetFocusedDataSourceRowIndex(); + DataRow[] a = table.Rows.Cast().Where(x => string.IsNullOrEmpty(x[guidField].ToString())).ToArray(); + if (a.Length != 0) + { + this.gcMain.GridView.FocusedRowHandle = SourceRowIndex; + OnBtnFPOldClick(null, null); + } + else + { + MessageUtil.Show("全部分配完毕"); + // frmSelect.SelectRowItem = null; + } + } + } + } + catch (Exception ex) + { + MessageUtil.Show(ex); + } + } + private void cb_templete_QueryCloseUp(object sender, CancelEventArgs e) + { + this.SetTempSelect(true); + } + /// + /// 说明:快速录入明细 + /// 创建人:龚宇超 + /// 创建日期:2019-08-05 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InputGridView() + { + try + { + WaitForm.ShowForm(); + + string inputText = txt_input.Text.Trim(); + ComboBoxEditModel editObj = cb_input.SelectedItem as ComboBoxEditModel; + + if (string.IsNullOrWhiteSpace(inputText)) + { + MessageUtil.Show(ResourceKeys.KeyWordNotNull); + return; + } + if (editObj != null) + { + + DataTable table = BaseImpl.GetDataTableResult(this.ControlObj.ReplaceControlValue(ReplaceHelper.ReplaceSearchControlCond(editObj.SourceModel.CodeInputSql, inputText))); + if (table.Rows.Count == 0) + { + MessageUtil.Show(ResourceKeys.NotFoundKeyWord); + return; + } + else + { + bool onlyPopup = false; + foreach (DataRow rowItem in table.Rows) + { + this.AddRowToGridView(rowItem); + this.AddRowToGridViewByBom(rowItem, editObj.UnionModel, ref onlyPopup); + + } + } + + } + } + catch (Exception ex) + { + MessageUtil.Show(ex); + LogUtil.WriteError("单据快速录入明细出错!", ex); + } + finally + { + WaitForm.HideForm(); + } + } + /// + /// 说明:单据快速录入 + /// 创建人:龚宇超 + /// 创建日期:2018-04-19 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnInputClick(object sender, EventArgs e) + { + this.InputGridView(); + } + /// + /// 说明: + /// 创建人:龚宇超 + /// 创建日期:2019-08-05 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + private void OnInputKeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + this.InputGridView(); + this.txt_input.EditValue = ""; + this.txt_input.Focus(); + } + } + private void SetTempSelect(bool isTip) + { + ComboBoxEditModel model = this.cb_templete.SelectedItem as ComboBoxEditModel; + + if (model != null) + { + bool isExec = true; + DataTable detailTable = gcMain.GridControl.DataSourceTable(); + if (detailTable != null && detailTable.Rows.Count > 0 && isTip) + { + DialogResult result = XtraMessageBox.Show("确定要切换模版?\r\n注:切换模版会清空明细数据.", "系统提示", MessageBoxButtons.YesNo); + isExec = result == DialogResult.Yes; + } + if (isExec) + { + if (isExec) + { + string title = model.RowItem["rpname"] + ""; + string brpId = model.RowItem["id"] + ""; + + // 设置标题 + this.Parent.Text = title; + // 清空明细 + detailTable.Clear(); + + // 设置主表固定字段 + LabelTextEdit textEdit = this.ControlObj.FindControl("brpid") as LabelTextEdit; + if (textEdit == null) + { + MessageUtil.Show(ResourceKeys.NotFountBrpID); + return; + } + textEdit.EditText = brpId; + + // 重新设置明细列 + DataTable columns = BillImpl.GetBillDetailBrpColumns(brpId); + if (columns != null && columns.Rows.Count > 0) + gcMain.SetEditColumns(columns); + else + gcMain.GridView.Columns.Clear(); + } + } + } + } + /// + /// 说明:初始化Brp模版 + /// 创建人:龚宇超 + /// 创建日期:2018-04-20 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void InitializeTemplete() + { + Dictionary dataCaches = SysModel != null ? SysModel.DataCaches : null; + if (!dataCaches.GetValue(this, "BillBrp", out DataTable table)) + { + table = BillImpl.GetBillBrp(this.SysModel.ModuleCode); + } + List tempModels = new List(); + + foreach (DataRow item in table.Rows) + { + ComboBoxEditModel editModel = new ComboBoxEditModel() + { + ValuemMeber = "id", + TextMember = "RpName", + RowItem = item + }; + this.cb_templete.Properties.Items.Add(editModel); + tempModels.Add(editModel); + } + this.cb_templete.Tag = tempModels; + } + /// + /// 说明:设置Brp模版 + /// 创建人:龚宇超 + /// 创建日期:2018-04-23 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void SetTempleteSelectedValue(string id) + { + List tempModels = this.cb_templete.Tag as List; + if (tempModels != null) + { + ComboBoxEditModel model = tempModels.Find(x => id.Equals(x.RowItem[x.ValuemMeber] + "")); + if (model == null) + gcMain.GridView.Columns.Clear(); + else + { + this.cb_templete.SelectedItem = model; + this.SetTempSelect(false); + } + } + } + /// + /// 说明:手动选择模版 + /// 创建人:龚宇超 + /// 创建日期:2018-04-23 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void OnTempleteClick(object sender, EventArgs e) + { + this._isSelectedTemplete = true; + } + /// + /// 说明:单据选中/取消选中数据 + /// 创建人:龚宇超 + /// 创建日期:2020-05-12 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + private void OnGridViewIsCheckClick(object sender, RowCellClickEventArgs e) + { + try + { + DataRow rowItem = (sender as GridView).GetFocusedDataRow(); + if (rowItem != null && e.Column.FieldName == "_check") + { + rowItem["_check"] = "True".Equals(rowItem["_check"] + "") ? 0 : 1; + rowItem.AcceptChanges(); + } + } + catch (Exception) + { + } + } + + + /// + /// 隐藏主表 + /// + /// + /// + private void OnMainTableHiding(object sender, EventArgs e) + { + if (this.pl_main_center_master.Dock == DockStyle.Top) + { + this.pl_main_center_master.Dock = DockStyle.None; + this.btnHiding.Text = "显示主表"; + } + else + { + this.pl_main_center_master.Dock = DockStyle.Top; + this.btnHiding.Text = "隐藏主表"; + } + } + + /// + /// 刷新明细表 + /// + /// + /// + private void btnRefresh_Click(object sender, EventArgs e) + { + try + { + WaitForm.ShowForm(); + //主表明细 + if (this.gcMain is TreeGridControlEx) + { + (this.gcMain as TreeGridControlEx).RefreshDataSource(); + } + else + { + this.gcMain.RefreshDataSource(); + } + + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + } + finally + { + WaitForm.HideForm(); + } + + } + /// + /// 说明:计算贷方的值 + /// 创建人:曹屹峰 + /// 创建日期:2022-01-19 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void OnGridControlKye(object sender, KeyEventArgs e) + { + try + { + if (!e.KeyData.Equals(Keys.F1)) return; + GridColumn column = this.gcMain.GridView.FocusedColumn; + //if (!string.IsNullOrWhiteSpace(column.View.EditingValue + "")) return; + GridColumnModel model = column.Tag as GridColumnModel; + int[] rows = this.gcMain.GridView.GetSelectedRows(); + if (model.FieldType == 115) + { + if (rows.Length != 1) return; + DataTable dataSource = this.gcMain.gridControl.DataSource as DataTable;//gridView.GetGridViewFilteredAndSortedDataToDataTable(); + GridColumn debit = this.gcMain.GridView.Columns.FirstOrDefault(x => x.Caption.Equals("借方金额")); + GridColumn credit = this.gcMain.GridView.Columns.FirstOrDefault(x => x.Caption.Equals("贷方金额")); + double debitAmount = 0;//借方金额 + double creditAmount = 0;//贷方金额 + foreach (DataRow item in dataSource.Rows) + { + if (!string.IsNullOrWhiteSpace(item[debit.FieldName].ToString())) debitAmount += double.Parse(item[debit.FieldName].ToString()); + if (!string.IsNullOrWhiteSpace(item[credit.FieldName].ToString())) creditAmount += double.Parse(item[credit.FieldName].ToString()); + } + //借方和贷方是否相等 + double differenceAmount = debitAmount - creditAmount; + if (differenceAmount > 0 && column.FieldName.Equals(credit.FieldName)) + { + dataSource.Rows[rows[0]][column.FieldName] = differenceAmount + double.Parse(dataSource.Rows[rows[0]][column.FieldName] + ""); + this.gcMain.GridView.UpdateCurrentRow(); + this.gcMain.GridView.ShowEditor(); + } + if (differenceAmount < 0 && column.FieldName.Equals(debit.FieldName)) + { + dataSource.Rows[rows[0]][column.FieldName] = differenceAmount * -1 + double.Parse(dataSource.Rows[rows[0]][column.FieldName] + ""); + this.gcMain.GridView.UpdateCurrentRow(); + this.gcMain.GridView.ShowEditor(); + } + + SendKeys.Send("{Esc}"); + //e.Handled = true; + + } + } + catch (Exception ex) + { + MessageUtil.Show(ex.Message); + } + } + + + + /// + /// 重新计算右上角按钮坐标 + /// + private void CalculateCoordinates() + { + List buttons = new List();//没有隐藏的按钮集合 + + //帮助文档按钮 + if (SystemInfo.Instance.HideHelpDocument) + { + this.btnHelp.Visible = false; + } + else + { + buttons.Add(this.btnHelp); + } + //隐藏主表 + if (this.BillModel.HiddenMasterTable) + { + this.btnHiding.Visible = true; + buttons.Add(this.btnHiding); + } + //刷新按钮 + if (SystemInfo.Instance.HideTableRefresh) + { + this.btnRefresh.Visible = false; + } + else + { + buttons.Add(this.btnRefresh); + } + //分配按钮 + buttons.Add(this.dbpFP); + + + //从最后开始计算 + int x = this.dpbTools.Location.X; + //判断是否隐藏常用工具按钮,隐藏的话x为导出导入按钮的坐标 + if (SystemInfo.Instance.HiddenTools) + { + this.dpbTools.Visible = false; + x = this.dpbImport.Location.X; + } + if (buttons.Count != 4) + { + foreach (SimpleButton item in buttons) + { + item.Location = new Point(x - 2 - item.Width, this.dpbTools.Location.Y); + x = x - 2 - item.Width; + } + } + + //设置扫码控件 + if (!string.IsNullOrWhiteSpace(this.BillModel.CodeExecuteSql) && !string.IsNullOrWhiteSpace(this.BillModel.CodeExecuteParameter)) + { + this.pl_input.Controls.Clear(); + this.pl_input.Visible = false; + + LabelControl label = new LabelControl(); + label.Font = new Font("宋体", 12F); + label.Text = "串号扫描"; + label.Top = (pl_main_bottom.Height - label.Height) / 2; + label.Left = 10; + label.Parent = pl_main_bottom; + + this.ScanCodeTextEdit = new TextEdit(); + ScanCodeTextEdit.Height = this.pl_input.Height; + ScanCodeTextEdit.Width = this.pl_input.Width; + ScanCodeTextEdit.Properties.Appearance.Font = new Font("宋体", 10.5F); + ScanCodeTextEdit.Left = label.Width + 15; + ScanCodeTextEdit.Top = (pl_main_bottom.Height - ScanCodeTextEdit.Height) / 2; + ScanCodeTextEdit.BackColor = ColorTranslator.FromHtml("#FFC0CB"); + ScanCodeTextEdit.KeyDown += Text_KeyDown; + ScanCodeTextEdit.Parent = pl_main_bottom; + + } + + + } + + /// + /// 扫码回车事件 + /// + /// + /// + private void Text_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + TextEdit textEdit = sender as TextEdit; + string inputText = textEdit.Text; + if (!string.IsNullOrWhiteSpace(this.BillModel.CodeExecuteSql) && !string.IsNullOrWhiteSpace(this.BillModel.CodeExecuteParameter)) + { + if (inputText.Length > 50) + { + MessageUtil.Show("扫码长度过长,请重新扫码"); + return; + } + + //获取选中行 + DataRow MainRowItem = gcMain.GridView.GetFocusedDataRow(); + if (MainRowItem == null) + { + MainRowItem = gcMain.GridControl.DataSourceTable().NewRow(); + } + //获取红蓝单据 + string DocumentColor = this.rdBlue.Checked ? "0" : this.rdRed.Checked ? "1" : ""; + //数量,默认为1 + int Quantity = 1; + /* + A:弹框输入数量 + B;不弹框,默认数量为1 + C:配置了扫码关联模块,根据数量sql结果。判断是否弹窗。数量默认为1 + + this.BillModel.ScanCodeFixedPrefix为条码前缀,扫码内容前缀和配置相同,默认为B + */ + string Type = string.Empty; + if (!string.IsNullOrWhiteSpace(this.BillModel.ScanCodeFixedPrefix) && inputText.StartsWith(this.BillModel.ScanCodeFixedPrefix)) + { + Type = "B"; + } + else + { + string Sql = string.Format("select line_str from wms_ScanCodeLinetab a where modid='{0}' and hl_tig='{1}'", this.SysModel.ModuleCode, DocumentColor); + Type = SqlHelper.ExecuteScalar(Sql) + ""; + if (string.IsNullOrWhiteSpace(Type)) + { + MessageUtil.Show("扫码配置错误,请联系朗速服务人员"); + return; + } + } + switch (Type.ToUpper()) + { + case "A": + + FrmAdd frmAdd = new FrmAdd(); + if (frmAdd.ShowDialog() == DialogResult.OK) + { + Quantity = frmAdd.Quantity; + } + else + { + textEdit.EditValue = ""; + textEdit.Focus(); + return; + } + this.ExecuteWcanningSQL(MainRowItem, Quantity + "", DocumentColor, inputText); + break; + case "B": + this.ExecuteWcanningSQL(MainRowItem, Quantity + "", DocumentColor, inputText); + break; + case "C": + if (!string.IsNullOrWhiteSpace(this.BillModel.ScanCodeModuleCode)) + { + //根据传入的模块号获取模块信息 + DataRow modelRow = MainImpl.GetSystemdllTab(this.BillModel.ScanCodeModuleCode);//获取模块信息 + if (modelRow == null) + { + MessageUtil.Show("模块编号[" + this.BillModel.ScanCodeModuleCode + "],配置错误!\r\n该模块信息未找到!"); + return; + } + if (modelRow.Table.Columns.Contains("countSql") && !string.IsNullOrWhiteSpace(modelRow["countSql"] + "")) + { + string sql = modelRow["countSql"] + ""; + sql = ReplaceHelper.ReplaceUserInfo(sql); + sql = ReplaceHelper.ReplaceParamToValue(sql, "{value}", inputText); + string num = SqlHelper.ExecuteScalar(sql) + ""; + num = this.IsNumberic(num) ? num : "0"; + if (int.Parse(num) == 0) + { + MessageUtil.Show("未检测到扫码信息存在,请检查相应前序业务!"); + } + else if (int.Parse(num) == 1) + { + this.ExecuteWcanningSQL(MainRowItem, Quantity + "", DocumentColor, inputText); + } + else if (int.Parse(num) > 1) + { + FrmScanCodeAssociation frmScanCodeAssociation = new FrmScanCodeAssociation(modelRow, inputText); + if (frmScanCodeAssociation.ShowDialog() == DialogResult.OK) + { + string Codes = frmScanCodeAssociation.StringCodes; + this.ExecuteWcanningSQL(MainRowItem, Quantity + "", DocumentColor, Codes); + } + else + { + textEdit.EditValue = ""; + textEdit.Focus(); + return; + } + } + } + } + else + { + MessageUtil.Show("扫码配置错误"); + return; + } + break; + + } + } + + textEdit.EditValue = ""; + textEdit.Focus(); + } + } + + + /// + /// 执行扫码的存储过程 + /// + /// 明细选中行 + ///数量 + ///红蓝单据字段 + ///串码,多个用;隔开 + public void ExecuteWcanningSQL(DataRow MainRowItem, string Quantity, string DocumentColor, string Codes) + { + int j = 0; + foreach (string code in Codes.TrimEnd(';').Split(';')) + { + if (string.IsNullOrWhiteSpace(code)) continue; + List Parameter = this.BillModel.CodeExecuteParameter.Split(',').ToList(); + for (int i = 0; i < Parameter.Count; i++) + { + string item = Parameter[i]; + if (item.Contains("{DocumentColor}")) + { + item = ReplaceHelper.ReplaceParamToValue(item, "{DocumentColor}", DocumentColor); + } + if (item.Contains("{amount}")) + { + item = Quantity + ""; + } + //替换单据号 + item = ReplaceHelper.ReplaceParamToValue(item, "{" + this.BillModel.PrimaryKey + "}", this.lblOrderNo.Text); + //替换选中行(没有就传空) + item = ReplaceHelper.ReplaceRowParam(MainRowItem, item); + //替换扫码内容 + item = ReplaceHelper.ReplaceParamToValue(item, "{value}", code); + Parameter[i] = item; + } + + + List procParams = ReplaceHelper.GetParamFields(this.BillModel.CodeExecuteSql); + List sqlParamList = new List(); + string[] paramStr = procParams[0].Replace("{", "").Replace("}", "").Split(','); + SqlParameter pMsg = new SqlParameter("@msg", SqlDbType.VarChar, 2000); + + for (int i = 0; i < paramStr.Length; i++) + { + string item = paramStr[i]; + if (paramStr[i].Equals("@msg", StringComparison.OrdinalIgnoreCase)) + { + pMsg.Direction = ParameterDirection.InputOutput; + pMsg.Value = Parameter.Count > i ? string.IsNullOrEmpty(Parameter[i]) ? "" : Parameter[i] : ""; + sqlParamList.Add(pMsg); + } + else + { + string paramStr1 = paramStr[i]; + SqlParameter param = new SqlParameter(string.Format("{0}", paramStr1), SqlDbType.VarChar); + param.Value = Parameter[i]; + sqlParamList.Add(param); + } + } + SqlParameter returnValue = new SqlParameter("@return", SqlDbType.Int, 4); + returnValue.Direction = ParameterDirection.ReturnValue; + int result; + sqlParamList.Add(returnValue); + + try + { + result = MainImpl.ExecProcedure(this.BillModel.CodeExecuteSql.Replace(procParams[0], "").Trim(), sqlParamList.ToArray()); + } + catch (SqlException sex) + { + string Message = ErrorMessage.PromptErrorMessage(sex); + MessageUtil.Show(Message, sex.Message); + return; + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + return; + } + int rValue = Convert.ToInt32(returnValue.Value); + string varchar = pMsg.Value + ""; + switch (rValue) + { + case 1: + if (string.IsNullOrWhiteSpace(varchar)) + { + //刷新当前单据 + if (j == Codes.TrimEnd(';').Split(';').Length - 1) + { + this.SetBillStatus(BillImpl.GetDataRowResult(string.Format("select * from {0} where {1}='{2}'", BillModel.MasterTable, BillModel.PrimaryKey, this.lblOrderNo.Text))); + } + + } + else + { + //刷新返回的单据号 + this.lblOrderNo.Text = varchar; + this.SetBillStatus(BillImpl.GetDataRowResult(string.Format("select * from {0} where {1}='{2}'", BillModel.MasterTable, BillModel.PrimaryKey, varchar))); + } + break; + case -1: + MessageUtil.Show(ResourceKeys.OperFault + "\n" + pMsg.Value); + break; + } + j++; + } + } + + /// + /// 判断是不是数值 + /// + /// + /// + private bool IsNumberic(string oText) + { + try + { + int var1 = Convert.ToInt32(oText); + return true; + } + catch + { + return false; + } + } + + /// + /// 打开来源模块,并把选中的数据反写到主表明细中 + /// + /// + /// + private void OpenTheSourcePopup(object sender, EventArgs e) + { + string SourceId = sender + ""; + if (string.IsNullOrWhiteSpace(SourceId)) return; + FrmDocumentSource frmSource = new FrmDocumentSource(SourceId); + frmSource.WindowState = FormWindowState.Maximized; + if (frmSource.ShowDialog() == DialogResult.OK) + { + this.gcMain.GridView.BeginUpdate(); + foreach (DataRow rowItem in frmSource.DataRows) + { + this.AddRowToGridView(rowItem); + } + this.gcMain.GridView.EndUpdate(); + } + + } + + /// + /// 所有粘贴完成后执行 + /// + /// + /// + private void OnAllAfterParseCallBack(object sender, EventArgs e) + { + DataTable gridTable = (this.gcMain.GridControl.DataSource as DataTable).TrimDeleteRows(); + gridTable.OrderBy(this.BillModel.DetailOrderField); + this.gcMain.GridView.UpdateCurrentRow(); + this.gcMain.GridView.ShowEditor(); + } + + + + /// + /// 说明:添加多行到单据明细中 + /// 创建人:龚宇超 + /// 创建日期:2017-11-30 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The row item. + /// The union model. + private void AddRowsToTreeGridControl(DataTable dataTable, BillSourceUnionModel unionModel) + { + WaitForm.ShowForm(); + TreeListColumnCollection gridColumns = (this.gcMain as TreeGridControlEx).TreeListObj.Columns; + DataTable gridTable = ((this.gcMain as TreeGridControlEx).TreeListObj.DataSource as DataTable).TrimDeleteRows().Copy(); + + if (!gridTable.Columns.Contains(ERPInfo.Instance.isAddRows)) + { + gridTable.Columns.Add(ERPInfo.Instance.isAddRows, typeof(String)); + } + + TreeListNode treeNode = (this.gcMain as TreeGridControlEx).TreeListObj.FocusedNode as TreeListNode; + int position = 0; + if (treeNode != null) position = treeNode.Id; + + + //bool isLastRow = this.gcMain.GridView.IsLastVisibleRow; + + + + bool onlyOne = true; + foreach (DataRow rowItem in dataTable.Rows) + { + if (unionModel == null || ValidateDetailCond(rowItem, unionModel)) + { + + string repeatProduct = (this.gcMain as TreeGridControlEx).TreeListObj.Columns["ProductId"] != null && rowItem.Table.Columns.Contains("ProductId") ? "ProductId" : this.BillModel.DetailPreFix + "ProductId"; + AssociatedField = repeatProduct; + + if ("1".Equals(this.BillModel.DetailDoubleClickTip) && gridColumns[repeatProduct] != null && dataTable.Columns.Contains(repeatProduct)) + { + //上面方法无法处理大小写,改成搜索的形式 + DataTable dt = (this.gcMain as TreeGridControlEx).TreeListObj.DataSource as DataTable; + if (dt != null && dt.Rows.Count > 0 && dt.Columns.Contains(repeatProduct)) + { + DataRow[] drs = dt.Select(repeatProduct + "='" + rowItem[repeatProduct] + "'"); + if (drs.Length >= 1) + { + DialogResult dialog = MessageUtil.Show(ResourceKeys.ProductIsRepet, MessageBoxButtons.YesNo); + if (dialog != DialogResult.Yes) + return; + } + } + + } + + DataRow newRow = gridTable.NewRow(); + newRow.BeginEdit(); + // 赋值明细字段 + foreach (TreeListColumn col in gridColumns) + { + try + { + GridColumnModel model = col.Tag as GridColumnModel; + if (dataTable.Columns.Contains(col.FieldName)) + { + // 来源列中是否包含对应字段,包含则使用值 + newRow[col.FieldName] = rowItem[col.FieldName]; + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, rowItem[col.FieldName] + "", newRow); + } + SetCalcValue(model, rowItem[col.FieldName] + "", newRow); + } + else + { + // 未包含字段,则使用控件默认值. + if (col.FieldName.Contains("_Ls")) + { + string[] unioFielName = col.FieldName.Split('_'); + string UnioValue = unioFielName[unioFielName.Length - 1]; + DataColumn grid = dataTable.Columns.Cast().FirstOrDefault(x => x.ColumnName.Split('_')[x.ColumnName.Split('_').Length - 1].Equals(UnioValue)); + if (grid != null && !string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, rowItem[col.FieldName] + "", newRow); + } + SetCalcValue(model, rowItem[col.FieldName] + "", newRow); + + } + else + { + string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); + + if (model.DefaultValue.Contains("{#")) + { + fieldValue = this.ControlObj.ReplaceParentControlValue(model.DefaultValue); + if (!string.IsNullOrEmpty(fieldValue)) + { + newRow[col.FieldName] = fieldValue; + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, fieldValue + "", newRow); + } + SetCalcValue(model, fieldValue + "", newRow); + + //计算规则配置在结果字段上,所以无需验证当前操作控件 + //this.gcMain.GridView.SetFocusedRowCellValue(col, fieldValue); + } + } + else if (!string.IsNullOrEmpty(model.DefaultValue)) + { + newRow[col.FieldName] = fieldValue; + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, fieldValue + "", newRow); + } + SetCalcValue(model, fieldValue + "", newRow); + + } + } + } + SetDisableColumn(model, newRow[col.FieldName] + "", newRow); + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + } + } + // newRow[(this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName] = (this.gcMain as TreeGridControlEx).GetNewNodesId();//节点id + newRow.EndEdit(); + gridTable.Rows.Add(newRow); + + position++; + + if (!string.IsNullOrEmpty(NumberMc) && gridTable.Columns.Contains(mRecordPrimaryField)) + { + DataRow[] rt = gridTable.Rows.Cast().Where(x => (newRow[BillModel.DetailPreFix + "ProductId"] + "").Equals(x[BillModel.DetailPreFix + "ProductId"] + "") && !string.IsNullOrEmpty(x[mRecordPrimaryField] + "")).ToArray(); + foreach (DataRow item in rt) + { + if (newRow != null) + { + newRow[NumberMc] = Convert.ToDouble(newRow[NumberMc]) - Convert.ToDouble(item[NumberMc]); + } + //(this.gcMain as TreeGridControlEx).GcMain_CellValueChanged(this.gcMain as TreeGridControlEx, new CellValueChangedEventArgs(position, this.gcMain.GridView.Columns[NumberMc], newRow[NumberMc] + "")); + //this.gcMain.GridView.UpdateCurrentRow(); + //this.gcMain.GridView.ShowEditor(); + if (Convert.ToDouble(newRow[NumberMc] + "") == 0.0) + { + gridTable.Rows.Remove(newRow); + MessageUtil.Show("数量已分配完毕!无需再进行拖拽!"); + } + } + } + } + else + { + if (onlyOne) + { + onlyOne = false; + if (!string.IsNullOrEmpty(unionModel.ModelObj.DetailEnableMsg)) + { + if (unionModel.ModelObj.DetailEnableMsg.StartsWith("select", StringComparison.OrdinalIgnoreCase) || + unionModel.ModelObj.DetailEnableMsg.StartsWith("exec", StringComparison.OrdinalIgnoreCase)) + { + MessageUtil.Show(BaseImpl.GetResult(unionModel.ModelObj.DetailEnableMsg) + ""); + } + else + { + MessageUtil.Show(unionModel.ModelObj.DetailEnableMsg); + } + } + } + } + } + (this.gcMain as TreeGridControlEx).SetGridViewDataSourceGenerateID(gridTable); + //this.gcMain.GridControl.DataSource = gridTable; + //if (position >= 0) + // this.gcMain.GridView.SelectRowHandler(position); + //else + // this.gcMain.GridView.SelectRowHandler(gridTable.Rows.Count - 1); + + //gridTable.OrderBy(this.BillModel.DetailOrderField); + //this.gcMain.GridView.UpdateCurrentRow(); + //this.gcMain.GridView.ShowEditor(); + gridTable.OrderBy(this.BillModel.DetailOrderField); + (this.gcMain as TreeGridControlEx).DataSourceSorting(); + WaitForm.HideForm(); + } + + /// + /// 说明:是否允许添加明细 + /// 创建人:龚宇超 + /// 创建日期:2018-06-06 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// true if this instance [can add detail row]; otherwise, false. + private bool CanAddTreeDetailRow() + { + // 检测是否正在筛选数据 + if (!string.IsNullOrEmpty((this.gcMain as TreeGridControlEx).TreeListObj.FindFilterText.Trim()) || + !string.IsNullOrEmpty((this.gcMain as TreeGridControlEx).TreeListObj.FilterPanelText.Trim())) + { + if (MessageUtil.Show(ResourceKeys.GridViewSearching, MessageBoxButtons.YesNo) == DialogResult.Yes) + { + (this.gcMain as TreeGridControlEx).TreeListObj.FindFilterText = ""; + return true; + } + return false; + } + // 检测是否点击了排序表格 + if ((this.gcMain as TreeGridControlEx).IsColumnSorted()) + { + (this.gcMain as TreeGridControlEx).ClearAllSort(); + } + // 检测是否为提交或者终审模块 + string text = Business.Impl.LanguageTranslation.Translatable ? Business.Impl.LanguageTranslation.GetTranslatedText("已终审") : "已终审"; + if (_waterMark.Text.Contains(text) && !this.BillModel.BillFinalReviewAdd) + { + MessageUtil.Show(ResourceKeys.AddBillDetailed); + return false; + } + return true; + } + + + + /// + /// 说明:检查可用条件 + /// 创建人:龚宇超 + /// 创建日期:2017-11-09 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The cond. + /// The data row. + /// true if XXXX, false otherwise. + private bool ValidateCond(string cond, DataRow dataRow) + { + bool result = false; + string condition = cond; + try + { + if (string.IsNullOrWhiteSpace(cond)) return true;//如果值是空格或者空行,默认正确 + cond = ReplaceHelper.ReplaceRowParam(dataRow, cond); + if (cond.StartsWith("@") || cond.StartsWith("!")) + { + result = "1".Equals(BaseImpl.GetDefaultValue(cond)); + } + else if (dataRow == null) + { + result = ReplaceHelper.EvalCond(cond); + } + else + { + result = ReplaceHelper.ReplaceRowParamCond(dataRow, cond); + } + return result; + } + catch (Exception ex) + { + + } + return result; + } + + + + + /// + /// 说明:设置图片事件 + /// 创建人:龚宇超 + /// 创建日期:2018-02-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void SetImageEvent(DataTable table) + { + if (table == null || table.Rows.Count == 0) return; + DataRow[] imageRows = table.Select("fieldTypeId=" + (int)ControlType.LabPicEx); + + foreach (DataRow item in imageRows) + { + string fieldName = item["fieldName"] + ""; + LabelImageEdit imageEdit = this.ControlObj.FindControl(fieldName) as LabelImageEdit; + if (imageEdit != null) + { + imageEdit.UploadEvent += new LabelImageEdit.UploadEventHander(OnImageUploadEvent); + imageEdit.DeleteEvent += new LabelImageEdit.DeleteEventHander(OnImageDeleteEvent); + } + } + } + + + /// + /// 说明:上传附件 + /// 创建人:龚宇超 + /// 创建日期:2018-02-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + protected void OnImageUploadEvent(object sender) + { + try + { + _imageEdit = sender as LabelImageEdit; + if (string.IsNullOrWhiteSpace(this.lblOrderNo.Text)) + { + MessageUtil.Show(ResourceKeys.UnSaveData); + } + else + { + //string prefix = "001"; + //string imagePath = _imageEdit.SaveImageToLocal(prefix); + OpenFileDialog openFileDialog = new OpenFileDialog(); + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + WaitForm.ShowForm("上传中..."); + if (!string.IsNullOrEmpty(openFileDialog.FileName)) + { + Image image = null; + bool isImage = true; + try + { + image = Image.FromFile(openFileDialog.FileName); + } + catch (Exception) + { + isImage = false; + } + if (image != null && isImage) + { + _imageEdit.TextEdit.Image = image; + } + else + { + _imageEdit.TextEdit.Image = global::Lskj.Control.Properties.Resources.file; + } + _imageEdit.CurrentImagePath = openFileDialog.FileName; + } + else + { + _imageEdit.CurrentImagePath = string.Empty; + } + string imagePath = _imageEdit.CurrentImagePath; + if (!string.IsNullOrEmpty(imagePath)) + { + //string speciesNo = string.IsNullOrEmpty(lteSpeciesNo.TextEdit.Text) ? "01" : lteSpeciesNo.TextEdit.Text; + //int directotyId = AttachImpl.GetAttachDirectoryId(this.SysModel.MenuDirId + "", this.PrimaryValue); + //AttachHelper.UpLoadFile(this.Handle, directotyId + "", speciesNo, "001", imagePath); + bool isSuccess = UploadFile(imagePath); + if (!isSuccess) + { + _imageEdit.CurrentImagePath = string.Empty; + _imageEdit.TextEdit.Image = null; + } + } + else + { + MessageUtil.Show("未选择上传文件"); + } + WaitForm.HideForm(); + } + } + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + } + + } + /// + /// 上传附件(新) + /// + private bool UploadFile(string filePath) + { + bool isUpload = true; + try + { + string token = ""; + string loginUrl = $"{SystemInfo.Instance.OAUrl}/Api/SysUserAjaxApi.ashx"; + HttpTools.setting("application/x-www-form-urlencoded", null, null, HttpTools.Encode.UTF8); + Dictionary loginPmsDic = new Dictionary(); + loginPmsDic.Add("method", "Login"); + loginPmsDic.Add("username", ERPInfo.Instance.UserName); + loginPmsDic.Add("password", ERPInfo.Instance.InPassWord); + HttpWebResponse loginResponse = HttpTools.Post(loginUrl, "", loginPmsDic, HttpTools.Method.POST, out CookieCollection loginCookie, out string loginResult); + if (loginResponse != null && !string.IsNullOrEmpty(loginResult)) + { + JObject jObject = JsonConvert.DeserializeObject(loginResult); + if (jObject.ContainsKey("success")) + { + if ((jObject["success"] + "").Equals("True")) + { + if (jObject.ContainsKey("token")) + { + token = jObject["token"] + ""; + } + } + } + } + if (!string.IsNullOrEmpty(token)) + { + byte[] fileBytes = ConvertFileToBytes(filePath); + string fileBase64Str = Convert.ToBase64String(fileBytes) + ""; + string postUrl = "{0}Api/FileUploadApi.ashx?moduleId={1}&idValue={2}&folder={3}&totsize={4}&position={5}&filename={6}&method={7}"; + Dictionary headerDic = new Dictionary(); + headerDic.Add("Authorization", $"Bearer {token}"); + postUrl = string.Format(postUrl, SystemInfo.Instance.OAUrl, this.SysModel.ModuleCode, this.lblOrderNo.Text, "UploadFilesTemp", fileBytes.Length, 0, System.Web.HttpUtility.UrlEncode($"{Guid.NewGuid()}_{Path.GetFileName(_imageEdit.CurrentImagePath)}"), "DoWebUpload"); + HttpTools.setting("application/x-www-form-urlencoded", null, null); + HttpWebResponse webResponse = HttpTools.Post(postUrl, fileBase64Str, null, headerDic, HttpTools.Method.POST, out CookieCollection cookieCollection, out string result); + if (webResponse != null && !string.IsNullOrEmpty(result)) + { + JObject jsonObject = (JObject)JsonConvert.DeserializeObject(result); + string isSuccess = jsonObject["success"] + ""; + if (isSuccess.Equals("True", StringComparison.CurrentCultureIgnoreCase)) + { + string fileId = jsonObject["other"] + ""; + string webpath = jsonObject["data"]["WebRelPath"] + ""; + BaseModuleImpl.UpdateRecord(this.BillModel.MasterTable, _imageEdit.Model.FieldName, webpath, this.BillModel.PrimaryKey, this.lblOrderNo.Text); + //string searchSql = @"update P_fm_FileTab set author='{2}',CreationTime='{3}' ,Uploader='{4}' ,UploadTime='{5}' + // where dllcoid = '{0}' and + // parentid = (select dirid from P_fm_DirectoryTab where + // ParentId = (select dirid from v_systemdlltab where DllCoid = '{0}') and PID = '{1}') and fileId='{6}' "; + //searchSql = string.Format(searchSql, this.Model.ModuleCode, this.leftTreeGridIdValue, dataRow["author"], fi.CreationTime, ERPInfo.Instance.UserName, dataRow["UploadTime"], fileId); + //SqlHelper.ExecuteNonQuery(searchSql); + } + else + { + if (jsonObject.ContainsKey("msg")) + { + string returnMsg = jsonObject["msg"] + ""; + MessageUtil.Show(string.Format("上传失败,原因:{0}", returnMsg)); + } + isUpload = false; + } + } + else + { + MessageUtil.Show(string.Format("上传失败,原因:{0}", result)); + } + } + else + { + MessageUtil.Show(string.Format("验证失败,原因:{0}", loginResult)); + } + } + catch (Exception ex) + { + MessageUtil.Show(string.Format("上传失败,原因:{0}", ex.Message)); + isUpload = false; + } + return isUpload; + } + /// + /// 附件转换byte[] + /// + /// 附件路径 + /// 二进制 + private byte[] ConvertFileToBytes(string filePath) + { + byte[] bytContent = null; + System.IO.FileStream fs = null; + System.IO.BinaryReader br = null; + try + { + fs = new FileStream(filePath, System.IO.FileMode.Open, FileAccess.Read, FileShare.Read); + } + catch (Exception) + { + throw; + } + if (fs != null) + br = new BinaryReader((Stream)fs); + if (br != null) + bytContent = br.ReadBytes((Int32)fs.Length); + if (fs != null) + fs.Dispose(); + return bytContent; + } + + /// + /// 说明:删除附件 + /// 创建人:龚宇超 + /// 创建日期:2018-02-27 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + protected void OnImageDeleteEvent(object sender) + { + try + { + LabelImageEdit imageEdit = sender as LabelImageEdit; + if (imageEdit != null) + { + int result = BaseModuleImpl.UpdateRecord(this.BillModel.MasterTable, imageEdit.Model.FieldName, "", this.BillModel.PrimaryKey, this.lblOrderNo.Text); + MessageUtil.Show(result > 0 ? ResourceKeys.OperSuccess : ResourceKeys.OperFault); + } + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + } + + } + + /// + /// 设置打印按钮条件 + /// + /// + public bool SetPrintButton(DataRow rowItem) + { + try + { + bool result = false; + //判断打印按钮条件 + if (!string.IsNullOrWhiteSpace(this.BillModel.PrintingConditions)) + { + if (rowItem == null) return result; + + string cond = ReplaceHelper.ReplaceRowParam(rowItem, this.BillModel.PrintingConditions); + if (cond.StartsWith("@") || cond.StartsWith("!")) + { + result = "1".Equals(BaseImpl.GetDefaultValue(cond)); + } + else + { + result = ReplaceHelper.ReplaceRowParamCond(rowItem, cond); + } + return result; + } + else + { + return true; + } + } + catch (Exception ex) + { + return false; + } + } + + + /// + /// 改变选中行的颜色 + /// + /// + /// + private void GridView_CustomDrawCell(object sender, RowCellCustomDrawEventArgs e) + { + } + + /// + /// 清空记录的选中行 + /// + /// + public void ClearHighlightRows(GridView gridview) + { + } + + + public bool VerificationCond() + { + + DataTable detailTable = this.gcMain.GridControl.DataSourceTable().TrimDeleteRows(); + + foreach (DataRow CondItem in SaveCondTab.Rows) + { + string condition = CondItem["condition"] + ""; + if (!string.IsNullOrWhiteSpace(condition)) + { + + if (detailTable != null && detailTable.Rows.Count > 0) + { + condition = this.ControlObj.ReplaceParentControlValue(condition); + foreach (DataRow item in detailTable.Rows) + { + if (!ValidateCond(condition, item)) + { + MessageUtil.Show(string.IsNullOrWhiteSpace(CondItem["hintmsg"] + "") ? "条件验证失败" : CondItem["hintmsg"] + ""); + return false; + } + } + } + else + { + List conditionlist = ReplaceHelper.GetParamFields(condition); + foreach (string item in conditionlist) + { + if (!item.Contains("{#")) continue;//只有所有替换参数都包含了{#的(全部都是主表参数),才会去验证条件 + } + condition = this.ControlObj.ReplaceParentControlValue(condition); + if (!ValidateCond(condition, null)) + { + MessageUtil.Show(string.IsNullOrWhiteSpace(CondItem["hintmsg"] + "") ? "条件验证失败" : CondItem["hintmsg"] + ""); + return false; + } + } + } + } + return true; + } + + /// + /// 点击第一个默认新增行新增默认数据 + /// + /// + /// + private void GridView_MouseDown(object sender, MouseEventArgs e) + { + + } + /// + /// 说明:检查添加数据到表格中是否包含 + /// + /// 创建人:龚宇超 + /// 创建日期:2018-04-20 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The row item. + /// The union model. + /// if set to true [only popup]. + private void AddRowToGridViewByBom(DataRow rowItem, BillSourceUnionModel unionModel, ref bool onlyPopup) + { + if (!string.IsNullOrEmpty(unionModel.ModelObj.BomSql)) + { + string bomSql = unionModel.ModelObj.BomSql; + // 检查是否有bom配置 + if (unionModel.ModelObj.LoadBom == 1) + { + // 自动带出bom数据,不弹出选择 + DataTable table = BaseImpl.GetDataTableResult(ReplaceHelper.ReplaceRowParam(rowItem, bomSql)); + foreach (DataRow item in table.Rows) + { + this.AddRowToGridView(item); + } + } + else if (unionModel.ModelObj.LoadBom == 2) + { + DataTable table = BaseImpl.GetDataTableResult(ReplaceHelper.ReplaceRowParam(rowItem, bomSql)); + + if (!onlyPopup && table.Rows.Count > 0) + { + // 自动带出bom数据,弹出选择 + FrmBomSelect frmSelect = new FrmBomSelect(); + frmSelect.Caption = unionModel.ModelObj.BomCaption; + frmSelect.GridColumns = unionModel.GridDetailControlObj.GridView.Columns; + frmSelect.BomDataTable = table; + + DialogResult result = frmSelect.ShowDialog(); + onlyPopup = frmSelect.OnlyPopup; + + if (result == DialogResult.OK && frmSelect.SelectBomRows != null && frmSelect.SelectBomRows.Length > 0) + { + foreach (DataRow item in frmSelect.SelectBomRows) + { + this.AddRowToGridView(item); + } + } + } + else + { + foreach (DataRow item in table.Rows) + { + this.AddRowToGridView(item); + } + } + } + } + } + + + + + /// + /// 说明:添加行到单据明细中 + /// 创建人:龚宇超 + /// 创建日期:2017-11-30 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The row item. + /// The union model. + private void AddRowToTreeGridControl(DataRow rowItem, string Pid) + { + TreeListColumnCollection gridColumns = (this.gcMain as TreeGridControlEx).TreeListObj.Columns; + DataTable gridTable = ((this.gcMain as TreeGridControlEx).TreeListObj.DataSource as DataTable).TrimDeleteRows(); + if (!gridTable.Columns.Contains(ERPInfo.Instance.isAddRows)) + { + gridTable.Columns.Add(ERPInfo.Instance.isAddRows, typeof(String)); + } + string repeatProduct = (this.gcMain as TreeGridControlEx).TreeListObj.Columns["ProductId"] != null && rowItem.Table.Columns.Contains("ProductId") ? "ProductId" : this.BillModel.DetailPreFix + "ProductId"; + AssociatedField = repeatProduct; + if ("1".Equals(this.BillModel.DetailDoubleClickTip) && rowItem.Table.Columns.Contains(repeatProduct)) + { + // 需要提示编码重复 + DataTable dt = (this.gcMain as TreeGridControlEx).TreeListObj.DataSource as DataTable; + if (dt != null && dt.Rows.Count > 0 && dt.Columns.Contains(repeatProduct)) + { + DataRow[] drs = dt.Select(repeatProduct + "='" + rowItem[repeatProduct] + "'"); + if (drs.Length >= 1) + { + DialogResult dialog = MessageUtil.Show(ResourceKeys.ProductIsRepet, MessageBoxButtons.YesNo); + if (dialog != DialogResult.Yes) + return; + } + } + } + DataRow newRow = gridTable.NewRow(); + //2024-1-29改成>=,之前为>导致选中第一行只会添加到最后一行(测试空白行没有影响) + int position = this.gcMain.GridView.FocusedRowHandle >= 0 ? gridTable.Rows.Count > 0 ? this.gcMain.GridView.FocusedRowHandle : 0 : gridTable.Rows.Count - 1; + + + + (this.gcMain as TreeGridControlEx).TreeListObj.BeginUpdate(); + GridView gridView = this.gcMain.GridView; + // 赋值明细字段 + foreach (TreeListColumn col in gridColumns) + { + try + { + // 未包含字段,则使用控件默认值. + GridColumnModel model = col.Tag as GridColumnModel; + + if (rowItem.Table.Columns.Contains(col.FieldName)) + { + // 来源列中是否包含对应字段,包含则使用值 + newRow[col.FieldName] = rowItem[col.FieldName]; + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, rowItem[col.FieldName] + "", newRow); + } + SetCalcValue(model, rowItem[col.FieldName] + "", newRow); + } + else + { + + if (col.FieldName.Contains("_Ls")) + { + string[] unioFielName = col.FieldName.Split('_'); + string UnioValue = unioFielName[unioFielName.Length - 1]; + DataColumn grid = rowItem.Table.Columns.Cast().FirstOrDefault(x => x.ColumnName.Split('_')[x.ColumnName.Split('_').Length - 1].Equals(UnioValue)); + if (grid != null && !string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, rowItem[col.FieldName] + "", newRow); + } + SetCalcValue(model, rowItem[col.FieldName] + "", newRow); + } + else + { + string fieldValue = BaseImpl.GetDefaultValue(model.DefaultValue); + + if (model.DefaultValue.Contains("{#")) + { + fieldValue = this.ControlObj.ReplaceParentControlValue(model.DefaultValue); + if (!string.IsNullOrEmpty(fieldValue)) + { + newRow[col.FieldName] = fieldValue; + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, fieldValue + "", newRow); + } + SetCalcValue(model, fieldValue + "", newRow); + } + } + else if (!string.IsNullOrEmpty(model.DefaultValue)) + { + newRow[col.FieldName] = fieldValue; + if (!string.IsNullOrEmpty(model.UnionFields)) + { + this.SetUnionValue(model, fieldValue + "", newRow); + } + SetCalcValue(model, fieldValue + "", newRow); + } + } + } + SetDisableColumn(model, newRow[col.FieldName] + "", newRow); + if (model.LimitLength > 0) + { + DataRow HandleRow = newRow; + int MaxInputLength = System.Text.Encoding.Default.GetBytes(newRow[col.FieldName] + "").Length; + if (model.LimitLength < MaxInputLength) + HandleRow.SetColumnError(HandleRow.Table.Columns[col.ColumnHandle], "当前输入文本超过设定长度!");//满足条件设置错误信息 + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + } + } + (this.gcMain as TreeGridControlEx).TreeListObj.EndUpdate(); + if (string.IsNullOrWhiteSpace(newRow[(this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName] + "")) + { + newRow[(this.gcMain as TreeGridControlEx).TreeListObj.KeyFieldName] = (this.gcMain as TreeGridControlEx).GetNewNodesId();//节点id为空,就默认给当前数据源最大id+1 + } + + if (!string.IsNullOrWhiteSpace(Pid)) + { + newRow[(this.gcMain as TreeGridControlEx).TreeListObj.ParentFieldName] = Pid;//拖拽到目标节点的id + } + // 添加数据行 + gridTable.Rows.Add(newRow); + + + if (!string.IsNullOrEmpty(NumberMc) && gridTable.Columns.Contains(mRecordPrimaryField)) + { + DataRow[] rt = gridTable.Rows.Cast().Where(x => (newRow[BillModel.DetailPreFix + "ProductId"] + "").Equals(x[BillModel.DetailPreFix + "ProductId"] + "") && !string.IsNullOrEmpty(x[mRecordPrimaryField] + "")).ToArray(); + foreach (DataRow item in rt) + { + if (newRow != null) + { + newRow[NumberMc] = Convert.ToDouble(newRow[NumberMc]) - Convert.ToDouble(item[NumberMc]); + } + //this.gcMain.OnGridViewCellValueChanged(this.gcMain, new CellValueChangedEventArgs(position + 1, this.gcMain.GridView.Columns[NumberMc], newRow[NumberMc] + "")); + //this.gcMain.GridView.UpdateCurrentRow(); + //this.gcMain.GridView.ShowEditor(); + if (Convert.ToDouble(newRow[NumberMc] + "") == 0.0) + { + gridTable.Rows.Remove(newRow); + MessageUtil.Show("数量已分配完毕!无需再进行拖拽!"); + } + } + } + //gridTable.OrderBy(this.BillModel.DetailOrderField); + //设置排序列的值 + (this.gcMain as TreeGridControlEx).DataSourceSorting(); + } + + } +} diff --git a/插件库/Lskj.PubBillManagement/FrmBill.resx b/插件库/Lskj.PubBillManagement/FrmBill.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmBill.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmBomSelect.Designer.cs b/插件库/Lskj.PubBillManagement/FrmBomSelect.Designer.cs new file mode 100644 index 0000000..39ddc58 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmBomSelect.Designer.cs @@ -0,0 +1,196 @@ +namespace Lskj.PubBillManagement +{ + partial class FrmBomSelect + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.panelControl1 = new DevExpress.XtraEditors.PanelControl(); + this.pl_main = new DevExpress.XtraEditors.PanelControl(); + this.gcMain = new Lskj.Control.GridControlEx(); + this.pl_bottom = new DevExpress.XtraEditors.PanelControl(); + this.chkOperate = new DevExpress.XtraEditors.CheckEdit(); + this.btnClearSelectAll = new DevExpress.XtraEditors.SimpleButton(); + this.btnCancel = new DevExpress.XtraEditors.SimpleButton(); + this.btnSelectAll = new DevExpress.XtraEditors.SimpleButton(); + this.btnOk = new DevExpress.XtraEditors.SimpleButton(); + ((System.ComponentModel.ISupportInitialize)(this.panelControl1)).BeginInit(); + this.panelControl1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_main)).BeginInit(); + this.pl_main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_bottom)).BeginInit(); + this.pl_bottom.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chkOperate.Properties)).BeginInit(); + this.SuspendLayout(); + // + // panelControl1 + // + this.panelControl1.Controls.Add(this.pl_main); + this.panelControl1.Controls.Add(this.pl_bottom); + this.panelControl1.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelControl1.Location = new System.Drawing.Point(0, 0); + this.panelControl1.Name = "panelControl1"; + this.panelControl1.Size = new System.Drawing.Size(515, 341); + this.panelControl1.TabIndex = 0; + // + // pl_main + // + this.pl_main.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_main.Appearance.Options.UseBackColor = true; + this.pl_main.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_main.Controls.Add(this.gcMain); + this.pl_main.Dock = System.Windows.Forms.DockStyle.Fill; + this.pl_main.Location = new System.Drawing.Point(2, 2); + this.pl_main.Name = "pl_main"; + this.pl_main.Size = new System.Drawing.Size(511, 303); + this.pl_main.TabIndex = 1; + // + // gcMain + // + this.gcMain.AdapterObj = null; + this.gcMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.gcMain.Location = new System.Drawing.Point(0, 0); + this.gcMain.Name = "gcMain"; + this.gcMain.Size = new System.Drawing.Size(511, 303); + this.gcMain.TabIndex = 0; + // + // pl_bottom + // + this.pl_bottom.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_bottom.Appearance.Options.UseBackColor = true; + this.pl_bottom.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_bottom.Controls.Add(this.chkOperate); + this.pl_bottom.Controls.Add(this.btnClearSelectAll); + this.pl_bottom.Controls.Add(this.btnCancel); + this.pl_bottom.Controls.Add(this.btnSelectAll); + this.pl_bottom.Controls.Add(this.btnOk); + this.pl_bottom.Dock = System.Windows.Forms.DockStyle.Bottom; + this.pl_bottom.Location = new System.Drawing.Point(2, 305); + this.pl_bottom.Name = "pl_bottom"; + this.pl_bottom.Size = new System.Drawing.Size(511, 34); + this.pl_bottom.TabIndex = 0; + // + // chkOperate + // + this.chkOperate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.chkOperate.Location = new System.Drawing.Point(250, 8); + this.chkOperate.Name = "chkOperate"; + this.chkOperate.Properties.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.chkOperate.Properties.Appearance.Options.UseFont = true; + this.chkOperate.Properties.Caption = "应用到所有操作"; + this.chkOperate.Size = new System.Drawing.Size(115, 19); + this.chkOperate.TabIndex = 28; + // + // btnClearSelectAll + // + this.btnClearSelectAll.AllowFocus = false; + this.btnClearSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnClearSelectAll.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnClearSelectAll.Appearance.Options.UseFont = true; + this.btnClearSelectAll.Location = new System.Drawing.Point(73, 4); + this.btnClearSelectAll.Name = "btnClearSelectAll"; + this.btnClearSelectAll.Size = new System.Drawing.Size(67, 26); + this.btnClearSelectAll.TabIndex = 27; + this.btnClearSelectAll.Text = "反选(&N)"; + this.btnClearSelectAll.Click += new System.EventHandler(this.OnClearSelectAllClick); + // + // btnCancel + // + this.btnCancel.AllowFocus = false; + this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnCancel.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnCancel.Appearance.Options.UseFont = true; + this.btnCancel.Location = new System.Drawing.Point(440, 4); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(67, 26); + this.btnCancel.TabIndex = 27; + this.btnCancel.Text = "取消(&C)"; + this.btnCancel.Click += new System.EventHandler(this.OnCancelButtonClick); + // + // btnSelectAll + // + this.btnSelectAll.AllowFocus = false; + this.btnSelectAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnSelectAll.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnSelectAll.Appearance.Options.UseFont = true; + this.btnSelectAll.Location = new System.Drawing.Point(4, 4); + this.btnSelectAll.Name = "btnSelectAll"; + this.btnSelectAll.Size = new System.Drawing.Size(67, 26); + this.btnSelectAll.TabIndex = 26; + this.btnSelectAll.Text = "全选(&Y)"; + this.btnSelectAll.Click += new System.EventHandler(this.OnSelectAllClick); + // + // btnOk + // + this.btnOk.AllowFocus = false; + this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnOk.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnOk.Appearance.Options.UseFont = true; + this.btnOk.Location = new System.Drawing.Point(371, 4); + this.btnOk.Name = "btnOk"; + this.btnOk.Size = new System.Drawing.Size(67, 26); + this.btnOk.TabIndex = 26; + this.btnOk.Text = "确定(&S)"; + this.btnOk.Click += new System.EventHandler(this.OnOkButtonClick); + // + // FrmBomSelect + // + this.Appearance.BackColor = System.Drawing.Color.Transparent; + this.Appearance.Options.UseBackColor = true; + this.Appearance.Options.UseFont = true; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(515, 341); + this.Controls.Add(this.panelControl1); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmBomSelect"; + this.Text = "Bom选择"; + ((System.ComponentModel.ISupportInitialize)(this.panelControl1)).EndInit(); + this.panelControl1.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_main)).EndInit(); + this.pl_main.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_bottom)).EndInit(); + this.pl_bottom.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.chkOperate.Properties)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private DevExpress.XtraEditors.PanelControl panelControl1; + private DevExpress.XtraEditors.PanelControl pl_main; + private DevExpress.XtraEditors.PanelControl pl_bottom; + private Control.GridControlEx gcMain; + private DevExpress.XtraEditors.SimpleButton btnCancel; + private DevExpress.XtraEditors.SimpleButton btnOk; + private DevExpress.XtraEditors.SimpleButton btnClearSelectAll; + private DevExpress.XtraEditors.SimpleButton btnSelectAll; + private DevExpress.XtraEditors.CheckEdit chkOperate; + + } +} \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmBomSelect.cs b/插件库/Lskj.PubBillManagement/FrmBomSelect.cs new file mode 100644 index 0000000..39b8380 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmBomSelect.cs @@ -0,0 +1,260 @@ +/****************************** +* 说明:Bom选择 +* 创建人:龚宇超 +* 创建日期:2018-02-06 +* 修改人: +* 修改日期: +* 修改备注: +* 版本:1.0.0.0 +******************************/ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Lskj.Control; +using Lskj.Control.Model; +using Lskj.PubBillManagement.Model; +using Lskj.Business.Impl; +using DevExpress.XtraGrid.Columns; +using DevExpress.XtraGrid; +using Lskj.Data; + +namespace Lskj.PubBillManagement +{ + /// + /// Bom选择 + /// + public partial class FrmBomSelect : BaseForm + { + /// + /// 是否记住操作,后续不在弹出界面 + /// + public bool OnlyPopup; + /// + /// 标题 + /// + public string Caption; + /// + /// 选中的bom数据 + /// + public DataRow[] SelectBomRows; + /// + /// The bom data table + /// + public DataTable BomDataTable; + /// + /// 单据明细表格列 + /// + public GridColumnCollection GridColumns; + + public FrmBomSelect() + { + InitializeComponent(); + } + + /// + /// 说明:窗口加载 + /// 创建人:龚宇超 + /// 创建日期:2018-02-06 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The instance containing the event data. + protected override void OnLoad(EventArgs e) + { + try + { + base.OnLoad(e); + if (BomDataTable != null) + { + this.Text = string.IsNullOrEmpty(Caption) ? this.Text : this.Caption; + + DataColumn dataColumn = new DataColumn("Id", typeof(bool)); + dataColumn.DefaultValue = true; + + this.BomDataTable.Columns.Add(dataColumn); + this.InitGridView(); + } + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message,ex.Message); + } + } + + /// + /// 说明:初始化表格控件 + /// 创建人:龚宇超 + /// 创建日期:2018-02-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The table. + private void InitGridView() + { + // 增加选择列 + GridColumn gridColumn = new GridColumn(); + gridColumn.FieldName = gridColumn.Name = "Id"; + gridColumn.Caption = "选择"; + gridColumn.Width = 50; + gridColumn.VisibleIndex = 1; + gridColumn.AppearanceHeader.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Center; + gridColumn.Visible = true; + + gcMain.GridView.Columns.Add(gridColumn); + + // 添加其他列 + foreach (GridColumn item in GridColumns) + { + GridColumn column = new GridColumn(); + column.Caption = item.Caption; + column.FieldName = item.FieldName; + column.OptionsColumn.AllowEdit = false; + column.OptionsColumn.ReadOnly = true; + column.Width = item.Width; + column.VisibleIndex = item.VisibleIndex; + column.Visible = item.Visible; + gcMain.GridView.Columns.Add(column); + } + + gcMain.SetGridViewDataSource(BomDataTable); + } + /// + /// 说明:获取选中数据 + /// 创建人:龚宇超 + /// 创建日期:2018-02-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// DataRow[]. + private DataRow[] GetSelectRows() + { + DataTable table = gcMain.GridControl.DataSourceTable(); + + return table.Select("Id = true").ToArray(); + } + + /// + /// 说明:全选 + /// 创建人:龚宇超 + /// 创建日期:2018-02-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + void OnSelectAllClick(object sender, EventArgs e) + { + try + { + DataTable table = gcMain.GridControl.DataSourceTable(); + foreach (DataRow item in table.Rows) + { + item["Id"] = true; + } + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message,ex.Message); + } + } + /// + /// 说明:反选 + /// 创建人:龚宇超 + /// 创建日期:2018-02-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + void OnClearSelectAllClick(object sender, EventArgs e) + { + try + { + DataTable table = gcMain.GridControl.DataSourceTable(); + foreach (DataRow item in table.Rows) + { + item["Id"] = false; + } + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message,ex.Message); + } + } + /// + /// 说明:确定 + /// 创建人:龚宇超 + /// 创建日期:2018-02-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + void OnOkButtonClick(object sender, EventArgs e) + { + try + { + DataRow[] rows = GetSelectRows(); + if (rows == null || rows.Length == 0) + { + MessageUtil.Show(ResourceKeys.SelectRowIsNull); + return; + } + + this.SelectBomRows = rows; + this.OnlyPopup = chkOperate.Checked; + this.DialogResult = DialogResult.OK; + } + catch (Exception ex) + { + //MessageUtil.Show("确定事件出错!" + ex); + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message,ex.Message); + } + + } + /// + /// 说明:取消 + /// 创建人:龚宇超 + /// 创建日期:2018-02-07 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + void OnCancelButtonClick(object sender, EventArgs e) + { + try + { + this.DialogResult = DialogResult.Cancel; + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message,ex.Message); + } + } + } +} \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmBomSelect.resx b/插件库/Lskj.PubBillManagement/FrmBomSelect.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmBomSelect.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmDocumentSource.Designer.cs b/插件库/Lskj.PubBillManagement/FrmDocumentSource.Designer.cs new file mode 100644 index 0000000..d9372d5 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmDocumentSource.Designer.cs @@ -0,0 +1,245 @@ + +namespace Lskj.PubBillManagement +{ + partial class FrmDocumentSource + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.splitMain = new DevExpress.XtraEditors.SplitContainerControl(); + this.pl_left = new DevExpress.XtraEditors.PanelControl(); + this.pl_left_main = new System.Windows.Forms.Panel(); + this.pl_gridandtree_container = new DevExpress.XtraEditors.PanelControl(); + this.treeLeft = new Lskj.Control.TreeViewEx(); + this.gridLeft = new Lskj.Control.GridControlEx(); + this.pl_left_top = new DevExpress.XtraEditors.PanelControl(); + this.pl_top = new DevExpress.XtraEditors.PanelControl(); + this.panelControl1 = new DevExpress.XtraEditors.PanelControl(); + this.btnCancel = new DevExpress.XtraEditors.SimpleButton(); + this.btnOk = new DevExpress.XtraEditors.SimpleButton(); + this.gcMain = new Lskj.Control.GridControlEx(); + ((System.ComponentModel.ISupportInitialize)(this.splitMain)).BeginInit(); + this.splitMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_left)).BeginInit(); + this.pl_left.SuspendLayout(); + this.pl_left_main.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_gridandtree_container)).BeginInit(); + this.pl_gridandtree_container.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pl_left_top)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pl_top)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.panelControl1)).BeginInit(); + this.panelControl1.SuspendLayout(); + this.SuspendLayout(); + // + // splitMain + // + this.splitMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitMain.Location = new System.Drawing.Point(0, 0); + this.splitMain.Margin = new System.Windows.Forms.Padding(4); + this.splitMain.Name = "splitMain"; + this.splitMain.Panel1.Controls.Add(this.pl_left); + this.splitMain.Panel1.Text = "Panel1"; + this.splitMain.Panel2.Controls.Add(this.gcMain); + this.splitMain.Panel2.Controls.Add(this.panelControl1); + this.splitMain.Panel2.Controls.Add(this.pl_top); + this.splitMain.Panel2.Text = "Panel2"; + this.splitMain.Size = new System.Drawing.Size(800, 450); + this.splitMain.SplitterPosition = 260; + this.splitMain.TabIndex = 1; + this.splitMain.Text = "splitContainerControl1"; + // + // pl_left + // + this.pl_left.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_left.Appearance.Options.UseBackColor = true; + this.pl_left.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_left.Controls.Add(this.pl_left_main); + this.pl_left.Dock = System.Windows.Forms.DockStyle.Fill; + this.pl_left.Location = new System.Drawing.Point(0, 0); + this.pl_left.Margin = new System.Windows.Forms.Padding(4); + this.pl_left.Name = "pl_left"; + this.pl_left.Size = new System.Drawing.Size(260, 450); + this.pl_left.TabIndex = 1; + // + // pl_left_main + // + this.pl_left_main.BackColor = System.Drawing.Color.Transparent; + this.pl_left_main.Controls.Add(this.pl_gridandtree_container); + this.pl_left_main.Controls.Add(this.pl_left_top); + this.pl_left_main.Dock = System.Windows.Forms.DockStyle.Fill; + this.pl_left_main.Location = new System.Drawing.Point(0, 0); + this.pl_left_main.Margin = new System.Windows.Forms.Padding(4); + this.pl_left_main.Name = "pl_left_main"; + this.pl_left_main.Size = new System.Drawing.Size(260, 450); + this.pl_left_main.TabIndex = 6; + // + // pl_gridandtree_container + // + this.pl_gridandtree_container.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_gridandtree_container.Controls.Add(this.treeLeft); + this.pl_gridandtree_container.Controls.Add(this.gridLeft); + this.pl_gridandtree_container.Dock = System.Windows.Forms.DockStyle.Fill; + this.pl_gridandtree_container.Location = new System.Drawing.Point(0, 45); + this.pl_gridandtree_container.Margin = new System.Windows.Forms.Padding(4); + this.pl_gridandtree_container.Name = "pl_gridandtree_container"; + this.pl_gridandtree_container.Size = new System.Drawing.Size(260, 405); + this.pl_gridandtree_container.TabIndex = 9; + // + // treeLeft + // + this.treeLeft.Dock = System.Windows.Forms.DockStyle.Fill; + this.treeLeft.Location = new System.Drawing.Point(0, 0); + this.treeLeft.Margin = new System.Windows.Forms.Padding(4); + this.treeLeft.Name = "treeLeft"; + this.treeLeft.Size = new System.Drawing.Size(260, 405); + this.treeLeft.TabIndex = 7; + this.treeLeft.Visible = false; + // + // gridLeft + // + this.gridLeft.AdapterObj = null; + this.gridLeft.BackColor = System.Drawing.SystemColors.Control; + this.gridLeft.Dock = System.Windows.Forms.DockStyle.Fill; + this.gridLeft.Location = new System.Drawing.Point(0, 0); + this.gridLeft.Margin = new System.Windows.Forms.Padding(5); + this.gridLeft.Name = "gridLeft"; + this.gridLeft.SiftEnumObj = Lskj.Control.GridControlEx.HeaderSiftEnum.Sum; + this.gridLeft.Size = new System.Drawing.Size(260, 405); + this.gridLeft.SysModel = null; + this.gridLeft.TabIndex = 6; + // + // pl_left_top + // + this.pl_left_top.Appearance.BackColor = System.Drawing.SystemColors.Control; + this.pl_left_top.Appearance.Options.UseBackColor = true; + this.pl_left_top.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_left_top.Dock = System.Windows.Forms.DockStyle.Top; + this.pl_left_top.Location = new System.Drawing.Point(0, 0); + this.pl_left_top.Margin = new System.Windows.Forms.Padding(4); + this.pl_left_top.Name = "pl_left_top"; + this.pl_left_top.Size = new System.Drawing.Size(260, 45); + this.pl_left_top.TabIndex = 8; + // + // pl_top + // + this.pl_top.Appearance.BackColor = System.Drawing.Color.Transparent; + this.pl_top.Appearance.Options.UseBackColor = true; + this.pl_top.BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.NoBorder; + this.pl_top.Dock = System.Windows.Forms.DockStyle.Top; + this.pl_top.Location = new System.Drawing.Point(0, 0); + this.pl_top.Name = "pl_top"; + this.pl_top.Size = new System.Drawing.Size(535, 34); + this.pl_top.TabIndex = 13; + // + // panelControl1 + // + this.panelControl1.Controls.Add(this.btnCancel); + this.panelControl1.Controls.Add(this.btnOk); + this.panelControl1.Dock = System.Windows.Forms.DockStyle.Bottom; + this.panelControl1.Location = new System.Drawing.Point(0, 403); + this.panelControl1.Margin = new System.Windows.Forms.Padding(4); + this.panelControl1.Name = "panelControl1"; + this.panelControl1.Size = new System.Drawing.Size(535, 47); + this.panelControl1.TabIndex = 15; + // + // btnCancel + // + this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnCancel.Location = new System.Drawing.Point(441, 5); + this.btnCancel.Margin = new System.Windows.Forms.Padding(4); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(79, 35); + this.btnCancel.TabIndex = 24; + this.btnCancel.Text = "取消(&C)"; + // + // btnOk + // + this.btnOk.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnOk.Appearance.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnOk.Appearance.Options.UseFont = true; + this.btnOk.Location = new System.Drawing.Point(357, 5); + this.btnOk.Margin = new System.Windows.Forms.Padding(4); + this.btnOk.Name = "btnOk"; + this.btnOk.Size = new System.Drawing.Size(76, 35); + this.btnOk.TabIndex = 23; + this.btnOk.TabStop = false; + this.btnOk.Text = "确定(&O)"; + // + // gcMain + // + this.gcMain.AdapterObj = null; + this.gcMain.BackColor = System.Drawing.Color.Transparent; + this.gcMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.gcMain.Location = new System.Drawing.Point(0, 34); + this.gcMain.Margin = new System.Windows.Forms.Padding(5); + this.gcMain.Name = "gcMain"; + this.gcMain.SiftEnumObj = Lskj.Control.GridControlEx.HeaderSiftEnum.Sum; + this.gcMain.Size = new System.Drawing.Size(535, 369); + this.gcMain.SysModel = null; + this.gcMain.TabIndex = 16; + // + // FrmDocumentSource + // + this.Appearance.BackColor = System.Drawing.SystemColors.Control; + this.Appearance.Options.UseBackColor = true; + this.Appearance.Options.UseFont = true; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.splitMain); + this.Name = "FrmDocumentSource"; + this.Text = "FrmDocumentSource"; + ((System.ComponentModel.ISupportInitialize)(this.splitMain)).EndInit(); + this.splitMain.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_left)).EndInit(); + this.pl_left.ResumeLayout(false); + this.pl_left_main.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_gridandtree_container)).EndInit(); + this.pl_gridandtree_container.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pl_left_top)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pl_top)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.panelControl1)).EndInit(); + this.panelControl1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private DevExpress.XtraEditors.SplitContainerControl splitMain; + private DevExpress.XtraEditors.PanelControl pl_left; + private System.Windows.Forms.Panel pl_left_main; + private DevExpress.XtraEditors.PanelControl pl_gridandtree_container; + private Control.TreeViewEx treeLeft; + private Control.GridControlEx gridLeft; + private DevExpress.XtraEditors.PanelControl pl_left_top; + private Control.GridControlEx gcMain; + private DevExpress.XtraEditors.PanelControl panelControl1; + private DevExpress.XtraEditors.SimpleButton btnCancel; + private DevExpress.XtraEditors.SimpleButton btnOk; + private DevExpress.XtraEditors.PanelControl pl_top; + } +} \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmDocumentSource.cs b/插件库/Lskj.PubBillManagement/FrmDocumentSource.cs new file mode 100644 index 0000000..a47517b --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmDocumentSource.cs @@ -0,0 +1,601 @@ +using DevExpress.XtraEditors; +using DevExpress.XtraGrid.Columns; +using DevExpress.XtraGrid.Views.Grid; +using Lskj.Business; +using Lskj.Business.Impl; +using Lskj.Control; +using Lskj.Control.Model; +using Lskj.Data; +using Lskj.Model; +using Lskj.Util; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Data.SqlClient; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Lskj.PubBillManagement +{ + public partial class FrmDocumentSource : BaseForm + { + + + + /// + /// 配置的关联ModuleCodel值 + /// + /// The Union ModuleCodel. + public string UnionModuleCodel; + /// + /// 左侧树数据 + /// + public DataRow LeftRowObj; + /// + /// 系统模块实体对象 + /// + /// The system model. + public ModuleModel SysModel { get; private set; } + /// + /// 自定义查询条件 + /// + public MyControl SearchObj { get; private set; } + /// + /// 第一次进入 + /// + private bool isFirst = true; + /// + /// 第一次进入 + /// + private bool isFirstSearch = true; + /// + /// 左侧树结构 + /// + public TreeViewEx LeftTreeViewEx; + /// + /// 左侧表格 + /// + public GridControlEx LeftGridEx; + /// + /// 左侧结构关联字段 + /// + public string ParentUnionField; + /// + /// 左侧树结构、表格主键 + /// + public string ParentKeyField; + /// + /// CurrentOperColumnKey值(保存表格属性会用) + /// + /// The data source. + public string CurrentOperColumnKey = string.Empty; + /// + /// 左侧表格查询条件 + /// + private MyControl _leftGridSearchObj; + /// + /// 返回行 + /// + public DataRow[] DataRows = null; + + + public FrmDocumentSource(string ModuleCodel) + { + InitializeComponent(); + this.UnionModuleCodel = ModuleCodel; + this.Disposed += new EventHandler(OnFrmModelLookUp_Disposed); + this.gcMain.GridView.OptionsBehavior.EditorShowMode = DevExpress.Utils.EditorShowMode.MouseDown; + + DataRow modelRow = MainImpl.GetSystemdllTab(this.UnionModuleCodel);//获取单个模块信息 + if (modelRow == null) + { + MessageUtil.Show("模块编号[" + UnionModuleCodel + "],配置错误!\r\n该模块信息未找到!"); + return; + } + + this.SysModel = new ModuleModel(modelRow);// 系统模块实体对象 + //设置关联模块(左侧) + this.InitLeftControls(); + //设置主表 + this.InitMainControls(); + + this.btnCancel.Click += btnCancel_Click; + this.btnOk.Click += btnOk_Click; + } + + + /// + /// 初始化左侧表 + /// + public void InitLeftControls() + { + if (this.SysModel != null) + { + switch (this.SysModel.MenuType) + { + case 1: // 左侧为树节点 + this.pl_left_top.Visible = false; + this.gridLeft.Visible = false; + this.treeLeft.Visible = true; + this.InitlizeSpiltLocation();//设置分割条位置 + this.SetLeftTreeView();//设置左侧树数据 + this.LeftTreeViewEx = this.treeLeft; + break; + case 2: // 左侧为表格 + this.gridLeft.Visible = true; + this.treeLeft.Visible = false; + this.InitlizeSpiltLocation(); + this.SetLeftGridView(); + this.LeftGridEx = this.gridLeft; + break; + case 3: // 左侧为空 + default: + this.splitMain.PanelVisibility = SplitPanelVisibility.Panel2; + break; + } + + } + else + { + this.splitMain.PanelVisibility = SplitPanelVisibility.Panel2; + } + + + } + + /// + /// 初始化主表 + /// + public void InitMainControls() + { + + //设置上方条件 + this.pl_top.Controls.Clear(); + DataTable queryTable = BaseModuleImpl.GetCustomQueryFields(this.SysModel.CondKey);//加载自定义配置字段 + this.SearchObj = new MyControl(this.SysModel.MenuSql, this.gcMain, LeftTreeViewEx, LeftGridEx); + this.SearchObj.ParentKeyField = this.ParentKeyField; + this.SearchObj.ParentUnionField = this.ParentUnionField; + this.SearchObj.OnDataSourceBindCallBack += new EventHandler(OnFirstPageDataSourceBindCallBack); + this.SearchObj.OnSearchAfterCallBack += new EventHandler(OnSearchAfterd); + this.pl_top.Height = 0; + this.pl_top.Height = this.SearchObj.InitSearchControl(queryTable, this.pl_top); + //创建表格列 + DataTable _gridColumns = BaseModuleImpl.GetBaseGridColumns(this.UnionModuleCodel); + this.gcMain.SetReadOnlyColumns(_gridColumns, GridCustomColumnStruct.BaseMainGridView + this.SysModel.FormKey); + //this.SetCustomColumns(); + //设置复选框 + GridDragGrid.GridAddCheckBox(gcMain.GridView); + //右键 + DataTable dt = BaseModuleImpl.GetBaseGridRightMenus(this.UnionModuleCodel); + string[] obj = new string[]{ + "", + ERPInfo.Instance.UserId, + ERPInfo.Instance.UserName, + "3", + this.UnionModuleCodel, + }; ; + DynamicModel dynamicModel = new DynamicModel(obj); + this.gcMain.SetGridRightMenus(dt, dynamicModel, this.OnGridViewRightCallBack, this.SearchObj, null); + //this.gcMain.GridView.OptionsView.ColumnAutoWidth = true; + + + } + + + /// + /// 查询后清空复选框勾选 + /// + /// + /// + private void OnSearchAfterd(object sender, EventArgs e) + { + this.gcMain.GridView.ClearSelection(); + } + + /// + /// 初始化后默认查询 + /// + /// + /// + private void OnFirstPageDataSourceBindCallBack(object sender, EventArgs e) + { + //打开时默认选中第一条 + if (LeftTreeViewEx != null && LeftTreeViewEx.TreeView.Nodes.Count > 0) + { + LeftTreeViewEx.TreeView.SelectedNode = LeftTreeViewEx.TreeView.Nodes[0]; + LeftTreeViewEx.TreeView.Nodes[0].Expand(); + } + else if (LeftGridEx != null) + { + LeftGridEx.GridView.SelectRow(0); + } + this.SearchObj.SearchGrid(); + } + + + + #region 设置分割条位置 + /// + /// 说明:设置分割条位置 + /// 创建人:王一帆 + /// 创建日期:2021-07-21 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + protected void InitlizeSpiltLocation() + { + try + { + string width = IniHelper.Read(string.Format("bill_Special_Width_{0}", this.UnionModuleCodel));//通过Key获取Value值 + if (!string.IsNullOrEmpty(width)) + { + this.splitMain.SplitterPosition = Convert.ToInt32(width); + + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + MessageUtil.Show(ex); + } + } + #endregion + #region 保存表格属性 + /// + /// 说明:保存表格属性 + /// 创建人:王一帆 + /// 创建日期:2021-07-20 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + protected virtual void SaveItemClick(object sender, EventArgs e) + { + DataRow rowItem = null; + bool success = BaseImpl.HasExistsDataRow(ResourceKeys.SettingTableName, "formKey", CurrentOperColumnKey, string.Format(" and OperatorId='{0}' ", ERPInfo.Instance.UserId), out rowItem); + if (!success) + { + MessageUtil.Show(ResourceKeys.NotFoundSettingColumnTable); + return; + } + + if (MessageUtil.Show(ResourceKeys.IsSaveColumn, MessageBoxButtons.YesNo) == DialogResult.Yes) + { + try + { + if (rowItem == null) + { + success = this.gcMain.GridView.SaveCustomColumnToDatabase(this.CurrentOperColumnKey); + } + else + { + success = this.gcMain.GridView.UpdateCustomColumnToDatabase(this.CurrentOperColumnKey); + } + MessageUtil.Show(success ? ResourceKeys.SaveSuccess : ResourceKeys.SaveFault); + } + catch (SqlException sex) + { + if (sex.Message.Contains(ResourceKeys.FieldLenIsShort) && + MessageUtil.Show(ResourceKeys.SaveFault + "\r\n" + ResourceKeys.CanUpgradeTable, MessageBoxButtons.YesNo) == DialogResult.Yes && + BaseImpl.UpdateTableField(ResourceKeys.SettingTableName, "formKey", "varchar(200)")) + { + MessageUtil.Show(ResourceKeys.UpdateSuccess); + } + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + LogUtil.WriteError("保存表格属性出错", ex); + MessageUtil.Show(ex); + } + } + } + #endregion + + + + #region 加载自定义列 + /// + /// 说明:加载自定义列 + /// 创建人:王一帆 + /// 创建日期:2019-9-16 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + private void SetCustomColumns() + { + if (string.IsNullOrEmpty(this.CurrentOperColumnKey) || !BaseImpl.HasExistsTable(ResourceKeys.SettingTableName)) return; + + DataTable customTable = this.gcMain.GridView.GetCustomColumnByDatabase(this.CurrentOperColumnKey); + if (customTable != null && customTable.Rows.Count > 0) + { + foreach (DataRow rowItem in customTable.Rows) + { + string fieldName = rowItem["fieldName"] + ""; + int fieldWidth = Convert.ToInt32(rowItem["fieldWidth"]); + int index = Convert.ToInt32(rowItem["orderid"]); + bool visible = "1".Equals(rowItem["isVisible"] + "") && fieldWidth > 0; + bool isFix = "True".Equals(rowItem["IfFixColumn"] + "", StringComparison.OrdinalIgnoreCase); + + GridColumn gridColumn = this.gcMain.GridView.Columns.ColumnByName(fieldName); + if (gridColumn != null && gridColumn.Visible && gridColumn.Width > 0) + { + GridColumn colObj = this.gcMain.GridView.Columns[fieldName]; + colObj.VisibleIndex = index; + colObj.Width = fieldWidth; + colObj.Visible = visible; + colObj.Fixed = isFix ? FixedStyle.Left : FixedStyle.None; + } + } + } + } + #endregion + + #region 刷新左侧树数据 + /// + /// 说明:设置左侧树数据 + /// 创建人:王一帆 + /// 创建日期:2021-07-21 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + protected void SetLeftTreeView() + { + this.LeftRowObj = BaseModuleImpl.GetBaseLeftTreeField(this.UnionModuleCodel);//获取表格左侧树字段 + if (this.LeftRowObj != null) + { + //this.ModuleGridObj.ParentUnionField = this.LeftRowObj["fieldname"] + ""; + this.ParentUnionField = this.LeftRowObj["fieldname"] + ""; + this.ParentKeyField = this.LeftRowObj["fieldsqlid"] + ""; + this.treeLeft.TreeNodeKeyField = this.LeftRowObj["fieldsqlid"] + ""; + this.treeLeft.TreeNodeTextField = this.LeftRowObj["fieldsqlname"] + ""; + this.treeLeft.TreeNodeSelectAfter += new TreeViewEventHandler(OnTreeLeftTreeNodeSelected); + this.treeLeft.BindTreeView(BaseImpl.GetDataTableResult(this.LeftRowObj["fieldsql"] + "")); + } + else + { + // 根据模块上配置的sql加载树 + if (this.SysModel != null && !string.IsNullOrEmpty(this.SysModel.TreeSQL)) + { + this.ParentUnionField = "SpeciesNo"; + this.ParentKeyField = "SpeciesNo"; + this.treeLeft.TreeNodeKeyField = "SpeciesNo"; + this.treeLeft.TreeNodeTextField = "SpeciesName"; + this.treeLeft.TreeNodeSelectAfter += new TreeViewEventHandler(OnTreeLeftTreeNodeSelected); + this.treeLeft.BindTreeView(BaseImpl.GetDataTableResult(this.SysModel.TreeSQL)); + } + } + } + /// + /// 说明:树节点点击后刷新数据 + /// 创建人:龚宇超 + /// 创建日期:2017-10-26 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnTreeLeftTreeNodeSelected(object sender, TreeViewEventArgs e) + { + string where = string.Format(" and {0} like '{1}%' ", this.treeLeft.TreeNodeKeyField, e.Node.Name); + + string sqlValue = ReplaceHelper.IsProcedure(this.SysModel.MenuSql) ? + ReplaceHelper.ReplaceTreeViewParentKeyCond(this.SysModel.MenuSql, treeLeft.GetSelectNodeValue()) : + ReplaceHelper.ReplaceWhereCond(this.SysModel.MenuSql) + where; + //this.gcMain.gridControl.DataSource = MainImpl.GetDataTableResult(sqlValue); + this.SearchObj.SearchGrid(sqlValue); + this.gcMain.GridView.ClearSelection(); + } + + + + #region 设置左侧表格数据 + /// + /// 说明:设置左侧表格数据 + /// 创建人:龚宇超 + /// 创建日期:2017-10-25 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + protected void SetLeftGridView() + { + this.LeftRowObj = BaseModuleImpl.GetBaseLeftTreeField(UnionModuleCodel);//获取表格左侧树字段 + if (this.LeftRowObj != null) + { + DataTable dtTable = BaseModuleImpl.GetBaseLeftGridField(UnionModuleCodel); + DataTable dtColorTable = BaseModuleImpl.GetBaseGridRowColors(this.LeftRowObj["fieldKey"] + ""); + this.gridLeft.GridView.RowClick += new DevExpress.XtraGrid.Views.Grid.RowClickEventHandler(OnGridViewRowClick); + this.gridLeft.SetGridRowColors(dtColorTable); + this.gridLeft.SetReadOnlyColumns(dtTable, GridCustomColumnStruct.BaseLeftGridView + UnionModuleCodel); + this.ParentUnionField = this.LeftRowObj["fieldname"] + ""; + this.ParentKeyField = this.LeftRowObj["fieldsqlid"] + ""; + + //this.ModuleGridObj.ParentKeyField = this.LeftRowObj["fieldsqlid"] + ""; + //this.ModuleGridObj.ParentUnionField = this.LeftRowObj["fieldname"] + ""; + + DataTable table = BaseModuleImpl.GetCustomQueryFields(this.LeftRowObj["fieldKey"] + ""); + string searchSql = this.LeftRowObj["fieldsql"] + ""; + if (table != null && table.Rows.Count > 0) + { + // 自定义查询条件 + + this._leftGridSearchObj = new MyControl(searchSql, this.gridLeft); + this.pl_left_top.Height = this._leftGridSearchObj.InitSearchControl(table, this.pl_left_top); + this._leftGridSearchObj.OnDataSourceBindCallBack += new EventHandler(OnLeftControlObjDataSourceBindCallBack); + } + else + { + DataTable leftGridCondtionTable = BaseImpl.GetDataTableResult(searchSql); + this.pl_left_top.Visible = false; + this.gridLeft.GridControl.DataSource = leftGridCondtionTable; + } + + } + } + #endregion + + + #region 刷新右侧表格数据 + /// + /// 说明:刷新右侧表格数据 + /// 创建人:龚宇超 + /// 创建日期:2018-03-19 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnGridViewRowClick(object sender, DevExpress.XtraGrid.Views.Grid.RowClickEventArgs e) + { + try + { + string sqlValue = ReplaceHelper.ReplaceWhereCond(this.SysModel.MenuSql); + if (this.gridLeft.Visible) + { + DataRow rowitem = this.gridLeft.GridView.GetFocusedDataRow(); + sqlValue = this._leftGridSearchObj != null ? this._leftGridSearchObj.ReplaceParentControlValue(sqlValue) : sqlValue; + sqlValue = ReplaceHelper.ReplaceRowParam(rowitem, sqlValue); + } + + this.SearchObj.SearchGrid(sqlValue); + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + } + } + #endregion + #endregion + #region 事件 + + /// + /// 说明:数据绑定完成后加载数据 + /// 创建人:龚宇超 + /// 创建日期: + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + protected void OnLeftControlObjDataSourceBindCallBack(object sender, EventArgs e) + { + try + { + this._leftGridSearchObj.SearchGrid(); + + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + } + } + + #region 确定 + /// + /// 说明:确定 + /// 创建人:龚宇超 + /// 创建日期:2018-03-20 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void btnOk_Click(object sender, EventArgs e) + { + + this.DataRows = gcMain.GetViewFocusedDataRows(); + if (DataRows.Length > 0) + { + this.DialogResult = System.Windows.Forms.DialogResult.OK; + } + this.Close(); + } + #endregion + + #region 取消 + /// + /// 说明:取消 + /// 创建人:龚宇超 + /// 创建日期:2018-03-20 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The source of the event. + /// The instance containing the event data. + private void btnCancel_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + } + #endregion + + #region 释放时清理数据源 + /// + /// 说明:释放时清理数据源 + /// 创建人:龚宇超 + /// 创建日期:2018-03-16 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + private void OnFrmModelLookUp_Disposed(object sender, EventArgs e) + { + GC.Collect(); + } + #endregion + #endregion + + /// + /// 说明:右键菜单执行后刷新数据,刷新规则按照上一次查询条件刷新 + /// 创建人:龚宇超 + /// 创建日期:2017-11-02 + /// 修改人: + /// 修改日期: + /// 修改备注: + /// 版本:1.0 + /// + /// The sender. + /// The instance containing the event data. + protected void OnGridViewRightCallBack(object sender, EventArgs e) + { + try + { + this.SearchObj.SearchLastGrid(); + + } + catch (Exception ex) + { + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + } + + } + + + } +} diff --git a/插件库/Lskj.PubBillManagement/FrmDocumentSource.resx b/插件库/Lskj.PubBillManagement/FrmDocumentSource.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmDocumentSource.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmMain.Designer.cs b/插件库/Lskj.PubBillManagement/FrmMain.Designer.cs new file mode 100644 index 0000000..fcea0c3 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmMain.Designer.cs @@ -0,0 +1,64 @@ +namespace Lskj.PubBillManagement +{ + partial class FrmMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.billModule1 = new Lskj.PubBillManagement.BillModule(); + this.SuspendLayout(); + // + // billModule1 + // + this.billModule1.Dock = System.Windows.Forms.DockStyle.Fill; + this.billModule1.Location = new System.Drawing.Point(0, 0); + this.billModule1.Margin = new System.Windows.Forms.Padding(4); + this.billModule1.Name = "billModule1"; + this.billModule1.Size = new System.Drawing.Size(1579, 912); + this.billModule1.TabIndex = 0; + // + // FrmMain + // + this.Appearance.BackColor = System.Drawing.SystemColors.Control; + this.Appearance.Options.UseBackColor = true; + this.Appearance.Options.UseFont = true; + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.ClientSize = new System.Drawing.Size(1579, 912); + this.Controls.Add(this.billModule1); + this.Margin = new System.Windows.Forms.Padding(5); + this.Name = "FrmMain"; + this.Text = "单据模版"; + this.ResumeLayout(false); + + } + + #endregion + + private BillModule billModule1; + + + } +} \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmMain.cs b/插件库/Lskj.PubBillManagement/FrmMain.cs new file mode 100644 index 0000000..f5bcc76 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmMain.cs @@ -0,0 +1,186 @@ +/****************************** +* 说明:单据模版 +* 创建人:龚宇超 +* 创建日期:2017-11-23 +* 修改人: +* 修改日期: +* 修改备注: +* 版本:1.0.0.0 +******************************/ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using Lskj.Control; +using Lskj.Model; +using Lskj.Control.Model; +using Lskj.Util; +using Lskj.Business.Impl; +using DevExpress.XtraGrid.Views.Grid; +using Lskj.Data; +using DevExpress.XtraBars; +using DevExpress.XtraTab; +using DevExpress.XtraEditors; +using System.Collections; +using Lskj.PubBillManagement.Model; +using DevExpress.Data; +using DevExpress.XtraGrid.Columns; +using System.IO; +using Lskj.Business; +using Lskj.Main.Model; +using System.Threading.Tasks; +using Lskj.Core; + +namespace Lskj.PubBillManagement +{ + /// + /// 单据模版 + /// + public partial class FrmMain : BaseForm + { + /// + /// 入口参数 + /// + public DynamicBillModel SysModel; + /// + /// 第一次进入页面 + /// + public bool isInitialization = true; + + + public FrmMain() + { + InitializeComponent(); + } + + protected override void OnLoad(EventArgs e) + { + try + { + WaitForm.ShowForm(); + Dictionary dataCaches = SysModel != null ? SysModel.DataCaches : null; + if (!dataCaches.GetValue(this, "Privilege", out string privilege)) + { + privilege = SysModel.ModuleId > 0 ? BaseImpl.GetUserPurviewsByMenuId(SysModel.ModuleId + "") + "" : BaseImpl.GetUserPurviewsByMenuCode(SysModel.ModuleCode) + ""; + } + this.SysModel.Privilege = privilege; + + if (!this.SysModel.HasPrivilege()) + { + MessageUtil.Show(ResourceKeys.UnPurview); + this.Close(); + } + else + { + billModule1.OnLoad(SysModel); + // 右键菜单调用方式,则模块名称按照系统设置设定 + if (!string.IsNullOrEmpty(this.SysModel.BillMasterSql) || + !string.IsNullOrEmpty(this.SysModel.BillDetailSql) || + !string.IsNullOrEmpty(this.SysModel.BillOrderNo)) + { + + this.Text = this.billModule1.BillModel.TypeName; + if (this.SysModel.BillDetailSql.StartsWith("*")) + { + string rightid = this.SysModel.BillDetailSql.TrimStart('*'); + string sqlValue = "select AllowNullExec,* from p_systempopupmenu "; + sqlValue = $"{sqlValue} where id = '{rightid}'"; + DataRow rowItem = BaseImpl.GetDataRowResult(sqlValue); + //if (rowItem != null) + //{ + // CommonMenu menu = new CommonMenu(this.SysModel, this.billModule1.ControlObj, this.billModule1.gcMainDetilObj); + // menu.DynamicLinkAfter += new CommonToolAfterDynamicLinkEventHandler(OnDynamicLinkAfter); + // menu.Apply(rowItem); + //} + } + } + this.FormClosing += new FormClosingEventHandler(OnClose); + } + + + } + catch (Exception ex) + { + LogHelper.Instance.WriteError(ex); + //MessageUtil.Show(ex); + string Message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(Message, ex.Message); + } + finally + { + + Lskj.Control.Model.AutoSizeChange.ControllInitializeSize(this); + WaitForm.HideForm(); + } + } + /// + /// 执行完成后若是取消状态则关闭当前界面 + /// + /// + private void OnDynamicLinkAfter(object sender, ApplyArgs e) + { + if (e.DialogModel != null && e.DialogModel.PubDialogType == DialogType.Pubcolsed) + { + this.Close(); + } + } + + + /// + /// 获取数据源缓存 + /// + /// + public void GetDataCaches(Dictionary cachesDic) + { + //全局数据 + Task dynamicModelTask = cachesDic.AddTask(this, "DynamicModel", new Task(() => + { + return SysModel;//动态链接库对象 + })); + Task systemDllRowTask = cachesDic.AddTask(this, "SystemDllRow", new Task(() => + { + return MainImpl.GetSystemdllTab(SysModel.ModuleCode);//获取单个模块信息 + })); + Task sysModelTask = cachesDic.AddTask(this, "SysModel", new Task(() => + { + ModuleModel sysModel = new ModuleModel(systemDllRowTask.Result); + return sysModel;//系统模块实体对象 + })); + Task formTypeTask = cachesDic.AddTask(this, "FormType", new Task(() => + { + return BaseImpl.GetBillDetailType(SysModel.ModuleCode); + })); + Task privilegeTask = cachesDic.AddTask(this, "Privilege", new Task(() => + { + return SysModel.ModuleId > 0 ? BaseImpl.GetUserPurviewsByMenuId(SysModel.ModuleId + "") + "" : BaseImpl.GetUserPurviewsByMenuCode(SysModel.ModuleCode) + ""; + })); + //获取billModule1控件的数据 + if (dynamicModelTask.Result.HasPrivilege()) + { + //添加数据到billModule1 + cachesDic.AddTask(billModule1, "DynamicModel", dynamicModelTask); + cachesDic.AddTask(billModule1, "SystemDllRow", systemDllRowTask); + cachesDic.AddTask(billModule1, "SysModel", sysModelTask); + billModule1.GetDataCaches(cachesDic); + } + } + + + + + + private void OnClose(object sender, FormClosingEventArgs e) + { + string guid = this.Tag + ""; + if (string.IsNullOrWhiteSpace(guid)) return; + DllModule m = Manager.ModuleForms[guid]; + m.IsClose = true; + + + } + } +} \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmMain.resx b/插件库/Lskj.PubBillManagement/FrmMain.resx new file mode 100644 index 0000000..c8a3129 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmMain.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 44 + + \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.Designer.cs b/插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.Designer.cs new file mode 100644 index 0000000..62c2576 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.Designer.cs @@ -0,0 +1,98 @@ + +namespace Lskj.PubBillManagement +{ + partial class FrmScanCodeAssociation + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.plm_bottom = new DevExpress.XtraEditors.PanelControl(); + this.simpleButton1 = new DevExpress.XtraEditors.SimpleButton(); + this.gcMain = new Lskj.Control.GridControlEx(); + ((System.ComponentModel.ISupportInitialize)(this.plm_bottom)).BeginInit(); + this.plm_bottom.SuspendLayout(); + this.SuspendLayout(); + // + // plm_bottom + // + this.plm_bottom.Controls.Add(this.simpleButton1); + this.plm_bottom.Dock = System.Windows.Forms.DockStyle.Bottom; + this.plm_bottom.Location = new System.Drawing.Point(0, 410); + this.plm_bottom.Margin = new System.Windows.Forms.Padding(4); + this.plm_bottom.Name = "plm_bottom"; + this.plm_bottom.Size = new System.Drawing.Size(800, 40); + this.plm_bottom.TabIndex = 18; + // + // simpleButton1 + // + this.simpleButton1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.simpleButton1.Appearance.Font = new System.Drawing.Font("宋体", 9F); + this.simpleButton1.Appearance.Options.UseFont = true; + this.simpleButton1.Location = new System.Drawing.Point(696, 6); + this.simpleButton1.Margin = new System.Windows.Forms.Padding(4); + this.simpleButton1.Name = "simpleButton1"; + this.simpleButton1.Size = new System.Drawing.Size(90, 30); + this.simpleButton1.TabIndex = 41; + this.simpleButton1.Text = "确定"; + this.simpleButton1.Click += new System.EventHandler(this.simpleButton1_Click); + // + // gcMain + // + this.gcMain.AdapterObj = null; + this.gcMain.BackColor = System.Drawing.Color.Transparent; + this.gcMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.gcMain.Location = new System.Drawing.Point(0, 0); + this.gcMain.Margin = new System.Windows.Forms.Padding(5); + this.gcMain.Name = "gcMain"; + this.gcMain.SiftEnumObj = Lskj.Control.GridControlEx.HeaderSiftEnum.Sum; + this.gcMain.Size = new System.Drawing.Size(800, 410); + this.gcMain.TabIndex = 21; + // + // FrmScanCodeAssociation + // + this.Appearance.BackColor = System.Drawing.SystemColors.Control; + this.Appearance.Options.UseBackColor = true; + this.Appearance.Options.UseFont = true; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(800, 450); + this.Controls.Add(this.gcMain); + this.Controls.Add(this.plm_bottom); + this.Name = "FrmScanCodeAssociation"; + this.Text = "串码选择"; + ((System.ComponentModel.ISupportInitialize)(this.plm_bottom)).EndInit(); + this.plm_bottom.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private DevExpress.XtraEditors.PanelControl plm_bottom; + private DevExpress.XtraEditors.SimpleButton simpleButton1; + private Control.GridControlEx gcMain; + } +} \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.cs b/插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.cs new file mode 100644 index 0000000..d1c4ddf --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.cs @@ -0,0 +1,82 @@ +using Lskj.Business.Impl; +using Lskj.Control; +using Lskj.Control.Model; +using Lskj.Core; +using Lskj.Model; +using Lskj.Util; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace Lskj.PubBillManagement +{ + public partial class FrmScanCodeAssociation : BaseForm + { + + /// + /// 系统模块实体对象 + /// + /// The system model. + public ModuleModel SysModel { get; private set; } + /// + ///主表条件控件 + /// + public MyControl SearchMainObj; + /// + ///扫码内容 + /// + public string ScanCodeData; + /// + //选中的串码 + /// + public string StringCodes; + + public FrmScanCodeAssociation() + { + InitializeComponent(); + } + + public FrmScanCodeAssociation(DataRow modelRow, string scanCodeData) + { + InitializeComponent(); + this.ScanCodeData = scanCodeData; + //根据传入的模块号获取模块信息 + this.SysModel = new ModuleModel(modelRow); + DataTable mainGridColumns = BaseModuleImpl.GetBaseGridColumns(this.SysModel.ModeCode); + this.gcMain.SetReadOnlyColumns(mainGridColumns, GridCustomColumnStruct.BaseMainGridView + this.SysModel.FormKey);//创建列 + string sql = ReplaceHelper.ReplaceParamToValue(SysModel.MenuSql, "{value}", this.ScanCodeData); + DataTable dt = BillImpl.GetDataTableResult(sql); + this.gcMain.GridControl.DataSource = dt; + //加载复选框 + GridDragGrid.GridAddCheckBox(this.gcMain.GridView); + + } + + + + private void simpleButton1_Click(object sender, EventArgs e) + { + DataRow[] dataRows = this.gcMain.GetViewFocusedDataRows(); + if (dataRows.Length > 0) + { + string name=this.gcMain.GridView.Columns[0].FieldName; + string text = string.Empty; + for (int i = 0; i < dataRows.Length; i++) + { + text += dataRows[i][name] + ";"; + } + + StringCodes = text.Trim(';'); + this.Close(); + this.DialogResult = System.Windows.Forms.DialogResult.OK; + } + + } + + } +} diff --git a/插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.resx b/插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/FrmScanCodeAssociation.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/Lskj.PubBillManagement.csproj b/插件库/Lskj.PubBillManagement/Lskj.PubBillManagement.csproj new file mode 100644 index 0000000..92aa296 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/Lskj.PubBillManagement.csproj @@ -0,0 +1,209 @@ + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {6CE319BA-1253-41F2-8B59-8173FD7BE3F3} + Library + Properties + Lskj.PubBillManagement + Lskj.PubBillManagement + v4.0 + 512 + + + + + true + full + false + ..\..\Debug\Lib\ + DEBUG;TRACE + prompt + 4 + ..\..\Debug\AllMethodXml\Lskj.PubBill.XML + + + none + true + ..\..\Release\Lib\ + TRACE + prompt + 4 + + + + + + + + False + + + + + + + False + C:\Program Files\DevExpress 15.2\Components\Bin\Framework\DevExpress.XtraTreeList.v15.2.dll + + + False + ..\..\引用DLL\Lskj.Data.ADO.dll + + + False + ..\..\引用DLL\Lskj.Data.Api.dll + + + False + ..\..\引用DLL\Lskj.Web.Core.dll + + + False + ..\..\引用DLL\Lskj.WebErp.Core.dll + + + False + ..\..\引用DLL\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + UserControl + + + BillModule.cs + + + Form + + + FrmAdd.cs + + + Form + + + FrmBill.cs + + + Form + + + FrmBomSelect.cs + + + Form + + + FrmDocumentSource.cs + + + Form + + + FrmScanCodeAssociation.cs + + + + + + Form + + + FrmMain.cs + + + + + + + + BillModule.cs + Designer + + + FrmAdd.cs + + + FrmBill.cs + + + FrmBomSelect.cs + + + FrmDocumentSource.cs + + + FrmMain.cs + + + FrmScanCodeAssociation.cs + + + + + + {7EAFCCC2-A18F-49E9-85C6-A984966CFD01} + Lskj.Business + + + {447cdc40-659f-4cca-9ed6-8e818b4cf8bf} + Lskj.Control + + + {2a1be6ac-1077-491b-a754-c5822fe8121e} + Lskj.Core + + + {308B9B18-9BE2-495C-9C64-EED81D567813} + Lskj.Data + + + {24e9a18a-baf8-4052-809e-582b4fc6a8c4} + Lskj.Interface.Api + + + {bca1e2b3-c4ab-4d2c-b519-3dcfdb5b83d6} + Lskj.Main + + + {52BC40E0-C0C6-4F78-996B-CAE028D209CA} + Lskj.Model + + + {A51BF642-6543-4DE3-8948-83F558B72BD4} + Lskj.Util + + + + + + + + + + + + \ No newline at end of file diff --git a/插件库/Lskj.PubBillManagement/Model/BillModuleModel.cs b/插件库/Lskj.PubBillManagement/Model/BillModuleModel.cs new file mode 100644 index 0000000..3e1e16b --- /dev/null +++ b/插件库/Lskj.PubBillManagement/Model/BillModuleModel.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Lskj.PubBillManagement.Model +{ + public class BillModuleModel + { + public BillSourceModel SourceModel { get; set; } + public object SourceControl { get;set; } + public object SourceDetailControl { get; set; } + public object SourceDetailDetailControl { get; set; } + } +} diff --git a/插件库/Lskj.PubBillManagement/Model/BillSourceModel.cs b/插件库/Lskj.PubBillManagement/Model/BillSourceModel.cs new file mode 100644 index 0000000..c3eee2f --- /dev/null +++ b/插件库/Lskj.PubBillManagement/Model/BillSourceModel.cs @@ -0,0 +1,133 @@ +/****************************** +* 说明:单据来源对象 +* 创建人:龚宇超 +* 创建日期:2017-11-28 +* 修改人: +* 修改日期: +* 修改备注: +* 版本:1.0.0.0 +******************************/ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data; + +namespace Lskj.PubBillManagement.Model +{ + /// + /// 单据来源对象 + /// + public class BillSourceModel + { + public int Id { get; private set; } + public int SourceType { get; private set; } + public int LoadBom { get; private set; } + public bool CadDragDetail { get; private set; } + public string UserName { get; private set; } + public string FormKey { get; private set; } + public string SourceKeyField { get; private set; } + public string SourceResult { get; private set; } + public string SourceSql { get; private set; } + public string DetailSql { get; private set; } + public string BomSql { get; private set; } + public string BomCaption { get; private set; } + public string DetailEnableCond { get; private set; } + public string CodeInputSql { get; private set; } + public string CodeInputCaption { get; private set; } + public string CodeInputHint { get; private set; } + public string SearchDefaultField { get; private set; } + public string DetailEnableMsg { get; private set; } + public bool SaveRefreshFlag { get; private set; } + public string SourceDetailsDetailsSql { get; private set; }//来源明细的明细 + public string sourceDetailType { get; private set; }//来源明细的类型 + public bool DisableShowSourceCount { get; private set; }//是否显示来源数量 + public string AddDataSql { get; private set; }// 添加数据sql(来源明细添加到主表明细时,执行sql把查询数据源一并添加到来源明细中) + public string AddDataCondition { get; private set; }// 添加数据条件 + public bool LoadFilter { get; private set; }//来源筛选行是否显示 + public bool DetailedLoadFilter { get; private set; }//来源明细筛选行是否显示 + + public bool DetailsDoubleClick;// 单据来源刷新来源明细模式,默认单击,1为双击 + + public string MainDetailsAddType;// 主表明细新增模式 (默认来源明细和来源明细的明细都可以添加到主表, 1为来源明细添加 2为来源明细的明细添加) + + public string SourceKeyFieldName;// 节点id(来源主表为树表格时) + + public string SourceParentFieldName;// 父节点id(来源主表为树表格时 ) + + public bool DragAndSave;// 拖拽后保存 + + public bool TreeInhibitSort;// 树节点 禁用默认排序 + + public string Orderid;// 来源页签序号 + + public string DetailMenuCode;// 来源模块号 + + + + public BillSourceModel(DataRow item) + { + if (item == null) return; + + this.Id = Convert.ToInt32(item["Id"] + ""); + this.SourceType = string.IsNullOrEmpty(item["sourceType"] + "") ? 0 : Convert.ToInt32(item["sourceType"] + ""); + this.LoadBom = string.IsNullOrEmpty(item["loadbom"] + "") ? 0 : Convert.ToInt32(item["loadbom"] + ""); + this.CadDragDetail = item.Table.Columns.Contains("dragDetailEnable") ? "1" != item["dragDetailEnable"] + "" : true; + this.UserName = item["userName"] + ""; + if (Business.Impl.LanguageTranslation.Translatable) + { + this.UserName = Business.Impl.LanguageTranslation.GetTranslatedText(this.UserName); + } + + this.FormKey = item["FormKey"] + ""; + this.SourceKeyField = item["sourceKeyField"] + ""; + this.SourceResult = item["sourceResult"] + ""; + this.SourceSql = item["SourceSql"] + ""; + this.DetailSql = item["DetailSql"] + ""; + this.BomSql = item["BomSql"] + ""; + this.BomCaption = item["BomCaption"] + ""; + this.DetailEnableCond = item["DetailEnableCond"] + ""; + this.CodeInputSql = item["CodeInputSql"] + ""; + this.CodeInputCaption = item["CodeInputCaption"] + ""; + this.CodeInputHint = item["CodeInputHint"] + ""; + this.SearchDefaultField = item["SearchDefault"] + ""; + this.DetailEnableMsg = item["DetailEnableMsg"] + ""; + this.SaveRefreshFlag = item.Table.Columns.Contains("SaveRefreshFlag") && "1".Equals(item["SaveRefreshFlag"] + "") ? true : false; + this.SourceDetailsDetailsSql = item.Table.Columns.Contains("detailSQL1") ? item["detailSQL1"] + "" : ""; + this.sourceDetailType = item.Table.Columns.Contains("sourceDetailType") ? item["sourceDetailType"] + "" : ""; + this.DisableShowSourceCount = item.Table.Columns.Contains("DisableShowSourceCount") && "1".Equals(item["DisableShowSourceCount"] + "") ? true : false; + + this.AddDataSql = item.Table.Columns.Contains("AddDataSql") ? item["AddDataSql"] + "" : ""; + this.AddDataCondition = item.Table.Columns.Contains("AddDataCondition") ? item["AddDataCondition"] + "" : ""; + + this.LoadFilter = item.Table.Columns.Contains("LoadFilter") && "1".Equals(item["LoadFilter"] + "") ? true : false; + this.DetailedLoadFilter = item.Table.Columns.Contains("DetailedLoadFilter") && "1".Equals(item["DetailedLoadFilter"] + "") ? true : false; + this.DetailsDoubleClick = item.Table.Columns.Contains("DetailsDoubleClick") && "1".Equals(item["DetailsDoubleClick"] + "") ? true : false; + this.MainDetailsAddType = item.Table.Columns.Contains("MainDetailsAddType") ? item["MainDetailsAddType"] + "" : ""; + + this.SourceKeyFieldName = item.Table.Columns.Contains("SourceKeyFieldName") ? item["SourceKeyFieldName"] + "" : ""; + this.SourceParentFieldName = item.Table.Columns.Contains("SourceParentFieldName") ? item["SourceParentFieldName"] + "" : ""; + this.DragAndSave = item.Table.Columns.Contains("DragAndSave") && "1".Equals(item["DragAndSave"] + "") ? true : false; + this.TreeInhibitSort = item.Table.Columns.Contains("TreeInhibitSort") && "1".Equals(item["TreeInhibitSort"] + "") ? true : false; + this.Orderid = item.Table.Columns.Contains("Orderid") ? item["Orderid"] + "" : ""; + this.DetailMenuCode = item.Table.Columns.Contains("DetailMenuCode") ? item["DetailMenuCode"] + "" : ""; + } + /// + /// 改变来源类型 + /// + /// + public void ChangeSourceType(int sourceType) + { + this.SourceType = sourceType; + } + + /// + /// 改变来源明细类型 + /// + /// + public void ChangeSourceDetailType(string sourceDetailType) + { + this.sourceDetailType = sourceDetailType; + } + } +} diff --git a/插件库/Lskj.PubBillManagement/Model/BillSourceUnionModel.cs b/插件库/Lskj.PubBillManagement/Model/BillSourceUnionModel.cs new file mode 100644 index 0000000..78abfca --- /dev/null +++ b/插件库/Lskj.PubBillManagement/Model/BillSourceUnionModel.cs @@ -0,0 +1,76 @@ +/****************************** +* 说明:单据来源关联类 +* 创建人:龚宇超 +* 创建日期:2017-11-28 +* 修改人: +* 修改日期: +* 修改备注: +* 版本:1.0.0.0 +******************************/ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Lskj.Control; +using Lskj.Control.Model; + +namespace Lskj.PubBillManagement.Model +{ + /// + /// 单据来源关联类 + /// + public class BillSourceUnionModel + { + /// + /// 单据来源对象 + /// + public BillSourceModel ModelObj; + /// + /// 单据来源树 + /// + public TreeViewEx TreeViewObj; + /// + /// 单据来源表格 + /// + public GridControlEx GridControlObj; + /// + /// 单据来源表格树 + /// + public TreeGridControlEx TreeGridControlObj; + /// + /// 单据来源明细表格 + /// + public GridControlEx GridDetailControlObj; + /// + /// 单据来源明细表格树 + /// + public TreeGridControlEx TreeGridDetailControlObj; + /// + /// 单据来源查询条件 + /// + public MyControl SearchObj; + + /// + /// 单据来源明细表格的明细 + /// + public GridControlEx GridDetailDetailControlObj; + /// + /// 单据来源明细模块 + /// + public ModuleGridEx GridDetailModuleGridEx; + + + public bool IsChange = false; + + /// + /// 添加数据sql(来源明细添加到主表明细时,执行sql把查询数据源一并添加到来源明细中) + /// + public string AddDataSql; + /// + /// 添加数据条件 + /// + public string AddDataCondition; + + + } +} diff --git a/插件库/Lskj.PubBillManagement/Model/ComboxEditModel.cs b/插件库/Lskj.PubBillManagement/Model/ComboxEditModel.cs new file mode 100644 index 0000000..50ca53d --- /dev/null +++ b/插件库/Lskj.PubBillManagement/Model/ComboxEditModel.cs @@ -0,0 +1,41 @@ +/****************************** +* 说明:ComboxEdit数据源对象 +* 创建人:龚宇超 +* 创建日期:2018-04-19 +* 修改人: +* 修改日期: +* 修改备注: +* 版本:1.0.0.0 +******************************/ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data; + +namespace Lskj.PubBillManagement.Model +{ + /// + /// ComboxEdit数据源对象 + /// + public class ComboBoxEditModel + { + public string ValuemMeber; + public string TextMember; + + public DataRow RowItem; + /// + /// 单据来源对象 + /// + public BillSourceModel SourceModel; + /// + /// 单据来源关联明细对象 + /// + public BillSourceUnionModel UnionModel; + + public override string ToString() + { + return RowItem[TextMember] + ""; + } + } +} diff --git a/插件库/Lskj.PubBillManagement/Properties/AssemblyInfo.cs b/插件库/Lskj.PubBillManagement/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..dd29c1a --- /dev/null +++ b/插件库/Lskj.PubBillManagement/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的常规信息通过以下 +// 特性集控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Lskj.PubBillManagement")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Microsoft")] +[assembly: AssemblyProduct("Lskj.PubBillManagement")] +[assembly: AssemblyCopyright("Copyright © Microsoft 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 使此程序集中的类型 +// 对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型, +// 则将该类型上的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("53e8153b-112d-4428-b9b2-a3b62ccbaf46")] + +// 程序集的版本信息由下面四个值组成: +// +// 主版本 +// 次版本 +// 内部版本号 +// 修订号 +// +// 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值, +// 方法是按如下所示使用“*”: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/插件库/Lskj.PubBillManagement/Properties/licenses.licx b/插件库/Lskj.PubBillManagement/Properties/licenses.licx new file mode 100644 index 0000000..0861976 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/Properties/licenses.licx @@ -0,0 +1,3 @@ +DevExpress.XtraEditors.TextEdit, DevExpress.XtraEditors.v15.2, Version=15.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v15.2, Version=15.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraBars.BarManager, DevExpress.XtraBars.v15.2, Version=15.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/插件库/Lskj.PubBillManagement/app.config b/插件库/Lskj.PubBillManagement/app.config new file mode 100644 index 0000000..7943c70 --- /dev/null +++ b/插件库/Lskj.PubBillManagement/app.config @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/插件库/Lskj.PubPower/FrmMain.cs b/插件库/Lskj.PubPower/FrmMain.cs index 2373d41..47361de 100644 --- a/插件库/Lskj.PubPower/FrmMain.cs +++ b/插件库/Lskj.PubPower/FrmMain.cs @@ -879,7 +879,7 @@ namespace Lskj.PubPower } } } - catch (Exception) + catch (Exception ex) { } diff --git a/插件库/Lskj.PubUpdatePwd/DllBaseClass.cs b/插件库/Lskj.PubUpdatePwd/DllBaseClass.cs new file mode 100644 index 0000000..447f246 --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/DllBaseClass.cs @@ -0,0 +1,57 @@ +using Lskj.Business; +using Lskj.Model; +using Lskj.Util; +using System; +using System.Windows.Forms; + +namespace Lskj.PubUpdatePwd +{ + /// + /// 动态链接库统一入口。 + /// + public sealed class DllBaseClass : IForm + { + public DllBaseClass() + { + } + + public DllBaseClass(string[] obj) + { + try + { + DynamicUpdatePwd moduleModel = new DynamicUpdatePwd(obj); + FrmMain main = new FrmMain(); + main.Model = moduleModel; + SubForm = main; + } + catch (Exception ex) + { + LogUtil.WriteError("Lskj.PubUpdatePwd.dll--参数错误-->", ex); + } + } + + public Form SubForm { get; set; } + } + + public class DynamicUpdatePwd : DynamicModel + { + //打开时默认选中人员id + public string PersonnelID { get; private set; } + //修改后关闭 + public string AfterClose = ""; + + + public DynamicUpdatePwd(string[] args) + : base(args) + { + if (args != null && args.Length > 5 && !string.IsNullOrWhiteSpace(args[5])) + { + PersonnelID = args[5].Trim(); + } + if (args != null && args.Length > 6 && !string.IsNullOrWhiteSpace(args[6])) + { + AfterClose = args[6].Trim(); + } + } + } +} diff --git a/插件库/Lskj.PubUpdatePwd/FrmMain.Designer.cs b/插件库/Lskj.PubUpdatePwd/FrmMain.Designer.cs new file mode 100644 index 0000000..eee0ab3 --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/FrmMain.Designer.cs @@ -0,0 +1,193 @@ +namespace Lskj.PubUpdatePwd +{ + partial class FrmMain + { + /// + /// + /// + private System.ComponentModel.IContainer components = null; + + /// + /// ʹõԴ + /// + /// ӦͷйԴΪ trueΪ false + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows ɵĴ + + /// + /// ֧ķ - Ҫ޸ + /// ʹô༭޸Ĵ˷ݡ + /// + private void InitializeComponent() + { + this.newPwd = new DevExpress.XtraEditors.LabelControl(); + this.txtNewPass = new DevExpress.XtraEditors.TextEdit(); + this.ConfirmPwd = new DevExpress.XtraEditors.LabelControl(); + this.txtPassConfirm = new DevExpress.XtraEditors.TextEdit(); + this.btnOK = new DevExpress.XtraEditors.SimpleButton(); + this.btnCancel = new DevExpress.XtraEditors.SimpleButton(); + this.lueUserName = new Lskj.Control.AutoGridLookUp(); + this.labelControl1 = new DevExpress.XtraEditors.LabelControl(); + this.label4 = new System.Windows.Forms.Label(); + this.label3 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.txtNewPass.Properties)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtPassConfirm.Properties)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.lueUserName.Properties)).BeginInit(); + this.SuspendLayout(); + // + // newPwd + // + this.newPwd.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far; + this.newPwd.Location = new System.Drawing.Point(32, 56); + this.newPwd.Name = "newPwd"; + this.newPwd.Size = new System.Drawing.Size(36, 14); + this.newPwd.TabIndex = 0; + this.newPwd.Text = ""; + // + // txtNewPass + // + this.txtNewPass.Location = new System.Drawing.Point(98, 53); + this.txtNewPass.Name = "txtNewPass"; + this.txtNewPass.Size = new System.Drawing.Size(153, 20); + this.txtNewPass.TabIndex = 1; + // + // ConfirmPwd + // + this.ConfirmPwd.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far; + this.ConfirmPwd.Location = new System.Drawing.Point(32, 93); + this.ConfirmPwd.Name = "ConfirmPwd"; + this.ConfirmPwd.Size = new System.Drawing.Size(48, 14); + this.ConfirmPwd.TabIndex = 3; + this.ConfirmPwd.Text = "ȷ"; + // + // txtPassConfirm + // + this.txtPassConfirm.Location = new System.Drawing.Point(98, 90); + this.txtPassConfirm.Name = "txtPassConfirm"; + this.txtPassConfirm.Size = new System.Drawing.Size(153, 20); + this.txtPassConfirm.TabIndex = 4; + // + // btnOK + // + this.btnOK.Location = new System.Drawing.Point(32, 187); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(80, 25); + this.btnOK.TabIndex = 8; + this.btnOK.Text = "ȷ"; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // btnCancel + // + this.btnCancel.Location = new System.Drawing.Point(171, 187); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(80, 25); + this.btnCancel.TabIndex = 9; + this.btnCancel.Text = "ȡ"; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // lueUserName + // + this.lueUserName.DataSource = null; + this.lueUserName.EditValue = ""; + this.lueUserName.Location = new System.Drawing.Point(98, 12); + this.lueUserName.Name = "lueUserName"; + this.lueUserName.Properties.Appearance.Font = new System.Drawing.Font("΢ź", 11F); + this.lueUserName.Properties.Appearance.Options.UseFont = true; + this.lueUserName.Properties.NullValuePrompt = "˺"; + this.lueUserName.Properties.NullValuePromptShowForEmptyValue = true; + this.lueUserName.Size = new System.Drawing.Size(153, 26); + this.lueUserName.TabIndex = 10; + // + // labelControl1 + // + this.labelControl1.Appearance.TextOptions.HAlignment = DevExpress.Utils.HorzAlignment.Far; + this.labelControl1.Location = new System.Drawing.Point(32, 18); + this.labelControl1.Name = "labelControl1"; + this.labelControl1.Size = new System.Drawing.Size(48, 14); + this.labelControl1.TabIndex = 11; + this.labelControl1.Text = "Ա"; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(96, 164); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(89, 12); + this.label4.TabIndex = 23; + this.label4.Text = "38ַ"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(96, 146); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(155, 12); + this.label3.TabIndex = 22; + this.label3.Text = "2Сддĸ"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(36, 126); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(155, 12); + this.label2.TabIndex = 21; + this.label2.Text = "Ҫ1"; + // + // FrmMain + // + this.Appearance.BackColor = System.Drawing.SystemColors.Control; + this.Appearance.Options.UseBackColor = true; + this.Appearance.Options.UseFont = true; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(290, 224); + this.Controls.Add(this.label4); + this.Controls.Add(this.label3); + this.Controls.Add(this.label2); + this.Controls.Add(this.labelControl1); + this.Controls.Add(this.lueUserName); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOK); + this.Controls.Add(this.txtPassConfirm); + this.Controls.Add(this.ConfirmPwd); + this.Controls.Add(this.txtNewPass); + this.Controls.Add(this.newPwd); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmMain"; + this.Text = "޸"; + this.Load += new System.EventHandler(this.FrmMain_Load); + ((System.ComponentModel.ISupportInitialize)(this.txtNewPass.Properties)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.txtPassConfirm.Properties)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.lueUserName.Properties)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private DevExpress.XtraEditors.LabelControl newPwd; + private DevExpress.XtraEditors.TextEdit txtNewPass; + private DevExpress.XtraEditors.LabelControl ConfirmPwd; + private DevExpress.XtraEditors.TextEdit txtPassConfirm; + private DevExpress.XtraEditors.SimpleButton btnOK; + private DevExpress.XtraEditors.SimpleButton btnCancel; + private Control.AutoGridLookUp lueUserName; + private DevExpress.XtraEditors.LabelControl labelControl1; + private System.Windows.Forms.Label label4; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.Label label2; + } +} diff --git a/插件库/Lskj.PubUpdatePwd/FrmMain.cs b/插件库/Lskj.PubUpdatePwd/FrmMain.cs new file mode 100644 index 0000000..bea3e19 --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/FrmMain.cs @@ -0,0 +1,277 @@ +using Lskj.Business; +using Lskj.Business.Impl; +using Lskj.Control; +using Lskj.Core; +using Lskj.Model; +using Lskj.Util; +using System; +using System.Data; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +namespace Lskj.PubUpdatePwd +{ + public partial class FrmMain : BaseForm + { + private static readonly Regex PasswordRegex = new Regex( + @"(?=.*[0-9]) + (?=.*[a-zA-Z]) + (?=.*[^a-zA-Z0-9]) + .{8,18}", + RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace); + + public DynamicUpdatePwd Model; + + public FrmMain() + { + InitializeComponent(); + } + + private void FrmMain_Load(object sender, EventArgs e) + { + try + { + txtNewPass.Text = string.Empty; + txtPassConfirm.Text = string.Empty; + txtNewPass.Properties.PasswordChar = '*'; + txtPassConfirm.Properties.PasswordChar = '*'; + + BindUserSelectionEvents(); + InitializeUsers(); + UpdateConfirmButtonState(); + } + catch (Exception ex) + { + string message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show(message, ex.Message); + } + } + + /// + /// 绑定人员选择事件,兼容鼠标选择和键盘回车选择。 + /// + private void BindUserSelectionEvents() + { + lueUserName.TextChanged -= OnUserSelectionChanged; + lueUserName.TextChanged += OnUserSelectionChanged; + lueUserName.Popup.OnGridViewMouseClick -= OnUserSelectionChanged; + lueUserName.Popup.OnGridViewMouseClick += OnUserSelectionChanged; + lueUserName.Popup.OnGridViewEnter -= OnUserSelectionEnter; + lueUserName.Popup.OnGridViewEnter += OnUserSelectionEnter; + } + + private void OnUserSelectionChanged(object sender, EventArgs e) + { + UpdateConfirmButtonState(); + } + + private void OnUserSelectionEnter(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + UpdateConfirmButtonState(); + } + } + + /// + /// 管理员不能在本模块中修改自己的密码。 + /// + private void UpdateConfirmButtonState() + { + bool isAdministrator = string.Equals( + ERPInfo.Instance.UserName, + "管理员", + StringComparison.OrdinalIgnoreCase); + string personnelId = lueUserName.EditValue == null + ? string.Empty + : lueUserName.EditValue.Trim(); + bool isCurrentUser = !string.IsNullOrWhiteSpace(personnelId) + && string.Equals(personnelId, ERPInfo.Instance.UserId, StringComparison.OrdinalIgnoreCase); + + btnOK.Enabled = isAdministrator && !isCurrentUser; + } + + /// + /// 初始化可修改密码的人员列表。 + /// + private void InitializeUsers() + { + string displayName = "UserName"; + string additionalFields = string.Empty; + + if (!string.IsNullOrWhiteSpace(SystemInfo.Instance.LoginUsername) + && BaseImpl.HasExistsColumn("P_EmployeeTab", SystemInfo.Instance.LoginUsername)) + { + displayName = SystemInfo.Instance.LoginUsername; + additionalFields = " ," + displayName; + } + + lueUserName.ValueField = lueUserName.ValueMember = "UserId"; + lueUserName.TextMember = displayName; + lueUserName.SourceSQL = string.Format( + "select EmployeeId UserId,LoginAccount UserCode,EmployeeName UserName {0} " + + "from P_EmployeeTab where sign=0 and UseFlag=1", + additionalFields); + + DataTable userTable; + //if (SystemInfo.Instance.DisplayUserCode) + //{ + // lueUserName.SourceSQL = string.Format( + // "select EmployeeId UserId,LoginAccount UserCode,EmployeeName UserName,LoginAccount 工号 {0} " + // + "from P_EmployeeTab where sign=0 and UseFlag=1", + // additionalFields); + // userTable = MainImpl.GetEmployeeListNew(); + //} + //else + //{ + // userTable = MainImpl.GetEmployeeList(); + //} + userTable = MainImpl.GetEmployeeList(); + lueUserName.DataSource = userTable; + lueUserName.Properties.NullValuePrompt = "请选择人员"; + + string personnelId = Model == null ? string.Empty : Model.PersonnelID; + if (string.IsNullOrWhiteSpace(personnelId)) + { + lueUserName.Focus(); + return; + } + + DataRow userRow = userTable.Rows.Cast().FirstOrDefault( + row => string.Equals(row["UserId"] + string.Empty, personnelId, StringComparison.OrdinalIgnoreCase)); + + if (userRow == null) + { + lueUserName.Properties.ReadOnly = true; + MessageUtil.Show("未找到指定人员,无法修改密码!", "提示"); + return; + } + + lueUserName.EditValue = userRow["UserId"] + string.Empty; + lueUserName.Properties.ReadOnly = true; + txtNewPass.Focus(); + } + + /// + /// 确定按钮点击事件。 + /// + private void btnOK_Click(object sender, EventArgs e) + { + string personnelId = lueUserName.EditValue == null + ? string.Empty + : lueUserName.EditValue.Trim(); + string newPassword = txtNewPass.Text.Trim(); + string confirmPassword = txtPassConfirm.Text.Trim(); + + if (string.IsNullOrWhiteSpace(personnelId)) + { + MessageUtil.Show("请选择需要修改密码的人员!", "提示"); + lueUserName.Focus(); + return; + } + if (string.Equals(personnelId, ERPInfo.Instance.UserId, StringComparison.OrdinalIgnoreCase)) + { + btnOK.Enabled = false; + MessageUtil.Show("管理员不能在此模块中修改自己的密码!", "提示"); + return; + } + if (string.IsNullOrWhiteSpace(newPassword)) + { + MessageUtil.Show("新密码不能为空!"); + txtNewPass.Focus(); + return; + } + if (string.IsNullOrWhiteSpace(confirmPassword)) + { + MessageUtil.Show("确认密码不能为空!"); + txtPassConfirm.Focus(); + return; + } + if (!newPassword.Equals(confirmPassword)) + { + MessageUtil.Show("两次输入的密码不一致!"); + txtPassConfirm.Focus(); + return; + } + if (SystemInfo.Instance.VerfyPasswordStrength && !PasswordRegex.IsMatch(confirmPassword)) + { + MessageUtil.Show("密码不符合要求!"); + txtNewPass.Focus(); + return; + } + + try + { + btnOK.Enabled = false; + + string tipMessage; + int result; + bool useChangePasswordProcedure = BaseImpl.HasExistsStoredProcedure("pr_sytemchangepsw"); + + if (useChangePasswordProcedure) + { + result = MainImpl.ChangePassword(personnelId, newPassword, out tipMessage); + } + else + { + result = MainImpl.ForceUpdatePassword(personnelId, newPassword); + tipMessage = result == 0 ? "用户不存在" : string.Empty; + } + + if (result != 1) + { + MessageUtil.Show("修改失败:" + tipMessage); + return; + } + + if (!useChangePasswordProcedure && SystemInfo.Instance.UpdPwdAllSystem) + { + if (MainImpl.UpdatePasswordAllSubsystem(personnelId, newPassword)) + { + MessageUtil.Show("用户对应账套密码修改成功"); + } + else + { + MessageUtil.Show("当前账套密码修改成功,但用户对应账套密码修改失败"); + } + } + + MainImpl.RecordPassword(newPassword,"修改密码,"+ ERPInfo.Instance.UserName + "修改"+ lueUserName.Text); + MessageUtil.Show("密码修改成功!"); + if (Model.AfterClose.Equals("1")) + { + DialogResult = DialogResult.OK; + Close(); + } + else + { + txtNewPass.Text = string.Empty; + txtPassConfirm.Text = string.Empty; + } + + } + catch (Exception ex) + { + string message = ErrorMessage.PromptErrorMessage(ex); + MessageUtil.Show("修改密码出错!" + message); + } + finally + { + if (!IsDisposed) + { + UpdateConfirmButtonState(); + } + } + } + + /// + /// 取消按钮点击事件。 + /// + private void btnCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/插件库/Lskj.PubUpdatePwd/FrmMain.resx b/插件库/Lskj.PubUpdatePwd/FrmMain.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/FrmMain.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/插件库/Lskj.PubUpdatePwd/Lskj.PubUpdatePwd.csproj b/插件库/Lskj.PubUpdatePwd/Lskj.PubUpdatePwd.csproj new file mode 100644 index 0000000..ebaf754 --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/Lskj.PubUpdatePwd.csproj @@ -0,0 +1,112 @@ + + + + + Debug + AnyCPU + {91470E21-B8FB-4A16-967A-912F9E4807E1} + Library + Lskj.PubUpdatePwd + Lskj.PubUpdatePwd + v4.0 + 512 + true + + + x86 + true + full + false + ..\..\Debug\Lib\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + Form + + + FrmMain.cs + + + + FrmMain.cs + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {7eafccc2-a18f-49e9-85c6-a984966cfd01} + Lskj.Business + + + {447CDC40-659F-4CCA-9ED6-8E818B4CF8BF} + Lskj.Control + + + {2A1BE6AC-1077-491B-A754-C5822FE8121E} + Lskj.Core + + + {52BC40E0-C0C6-4F78-996B-CAE028D209CA} + Lskj.Model + + + {A51BF642-6543-4DE3-8948-83F558B72BD4} + Lskj.Util + + + + \ No newline at end of file diff --git a/插件库/Lskj.PubUpdatePwd/Program.cs b/插件库/Lskj.PubUpdatePwd/Program.cs new file mode 100644 index 0000000..18b89d6 --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/Program.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace Lskj.PubTabDll +{ + static class Program + { + /// + /// 应用程序的主入口点。 + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FrmMain()); + } + } +} diff --git a/插件库/Lskj.PubUpdatePwd/Properties/AssemblyInfo.cs b/插件库/Lskj.PubUpdatePwd/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..53e0e89 --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// 有关程序集的一般信息由以下 +// 控制。更改这些特性值可修改 +// 与程序集关联的信息。 +[assembly: AssemblyTitle("Lskj.PubUpdatePwd")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Lskj.PubUpdatePwd")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// 将 ComVisible 设置为 false 会使此程序集中的类型 +//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 +//请将此类型的 ComVisible 特性设置为 true。 +[assembly: ComVisible(false)] + +// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID +[assembly: Guid("aeb20c62-d8de-4adc-85c7-4bcf3d6aa950")] + +// 程序集的版本信息由下列四个值组成: +// +// 主版本 +// 次版本 +// 生成号 +// 修订号 +// +//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值 +//通过使用 "*",如下所示: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/插件库/Lskj.PubUpdatePwd/Properties/Resources.Designer.cs b/插件库/Lskj.PubUpdatePwd/Properties/Resources.Designer.cs new file mode 100644 index 0000000..d655bd8 --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace Lskj.PubUpdatePwd.Properties { + using System; + + + /// + /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// 返回此类使用的缓存的 ResourceManager 实例。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Lskj.PubUpdatePwd.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/插件库/Lskj.PubUpdatePwd/Properties/Resources.resx b/插件库/Lskj.PubUpdatePwd/Properties/Resources.resx new file mode 100644 index 0000000..af7dbeb --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/插件库/Lskj.PubUpdatePwd/Properties/Settings.Designer.cs b/插件库/Lskj.PubUpdatePwd/Properties/Settings.Designer.cs new file mode 100644 index 0000000..057f476 --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 +// +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 +// +//------------------------------------------------------------------------------ + +namespace Lskj.PubUpdatePwd.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.10.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/插件库/Lskj.PubUpdatePwd/Properties/Settings.settings b/插件库/Lskj.PubUpdatePwd/Properties/Settings.settings new file mode 100644 index 0000000..3964565 --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/插件库/Lskj.PubUpdatePwd/Properties/licenses.licx b/插件库/Lskj.PubUpdatePwd/Properties/licenses.licx new file mode 100644 index 0000000..c05e9a5 --- /dev/null +++ b/插件库/Lskj.PubUpdatePwd/Properties/licenses.licx @@ -0,0 +1,3 @@ +DevExpress.XtraEditors.ComboBoxEdit, DevExpress.XtraEditors.v15.2, Version=15.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.TextEdit, DevExpress.XtraEditors.v15.2, Version=15.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a +DevExpress.XtraEditors.CheckEdit, DevExpress.XtraEditors.v15.2, Version=15.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a diff --git a/插件库/Lskj.PubUserTomodule/FrmMain.Designer.cs b/插件库/Lskj.PubUserTomodule/FrmMain.Designer.cs index 04f71ab..b2fac3f 100644 --- a/插件库/Lskj.PubUserTomodule/FrmMain.Designer.cs +++ b/插件库/Lskj.PubUserTomodule/FrmMain.Designer.cs @@ -849,6 +849,7 @@ // this.name_lde.BackColor = System.Drawing.Color.Transparent; this.name_lde.BackgroundColor = System.Drawing.Color.Empty; + this.name_lde.ContentBold = false; this.name_lde.EditText = ""; this.name_lde.FontSize = 0F; this.name_lde.LabelText = "姓名"; @@ -866,6 +867,7 @@ // this.end_lde.BackColor = System.Drawing.Color.Transparent; this.end_lde.BackgroundColor = System.Drawing.Color.Empty; + this.end_lde.ContentBold = false; this.end_lde.EditText = ""; this.end_lde.FontSize = 0F; this.end_lde.LabelText = "结束时间"; @@ -883,6 +885,7 @@ // this.start_lde.BackColor = System.Drawing.Color.Transparent; this.start_lde.BackgroundColor = System.Drawing.Color.Empty; + this.start_lde.ContentBold = false; this.start_lde.EditText = ""; this.start_lde.FontSize = 0F; this.start_lde.LabelText = "开始时间"; @@ -1036,6 +1039,7 @@ this.searchModuleLab.BackColor = System.Drawing.Color.Transparent; this.searchModuleLab.BackgroundColor = System.Drawing.Color.Empty; this.searchModuleLab.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.searchModuleLab.ContentBold = false; this.searchModuleLab.Dock = System.Windows.Forms.DockStyle.Fill; this.searchModuleLab.EditText = ""; this.searchModuleLab.FontSize = 0F; @@ -1105,7 +1109,7 @@ this.Appearance.Options.UseBackColor = true; this.Appearance.Options.UseFont = true; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.ClientSize = new System.Drawing.Size(1284, 641); + this.ClientSize = new System.Drawing.Size(1605, 801); this.Controls.Add(this.splitContainerControl1); this.Name = "FrmMain"; this.Text = "权限设置器";