From 51d2310772f5749c01bb391b261da8368bf056f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Tue, 5 Dec 2023 12:30:50 +0500 Subject: [PATCH 1/6] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D1=88=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BD=D0=B0=20=D1=81=D1=83=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=80=D0=B0=D0=BF=D0=BE=D1=80=D1=82?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DailyReport/DailyReportTemplate.xlsx | Bin 15795 -> 15765 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportTemplate.xlsx b/AsbCloudInfrastructure/Services/DailyReport/DailyReportTemplate.xlsx index 38d1bdba3d3bc64d6eb48c7b784278481eed8ec9..5c2cbd12263b5e6ef5d159220cff67b02b06e45e 100644 GIT binary patch delta 7235 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 delta 7269 zcmYLOWmr_v)NL+;?ONMbf=`GNF(7ODJ5M>OG-C<=)KQ( z&#!aNUhi7(e)nGMS-<#k_b!r(zpc@!U7WV^&e8S2(Rm+s{fnUM^^JHx%sxT*?UZ-Z<2i{WISIeD%cV3b~@KFj%faDRTU7Q%r0rVp#I!_3H*yr$1fwj6n^a;vcty8u{nV?#Uo4-Fneh_g(IM zsl@~LY#FN4_{PWrMqt!f;11^(w`_Xw$~*;QW8e0i_jW$Tlb$EJyxYJk?`u&R`j;DP zzer5pt~5|NyjT!Tat`iASrLH_Ap1>DyH!0sdeuA5c9s4PW)dC*?svlGYhru5pfs#M zq|Q{X^pXZ-SVUk=JC55SgC)7~Np7W_aD8{=GnrPsFZT+CF(QzO4;b7u{pM4^Vg~h z`~wPnU5uB<6{Es&J_V|+H{qri6#S{8rP0#vM}cL5)7a61p^^EUSFGX%M-{AxOytV9 z339Xjt}NN-F+l#@$-C74i2@o(14riEq`FGN>JXb{By2l5t(bIND`9^nwXm|v zt_@VLLy=MD>C8Fp_S@0kpHAx~N6}N=&bNOS-|8v^NQGKK+$;S+RU5>{&TUiE4UWHU zkH#Yyl)1v>WeVGTQ_-NEZna#uNWc@qvFJ!VBi;PXwKs>#vH*_7A^FNEr&lmCJf-8j z`SXOV5?+O#yHI{^FMHCfRjR$>D2qOAQ&0?784HEm*$d$!thtFHy*LJ87(&4W(p^xi zUYn!ivr`T=v_CasKE5SaMe0nD{Y4YXHN?ep0PoqTYZ)?C0qMw4t8}%OYx*;;AEM;Z zWhvkg@M#}x0rAD7wyuF{X&hog68vvw$}#x+I6g?D7}>*?)%$se?9y^Wo7)A==Ec&_ z-lT`&>ZEW;euPG%Wsg6lP#a9=j3RFlZa^+DM7bkD3X4~ z)6i+Rq&FEzW#;0lp`q@lZ&LN!bWg1ZTXwg+RN~Q40ZLq>k=JO!Cm_`CJrEIaLU)f% zu%pU`>t~z79tsk#VJ_7t`A1Y|`mWWXeKEW<2D%}M1$%5&srvF!b*g)0n=xYUJ=A~B*q{Ps!Itqi*B-{K8r|vm> z8HCvou-YNm=jW=PHzn?(ERvdo{+LeEVg;E=?}52w$`hGza2cA>+)EC zN`&3!uA#fa;Y0$?)}A;C*L<14PgiXMhix%vmOGH_R}kDD`VRQzQ>YP829tEzYwf* z!S4I?@U`&AW^6Cf{v1A9wEi8!xEM3u)R8)?7gKSsgac1NJx0+{x6)5pj$=B-S{W%G zV6FCO<;=M;4FgA^zOWX(Mo?I1jAj&TT&;Ox(SphaJY*^*p?v1V*@CTS^|Yv1A+ zbxK2L(9P;=B}P;1_H&8(SCa3H7;uUrx$_NPkt8ON^z_$pd7}x#U{9NKHFKZqtfh8~ z>qE)PCiV1@o3)x;iTEU~o`4KgvKL(d7g+BBDtcIMktj6pA>e-Nrs)unez>?>IQbHl zU|-(@>Ryg&coul>-XV(@oFk~R{W@tcJJQUVuRv>j*jRl1^~IXXlEoK!y>_?m2*k(b zHEkJ7CZ(Nw35Tgt43=&REN6K!DCnNE5-I*iP0gXjIju$3{`AKHU}0x5A65yhbO4SX zlK2<#@wOJuyZ8XI_UZP>lWb(4?(x(;Of9kSu5DZh2B-_y%J$VC+VfE*ht*APY14RW zrt&9yOy>b@r7IqI9X89`N|lohFq5W^EZEQ<<^DJGt$UA|J(gOpAxlyB5x&9`dG^bL zz?Wp=vkP%ko}o$FmI*)4afxw~pNbI8-}_A-Js`n#2}!WVU33U( zzFuBc)ox%gU9vlM7|_}R^Ea;&9h%yAl@#CmY!b5&GqrJi-s^g^gugMQ+txVu-I;f5 zrg8z{db5T2aMuP0?$VxH81B*nqO@c&PB>IB(Qo_l3;RpWlXIqiri;U(5tVHSZnbK| z-K;B8pjy^l#A_FE3w_?&a&X$Z1m3dkYG?aHCFWvicjMe{8DI`eL-tucYQgn%!G z0jMcTDTgaHhO!mtwlAj)cI^AqlCKb+S3Z{MsYNuaTcgGjw=&g7UPVC_u*M@BZjWKP zqano9?c|wfee3em`+(is4XU>obCu(;3W6(Nfx z!1OB1YBw_LCA|c8ZOa*`LAejbKtPm_^Jm#ND4$Ho@$VGoJ(yg;;xw zX|yW)Gb4(OPNNiejI1T=<@AiPPbZY#FSDr&I29|ax+-w}X|PPhYr9j(xYDK4&nJJi zO7Q(c)2*MXrTYVKw&Wwz|##9AcMi+Qlz%572W7xifb zp2Y4J{Gjr?9kX( z@n>P!C)-Q{D|8H-{cL(PdfV+2ywZ2G4IP!~3gNqo;fzG1F1YM|Ong*@7grDtmc)cR z6%~e~P-~T6j6n&#{+Q+I3Xl(p2@0!N0|`CK$n*w0XO3Q+k9IGZm=e7q0*?&jREAMT z$)Nl|R4CPB{DJ=WVt-u{KsCj0$jzsUPyC#O$x?!ZS~W0(kw+3Faq$vxn2N%get7aW z1ZEQcA`$Ko7NAztqR;G{WbzstsH}vmPQ1DM5EgW$Ho^c41Z^x0h32Ea-_Tt3iHW@S zCsTStGRQpqq~pMH;_QK*!850r*pljy8HgaSqWL!PeKHfj^*ybysuY$)p>4&cPIrMo zAfydb-j7z=QTg|4m%ezG&LnRZHKsy)mVU)TdnTSpwv&cTCQ2-INM?c9t=fLjkR3#nu4tth+Kov zXCfUJ)7J-?x|FT!C?-(KQeW7+=R_-9#MVdyBK*XROrqn?q(u^W&*|%Zo5qIgurXJK zXuP7>PQv*?PpLS>^$A1SC+0mU<-qo5w^%NR6`Y%iJJO$z`4ob7a5+9@e{+hjc=W83 z-}=iYU&jM5TzXZrbJdWyZ*T|53*R1y-V zA7f;Ys^Tp8J7x6;L}CS3b5FZ@R3PjHq?=@I_$Up+2GlKj(%4^K$2X>9QDZ>BVEf_^4rT?Px5 zZSy}0hA4QA6c((^{u3MkG)N%CkBY9Qc|h?~8V&QAS;L?GnV zrFe*NpNyfTKcEGx%BGfi*X_LZW(3nGBX9g-HFlX$c*s2%J%E?*c`nt-8l4$u^;sQ_Rp?^Y50IGH3U6!M2jJ0mRMG0gD~Iq>Ds*)!yyN1?ZDpJBa zj|TsB33ad#50ik$M989VC_H6DOvEPX8BkSV5hX)$;ycz!GIhm1yk%qUe;)m~LxFz; z)%H0{1GDQ&#gd6h{s%}(Ze=Z=R#fn z%lD#~q|GflCFaP=9jq8 zn$AdpASeezr}ij8Rkg?Ek|Zl*z?>Re$S%p>lVXyf9M4;sgx1s{W7q>lnZzQ9Flv>P zk3rX6%P30W2uQ(ZptMqR6;Ny&5>#K`KQrD;w=nCl|8hD!eS+UMX^*kHNQjv6amnUf zS5S^9D*Cxnog>$PzzdhFXeK5gJSY>*3H+By{}QRMAXDCsN&-JWpZKR3olw5_T}j0L z@wYf83ZBfYo2^XIs_hjijWrlpVK&^uP>6y8$p2GcuxUJtU6E4>cYDdptOO20miDns zGa27deb`_Edrgv&GtNgJ`9;}U&$Ew%a=HX@TC$oNH?|L2a$j&@JkEQYj6G}-f%hGU z6`<;#9|J)W57I(u#c2S4z`94X%{_KT7I zG&TBu8HmR%-8Z7~e(?3C)d#B6U$zT?-Jz@CN2=Rpm4riEhcPcf6OC**Zc-MacYqpQ zapsw3>&gl1q)=zSET2Mmy2_X|Oe9WG$4{oER9l2g(XQh9-N|0=H8WYcTf$*I36K1& z%n!lWX6tRSbSpMYwTA+q^(9y-n9@{Z^35w`Nf)^pr+>YFJv{nq;<5pqp(mpN*v+sd zERK7z&$oS%XW>aPbrC+^eBaAcbgfl9sQSB&D`bcu7{4Xf(Eq^RNvTTd!2aXsMd~RE z@Up;;RA5iHzVYh*8g`eQ)BsxZE4ncR&l zEolCLk%K%Wi%ke(r^_M9ti&h_d~IOU%X-1!6<+|#A4^*ecHf#RlbADn9<{{AN8f*F zAKq_P%^BH8&n(XYak(?!h$uTIQn=Xg`w*6BvNT-Q>Xq~15lFcjaC$JE@9|;MKX?+> zp}2-8iGK8vkdb-HP3S58d*Qg3c%fOz+}cqhwc)QBYQyo-rn_9*YwZ_+Im%2ttKP%7 z7umB!<0_IqhBQ=k0RbqL{x_Ao`_90b<;?<$F@@hv;oX_D#l!s>@a2AV=HcdgWuGin zM+Bl3J4K0BiNiN?*zg=&49hV>PoaO>%>JU4m!%hm0km%i_>QWDIj|_v*9KtOUR)0B z94LNtnx#&jdO~uoy4VLSFKLgkd|trlpT$TG$D}nEJt>`ckz2XQ50)K++^iAT z(E!&$6@{QXjgGDWTn;CM@4l#a@m*x2vn=|EI!!dMT*oy>yL3h&5+x2!5j2PIB*)J__;sGGWor+D>mknXYAju~6*W(95EAUKP;l zC*?0c2;8T${}uwAfg{nYgR}JuS(2KgmG17W!{v_eCx`c^*GTZD=s~TL2(|Q2Q?DB> zwvWA5Xo387=Awl6Fnz)J()1eRDyik2PCcq%FFvI6S+|EVG<;|BHwaRcF53Q{Rh^E?oF4I-iLCpc`nFER#<*6nwzOd&;_cEV>;3 zaNL*UYDrin%66+~)@Vab8Bb(+2nae?Y;mXK{HN*qZ!d%C#(2{bAId`F)s=S}8J<%= zC2z8WAa4@Mbzy5t;GAcrqDa*yT2USkVcy24Jk@?FCl+hX5`Z5U>CO?x= zHHN!{P1J7%vT>f2*ysc;KEI&Uv?&(G$IG-EfsyXwU+aFsGY7bCi)p6STPrw4#iYTJ z%J=$*-;yLaj&dJj)L4pSXwZM`*C*jFx@*)XJyARTL88t_6^FBK5RA&EOF_mfPEAt~ zw_F`pqNK{5njJ@^lHZ0qDHJ3F9r*1M>Um1T^2RRIvp8u|mu!FgM{MJyqU7TUpQ2=I zTCFGa6Jts?2(WzfHX>+hKu7tw=Qn{lA8TdRcO(y{2aSk?dB4bBsfgKbp6GRPDQfoA zY>?|gWDZI>s8Ee715{rp@%g8Riw3{p7EwE@+4N~$cM|1~6u%}iJOk6#joL`Nz}o{Q zKmTM&$+q?Xk=UM4q_CuvQmmz`e2ff>ER37go-8^-P3uL|)GdT1sqedw$F0*Y9w5AvKijZWMZCdW;+hd1@h9HMEtBD$CQa`S-8)3mB*}gEg=f;zPujY5p)lZ&c$PlK zJ)ydm-dAB6Quq#CHG;^GSH_Um14nl%;=?8YgH*Ar{lI91QeR@M1gbGdzVTCG@1IsS zjbVnb+gF)K5-Am%dsWdWC#ex7M~*M-#%mu%N9kiU;PPl45lLkV8sh&{@!-Q)Tg}&J zRirMr4nCEuA3^;cHCqG6y;dh$^ASo`q3N1@#g_PP3U#uEGEm_@pUXe*Td=xPpKAGO>i3~7W=tRVXEjV<1 zg^yozAFZ7)IdqtfrkO+vn48ly%`~WEQw!y6Zk)g$$o?IUp~gsKr!#$gZ3pK=;Q=+~JqvTv5)>c>;ynE_F;8cIF7Ov2L&u;V45CxxngMSt0=G*lQ2#Mw6tQV1Qnp;v3P3;MnAMa z$v!80_RePY2M3jt-z57%GB<)Q?jYoOQJvF5Rn7&!RY3HLs5bANo}Nvs8J3(44;nGZ z+uk%|?Kd+|^`?yDYFrcc`W^ocnFI9H6$7)M3H_z~qQ!>O{U4)`x^w$He9T_#W`?1) z_kQk-qt|V6^58u52lea`JvF`7vi>A)*lesuR*#EomgJVkZ zKl}gFMl&QN^2htX|2+qAeJRdoe+8F&f`p`tjD$q^zrn{hI(Vj(%#$?uoRl>3ga~|0 VgdGl+=6GTXca&yC7nk^J`+wgOw1@xz From d52dbf403607112cf3d64c0e2ae52a5c06612f40 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Tue, 5 Dec 2023 16:15:42 +0500 Subject: [PATCH 2/6] Fix DetectorDrilling.IsValidOperationDetectorResult --- .../Detectors/DetectorDrilling.cs | 4 +-- .../Detectors/DetectorDrillingTests.cs | 29 +++++++++++-------- .../PeriodicBackgroundWorkerTest.cs | 2 +- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs index b9c7d201..56aa2fd4 100644 --- a/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs +++ b/AsbCloudInfrastructure/Services/DetectOperations/Detectors/DetectorDrilling.cs @@ -12,7 +12,6 @@ public class DetectorDrilling : DetectorAbstract public const string ExtraDataKeyHasOscillation = "hasOscillation"; public const string ExtraDataKeyDispersionOfNormalizedRotorSpeed = "dispersionOfNormalizedRotorSpeed"; public const string ExtraDataKeyAvgRotorSpeed = "avgRotorSpeed"; - public const string ExtraDataKeyIsAfbEnabled = "isAfbEnabled"; protected override bool DetectBegin(DetectableTelemetry[] telemetry, int position, DetectedOperation? previousOperation) { @@ -45,7 +44,8 @@ public class DetectorDrilling : DetectorAbstract => CalcRop(telemetry, begin, end); protected override bool IsValidOperationDetectorResult(OperationDetectorResult operationDetectorResult) => - Math.Abs(operationDetectorResult.Operation.DepthStart - operationDetectorResult.Operation.DepthEnd) > 0.01; + base.IsValidOperationDetectorResult(operationDetectorResult) + && (operationDetectorResult.Operation.DepthEnd - operationDetectorResult.Operation.DepthStart) > 0.01; protected override (int Begin, int End) RefineEdges(DetectableTelemetry[] telemetry, int begin, int end) { diff --git a/AsbCloudWebApi.Tests/Services/DetectedOperations/Detectors/DetectorDrillingTests.cs b/AsbCloudWebApi.Tests/Services/DetectedOperations/Detectors/DetectorDrillingTests.cs index 4dc797fb..8a61dd15 100644 --- a/AsbCloudWebApi.Tests/Services/DetectedOperations/Detectors/DetectorDrillingTests.cs +++ b/AsbCloudWebApi.Tests/Services/DetectedOperations/Detectors/DetectorDrillingTests.cs @@ -17,10 +17,10 @@ public class DetectorDrillingTests : DetectorDrilling public void DefineDrillingOperation_ShouldReturn_DrillingRotor(DetectableTelemetry[] telemetryRange) { //act - var result = GetIdOperation.Invoke(telemetryRange, 0, telemetryRange.Length); + var result = GetSpecificInformation(telemetryRange, 0, telemetryRange.Length); //assert - Assert.Equal(idRotor, result); + Assert.Equal(idRotor, result.IdCategory); } [Theory] @@ -28,10 +28,10 @@ public class DetectorDrillingTests : DetectorDrilling public void DefineDrillingOperation_ShouldReturn_DrillingSlide(DetectableTelemetry[] telemetryRange) { //act - var result = GetIdOperation.Invoke(telemetryRange, 0, telemetryRange.Length); + var result = GetSpecificInformation(telemetryRange, 0, telemetryRange.Length); //assert - Assert.Equal(idSlide, result); + Assert.Equal(idSlide, result.IdCategory); } [Theory] @@ -39,10 +39,13 @@ public class DetectorDrillingTests : DetectorDrilling public void DefineDrillingOperation_ShouldReturn_DrillingSlideWithOscillation(DetectableTelemetry[] telemetryRange) { //act - var result = GetIdOperation.Invoke(telemetryRange, 0, telemetryRange.Length); + var result = GetSpecificInformation(telemetryRange, 0, telemetryRange.Length); //assert - Assert.Equal(idSlideWithOscillation, result); + var oHasOscillation = result.ExtraData[ExtraDataKeyHasOscillation]; + + Assert.Equal(idSlide, result.IdCategory); + Assert.True(oHasOscillation is bool hasOscillation && hasOscillation); } [Fact] @@ -53,10 +56,11 @@ public class DetectorDrillingTests : DetectorDrilling { Operation = new DetectedOperation { - IdReasonOfEnd = IdReasonOfEnd_PressureIsLo, DepthStart = 5000, - DepthEnd = 6000 - } + DepthEnd = 6000, + DateStart = System.DateTimeOffset.Now.AddMinutes(-1), + DateEnd = System.DateTimeOffset.Now, + } }; //act @@ -74,10 +78,11 @@ public class DetectorDrillingTests : DetectorDrilling { Operation = new DetectedOperation { - IdReasonOfEnd = IdReasonOfEnd_PressureIsLo, DepthStart = 5000, - DepthEnd = 5000 - } + DepthEnd = 5000, + DateStart = System.DateTimeOffset.Now.AddMinutes(-1), + DateEnd = System.DateTimeOffset.Now, + } }; //act diff --git a/AsbCloudWebApi.Tests/UnitTests/Background/PeriodicBackgroundWorkerTest.cs b/AsbCloudWebApi.Tests/UnitTests/Background/PeriodicBackgroundWorkerTest.cs index 13c5f142..fced6864 100644 --- a/AsbCloudWebApi.Tests/UnitTests/Background/PeriodicBackgroundWorkerTest.cs +++ b/AsbCloudWebApi.Tests/UnitTests/Background/PeriodicBackgroundWorkerTest.cs @@ -86,7 +86,7 @@ public class PeriodicBackgroundWorkerTest service.Add(badWork, TimeSpan.FromSeconds(2)); service.Add(goodWork, TimeSpan.FromSeconds(2)); - await Task.Delay(TimeSpan.FromMilliseconds(20)); + await Task.Delay(TimeSpan.FromMilliseconds(128)); //assert Assert.Equal(expectadResult, result); From cea93f2541d68d43711671d7ffecafc66dd8ead7 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 7 Dec 2023 09:08:25 +0500 Subject: [PATCH 3/6] Add Migration start message --- AsbCloudDb/EFExtensionsInitialization.cs | 5 +++++ AsbCloudInfrastructure/Startup.cs | 7 ------- AsbCloudWebApi/DependencyInjection.cs | 3 ++- AsbCloudWebApi/Program.cs | 2 -- 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/AsbCloudDb/EFExtensionsInitialization.cs b/AsbCloudDb/EFExtensionsInitialization.cs index 7c265b82..7f9ba0ea 100644 --- a/AsbCloudDb/EFExtensionsInitialization.cs +++ b/AsbCloudDb/EFExtensionsInitialization.cs @@ -2,6 +2,7 @@ using System; using System.Linq; using Microsoft.EntityFrameworkCore.Infrastructure; +using System.Diagnostics; namespace AsbCloudDb { @@ -12,12 +13,16 @@ namespace AsbCloudDb db.SetCommandTimeout(TimeSpan.FromMinutes(5)); if (db.EnsureCreated()) { + Trace.TraceInformation("Creating DB"); + Console.WriteLine("Creating DB"); db.CreateMigrationTable(); db.WriteMigrationsInfo(); } else { + Trace.TraceInformation("Migrating DB"); db.SetCommandTimeout(TimeSpan.FromMinutes(20)); + Console.WriteLine("db.Migrate()"); db.Migrate(); } } diff --git a/AsbCloudInfrastructure/Startup.cs b/AsbCloudInfrastructure/Startup.cs index 4913b392..3af21638 100644 --- a/AsbCloudInfrastructure/Startup.cs +++ b/AsbCloudInfrastructure/Startup.cs @@ -38,13 +38,6 @@ namespace AsbCloudInfrastructure backgroundWorker.Add(MakeMemoryMonitoringWork(), TimeSpan.FromMinutes(1)); var notificationBackgroundWorker = provider.GetRequiredService(); - - Task.Delay(1_000) - .ContinueWith(async (_) => - { - await backgroundWorker.StartAsync(CancellationToken.None); - await notificationBackgroundWorker.StartAsync(CancellationToken.None); - }); } static Work MakeMemoryMonitoringWork() diff --git a/AsbCloudWebApi/DependencyInjection.cs b/AsbCloudWebApi/DependencyInjection.cs index 788c661d..8f25ee81 100644 --- a/AsbCloudWebApi/DependencyInjection.cs +++ b/AsbCloudWebApi/DependencyInjection.cs @@ -81,7 +81,8 @@ namespace AsbCloudWebApi c.IncludeXmlComments(xmlPath, includeControllerXmlComment); c.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, "AsbCloudApp.xml"), includeControllerXmlComment); - c.AddSignalRSwaggerGen(options => { + c.AddSignalRSwaggerGen(options => + { options.DisplayInDocument("signalr"); options.UseHubXmlCommentsSummaryAsTagDescription = true; options.UseHubXmlCommentsSummaryAsTag = true; diff --git a/AsbCloudWebApi/Program.cs b/AsbCloudWebApi/Program.cs index 864b9600..e1b6445b 100644 --- a/AsbCloudWebApi/Program.cs +++ b/AsbCloudWebApi/Program.cs @@ -7,8 +7,6 @@ namespace AsbCloudWebApi { // Uncomment next line to find wired exceptions by tracing. //static TraceListenerView trace4debug = new TraceListenerView(); - enum A { a = 1 << 2 } - public static void Main(string[] args) { var host = CreateHostBuilder(args).Build(); From f325accca195a240b45c38f529779eb7aa8fc5fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 8 Dec 2023 13:11:28 +0500 Subject: [PATCH 4/6] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B8=D0=BC?= =?UTF-8?q?=D0=BF=D0=BE=D1=80=D1=82=D0=B0=20=D0=BE=D0=BF=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=D1=86=D0=B8=D0=B9=20=D0=BF=D0=BE=20=D1=81=D0=BA=D0=B2=D0=B0?= =?UTF-8?q?=D0=B6=D0=B8=D0=BD=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/WellOperationController.cs | 86 +++++++++++++++---- 1 file changed, 70 insertions(+), 16 deletions(-) diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index 45db3f0e..cab7e32c 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -16,6 +16,7 @@ using AsbCloudApp.Data.WellOperationImport; using AsbCloudApp.Services.WellOperationImport; using AsbCloudApp.Data.WellOperationImport.Options; using AsbCloudApp.Exceptions; +using AsbCloudDb.Model; namespace AsbCloudWebApi.Controllers { @@ -344,46 +345,88 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } - /// - /// Импорт операций из excel (xlsx) файла. Стандартный заполненный шаблон + /// Импорт фактических операций из excel (xlsx) файла. Стандартный заполненный шаблон /// /// id скважины - /// Параметры для парсинга файла /// Коллекция из одного файла xlsx + /// Удалить операции перед сохранением /// /// - [HttpPost("import/default")] + [HttpPost("import/fact/default/{deleteBeforeInsert:bool}")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status204NoContent)] [Permission] - public Task ImportDefaultExcelFileAsync(int idWell, - [FromQuery] WellOperationImportDefaultOptionsDto options, + public Task ImportFactDefaultExcelFileAsync(int idWell, [FromForm] IFormFileCollection files, - CancellationToken cancellationToken) => ImportExcelFileAsync(idWell, files, options, - (stream, _) => wellOperationDefaultExcelParser.Parse(stream, options), - cancellationToken); + bool deleteBeforeInsert, + CancellationToken cancellationToken) + { + var options = new WellOperationImportDefaultOptionsDto + { + IdType = WellOperation.IdOperationTypeFact + }; + + return ImportExcelFileAsync(idWell, files, options, + (stream, _) => wellOperationDefaultExcelParser.Parse(stream, options), + deleteBeforeInsert, + cancellationToken); + } + + /// + /// Импорт плановых операций из excel (xlsx) файла. Стандартный заполненный шаблон + /// + /// id скважины + /// Коллекция из одного файла xlsx + /// + /// + [HttpPost("import/plan/default")] + [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] + [ProducesResponseType(StatusCodes.Status204NoContent)] + [Permission] + public Task ImportPlanDefaultExcelFileAsync(int idWell, + [FromForm] IFormFileCollection files, + CancellationToken cancellationToken) + { + var options = new WellOperationImportDefaultOptionsDto + { + IdType = WellOperation.IdOperationTypePlan + }; + + return ImportExcelFileAsync(idWell, files, options, + (stream, _) => wellOperationDefaultExcelParser.Parse(stream, options), + null, + cancellationToken); + } /// /// Импорт операций из excel (xlsx) файла. ГПНХ (Хантос) /// /// id скважины - /// Параметры для парсинга файла /// Коллекция из одного файла xlsx /// /// - [HttpPost("import/gazpromKhantos")] + [HttpPost("import/plan/gazpromKhantos")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] [ProducesResponseType(StatusCodes.Status204NoContent)] [Permission] - public Task ImportGazpromKhantosExcelFileAsync(int idWell, - [FromQuery] WellOperationImportGazpromKhantosOptionsDto options, + public Task ImportPlanGazpromKhantosExcelFileAsync(int idWell, [FromForm] IFormFileCollection files, - CancellationToken cancellationToken) => ImportExcelFileAsync(idWell, files, options, - (stream, _) => wellOperationGazpromKhantosExcelParser.Parse(stream, options), - cancellationToken); + CancellationToken cancellationToken) + { + var options = new WellOperationImportGazpromKhantosOptionsDto + { + IdType = WellOperation.IdOperationTypePlan + }; + + return ImportExcelFileAsync(idWell, files, options, + (stream, _) => wellOperationGazpromKhantosExcelParser.Parse(stream, options), + null, + cancellationToken); + } /// /// Создает excel файл с операциями по скважине @@ -451,9 +494,11 @@ namespace AsbCloudWebApi.Controllers return File(stream, "application/octet-stream", fileName); } + //TODO: deleteBeforeInsert тоже быстрый костыль private async Task ImportExcelFileAsync(int idWell, [FromForm] IFormFileCollection files, TOptions options, Func parseMethod, + bool? deleteBeforeInsert, CancellationToken cancellationToken) where TOptions : IWellOperationImportOptions { @@ -495,6 +540,15 @@ namespace AsbCloudWebApi.Controllers if (!wellOperations.Any()) return NoContent(); + + //TODO: очень быстрый костыль + if (deleteBeforeInsert is not null && options.IdType == WellOperation.IdOperationTypeFact) + { + return await InsertRangeAsync(idWell, options.IdType, + deleteBeforeInsert.Value, + wellOperations, + cancellationToken); + } return Ok(wellOperations); } From a2da2c912fa3ee168d80096850498d211b9be0c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D1=82=D0=B5=D0=BF=D0=B0=D0=BD=D0=BE=D0=B2=20=D0=94?= =?UTF-8?q?=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Fri, 8 Dec 2023 15:56:00 +0500 Subject: [PATCH 5/6] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/WellOperationController.cs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/AsbCloudWebApi/Controllers/WellOperationController.cs b/AsbCloudWebApi/Controllers/WellOperationController.cs index cab7e32c..d4723657 100644 --- a/AsbCloudWebApi/Controllers/WellOperationController.cs +++ b/AsbCloudWebApi/Controllers/WellOperationController.cs @@ -17,6 +17,7 @@ using AsbCloudApp.Services.WellOperationImport; using AsbCloudApp.Data.WellOperationImport.Options; using AsbCloudApp.Exceptions; using AsbCloudDb.Model; +using AsbCloudInfrastructure; namespace AsbCloudWebApi.Controllers { @@ -267,7 +268,7 @@ namespace AsbCloudWebApi.Controllers if (!await CanUserEditWellOperationsAsync(idWell, cancellationToken)) return Forbid(); - if (deleteBeforeInsert && wellOperations.Any()) + if (deleteBeforeInsert) { var existingOperations = await operationRepository.GetAsync(new WellOperationRequest { @@ -356,7 +357,6 @@ namespace AsbCloudWebApi.Controllers [HttpPost("import/fact/default/{deleteBeforeInsert:bool}")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status204NoContent)] [Permission] public Task ImportFactDefaultExcelFileAsync(int idWell, [FromForm] IFormFileCollection files, @@ -384,7 +384,6 @@ namespace AsbCloudWebApi.Controllers [HttpPost("import/plan/default")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status204NoContent)] [Permission] public Task ImportPlanDefaultExcelFileAsync(int idWell, [FromForm] IFormFileCollection files, @@ -411,7 +410,6 @@ namespace AsbCloudWebApi.Controllers [HttpPost("import/plan/gazpromKhantos")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status204NoContent)] [Permission] public Task ImportPlanGazpromKhantosExcelFileAsync(int idWell, [FromForm] IFormFileCollection files, @@ -533,14 +531,14 @@ namespace AsbCloudWebApi.Controllers var wellOperations = wellOperationImportService.Import(idWell, idUser.Value, options.IdType, sheet) .OrderBy(w => w.DateStart); - var dateStart = wellOperations.Min(w => w.DateStart); + var dateStart = wellOperations.MinOrDefault(w => w.DateStart); foreach (var wellOperation in wellOperations) - wellOperation.Day = (wellOperation.DateStart - dateStart).TotalDays; - - if (!wellOperations.Any()) - return NoContent(); - + { + if (dateStart.HasValue) + wellOperation.Day = (wellOperation.DateStart - dateStart.Value).TotalDays; + } + //TODO: очень быстрый костыль if (deleteBeforeInsert is not null && options.IdType == WellOperation.IdOperationTypeFact) { From fd40a3b930527b966d50b9d69732cf6a122212e7 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 11 Dec 2023 09:45:00 +0500 Subject: [PATCH 6/6] ContactDto Fix validation --- AsbCloudApp/Data/User/ContactDto.cs | 95 ++++++++++++++--------------- 1 file changed, 47 insertions(+), 48 deletions(-) diff --git a/AsbCloudApp/Data/User/ContactDto.cs b/AsbCloudApp/Data/User/ContactDto.cs index adf4793a..904d4ca2 100644 --- a/AsbCloudApp/Data/User/ContactDto.cs +++ b/AsbCloudApp/Data/User/ContactDto.cs @@ -1,61 +1,60 @@ using System; using System.ComponentModel.DataAnnotations; -namespace AsbCloudApp.Data.User +namespace AsbCloudApp.Data.User; + +/// +/// Контакт +/// +public class ContactDto : IId { + /// + public int Id { get; set; } + /// - /// Контакт + /// ключ типа компании /// + [Required] + [Range(1, int.MaxValue)] + public int IdCompanyType { get; set; } - public class ContactDto : IId - { - /// - public int Id { get; set; } + /// + /// ключ скважины + /// + [Required] + [Range(1,int.MaxValue)] + public int IdWell { get; set; } - /// - /// ключ типа компании - /// - [Required] - public int IdCompanyType { get; set; } + /// + /// ФИО + /// + [Required] + [StringLength(260, MinimumLength = 0, ErrorMessage = "Допустимая длина ФИО от 1 до 260 символов")] + public string FullName { get; set; } = null!; - /// - /// ключ скважины - /// - [Required] - public int IdWell { get; set; } + /// + /// Email + /// + [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessage = "Некорректный email")] + public string? Email { get; set; } - /// - /// ФИО - /// - [Required] - [StringLength(260, MinimumLength = 0, ErrorMessage = "Допустимая длина ФИО от 1 до 260 символов")] - public string FullName { get; set; } = null!; + /// + /// Phone + /// + [RegularExpression(@"^(?:\+7|8)\s?(?:\(\d{3}\)|\d{3})\s?\d{3}-?\d{2}-?\d{2}$", ErrorMessage = "Некорректный номер телефона")] + public string? Phone { get; set; } - /// - /// Email - /// - [RegularExpression(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$", ErrorMessage = "Некорректный email")] - public string? Email { get; set; } + /// + /// Должность + /// + [Required] + [StringLength(260, MinimumLength = 1, ErrorMessage = "Допустимая длина должности от 1 до 260 символов")] + public string Position { get; set; } = null!; - /// - /// Phone - /// - [RegularExpression(@"^(?:\+7|8)\s?(?:\(\d{3}\)|\d{3})\s?\d{3}-?\d{2}-?\d{2}$", ErrorMessage = "Некорректный номер телефона")] - public string? Phone { get; set; } - - /// - /// Должность - /// - [Required] - [StringLength(260, MinimumLength = 1, ErrorMessage = "Допустимая длина должности от 1 до 260 символов")] - public string Position { get; set; } = null!; - - /// - /// Компания - /// - [Required] - [StringLength(260, MinimumLength = 3, ErrorMessage = "Допустимая длина должности от 3 до 260 символов")] - public string Company { get; set; } = null!; - - } + /// + /// Компания + /// + [Required] + [StringLength(260, MinimumLength = 3, ErrorMessage = "Допустимая длина названия компании от 3 до 260 символов")] + public string Company { get; set; } = null!; }