From 6b90aa5fdafd21f9bede9b07b2a5d75e371a4d92 Mon Sep 17 00:00:00 2001 From: subin Date: Sat, 3 Feb 2024 16:17:29 +0800 Subject: [PATCH] =?UTF-8?q?=E6=92=AD=E6=8A=A5+=E6=89=93=E5=8D=B0=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E5=BC=82=E6=AD=A5+=E6=97=A5=E5=BF=97+length=3D1+?= =?UTF-8?q?=E8=A7=A3=E5=86=B3=E5=90=AF=E5=8A=A8=E6=8A=A5=E9=94=99=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98+=E5=B0=8F=E7=A8=8B=E5=BA=8F=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E6=9F=A5=E8=AF=A2=E5=92=8C=E7=A1=AE=E8=AE=A4=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E5=90=8E=E5=86=8D=E6=AC=A1=E7=A1=AE=E8=AE=A4=E4=B8=80?= =?UTF-8?q?=E6=AC=A1+=E4=BA=A4=E6=8E=A5=E7=8F=AD+=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=97=A5=E5=BF=97=E6=89=93=E5=8D=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pos/.vs/POSV2020/v16/.suo | Bin 3990528 -> 3990528 bytes pos/POSV.Core/Constant.cs | 10 +- pos/POSV.Core/Job/ServiceCenterUploadJob.cs | 4 +- pos/POSV.Core/ShoppingCart/OrderUtils.cs | 2 +- pos/POSV.Core/Utils/HttpClientUtils.cs | 3 +- pos/POSV.Core/Utils/MessageCenterUtils.cs | 114 +++---- pos/POSV.Core/Utils/SplitPayUtils.cs | 213 +++++++------ pos/POSV.Core/Utils/WSSE.cs | 48 +-- pos/POSV.DefaultTemplate/DefaultTemplate.cs | 16 + pos/POSV.Proxy/MqttClient/MqttClientUtils.cs | 31 +- .../ThirdPartyOrder/JuWeiAppOrderProxy.cs | 87 ++++-- pos/POSV.Template/Bill/AllinPayControl.cs | 16 +- pos/POSV.Template/Shift/ShiftForm.cs | 293 +++++++----------- .../Shift/SplitPayUploadForm.Designer.cs | 3 +- 14 files changed, 447 insertions(+), 393 deletions(-) diff --git a/pos/.vs/POSV2020/v16/.suo b/pos/.vs/POSV2020/v16/.suo index 51a81d152878d5094331d3d50ff3e05fba1852c5..9001e29b3c4e1336f108ee0dc55a575af3deb4e8 100644 GIT binary patch delta 63276 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 t0YE(9K|liFAwVL)0tke1~~{}0T-kbwXI delta 12843 zcmeI&c~}(3-sthEo*5WmSOyUg2Si0Ahzg4P1|uB*_MvY0-s7Z`*i^n7`c)x|tjrTm~aMP-sjlj& zZf553-^5I0HLO}g=ycvXov!%Bix(t1vO0HoVw+y4`v}{y10SkIexj7WaMS5BP{1Y) zd-O{er+Q=rad5CsSJ`0^rAnuB_$(+r0ghP3>{IySK|$@tm&KRV zQMkyFs$Yo8z&P=4MfJx*=|kRDG(gPN+_IqMvM{P8WgaH2U?I z{1Eabx3_1%E2e3>(%7nZ)Hd|+-c2|O7F=+wF_crZAjhYM9`WbcFw?5jwI-E4(U@cc zp1_D}D2FBpgRI}t${6GJ8JW0HN18{p@^O%3voW%&i7g$GiZS>GRgi{N2!IzV;JM?u zX!}>cTvZR{$$oj07X0`6Wn|gE`bD-$zAnp(Nnh`ik{$f9P_v9({SqbUmuL~{=x1u6 z1Pe#5A<#34GQ+83nXlthQy)bOafBHIOS@`t^@7YVay^y%;SnE&W~GMS!8=&d=(}9N*Oz3C6TYvrC1g%V{`SogZZ1 zNk0=m;dt4IVZ{GHZ`@=ozF@eQ?2tPRY_#D33b7XhsO>K4gHXql>}u(<*cq}lFbb!! z35!wo)q8wEEX%$7DwS=xPaMGh2c&P~Iqsnt&u|g)7$apg;_vVq)?qVt(FZ|7=b@v` zI!_8Yw)+N%D~=<+73+?miMebJLm77MBHa(y$&v3bPmWAqKRJ$YAFF8NXyg+#>|dRN zRHo5B4wI)~I_2j-Al=}mRa0^AagHjx8LT#EY&w(r}UnS?j@%&a5H7ZZ6Hp!9I zm}0IgqxvXMbW-~t6aH%7J0%xWH+AAVk(nKM+)#EY zD9MqDFW>0Ji;8TT37LP3RDBi8{8r-1m<-uHt6$qUS1s~4)^rr!G<(QhQVTWCA%eta zbzN<9)69@ykwnQ*G*tfvb(`#I+(u&2tl-jPfv@`lp-t+$5(jXY8+1 zkK9FUenj3CeNK!xY?2L+`agEZh<1vHPVIY41iW^}s)|f?)?EMoTK_*9OcUy=XALT@ z-xQt`um4aSEa^kXSkX{5)zXI>Ki4zy)r^*+i6de0vg}(C`4K0sc;^HvNorEC5~Ym{ zRF;YLm;Kb8H^YM+!NoC-Bz< zLNLl81Z81GD8f(<;V6#^sE7zuLL@393U449RS<)!sAkor>#7sPA`UfB6Y;2p+NguN zsE7J!fQD#<#%O{BB*KQKNWzGd_j3F3`VHl1P7>Q9BEn77PV=)fnF#!`X36n7eDUfqu zB_n$p@etCkNFz>%uh5FUgkn$&ZTb#s-sL)xT1pQwUu3tB(xUvuMUg&>QgV#Ma3z{U zY=4!HVlK@meg_M%5Sdtn#aMzYEJZdPScc`ufr=G)7b~#}tFZ>Tkgd*>Cwd*3_1J*- z@IIW_h)wtao3RBSVk@@cBW%YG>_k3xVK)k(VGlmWUhKms*pE+f0EO~I7ZDu9AsogL z9K|sl$7eW!&v6o`@C8oe49?;lzQk8Jj|=!37jX%f@eQuvTYQJ_aaEqAYq*Xda054S z3qRr~{EXZ91$Xc(?&2Qq;{hJxH$1{W@EE`25B!NIc#3Cuj$*t(y1Zs8kYhkkYJd@L zaEA#V@Prr4@P-e3;Rg%+Q3?SljX(q;7-bNGvali)VJH{M`-c;hM+HI{I|pnP=mN8;!z7b*!Bl$UDQK;G(bZ%LSr-u<@_fQB*KQKNWz?&yJ@=!M?sgSXT9(--~F9|JHDgD@CF zFciZu93wCiqc9p{Fc#x59uqJTlQ0=mkb}$wY)@6jT$!UlU=< z3*od0x4-?~cP0xTqijcIb?I|ahp+g)W!`wz;3}`us;|RitatDc?oDR#RTC$$!CI9K!b)f#>SAczxOMNDd7qD~nfDUREPx z`D(#-^}ZhquQ_EDKlOgRKKSLI1dA~HG?NX$3J%ZmbyR5iotUE*eZ#_~PcN}vpY4}q zDoq9Q{>QZ>H1=R26Xuxem+WY&k8?coYp3}A)6&kZh?|&@Nsd%Y3t7hNci!RUYF4M7 z^;SY1cdxh8M)nuWJaW1TR>q!GAN|@}s1v)fU@Y}dwW^Q0iB1Oj48heDB}T7K?k>{2 z)-nK&n0XgI>x)Xt5fe=;xuJ8F)E-4DX0d*?k{!jj@p!(Ca~?OSWp0vGzt?~<0|!m$ zm3l(Wm?6@&!p98~M9wVkEPSf?nzgXW;(F*#vsw5Z<|gC_j^Z{PR_{#1FEaShyHi15 zaafolc++^e-qg%c)X5dPd^uMLH|I9N^1vZ{)xN{(glpB;i?jM{XH&DB<|6SrgYRQXy*&9Z zUfd%8ko-@iKjSuj!5#dHySRt@kn^S3(N8qswndBFDK6{(r}r&hf8Dp})bhT@P&L-g zH(E{D=M|{++9Tc*CDZj2KFWVFU9%lxRf3lIi8!FoPK{6_@R`4};(YhQJoB#Iq$azBe{L2Z@i1vs7{RAjxKK(TTj3pC5 z`}2};_xyh|;@!WZ4adwvdwNqC4cU!2Ur)qkKAGMkb;Oos85u`V12qwk zTBwaWsEc~2j|OOnMre#CNI)WNXo@7fiDq~U&CvqMXo*&6jW%eDc4b*cwkPO-j_8EW z=z^~3hF*C6wDu2 z_yd3937+B^o}(BqpyRqDpg<1;jBtZH@IIiflNr49nH_2CvGp7AGSPmLmr$-o*tj;44X2VKvqu7i*Ch%phAw zupS%m9^Qu&8?gx=U^BMhLu|!1e1z@Tft|?5F6>4DH0;60*o%Gm1pDzR4xliYK~_X? z5QlIWM{pF!a2%iE1U|<}oWd74jWallbNCWp;XE$jYh1)7T*f!Jf^YF1zQ@&c{#?U# z{D2#{iCg#)KjCNG#xJ;oUvU@ra32rw5WnFO{(;B%9e?0YJi${u!*jTYSFMq2|{`Ijnc~P?UfylibV6rzL05D`cl1C{^g?g+!Q1GIe&~+@7>Gd_j3F56!E_i#FdQQ=5~DC0V=xxu zFdh>y5tA?(Q;>qGNX0Zv#|)$)9W#;PO9x{%=3p-Dn1}hk-RNP01z3noEW%x2wBq;O6{VoQ(n_RPjykpN))!azdivXJqs}H)TmMCQbCrQM zTi>mrmPV}}><$^8X!{`Azsl~xNwZ{`q2DGqd0_snWV_#<=6{4%*>HT#`-!&5tAW|q zuebj?nqya1d))i^{1zjQf0Sr@(lXW3FXBDJUgCx4%^#Q^ohUihHYj0P>gWUMvn{o4 zwng^-E4vzhF4^&L*@m9)uSxc(Ze|1Cq7d3JqB%e08oB^4F9tt;yJ^h!y5Z+^s*`m;yocBD*n+Ke4F4~MLh zv1Mmbx53($WilQ*|5!pn>z}eZrjxnXq2F8Q<7zCDI~M7`FsIkl>@v>VR;o|OUwg&+ z@QHV2J*zS(dS6saw%>fdZpQaRD*MX#ZEO>3ms(%Y`KY%98+v{ddp^|adKcMqRmB;%#g zwkMreH1BF7zEW)5`hDDhA7uki>B|{hJvL&Yzp>QAnmHAsY_^tfv^P(v=bhAu4_Xws zq|1%vlM8zV*=!q5Y_9xyzv3Bkd;7I>ZNK^59w$3vLg|o(SIWhu4+`LvG`k$#Z^qjm zLr-l@wE53H6j>^DWsEG8*yWPpMrh=?jA@Cs4$a&g@9Z6TA#7@*O&hpr+JP}{yYe`8 z_KmBLW=-?%8%O+2w}^3lLbk21zCF=ab#YF{fv>$YOR+tA#sx9#<1};HH;J~QQSG<6 z27hdJ`n6WBL0jp^`zLz2-zho&RW7#)I(g4pP=i5ux>x3a3bopl8+0qt_M+}@x3?^5 z-|+FuL|esx{RtVR+d7kZv)?;c`0`3hf5o&V(N?YZ#b1`UemLwXGb%Rtg55P}?;l<` zD=}mGifbPx+6Mlb@>5AKrZYABWOeh`?eJ{dZ)u{fZT$;v{~x6J>sh9(vOaa9;d={7A{P*-TA!56_N<FeaiMvhjFwYfl zC|eZgii5q5CAcQK+kRVH*Y?o|j@I3=_SttO2Ol|f=d^1gu6)a(xK)Pypo0xfn^P$#{bbt%ZC zp83GLzZx4?CQOSldVFQjrY|$y_SEjjS-S`=A=#_2YQbZ@o1)b%2=P<2z*Mi>9wzx9 zLOw&)Oud=h_YkGg80T_tEax33l zLr8~W7=~j6Mq(63V+_V(940{iUwtC!BuvH>q+lviF%8o(18GRdOpMWuR?la6l~VIo z@(3+vj@N}mhY}K@MK+hKvPTEJBGtkpUJ>e@2y=*<^_!nT8+z1hg%AsP+}%??e2djG zTNx$_b^Q^qcs2L9S2ZF|3Q^nbDC4K*-SG0$>KA(*HL88*dzsZN#auycr#Jg+ z32x>>_rDHt`j|b{cy~V@xW8wZC7i)#KS#oa#oFQm!+7D0G6y(M8WgogVcBT4uuW)m z&JQ70ZEQnxR*>_SLD9wsmkAW={qNlOsNp;OO=|dBv!7a=Yc^?jJDdGOqG!=h@}$ou zorAfsV;~9<|HWof| zSDb-H#hGTdYgYqeZZI0BnG9;Z*!Oavcp@F4P zc{!?B+(mn8Det+@*Z*e;XM6acCES0OaQ|7t{r|p%vu}5IZa47@w#mUMT1v8opRL*2 z$`z1YG2Q<&C_<=8o2r8~zY~^~Ld)I~a$BF{V+vFscDC@Ny0#X7?ab$v%X;E#J4pdunr36ZFbD7=AaR6z{n zPu#1aI${xr8mNhQ)Ix34L0!~CeKbHrG(uxEL4t{AJc$H0G({5LL^HgF=4gRrv_vbk zMjNz6JG4g!bVMg~Mi+ENH*`l2^h7W8MjyP5z9t@d_9N(z0T_ru7>pqpieVUz5g3V4 z7>zL)i*Xo_37CjUn2ae%!BnJT8m40g(vXgsiiwk+6nXD}voJ8JAi1)?zujuFTlrhc zZVj+oOWUo1c59H`8f>?gv0Fpz*0Of1)ou;7Tf^+ua&~LD-CEvmtzfrSv|A(W)=GA3 zq}^KCZjG{A->_Sw?ba%GYmD7m)o!h3w^p}XW9`;ByS0YhTGMWgw_9u3t+nmeI(BPa SyS1L(THkJM;IuY8{=WcQ8r$Ol diff --git a/pos/POSV.Core/Constant.cs b/pos/POSV.Core/Constant.cs index a347b53..a92a45b 100644 --- a/pos/POSV.Core/Constant.cs +++ b/pos/POSV.Core/Constant.cs @@ -267,8 +267,16 @@ namespace POSV /// 支付失败后需要重新生成订单号触发 /// public static string ORDER_PAYMENT_ERROR_GENERATENO = "orderpayerror:generateticketno"; - + + /// + /// 分账上传进度 + /// public static string SPLITPAY_UPLOAD_PROGRESS = "splitpay:uploadprogress"; + + /// + /// 分账完成 + /// + public static string SPLITPAY_UPLOAD_FINISHED = "splitpay:uploadfinish"; #endregion /// diff --git a/pos/POSV.Core/Job/ServiceCenterUploadJob.cs b/pos/POSV.Core/Job/ServiceCenterUploadJob.cs index 2a99672..991ea95 100644 --- a/pos/POSV.Core/Job/ServiceCenterUploadJob.cs +++ b/pos/POSV.Core/Job/ServiceCenterUploadJob.cs @@ -63,13 +63,13 @@ namespace POSV.Job } foreach (var order in waitUpload) { - logger.Info("订单同步到服务中心成功,isHaveCenterTicket=true"); + logger.Info($"订单[{order.TradeNo}]同步到服务中心成功,isHaveCenterTicket=true"); UploadSCNewOrder.UploadNewOrder2SC4KDS(order.TradeNo); } } } - catch(Exception ex) + catch (Exception ex) { logger.Error(ex, "销售订单上传服务中心异常"); } diff --git a/pos/POSV.Core/ShoppingCart/OrderUtils.cs b/pos/POSV.Core/ShoppingCart/OrderUtils.cs index 455c0e3..64896de 100644 --- a/pos/POSV.Core/ShoppingCart/OrderUtils.cs +++ b/pos/POSV.Core/ShoppingCart/OrderUtils.cs @@ -668,7 +668,7 @@ namespace POSV.ShoppingCart /// public void OrderObjectCheck(OrderObject orderObject) { - logger.Info(JsonUtils.Serialize(orderObject)); + //logger.Info(JsonUtils.Serialize(orderObject)); int itemGroupCount = orderObject.Items.GroupBy(x => x.Id).ToList().Count;//订单明细数量 int itemCount = orderObject.Items.Count();//订单明细数量 if (itemGroupCount != itemCount) diff --git a/pos/POSV.Core/Utils/HttpClientUtils.cs b/pos/POSV.Core/Utils/HttpClientUtils.cs index 59e703a..7188321 100644 --- a/pos/POSV.Core/Utils/HttpClientUtils.cs +++ b/pos/POSV.Core/Utils/HttpClientUtils.cs @@ -111,7 +111,8 @@ namespace POSV.Utils try { - logger.Info("请求参数:{0}", JsonUtils.Serialize(parameters)); + //20240203 subin 注释掉 + //logger.Info("请求参数:{0}", JsonUtils.Serialize(parameters)); var stringParams = new Func, string>((dic) => { diff --git a/pos/POSV.Core/Utils/MessageCenterUtils.cs b/pos/POSV.Core/Utils/MessageCenterUtils.cs index 839a370..b4ef344 100644 --- a/pos/POSV.Core/Utils/MessageCenterUtils.cs +++ b/pos/POSV.Core/Utils/MessageCenterUtils.cs @@ -77,7 +77,7 @@ namespace POSV.Utils } catch (Exception ex) { - logger.Error(ex , "初始化消息中心异常"); + logger.Error(ex, "初始化消息中心异常"); } } @@ -85,7 +85,7 @@ namespace POSV.Utils /// 检测消息中心是否正常。1)没有配置消息中心;2)启用了消息中心是否连接; /// /// - public Tuple IsAvailable() + public Tuple IsAvailable() { bool enabled = false; bool connected = false; @@ -95,7 +95,7 @@ namespace POSV.Utils Stopwatch watch = Stopwatch.StartNew(); //是否启用消息中心 - bool enabledMessageCenter = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_SERVICECENTER_ENABLE , false); + bool enabledMessageCenter = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_SERVICECENTER_ENABLE, false); if (enabledMessageCenter) { enabled = true; @@ -110,8 +110,8 @@ namespace POSV.Utils logger.Info("开始检测服务中心是否通畅耗时"); //获取配置的参数 - string host = Global.Instance.GlobalConfigStringValue(ConfigConstant.DEVICE_SERVICECENTER_IP , string.Empty); - int port = Global.Instance.GlobalConfigIntValue(ConfigConstant.DEVICE_SERVICECENTER_PORT , 0); + string host = Global.Instance.GlobalConfigStringValue(ConfigConstant.DEVICE_SERVICECENTER_IP, string.Empty); + int port = Global.Instance.GlobalConfigIntValue(ConfigConstant.DEVICE_SERVICECENTER_PORT, 0); //IP和端口配置错误 if (string.IsNullOrEmpty(host) || port == 0) @@ -121,8 +121,8 @@ namespace POSV.Utils else { //检测IP和端口是否通畅 - var url = string.Format("{0}{1}" , this._baseUrl , "/amok"); - HttpResult hr = this._httpManager.Get(url , null, 2000); + var url = string.Format("{0}{1}", this._baseUrl, "/amok"); + HttpResult hr = this._httpManager.Get(url, null, 2000); connected = (hr.Code == 200); } @@ -131,17 +131,17 @@ namespace POSV.Utils { connected = false; } - logger.Info("检测服务中心是否通畅耗时<{0}>", watch.ElapsedMilliseconds); + logger.Info("检测服务中心是否通畅[{0}]耗时<{1}>", connected, watch.ElapsedMilliseconds); } catch (Exception ex) { - logger.Error(ex , "连接消息中心失败"); + logger.Error(ex, "连接消息中心失败"); enabled = false; connected = false; } - return new Tuple(enabled , connected); + return new Tuple(enabled, connected); } @@ -153,7 +153,7 @@ namespace POSV.Utils get { //是否启用共享沽清 - var enableSaleClear = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_SALECLEAR_ENABLE , false); + var enableSaleClear = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_SALECLEAR_ENABLE, false); //1)启用消息中心;2)消息中心连接正常;3)参数配置中设置了共享沽清 return Global.Instance.MessageCenterOnline.Item1 && Global.Instance.MessageCenterOnline.Item2 && enableSaleClear; @@ -166,7 +166,7 @@ namespace POSV.Utils /// /// /// - public Tuple GetGlobalTicketNo(int length = 4) + public Tuple GetGlobalTicketNo(int length = 4) { lock (Global.Instance.CacheLock) { @@ -174,31 +174,31 @@ namespace POSV.Utils { if (!string.IsNullOrEmpty(this._baseUrl)) { - var url = string.Format("{0}{1}{2}" , this._baseUrl , "/trade/" , length); + var url = string.Format("{0}{1}{2}", this._baseUrl, "/trade/", length); - HttpResult hr = this._httpManager.Get(url , null); + HttpResult hr = this._httpManager.Get(url, null); if (hr.Code == 200) { - return new Tuple(true , string.Format("获取到全局票号成功<{0}>" , hr.Text) , hr.Text); + return new Tuple(true, string.Format("获取到全局票号成功<{0}>", hr.Text), hr.Text); } else { - return new Tuple(false , string.Format("获取到全局票号失败<{0}>" , hr.Text) , hr.Text); + return new Tuple(false, string.Format("获取到全局票号失败<{0}>", hr.Text), hr.Text); } } else { - return new Tuple(false , this._message , string.Empty); + return new Tuple(false, this._message, string.Empty); } } catch (Exception ex) { - logger.Error(ex , "获取全局票号异常"); + logger.Error(ex, "获取全局票号异常"); - return new Tuple(false , "获取全局票号失败" , string.Empty); + return new Tuple(false, "获取全局票号失败", string.Empty); } - } + } } /// @@ -207,37 +207,37 @@ namespace POSV.Utils /// /// /// - public Tuple GetGlobalOrderNo(int length = 2,int initialValue = 0) + public Tuple GetGlobalOrderNo(int length = 2, int initialValue = 0) { - lock(Global.Instance.CacheLock) + lock (Global.Instance.CacheLock) { try { if (!string.IsNullOrEmpty(this._baseUrl)) { - var url = string.Format("{0}{1}{2}/{3}" , this._baseUrl , "/order/" , length , initialValue); + var url = string.Format("{0}{1}{2}/{3}", this._baseUrl, "/order/", length, initialValue); - HttpResult hr = this._httpManager.Get(url , null); + HttpResult hr = this._httpManager.Get(url, null); if (hr.Code == 200) { - return new Tuple(true , string.Format("获取到全局序号成功<{0}>" , hr.Text) , hr.Text); + return new Tuple(true, string.Format("获取到全局序号成功<{0}>", hr.Text), hr.Text); } else { - return new Tuple(false , string.Format("获取到全局序号失败<{0}>" , hr.Text) , hr.Text); + return new Tuple(false, string.Format("获取到全局序号失败<{0}>", hr.Text), hr.Text); } } else { - return new Tuple(false , this._message , string.Empty); + return new Tuple(false, this._message, string.Empty); } } catch (Exception ex) { - logger.Error(ex , "获取全局序号异常"); + logger.Error(ex, "获取全局序号异常"); - return new Tuple(false , "获取全局序号失败" , string.Empty); + return new Tuple(false, "获取全局序号失败", string.Empty); } } } @@ -247,13 +247,13 @@ namespace POSV.Utils /// /// /// - public Tuple> GetGlobalAvailableSaleClear() + public Tuple> GetGlobalAvailableSaleClear() { try { - var url = string.Format("{0}{1}" , this._baseUrl , "/sale/clear"); + var url = string.Format("{0}{1}", this._baseUrl, "/sale/clear"); - HttpResult hr = this._httpManager.PostJson(url ,"{}", null); + HttpResult hr = this._httpManager.PostJson(url, "{}", null); if (hr.Code == 200) { logger.Info(hr.Text); @@ -264,36 +264,36 @@ namespace POSV.Utils if (obj.Status == 1) { - return new Tuple>(true , obj.Message , obj.Data); + return new Tuple>(true, obj.Message, obj.Data); } else { - return new Tuple>(false , obj.Message , new List()); + return new Tuple>(false, obj.Message, new List()); } } else { - return new Tuple>(false , "获取沽清数据错误" , new List()); + return new Tuple>(false, "获取沽清数据错误", new List()); } } catch (Exception ex) { - logger.Error(ex , "获取沽清数据异常"); + logger.Error(ex, "获取沽清数据异常"); - return new Tuple>(false , "获取沽清数据异常" , new List()); + return new Tuple>(false, "获取沽清数据异常", new List()); } } - public Tuple> GetSaleClearList(string dateTimer = null) + public Tuple> GetSaleClearList(string dateTimer = null) { try { if (!string.IsNullOrEmpty(this._baseUrl)) { - var url = string.Format("{0}{1}" , this._baseUrl , "/sale/clear/list"); + var url = string.Format("{0}{1}", this._baseUrl, "/sale/clear/list"); //构建POST的JSON参数,date为空标识今日沽清 - var body = new Dictionary(); + var body = new Dictionary(); body["date"] = string.Empty; //指定日期的沽清 @@ -302,7 +302,7 @@ namespace POSV.Utils body["date"] = dateTimer; } - HttpResult hr = this._httpManager.PostJson(url , JsonUtils.Serialize(body) , null); + HttpResult hr = this._httpManager.PostJson(url, JsonUtils.Serialize(body), null); if (hr.Code == 200) { var obj = JsonUtils.Deserialize>>(hr.Text); @@ -311,33 +311,33 @@ namespace POSV.Utils { var data = obj.Data as List; - return new Tuple>(true , obj.Message , data); + return new Tuple>(true, obj.Message, data); } else { - return new Tuple>(false , obj.Message , new List()); + return new Tuple>(false, obj.Message, new List()); } } else { - return new Tuple>(false , "获取沽清列表数据错误" , new List()); + return new Tuple>(false, "获取沽清列表数据错误", new List()); } } else { - return new Tuple>(false , this._message , new List()); + return new Tuple>(false, this._message, new List()); } } catch (Exception ex) { - logger.Error(ex , "获取沽清列表数据异常"); + logger.Error(ex, "获取沽清列表数据异常"); - return new Tuple>(false , "获取沽清列表数据异常" , new List()); + return new Tuple>(false, "获取沽清列表数据异常", new List()); } } - public Tuple ChangeSaleClear(SaleClear saleClear) + public Tuple ChangeSaleClear(SaleClear saleClear) { lock (Global.Instance.CacheLock) { @@ -345,12 +345,12 @@ namespace POSV.Utils { if (!string.IsNullOrEmpty(this._baseUrl)) { - var url = string.Format("{0}{1}" , this._baseUrl , "/sale/clear/change"); - + var url = string.Format("{0}{1}", this._baseUrl, "/sale/clear/change"); + //将沽清对象序列化,传递到http var body = JsonUtils.Serialize(saleClear); - HttpResult hr = this._httpManager.PostJson(url , body , null); + HttpResult hr = this._httpManager.PostJson(url, body, null); if (hr.Code == 200) { logger.Info("变更沽清信息,服务中心的应答"); @@ -360,24 +360,24 @@ namespace POSV.Utils SaleClearUtils.Instance.SaveOrUpdateNoChanged(obj.Data); - - return new Tuple(true , "获取沽清列表数据错误"); + + return new Tuple(true, "获取沽清列表数据错误"); } else { - return new Tuple(false , "获取沽清列表数据错误"); + return new Tuple(false, "获取沽清列表数据错误"); } } else { - return new Tuple(false , this._message); + return new Tuple(false, this._message); } } catch (Exception ex) { - logger.Error(ex , "获取沽清列表数据异常"); + logger.Error(ex, "获取沽清列表数据异常"); - return new Tuple(false , "获取沽清列表数据异常"); + return new Tuple(false, "获取沽清列表数据异常"); } } } diff --git a/pos/POSV.Core/Utils/SplitPayUtils.cs b/pos/POSV.Core/Utils/SplitPayUtils.cs index 72fc747..4b98465 100644 --- a/pos/POSV.Core/Utils/SplitPayUtils.cs +++ b/pos/POSV.Core/Utils/SplitPayUtils.cs @@ -42,14 +42,12 @@ namespace POSV.Utils public bool SaveSplitPayInfo(OrderObject orderObject) { Stopwatch sw = new Stopwatch(); - - sw.Start(); - - logger.Info($"开始保存订单<{orderObject.TradeNo}>的分账信息"); - var isExist = false; try { + sw.Start(); + logger.Info($"开始保存订单<{orderObject.TradeNo}>的分账信息"); + var _pid = IdWorkerUtils.Instance.NextId(); using (var db = Global.Instance.OpenDataBase) { @@ -230,7 +228,7 @@ namespace POSV.Utils RefundQuantity = item.MiddleRefundQuantity, Pid = _pid }; - + if (i == 0) { ssp.fee = string.IsNullOrEmpty(pay.Ext2) ? 0 : Convert.ToDecimal(pay.Ext2); @@ -308,7 +306,7 @@ namespace POSV.Utils RefundQuantity = item.RefundQuantity, Pid = _pid }; - + if (i == 0) { ssp.fee = string.IsNullOrEmpty(pay.Ext2) ? 0 : Convert.ToDecimal(pay.Ext2); @@ -398,8 +396,8 @@ namespace POSV.Utils #endregion } } - } + logger.Info($"完成保存订单<{orderObject.TradeNo}>的分账信息"); } catch (Exception ex) { @@ -410,7 +408,7 @@ namespace POSV.Utils { sw.Stop(); - logger.Info($"保存订单<{orderObject.TradeNo}的分账信息时长<{sw.ElapsedMilliseconds}>"); + logger.Info($"保存订单<{orderObject.TradeNo}>的分账信息时长<{sw.ElapsedMilliseconds}>"); } @@ -649,7 +647,8 @@ namespace POSV.Utils } trans.Complete(); - logger.Info($"退款成功后,更新本地分账信息:成功,json:" + JsonUtils.Serialize(updateData)); + //logger.Info($"退款成功后,更新本地分账信息:成功,json:" + JsonUtils.Serialize(updateData)); + logger.Info($"退款成功后,更新本地分账信息:成功"); } } } @@ -675,11 +674,13 @@ namespace POSV.Utils var result = api.UpdateSplitPay(entity); if (result.Item1) { - logger.Info($"退款成功后,更新服务端原分账信息:成功,json:" + JsonUtils.Serialize(entity)); + //logger.Info($"退款成功后,更新服务端原分账信息:成功,json:" + JsonUtils.Serialize(entity)); + logger.Info($"退款成功后,更新服务端原分账信息:成功。"); } else { - logger.Info($"退款成功后,更新服务端原分账信息:失败,json:" + JsonUtils.Serialize(entity)); + //logger.Info($"退款成功后,更新服务端原分账信息:失败,json:" + JsonUtils.Serialize(entity)); + logger.Info($"退款成功后,更新服务端原分账信息:失败。"); } Thread.Sleep(100); @@ -706,7 +707,7 @@ namespace POSV.Utils logger.Info($"开始日订单[{date.ToString("yyyy-MM-dd")}]的分账信息存储处理..."); var proValue = 0; - var proMaxValue = 20; + var proMaxValue = 400; Stopwatch sw = new Stopwatch(); sw.Start(); @@ -718,90 +719,104 @@ namespace POSV.Utils var pays = new List(); //支付方式分摊明细 var itemPays = new List(); + var index = 0; try { - using (var db = Global.Instance.OpenDataBase) + while (index < 2) { - //var delSql = "delete from pos_split_store_pay where syncStatus = 1 and uploadStatus = 1;"; - //db.Execute(delSql); + using (var db = Global.Instance.OpenDataBase) + { + //var delSql = "delete from pos_split_store_pay where syncStatus = 1 and uploadStatus = 1;"; + //db.Execute(delSql); - count = db.Query($"where isSplited = 0 and finishDate between '{sDate}' and '{eDate}';").Count(); - //主单数据 - //lists = db.Query("where syncStatus = 0 and uploadErrors < 3000 order by uploadErrors limit @0;", 1).ToList(); + count = db.Query($"where isSplited = 0 and finishDate between '{sDate}' and '{eDate}';").Count(); + //主单数据 + //lists = db.Query("where syncStatus = 0 and uploadErrors < 3000 order by uploadErrors limit @0;", 1).ToList(); + var tmpPress = proMaxValue / 2 / count == 0 ? 1 : proMaxValue / 2 / count; - var pageCount = count % pageSize != 0 ? (count / pageSize) + 1 : count / pageSize; + var pageCount = count % pageSize != 0 ? (count / pageSize) + 1 : count / pageSize; - logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}]<{count}>条,页尺寸<{pageSize}>,共<{pageCount}>页"); - var sqlList = new ConcurrentQueue(); - for (int i = 0; i < pageCount; i++) - { - logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}],分账第<{i + 1}>页订单数据"); - lists = db.Query($"where isSplited = 0 and finishDate between '{sDate}' and '{eDate}' limit ({i * pageSize}), {pageSize};").ToList(); + logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}]<{count}>条,页尺寸<{pageSize}>,共<{pageCount}>页"); + var sqlList = new ConcurrentQueue(); + for (int i = 0; i < pageCount; i++) + { + logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}],分账[index:{index + 1}]第<{i + 1}>页订单数据"); + lists = db.Query($"where isSplited = 0 and finishDate between '{sDate}' and '{eDate}' limit ({i * pageSize}), {pageSize};").ToList(); - var ids = string.Join("','", lists.ConvertAll(x => x.Id).ToArray()); - var nos = string.Join("','", lists.ConvertAll(x => x.TradeNo).ToArray()); - logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}],分账第<{i + 1}>页订单数据:{nos}"); - var condition = " where orderId in ('" + ids + "');"; + var ids = string.Join("','", lists.ConvertAll(x => x.Id).ToArray()); + var nos = string.Join("','", lists.ConvertAll(x => x.TradeNo).ToArray()); + logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}],分账[index:{index + 1}]第<{i + 1}>页订单数据:{nos}"); + var condition = " where orderId in ('" + ids + "');"; - //单据明细 - items = db.Query(condition).ToList(); + //单据明细 + items = db.Query(condition).ToList(); - //支付明细 - pays = db.Query(condition).ToList(); + //支付明细 + pays = db.Query(condition).ToList(); - itemPays = db.Query(condition).ToList(); + itemPays = db.Query(condition).ToList(); - foreach (var orderObject in lists) - { - orderObject.Items = items.FindAll(x => x.OrderId == orderObject.Id); + foreach (var orderObject in lists) + { + orderObject.Items = items.FindAll(x => x.OrderId == orderObject.Id); - //将支付方式附加到主单 - orderObject.Pays = pays.FindAll(x => x.OrderId == orderObject.Id); + //将支付方式附加到主单 + orderObject.Pays = pays.FindAll(x => x.OrderId == orderObject.Id); - foreach (var item in orderObject.Items) - { - item.ItemPayList = itemPays.FindAll(x => x.OrderId == orderObject.Id & x.ItemId == item.Id); + foreach (var item in orderObject.Items) + { + item.ItemPayList = itemPays.FindAll(x => x.OrderId == orderObject.Id & x.ItemId == item.Id); + } } - } - if (lists.Count > 0) - { - foreach (var orderObject in lists) + if (lists.Count > 0) { - logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}]<{orderObject.TradeNo}>分账信息处理..."); - var isExist = SaveSplitPayInfo(orderObject); - if (!isExist) + var p = 0; + foreach (var orderObject in lists) { - var sql = $"update pos_order set isSplited=1 where id={orderObject.Id};"; - logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}]<{orderObject.TradeNo}>更改分账状态isSplited==>1"); - sqlList.Enqueue(sql); - } - else - { - logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}]<{orderObject.TradeNo}>的分账信息存储异常"); + logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}]<{orderObject.TradeNo}>分账信息处理..."); + var isExist = SaveSplitPayInfo(orderObject); + if (!isExist) + { + var sql = $"update pos_order set isSplited=1 where id={orderObject.Id};"; + logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}]<{orderObject.TradeNo}>更改分账状态isSplited==>1"); + sqlList.Enqueue(sql); + } + else + { + logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}]<{orderObject.TradeNo}>的分账信息存储异常"); + } + Thread.Sleep(100); + //if (proValue < proMaxValue / (2 - index)) + // proValue = (proMaxValue / (2 - index) * index) + tmpPress * ((p + 1) + pageSize * i); + proValue++; + MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proValue); + p++; } - Thread.Sleep(100); } - } - else - { - logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}],第<{i + 1}>页订单数据无可分账数据"); - } + else + { + logger.Info($"日订单[{date.ToString("yyyy-MM-dd")}],[index:{index + 1}]第<{i + 1}>页订单数据无可分账数据"); + //proValue = pageSize * (i + 1); + //if (proValue < proMaxValue / (2 - index)) + //{ + // MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proValue); + //} + //else + //{ + // MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proMaxValue / (2 - index)); + //} + proValue = count * (index + 1); + MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proValue); + } - if (i > proMaxValue) - { - proValue = 20; - } - else - { - proValue = i; } - MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proValue); - } - SqliteUtils.ExecuteTransaction(sqlList); + SqliteUtils.ExecuteTransaction(sqlList); + index++; + } } } catch (Exception ex) @@ -814,32 +829,37 @@ namespace POSV.Utils sw.Stop(); logger.Info("日订单<{0}>的分账信息存储结束<{1}>", count, sw.ElapsedMilliseconds); - MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proMaxValue); + MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, count * 2); } return isException; } } - public Tuple SplitData2Server(DateTime date) + public Tuple SplitData2Server(DateTime date, int proIndexValue = 0) { Tuple result = null; var sDate = date.ToString("yyyy-MM-dd 00:00:00"); var eDate = date.AddDays(1).ToString("yyyy-MM-dd 00:00:00"); logger.Info($"开始日订单[{date.ToString("yyyy-MM-dd")}]的分账信息上传..."); - var pageSize = 10; + var pageSize = 1500; Stopwatch sw = new Stopwatch(); sw.Start(); int index = 0; - MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, 25); + //proIndexValue = 401; + var proValue = proIndexValue; + MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proValue); - var proValue = 24; + var proMaxValue = 990; var flg = false; + var tmpPress = 0; lock (Global.Instance.SyncLock) { + while (index < 3) { + tmpPress = proIndexValue + (proMaxValue - proIndexValue) / (3 - index); var icount = 0; var count = 0; var total = 0; @@ -853,19 +873,7 @@ namespace POSV.Utils if (count > 0) { var pageCount = count % pageSize != 0 ? count / pageSize + 1 : count / pageSize; - var spp = 1; - if (pageCount > 0 && pageCount == proValue) - { - spp = 1; - } - else if (pageCount > 0 && pageCount <= 6) - { - spp = 4; - } - else if (pageCount > 7 && pageCount <= 12) - { - spp = 2; - } + //tmpPress = tmpPress / count == 0 ? 1 : tmpPress / count; for (int i = 0; i < pageCount; i++) { @@ -874,14 +882,13 @@ namespace POSV.Utils var pSplitLst = db.Query(condition).ToList(); var list = new ConcurrentQueue(); - int j = 0; foreach (var item in pSplitLst) { StringBuilder strBil = new StringBuilder(); strBil.Append("select ord.ticketId as ordTicketId,ord.tableNo,ord.people,ord.workerNo,oi.price as unitPrice,oi.productId as goodid,ssp.* from pos_split_store_pay ssp "); strBil.Append("left join pos_order_item oi on oi.id=ssp.orderItemId and oi.productId=ssp.productId "); strBil.Append("left join pos_order ord on ord.id=ssp.orderId "); - strBil.Append("where ssp.pid={0};"); + strBil.Append("where ssp.pid='{0}';"); string sql = string.Format(strBil.ToString(), item.Id); var lists = db.Query(sql); var succLst = new List(); @@ -951,13 +958,15 @@ namespace POSV.Utils list.Enqueue(strPSql); logger.Info($"分账信息第<{index + 1}>次上传,日订单[{date.ToString("yyyy-MM-dd")}]<{item.BusNo}>明细的分账信息上传操作失败"); } - - j++; Thread.Sleep(100); } + //if (proValue < tmpPress) + // proValue++; + //MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proValue); + proValue++; + MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proValue); } - proValue += spp; - MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proValue); + SqliteUtils.ExecuteTransaction(list); } } @@ -972,17 +981,21 @@ namespace POSV.Utils { flg = false; logger.Error(ex, $"分账信息第<{index + 1}>次上传,日订单[{date.ToString("yyyy-MM-dd")}]的分账信息上传错误"); + + //MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proMaxValue / 3 * index); } finally { sw.Stop(); logger.Info($"分账信息第<{index + 1}>次上传,日订单<{count}>条,应上传明细<{total}>条,实传<{icount}>条,时长<{sw.ElapsedMilliseconds}>"); - var pressValue = count == 0 ? proValue * (index + 1) : proValue; - MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, pressValue); + //var pressValue = count == 0 ? proValue * (index + 1) : proValue; + //MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, tmpPress); + proValue = proIndexValue + count * (index + 1); + MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, proValue); index++; } } - MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, 100); + //MsgEvent.Send(Constant.SPLITPAY_UPLOAD_PROGRESS, 1000); if (!flg) { diff --git a/pos/POSV.Core/Utils/WSSE.cs b/pos/POSV.Core/Utils/WSSE.cs index 542c441..d94ef88 100644 --- a/pos/POSV.Core/Utils/WSSE.cs +++ b/pos/POSV.Core/Utils/WSSE.cs @@ -54,7 +54,7 @@ namespace POSV.Utils var ip = Global.Instance.GlobalConfigStringValue(ConfigConstant.DEVICE_SERVICECENTER_IP); var port = Global.Instance.GlobalConfigStringValue(ConfigConstant.DEVICE_SERVICECENTER_PORT); var enableKds = Global.Instance.GlobalConfigBoolValue(ConfigConstant.DEVICE_KITCHEN_DISPLAY_ENABLE, false); - if(enable && !string.IsNullOrEmpty(ip) && !string.IsNullOrEmpty(port)) + if (enable && !string.IsNullOrEmpty(ip) && !string.IsNullOrEmpty(port)) { if (enableKds) { @@ -96,16 +96,16 @@ namespace POSV.Utils } catch (Exception ex) { - logger.Debug(ex , "InitWebSocket"); + logger.Debug(ex, "InitWebSocket"); } - + } - public void Query(string name , object content , Action executor) + public void Query(string name, object content, Action executor) { if (this._websocket != null) { - this._websocket.Query(name , content , executor); + this._websocket.Query(name, content, executor); } } @@ -119,26 +119,26 @@ namespace POSV.Utils //} - public void On(string name , Action executor) + public void On(string name, Action executor) { logger.Info("收到消息" + name); if (this._websocket != null) { - this._websocket.On(name , executor); + this._websocket.On(name, executor); } } - private void WebSocketClosed(object sender , EventArgs e) + private void WebSocketClosed(object sender, EventArgs e) { this._connected = false; } - private void WebSocketError(object sender , SuperSocket.ClientEngine.ErrorEventArgs e) + private void WebSocketError(object sender, SuperSocket.ClientEngine.ErrorEventArgs e) { this._connected = false; } - private void WebSocketOpened(object sender , EventArgs e) + private void WebSocketOpened(object sender, EventArgs e) { this._connected = true; } @@ -149,7 +149,7 @@ namespace POSV.Utils public void RestartConnect() { //停止自动重连任务 - if(_reconnectTimer != null) + if (_reconnectTimer != null) { _reconnectTimer.Close(); } @@ -169,24 +169,34 @@ namespace POSV.Utils InitWebSocket(); - if(this._websocket != null) + if (this._websocket != null) { this._websocket.Open(); } } - private void ReconnectTimerCallback(object sender , System.Timers.ElapsedEventArgs e) + private void ReconnectTimerCallback(object sender, System.Timers.ElapsedEventArgs e) { - //already open or openning - if (this._websocket.State == WebSocketState.Connecting || this._websocket.State == WebSocketState.Open) + try { - return; + //already open or openning + if (this._websocket.State == WebSocketState.Connecting || this._websocket.State == WebSocketState.Open) + { + return; + } + + + logger.Info("尝试连接服务中心……"); + + StartConnect(); + } + catch (Exception ex) + { + logger.Error(ex, "连接服务中心错误"); } - logger.Info("尝试连接服务中心……"); - StartConnect(); } - + } } diff --git a/pos/POSV.DefaultTemplate/DefaultTemplate.cs b/pos/POSV.DefaultTemplate/DefaultTemplate.cs index 0a06223..47c002a 100644 --- a/pos/POSV.DefaultTemplate/DefaultTemplate.cs +++ b/pos/POSV.DefaultTemplate/DefaultTemplate.cs @@ -8856,6 +8856,10 @@ namespace POSV if (!string.IsNullOrEmpty(outTradeNo)) { this._orderObject.TradeNo = outTradeNo; + foreach (var item in this._orderObject.Items) + { + item.TradeNo = this._orderObject.TradeNo; + } } else { @@ -8867,6 +8871,10 @@ namespace POSV if (ticket.Item1) { this._orderObject.TradeNo = ticket.Item3; + foreach (var item in this._orderObject.Items) + { + item.TradeNo = this._orderObject.TradeNo; + } } //重新判断是否获取到单号 @@ -8896,6 +8904,10 @@ namespace POSV if (DialogResult.Yes == dialog.ShowDialog()) { this._orderObject.TradeNo = OrderUtils.Instance.GenerateTicketNo(); + foreach (var item in this._orderObject.Items) + { + item.TradeNo = this._orderObject.TradeNo; + } } else { @@ -8908,6 +8920,10 @@ namespace POSV if (isLocalTicketNo) { this._orderObject.TradeNo = OrderUtils.Instance.GenerateTicketNo(); + foreach (var item in this._orderObject.Items) + { + item.TradeNo = this._orderObject.TradeNo; + } } else { diff --git a/pos/POSV.Proxy/MqttClient/MqttClientUtils.cs b/pos/POSV.Proxy/MqttClient/MqttClientUtils.cs index 0bd9d10..7cd14b1 100644 --- a/pos/POSV.Proxy/MqttClient/MqttClientUtils.cs +++ b/pos/POSV.Proxy/MqttClient/MqttClientUtils.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading.Tasks; using uPLibrary.Networking.M2Mqtt; using uPLibrary.Networking.M2Mqtt.Messages; @@ -59,7 +60,8 @@ namespace POSV.Proxy.Mqtt //2022-12-13 11:06 zhangy Edit 更换IP地址为域名 - this.mqttClient = new MqttClient("mqtt.ffcygl.com", 18830, false, null, null, MqttSslProtocols.None); + //this.mqttClient = new MqttClient("mqtt.ffcygl.com", 18830, false, null, null, MqttSslProtocols.None); + this.mqttClient = new MqttClient("csmqtt.ffcygl.com", 18830, false, null, null, MqttSslProtocols.None); //this.mqttClient = new MqttClient("127.0.0.1", 1883, false, null, null, MqttSslProtocols.None); @@ -154,25 +156,30 @@ namespace POSV.Proxy.Mqtt /// void OnMqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) { - + string message = Encoding.UTF8.GetString(e.Message); string topic = e.Topic; - logger.Info("服务端推送<{0}>消息:{1}",topic, message); + logger.Info("服务端推送<{0}>消息:{1}", topic, message); if (topic.StartsWith("program")) { logger.Info("收到巨为小程序订单"); JuWeiAppOrderProxy.sendJwWeixinMessage(message); - OnMessageReceived?.Invoke(sender, new MessageEventArgs(0, message)); + + //Task.Factory.StartNew(() => + //{ + // JuWeiAppOrderProxy.sendJwWeixinMessage(message); + // OnMessageReceived?.Invoke(sender, new MessageEventArgs(0, message)); + //}); } if (topic.StartsWith("waimai")) { //开启商家版美团外卖和餐道外卖 - var enableShopMeiTuan = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ENABLESHOPMEITUAN,false); + var enableShopMeiTuan = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ENABLESHOPMEITUAN, false); if (enableShopMeiTuan) { logger.Info("收到美团商家外卖订单"); @@ -182,25 +189,25 @@ namespace POSV.Proxy.Mqtt { logger.Info("收到外卖订单"); OtherWaiMaiApi.sendWaiMaiMessage(message); - } - + } + OnMessageReceived?.Invoke(sender, new MessageEventArgs(0, message)); } if (topic.StartsWith("weixin")) { logger.Info("微信小程序订单"); - OtherWaiMaiApi.sendWeixinMessage(message); + OtherWaiMaiApi.sendWeixinMessage(message); OnMessageReceived?.Invoke(sender, new MessageEventArgs(1, message)); } if (topic.StartsWith("qimai")) { logger.Info("收到企迈第三方订单"); - OtherWaiMaiApi.sendQiMaiMessage(message); + OtherWaiMaiApi.sendQiMaiMessage(message); OnMessageReceived?.Invoke(sender, new MessageEventArgs(1, message)); } - + this._action?.Invoke(e); } @@ -230,7 +237,7 @@ namespace POSV.Proxy.Mqtt //运维参数 string tenant = string.Format("{0}/{1}/{2}", "devops", "cy2", Global.Instance.Worker.TenantId); string shop = string.Format("{0}/{1}/{2}/{3}", "devops", "cy2", Global.Instance.Worker.TenantId, Global.Instance.Worker.StoreInfo.No); - string pos = string.Format("{0}/{1}/{2}/{3}/{4}", "devops", "cy2", Global.Instance.Worker.TenantId, Global.Instance.Worker.StoreInfo.No,Global.Instance.Authc.PosNo); + string pos = string.Format("{0}/{1}/{2}/{3}/{4}", "devops", "cy2", Global.Instance.Worker.TenantId, Global.Instance.Worker.StoreInfo.No, Global.Instance.Authc.PosNo); //业务参数 string waimai = string.Format("{0}/{1}/{2}/{3}", "waimai", "cy2", Global.Instance.Worker.TenantId, Global.Instance.Worker.StoreInfo.Id); @@ -239,7 +246,7 @@ namespace POSV.Proxy.Mqtt string program = string.Format("{0}/{1}/{2}/{3}", "program", "cy2", Global.Instance.Worker.TenantId, Global.Instance.Worker.StoreInfo.Id); - string[] topics = { waimai, weixin, qimai, program , tenant ,shop , pos}; + string[] topics = { waimai, weixin, qimai, program, tenant, shop, pos }; byte[] levels = { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }; diff --git a/pos/POSV.Proxy/ThirdPartyOrder/JuWeiAppOrderProxy.cs b/pos/POSV.Proxy/ThirdPartyOrder/JuWeiAppOrderProxy.cs index ab20715..21a1d57 100644 --- a/pos/POSV.Proxy/ThirdPartyOrder/JuWeiAppOrderProxy.cs +++ b/pos/POSV.Proxy/ThirdPartyOrder/JuWeiAppOrderProxy.cs @@ -25,6 +25,10 @@ namespace POSV.Proxy.ThirdPartyOrder public JuWeiAppOrderProxy() { + if (LOGGET == null) + { + LOGGET = NLog.LogManager.GetLogger(GetType().FullName); + } } #region API @@ -213,7 +217,7 @@ namespace POSV.Proxy.ThirdPartyOrder LOGGET.Info("小程序点餐_门店信息请求:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); - LOGGET.Info("小程序点餐_门店信息接收:" + response); + //LOGGET.Info("小程序点餐_门店信息接收:" + response); //获取成功 if (Constant.IsSuccessful(response)) { @@ -268,9 +272,9 @@ namespace POSV.Proxy.ThirdPartyOrder var ignoreParameters = new List(); parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); - LOGGET.Info("小程序点餐_门店开停业_请求:" + _isopen + JsonUtils.Serialize(parameters)); + //LOGGET.Info("小程序点餐_门店开停业_请求:" + _isopen + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); - LOGGET.Info("小程序点餐_门店开停业_接收:" + _isopen + response); + //LOGGET.Info("小程序点餐_门店开停业_接收:" + _isopen + response); //获取成功 if (Constant.IsSuccessful(response)) { @@ -319,7 +323,7 @@ namespace POSV.Proxy.ThirdPartyOrder parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); LOGGET.Info("小程序点餐_门店开业_请求:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); - LOGGET.Info("小程序点餐_门店开业_接收:" + response); + //LOGGET.Info("小程序点餐_门店开业_接收:" + response); //获取成功 if (Constant.IsSuccessful(response)) { @@ -421,7 +425,7 @@ namespace POSV.Proxy.ThirdPartyOrder LOGGET.Info("小程序点餐_配送信息请求:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); - LOGGET.Info("小程序点餐_配送信息接收:" + response); + //LOGGET.Info("小程序点餐_配送信息接收:" + response); //获取成功 if (Constant.IsSuccessful(response)) { @@ -471,7 +475,7 @@ namespace POSV.Proxy.ThirdPartyOrder parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); LOGGET.Info("小程序点餐_请求内容:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); - LOGGET.Info("小程序点餐_订单内容:" + response); + //LOGGET.Info("小程序点餐_订单内容:" + response); //获取成功 if (Constant.IsSuccessful(response)) { @@ -542,7 +546,7 @@ namespace POSV.Proxy.ThirdPartyOrder parameters.Add("sign", OpenApiUtils.Instance.Sign(api, parameters, ignoreParameters)); LOGGET.Info("小程序点餐_订单" + orderOperationType + "_请求:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); - LOGGET.Info("小程序点餐_订单" + orderOperationType + "_接收:" + response); + //LOGGET.Info("小程序点餐_订单" + orderOperationType + "_接收:" + response); //获取成功 if (Constant.IsSuccessful(response)) { @@ -605,7 +609,7 @@ namespace POSV.Proxy.ThirdPartyOrder LOGGET.Info("小程序点餐_订单列表 是否待处理" + _isHandle + "请求:" + JsonUtils.Serialize(parameters)); string response = HttpClientUtils.PostAsync(api, api.Url, parameters); - LOGGET.Info("小程序点餐_订单列表 是否待处理" + _isHandle + "接收:" + response); + //LOGGET.Info("小程序点餐_订单列表 是否待处理" + _isHandle + "接收:" + response); //获取成功 if (Constant.IsSuccessful(response)) @@ -704,6 +708,16 @@ namespace POSV.Proxy.ThirdPartyOrder try { var _data = this.Program_Order_Query_Bybusno(Global.Instance.Authc.StoreId, busNo); + + if (_data != null && _data.Item1 == false) + { + if (_data.Item2.Equals("小程序点餐_订单详情,请检测网络连接")) + { + LOGGET.Info($"第二次小程序订单查询<{busNo}>"); + _data = this.Program_Order_Query_Bybusno(Global.Instance.Authc.StoreId, busNo); + } + } + if (_data != null && _data.Item1) { return new Tuple(_data.Item1, _data.Item2, _data.Item3.Data); @@ -760,6 +774,15 @@ namespace POSV.Proxy.ThirdPartyOrder var _data = this.Program_Order_Confirm(orderOperationType, Global.Instance.Authc.StoreId, busNo); LOGGET.Info("订单状态结果:<{0},{1}>", (_data != null && _data.Item1), _data.Item3 != null && _data.Item3.Data != null); + if (_data != null && _data.Item1 == false) + { + if (_data.Item2.Equals("小程序点餐_订单接单,请检测网络连接")) + { + LOGGET.Info("第二次修改订单状态:<{0},{1}>", busNo, orderOperationType.ToString()); + _data = this.Program_Order_Confirm(orderOperationType, Global.Instance.Authc.StoreId, busNo); + } + } + if (_data != null && _data.Item1) { return new Tuple(_data.Item1, _data.Item2, _data.Item3.Data); @@ -1049,7 +1072,8 @@ namespace POSV.Proxy.ThirdPartyOrder } else { - LOGGET.Error("订单保存或者补单操作失败,原因:本地单号<" + orderObject.TradeNo + ">重复!,订单内容:" + JsonUtils.Serialize(orderObject)); + //LOGGET.Error("订单保存或者补单操作失败,原因:本地单号<" + orderObject.TradeNo + ">重复!,订单内容:" + JsonUtils.Serialize(orderObject)); + LOGGET.Error("订单保存或者补单操作失败,原因:本地单号<" + orderObject.TradeNo + ">重复!"); return new Tuple(false, "订单保存失败", "已成功补入 0 单"); } @@ -1688,8 +1712,13 @@ namespace POSV.Proxy.ThirdPartyOrder /// public static void sendJwWeixinMessage(string message) { + if (LOGGET == null) + { + LOGGET = NLog.LogManager.GetLogger("JuWeiAppOrderProxy"); + } try { + LOGGET.Info("巨为微信小程序接单开始"); //微信小程序订单是否开启自动接单 bool openConfirm = Global.Instance.GlobalConfigBoolValue(ConfigConstant.WEIXIN_CONFIRM_PARAMETER, false); @@ -1733,9 +1762,16 @@ namespace POSV.Proxy.ThirdPartyOrder //自动接单处理 if (orderIds.Length > 0) { + LOGGET.Info("巨为小程序订单Length>0"); + } + //20240129 subin 改为只处理服务端返回为一条订单的小程序订单 + if (orderIds.Length == 1) + { + LOGGET.Info($"巨为小程序订单Length={orderIds.Length}"); var _len = orderIds.Length; foreach (var item in orderIds) { + LOGGET.Info($"巨为小程序订单进入自动接单<{item}>开始"); if (string.IsNullOrEmpty(item)) { LOGGET.Info("订单编号为空,忽略"); @@ -1743,11 +1779,20 @@ namespace POSV.Proxy.ThirdPartyOrder } // 播放声音 - SoundUtils.PlaySound("weixin"); - LOGGET.Info("巨为小程序订单播放声音,通知自动接单"); + #region 播放声音 + //SoundUtils.PlaySound("weixin"); + //LOGGET.Info($"巨为小程序订单<{item}>播放声音,通知自动接单"); + //20240129 subin 改为异步播放 + Task.Factory.StartNew(() => + { + SoundUtils.PlaySound("weixin"); + LOGGET.Info($"巨为小程序订单<{item}>播放声音,通知自动接单"); + }); + #endregion //请求接口查询订单 + LOGGET.Info($"巨为小程序请求接口查询订单<{item}>"); var _order = _juWeiAppOrderProxy.GetOrder(item); if (_order == null) @@ -1821,19 +1866,24 @@ namespace POSV.Proxy.ThirdPartyOrder var _orderdata = getOrderLocalJuWeiOrder(_order.Item3); if (_orderdata != null) { - LOGGET.Info("巨为小程序自动接单,开始保存数据...."); var _intder = _juWeiAppOrderProxy.InsertOrder(_orderdata); if (_intder.Item1) { - LOGGET.Info("巨为小程序自动接单,数据保存成功,开始打印小票...."); - + #region 打印小票 + LOGGET.Info($"巨为小程序自动接单<{item}>,数据保存成功,开始打印小票...."); + //JuWeiAppOrderProxy.PrintOrder(_orderdata); - JuWeiAppOrderProxy.PrintOrder(_orderdata); + //20240129 subin 改为异步打印 + Task.Factory.StartNew(() => + { + JuWeiAppOrderProxy.PrintOrder(_orderdata); + }); + #endregion #region subin 20230916 订单保存成功后处理分账明细 - LOGGET.Info("巨为小程序自动接单,数据保存成功,开始保存分账明细...."); + //LOGGET.Info("巨为小程序自动接单,数据保存成功,开始保存分账明细...."); //JuWeiAppOrderProxy.DoSplitOrder(_orderdata); //Task.Factory.StartNew(() => //{ @@ -1858,6 +1908,7 @@ namespace POSV.Proxy.ThirdPartyOrder Thread.Sleep(100); + LOGGET.Info($"巨为小程序订单进入自动接单<{item}>结束"); } } } @@ -1872,7 +1923,7 @@ namespace POSV.Proxy.ThirdPartyOrder LOGGET.Error(ex, "巨为小程序自动接单发生异常"); } - + LOGGET.Info("巨为微信小程序接单结束"); } public static Tuple DoRefund(string tradeNo) @@ -2221,7 +2272,7 @@ namespace POSV.Proxy.ThirdPartyOrder if (splitStorePayLst.Count() > 0) { db.InsertBatch(splitStorePayLst); - LOGGET.Info($"保存订单的分账信息:{JsonUtils.Serialize(splitStorePayLst)}"); + //LOGGET.Info($"保存订单的分账信息:{JsonUtils.Serialize(splitStorePayLst)}"); LOGGET.Info("有需要上传的营业分账数据,isHaveUpLoadSplitPay = true"); Global.isHaveUpLoadSplitPay = true; } diff --git a/pos/POSV.Template/Bill/AllinPayControl.cs b/pos/POSV.Template/Bill/AllinPayControl.cs index ffb1d2a..23b5fa7 100644 --- a/pos/POSV.Template/Bill/AllinPayControl.cs +++ b/pos/POSV.Template/Bill/AllinPayControl.cs @@ -372,17 +372,29 @@ namespace POSV.Bill if (ticket.Item1) { this._orderObject.TradeNo = ticket.Item3; + LOGGER.Info($"订单支付失败,重新生成订单号,原单号:[{Global.Instance.BusinessPlanLog.StoreNo}_{oldTradeNo}]==>新单号:[{Global.Instance.BusinessPlanLog.StoreNo}_{_orderObject.TradeNo}]......开始"); + + foreach (var item in this._orderObject.Items) + { + item.TradeNo = this._orderObject.TradeNo; + LOGGER.Info($"订单支付失败,原订单[{oldTradeNo}]商品<{item.ShortName}:{item.Id}>,重置订单号:{_orderObject.TradeNo}"); + } + using (var db = Global.Instance.OpenDataBase) { //订单保存成功更新核销状态 - LOGGER.Info($"订单支付失败,重新生成订单号,原单号:[{Global.Instance.BusinessPlanLog.StoreNo}_{oldTradeNo}]==>新单号:[{Global.Instance.BusinessPlanLog.StoreNo}_{_orderObject.TradeNo}]......开始"); + string sql = "update pos_saoma_pay_ticket set orderNo ='{0}' where orderNo = '{1}'"; sql = string.Format(sql, string.Format("{0}_{1}", Global.Instance.BusinessPlanLog.StoreNo, _orderObject.TradeNo), string.Format("{0}_{1}", Global.Instance.BusinessPlanLog.StoreNo, oldTradeNo)); db.Execute(sql, null); - LOGGER.Info($"订单支付失败,重新生成订单号,原单号:[{Global.Instance.BusinessPlanLog.StoreNo}_{oldTradeNo}]==>新单号:[{Global.Instance.BusinessPlanLog.StoreNo}_{_orderObject.TradeNo}]......更新成功"); + + LOGGER.Info($"订单支付失败,重新生成订单号,原单号:[{Global.Instance.BusinessPlanLog.StoreNo}_{oldTradeNo}]==>新单号:[{Global.Instance.BusinessPlanLog.StoreNo}_{_orderObject.TradeNo}]......pos_saoma_pay_ticket更新成功"); + //发送支付失败,重新生成订单号事件 MsgEvent.Send(Constant.ORDER_PAYMENT_ERROR_GENERATENO, _orderObject.TradeNo); } + + LOGGER.Info($"订单支付失败,重新生成订单号,原单号:[{Global.Instance.BusinessPlanLog.StoreNo}_{oldTradeNo}]==>新单号:[{Global.Instance.BusinessPlanLog.StoreNo}_{_orderObject.TradeNo}]......更新成功"); } else { diff --git a/pos/POSV.Template/Shift/ShiftForm.cs b/pos/POSV.Template/Shift/ShiftForm.cs index a635854..fc40776 100644 --- a/pos/POSV.Template/Shift/ShiftForm.cs +++ b/pos/POSV.Template/Shift/ShiftForm.cs @@ -25,6 +25,7 @@ namespace POSV.Shift public partial class ShiftForm : BusinessForm { HandOverTicket handOverTicket = null; + bool splitPayFinished = false; public ShiftForm() { InitializeComponent(); @@ -40,7 +41,10 @@ namespace POSV.Shift #region subin 20231025 分账由实时改为交班时分账 MsgEvent.RemoveListener(Constant.SPLITPAY_UPLOAD_PROGRESS, MessageEventNotify); - MsgEvent.Receive(Constant.SPLITPAY_UPLOAD_PROGRESS, MessageEventNotify); + MsgEvent.Receive(Constant.SPLITPAY_UPLOAD_PROGRESS, MessageEventNotify); + + MsgEvent.RemoveListener(Constant.SPLITPAY_UPLOAD_FINISHED, SplitPayFinishEventNotify); + MsgEvent.Receive(Constant.SPLITPAY_UPLOAD_FINISHED, SplitPayFinishEventNotify); #endregion if (this.DesignMode) return; @@ -1155,16 +1159,12 @@ namespace POSV.Shift private void ButtonOk_Click(object sender, EventArgs e) { + #region 原始代码 var button = sender as ButtonX; try { button.Enabled = false; - //#region subin 20231025 分账由实时改为交班时分账 - //splitFrm = new SplitPayUploadForm(0, 100); - //this.Invoke(new EventJisuan(SplitHandle), sender, e); - //#endregion - if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISVERIFICATIONORDER)) { int _count = 0; @@ -1189,6 +1189,8 @@ namespace POSV.Shift } } + var shiftDateTime = DateTime.Now; + if (handOverTicket != null) { decimal handsMoney = 0.00M; @@ -1260,45 +1262,90 @@ namespace POSV.Shift #region subin 20231025 分账由实时改为交班时分账 - splitFrm = new SplitPayUploadForm(0, 100); + splitFrm = new SplitPayUploadForm(0, 1000); this.Invoke(new EventJisuan(SplitHandle), sender, e); #endregion - //刷新界面??? - - //交班打印 - this.ShowToastNotify(this, "开始打印"); - //构建收银小票模版参数 - handOverTicket.PrintType = ""; - handOverTicket.handMoney = handsMoney;//手工金额 - handOverTicket.diffMoney = difMoney;//差异金额 - bool ShiftPrint = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_SHIFPRINT, false); - - LOGGER.Info("-------------------构建小票参数------------------------------"); - LOGGER.Info(JsonUtils.Serialize(this.handOverTicket)); - var vars = ShiftHelper.BuilderTicketVariable(handOverTicket, ShiftPrint, false); - LOGGER.Info("-------------------------------------------------"); - //交班开钱箱 - bool openCashbox = false; - if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH)) + ////刷新界面??? + + ////交班打印 + //this.ShowToastNotify(this, "开始打印"); + ////构建收银小票模版参数 + //handOverTicket.PrintType = ""; + //handOverTicket.handMoney = handsMoney;//手工金额 + //handOverTicket.diffMoney = difMoney;//差异金额 + //bool ShiftPrint = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_SHIFPRINT, false); + + //LOGGER.Info("-------------------构建小票参数------------------------------"); + //LOGGER.Info(JsonUtils.Serialize(this.handOverTicket)); + //var vars = ShiftHelper.BuilderTicketVariable(handOverTicket, ShiftPrint, false); + //LOGGER.Info("-------------------------------------------------"); + ////交班开钱箱 + //bool openCashbox = false; + //if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH)) + //{ + // openCashbox = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH); + //} + //Tuple result = ShiftHelper.PrinterTicket("交班汇总", vars, true, openCashbox); + //this.ShowToastNotify(this, string.Format("{0}", result.Item2)); + ////是否交班 + //Global.isHandOver = false; + //StoreBusinessUtils.SaveOperationLog("103", "班次:" + handOverTicket.ShiftNo); + ////关闭当前秤 + //MsgEvent.Send(Constant.CURRENTSTEELYARD_STATUS_CHANGE, "close"); + ////两秒退出系统 + //System.Threading.Thread.Sleep(2000); + //OnCloseTouchClick(sender, e); + ////交班后重启收银程序 + //Global.Instance.Restart = true; + //Application.ExitThread(); + while (splitPayFinished || DateTime.Now.Minute > shiftDateTime.AddMinutes(20).Minute) { - openCashbox = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH); + if (splitPayFinished) + { + LOGGER.Info("交接班分账,splitPayFinished=true"); + } + else if (DateTime.Now.Minute > shiftDateTime.AddMinutes(20).Minute) + { + LOGGER.Info("交接班分账,超出规定分账时长<20>分钟"); + } + splitPayFinished = false; + shiftDateTime = shiftDateTime.AddMinutes(100); + //刷新界面??? + + //交班打印 + this.ShowToastNotify(this, "开始打印"); + //构建收银小票模版参数 + handOverTicket.PrintType = ""; + handOverTicket.handMoney = handsMoney;//手工金额 + handOverTicket.diffMoney = difMoney;//差异金额 + bool ShiftPrint = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_SHIFPRINT, false); + + LOGGER.Info("-------------------构建小票参数------------------------------"); + LOGGER.Info(JsonUtils.Serialize(this.handOverTicket)); + var vars = ShiftHelper.BuilderTicketVariable(handOverTicket, ShiftPrint, false); + LOGGER.Info("-------------------------------------------------"); + //交班开钱箱 + bool openCashbox = false; + if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH)) + { + openCashbox = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH); + } + Tuple result = ShiftHelper.PrinterTicket("交班汇总", vars, true, openCashbox); + this.ShowToastNotify(this, string.Format("{0}", result.Item2)); + //是否交班 + Global.isHandOver = false; + StoreBusinessUtils.SaveOperationLog("103", "班次:" + handOverTicket.ShiftNo); + //关闭当前秤 + MsgEvent.Send(Constant.CURRENTSTEELYARD_STATUS_CHANGE, "close"); + //两秒退出系统 + System.Threading.Thread.Sleep(2000); + OnCloseTouchClick(sender, e); + //交班后重启收银程序 + Global.Instance.Restart = true; + Application.ExitThread(); } - Tuple result = ShiftHelper.PrinterTicket("交班汇总", vars, true, openCashbox); - this.ShowToastNotify(this, string.Format("{0}", result.Item2)); - //是否交班 - Global.isHandOver = false; - StoreBusinessUtils.SaveOperationLog("103", "班次:" + handOverTicket.ShiftNo); - //关闭当前秤 - MsgEvent.Send(Constant.CURRENTSTEELYARD_STATUS_CHANGE, "close"); - //两秒退出系统 - System.Threading.Thread.Sleep(2000); - OnCloseTouchClick(sender, e); - //交班后重启收银程序 - Global.Instance.Restart = true; - Application.ExitThread(); - } } catch (Exception ex) @@ -1309,7 +1356,7 @@ namespace POSV.Shift { button.Enabled = true; } - + #endregion } private void OnControlBoxKeyboardClick(object sender, EventArgs e) @@ -1350,166 +1397,54 @@ namespace POSV.Shift private void SplitHandle(object sender, EventArgs e) { + var sDate = DateTime.Now.ToString("yyyy-MM-dd 00:00:00"); + var eDate = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd 00:00:00"); + var count = 0; + using (var db = Global.Instance.OpenDataBase) + { + count = db.Query($"where isSplited = 0 and finishDate between '{sDate}' and '{eDate}';").Count(); + } + + splitFrm.ProgressBar1.Maximum = count * 2 * 3; splitFrm.Show(this); splitFrm.setPos(0);//设置进度条位置0% //需要加载进度的内容 var isException = SplitPayUtils.Instance.Order2Split(DateTime.Now); if (isException) - { + { LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]转分账数据失败↓↓↓"); - DialogForm dialog = new DialogForm("提示信息", $"日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]数据处理失败"); - dialog.Show(); + //DialogForm dialog = new DialogForm("提示信息", $"日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]数据处理失败"); + //dialog.Show(); } - splitFrm.setPos(20);//设置进度条位置0% + //splitFrm.setPos(200);//设置进度条位置0% + splitFrm.setPos(count * 2);//设置进度条位置0% #region 上传分账记录 - var result1 = SplitPayUtils.Instance.SplitData2Server(DateTime.Now); + var result1 = SplitPayUtils.Instance.SplitData2Server(DateTime.Now, count * 2); if (result1.Item1) { LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]分账数据上传完成完成↓↓↓"); } else - { + { LOGGER.Info($"↓↓↓日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]分账数据上传完成失败↓↓↓"); - DialogForm dialog = new DialogForm("提示信息", $"日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]数据上传失败"); - dialog.Show(); + //DialogForm dialog = new DialogForm("提示信息", $"日订单[{DateTime.Now.ToString("yyyy-MM-dd")}]数据上传失败"); + //dialog.Show(); } - splitFrm.setPos(100);//设置进度条位置0% + //splitFrm.setPos(1000);//设置进度条位置0% + splitFrm.setPos(count * 2 + count * 3);//设置进度条位置0% Thread.Sleep(100); splitFrm.Close(); + + MsgEvent.Send(Constant.SPLITPAY_UPLOAD_FINISHED, true); #endregion + } - //#region 交接班 - //if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISVERIFICATIONORDER)) - //{ - // int _count = 0; - // //核销提示 - // using (var db = Global.Instance.OpenDataBase) - // { - // using (var transaction = db.GetTransaction()) - // { - // string querySql = "select * from pos_saoma_pay_ticket where payStatus ='{0}'"; - // querySql = string.Format(querySql, 0); - // _count = db.Query(querySql).Count(); - // } - // } - // if (_count > 0) - // { - // DialogForm dialog = new DialogForm("操作提醒", "您有未核销订单,是否继续交班?", MessageBoxIcon.Warning, MessageBoxButtons.OKCancel); - // if (DialogResult.OK != dialog.ShowDialog()) - // { - // return; - // } - - // } - //} - - //if (handOverTicket != null) - //{ - // decimal handsMoney = 0.00M; - // decimal difMoney = 0.00M; - - // string shiftNo = OrderUtils.Instance.GenerateShiftNo(); - // handOverTicket.Id = IdWorkerUtils.Instance.NextId(); - // handOverTicket.No = shiftNo; - // handOverTicket.Memo = memoTextBox.Text; - - // handOverTicket.ShiftNo = Global.Instance.BusinessPlanLog.No; - - // if (handOverTicket.Detail != null) - // { - // foreach (HandOverDetail handOverDetail in handOverTicket.Detail) - // { - // handOverDetail.Id = IdWorkerUtils.Instance.NextId(); - // handOverDetail.TenantId = handOverTicket.TenantId; - // handOverDetail.BusNo = handOverTicket.No; - // handOverDetail.PosNo = Global.Instance.Authc.PosNo; - // handOverDetail.DeviceIp = DeviceUtils.Instance.IPAddress; - // handOverDetail.DeviceMac = DeviceUtils.Instance.MacAddress; - // handOverDetail.DeviceName = DeviceUtils.Instance.ComputerName; - // handOverDetail.HandsMoney = handOverDetail.SumMoney; - // if ("01".Equals(handOverDetail.PayModeNo)) - // { - // handsMoney = handOverDetail.SumMoney + handOverTicket.Inmoney - handOverTicket.Outmoney; - // //人民币金额计算方式 - // handOverDetail.HandsMoney = handsMoney; - // difMoney = 0.00M; - // } - - // handOverDetail.StoreId = handOverTicket.StoreId; - // handOverDetail.TicketId = handOverTicket.Id; - // } - // } - - // if (handOverTicket.Pay != null) - // { - // foreach (HandOverPay handOverPay in handOverTicket.Pay) - // { - // handOverPay.Id = IdWorkerUtils.Instance.NextId(); - // handOverPay.TenantId = handOverTicket.TenantId; - // handOverPay.BusNo = handOverTicket.No; - // handOverPay.PosNo = Global.Instance.Authc.PosNo; - // handOverPay.DeviceIp = DeviceUtils.Instance.IPAddress; - // handOverPay.DeviceMac = DeviceUtils.Instance.MacAddress; - // handOverPay.DeviceName = DeviceUtils.Instance.ComputerName; - // handOverPay.StoreId = handOverTicket.StoreId; - // handOverPay.TicketId = handOverTicket.Id; - // } - // } - // saveHandOver(handOverTicket); - - - // var uploadObject = new UploadHandoverObject(); - // uploadObject.Id = IdWorkerUtils.Instance.NextId(); - // uploadObject.TenantId = this.handOverTicket.TenantId; - // uploadObject.TradeNo = this.handOverTicket.No; - // uploadObject.SyncStatus = 0; - // uploadObject.HandOverTicket = this.handOverTicket; - // uploadObject.PrintStatus = HandOverPrintStatus.WAIT; - // uploadObject.UploadErrors = 0; - // uploadObject.PrintTimes = 0; - // saveHandOverObject(uploadObject); - // //有要上传的数据 - // LOGGER.Info("有需要上传的交班数据,isHaveUpLoadShift=true"); - // Global.isHaveUpLoadShift = true; - - // //刷新界面??? - - // //交班打印 - // this.ShowToastNotify(this, "开始打印"); - // //构建收银小票模版参数 - // handOverTicket.PrintType = ""; - // handOverTicket.handMoney = handsMoney;//手工金额 - // handOverTicket.diffMoney = difMoney;//差异金额 - // bool ShiftPrint = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_SHIFPRINT, false); - - // LOGGER.Info("-------------------构建小票参数------------------------------"); - // LOGGER.Info(JsonUtils.Serialize(this.handOverTicket)); - // var vars = ShiftHelper.BuilderTicketVariable(handOverTicket, ShiftPrint, false); - // LOGGER.Info("-------------------------------------------------"); - // //交班开钱箱 - // bool openCashbox = false; - // if (Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH)) - // { - // openCashbox = Global.Instance.GlobalConfigBoolValue(ConfigConstant.CONFIG_CASHIER_ISSHIFTOPENCASH); - // } - // Tuple result = ShiftHelper.PrinterTicket("交班汇总", vars, true, openCashbox); - // this.ShowToastNotify(this, string.Format("{0}", result.Item2)); - // //是否交班 - // Global.isHandOver = false; - // StoreBusinessUtils.SaveOperationLog("103", "班次:" + handOverTicket.ShiftNo); - // //关闭当前秤 - // MsgEvent.Send(Constant.CURRENTSTEELYARD_STATUS_CHANGE, "close"); - // //两秒退出系统 - // System.Threading.Thread.Sleep(2000); - // OnCloseTouchClick(sender, e); - // //交班后重启收银程序 - // Global.Instance.Restart = true; - // Application.ExitThread(); - - //} - //#endregion + protected virtual void SplitPayFinishEventNotify(object sender, MsgEventArgs args) + { + splitPayFinished = true; + LOGGER.Info("交接班分账完成"); } #endregion } diff --git a/pos/POSV.Template/Shift/SplitPayUploadForm.Designer.cs b/pos/POSV.Template/Shift/SplitPayUploadForm.Designer.cs index 2601939..36d9ff2 100644 --- a/pos/POSV.Template/Shift/SplitPayUploadForm.Designer.cs +++ b/pos/POSV.Template/Shift/SplitPayUploadForm.Designer.cs @@ -38,6 +38,7 @@ namespace POSV.Shift this.ProgressBar1.Dock = System.Windows.Forms.DockStyle.Top; this.ProgressBar1.Location = new System.Drawing.Point(0, 0); this.ProgressBar1.Margin = new System.Windows.Forms.Padding(6); + this.ProgressBar1.Maximum = 1000; this.ProgressBar1.Name = "ProgressBar1"; this.ProgressBar1.Size = new System.Drawing.Size(534, 42); this.ProgressBar1.TabIndex = 1; @@ -60,7 +61,7 @@ namespace POSV.Shift // // SplitPayUploadForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F); + this.AutoScaleDimensions = new System.Drawing.SizeF(14F, 31F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(534, 69); this.Controls.Add(this.labelX1);