From 4963e820c660bd771b62c3aaa92eca5fc9ac443b Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 6 Jul 2022 17:24:09 +0500 Subject: [PATCH] Add title and content lists to drillingProgram --- .../DrillingProgram/ContentListSheet.cs | 41 +++++ .../DrillingProgram/DrillingProgramMaker.cs | 11 +- .../DrillingProgram/DrillingProgramService.cs | 3 +- .../DrillingProgram/TitleListSheet.cs | 160 ++++++++++++++++++ .../DrillingProgram/TitleTemplate.xlsx | Bin 0 -> 8069 bytes 5 files changed, 213 insertions(+), 2 deletions(-) create mode 100644 AsbCloudInfrastructure/Services/DrillingProgram/ContentListSheet.cs create mode 100644 AsbCloudInfrastructure/Services/DrillingProgram/TitleListSheet.cs create mode 100644 AsbCloudInfrastructure/Services/DrillingProgram/TitleTemplate.xlsx diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/ContentListSheet.cs b/AsbCloudInfrastructure/Services/DrillingProgram/ContentListSheet.cs new file mode 100644 index 00000000..e49f3443 --- /dev/null +++ b/AsbCloudInfrastructure/Services/DrillingProgram/ContentListSheet.cs @@ -0,0 +1,41 @@ +using AsbCloudApp.Data; +using ClosedXML.Excel; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace AsbCloudInfrastructure.Services.DrillingProgram +{ +#nullable enable + public class ContentListSheet + { + private readonly List parts; + + public ContentListSheet(IEnumerable parts) + { + this.parts = parts.ToList(); + } + + public void Draw(IXLWorksheet sheet) + { + sheet.Style.Font.FontName = "Calibri"; + sheet.Style.Font.FontSize = 12; + + sheet.Cell(2, 2) + .SetValue("Содержание") + .Style + .Font.SetBold(true) + .Font.SetFontSize(14); + + for (int i = 0; i < parts.Count; i++) + { + sheet.Cell(4 + i, 1) + .SetValue(i + 1); + + sheet.Cell(4 + i, 2) + .SetValue(parts[i].Name); + } + } + } +#nullable disable +} diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramMaker.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramMaker.cs index f4248a73..dae5ff4f 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramMaker.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramMaker.cs @@ -10,9 +10,18 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram { private const int maxAllowedColumns = 256; - public static void UniteExcelFiles(IEnumerable excelFilesNames, string resultExcelPath) + public static void UniteExcelFiles(IEnumerable excelFilesNames, string resultExcelPath, IEnumerable parts, AsbCloudApp.Data.WellDto well) { var resultExcelFile = new XLWorkbook(XLEventTracking.Disabled); + + var titleSheet = resultExcelFile.AddWorksheet("Титульный лист"); + var marks = parts.SelectMany(p => p.File.FileMarks); + var titleSheetMaker = new TitleListSheet(marks, well); + titleSheetMaker.Draw(titleSheet); + + var contentSheet = resultExcelFile.AddWorksheet("Содержание"); + var contentListSheetMaker = new ContentListSheet(parts); + contentListSheetMaker.Draw(contentSheet); var filteredFileNames = excelFilesNames.Distinct(); diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index e3c90574..47bb3779 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -109,6 +109,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram var partEntities = await context.DrillingProgramParts .Include(p => p.RelatedUsers) .ThenInclude(r => r.User) + .ThenInclude(u => u.Company) .Where(p => p.IdWell == idWell) .ToListAsync(token); @@ -481,7 +482,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram using var context = new AsbCloudDbContext(contextOptions); var fileService = new FileService(context); var files = state.Parts.Select(p => fileService.GetUrl(p.File)); - DrillingProgramMaker.UniteExcelFiles(files, tempResultFilePath); + DrillingProgramMaker.UniteExcelFiles(files, tempResultFilePath, state.Parts, well); await fileService.MoveAsync(idWell, null, idFileCategoryDrillingProgram, resultFileName, tempResultFilePath, token); } diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/TitleListSheet.cs b/AsbCloudInfrastructure/Services/DrillingProgram/TitleListSheet.cs new file mode 100644 index 00000000..591b6c15 --- /dev/null +++ b/AsbCloudInfrastructure/Services/DrillingProgram/TitleListSheet.cs @@ -0,0 +1,160 @@ +using AsbCloudApp.Data; +using ClosedXML.Excel; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace AsbCloudInfrastructure.Services.DrillingProgram +{ +#nullable enable + public class TitleListSheet + { + private const string directionDirectorPositionName = "Руководитель направления по ТСБ"; + + private readonly DateTime totalDate; + private readonly FileMarkDto? acceptDirectionDirector; + private readonly List acceptsOthers; + private readonly WellDto well; + + public TitleListSheet(IEnumerable fileMarks, WellDto well) + { + totalDate = fileMarks.Max(f => f.DateCreated); + acceptDirectionDirector = fileMarks + .OrderByDescending(f => f.DateCreated) + .FirstOrDefault(f => f.User.Position == directionDirectorPositionName); + acceptsOthers = fileMarks + .Where(f => f.Id != acceptDirectionDirector?.Id) + .OrderBy(f => f.DateCreated) + .ToList(); + this.well = well; + } + + public void Draw(IXLWorksheet sheet) + { + const double santimetr = 0.393701; + sheet.Style.Font.FontName = "Calibri"; + sheet.Style.Font.FontSize = 12; + sheet.PageSetup.PaperSize = XLPaperSize.A4Paper; + sheet.PageSetup.Margins + .SetTop(santimetr) + .SetLeft(2 * santimetr) + .SetBottom(santimetr) + .SetRight(santimetr); + + DrawTopRightSign(sheet); + DrawMainTilte(sheet); + DrawOtherAcceptors(sheet); + + sheet.Range(51, 1, 51, 5) + .Merge() + .SetValue($"{totalDate.Year:00}") + .Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center); + + var k = 4.95867768595041; + sheet.Column(1).Width = k*2.3; + sheet.Column(2).Width = k*6; + sheet.Column(3).Width = k*0.53; + sheet.Column(4).Width = k*2.3; + sheet.Column(5).Width = k*6; + } + + private void DrawTopRightSign(IXLWorksheet sheet) + { + if (acceptDirectionDirector is null) + return; + + var user = acceptDirectionDirector.User; + + sheet.Cell(1, 5) + .SetValue("Согласовано:"); + + sheet.Cell(2, 5) + .SetValue(user.Position); + + sheet.Cell(3, 5) + .SetValue(user.Company?.Caption); + + sheet.Cell(4, 5) + .SetValue($"{user.Surname} {user.Name} {user.Patronymic}"); + + sheet.Cell(5, 5) + .SetValue(FormatDate(acceptDirectionDirector.DateCreated)); + + sheet.Range(1,5, 5,5).Style.Alignment + .SetHorizontal(XLAlignmentHorizontalValues.Right); + } + + private void DrawMainTilte(IXLWorksheet sheet) + { + sheet.Range(11, 1, 11, 5) + .Merge() + .SetValue($"Программа на бурение скважины №{well.Caption}, куст №{well.Cluster}"); + + sheet.Range(12, 1, 12, 5) + .Merge() + .SetValue($"{well.Deposit} месторождения"); + + sheet.Range(11, 1, 12, 5).Style + .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center) + .Font.SetFontSize(14) + .Font.SetBold(true); + } + + private void DrawOtherAcceptors(IXLWorksheet sheet) + { + const int baseRow = 16; + const int deltaRow = 7; + (int row, int col)[] addresses = + { + (baseRow + 4 * deltaRow, 4), (baseRow + 4 * deltaRow, 1), + (baseRow + 3 * deltaRow, 4), (baseRow + 3 * deltaRow, 1), + (baseRow + 2 * deltaRow, 4), (baseRow + 2 * deltaRow, 1), + (baseRow + 1 * deltaRow, 4), (baseRow + 1 * deltaRow, 1), + (baseRow + 0 * deltaRow, 4), (baseRow + 0 * deltaRow, 1), + }; + var i = 0; + for (; i < acceptsOthers.Count && i < 10; i++) + DrawAccept(sheet, acceptsOthers[i], addresses[i]); + + sheet.Cell(addresses[i-1].row - 2, 1) + .SetValue("Утверждаю:"); + } + + private void DrawAccept(IXLWorksheet sheet, FileMarkDto mark, (int row, int col) startAddress) + { + int startRow = startAddress.row; + int startCol = startAddress.col; + var user = mark.User; + sheet.Cell(startRow, startCol) + .SetValue("Должность"); + + sheet.Range(startRow, startCol + 1, startRow + 1, startCol + 1) + .Merge() + .SetValue(user.Position); + + sheet.Cell(startRow + 2, startCol) + .SetValue("Компания"); + + sheet.Range(startRow + 2, startCol + 1, startRow + 3, startCol + 1) + .Merge() + .SetValue(user.Company?.Caption); + + sheet.Range(startRow + 4, startCol, startRow + 4, startCol + 1) + .Merge() + .SetValue($"{user.Surname} {user.Name} {user.Patronymic}"); + + sheet.Range(startRow + 5, startCol, startRow + 5, startCol + 1) + .Merge() + .SetValue(FormatDate(mark.DateCreated)); + + sheet.Range(startRow, startCol, startRow + 5, startCol + 1) + .Style.Border.SetOutsideBorder(XLBorderStyleValues.Thin) + .Alignment.SetVertical(XLAlignmentVerticalValues.Top) + .Alignment.SetHorizontal(XLAlignmentHorizontalValues.Left); + } + + private static string FormatDate(DateTime dateTime) + => $"{dateTime.Day:00}.{dateTime.Month:00}.{dateTime.Year:00}"; + } +#nullable disable +} diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/TitleTemplate.xlsx b/AsbCloudInfrastructure/Services/DrillingProgram/TitleTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..589263b28fcec0c813b2368e19b623ee18ccb8e1 GIT binary patch literal 8069 zcmbVxby!sG);C>}f*{S%-6Ae2(gOq1T|;*cAt4RY-6h=u(j_sZfC7>)c+Pe7 z^?T3r$G7I%Gka$CTKit>UbTNqSq>fn4+aGV1*XwpTOH;Pdh&2?2r{>IVq<-LFOTn1 z>|sX_Ira=^yx>_DMad~>k(X`(aFcaX+Y{G?<@E-ho=f09MUSfPiFWkyy)(&Qk+)}F zVW*Wd2-A2I2G>Sw>Rs47eCO!S#ygtp^9hIlwJK1Y5fq~&`+a0xZ0LihbF3`d?wNwz zBW%#;mUbu7P=ku<{7cbLk&mAqwer-~Fc;-$)a73{3u&z(0KRIk*z@G0m7 zA#CCJz_t4!hliJ(Vx)_hv?|InVs8LWjz%s=1i1Pa1<&F=ce1$?C~4QFM1`=6M^gDC z21_>`OJ57w6%Ej*z?pzxAqVJWcH+2f(L2*yO%h#5p?6;Cv+IKPY$f)k`- zUzhF)u*99mo+e%fdM>afrA#<;mVeSFO~?RY(AUP+5DeN#V=(4s;Iic*b(b4CX`I5m zA}Z_UeO?Anhi-A@+TQ-6*Sq*jK3>Rap1RDKsmW*Od5kckXZJ z-^e>i64>md31(G~;5ByIw=^_`AHoYV$;*4JYf1=-C-itIb3hR;b;c5TKZc3t6n!PB zH1rl1yMs_R)XYrd+Gn3fw7t<|dHH3rkIu8<($d%M9AEsHK#RwhS!f_Onk%O3%BkQ@ zw@Sz!mwZtmbIGER-;J&B0`T19WXz|*@G!HjYR*P`QlxSr`ZSzwjH?fk3m$DB3}RF^ z)sE1N6-gj`bwF8Te&=&Ne2vnW!yg<)fnuYbnqIijxHDCvxA7CJ1(Zy0iN4n=+gfbG z;eOUg{0`h^|2f>H$At;~;zc>#;i#fbD<9dWMM&QI>?O<9Y|i-!pY5(q-Zv_tpqpK| zHZGu0>puNY?U@@vi@PCEpy8wQJ;VQ~BKqKXH?7J||~)TXUyJ*E`hF1*Ws( z`K(rm`WQAPQXfhbH7ll_b86TyDnQQH{7^Ncq9UhhZ-3NqU`s=4Wft{bWOerMcMD0a;Crwe}GdCH7(qenp{(Ty2bZ(es9p05z#pv*)YN zxLb@s#=K%7eypL{3eINE63x(vureePyN4q$cB#M{TPz-+oYr22tV84-lPxW66y0Cd zjFt>RlR!xxNavKwpB-2h2*2er?HyD)r~XKlJEr#X&9++gBJk1OGpd1dqJ$IyGf@VM>^Yo59~*79R9prbzdU$K z+bYT`l`h%)%?L*uaW(A6=6rc8$sP*kMsZ^q&QCe$TXes0f((Sr^lzC&;3F)9(>OmEAA6{$HyTxR{!WW{RVD#b1!7c+<&B9D0Vw+hz9>I8U{$|mj2lB`HJ4VhLHzxJ#iUtqy&xkywIWM0=1K;ma z(Wxfbad$}=mFRARI-kis)xKKHlw=S|xw*3w z+piCf$0%*n)deo{K1M0_%}ZS^LxlcdQm#Wkdxm6t#Pb4eXJ&PLo-jqo-4&^7wPbjt zWlx#`(f-n9=5Z)Ev3E@5=1bu$7wb@v86W&xODyILJLwEFCBDFp_LbWgq}nu5)%>zD zAwZ;xMiMXW8%|$9-vtQFQAZ)Fxq|MJxV>(vZtvnoo+KW>iO#L7dO(Gi(l=c+@`R*s z$?AQy-XdAdxk@}n35v0!B6{^QEpaPtdJoy#S~S%)?p&CTB^r14$aAWfOa^)qY_WSd zF))t$R*EMihG7j#yod~g$(Vd*hT>{98BrFhS=XZio#!eix3TwV{!Y?I95T39LmZg+ zPGmQ7#&!vb8yl`q#r5k|bWA3;CUJc_zgJ}JL$yv35nlhW@RJAPGPp=|6V)~jk z`7qR5w&C0^lY570&&%pQTjw)rGWDPUTumW$H9_5ky;oQ*@-s?_j8BkKR zD2|gV@{1e`e$d5&T8Df;SpVXA4`}m{R^s{~n9+1Bl4}^Vd(m&Bj76w7Xu~3Sd|tI| zT41VQz%It$l()B1e&r*P*VjtHrrBjz+Eu#PO4ybq!h)A%*B`Vok%#~Q@;*0l73etW zY(jvZb!Ww75wlhEM0Tf;a}!+@Mzokj+bHor0@bsu|q4PJz&~q z{X21n-nZhXZfM`KwbuOMmVmHWD->U#8E+DDE>^Tt6nR{|U~MS^^)uz8xmOwE>nO#- zzkWs>Nqz zwj{dTpamXoWzC&=czH>}@JiuF!l{{A&@o6UUH!q#+6P zgdmD%eD2;qk^{x4|nFo$h;1?VB3&j*pN6Zu%n_T9K5{N|GW$( zTy`#TQL7=2U;0WSm~wY9?&u=Lms!00`5=Uv?`QBQjna+$=}D)^GgK8mQ)=)9eX$zQ>Q=co6@h&375Y|iVk2)7v!wcnXg(AR3(Qlt8=`H zkBjVBrCE0UCHp@HWmAz`<#L_=R4_RCsGUH6sb*h9p{db9fzQM7TQ?C++Kt9#g=fUn z3j@0q9=&aiUI|>y(61Tx)|f%){$@m1-m2$GbE|a{dj&(+z(MIxtH<$2<72x8Ty^P? z<=C&ZzVD7MmR*d}TdYi-hECA=sG9}_&YKxmkbX>US#=E!cz9nmVI%^tsMgm;$Ox2f z=yg$XFbTI7QN_H3Yjr(@ferj64> z9?v5i(q_RY1=D3hYopWV;i7>Ld^^Dh>xMgf2cL! zLjA(FGhGv2&SwB$G!tt?pd2YVJC=pxg{{M}CC|i^_-r-L%WSbEi_hPa`-IryBUg5A zmKy4Ma0Dw2vYO}BoM@X^+&c@GC!_HOmEtGq+xiImf*rnoBP8ISFA7(A*L`(S`-$&W_F!> zuVZ!H6E`;iKf`|dl;UA>oaL?dJ9Ylpg03BRngEWTy!4PasICyqSQa0uM8`ul8;O}- zMF*))P|DI9Ddmk`nB)5{(tLM@EQLo%^EbBncQ3^Y3#J%W*US-GY~s_H(-qwFACS*m zvY+Sly4pFmknIZ@7rr_yz>YE#KSelGWA2pfTPH0X4o^754^L7d>+pBSTkYrYu*dK2 z%jk7{CqZh@y3Th~Mya_m4RmC06uKn{?el$XHju4qH|S7cV5B(yKbj5B$7Um6vnzU$ z7rX6(34sh`%{&}7*An)@XtO*WCfyAONR-W|^MTofK^4H@*;befK9BXKpAeA-9s=%- z?p44asBJd0wX>g;nUBQ+S6bI2Nje%?+$#%Yxfq_}VT90UQzit3X#}hoj+4F56(wdy z*;buEuq&2gn>yZzQs-;V{)_-a;T(WwTJqMos3ss;8_P@*(G65AYim@jne!2^ua}h3 zou3F(srxCHzfd>V4{Y?b9p*d&&QdwXNMw~nQ~2-ix)_&pm*bJwaf10`t%nO=pLBb^ zXx)Y47z}dK)QyZ%B$$gI@(%IXRT)Z-=nW&S@C3zZOM8?j#JwcxW3N0IDTMd{tIY>I@)Y?`6 z2tp`(6r45}BA(b+uP3_#z=mu>h=*Y}WM&rTL7Mn<$^iCUVH^Ol)Q?D6R@0tTYI?D*(&DMN=9+e^8;9ky3TU*6Dln ztjHMc%ftJeP%4K+@(*^KZMEF6L?54J%o-UKPSRt}B~#tNmuvEl*Qm;;x^G!%DT{V= zwhDZo+ndle)XnY^B+WN*Ree5E$c|mSSB$B)TzT*X=ZfJ3sq|T3=hC}12X=wX$n<(4 z=Jl24hHf`*=-t`|b3SZN`xb-VA~_6*K>IlMdZTspV> zO19(ZCR)>(HGL1aa@%zO?tb{_>}dGt_!ihQ?q6frB#q%ka{kQE{6ZXXOYoQ-+z@_r ze|dNmv3pa$$3lJ9#`rLpeCFiWsA^=~xTO)tFGD6X{aD5wn8QmZhy&Ehl9sJ^1eL zebWg0SAEl+=W_g&t|43nf$%S*qdwuXg_#V#VLBWZ zT2tbvW838OK3O6=5Z=zI*qGo0D9l9Yq(-sInt=nr?EXadMwr25Yez(Aml*G+FHR>e zq%YVG^U1nLimV%hWy!@+orFy+RXSD4*LQeyQZDtNO7>Z}H&^JH*518Fs613!w^>CK z;o3~Muu4d@?m6HQKQ#zq8fCbGkoh+`tP>NA&b0u1-P<58i5A@md^g=aT<@~if)0|1 z>?eUUOHr4|viQn?%)#f=NGzz0L2RMYUAy*0lSF{bNE|2h&6y0h@%1J9u>+9#wS~`m zlvN*`ma#{T1_6B<18tp;?AI%*Yo}8}CgWN0ki+LsFSkFlTw8l`L^dE6VSFx7icUCL z{`^sbL*|M19)G?mmw=izO5c85`au9u$V{hWd)un2;Iiw!R`3w`LKjuJiN=ekr=j-c zM~zFYvUzV`t)ejZ6uYE3MdBQ=ujcwMsOj?C#tHlb)U=22PfkSiFDLpJBK#-X`3oIx ziyyasK!?G{-e`H(8`Q+6k^F6mVimdQ9eR(Syp`~p?Mf(w%6qDHn0ILOzyznz@aKG!piV;~G=6qFjv zH96&HvR2BsWaQsjpQ*RYRa=CD->U3k#H`X7;CoQEsSfTqeIpo0^eDG+4-3kz1&R|;gu^S;oE zZ5Q_+9p&zP%Hs(NnrvMA_&IzMJ%|MFS*(q&w@aL0$|&4DEJP?XqU5KmGp zR4BG=sEJwid$qw8-vC$gP)2f65FTk~wxmlEyQFshx{4NB?Us?yTWSnrMoC?pXI)<^ zSx~Iu3S*;})OD2ivso*14~TWsG4dW?Gj`DJnVAU8^9n9Gd+4wrJrCWpL-UE z6!@_^gcNvhzJ1!`+fqjpfQ!iN4KuyT;H?P!3z*VZla82!OOGny?A3 zzZn+QIzYxNAbAl&V?+n~bZ{Ukps{J-F3~d8cqt>=T%xeRoE0`;C8%T1rL&<1HM4ND zRyv};j(6(ra`dgh;t1`a{xI#wlVI%K52}*s4YCSo$}r{3Gp)=yiR`QtU`I`bLX8N* zybBAuotZ5zx0ebvmtz>dJW@c{osM6nB|wK8_raj8566EmEx3Og)byQ`GtlmrO~nG9gI zFf16DbS%Kze14g(!8IeYpzJLq<`$PZJu1Y|LD&dp3LAk!JnQ@~V`~^G0;a4~l0elg zM^*0VvF@~k4cLSi>N6_y!MHyuy##)q?D5>nVVbQTU#R|52|#jZvisy*kdcnA;$Aon6msy1HWW;zQr6EjE-_ z`+Q(Qxo~^t7vi>dX$JmEr1aSq6dWVf(lVN=7EnZeF&%njWM` z2ckDpe`QR`8}f8g2sM2sy;sSb{p!PnrYiYMI~jEICpvJ1Sm2Z(t1YpgpI>8g58CHs z4=>QU?pH4FA@R%FFSODpQCZ8gJpTcZH%WBfVE%jrs$CFfPZVREXq++7Hj@Hg_Sz}R_nG-@Zw5N zLBuQeH3*BjpV3=p$qv3I$rNNdtHksiENTOyPFm+!qA z!*$k_RzfycuCeB~UT)-(-Y+-ZMC4&dj+gPWE-B+HR@}+4<*MO^c6vCvAvA>hUmduJ zw>t5EQ>&Ywa%UM&23oa8U~x{h;wNA|`ru2rEQrm6|LGw;?iDN?9?b7i<)72J$5G|~ zrauOke>46$S$Q1Z{U*AHTm3c4`4OdHb<|{w5BB|D&A#&F=O`mU>L?zv=UXb^cS0|DEdp=KeDmJZ7@r vMDw82f4G0=wZ8@Y>7f5x!0m&8|097Y%OO7aG7QX