NceeExportService.cs 207 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131
  1. using NPOI.HSSF.UserModel;
  2. using NPOI.SS.Formula.Functions;
  3. using NPOI.SS.UserModel;
  4. using NPOI.SS.Util;
  5. using NPOI.XSSF.UserModel;
  6. using System.Data;
  7. using YBEE.EQM.Core;
  8. using YBEE.EQM.Core.Enums;
  9. namespace YBEE.EQM.Application;
  10. /// <summary>
  11. /// 高中模拟分析导出服务
  12. /// </summary>
  13. public class NceeExportService(IRepository<NceeLineTotal> rep, IExportExcelService exportExcelService) : INceeExportService, ITransient
  14. {
  15. #region 导出报表
  16. /// <summary>
  17. /// 导出联盟区县模拟划线报表
  18. /// </summary>
  19. /// <param name="nceePlanId"></param>
  20. /// <returns></returns>
  21. /// <exception cref="Exception"></exception>
  22. public async Task<(string, byte[])> ExportAllianceDistrict(int nceePlanId)
  23. {
  24. var nceePlan = await rep.Change<NceePlan>().DetachedEntities.ProjectToType<NceePlanOutput>().FirstOrDefaultAsync(t => t.Id == nceePlanId) ?? throw Oops.Oh(ErrorCode.E2001);
  25. var orgList = await GetSysOrgList(nceePlanId);
  26. var courses = await rep.Change<Course>().Where(t => t.Id <= CourseConst.DI_LI || t.Id == CourseConst.ZONG_FEN || t.Id == CourseConst.ZONG_HE).ProjectToType<NceeCourseDto>().OrderBy(t => t.Sequence).ToListAsync();
  27. var baseLineTable = await GetBaseLineTable(nceePlanId);
  28. var lineLevelTable = baseLineTable.DefaultView.ToTable(true, "ncee_line_level", "ncee_line_level_name");
  29. // 临时存放目录
  30. string fileRoot = Path.Combine(FileUtil.GetTempFileRoot(), $"{Guid.NewGuid()}");
  31. Directory.CreateDirectory(fileRoot);
  32. string filePath = Path.Combine(fileRoot, $"{nceePlan.Name}-统计结果");
  33. Directory.CreateDirectory(filePath);
  34. try
  35. {
  36. // 导出物理类分段统计
  37. string rangePath4 = Path.Combine(filePath, $"{nceePlan.Name}-物理类分段统计表.xlsx");
  38. var bytes4 = await ExportScoreRange(nceePlanId, CourseConst.WU_LI, orgList, courses);
  39. await File.WriteAllBytesAsync(rangePath4, bytes4);
  40. // 导出历史类分段统计
  41. string rangePath8 = Path.Combine(filePath, $"{nceePlan.Name}-历史类分段统计表.xlsx");
  42. var bytes8 = await ExportScoreRange(nceePlanId, CourseConst.LI_SHI, orgList, courses);
  43. await File.WriteAllBytesAsync(rangePath8, bytes8);
  44. // 导出有效分统计表
  45. string lbPath = Path.Combine(filePath, $"{nceePlan.Name}-有效分及上线统计表.xlsx");
  46. var lbs = await ExportLine(nceePlanId, courses, lineLevelTable, "区县");
  47. await File.WriteAllBytesAsync(lbPath, lbs);
  48. if (nceePlan.Config.ExportConvertScoreEnabled)
  49. {
  50. // 导出机构转换成绩
  51. var orgConvertScores = await ExportOrgConvertScore(nceePlanId, orgList, isExportConvertRange: nceePlan.Config.ConvertEnabled, isExportOrder: nceePlan.Config.ExportOrderEnabled);
  52. foreach (var convertScore in orgConvertScores)
  53. {
  54. string orgPath = Path.Combine(filePath, convertScore.Key);
  55. Directory.CreateDirectory(orgPath);
  56. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-转换成绩-{convertScore.Key.Split("-")[1]}.xlsx"), convertScore.Value);
  57. File.Copy(rangePath4, Path.Combine(orgPath, Path.GetFileName(rangePath4)));
  58. File.Copy(rangePath8, Path.Combine(orgPath, Path.GetFileName(rangePath8)));
  59. File.Copy(lbPath, Path.Combine(orgPath, Path.GetFileName(lbPath)));
  60. }
  61. // 导出全部转换成绩
  62. //var convertScoreBytes = await ExportConvertScore(nceePlanId, "区县", isExportConvertRange: nceePlan.Config.ConvertEnabled, isExportOrder: nceePlan.Config.ExportOrderEnabled);
  63. var convertScoreBytes = await ExportConvertScore(new ExportConvertScoreDto
  64. {
  65. NceePlanId = nceePlanId,
  66. OrgTitle = "区县",
  67. IsExportConvertRange = nceePlan.Config.ConvertEnabled,
  68. IsExportOrder = nceePlan.Config.ExportOrderEnabled,
  69. });
  70. await File.WriteAllBytesAsync(Path.Combine(filePath, $"{nceePlan.Name}-转换成绩-总表.xlsx"), convertScoreBytes);
  71. }
  72. string outFileName = $"{nceePlan.Name}-统计结果.zip";
  73. string outFilePath = Path.Combine(fileRoot, outFileName);
  74. ICSharpCode.SharpZipLib.Zip.FastZip zip = new();
  75. zip.CreateZip(outFilePath, filePath, true, string.Empty);
  76. var retBytes = await File.ReadAllBytesAsync(outFilePath);
  77. return (outFileName, retBytes);
  78. }
  79. catch (Exception ex)
  80. {
  81. throw new Exception("导出错误", ex);
  82. }
  83. finally
  84. {
  85. Directory.Delete(fileRoot, true);
  86. }
  87. }
  88. /// <summary>
  89. /// 导出已选科的模拟划线报表
  90. /// </summary>
  91. /// <param name="input"></param>
  92. /// <returns></returns>
  93. /// <exception cref="Exception"></exception>
  94. public async Task<(string, byte[])> ExportDirectionSeleted(NceeExportInput input)
  95. {
  96. var nceePlan = await rep.Change<NceePlan>().DetachedEntities.ProjectToType<NceePlanOutput>().FirstOrDefaultAsync(t => t.Id == input.NceePlanId) ?? throw Oops.Oh(ErrorCode.E2001);
  97. var orgList = await GetSysOrgList(input.NceePlanId);
  98. var courses = await rep.Change<Course>().Where(t => t.Id <= CourseConst.DI_LI || t.Id == CourseConst.ZONG_FEN || t.Id == CourseConst.ZONG_HE).ProjectToType<NceeCourseDto>().OrderBy(t => t.Sequence).ToListAsync();
  99. var baseLineTable = await GetBaseLineTable(input.NceePlanId);
  100. var lineLevelTable = baseLineTable.DefaultView.ToTable(true, "ncee_line_level", "ncee_line_level_name");
  101. // 临时存放目录
  102. string fileRoot = Path.Combine(FileUtil.GetTempFileRoot(), $"{Guid.NewGuid()}");
  103. Directory.CreateDirectory(fileRoot);
  104. string filePath = Path.Combine(fileRoot, $"{nceePlan.Name}-统计结果");
  105. Directory.CreateDirectory(filePath);
  106. try
  107. {
  108. // 导出整体分段统计
  109. if (input.IsExportScoreRange)
  110. {
  111. // 导出物理类分段统计
  112. string rangePath4 = Path.Combine(filePath, $"{nceePlan.Name}-物理类分段统计表.xlsx");
  113. var bytes4 = await ExportScoreRange(input.NceePlanId, (short)NceeDirectionCourse.WU_LI, orgList, courses);
  114. await File.WriteAllBytesAsync(rangePath4, bytes4);
  115. // 导出物理类分段统计(仅整体)
  116. string rangePath4_t = Path.Combine(filePath, $"{nceePlan.Name}-物理类分段统计表(仅整体).xlsx");
  117. var bytes4_t = await ExportScoreRange(input.NceePlanId, (short)NceeDirectionCourse.WU_LI, null, courses);
  118. await File.WriteAllBytesAsync(rangePath4_t, bytes4_t);
  119. // 导出历史类分段统计
  120. string rangePath8 = Path.Combine(filePath, $"{nceePlan.Name}-历史类分段统计表.xlsx");
  121. var bytes8 = await ExportScoreRange(input.NceePlanId, (short)NceeDirectionCourse.LI_SHI, orgList, courses);
  122. await File.WriteAllBytesAsync(rangePath8, bytes8);
  123. // 导出历史类分段统计(仅整体)
  124. string rangePath8_t = Path.Combine(filePath, $"{nceePlan.Name}-历史类分段统计表(仅整体).xlsx");
  125. var bytes8_t = await ExportScoreRange(input.NceePlanId, (short)NceeDirectionCourse.LI_SHI, null, courses);
  126. await File.WriteAllBytesAsync(rangePath8_t, bytes8_t);
  127. }
  128. // 导出有效分统计表
  129. if (input.IsExportLine)
  130. {
  131. string lbPath = Path.Combine(filePath, $"{nceePlan.Name}-有效分及上线统计表.xlsx");
  132. var lbs = await ExportLine(input.NceePlanId, courses, lineLevelTable, "学校", false);
  133. await File.WriteAllBytesAsync(lbPath, lbs);
  134. }
  135. // 导出各班级上线情况
  136. if (input.IsExportClassLine)
  137. {
  138. string classPath = Path.Combine(filePath, $"{nceePlan.Name}-各班上线情况统计表.xlsx");
  139. var classBs = await ExportClassLine(input.NceePlanId, baseLineTable);
  140. await File.WriteAllBytesAsync(classPath, classBs);
  141. }
  142. // 导出各机构上线统计数据
  143. if (input.IsExportOrgLine)
  144. {
  145. var orgClassLines = await ExportOrgClassLine(input.NceePlanId, orgList, baseLineTable, courses);
  146. foreach (var orgClassLine in orgClassLines)
  147. {
  148. string orgPath = Path.Combine(filePath, orgClassLine.Key);
  149. if (!Directory.Exists(orgPath)) { Directory.CreateDirectory(orgPath); }
  150. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-{orgClassLine.Key}-上线统计.xlsx"), orgClassLine.Value);
  151. }
  152. }
  153. // 导出各机构分段统计
  154. if (input.IsExportOrgScoreRange)
  155. {
  156. // 导出各机构分段数据(物理)
  157. var orgRanges4 = await ExportOrgScoreRange(input.NceePlanId, (short)NceeDirectionCourse.WU_LI, orgList, courses);
  158. foreach (var range in orgRanges4)
  159. {
  160. string orgPath = Path.Combine(filePath, range.Key);
  161. if (!Directory.Exists(orgPath)) { Directory.CreateDirectory(orgPath); }
  162. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-{range.Key}-分段统计-物理类.xlsx"), range.Value);
  163. }
  164. // 导出各机构分段数据(历史)
  165. var orgRanges8 = await ExportOrgScoreRange(input.NceePlanId, (short)NceeDirectionCourse.LI_SHI, orgList, courses);
  166. foreach (var range in orgRanges8)
  167. {
  168. string orgPath = Path.Combine(filePath, range.Key);
  169. if (!Directory.Exists(orgPath)) { Directory.CreateDirectory(orgPath); }
  170. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-{range.Key}-分段统计-历史类.xlsx"), range.Value);
  171. }
  172. }
  173. if (nceePlan.Config.ExportConvertScoreEnabled)
  174. {
  175. // 导出各机构转换成绩
  176. if (input.IsExportOrgConvertScore)
  177. {
  178. var orgConvertScores = await ExportOrgConvertScore(input.NceePlanId, orgList, isExportConvertRange: nceePlan.Config.ConvertEnabled);
  179. foreach (var convertScore in orgConvertScores)
  180. {
  181. string orgPath = Path.Combine(filePath, convertScore.Key);
  182. Directory.CreateDirectory(orgPath);
  183. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-转换成绩-{convertScore.Key}.xlsx"), convertScore.Value);
  184. }
  185. }
  186. // 导出全部转换成绩
  187. if (input.IsExportConvertScore)
  188. {
  189. var convertScoreBytes = await ExportConvertScore(new ExportConvertScoreDto
  190. {
  191. NceePlanId = input.NceePlanId,
  192. IsExportConvertRange = nceePlan.Config.ConvertEnabled,
  193. IsExportStudentName = true,
  194. IsExportComb = true,
  195. IsExportDirectionCourse = true,
  196. IsExportOrder = true,
  197. IsExportClassNumber = true,
  198. });
  199. await File.WriteAllBytesAsync(Path.Combine(filePath, $"{nceePlan.Name}-转换成绩-总表.xlsx"), convertScoreBytes);
  200. }
  201. }
  202. string outFileName = $"{nceePlan.Name}-统计结果.zip";
  203. string outFilePath = Path.Combine(fileRoot, outFileName);
  204. ICSharpCode.SharpZipLib.Zip.FastZip zip = new();
  205. zip.CreateZip(outFilePath, filePath, true, string.Empty);
  206. var retBytes = await File.ReadAllBytesAsync(outFilePath);
  207. return (outFileName, retBytes);
  208. }
  209. catch (Exception ex)
  210. {
  211. throw new Exception("导出错误", ex);
  212. }
  213. finally
  214. {
  215. Directory.Delete(fileRoot, true);
  216. }
  217. }
  218. /// <summary>
  219. /// 导出未选科的模拟划线报表
  220. /// </summary>
  221. /// <param name="nceePlanId"></param>
  222. /// <returns></returns>
  223. /// <exception cref="Exception"></exception>
  224. public async Task<(string, byte[])> ExportDirectionUnseleted(int nceePlanId)
  225. {
  226. var nceePlan = await rep.Change<NceePlan>().DetachedEntities.ProjectToType<NceePlanOutput>().FirstOrDefaultAsync(t => t.Id == nceePlanId) ?? throw Oops.Oh(ErrorCode.E2001);
  227. var orgList = await GetSysOrgList(nceePlanId);
  228. var courses = await rep.Change<Course>().Where(t => t.Id <= CourseConst.DI_LI || t.Id == CourseConst.ZONG_FEN).ProjectToType<NceeCourseDto>().OrderBy(t => t.Sequence).ToListAsync();
  229. var baseLineTable = await GetBaseLineTable(nceePlanId);
  230. var lineLevelTable = baseLineTable.DefaultView.ToTable(true, "ncee_line_level", "ncee_line_level_name");
  231. // 临时存放目录
  232. string fileRoot = Path.Combine(FileUtil.GetTempFileRoot(), $"{Guid.NewGuid()}");
  233. Directory.CreateDirectory(fileRoot);
  234. string filePath = Path.Combine(fileRoot, $"{nceePlan.Name}-统计结果");
  235. Directory.CreateDirectory(filePath);
  236. try
  237. {
  238. // 导出分段统计
  239. string rangePath4 = Path.Combine(filePath, $"{nceePlan.Name}-分段统计表.xlsx");
  240. var bytes4 = await ExportScoreRangeUnselected(nceePlanId, orgList, courses);
  241. await File.WriteAllBytesAsync(rangePath4, bytes4);
  242. // 导出分段统计
  243. string rangePath4_t = Path.Combine(filePath, $"{nceePlan.Name}-分段统计表(仅整体).xlsx");
  244. var bytes4_t = await ExportScoreRangeUnselected(nceePlanId, null, courses);
  245. await File.WriteAllBytesAsync(rangePath4_t, bytes4_t);
  246. // 导出有效分统计表
  247. string lbPath = Path.Combine(filePath, $"{nceePlan.Name}-有效分及上线统计表.xlsx");
  248. var lbs = await ExportLineUnselected(nceePlanId, courses, lineLevelTable, nceePlan.Config.DirectionUnseleted);
  249. await File.WriteAllBytesAsync(lbPath, lbs);
  250. // 导出各班级上线情况
  251. string classPath = Path.Combine(filePath, $"{nceePlan.Name}-各班上线情况统计表.xlsx");
  252. var classBs = await ExportClassLineUnselected(nceePlanId, baseLineTable);
  253. await File.WriteAllBytesAsync(classPath, classBs);
  254. // 导出各机构上线统计数据
  255. var orgClassLines = await ExportOrgClassLineUnselected(nceePlanId, orgList, baseLineTable, courses);
  256. foreach (var orgClassLine in orgClassLines)
  257. {
  258. string orgPath = Path.Combine(filePath, orgClassLine.Key);
  259. if (!Directory.Exists(orgPath)) { Directory.CreateDirectory(orgPath); }
  260. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-{orgClassLine.Key}-上线统计.xlsx"), orgClassLine.Value);
  261. }
  262. // 导出各机构分段数据
  263. var orgRanges4 = await ExportOrgScoreRangeUnselected(nceePlanId, orgList, courses);
  264. foreach (var range in orgRanges4)
  265. {
  266. string orgPath = Path.Combine(filePath, range.Key);
  267. if (!Directory.Exists(orgPath)) { Directory.CreateDirectory(orgPath); }
  268. await File.WriteAllBytesAsync(Path.Combine(orgPath, $"{nceePlan.Name}-{range.Key}-分段统计.xlsx"), range.Value);
  269. }
  270. string outFileName = $"{nceePlan.Name}-统计结果.zip";
  271. string outFilePath = Path.Combine(fileRoot, outFileName);
  272. ICSharpCode.SharpZipLib.Zip.FastZip zip = new();
  273. zip.CreateZip(outFilePath, filePath, true, string.Empty);
  274. var retBytes = await File.ReadAllBytesAsync(outFilePath);
  275. return (outFileName, retBytes);
  276. }
  277. catch (Exception ex)
  278. {
  279. throw new Exception("导出错误", ex);
  280. }
  281. finally
  282. {
  283. Directory.Delete(fileRoot, true);
  284. }
  285. }
  286. #endregion
  287. #region 导出方法
  288. /// <summary>
  289. /// 导出分数段统计表
  290. /// </summary>
  291. /// <param name="nceePlanId"></param>
  292. /// <param name="directionCourseId"></param>
  293. /// <param name="orgList"></param>
  294. /// <param name="courses"></param>
  295. /// <returns></returns>
  296. private async Task<byte[]> ExportScoreRange(int nceePlanId, short directionCourseId, List<SysOrgOutput> orgList, List<NceeCourseDto> courses)
  297. {
  298. bool exportOrg = orgList is not null && orgList.Count > 0;
  299. var tcourses = courses.Where(t => t.Id <= CourseConst.DI_LI).ToList();
  300. tcourses.Insert(0, courses.FirstOrDefault(t => t.Id == CourseConst.ZONG_FEN));
  301. XSSFWorkbook wb = new();
  302. foreach (var course in tcourses)
  303. {
  304. if (course.IsSkip(directionCourseId)) { continue; }
  305. DataTable table;
  306. if (course.Id == 100)
  307. {
  308. table = await GetTotalScoreRangeTable(nceePlanId, directionCourseId, orgList);
  309. }
  310. else
  311. {
  312. table = await GetCourseScoreRangeTable(nceePlanId, directionCourseId, course.Id, orgList);
  313. }
  314. string sheetName = course.Name;
  315. if (course.Id == CourseConst.ZONG_FEN || course.Id > CourseConst.WU_LI && course.Id != CourseConst.LI_SHI)
  316. {
  317. sheetName = $"{sheetName}X";
  318. }
  319. ISheet sheet = wb.CreateSheet(sheetName);
  320. sheet.DisplayGridlines = false;
  321. var cellStyle = exportExcelService.GetCellStyle(wb);
  322. // 行索引号
  323. int rowNum = 0;
  324. #region 列头
  325. IRow headerRow = sheet.CreateRow(rowNum++);
  326. int ci = 0;
  327. exportExcelService.AddCell("分数段", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  328. if (exportOrg)
  329. {
  330. foreach (var org in orgList)
  331. {
  332. exportExcelService.AddCell(org.ShortName2, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  333. }
  334. }
  335. exportExcelService.AddCell("该段人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  336. exportExcelService.AddCell("人数累计", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  337. sheet.CreateFreezePane(0, rowNum);
  338. #endregion
  339. #region 数据
  340. foreach (DataRow dr in table.Rows)
  341. {
  342. IRow row = sheet.CreateRow(rowNum++);
  343. int rci = 0;
  344. exportExcelService.AddCell(dr["exam_score_range_name"], row, rci++, cellStyle.CenterCellStyle);
  345. if (exportOrg)
  346. {
  347. foreach (var org in orgList)
  348. {
  349. exportExcelService.AddCell(dr[$"total_count_{org.Id}"], row, rci++, cellStyle.CenterCellStyle);
  350. }
  351. }
  352. exportExcelService.AddCell(dr["total_count_range_current"], row, rci++, cellStyle.CenterCellStyle);
  353. exportExcelService.AddCell(dr["total_count_range_sum"], row, rci++, cellStyle.CenterCellStyle);
  354. }
  355. #endregion
  356. #region 图表
  357. int oi = 0;
  358. const int CHART_ROW_COUNT = 13;
  359. if (exportOrg)
  360. {
  361. foreach (var org in orgList)
  362. {
  363. XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
  364. int startRow = oi * CHART_ROW_COUNT + oi + 1;
  365. int endRow = startRow + CHART_ROW_COUNT;
  366. XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, ci + 1, startRow, ci + 10, endRow);
  367. //CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count + 1, oi + 1, org.ShortName2, org.ShortName2, "人数", "分数段");
  368. exportExcelService.CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count, oi + 1, org.ShortName2, org.ShortName2, "人数", "分数段");
  369. oi++;
  370. }
  371. }
  372. #region 整体
  373. XSSFDrawing drawing_t = (XSSFDrawing)sheet.CreateDrawingPatriarch();
  374. int startRow_t = oi * CHART_ROW_COUNT + oi + 1;
  375. int endRow_t = startRow_t + CHART_ROW_COUNT;
  376. XSSFClientAnchor anchor_t = (XSSFClientAnchor)drawing_t.CreateAnchor(0, 0, 0, 0, ci + 1, startRow_t, ci + 10, endRow_t);
  377. exportExcelService.CreateBarChart(sheet, drawing_t, anchor_t, 1, table.Rows.Count, oi + 1, "整体", "整体", "人数", "分数段");
  378. #endregion
  379. #endregion
  380. }
  381. MemoryStream ms = new();
  382. wb.Write(ms, false);
  383. ms.Flush();
  384. return ms.ToArray();
  385. }
  386. /// <summary>
  387. /// 导出分数段统计表(未选科)
  388. /// </summary>
  389. /// <param name="nceePlanId"></param>
  390. /// <param name="orgList"></param>
  391. /// <param name="courses"></param>
  392. /// <returns></returns>
  393. private async Task<byte[]> ExportScoreRangeUnselected(int nceePlanId, List<SysOrgOutput> orgList, List<NceeCourseDto> courses)
  394. {
  395. bool exportOrg = orgList is not null && orgList.Count > 0;
  396. var tcourses = courses.Where(t => t.Id <= CourseConst.DI_LI).ToList();
  397. tcourses.Insert(0, courses.FirstOrDefault(t => t.Id == CourseConst.ZONG_FEN));
  398. XSSFWorkbook wb = new();
  399. foreach (var course in tcourses)
  400. {
  401. DataTable table;
  402. if (course.Id == CourseConst.ZONG_FEN)
  403. {
  404. table = await GetTotalScoreRangeTableUnselected(nceePlanId, orgList);
  405. }
  406. else
  407. {
  408. table = await GetCourseScoreRangeTableUnselected(nceePlanId, course.Id, orgList);
  409. }
  410. string sheetName = course.Name;
  411. ISheet sheet = wb.CreateSheet(sheetName);
  412. sheet.DisplayGridlines = false;
  413. var cellStyle = exportExcelService.GetCellStyle(wb);
  414. // 行索引号
  415. int rowNum = 0;
  416. #region 列头
  417. IRow headerRow = sheet.CreateRow(rowNum++);
  418. int ci = 0;
  419. exportExcelService.AddCell("分数段", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  420. if (exportOrg)
  421. {
  422. foreach (var org in orgList)
  423. {
  424. exportExcelService.AddCell(org.ShortName2, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  425. }
  426. }
  427. exportExcelService.AddCell("该段人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  428. exportExcelService.AddCell("人数累计", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  429. sheet.CreateFreezePane(0, rowNum);
  430. #endregion
  431. #region 数据
  432. foreach (DataRow dr in table.Rows)
  433. {
  434. IRow row = sheet.CreateRow(rowNum++);
  435. int rci = 0;
  436. exportExcelService.AddCell(dr["exam_score_range_name"], row, rci++, cellStyle.CenterCellStyle);
  437. if (exportOrg)
  438. {
  439. foreach (var org in orgList)
  440. {
  441. exportExcelService.AddCell(dr[$"total_count_{org.Id}"], row, rci++, cellStyle.CenterCellStyle);
  442. }
  443. }
  444. exportExcelService.AddCell(dr["total_count_range_current"], row, rci++, cellStyle.CenterCellStyle);
  445. exportExcelService.AddCell(dr["total_count_range_sum"], row, rci++, cellStyle.CenterCellStyle);
  446. }
  447. #endregion
  448. #region 图表
  449. int oi = 0;
  450. const int CHART_ROW_COUNT = 13;
  451. if (exportOrg)
  452. {
  453. foreach (var org in orgList)
  454. {
  455. XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
  456. int startRow = oi * CHART_ROW_COUNT + oi + 1;
  457. int endRow = startRow + CHART_ROW_COUNT;
  458. XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, ci + 1, startRow, ci + 10, endRow);
  459. //CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count + 1, oi + 1, org.ShortName2, org.ShortName2, "人数", "分数段");
  460. exportExcelService.CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count, oi + 1, org.ShortName2, org.ShortName2, "人数", "分数段");
  461. oi++;
  462. }
  463. }
  464. #region 整体
  465. XSSFDrawing drawing_t = (XSSFDrawing)sheet.CreateDrawingPatriarch();
  466. int startRow_t = oi * CHART_ROW_COUNT + oi + 1;
  467. int endRow_t = startRow_t + CHART_ROW_COUNT;
  468. XSSFClientAnchor anchor_t = (XSSFClientAnchor)drawing_t.CreateAnchor(0, 0, 0, 0, ci + 1, startRow_t, ci + 10, endRow_t);
  469. exportExcelService.CreateBarChart(sheet, drawing_t, anchor_t, 1, table.Rows.Count, oi + 1, "整体", "整体", "人数", "分数段");
  470. #endregion
  471. #endregion
  472. }
  473. MemoryStream ms = new();
  474. wb.Write(ms, false);
  475. ms.Flush();
  476. return ms.ToArray();
  477. }
  478. /// <summary>
  479. /// 导出机构分数段统计表
  480. /// </summary>
  481. /// <param name="nceePlanId"></param>
  482. /// <param name="directionCourseId"></param>
  483. /// <param name="orgList"></param>
  484. /// <param name="courses"></param>
  485. /// <returns></returns>
  486. private async Task<Dictionary<string, byte[]>> ExportOrgScoreRange(int nceePlanId, short directionCourseId, List<SysOrgOutput> orgList, List<NceeCourseDto> courses)
  487. {
  488. Dictionary<string, byte[]> ret = [];
  489. var tcourses = courses.Where(t => t.Id <= CourseConst.DI_LI).ToList();
  490. tcourses.Insert(0, courses.FirstOrDefault(t => t.Id == CourseConst.ZONG_FEN));
  491. foreach (var org in orgList)
  492. {
  493. XSSFWorkbook wb = new();
  494. foreach (var course in tcourses)
  495. {
  496. if (course.IsSkip(directionCourseId)) { continue; }
  497. DataTable table;
  498. if (course.Id == CourseConst.ZONG_FEN)
  499. {
  500. table = await GetTotalScoreRangeTable(nceePlanId, directionCourseId, orgList);
  501. }
  502. else
  503. {
  504. table = await GetCourseScoreRangeTable(nceePlanId, directionCourseId, course.Id, orgList);
  505. }
  506. string sheetName = course.Name;
  507. if (course.Id == CourseConst.ZONG_FEN || course.Id > CourseConst.WU_LI && course.Id != CourseConst.LI_SHI)
  508. {
  509. sheetName = $"{sheetName}X";
  510. }
  511. ISheet sheet = wb.CreateSheet(sheetName);
  512. sheet.DisplayGridlines = false;
  513. var cellStyle = exportExcelService.GetCellStyle(wb);
  514. // 行索引号
  515. int rowNum = 0;
  516. #region 列头
  517. IRow headerRow = sheet.CreateRow(rowNum++);
  518. int ci = 0;
  519. exportExcelService.AddCell("分数段", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  520. exportExcelService.AddCell("人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  521. exportExcelService.AddCell("累计", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  522. sheet.CreateFreezePane(0, rowNum);
  523. #endregion
  524. #region 数据
  525. decimal scount = 0;
  526. foreach (DataRow dr in table.Rows)
  527. {
  528. IRow row = sheet.CreateRow(rowNum++);
  529. int rci = 0;
  530. exportExcelService.AddCell(dr["exam_score_range_name"], row, rci++, cellStyle.CenterCellStyle);
  531. decimal c = (decimal)dr[$"total_count_{org.Id}"];
  532. scount += c;
  533. exportExcelService.AddCell(c, row, rci++, cellStyle.CenterCellStyle);
  534. exportExcelService.AddCell(scount, row, rci++, cellStyle.CenterCellStyle);
  535. }
  536. #endregion
  537. #region 图表
  538. const int CHART_ROW_COUNT = 13;
  539. XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
  540. int startRow = 1;
  541. int endRow = startRow + CHART_ROW_COUNT;
  542. XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, ci + 1, startRow, ci + 10, endRow);
  543. //CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count + 1, 1, org.ShortName, org.ShortName, "人数", "分数段");
  544. exportExcelService.CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count, 1, org.ShortName, org.ShortName, "人数", "分数段");
  545. #endregion
  546. }
  547. MemoryStream ms = new();
  548. wb.Write(ms, false);
  549. ms.Flush();
  550. ret.Add($"{org.Code}-{org.ShortName}", ms.ToArray());
  551. }
  552. return ret;
  553. }
  554. /// <summary>
  555. /// 导出机构分数段统计表(未选科)
  556. /// </summary>
  557. /// <param name="nceePlanId"></param>
  558. /// <param name="orgList"></param>
  559. /// <param name="courses"></param>
  560. /// <returns></returns>
  561. private async Task<Dictionary<string, byte[]>> ExportOrgScoreRangeUnselected(int nceePlanId, List<SysOrgOutput> orgList, List<NceeCourseDto> courses)
  562. {
  563. Dictionary<string, byte[]> ret = [];
  564. var tcourses = courses.Where(t => t.Id <= CourseConst.DI_LI).ToList();
  565. tcourses.Insert(0, courses.FirstOrDefault(t => t.Id == CourseConst.ZONG_FEN));
  566. foreach (var org in orgList)
  567. {
  568. XSSFWorkbook wb = new();
  569. foreach (var course in tcourses)
  570. {
  571. DataTable table;
  572. if (course.Id == CourseConst.ZONG_FEN)
  573. {
  574. table = await GetTotalScoreRangeTableUnselected(nceePlanId, orgList);
  575. }
  576. else
  577. {
  578. table = await GetCourseScoreRangeTableUnselected(nceePlanId, course.Id, orgList);
  579. }
  580. string sheetName = course.Name;
  581. ISheet sheet = wb.CreateSheet(sheetName);
  582. sheet.DisplayGridlines = false;
  583. var cellStyle = exportExcelService.GetCellStyle(wb);
  584. // 行索引号
  585. int rowNum = 0;
  586. #region 列头
  587. IRow headerRow = sheet.CreateRow(rowNum++);
  588. int ci = 0;
  589. exportExcelService.AddCell("分数段", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 9);
  590. exportExcelService.AddCell("人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  591. exportExcelService.AddCell("累计", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 7);
  592. sheet.CreateFreezePane(0, rowNum);
  593. #endregion
  594. #region 数据
  595. decimal scount = 0;
  596. foreach (DataRow dr in table.Rows)
  597. {
  598. IRow row = sheet.CreateRow(rowNum++);
  599. int rci = 0;
  600. exportExcelService.AddCell(dr["exam_score_range_name"], row, rci++, cellStyle.CenterCellStyle);
  601. decimal c = (decimal)dr[$"total_count_{org.Id}"];
  602. scount += c;
  603. exportExcelService.AddCell(c, row, rci++, cellStyle.CenterCellStyle);
  604. exportExcelService.AddCell(scount, row, rci++, cellStyle.CenterCellStyle);
  605. }
  606. #endregion
  607. #region 图表
  608. const int CHART_ROW_COUNT = 13;
  609. XSSFDrawing drawing = (XSSFDrawing)sheet.CreateDrawingPatriarch();
  610. int startRow = 1;
  611. int endRow = startRow + CHART_ROW_COUNT;
  612. XSSFClientAnchor anchor = (XSSFClientAnchor)drawing.CreateAnchor(0, 0, 0, 0, ci + 1, startRow, ci + 10, endRow);
  613. //CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count + 1, 1, org.ShortName, org.ShortName, "人数", "分数段");
  614. exportExcelService.CreateBarChart(sheet, drawing, anchor, 1, table.Rows.Count, 1, org.ShortName, org.ShortName, "人数", "分数段");
  615. #endregion
  616. }
  617. MemoryStream ms = new();
  618. wb.Write(ms, false);
  619. ms.Flush();
  620. ret.Add($"{org.Code}-{org.ShortName}", ms.ToArray());
  621. }
  622. return ret;
  623. }
  624. /// <summary>
  625. /// 导出有效分
  626. /// </summary>
  627. /// <param name="nceePlanId"></param>
  628. /// <param name="wb"></param>
  629. /// <param name="cellStyle"></param>
  630. /// <param name="lineScoreTable"></param>
  631. /// <param name="isExportRate"></param>
  632. /// <returns></returns>
  633. private async Task ExportLineScore(int nceePlanId, IWorkbook wb, ExportExcelCellStyle cellStyle, DataTable lineScoreTable = null, bool isExportRate = false)
  634. {
  635. var cellStylePercent = wb.CreateCellStyle();
  636. cellStylePercent.CloneStyleFrom(cellStyle.CenterCellStyle);
  637. cellStylePercent.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");
  638. lineScoreTable ??= await GetLineScoreTable(nceePlanId);
  639. int mcount = isExportRate ? 8 : 7;
  640. ISheet sheet = wb.CreateSheet("有效分");
  641. sheet.DisplayGridlines = false;
  642. // 行索引号
  643. int rowNum = 0;
  644. foreach (var directionCourse in NceeUtil.DirectionCourses)
  645. {
  646. #region 表头
  647. IRow headerRow1 = sheet.CreateRow(rowNum++);
  648. headerRow1.HeightInPoints = 30;
  649. int ci = 0;
  650. int scoreWidth = 8;
  651. exportExcelService.AddCell($"{directionCourse.Name}类有效分", headerRow1, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  652. for (; ci < mcount; ci++)
  653. {
  654. exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  655. }
  656. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  657. IRow headerRow2 = sheet.CreateRow(rowNum++);
  658. headerRow2.HeightInPoints = 15;
  659. ci = 0;
  660. exportExcelService.AddCell("类型", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  661. exportExcelService.AddCell("语文", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  662. exportExcelService.AddCell("数学", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  663. exportExcelService.AddCell("英语", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  664. exportExcelService.AddCell(directionCourse.Name, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  665. exportExcelService.AddCell("综合X", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  666. exportExcelService.AddCell("总分X", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  667. if (isExportRate)
  668. {
  669. exportExcelService.AddCell("划线率", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  670. }
  671. #endregion
  672. #region 数据
  673. foreach (DataRow dr in lineScoreTable.Select($"direction_course_id = {directionCourse.Id}"))
  674. {
  675. IRow row = sheet.CreateRow(rowNum++);
  676. row.HeightInPoints = 15;
  677. int rci = 0;
  678. exportExcelService.AddCell(dr["ncee_line_level_name"], row, rci++, cellStyle.CenterCellStyle);
  679. exportExcelService.AddCell(dr["line_score_x_1"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  680. exportExcelService.AddCell(dr["line_score_x_2"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  681. exportExcelService.AddCell(dr["line_score_x_3"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  682. exportExcelService.AddCell(dr[$"line_score_x_{directionCourse.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  683. exportExcelService.AddCell(dr["line_score_x_101"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  684. exportExcelService.AddCell(dr["line_score_x_100"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  685. if (isExportRate)
  686. {
  687. exportExcelService.AddCell(dr["line_rate"], row, rci++, cellStylePercent, zeroToBlank: true);
  688. }
  689. }
  690. #endregion
  691. rowNum += 2;
  692. }
  693. }
  694. /// <summary>
  695. /// 导出有效分(未选科)
  696. /// </summary>
  697. /// <param name="wb"></param>
  698. /// <param name="cellStyle"></param>
  699. /// <param name="lineScoreTable"></param>
  700. /// <param name="courses"></param>
  701. /// <returns></returns>
  702. private void ExportLineScore(IWorkbook wb, ExportExcelCellStyle cellStyle, DataTable lineScoreTable, List<NceeCourseDto> courses)
  703. {
  704. var cellStylePercent = wb.CreateCellStyle();
  705. cellStylePercent.CloneStyleFrom(cellStyle.CenterCellStyle);
  706. cellStylePercent.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");
  707. ISheet sheet = wb.CreateSheet("有效分");
  708. sheet.DisplayGridlines = false;
  709. // 行索引号
  710. int rowNum = 0;
  711. #region 表头
  712. IRow headerRow1 = sheet.CreateRow(rowNum++);
  713. headerRow1.HeightInPoints = 30;
  714. int ci = 0;
  715. int scoreWidth = 8;
  716. exportExcelService.AddCell($"有效分", headerRow1, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  717. for (; ci < courses.Count + 1; ci++)
  718. {
  719. exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  720. }
  721. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  722. IRow headerRow2 = sheet.CreateRow(rowNum++);
  723. headerRow2.HeightInPoints = 15;
  724. ci = 0;
  725. exportExcelService.AddCell("类型", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  726. foreach (var course in courses)
  727. {
  728. exportExcelService.AddCell(course.Name, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  729. }
  730. #endregion
  731. #region 数据
  732. foreach (DataRow dr in lineScoreTable.Select($"direction_course_id = {CourseConst.WEI_XUAN_KE}"))
  733. {
  734. IRow row = sheet.CreateRow(rowNum++);
  735. row.HeightInPoints = 15;
  736. int rci = 0;
  737. exportExcelService.AddCell(dr["ncee_line_level_name"], row, rci++, cellStyle.CenterCellStyle);
  738. foreach (var course in courses)
  739. {
  740. exportExcelService.AddCell(dr[$"line_score_x_{course.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  741. }
  742. }
  743. #endregion
  744. }
  745. /// <summary>
  746. /// 导出转换区间
  747. /// </summary>
  748. /// <param name="nceePlanId"></param>
  749. /// <param name="wb"></param>
  750. /// <param name="cellStyle"></param>
  751. /// <returns></returns>
  752. private async Task ExportConvertRange(int nceePlanId, IWorkbook wb, ExportExcelCellStyle cellStyle)
  753. {
  754. var convertRangeTable = await GetConvertRangeTable(nceePlanId);
  755. var convertGrades = await rep.Change<NceeConvertGrade>().Entities.ToListAsync();
  756. ISheet convertRangeSheet = wb.CreateSheet("原始分转换区间");
  757. convertRangeSheet.DisplayGridlines = false;
  758. // 行索引号
  759. int rowNum = 0;
  760. // 标题1
  761. IRow titleRow1 = convertRangeSheet.CreateRow(rowNum++);
  762. titleRow1.HeightInPoints = 30;
  763. int ci = 0;
  764. int colWidth = 13;
  765. exportExcelService.AddCell("等级比例赋分区间", titleRow1, ci++, cellStyle.TitleStyle, convertRangeSheet, colWidth);
  766. foreach (var rg in convertGrades)
  767. {
  768. exportExcelService.AddCell("", titleRow1, ci++, cellStyle.TitleStyle, convertRangeSheet, colWidth);
  769. }
  770. convertRangeSheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, convertGrades.Count));
  771. // 表头1
  772. IRow headerRow1 = convertRangeSheet.CreateRow(rowNum++);
  773. headerRow1.HeightInPoints = 15;
  774. ci = 0;
  775. exportExcelService.AddCell("等级", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  776. foreach (var rg in convertGrades)
  777. {
  778. exportExcelService.AddCell(rg.Name, headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  779. }
  780. // 表头:比例
  781. IRow headerRow2 = convertRangeSheet.CreateRow(rowNum++);
  782. headerRow2.HeightInPoints = 15;
  783. ci = 0;
  784. exportExcelService.AddCell("比例", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  785. foreach (var rg in convertGrades)
  786. {
  787. exportExcelService.AddCell($"约{Math.Round(rg.Rate * 100, 0)}%", headerRow2, ci++, cellStyle.CenterCellStyle, convertRangeSheet, colWidth);
  788. }
  789. // 表头:赋分区间
  790. IRow headerRow3 = convertRangeSheet.CreateRow(rowNum++);
  791. headerRow3.HeightInPoints = 15;
  792. ci = 0;
  793. exportExcelService.AddCell("赋分区间", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  794. foreach (var rg in convertGrades)
  795. {
  796. exportExcelService.AddCell($"{Math.Round(rg.MinScore)}~{Math.Round(rg.MaxScore)}", headerRow3, ci++, cellStyle.CenterCellStyle, convertRangeSheet, colWidth);
  797. }
  798. rowNum += 2;
  799. // 标题2
  800. IRow titleRow2 = convertRangeSheet.CreateRow(rowNum++);
  801. titleRow2.HeightInPoints = 30;
  802. ci = 0;
  803. exportExcelService.AddCell("原始分转换区间", titleRow2, ci++, cellStyle.TitleStyle, convertRangeSheet, colWidth);
  804. foreach (var rg in convertGrades)
  805. {
  806. exportExcelService.AddCell("", titleRow2, ci++, cellStyle.TitleStyle, convertRangeSheet, colWidth);
  807. }
  808. convertRangeSheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, convertGrades.Count));
  809. // 表头4
  810. IRow headerRow4 = convertRangeSheet.CreateRow(rowNum++);
  811. headerRow4.HeightInPoints = 15;
  812. ci = 0;
  813. exportExcelService.AddCell("学科", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  814. foreach (var rg in convertGrades)
  815. {
  816. exportExcelService.AddCell(rg.Name, headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, convertRangeSheet, colWidth);
  817. }
  818. // 数据
  819. foreach (DataRow dr in convertRangeTable.Rows)
  820. {
  821. IRow row = convertRangeSheet.CreateRow(rowNum++);
  822. row.HeightInPoints = 15;
  823. int rci = 0;
  824. exportExcelService.AddCell(dr["course_name"], row, rci++, cellStyle.CenterCellStyle);
  825. foreach (var rg in convertGrades)
  826. {
  827. var a1 = ((decimal)dr[$"min_score_{rg.Name.ToLower()}"]).ToString("0.#");
  828. var a2 = ((decimal)dr[$"max_score_{rg.Name.ToLower()}"]).ToString("0.#");
  829. exportExcelService.AddCell($"[{a1}, {a2}]", row, rci++, cellStyle.LeftCellStyle);
  830. }
  831. }
  832. }
  833. /// <summary>
  834. /// 导出上线合并
  835. /// </summary>
  836. /// <param name="nceePlanId"></param>
  837. /// <param name="wb"></param>
  838. /// <param name="cellStyle"></param>
  839. /// <param name="orgTitle"></param>
  840. /// <returns></returns>
  841. private async Task ExportLineTotal(int nceePlanId, IWorkbook wb, ExportExcelCellStyle cellStyle, string orgTitle)
  842. {
  843. var table = await GetLineCountTable(nceePlanId);
  844. ISheet sheet = wb.CreateSheet("上线合并");
  845. sheet.DisplayGridlines = false;
  846. // 行索引号
  847. int rowNum = 0;
  848. #region 表头
  849. IRow titleRow = sheet.CreateRow(rowNum++);
  850. titleRow.HeightInPoints = 30;
  851. int ci = 0;
  852. int scoreWidth = 10;
  853. exportExcelService.AddCell("上线合并汇总", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  854. for (; ci < 16; ci++)
  855. {
  856. exportExcelService.AddCell("", titleRow, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  857. }
  858. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  859. IRow headerRow0 = sheet.CreateRow(rowNum++);
  860. headerRow0.HeightInPoints = 15;
  861. ci = 0;
  862. exportExcelService.AddCell(orgTitle, headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  863. exportExcelService.AddCell("两类合并", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  864. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  865. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  866. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  867. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  868. exportExcelService.AddCell("物理类", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  869. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  870. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  871. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  872. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  873. exportExcelService.AddCell("历史类", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  874. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  875. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  876. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  877. exportExcelService.AddCell("", headerRow0, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  878. IRow headerRow1 = sheet.CreateRow(rowNum++);
  879. headerRow1.HeightInPoints = 15;
  880. ci = 0;
  881. exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  882. exportExcelService.AddCell("参考人数", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  883. exportExcelService.AddCell("特控", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  884. exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  885. exportExcelService.AddCell("本科", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  886. exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  887. exportExcelService.AddCell("参考人数", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  888. exportExcelService.AddCell("特控", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  889. exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  890. exportExcelService.AddCell("本科", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  891. exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  892. exportExcelService.AddCell("参考人数", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  893. exportExcelService.AddCell("特控", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  894. exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  895. exportExcelService.AddCell("本科", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  896. exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  897. IRow headerRow2 = sheet.CreateRow(rowNum++);
  898. headerRow1.HeightInPoints = 15;
  899. ci = 0;
  900. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  901. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  902. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  903. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  904. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  905. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  906. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  907. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  908. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  909. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  910. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  911. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  912. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  913. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  914. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  915. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  916. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 3, rowNum - 1, 0, 0));
  917. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 3, rowNum - 3, 1, 5));
  918. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 3, rowNum - 3, 6, 10));
  919. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 3, rowNum - 3, 11, 15));
  920. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  921. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 2, 3));
  922. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 4, 5));
  923. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 6, 6));
  924. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 7, 8));
  925. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 9, 10));
  926. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 11, 11));
  927. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 12, 13));
  928. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 14, 15));
  929. #endregion
  930. #region 数据
  931. foreach (DataRow dr in table.Rows)
  932. {
  933. IRow row = sheet.CreateRow(rowNum++);
  934. row.HeightInPoints = 15;
  935. int rci = 0;
  936. exportExcelService.AddCell(dr["sys_org_name"], row, rci++, cellStyle.CenterCellStyle);
  937. exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  938. exportExcelService.AddCell(dr["line_count_1"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  939. exportExcelService.AddCell(dr["line_rate_1"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  940. exportExcelService.AddCell(dr["line_count_2"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  941. exportExcelService.AddCell(dr["line_rate_2"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  942. exportExcelService.AddCell(dr["d_4_total_count"], row, rci++, cellStyle.CenterCellStyle);
  943. exportExcelService.AddCell(dr["d_4_line_count_1"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  944. exportExcelService.AddCell(dr["d_4_line_rate_1"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  945. exportExcelService.AddCell(dr["d_4_line_count_2"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  946. exportExcelService.AddCell(dr["d_4_line_rate_2"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  947. exportExcelService.AddCell(dr["d_8_total_count"], row, rci++, cellStyle.CenterCellStyle);
  948. exportExcelService.AddCell(dr["d_8_line_count_1"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  949. exportExcelService.AddCell(dr["d_8_line_rate_1"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  950. exportExcelService.AddCell(dr["d_8_line_count_2"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  951. exportExcelService.AddCell(dr["d_8_line_rate_2"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  952. }
  953. #endregion
  954. }
  955. private async Task ExportLineTotalUnselected(int nceePlanId, IWorkbook wb, ExportExcelCellStyle cellStyle, string orgTitle)
  956. {
  957. var table = await GetLineCountTable(nceePlanId);
  958. ISheet sheet = wb.CreateSheet("上线合并");
  959. sheet.DisplayGridlines = false;
  960. // 行索引号
  961. int rowNum = 0;
  962. #region 表头
  963. IRow titleRow = sheet.CreateRow(rowNum++);
  964. titleRow.HeightInPoints = 30;
  965. int ci = 0;
  966. int scoreWidth = 10;
  967. exportExcelService.AddCell("上线合并汇总", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  968. for (; ci < 8; ci++)
  969. {
  970. exportExcelService.AddCell("", titleRow, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  971. }
  972. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  973. IRow headerRow1 = sheet.CreateRow(rowNum++);
  974. headerRow1.HeightInPoints = 15;
  975. ci = 0;
  976. exportExcelService.AddCell(orgTitle, headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  977. exportExcelService.AddCell("参考人数", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  978. exportExcelService.AddCell("特控", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  979. exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  980. exportExcelService.AddCell("本科", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  981. exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  982. exportExcelService.AddCell("高职", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  983. exportExcelService.AddCell("", headerRow1, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  984. IRow headerRow2 = sheet.CreateRow(rowNum++);
  985. headerRow1.HeightInPoints = 15;
  986. ci = 0;
  987. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  988. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  989. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  990. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  991. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  992. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  993. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  994. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  995. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  996. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  997. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 2, 3));
  998. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 4, 5));
  999. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 2, 6, 7));
  1000. #endregion
  1001. #region 数据
  1002. foreach (DataRow dr in table.Rows)
  1003. {
  1004. IRow row = sheet.CreateRow(rowNum++);
  1005. row.HeightInPoints = 15;
  1006. int rci = 0;
  1007. exportExcelService.AddCell(dr["sys_org_name"], row, rci++, cellStyle.CenterCellStyle);
  1008. exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  1009. exportExcelService.AddCell(dr["line_count_1"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1010. exportExcelService.AddCell(dr["line_rate_1"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  1011. exportExcelService.AddCell(dr["line_count_2"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1012. exportExcelService.AddCell(dr["line_rate_2"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  1013. exportExcelService.AddCell(dr["line_count_3"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1014. exportExcelService.AddCell(dr["line_rate_3"], row, rci++, cellStyle.PercentCellStyleP2, zeroToBlank: true);
  1015. }
  1016. #endregion
  1017. }
  1018. /// <summary>
  1019. /// 导出上线统计
  1020. /// </summary>
  1021. /// <param name="nceePlanId"></param>
  1022. /// <param name="courses"></param>
  1023. /// <param name="lineLevelTable"></param>
  1024. /// <param name="orgTitle">区县或学校标题名称</param>
  1025. /// <param name="isExportConvertRange">是否导出转换区间</param>
  1026. /// <returns></returns>
  1027. private async Task<byte[]> ExportLine(int nceePlanId, List<NceeCourseDto> courses, DataTable lineLevelTable, string orgTitle, bool isExportConvertRange = true)
  1028. {
  1029. XSSFWorkbook wb = new();
  1030. var cellStyle = exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  1031. #region 上线合并
  1032. await ExportLineTotal(nceePlanId, wb, cellStyle, orgTitle);
  1033. #endregion
  1034. #region 平均分
  1035. {
  1036. var tcourses = courses.Where(t => t.Id != CourseConst.ZONG_HE).ToList();
  1037. ISheet sheet = wb.CreateSheet("平均分");
  1038. sheet.DisplayGridlines = false;
  1039. // 行索引号
  1040. int rowNum = 0;
  1041. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1042. {
  1043. var table = await GetAvgScoreTable(nceePlanId, directionCourse.Id);
  1044. #region 表头
  1045. IRow headerRow1 = sheet.CreateRow(rowNum++);
  1046. headerRow1.HeightInPoints = 30;
  1047. int ci = 0;
  1048. int scoreWidth = 8;
  1049. exportExcelService.AddCell($"{directionCourse.Name}类平均分", headerRow1, ci++, cellStyle.TitleStyle, sheet, 10);
  1050. for (; ci < 19; ci++)
  1051. {
  1052. exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  1053. }
  1054. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1055. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1056. headerRow2.HeightInPoints = 15;
  1057. ci = 0;
  1058. exportExcelService.AddCell("学科", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1059. foreach (var course in tcourses)
  1060. {
  1061. if (course.IsSkip(directionCourse.Id)) { continue; }
  1062. string cn = course.Name;
  1063. if (NceeUtil.ChooseCourses.Contains(course.Id) || course.Id == CourseConst.ZONG_FEN)
  1064. {
  1065. cn = $"{cn}X";
  1066. }
  1067. exportExcelService.AddCell(cn, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1068. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1069. if (ci % 2 == 1)
  1070. {
  1071. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1072. }
  1073. }
  1074. IRow headerRow3 = sheet.CreateRow(rowNum++);
  1075. headerRow3.HeightInPoints = 15;
  1076. ci = 0;
  1077. exportExcelService.AddCell(orgTitle, headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1078. foreach (var course in tcourses)
  1079. {
  1080. if (course.IsSkip(directionCourse.Id)) { continue; }
  1081. exportExcelService.AddCell("人数", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1082. exportExcelService.AddCell("平均", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1083. }
  1084. #endregion
  1085. #region 数据
  1086. foreach (DataRow dr in table.Rows)
  1087. {
  1088. IRow row = sheet.CreateRow(rowNum++);
  1089. row.HeightInPoints = 15;
  1090. int rci = 0;
  1091. exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1092. foreach (var course in tcourses)
  1093. {
  1094. if (course.IsSkip(directionCourse.Id)) { continue; }
  1095. exportExcelService.AddCell(dr[$"total_count_{course.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1096. exportExcelService.AddCell(dr[$"avg_score_x_{course.Id}"], row, rci++, cellStyle.NumberCellStyleP2, zeroToBlank: true);
  1097. }
  1098. }
  1099. #endregion
  1100. rowNum += 2;
  1101. }
  1102. }
  1103. #endregion
  1104. #region 有效分
  1105. var lineScoreTable = await GetLineScoreTable(nceePlanId);
  1106. await ExportLineScore(nceePlanId, wb, cellStyle, lineScoreTable);
  1107. #endregion
  1108. #region 单上线
  1109. {
  1110. var table = await GetLineTotalTable(nceePlanId);
  1111. ISheet sheet = wb.CreateSheet("有效分总分单上线");
  1112. sheet.DisplayGridlines = false;
  1113. // 行索引号
  1114. int rowNum = 0;
  1115. foreach (DataRow lineLevel in lineLevelTable.Rows)
  1116. {
  1117. #region 表头
  1118. // 分类标题
  1119. IRow headerRow1 = sheet.CreateRow(rowNum++);
  1120. headerRow1.HeightInPoints = 30;
  1121. int ci = 0;
  1122. int countWidth = 6;
  1123. int scoreWidth = 8;
  1124. int orgWidth = 10;
  1125. exportExcelService.AddCell($"{lineLevel["ncee_line_level_name"]}有效分总分单上线", headerRow1, ci++, cellStyle.TitleStyle, sheet, orgWidth);
  1126. for (; ci < 30; ci++)
  1127. {
  1128. exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  1129. }
  1130. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1131. // 方向标题
  1132. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1133. headerRow2.HeightInPoints = 15;
  1134. ci = 0;
  1135. exportExcelService.AddCell(orgTitle, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1136. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1137. {
  1138. exportExcelService.AddCell($"{directionCourse.Name}类", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1139. for (int i = 0; i < 12; i++)
  1140. {
  1141. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1142. }
  1143. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 13, ci - 1));
  1144. }
  1145. exportExcelService.AddCell("合计", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1146. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1147. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1148. // 学科上有效分标题
  1149. IRow headerRow3 = sheet.CreateRow(rowNum++);
  1150. headerRow3.HeightInPoints = 15;
  1151. ci = 0;
  1152. exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1153. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1154. {
  1155. exportExcelService.AddCell("学科上有效分人数及比例", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1156. for (int i = 0; i < 9; i++)
  1157. {
  1158. exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1159. }
  1160. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 10, ci - 1));
  1161. exportExcelService.AddCell("总分上\n线情况", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1162. exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1163. exportExcelService.AddCell("上线率", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1164. }
  1165. exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1166. exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1167. exportExcelService.AddCell("", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1168. // 科目标题
  1169. IRow headerRow4 = sheet.CreateRow(rowNum++);
  1170. headerRow4.HeightInPoints = 15;
  1171. ci = 0;
  1172. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1173. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1174. {
  1175. foreach (var cu in courses.Where(t => t.Id < CourseConst.WU_LI || t.Id == directionCourse.Id || t.Id == CourseConst.ZONG_HE))
  1176. {
  1177. exportExcelService.AddCell(cu.Name, headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1178. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1179. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1180. }
  1181. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1182. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1183. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, ci - 2, ci - 1));
  1184. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1185. }
  1186. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1187. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1188. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1189. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 3, rowNum - 1, 0, 0));
  1190. // 有效分标题
  1191. IRow headerRow5 = sheet.CreateRow(rowNum++);
  1192. headerRow5.HeightInPoints = 15;
  1193. ci = 0;
  1194. exportExcelService.AddCell("有效分", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1195. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1196. {
  1197. var lineScore = lineScoreTable.Select($"direction_course_id = {directionCourse.Id} AND ncee_line_level = {lineLevel["ncee_line_level"]}").First();
  1198. foreach (var cu in courses.Where(t => t.Id < CourseConst.WU_LI || t.Id == directionCourse.Id || t.Id == CourseConst.ZONG_FEN || t.Id == CourseConst.ZONG_HE))
  1199. {
  1200. exportExcelService.AddCell(lineScore[$"line_score_x_{cu.Id}"], headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1201. exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1202. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1203. }
  1204. exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1205. }
  1206. exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1207. exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1208. exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1209. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 4, rowNum - 1, ci - 3, ci - 1));
  1210. // 人数比例标题
  1211. IRow headerRow6 = sheet.CreateRow(rowNum++);
  1212. headerRow6.HeightInPoints = 15;
  1213. ci = 0;
  1214. exportExcelService.AddCell("", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1215. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1216. {
  1217. foreach (var cu in courses.Where(t => t.Id < CourseConst.WU_LI || t.Id == directionCourse.Id || t.Id == CourseConst.ZONG_HE))
  1218. {
  1219. exportExcelService.AddCell("人数", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1220. exportExcelService.AddCell("比例", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1221. }
  1222. exportExcelService.AddCell("参考", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1223. exportExcelService.AddCell("上线", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1224. exportExcelService.AddCell("", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1225. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 4, rowNum - 1, ci - 1, ci - 1));
  1226. }
  1227. exportExcelService.AddCell("参考", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1228. exportExcelService.AddCell("上线", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1229. exportExcelService.AddCell("比例", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1230. #endregion
  1231. #region 数据
  1232. // 以物理类为基础生成行
  1233. var drs = table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = {CourseConst.WU_LI}");
  1234. foreach (DataRow dr4 in drs)
  1235. {
  1236. IRow row = sheet.CreateRow(rowNum++);
  1237. row.HeightInPoints = 15;
  1238. int rci = 0;
  1239. // 物理类
  1240. exportExcelService.AddCell(dr4["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1241. foreach (var cu in courses.Where(t => t.Id <= CourseConst.WU_LI || t.Id == CourseConst.ZONG_HE))
  1242. {
  1243. exportExcelService.AddCell(dr4[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1244. exportExcelService.AddCell(dr4[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1245. }
  1246. _ = int.TryParse(dr4["total_count_100"]?.ToString() ?? "", out int tc_4_100);
  1247. _ = int.TryParse(dr4["line_count_100"]?.ToString() ?? "", out int lc_4_100);
  1248. exportExcelService.AddCell(tc_4_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1249. exportExcelService.AddCell(lc_4_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1250. exportExcelService.AddCell(dr4["line_rate_100"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1251. // 历史类
  1252. var dr8 = table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = {CourseConst.LI_SHI} AND sys_org_id = {dr4["sys_org_id"]}").FirstOrDefault();
  1253. int tc_8_100 = 0;
  1254. int lc_8_100 = 0;
  1255. if (dr8 != null)
  1256. {
  1257. foreach (var cu in courses.Where(t => t.Id < CourseConst.WU_LI || t.Id == CourseConst.LI_SHI || t.Id == CourseConst.ZONG_HE))
  1258. {
  1259. exportExcelService.AddCell(dr8[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1260. exportExcelService.AddCell(dr8[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1261. }
  1262. _ = int.TryParse(dr8["total_count_100"]?.ToString() ?? "", out int t8100);
  1263. tc_8_100 = t8100;
  1264. _ = int.TryParse(dr8["line_count_100"]?.ToString() ?? "", out int l8100);
  1265. lc_8_100 = l8100;
  1266. exportExcelService.AddCell(tc_8_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1267. exportExcelService.AddCell(lc_8_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1268. exportExcelService.AddCell(dr8["line_rate_100"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1269. }
  1270. exportExcelService.AddCell(tc_4_100 + tc_8_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1271. exportExcelService.AddCell(lc_4_100 + lc_8_100, row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1272. exportExcelService.AddCell((lc_4_100 + lc_8_100) * 1.0 / (tc_4_100 + tc_8_100), row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1273. }
  1274. #endregion
  1275. rowNum += 2;
  1276. }
  1277. sheet.CreateFreezePane(1, 0);
  1278. }
  1279. #endregion
  1280. #region 双上线
  1281. {
  1282. var table = await GetLineCourseTable(nceePlanId);
  1283. ISheet sheet = wb.CreateSheet("有效分总分双上线");
  1284. sheet.DisplayGridlines = false;
  1285. // 行索引号
  1286. int rowNum = 0;
  1287. foreach (DataRow lineLevel in lineLevelTable.Rows)
  1288. {
  1289. #region 表头
  1290. // 分类标题
  1291. IRow headerRow1 = sheet.CreateRow(rowNum++);
  1292. headerRow1.HeightInPoints = 30;
  1293. int ci = 0;
  1294. int countWidth = 6;
  1295. int scoreWidth = 8;
  1296. int orgWidth = 10;
  1297. exportExcelService.AddCell($"{lineLevel["ncee_line_level_name"]}有效分总分双上线", headerRow1, ci++, cellStyle.TitleStyle, sheet, orgWidth);
  1298. for (; ci < 21; ci++)
  1299. {
  1300. exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  1301. }
  1302. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1303. // 方向标题
  1304. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1305. headerRow2.HeightInPoints = 15;
  1306. ci = 0;
  1307. exportExcelService.AddCell(orgTitle, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1308. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1309. {
  1310. exportExcelService.AddCell($"{directionCourse.Name}类", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1311. for (int i = 0; i < 9; i++)
  1312. {
  1313. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1314. }
  1315. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 10, ci - 1));
  1316. }
  1317. // 科目标题
  1318. IRow headerRow4 = sheet.CreateRow(rowNum++);
  1319. headerRow4.HeightInPoints = 15;
  1320. ci = 0;
  1321. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1322. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1323. {
  1324. foreach (var cu in courses.Where(t => t.Id < CourseConst.WU_LI || t.Id == directionCourse.Id || t.Id == CourseConst.ZONG_HE))
  1325. {
  1326. var cuName = cu.Name;
  1327. if (cu.Id == 101)
  1328. {
  1329. cuName = $"{cuName}X";
  1330. }
  1331. exportExcelService.AddCell(cuName, headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1332. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1333. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1334. }
  1335. }
  1336. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  1337. // 有效分标题
  1338. IRow headerRow5 = sheet.CreateRow(rowNum++);
  1339. headerRow5.HeightInPoints = 15;
  1340. ci = 0;
  1341. exportExcelService.AddCell("有效分", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1342. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1343. {
  1344. var lineScore = lineScoreTable.Select($"direction_course_id = {directionCourse.Id} AND ncee_line_level = {lineLevel["ncee_line_level"]}").First();
  1345. foreach (var cu in courses.Where(t => t.Id < CourseConst.WU_LI || t.Id == directionCourse.Id || t.Id == CourseConst.ZONG_HE))
  1346. {
  1347. exportExcelService.AddCell(lineScore[$"line_score_x_{cu.Id}"], headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1348. exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1349. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1350. }
  1351. }
  1352. // 人数比例标题
  1353. IRow headerRow6 = sheet.CreateRow(rowNum++);
  1354. headerRow6.HeightInPoints = 15;
  1355. ci = 0;
  1356. exportExcelService.AddCell("", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1357. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1358. {
  1359. foreach (var cu in courses.Where(t => t.Id < CourseConst.WU_LI || t.Id == directionCourse.Id || t.Id == CourseConst.ZONG_HE))
  1360. {
  1361. exportExcelService.AddCell("人数", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1362. exportExcelService.AddCell("比例", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1363. }
  1364. }
  1365. #endregion
  1366. #region 数据
  1367. var drs = table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = {CourseConst.WU_LI}");
  1368. foreach (DataRow dr4 in drs)
  1369. {
  1370. IRow row = sheet.CreateRow(rowNum++);
  1371. row.HeightInPoints = 15;
  1372. int rci = 0;
  1373. // 物理类
  1374. exportExcelService.AddCell(dr4["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1375. foreach (var cu in courses.Where(t => t.Id <= CourseConst.WU_LI || t.Id == CourseConst.ZONG_HE))
  1376. {
  1377. exportExcelService.AddCell(dr4[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1378. exportExcelService.AddCell(dr4[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1379. }
  1380. // 历史类
  1381. var dr8 = table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = {CourseConst.LI_SHI} AND sys_org_id = {dr4["sys_org_id"]}").FirstOrDefault();
  1382. if (dr8 != null)
  1383. {
  1384. foreach (var cu in courses.Where(t => t.Id < CourseConst.WU_LI || t.Id == CourseConst.LI_SHI || t.Id == CourseConst.ZONG_HE))
  1385. {
  1386. exportExcelService.AddCell(dr8[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1387. exportExcelService.AddCell(dr8[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1388. }
  1389. }
  1390. }
  1391. #endregion
  1392. rowNum += 2;
  1393. }
  1394. sheet.CreateFreezePane(1, 0);
  1395. }
  1396. #endregion
  1397. #region 转换区间
  1398. if (isExportConvertRange)
  1399. {
  1400. await ExportConvertRange(nceePlanId, wb, cellStyle);
  1401. }
  1402. #endregion
  1403. MemoryStream ms = new();
  1404. wb.Write(ms, false);
  1405. ms.Flush();
  1406. return ms.ToArray();
  1407. }
  1408. /// <summary>
  1409. /// 导出上线统计(未选科)
  1410. /// </summary>
  1411. /// <param name="nceePlanId"></param>
  1412. /// <param name="courses"></param>
  1413. /// <param name="lineLevelTable"></param>
  1414. /// <param name="directionUnseleted">是否未选科</param>
  1415. /// <returns></returns>
  1416. private async Task<byte[]> ExportLineUnselected(int nceePlanId, List<NceeCourseDto> courses, DataTable lineLevelTable, bool directionUnseleted = false)
  1417. {
  1418. XSSFWorkbook wb = new();
  1419. var cellStyle = exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  1420. #region 上线合并
  1421. if (!directionUnseleted)
  1422. {
  1423. await ExportLineTotal(nceePlanId, wb, cellStyle, "学校");
  1424. }
  1425. else
  1426. {
  1427. await ExportLineTotalUnselected(nceePlanId, wb, cellStyle, "学校");
  1428. }
  1429. #endregion
  1430. #region 平均分
  1431. {
  1432. ISheet sheet = wb.CreateSheet("平均分");
  1433. sheet.DisplayGridlines = false;
  1434. // 行索引号
  1435. int rowNum = 0;
  1436. var table = await GetAvgScoreTable(nceePlanId, 99);
  1437. #region 表头
  1438. IRow headerRow1 = sheet.CreateRow(rowNum++);
  1439. headerRow1.HeightInPoints = 30;
  1440. int ci = 0;
  1441. int scoreWidth = 8;
  1442. exportExcelService.AddCell($"平均分", headerRow1, ci++, cellStyle.TitleStyle, sheet, 10);
  1443. for (; ci < courses.Count * 2 + 1; ci++)
  1444. {
  1445. exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  1446. }
  1447. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1448. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1449. headerRow2.HeightInPoints = 15;
  1450. ci = 0;
  1451. exportExcelService.AddCell("学科", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1452. foreach (var course in courses)
  1453. {
  1454. string cn = course.Name;
  1455. exportExcelService.AddCell(cn, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1456. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1457. if (ci % 2 == 1)
  1458. {
  1459. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1460. }
  1461. }
  1462. IRow headerRow3 = sheet.CreateRow(rowNum++);
  1463. headerRow3.HeightInPoints = 15;
  1464. ci = 0;
  1465. exportExcelService.AddCell("学校", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1466. foreach (var course in courses)
  1467. {
  1468. exportExcelService.AddCell("人数", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1469. exportExcelService.AddCell("平均", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1470. }
  1471. #endregion
  1472. #region 数据
  1473. foreach (DataRow dr in table.Rows)
  1474. {
  1475. IRow row = sheet.CreateRow(rowNum++);
  1476. row.HeightInPoints = 15;
  1477. int rci = 0;
  1478. exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1479. foreach (var course in courses)
  1480. {
  1481. exportExcelService.AddCell(dr[$"total_count_{course.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1482. exportExcelService.AddCell(dr[$"avg_score_x_{course.Id}"], row, rci++, cellStyle.NumberCellStyleP2, zeroToBlank: true);
  1483. }
  1484. }
  1485. #endregion
  1486. }
  1487. #endregion
  1488. #region 有效分
  1489. var lineScoreTable = await GetLineScoreTable(nceePlanId);
  1490. ExportLineScore(wb, cellStyle, lineScoreTable, courses);
  1491. #endregion
  1492. #region 单上线
  1493. {
  1494. var table = await GetLineTotalTable(nceePlanId);
  1495. ISheet sheet = wb.CreateSheet("有效分总分单上线");
  1496. sheet.DisplayGridlines = false;
  1497. // 行索引号
  1498. int rowNum = 0;
  1499. foreach (DataRow lineLevel in lineLevelTable.Rows)
  1500. {
  1501. #region 表头
  1502. // 分类标题
  1503. IRow headerRow1 = sheet.CreateRow(rowNum++);
  1504. headerRow1.HeightInPoints = 30;
  1505. int ci = 0;
  1506. int countWidth = 6;
  1507. int scoreWidth = 8;
  1508. int orgWidth = 10;
  1509. exportExcelService.AddCell($"{lineLevel["ncee_line_level_name"]}有效分总分单上线", headerRow1, ci++, cellStyle.TitleStyle, sheet, orgWidth);
  1510. for (; ci < courses.Count * 2 + 1; ci++)
  1511. {
  1512. exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  1513. }
  1514. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1515. // 科目标题
  1516. IRow headerRow4 = sheet.CreateRow(rowNum++);
  1517. headerRow4.HeightInPoints = 15;
  1518. ci = 0;
  1519. exportExcelService.AddCell("科目", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1520. foreach (var cu in courses)
  1521. {
  1522. exportExcelService.AddCell(cu.Name, headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1523. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1524. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1525. }
  1526. // 有效分标题
  1527. IRow headerRow5 = sheet.CreateRow(rowNum++);
  1528. headerRow5.HeightInPoints = 15;
  1529. ci = 0;
  1530. exportExcelService.AddCell("有效分", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1531. var lineScore = lineScoreTable.Select($"direction_course_id = {CourseConst.WEI_XUAN_KE} AND ncee_line_level = {lineLevel["ncee_line_level"]}").First();
  1532. foreach (var cu in courses)
  1533. {
  1534. exportExcelService.AddCell(lineScore[$"line_score_x_{cu.Id}"], headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1535. exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1536. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1537. }
  1538. // 人数比例标题
  1539. IRow headerRow6 = sheet.CreateRow(rowNum++);
  1540. headerRow6.HeightInPoints = 15;
  1541. ci = 0;
  1542. exportExcelService.AddCell("学校", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1543. foreach (var cu in courses)
  1544. {
  1545. exportExcelService.AddCell("人数", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1546. exportExcelService.AddCell("比例", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1547. }
  1548. #endregion
  1549. #region 数据
  1550. foreach (DataRow dr in table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = 99"))
  1551. {
  1552. IRow row = sheet.CreateRow(rowNum++);
  1553. row.HeightInPoints = 15;
  1554. int rci = 0;
  1555. exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1556. foreach (var cu in courses)
  1557. {
  1558. exportExcelService.AddCell(dr[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1559. exportExcelService.AddCell(dr[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1560. }
  1561. }
  1562. #endregion
  1563. }
  1564. sheet.CreateFreezePane(1, 0);
  1565. }
  1566. #endregion
  1567. #region 双上线
  1568. {
  1569. var tcourse = courses.Where(t => t.Id < 100).ToList();
  1570. var table = await GetLineCourseTable(nceePlanId);
  1571. ISheet sheet = wb.CreateSheet("有效分总分双上线");
  1572. sheet.DisplayGridlines = false;
  1573. // 行索引号
  1574. int rowNum = 0;
  1575. foreach (DataRow lineLevel in lineLevelTable.Rows)
  1576. {
  1577. #region 表头
  1578. // 分类标题
  1579. IRow headerRow1 = sheet.CreateRow(rowNum++);
  1580. headerRow1.HeightInPoints = 30;
  1581. int ci = 0;
  1582. int countWidth = 6;
  1583. int scoreWidth = 8;
  1584. int orgWidth = 10;
  1585. exportExcelService.AddCell($"{lineLevel["ncee_line_level_name"]}有效分总分双上线", headerRow1, ci++, cellStyle.TitleStyle, sheet, orgWidth);
  1586. for (; ci < tcourse.Count * 2 + 1; ci++)
  1587. {
  1588. exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  1589. }
  1590. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1591. // 科目标题
  1592. IRow headerRow4 = sheet.CreateRow(rowNum++);
  1593. headerRow4.HeightInPoints = 15;
  1594. ci = 0;
  1595. exportExcelService.AddCell("科目", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1596. foreach (var cu in tcourse)
  1597. {
  1598. exportExcelService.AddCell(cu.Name, headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1599. exportExcelService.AddCell("", headerRow4, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1600. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1601. }
  1602. // 有效分标题
  1603. IRow headerRow5 = sheet.CreateRow(rowNum++);
  1604. headerRow5.HeightInPoints = 15;
  1605. ci = 0;
  1606. exportExcelService.AddCell("有效分", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1607. var lineScore = lineScoreTable.Select($"direction_course_id = 99 AND ncee_line_level = {lineLevel["ncee_line_level"]}").First();
  1608. foreach (var cu in tcourse)
  1609. {
  1610. exportExcelService.AddCell(lineScore[$"line_score_x_{cu.Id}"], headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1611. exportExcelService.AddCell("", headerRow5, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1612. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1613. }
  1614. // 人数比例标题
  1615. IRow headerRow6 = sheet.CreateRow(rowNum++);
  1616. headerRow6.HeightInPoints = 15;
  1617. ci = 0;
  1618. exportExcelService.AddCell("学校", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, orgWidth);
  1619. foreach (var cu in tcourse)
  1620. {
  1621. exportExcelService.AddCell("人数", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, countWidth);
  1622. exportExcelService.AddCell("比例", headerRow6, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1623. }
  1624. #endregion
  1625. #region 数据
  1626. foreach (DataRow dr in table.Select($"ncee_line_level = {lineLevel["ncee_line_level"]} AND direction_course_id = 99"))
  1627. {
  1628. IRow row = sheet.CreateRow(rowNum++);
  1629. row.HeightInPoints = 15;
  1630. int rci = 0;
  1631. exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1632. foreach (var cu in tcourse)
  1633. {
  1634. exportExcelService.AddCell(dr[$"line_count_{cu.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  1635. exportExcelService.AddCell(dr[$"line_rate_{cu.Id}"], row, rci++, cellStyle.NumberCellStyleP4, zeroToBlank: true);
  1636. }
  1637. }
  1638. #endregion
  1639. }
  1640. sheet.CreateFreezePane(1, 0);
  1641. }
  1642. #endregion
  1643. MemoryStream ms = new();
  1644. wb.Write(ms, false);
  1645. ms.Flush();
  1646. return ms.ToArray();
  1647. }
  1648. /// <summary>
  1649. /// 导出转换成绩
  1650. /// </summary>
  1651. /// <param name="input"></param>
  1652. /// <returns></returns>
  1653. private async Task<byte[]> ExportConvertScore(ExportConvertScoreDto input)
  1654. {
  1655. XSSFWorkbook wb = new();
  1656. var cellStyle = exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  1657. foreach (var dc in NceeUtil.DirectionCourses)
  1658. {
  1659. var table = await GetConvertScoreTable(input.NceePlanId, dc.Id, input.Org?.Id ?? 0);
  1660. ISheet sheet = wb.CreateSheet($"{dc.Name}类");
  1661. sheet.DisplayGridlines = false;
  1662. // 行索引号
  1663. int rowNum = 0;
  1664. #region 表头
  1665. IRow headerRow = sheet.CreateRow(rowNum++);
  1666. int ci = 0;
  1667. int scoreWidth = 8;
  1668. exportExcelService.AddCell(input.OrgTitle, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1669. exportExcelService.AddCell(input.ExamNumberTitle, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  1670. if (input.IsExportStudentName)
  1671. {
  1672. exportExcelService.AddCell("姓名", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  1673. }
  1674. if (input.IsExportClassNumber)
  1675. {
  1676. exportExcelService.AddCell("班级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1677. }
  1678. if (input.IsExportDirectionCourse)
  1679. {
  1680. exportExcelService.AddCell("选科方向", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  1681. }
  1682. if (input.IsExportComb)
  1683. {
  1684. exportExcelService.AddCell("选科组合", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 12);
  1685. }
  1686. exportExcelService.AddCell("总分", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1687. exportExcelService.AddCell("总分X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1688. if (input.IsExportOrder)
  1689. {
  1690. exportExcelService.AddCell(input.OrderTotalTitle, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1691. exportExcelService.AddCell(input.OrderOrgTitle, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1692. }
  1693. exportExcelService.AddCell("语文", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1694. exportExcelService.AddCell("数学", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1695. exportExcelService.AddCell("英语", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1696. exportExcelService.AddCell(dc.Name, headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1697. exportExcelService.AddCell("综合", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1698. exportExcelService.AddCell("综合X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1699. exportExcelService.AddCell("等级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth + 2);
  1700. exportExcelService.AddCell("化学", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1701. exportExcelService.AddCell("化学X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1702. exportExcelService.AddCell("等级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1703. exportExcelService.AddCell("生物", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1704. exportExcelService.AddCell("生物X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1705. exportExcelService.AddCell("等级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1706. exportExcelService.AddCell("政治", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1707. exportExcelService.AddCell("政治X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1708. exportExcelService.AddCell("等级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1709. exportExcelService.AddCell("地理", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1710. exportExcelService.AddCell("地理X", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1711. exportExcelService.AddCell("等级", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1712. sheet.CreateFreezePane(0, rowNum);
  1713. #endregion
  1714. #region 数据
  1715. foreach (DataRow dr in table.Rows)
  1716. {
  1717. List<string> cgns =
  1718. [
  1719. dr["ncee_convert_grade_name_5"].ToString(),
  1720. dr["ncee_convert_grade_name_6"].ToString(),
  1721. dr["ncee_convert_grade_name_7"].ToString(),
  1722. dr["ncee_convert_grade_name_9"].ToString()
  1723. ];
  1724. //cgns = cgns.Where(t => t != "").ToList();
  1725. //string cg = string.Join("", cgns);
  1726. //if (cg != "")
  1727. //{
  1728. // cg = $"[{cg}]";
  1729. //}
  1730. string cg = GetMergeGradeName(cgns);
  1731. IRow row = sheet.CreateRow(rowNum++);
  1732. int rci = 0;
  1733. exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1734. exportExcelService.AddCell(dr["exam_number"], row, rci++, cellStyle.CenterCellStyle);
  1735. if (input.IsExportStudentName)
  1736. {
  1737. exportExcelService.AddCell(dr["name"], row, rci++, cellStyle.CenterCellStyle);
  1738. }
  1739. if (input.IsExportClassNumber)
  1740. {
  1741. exportExcelService.AddCell(dr["class_number"], row, rci++, cellStyle.CenterCellStyle);
  1742. }
  1743. if (input.IsExportDirectionCourse)
  1744. {
  1745. exportExcelService.AddCell(dr["direction_course_name"], row, rci++, cellStyle.CenterCellStyle);
  1746. }
  1747. if (input.IsExportComb)
  1748. {
  1749. exportExcelService.AddCell(dr["ncee_course_comb_short_name"], row, rci++, cellStyle.CenterCellStyle);
  1750. }
  1751. exportExcelService.AddCell(dr["score"], row, rci++, cellStyle.CenterCellStyle);
  1752. exportExcelService.AddCell(dr["score_x"], row, rci++, cellStyle.CenterCellStyle);
  1753. if (input.IsExportOrder)
  1754. {
  1755. exportExcelService.AddCell(dr["order_in_total_x"], row, rci++, cellStyle.CenterCellStyle);
  1756. exportExcelService.AddCell(dr["order_in_org_x"], row, rci++, cellStyle.CenterCellStyle);
  1757. }
  1758. exportExcelService.AddCell(dr["score_1"], row, rci++, cellStyle.CenterCellStyle);
  1759. exportExcelService.AddCell(dr["score_2"], row, rci++, cellStyle.CenterCellStyle);
  1760. exportExcelService.AddCell(dr["score_3"], row, rci++, cellStyle.CenterCellStyle);
  1761. exportExcelService.AddCell(dr[$"score_{dc.Id}"], row, rci++, cellStyle.CenterCellStyle);
  1762. exportExcelService.AddCell(dr["comb_score"], row, rci++, cellStyle.CenterCellStyle);
  1763. exportExcelService.AddCell(dr["comb_score_x"], row, rci++, cellStyle.CenterCellStyle);
  1764. exportExcelService.AddCell(cg, row, rci++, cellStyle.CenterCellStyle);
  1765. exportExcelService.AddCell(dr["score_5"], row, rci++, cellStyle.CenterCellStyle);
  1766. exportExcelService.AddCell(dr["score_x_5"], row, rci++, cellStyle.CenterCellStyle);
  1767. exportExcelService.AddCell(dr["ncee_convert_grade_name_5"], row, rci++, cellStyle.CenterCellStyle);
  1768. exportExcelService.AddCell(dr["score_6"], row, rci++, cellStyle.CenterCellStyle);
  1769. exportExcelService.AddCell(dr["score_x_6"], row, rci++, cellStyle.CenterCellStyle);
  1770. exportExcelService.AddCell(dr["ncee_convert_grade_name_6"], row, rci++, cellStyle.CenterCellStyle);
  1771. exportExcelService.AddCell(dr["score_7"], row, rci++, cellStyle.CenterCellStyle);
  1772. exportExcelService.AddCell(dr["score_x_7"], row, rci++, cellStyle.CenterCellStyle);
  1773. exportExcelService.AddCell(dr["ncee_convert_grade_name_7"], row, rci++, cellStyle.CenterCellStyle);
  1774. exportExcelService.AddCell(dr["score_9"], row, rci++, cellStyle.CenterCellStyle);
  1775. exportExcelService.AddCell(dr["score_x_9"], row, rci++, cellStyle.CenterCellStyle);
  1776. exportExcelService.AddCell(dr["ncee_convert_grade_name_9"], row, rci++, cellStyle.CenterCellStyle);
  1777. }
  1778. #endregion
  1779. }
  1780. // 导出转换区间
  1781. if (input.IsExportConvertRange)
  1782. {
  1783. await ExportConvertRange(input.NceePlanId, wb, cellStyle);
  1784. }
  1785. MemoryStream ms = new();
  1786. wb.Write(ms, false);
  1787. ms.Flush();
  1788. return ms.ToArray();
  1789. }
  1790. /// <summary>
  1791. /// 导出汇总班级上线情况
  1792. /// </summary>
  1793. /// <param name="nceePlanId"></param>
  1794. /// <param name="baseLineTable"></param>
  1795. /// <returns></returns>
  1796. private async Task<byte[]> ExportClassLine(int nceePlanId, DataTable baseLineTable)
  1797. {
  1798. XSSFWorkbook wb = new();
  1799. var cellStyle = exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  1800. var cellStyleIndent1 = wb.CreateCellStyle();
  1801. cellStyleIndent1.CloneStyleFrom(cellStyle.LeftCellStyle);
  1802. cellStyleIndent1.Indention = 1;
  1803. var cellStyleIndent2 = wb.CreateCellStyle();
  1804. cellStyleIndent2.CloneStyleFrom(cellStyle.LeftCellStyle);
  1805. cellStyleIndent2.Indention = 2;
  1806. #region 总分上线
  1807. {
  1808. var table = await GetOrgLineTotalTable2(nceePlanId, 0);
  1809. ISheet sheet = wb.CreateSheet("总分上线");
  1810. sheet.DisplayGridlines = false;
  1811. // 行索引号
  1812. int rowNum = 0;
  1813. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1814. {
  1815. var nls = baseLineTable.Select($"direction_course_id = {directionCourse.Id}");
  1816. #region 标题
  1817. IRow titleRow = sheet.CreateRow(rowNum++);
  1818. titleRow.HeightInPoints = 30;
  1819. int ci = 0;
  1820. int scoreWidth = 10;
  1821. exportExcelService.AddCell($"{directionCourse.Name}类总分上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  1822. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  1823. foreach (var nl in nls)
  1824. {
  1825. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1826. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1827. }
  1828. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1829. #endregion
  1830. #region 表头
  1831. IRow headerRow = sheet.CreateRow(rowNum++);
  1832. ci = 0;
  1833. exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1834. exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1835. foreach (var nl in nls)
  1836. {
  1837. exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({nl["line_score_x"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1838. exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1839. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1840. }
  1841. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1842. ci = 0;
  1843. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1844. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1845. foreach (var nl in nls)
  1846. {
  1847. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1848. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1849. }
  1850. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  1851. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  1852. #endregion
  1853. foreach (DataRow dr in table.Select($"direction_course_id = {directionCourse.Id}"))
  1854. {
  1855. IRow row = sheet.CreateRow(rowNum++);
  1856. int rci = 0;
  1857. var type = (long)dr["type"];
  1858. string itemName = "";
  1859. switch (type)
  1860. {
  1861. case 1:
  1862. itemName = $"{dr["sys_org_name"]}";
  1863. break;
  1864. case 2:
  1865. itemName = $"{dr["ncee_course_comb_name"]}";
  1866. break;
  1867. case 3:
  1868. itemName = $"{dr["class_number"]}班";
  1869. break;
  1870. }
  1871. exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  1872. exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  1873. foreach (var nl in nls)
  1874. {
  1875. exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  1876. exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  1877. }
  1878. }
  1879. rowNum += 1;
  1880. }
  1881. }
  1882. #endregion
  1883. #region 双上线
  1884. {
  1885. var table = await GetOrgLineCourseTable2(nceePlanId, 0);
  1886. ISheet sheet = wb.CreateSheet("双上线");
  1887. sheet.DisplayGridlines = false;
  1888. // 行索引号
  1889. int rowNum = 0;
  1890. foreach (var directionCourse in NceeUtil.DirectionCourses)
  1891. {
  1892. var nls = baseLineTable.Select($"direction_course_id = {directionCourse.Id}");
  1893. #region 标题
  1894. IRow titleRow = sheet.CreateRow(rowNum++);
  1895. titleRow.HeightInPoints = 30;
  1896. int ci = 0;
  1897. int scoreWidth = 10;
  1898. exportExcelService.AddCell($"{directionCourse.Name}类双上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  1899. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  1900. foreach (var nl in nls)
  1901. {
  1902. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1903. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  1904. }
  1905. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1906. #endregion
  1907. var lineScoreTable = await GetLineScoreTable2(nceePlanId);
  1908. foreach (var lst in lineScoreTable.Select($"direction_course_id = {directionCourse.Id} AND course_id <> 100"))
  1909. {
  1910. #region 表头
  1911. IRow subTitleRow = sheet.CreateRow(rowNum++);
  1912. ci = 0;
  1913. exportExcelService.AddCell($"{lst["course_name"]}", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1914. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1915. foreach (var nl in nls)
  1916. {
  1917. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1918. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1919. }
  1920. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  1921. IRow headerRow = sheet.CreateRow(rowNum++);
  1922. ci = 0;
  1923. exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1924. exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1925. foreach (var nl in nls)
  1926. {
  1927. exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({lst[$"line_score_x_{nl["ncee_line_level"]}"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1928. exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1929. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  1930. }
  1931. IRow headerRow2 = sheet.CreateRow(rowNum++);
  1932. ci = 0;
  1933. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  1934. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  1935. foreach (var nl in nls)
  1936. {
  1937. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1938. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  1939. }
  1940. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  1941. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  1942. #endregion
  1943. foreach (DataRow dr in table.Select($"direction_course_id = {directionCourse.Id} AND course_id = {lst["course_id"]}"))
  1944. {
  1945. IRow row = sheet.CreateRow(rowNum++);
  1946. int rci = 0;
  1947. short type = (short)dr["type"];
  1948. string itemName = "";
  1949. switch (type)
  1950. {
  1951. case 1:
  1952. itemName = $"{dr["sys_org_name"]}";
  1953. break;
  1954. case 2:
  1955. itemName = $"{dr["ncee_course_comb_name"]}";
  1956. break;
  1957. case 3:
  1958. itemName = $"{dr["class_number"]}班";
  1959. break;
  1960. }
  1961. exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  1962. exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  1963. foreach (var nl in nls)
  1964. {
  1965. exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  1966. exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  1967. }
  1968. }
  1969. rowNum += 1;
  1970. }
  1971. }
  1972. }
  1973. #endregion
  1974. MemoryStream ms = new();
  1975. wb.Write(ms, false);
  1976. ms.Flush();
  1977. return ms.ToArray();
  1978. }
  1979. /// <summary>
  1980. /// 导出汇总班级上线情况(未选科)
  1981. /// </summary>
  1982. /// <param name="nceePlanId"></param>
  1983. /// <param name="baseLineTable"></param>
  1984. /// <returns></returns>
  1985. private async Task<byte[]> ExportClassLineUnselected(int nceePlanId, DataTable baseLineTable)
  1986. {
  1987. XSSFWorkbook wb = new();
  1988. var cellStyle = exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  1989. var cellStyleIndent1 = wb.CreateCellStyle();
  1990. cellStyleIndent1.CloneStyleFrom(cellStyle.LeftCellStyle);
  1991. cellStyleIndent1.Indention = 1;
  1992. var cellStyleIndent2 = wb.CreateCellStyle();
  1993. cellStyleIndent2.CloneStyleFrom(cellStyle.LeftCellStyle);
  1994. cellStyleIndent2.Indention = 2;
  1995. #region 总分上线
  1996. {
  1997. var table = await GetOrgLineTotalTable2(nceePlanId, 0);
  1998. ISheet sheet = wb.CreateSheet("总分上线");
  1999. sheet.DisplayGridlines = false;
  2000. // 行索引号
  2001. int rowNum = 0;
  2002. var nls = baseLineTable.Select($"direction_course_id = {CourseConst.WEI_XUAN_KE}");
  2003. #region 标题
  2004. IRow titleRow = sheet.CreateRow(rowNum++);
  2005. titleRow.HeightInPoints = 30;
  2006. int ci = 0;
  2007. int scoreWidth = 10;
  2008. exportExcelService.AddCell($"总分上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  2009. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  2010. foreach (var nl in nls)
  2011. {
  2012. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2013. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2014. }
  2015. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2016. #endregion
  2017. #region 表头
  2018. IRow headerRow = sheet.CreateRow(rowNum++);
  2019. ci = 0;
  2020. exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2021. exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2022. foreach (var nl in nls)
  2023. {
  2024. exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({nl["line_score_x"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2025. exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2026. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2027. }
  2028. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2029. ci = 0;
  2030. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2031. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2032. foreach (var nl in nls)
  2033. {
  2034. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2035. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2036. }
  2037. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  2038. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  2039. #endregion
  2040. foreach (DataRow dr in table.Select($"direction_course_id = {CourseConst.WEI_XUAN_KE}"))
  2041. {
  2042. var type = (long)dr["type"];
  2043. if (type == 2)
  2044. {
  2045. continue;
  2046. }
  2047. IRow row = sheet.CreateRow(rowNum++);
  2048. int rci = 0;
  2049. string itemName = "";
  2050. switch (type)
  2051. {
  2052. case 1:
  2053. itemName = $"{dr["sys_org_name"]}";
  2054. break;
  2055. case 3:
  2056. itemName = $"{dr["class_number"]}班";
  2057. break;
  2058. }
  2059. exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  2060. exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  2061. foreach (var nl in nls)
  2062. {
  2063. exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  2064. exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  2065. }
  2066. }
  2067. }
  2068. #endregion
  2069. #region 双上线
  2070. {
  2071. var table = await GetOrgLineCourseTable2(nceePlanId, 0);
  2072. ISheet sheet = wb.CreateSheet("双上线");
  2073. sheet.DisplayGridlines = false;
  2074. // 行索引号
  2075. int rowNum = 0;
  2076. var nls = baseLineTable.Select($"direction_course_id = 99");
  2077. #region 标题
  2078. IRow titleRow = sheet.CreateRow(rowNum++);
  2079. titleRow.HeightInPoints = 30;
  2080. int ci = 0;
  2081. int scoreWidth = 10;
  2082. exportExcelService.AddCell($"双上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  2083. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  2084. foreach (var nl in nls)
  2085. {
  2086. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2087. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2088. }
  2089. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2090. #endregion
  2091. var lineScoreTable = await GetLineScoreTable2(nceePlanId);
  2092. foreach (var lst in lineScoreTable.Select($"direction_course_id = 99 AND course_id <> 100"))
  2093. {
  2094. #region 表头
  2095. IRow subTitleRow = sheet.CreateRow(rowNum++);
  2096. ci = 0;
  2097. exportExcelService.AddCell($"{lst["course_name"]}", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2098. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2099. foreach (var nl in nls)
  2100. {
  2101. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2102. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2103. }
  2104. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2105. IRow headerRow = sheet.CreateRow(rowNum++);
  2106. ci = 0;
  2107. exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2108. exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2109. foreach (var nl in nls)
  2110. {
  2111. exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({lst[$"line_score_x_{nl["ncee_line_level"]}"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2112. exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2113. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2114. }
  2115. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2116. ci = 0;
  2117. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2118. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2119. foreach (var nl in nls)
  2120. {
  2121. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2122. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2123. }
  2124. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  2125. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  2126. #endregion
  2127. foreach (DataRow dr in table.Select($"direction_course_id = 99 AND course_id = {lst["course_id"]}"))
  2128. {
  2129. short type = (short)dr["type"];
  2130. if (type == 2)
  2131. {
  2132. continue;
  2133. }
  2134. IRow row = sheet.CreateRow(rowNum++);
  2135. int rci = 0;
  2136. string itemName = "";
  2137. switch (type)
  2138. {
  2139. case 1:
  2140. itemName = $"{dr["sys_org_name"]}";
  2141. break;
  2142. case 2:
  2143. itemName = $"{dr["ncee_course_comb_name"]}";
  2144. break;
  2145. case 3:
  2146. itemName = $"{dr["class_number"]}班";
  2147. break;
  2148. }
  2149. exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  2150. exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  2151. foreach (var nl in nls)
  2152. {
  2153. exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  2154. exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  2155. }
  2156. }
  2157. }
  2158. }
  2159. #endregion
  2160. MemoryStream ms = new();
  2161. wb.Write(ms, false);
  2162. ms.Flush();
  2163. return ms.ToArray();
  2164. }
  2165. /// <summary>
  2166. /// 导出各机构转换成绩
  2167. /// </summary>
  2168. /// <param name="nceePlanId"></param>
  2169. /// <param name="orgList"></param>
  2170. /// <param name="isExportConvertRange">导出转换区间</param>
  2171. /// <param name="isExportOrder">导出排名</param>
  2172. /// <returns></returns>
  2173. private async Task<Dictionary<string, byte[]>> ExportOrgConvertScore(int nceePlanId, List<SysOrgOutput> orgList, bool isExportConvertRange = false, bool isExportOrder = false)
  2174. {
  2175. Dictionary<string, byte[]> ret = [];
  2176. foreach (var org in orgList)
  2177. {
  2178. var bs = await ExportConvertScore(new ExportConvertScoreDto
  2179. {
  2180. NceePlanId = nceePlanId,
  2181. Org = org,
  2182. IsExportConvertRange = isExportConvertRange,
  2183. IsExportOrder = isExportOrder,
  2184. IsExportStudentName = true,
  2185. IsExportComb = true,
  2186. IsExportDirectionCourse = true,
  2187. IsExportClassNumber = true,
  2188. });
  2189. ret.Add($"{org.Code}-{org.ShortName}", bs);
  2190. }
  2191. return ret;
  2192. }
  2193. /// <summary>
  2194. /// 导出各机构班级上线情况
  2195. /// </summary>
  2196. /// <param name="nceePlanId"></param>
  2197. /// <param name="orgList"></param>
  2198. /// <param name="baseLineTable"></param>
  2199. /// <param name="courses"></param>
  2200. /// <returns></returns>
  2201. private async Task<Dictionary<string, byte[]>> ExportOrgClassLine(int nceePlanId, List<SysOrgOutput> orgList, DataTable baseLineTable, List<NceeCourseDto> courses)
  2202. {
  2203. Dictionary<string, byte[]> ret = [];
  2204. foreach (var org in orgList)
  2205. {
  2206. IWorkbook wb = new XSSFWorkbook();
  2207. var cellStyle = exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  2208. var cellStyleIndent1 = wb.CreateCellStyle();
  2209. cellStyleIndent1.CloneStyleFrom(cellStyle.LeftCellStyle);
  2210. cellStyleIndent1.Indention = 1;
  2211. var cellStyleIndent2 = wb.CreateCellStyle();
  2212. cellStyleIndent2.CloneStyleFrom(cellStyle.LeftCellStyle);
  2213. cellStyleIndent2.Indention = 2;
  2214. #region 有效分
  2215. await ExportLineScore(nceePlanId, wb, cellStyle, isExportRate: false);
  2216. #endregion
  2217. #region 平均分
  2218. {
  2219. var tcourses = courses.Where(t => t.Id != 101).ToList();
  2220. ISheet sheet = wb.CreateSheet("平均分");
  2221. sheet.DisplayGridlines = false;
  2222. // 行索引号
  2223. int rowNum = 0;
  2224. foreach (var directionCourse in NceeUtil.DirectionCourses)
  2225. {
  2226. var table = await GetAvgScoreTable(nceePlanId, directionCourse.Id);
  2227. #region 表头
  2228. IRow headerRow1 = sheet.CreateRow(rowNum++);
  2229. headerRow1.HeightInPoints = 30;
  2230. int ci = 0;
  2231. int scoreWidth = 8;
  2232. exportExcelService.AddCell($"{directionCourse.Name}类平均分", headerRow1, ci++, cellStyle.TitleStyle, sheet, 10);
  2233. for (; ci < 19; ci++)
  2234. {
  2235. exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  2236. }
  2237. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2238. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2239. headerRow2.HeightInPoints = 15;
  2240. ci = 0;
  2241. exportExcelService.AddCell("学科", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2242. foreach (var course in tcourses)
  2243. {
  2244. if (course.IsSkip(directionCourse.Id)) { continue; }
  2245. string cn = course.Name;
  2246. if (course.Id == 5 || course.Id == 6 || course.Id == 7 || course.Id == 9 || course.Id == 100)
  2247. {
  2248. cn = $"{cn}X";
  2249. }
  2250. exportExcelService.AddCell(cn, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2251. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2252. if (ci % 2 == 1)
  2253. {
  2254. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2255. }
  2256. }
  2257. IRow headerRow3 = sheet.CreateRow(rowNum++);
  2258. headerRow3.HeightInPoints = 15;
  2259. ci = 0;
  2260. exportExcelService.AddCell("学校", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2261. foreach (var course in tcourses)
  2262. {
  2263. if (course.IsSkip(directionCourse.Id)) { continue; }
  2264. exportExcelService.AddCell("人数", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2265. exportExcelService.AddCell("平均", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2266. }
  2267. #endregion
  2268. #region 数据
  2269. foreach (DataRow dr in table.Rows)
  2270. {
  2271. IRow row = sheet.CreateRow(rowNum++);
  2272. row.HeightInPoints = 15;
  2273. int rci = 0;
  2274. exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  2275. foreach (var course in tcourses)
  2276. {
  2277. if (course.IsSkip(directionCourse.Id)) { continue; }
  2278. exportExcelService.AddCell(dr[$"total_count_{course.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  2279. exportExcelService.AddCell(dr[$"avg_score_x_{course.Id}"], row, rci++, cellStyle.NumberCellStyleP2, zeroToBlank: true);
  2280. }
  2281. }
  2282. #endregion
  2283. rowNum += 2;
  2284. }
  2285. }
  2286. #endregion
  2287. #region 总分上线
  2288. {
  2289. var table = await GetOrgLineTotalTable2(nceePlanId, org.Id);
  2290. ISheet sheet = wb.CreateSheet("总分上线");
  2291. sheet.DisplayGridlines = false;
  2292. // 行索引号
  2293. int rowNum = 0;
  2294. foreach (var directionCourse in NceeUtil.DirectionCourses)
  2295. {
  2296. var nls = baseLineTable.Select($"direction_course_id = {directionCourse.Id}");
  2297. #region 表头
  2298. IRow titleRow = sheet.CreateRow(rowNum++);
  2299. titleRow.HeightInPoints = 30;
  2300. int ci = 0;
  2301. int scoreWidth = 10;
  2302. exportExcelService.AddCell($"{org.ShortName}{directionCourse.Name}类总分上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  2303. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  2304. foreach (var nl in nls)
  2305. {
  2306. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2307. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2308. }
  2309. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2310. IRow headerRow = sheet.CreateRow(rowNum++);
  2311. ci = 0;
  2312. exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2313. exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2314. foreach (var nl in nls)
  2315. {
  2316. exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({nl["line_score_x"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2317. exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2318. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2319. }
  2320. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2321. ci = 0;
  2322. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2323. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2324. foreach (var nl in nls)
  2325. {
  2326. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2327. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2328. }
  2329. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  2330. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  2331. #endregion
  2332. #region 数据
  2333. foreach (DataRow dr in table.Select($"direction_course_id = {directionCourse.Id}"))
  2334. {
  2335. IRow row = sheet.CreateRow(rowNum++);
  2336. int rci = 0;
  2337. var type = (long)dr["type"];
  2338. string itemName = "";
  2339. switch (type)
  2340. {
  2341. case 1:
  2342. itemName = $"{dr["sys_org_name"]}";
  2343. break;
  2344. case 2:
  2345. itemName = $"{dr["ncee_course_comb_name"]}";
  2346. break;
  2347. case 3:
  2348. itemName = $"{dr["class_number"]}班";
  2349. break;
  2350. }
  2351. exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  2352. exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  2353. foreach (var nl in nls)
  2354. {
  2355. exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  2356. exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  2357. }
  2358. }
  2359. #endregion
  2360. rowNum += 1;
  2361. }
  2362. }
  2363. #endregion
  2364. #region 双上线
  2365. {
  2366. var table = await GetOrgLineCourseTable2(nceePlanId, org.Id);
  2367. var lineScoreTable = await GetLineScoreTable2(nceePlanId);
  2368. ISheet sheet = wb.CreateSheet("双上线");
  2369. sheet.DisplayGridlines = false;
  2370. // 行索引号
  2371. int rowNum = 0;
  2372. foreach (var directionCourse in NceeUtil.DirectionCourses)
  2373. {
  2374. var nls = baseLineTable.Select($"direction_course_id = {directionCourse.Id}");
  2375. IRow titleRow = sheet.CreateRow(rowNum++);
  2376. titleRow.HeightInPoints = 30;
  2377. int ci = 0;
  2378. int scoreWidth = 10;
  2379. exportExcelService.AddCell($"{org.ShortName}{directionCourse.Name}类双上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  2380. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  2381. foreach (var nl in nls)
  2382. {
  2383. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2384. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2385. }
  2386. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2387. foreach (var lst in lineScoreTable.Select($"direction_course_id = {directionCourse.Id} AND course_id <> 100"))
  2388. {
  2389. #region 表头
  2390. IRow subTitleRow = sheet.CreateRow(rowNum++);
  2391. ci = 0;
  2392. exportExcelService.AddCell($"{lst["course_name"]}", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2393. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2394. foreach (var nl in nls)
  2395. {
  2396. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2397. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2398. }
  2399. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2400. IRow headerRow = sheet.CreateRow(rowNum++);
  2401. ci = 0;
  2402. exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2403. exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2404. foreach (var nl in nls)
  2405. {
  2406. exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({lst[$"line_score_x_{nl["ncee_line_level"]}"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2407. exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2408. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2409. }
  2410. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2411. ci = 0;
  2412. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2413. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2414. foreach (var nl in nls)
  2415. {
  2416. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2417. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2418. }
  2419. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  2420. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  2421. #endregion
  2422. #region 数据
  2423. foreach (DataRow dr in table.Select($"direction_course_id = {directionCourse.Id} AND course_id = {lst["course_id"]}"))
  2424. {
  2425. IRow row = sheet.CreateRow(rowNum++);
  2426. int rci = 0;
  2427. short type = (short)dr["type"];
  2428. string itemName = "";
  2429. switch (type)
  2430. {
  2431. case 1:
  2432. itemName = $"{dr["sys_org_name"]}";
  2433. break;
  2434. case 2:
  2435. itemName = $"{dr["ncee_course_comb_name"]}";
  2436. break;
  2437. case 3:
  2438. itemName = $"{dr["class_number"]}班";
  2439. break;
  2440. }
  2441. exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  2442. exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  2443. foreach (var nl in nls)
  2444. {
  2445. exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  2446. exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  2447. }
  2448. }
  2449. #endregion
  2450. rowNum += 1;
  2451. }
  2452. }
  2453. }
  2454. #endregion
  2455. MemoryStream ms = new();
  2456. wb.Write(ms, false);
  2457. ms.Flush();
  2458. ret.Add($"{org.Code}-{org.ShortName}", ms.ToArray());
  2459. }
  2460. return ret;
  2461. }
  2462. /// <summary>
  2463. /// 导出各机构班级上线情况(未选科)
  2464. /// </summary>
  2465. /// <param name="nceePlanId"></param>
  2466. /// <param name="orgList"></param>
  2467. /// <param name="baseLineTable"></param>
  2468. /// <param name="courses"></param>
  2469. /// <returns></returns>
  2470. private async Task<Dictionary<string, byte[]>> ExportOrgClassLineUnselected(int nceePlanId, List<SysOrgOutput> orgList, DataTable baseLineTable, List<NceeCourseDto> courses)
  2471. {
  2472. Dictionary<string, byte[]> ret = [];
  2473. foreach (var org in orgList)
  2474. {
  2475. var wb = new XSSFWorkbook();
  2476. var cellStyle = exportExcelService.GetCellStyle(wb, titleFontSize: 14);
  2477. var cellStyleIndent1 = wb.CreateCellStyle();
  2478. cellStyleIndent1.CloneStyleFrom(cellStyle.LeftCellStyle);
  2479. cellStyleIndent1.Indention = 1;
  2480. var cellStyleIndent2 = wb.CreateCellStyle();
  2481. cellStyleIndent2.CloneStyleFrom(cellStyle.LeftCellStyle);
  2482. cellStyleIndent2.Indention = 2;
  2483. #region 有效分
  2484. var lstable = await GetLineScoreTable(nceePlanId);
  2485. ExportLineScore(wb, cellStyle, lstable, courses);
  2486. #endregion
  2487. #region 平均分
  2488. {
  2489. ISheet sheet = wb.CreateSheet("平均分");
  2490. sheet.DisplayGridlines = false;
  2491. // 行索引号
  2492. int rowNum = 0;
  2493. var table = await GetAvgScoreTable(nceePlanId, CourseConst.WEI_XUAN_KE);
  2494. #region 表头
  2495. IRow headerRow1 = sheet.CreateRow(rowNum++);
  2496. headerRow1.HeightInPoints = 30;
  2497. int ci = 0;
  2498. int scoreWidth = 8;
  2499. exportExcelService.AddCell($"平均分", headerRow1, ci++, cellStyle.TitleStyle, sheet, 10);
  2500. for (; ci < courses.Count * 2 + 1; ci++)
  2501. {
  2502. exportExcelService.AddCell("", headerRow1, ci, cellStyle.TitleStyle, sheet, scoreWidth);
  2503. }
  2504. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2505. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2506. headerRow2.HeightInPoints = 15;
  2507. ci = 0;
  2508. exportExcelService.AddCell("学科", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2509. foreach (var course in courses)
  2510. {
  2511. string cn = course.Name;
  2512. exportExcelService.AddCell(cn, headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2513. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2514. if (ci % 2 == 1)
  2515. {
  2516. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2517. }
  2518. }
  2519. IRow headerRow3 = sheet.CreateRow(rowNum++);
  2520. headerRow3.HeightInPoints = 15;
  2521. ci = 0;
  2522. exportExcelService.AddCell("学校", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2523. foreach (var course in courses)
  2524. {
  2525. exportExcelService.AddCell("人数", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2526. exportExcelService.AddCell("平均", headerRow3, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2527. }
  2528. #endregion
  2529. #region 数据
  2530. foreach (DataRow dr in table.Rows)
  2531. {
  2532. IRow row = sheet.CreateRow(rowNum++);
  2533. row.HeightInPoints = 15;
  2534. int rci = 0;
  2535. exportExcelService.AddCell(dr["sys_org_short_name"], row, rci++, cellStyle.CenterCellStyle);
  2536. foreach (var course in courses)
  2537. {
  2538. exportExcelService.AddCell(dr[$"total_count_{course.Id}"], row, rci++, cellStyle.CenterCellStyle, zeroToBlank: true);
  2539. exportExcelService.AddCell(dr[$"avg_score_x_{course.Id}"], row, rci++, cellStyle.NumberCellStyleP2, zeroToBlank: true);
  2540. }
  2541. }
  2542. #endregion
  2543. }
  2544. #endregion
  2545. #region 总分上线
  2546. {
  2547. var table = await GetOrgLineTotalTable2(nceePlanId, org.Id);
  2548. ISheet sheet = wb.CreateSheet("总分上线");
  2549. sheet.DisplayGridlines = false;
  2550. // 行索引号
  2551. int rowNum = 0;
  2552. var nls = baseLineTable.Select($"direction_course_id = {CourseConst.WEI_XUAN_KE}");
  2553. #region 表头
  2554. IRow titleRow = sheet.CreateRow(rowNum++);
  2555. titleRow.HeightInPoints = 30;
  2556. int ci = 0;
  2557. int scoreWidth = 10;
  2558. exportExcelService.AddCell($"{org.ShortName}总分上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  2559. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  2560. foreach (var nl in nls)
  2561. {
  2562. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2563. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2564. }
  2565. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2566. IRow headerRow = sheet.CreateRow(rowNum++);
  2567. ci = 0;
  2568. exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2569. exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2570. foreach (var nl in nls)
  2571. {
  2572. exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({nl["line_score_x"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2573. exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2574. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2575. }
  2576. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2577. ci = 0;
  2578. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2579. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2580. foreach (var nl in nls)
  2581. {
  2582. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2583. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2584. }
  2585. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  2586. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  2587. #endregion
  2588. #region 数据
  2589. foreach (DataRow dr in table.Select($"direction_course_id = {CourseConst.WEI_XUAN_KE}"))
  2590. {
  2591. var type = (long)dr["type"];
  2592. if (type == 2)
  2593. {
  2594. continue;
  2595. }
  2596. IRow row = sheet.CreateRow(rowNum++);
  2597. int rci = 0;
  2598. string itemName = "";
  2599. switch (type)
  2600. {
  2601. case 1:
  2602. itemName = $"{dr["sys_org_name"]}";
  2603. break;
  2604. case 3:
  2605. itemName = $"{dr["class_number"]}班";
  2606. break;
  2607. }
  2608. exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  2609. exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  2610. foreach (var nl in nls)
  2611. {
  2612. exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  2613. exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  2614. }
  2615. }
  2616. #endregion
  2617. }
  2618. #endregion
  2619. #region 双上线
  2620. {
  2621. var table = await GetOrgLineCourseTable2(nceePlanId, org.Id);
  2622. var lineScoreTable = await GetLineScoreTable2(nceePlanId);
  2623. ISheet sheet = wb.CreateSheet("双上线");
  2624. sheet.DisplayGridlines = false;
  2625. // 行索引号
  2626. int rowNum = 0;
  2627. var nls = baseLineTable.Select($"direction_course_id = {CourseConst.WEI_XUAN_KE}");
  2628. IRow titleRow = sheet.CreateRow(rowNum++);
  2629. titleRow.HeightInPoints = 30;
  2630. int ci = 0;
  2631. int scoreWidth = 10;
  2632. exportExcelService.AddCell($"{org.ShortName}双上线情况", titleRow, ci++, cellStyle.TitleStyle, sheet, 13);
  2633. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, 10);
  2634. foreach (var nl in nls)
  2635. {
  2636. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2637. exportExcelService.AddCell("", titleRow, ci++, cellStyle.TitleStyle, sheet, scoreWidth);
  2638. }
  2639. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2640. foreach (var lst in lineScoreTable.Select($"direction_course_id = {CourseConst.WEI_XUAN_KE} AND course_id <> {CourseConst.ZONG_FEN}"))
  2641. {
  2642. #region 表头
  2643. IRow subTitleRow = sheet.CreateRow(rowNum++);
  2644. ci = 0;
  2645. exportExcelService.AddCell($"{lst["course_name"]}", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2646. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2647. foreach (var nl in nls)
  2648. {
  2649. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2650. exportExcelService.AddCell("", subTitleRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2651. }
  2652. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, 0, ci - 1));
  2653. IRow headerRow = sheet.CreateRow(rowNum++);
  2654. ci = 0;
  2655. exportExcelService.AddCell("名称", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2656. exportExcelService.AddCell("实考人数", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2657. foreach (var nl in nls)
  2658. {
  2659. exportExcelService.AddCell($"{nl["ncee_line_level_name"]}({lst[$"line_score_x_{nl["ncee_line_level"]}"]})", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2660. exportExcelService.AddCell("", headerRow, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2661. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 1, rowNum - 1, ci - 2, ci - 1));
  2662. }
  2663. IRow headerRow2 = sheet.CreateRow(rowNum++);
  2664. ci = 0;
  2665. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 13);
  2666. exportExcelService.AddCell("", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, 10);
  2667. foreach (var nl in nls)
  2668. {
  2669. exportExcelService.AddCell("人数", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2670. exportExcelService.AddCell("比例(%)", headerRow2, ci++, cellStyle.ColumnFillHeaderStyle, sheet, scoreWidth);
  2671. }
  2672. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 0, 0));
  2673. sheet.AddMergedRegion(new CellRangeAddress(rowNum - 2, rowNum - 1, 1, 1));
  2674. #endregion
  2675. #region 数据
  2676. foreach (DataRow dr in table.Select($"direction_course_id = {CourseConst.WEI_XUAN_KE} AND course_id = {lst["course_id"]}"))
  2677. {
  2678. var type = (short)dr["type"];
  2679. if (type == 2)
  2680. {
  2681. continue;
  2682. }
  2683. IRow row = sheet.CreateRow(rowNum++);
  2684. int rci = 0;
  2685. string itemName = "";
  2686. switch (type)
  2687. {
  2688. case 1:
  2689. itemName = $"{dr["sys_org_name"]}";
  2690. break;
  2691. case 3:
  2692. itemName = $"{dr["class_number"]}班";
  2693. break;
  2694. }
  2695. exportExcelService.AddCell(itemName, row, rci++, type == 1 ? cellStyle.LeftCellStyle : type == 2 ? cellStyleIndent1 : cellStyleIndent2);
  2696. exportExcelService.AddCell(dr["total_count"], row, rci++, cellStyle.CenterCellStyle);
  2697. foreach (var nl in nls)
  2698. {
  2699. exportExcelService.AddCell(dr[$"line_count_{nl["ncee_line_level"]}"], row, rci++, cellStyle.CenterCellStyle);
  2700. exportExcelService.AddCell(dr[$"line_rate_{nl["ncee_line_level"]}"], row, rci++, cellStyle.PercentCellStyleP2);
  2701. }
  2702. }
  2703. #endregion
  2704. rowNum += 1;
  2705. }
  2706. }
  2707. #endregion
  2708. MemoryStream ms = new();
  2709. wb.Write(ms, false);
  2710. ms.Flush();
  2711. ret.Add($"{org.Code}-{org.ShortName}", ms.ToArray());
  2712. }
  2713. return ret;
  2714. }
  2715. #endregion
  2716. #region 获取数据
  2717. /// <summary>
  2718. /// 获取上线合并数据
  2719. /// </summary>
  2720. /// <param name="nceePlanId"></param>
  2721. /// <returns></returns>
  2722. private async Task<DataTable> GetLineCountTable(int nceePlanId)
  2723. {
  2724. var dt = await rep.SqlQueryAsync($@"
  2725. SELECT T1.*,
  2726. T2.d_4_total_count, T2.d_4_line_count_1, T2.d_4_line_count_2, T2.d_4_line_count_3,
  2727. T2.d_4_line_count_1 / T2.d_4_total_count AS d_4_line_rate_1,
  2728. T2.d_4_line_count_2 / T2.d_4_total_count AS d_4_line_rate_2,
  2729. T2.d_4_line_count_3 / T2.d_4_total_count AS d_4_line_rate_3,
  2730. T2.d_8_total_count, T2.d_8_line_count_1, T2.d_8_line_count_2, T2.d_8_line_count_3,
  2731. T2.d_8_line_count_1 / T2.d_8_total_count AS d_8_line_rate_1,
  2732. T2.d_8_line_count_2 / T2.d_8_total_count AS d_8_line_rate_2,
  2733. T2.d_8_line_count_3 / T2.d_8_total_count AS d_8_line_rate_3
  2734. FROM
  2735. (
  2736. SELECT IFNULL(T2.short_name, '合计') AS sys_org_name, T1.*,
  2737. T1.line_count_1 / T1.total_count AS line_rate_1,
  2738. T1.line_count_2 / T1.total_count AS line_rate_2,
  2739. T1.line_count_3 / T1.total_count AS line_rate_3
  2740. FROM
  2741. (
  2742. SELECT T1.type, T1.sys_org_id,
  2743. MAX(T1.total_count) AS total_count,
  2744. SUM(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_count ELSE 0 END) AS line_count_1,
  2745. SUM(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_count ELSE 0 END) AS line_count_2,
  2746. SUM(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_count ELSE 0 END) AS line_count_3
  2747. FROM
  2748. (
  2749. SELECT T1.type, T1.sys_org_id, T1.ncee_line_level, SUM(T1.line_count) AS line_count, SUM(T1.total_count) AS total_count
  2750. FROM ncee_line_total AS T1
  2751. WHERE T1.ncee_plan_id = @nceePlanId AND (T1.type = 1 OR T1.type = 4) AND T1.ncee_course_comb_id IS NULL
  2752. GROUP BY T1.type, T1.sys_org_id, T1.ncee_line_level
  2753. ) AS T1
  2754. GROUP BY T1.type, T1.sys_org_id
  2755. ) AS T1
  2756. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  2757. ) AS T1
  2758. LEFT JOIN
  2759. (
  2760. SELECT T1.type, T1.sys_org_id,
  2761. MAX(CASE WHEN T1.direction_course_id = 4 THEN T1.total_count ELSE 0 END) AS d_4_total_count,
  2762. SUM(CASE WHEN T1.direction_course_id = 4 AND T1.ncee_line_level = 1 THEN T1.line_count ELSE 0 END) AS d_4_line_count_1,
  2763. SUM(CASE WHEN T1.direction_course_id = 4 AND T1.ncee_line_level = 2 THEN T1.line_count ELSE 0 END) AS d_4_line_count_2,
  2764. SUM(CASE WHEN T1.direction_course_id = 4 AND T1.ncee_line_level = 3 THEN T1.line_count ELSE 0 END) AS d_4_line_count_3,
  2765. MAX(CASE WHEN T1.direction_course_id = 8 THEN T1.total_count ELSE 0 END) AS d_8_total_count,
  2766. SUM(CASE WHEN T1.direction_course_id = 8 AND T1.ncee_line_level = 1 THEN T1.line_count ELSE 0 END) AS d_8_line_count_1,
  2767. SUM(CASE WHEN T1.direction_course_id = 8 AND T1.ncee_line_level = 2 THEN T1.line_count ELSE 0 END) AS d_8_line_count_2,
  2768. SUM(CASE WHEN T1.direction_course_id = 8 AND T1.ncee_line_level = 3 THEN T1.line_count ELSE 0 END) AS d_8_line_count_3
  2769. FROM
  2770. (
  2771. SELECT T1.direction_course_id, T1.type, T1.sys_org_id, T1.ncee_line_level, SUM(T1.line_count) AS line_count, SUM(T1.total_count) AS total_count
  2772. FROM ncee_line_total AS T1
  2773. WHERE T1.ncee_plan_id = @nceePlanId AND (T1.type = 1 OR T1.type = 4) AND T1.ncee_course_comb_id IS NULL
  2774. GROUP BY T1.direction_course_id, T1.type, T1.sys_org_id, T1.ncee_line_level
  2775. ) AS T1
  2776. GROUP BY T1.type, T1.sys_org_id
  2777. ) AS T2 ON T1.type = T2.type AND IFNULL(T1.sys_org_id, 0) = IFNULL(T2.sys_org_id, 0)
  2778. ORDER BY T1.type, T1.sys_org_id
  2779. ;
  2780. ", new { NceePlanId = nceePlanId });
  2781. return dt;
  2782. }
  2783. /// <summary>
  2784. /// 获取有效分数据
  2785. /// </summary>
  2786. /// <param name="nceePlanId"></param>
  2787. /// <returns></returns>
  2788. private async Task<DataTable> GetLineScoreTable(int nceePlanId)
  2789. {
  2790. var dt = await rep.SqlQueryAsync(@"
  2791. SELECT T2.`name` AS direction_course_name,
  2792. T3.`name` AS ncee_line_level_name,
  2793. T1.*,
  2794. T4.line_rate,
  2795. COUNT(T1.ncee_line_level) OVER(PARTITION BY direction_course_id) AS ncee_level_count
  2796. FROM
  2797. (
  2798. SELECT T1.ncee_plan_id, T1.direction_course_id, T1.ncee_line_level,
  2799. MAX(IF(T1.course_id = 1, T1.line_score_x, NULL)) AS line_score_x_1,
  2800. MAX(IF(T1.course_id = 2, T1.line_score_x, NULL)) AS line_score_x_2,
  2801. MAX(IF(T1.course_id = 3, T1.line_score_x, NULL)) AS line_score_x_3,
  2802. MAX(IF(T1.course_id = 4, T1.line_score_x, NULL)) AS line_score_x_4,
  2803. MAX(IF(T1.course_id = 5, T1.line_score_x, NULL)) AS line_score_x_5,
  2804. MAX(IF(T1.course_id = 6, T1.line_score_x, NULL)) AS line_score_x_6,
  2805. MAX(IF(T1.course_id = 7, T1.line_score_x, NULL)) AS line_score_x_7,
  2806. MAX(IF(T1.course_id = 8, T1.line_score_x, NULL)) AS line_score_x_8,
  2807. MAX(IF(T1.course_id = 9, T1.line_score_x, NULL)) AS line_score_x_9,
  2808. MAX(IF(T1.course_id = 101, T1.line_score_x, NULL)) AS line_score_x_101,
  2809. MAX(IF(T1.course_id = 100, T1.line_score_x, NULL)) AS line_score_x_100
  2810. FROM ncee_course_line_score AS T1
  2811. WHERE T1.ncee_plan_id = @nceePlanId
  2812. GROUP BY T1.direction_course_id, T1.ncee_line_level
  2813. ) AS T1
  2814. JOIN base_course AS T2 ON T1.direction_course_id = T2.id
  2815. JOIN (SELECT * FROM sys_dict_data WHERE sys_dict_type_id = 211) AS T3 ON T1.ncee_line_level = T3.`value`
  2816. JOIN ncee_base_line AS T4 ON T1.ncee_plan_id = T4.ncee_plan_id AND T1.direction_course_id = T4.direction_course_id AND T1.ncee_line_level = T4.ncee_line_level
  2817. ORDER BY T1.direction_course_id, T1.ncee_line_level
  2818. ", new { NceePlanId = nceePlanId });
  2819. return dt;
  2820. }
  2821. /// <summary>
  2822. /// 获取有效分数据(科目未转置)
  2823. /// </summary>
  2824. /// <param name="nceePlanId"></param>
  2825. /// <returns></returns>
  2826. private async Task<DataTable> GetLineScoreTable2(int nceePlanId)
  2827. {
  2828. var dt = await rep.SqlQueryAsync(@"
  2829. SELECT T2.`name` AS course_name, T1.*
  2830. FROM
  2831. (
  2832. SELECT T1.direction_course_id, T1.course_id,
  2833. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_score ELSE NULL END) AS line_score_1,
  2834. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_score ELSE NULL END) AS line_score_2,
  2835. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_score ELSE NULL END) AS line_score_3,
  2836. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_score_x ELSE NULL END) AS line_score_x_1,
  2837. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_score_x ELSE NULL END) AS line_score_x_2,
  2838. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_score_x ELSE NULL END) AS line_score_x_3
  2839. FROM ncee_course_line_score AS T1
  2840. WHERE T1.ncee_plan_id = @nceePlanId
  2841. GROUP BY T1.direction_course_id, T1.course_id
  2842. ) AS T1
  2843. JOIN base_course AS T2 ON T1.course_id = T2.id
  2844. ORDER BY T1.direction_course_id, T1.course_id
  2845. ", new { NceePlanId = nceePlanId });
  2846. return dt;
  2847. }
  2848. /// <summary>
  2849. /// 获取平均分数据
  2850. /// </summary>
  2851. /// <param name="nceePlanId"></param>
  2852. /// <param name="directionCourseId"></param>
  2853. /// <returns></returns>
  2854. private async Task<DataTable> GetAvgScoreTable(int nceePlanId, short directionCourseId)
  2855. {
  2856. var dt = await rep.SqlQueryAsync(@"
  2857. SELECT IFNULL(T2.short_name, '合计') AS sys_org_short_name, T1.*
  2858. FROM
  2859. (
  2860. SELECT T1.direction_course_id, T1.sys_org_id,
  2861. MAX(T1.total_count) AS total_count,
  2862. SUM(CASE WHEN T1.course_id = 1 THEN T1.total_count ELSE 0 END) AS total_count_1,
  2863. SUM(CASE WHEN T1.course_id = 2 THEN T1.total_count ELSE 0 END) AS total_count_2,
  2864. SUM(CASE WHEN T1.course_id = 3 THEN T1.total_count ELSE 0 END) AS total_count_3,
  2865. SUM(CASE WHEN T1.course_id = 4 THEN T1.total_count ELSE 0 END) AS total_count_4,
  2866. SUM(CASE WHEN T1.course_id = 5 THEN T1.total_count ELSE 0 END) AS total_count_5,
  2867. SUM(CASE WHEN T1.course_id = 6 THEN T1.total_count ELSE 0 END) AS total_count_6,
  2868. SUM(CASE WHEN T1.course_id = 7 THEN T1.total_count ELSE 0 END) AS total_count_7,
  2869. SUM(CASE WHEN T1.course_id = 8 THEN T1.total_count ELSE 0 END) AS total_count_8,
  2870. SUM(CASE WHEN T1.course_id = 9 THEN T1.total_count ELSE 0 END) AS total_count_9,
  2871. SUM(CASE WHEN T1.course_id = 100 THEN T1.total_count ELSE 0 END) AS total_count_100,
  2872. SUM(CASE WHEN T1.course_id = 1 THEN T1.avg_score ELSE 0 END) AS avg_score_1,
  2873. SUM(CASE WHEN T1.course_id = 2 THEN T1.avg_score ELSE 0 END) AS avg_score_2,
  2874. SUM(CASE WHEN T1.course_id = 3 THEN T1.avg_score ELSE 0 END) AS avg_score_3,
  2875. SUM(CASE WHEN T1.course_id = 4 THEN T1.avg_score ELSE 0 END) AS avg_score_4,
  2876. SUM(CASE WHEN T1.course_id = 5 THEN T1.avg_score ELSE 0 END) AS avg_score_5,
  2877. SUM(CASE WHEN T1.course_id = 6 THEN T1.avg_score ELSE 0 END) AS avg_score_6,
  2878. SUM(CASE WHEN T1.course_id = 7 THEN T1.avg_score ELSE 0 END) AS avg_score_7,
  2879. SUM(CASE WHEN T1.course_id = 8 THEN T1.avg_score ELSE 0 END) AS avg_score_8,
  2880. SUM(CASE WHEN T1.course_id = 9 THEN T1.avg_score ELSE 0 END) AS avg_score_9,
  2881. SUM(CASE WHEN T1.course_id = 100 THEN T1.avg_score ELSE 0 END) AS avg_score_100,
  2882. SUM(CASE WHEN T1.course_id = 1 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_1,
  2883. SUM(CASE WHEN T1.course_id = 2 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_2,
  2884. SUM(CASE WHEN T1.course_id = 3 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_3,
  2885. SUM(CASE WHEN T1.course_id = 4 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_4,
  2886. SUM(CASE WHEN T1.course_id = 5 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_5,
  2887. SUM(CASE WHEN T1.course_id = 6 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_6,
  2888. SUM(CASE WHEN T1.course_id = 7 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_7,
  2889. SUM(CASE WHEN T1.course_id = 8 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_8,
  2890. SUM(CASE WHEN T1.course_id = 9 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_9,
  2891. SUM(CASE WHEN T1.course_id = 100 THEN T1.avg_score_x ELSE 0 END) AS avg_score_x_100
  2892. FROM
  2893. (
  2894. SELECT T1.direction_course_id, 9999 AS sys_org_id, 100 AS course_id, COUNT(1) total_count, AVG(T1.score) avg_score, AVG(T1.score_x) avg_score_x
  2895. FROM ncee_student AS T1
  2896. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  2897. GROUP BY T1.direction_course_id
  2898. UNION ALL
  2899. SELECT T1.direction_course_id, T1.sys_org_id, 100 AS course_id, COUNT(1) total_count, AVG(T1.score) avg_score, AVG(T1.score_x) avg_score_x
  2900. FROM ncee_student AS T1
  2901. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  2902. GROUP BY T1.direction_course_id, T1.sys_org_id
  2903. UNION ALL
  2904. SELECT T1.direction_course_id, 9999 AS sys_org_id, T2.course_id, COUNT(1) total_count, AVG(T2.score) avg_score, AVG(T2.score_x) avg_score_x
  2905. FROM ncee_student AS T1
  2906. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  2907. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  2908. GROUP BY T1.direction_course_id, T2.course_id
  2909. UNION ALL
  2910. SELECT T1.direction_course_id, T1.sys_org_id, T2.course_id, COUNT(1) total_count, AVG(T2.score) avg_score, AVG(T2.score_x) avg_score_x
  2911. FROM ncee_student AS T1
  2912. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  2913. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  2914. GROUP BY T1.direction_course_id, T1.sys_org_id, T2.course_id
  2915. ) AS T1
  2916. GROUP BY T1.direction_course_id, T1.sys_org_id
  2917. ) AS T1
  2918. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  2919. ORDER BY T1.direction_course_id, T1.sys_org_id
  2920. ", new { NceePlanId = nceePlanId, DirectionCourseId = directionCourseId });
  2921. return dt;
  2922. }
  2923. /// <summary>
  2924. /// 获取有效分上线(单上线)
  2925. /// </summary>
  2926. /// <param name="nceePlanId"></param>
  2927. /// <returns></returns>
  2928. private async Task<DataTable> GetLineTotalTable(int nceePlanId)
  2929. {
  2930. var dt = await rep.SqlQueryAsync(@"
  2931. SELECT IFNULL(T2.short_name, '合计') AS sys_org_short_name, T1.*,
  2932. T3.line_count AS line_count_100,
  2933. T3.total_count AS total_count_100,
  2934. T3.line_rate AS line_rate_100
  2935. FROM
  2936. (
  2937. SELECT T1.type, T1.direction_course_id, IFNULL(T1.sys_org_id, 0) AS sys_org_id, T1.ncee_line_level,
  2938. MAX(IF(T1.course_id = 1, T1.total_count, NULL)) AS total_count_1,
  2939. MAX(IF(T1.course_id = 2, T1.total_count, NULL)) AS total_count_2,
  2940. MAX(IF(T1.course_id = 3, T1.total_count, NULL)) AS total_count_3,
  2941. MAX(IF(T1.course_id = 4, T1.total_count, NULL)) AS total_count_4,
  2942. MAX(IF(T1.course_id = 5, T1.total_count, NULL)) AS total_count_5,
  2943. MAX(IF(T1.course_id = 6, T1.total_count, NULL)) AS total_count_6,
  2944. MAX(IF(T1.course_id = 7, T1.total_count, NULL)) AS total_count_7,
  2945. MAX(IF(T1.course_id = 8, T1.total_count, NULL)) AS total_count_8,
  2946. MAX(IF(T1.course_id = 9, T1.total_count, NULL)) AS total_count_9,
  2947. MAX(IF(T1.course_id = 101, T1.total_count, NULL)) AS total_count_101,
  2948. MAX(IF(T1.course_id = 1, T1.line_count, NULL)) AS line_count_1,
  2949. MAX(IF(T1.course_id = 2, T1.line_count, NULL)) AS line_count_2,
  2950. MAX(IF(T1.course_id = 3, T1.line_count, NULL)) AS line_count_3,
  2951. MAX(IF(T1.course_id = 4, T1.line_count, NULL)) AS line_count_4,
  2952. MAX(IF(T1.course_id = 5, T1.line_count, NULL)) AS line_count_5,
  2953. MAX(IF(T1.course_id = 6, T1.line_count, NULL)) AS line_count_6,
  2954. MAX(IF(T1.course_id = 7, T1.line_count, NULL)) AS line_count_7,
  2955. MAX(IF(T1.course_id = 8, T1.line_count, NULL)) AS line_count_8,
  2956. MAX(IF(T1.course_id = 9, T1.line_count, NULL)) AS line_count_9,
  2957. MAX(IF(T1.course_id = 101, T1.line_count, NULL)) AS line_count_101,
  2958. MAX(IF(T1.course_id = 1, T1.line_rate, NULL)) AS line_rate_1,
  2959. MAX(IF(T1.course_id = 2, T1.line_rate, NULL)) AS line_rate_2,
  2960. MAX(IF(T1.course_id = 3, T1.line_rate, NULL)) AS line_rate_3,
  2961. MAX(IF(T1.course_id = 4, T1.line_rate, NULL)) AS line_rate_4,
  2962. MAX(IF(T1.course_id = 5, T1.line_rate, NULL)) AS line_rate_5,
  2963. MAX(IF(T1.course_id = 6, T1.line_rate, NULL)) AS line_rate_6,
  2964. MAX(IF(T1.course_id = 7, T1.line_rate, NULL)) AS line_rate_7,
  2965. MAX(IF(T1.course_id = 8, T1.line_rate, NULL)) AS line_rate_8,
  2966. MAX(IF(T1.course_id = 9, T1.line_rate, NULL)) AS line_rate_9,
  2967. MAX(IF(T1.course_id = 101, T1.line_rate, NULL)) AS line_rate_101
  2968. FROM ncee_line_course AS T1
  2969. WHERE T1.ncee_plan_id = @nceePlanId AND (T1.type = 1 OR T1.type = 4) AND T1.is_double_line = 0
  2970. GROUP BY T1.type, T1.direction_course_id, T1.sys_org_id, T1.ncee_line_level
  2971. ) AS T1
  2972. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  2973. LEFT JOIN
  2974. (
  2975. SELECT type, IFNULL(sys_org_id, 0) AS sys_org_id, ncee_line_level, direction_course_id, line_count, total_count, line_rate
  2976. FROM ncee_line_total AS T1
  2977. WHERE T1.ncee_plan_id = @nceePlanId AND (T1.type = 1 OR T1.type = 4)
  2978. ) AS T3 ON T1.type = T3.type AND T1.sys_org_id = T3.sys_org_id AND T1.ncee_line_level = T3.ncee_line_level AND T1.direction_course_id = T3.direction_course_id
  2979. ORDER BY T1.ncee_line_level, T1.direction_course_id, T1.type, T1.sys_org_id
  2980. ", new { NceePlanId = nceePlanId });
  2981. return dt;
  2982. }
  2983. /// <summary>
  2984. /// 获取有效分双上线数据
  2985. /// </summary>
  2986. /// <param name="nceePlanId"></param>
  2987. /// <returns></returns>
  2988. private async Task<DataTable> GetLineCourseTable(int nceePlanId)
  2989. {
  2990. var dt = await rep.SqlQueryAsync(@"
  2991. SELECT IFNULL(T2.short_name, '合计') AS sys_org_short_name, T1.*
  2992. FROM
  2993. (
  2994. SELECT T1.type, T1.direction_course_id, IFNULL(T1.sys_org_id, 0) AS sys_org_id, T1.ncee_line_level,
  2995. MAX(IF(T1.course_id = 1, T1.total_count, NULL)) AS total_count_1,
  2996. MAX(IF(T1.course_id = 2, T1.total_count, NULL)) AS total_count_2,
  2997. MAX(IF(T1.course_id = 3, T1.total_count, NULL)) AS total_count_3,
  2998. MAX(IF(T1.course_id = 4, T1.total_count, NULL)) AS total_count_4,
  2999. MAX(IF(T1.course_id = 5, T1.total_count, NULL)) AS total_count_5,
  3000. MAX(IF(T1.course_id = 6, T1.total_count, NULL)) AS total_count_6,
  3001. MAX(IF(T1.course_id = 7, T1.total_count, NULL)) AS total_count_7,
  3002. MAX(IF(T1.course_id = 8, T1.total_count, NULL)) AS total_count_8,
  3003. MAX(IF(T1.course_id = 9, T1.total_count, NULL)) AS total_count_9,
  3004. MAX(IF(T1.course_id = 101, T1.total_count, NULL)) AS total_count_101,
  3005. MAX(IF(T1.course_id = 1, T1.line_count, NULL)) AS line_count_1,
  3006. MAX(IF(T1.course_id = 2, T1.line_count, NULL)) AS line_count_2,
  3007. MAX(IF(T1.course_id = 3, T1.line_count, NULL)) AS line_count_3,
  3008. MAX(IF(T1.course_id = 4, T1.line_count, NULL)) AS line_count_4,
  3009. MAX(IF(T1.course_id = 5, T1.line_count, NULL)) AS line_count_5,
  3010. MAX(IF(T1.course_id = 6, T1.line_count, NULL)) AS line_count_6,
  3011. MAX(IF(T1.course_id = 7, T1.line_count, NULL)) AS line_count_7,
  3012. MAX(IF(T1.course_id = 8, T1.line_count, NULL)) AS line_count_8,
  3013. MAX(IF(T1.course_id = 9, T1.line_count, NULL)) AS line_count_9,
  3014. MAX(IF(T1.course_id = 101, T1.line_count, NULL)) AS line_count_101,
  3015. MAX(IF(T1.course_id = 1, T1.line_rate, NULL)) AS line_rate_1,
  3016. MAX(IF(T1.course_id = 2, T1.line_rate, NULL)) AS line_rate_2,
  3017. MAX(IF(T1.course_id = 3, T1.line_rate, NULL)) AS line_rate_3,
  3018. MAX(IF(T1.course_id = 4, T1.line_rate, NULL)) AS line_rate_4,
  3019. MAX(IF(T1.course_id = 5, T1.line_rate, NULL)) AS line_rate_5,
  3020. MAX(IF(T1.course_id = 6, T1.line_rate, NULL)) AS line_rate_6,
  3021. MAX(IF(T1.course_id = 7, T1.line_rate, NULL)) AS line_rate_7,
  3022. MAX(IF(T1.course_id = 8, T1.line_rate, NULL)) AS line_rate_8,
  3023. MAX(IF(T1.course_id = 9, T1.line_rate, NULL)) AS line_rate_9,
  3024. MAX(IF(T1.course_id = 101, T1.line_rate, NULL)) AS line_rate_101
  3025. FROM ncee_line_course AS T1
  3026. WHERE T1.ncee_plan_id = @nceePlanId AND (T1.type = 1 OR T1.type = 4) AND T1.is_double_line = 1
  3027. GROUP BY T1.type, T1.direction_course_id, T1.sys_org_id, T1.ncee_line_level
  3028. ) AS T1
  3029. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  3030. ORDER BY T1.ncee_line_level, T1.direction_course_id, T1.type, T1.sys_org_id
  3031. ", new { NceePlanId = nceePlanId });
  3032. return dt;
  3033. }
  3034. /// <summary>
  3035. /// 获取机构组合班级有效分上线(单上线,含各单科)
  3036. /// </summary>
  3037. /// <param name="nceePlanId"></param>
  3038. /// <param name="sysOrgId"></param>
  3039. /// <returns></returns>
  3040. private async Task<DataTable> GetOrgLineTotalTable(int nceePlanId, short sysOrgId)
  3041. {
  3042. var dt = await rep.SqlQueryAsync(@"
  3043. SELECT T2.short_name AS sys_org_name,
  3044. T1.*,
  3045. T3.line_count AS line_count_100,
  3046. T3.total_count AS total_count_100,
  3047. T3.line_rate AS line_rate_100
  3048. FROM
  3049. (
  3050. SELECT T1.type,
  3051. T1.sys_org_id,
  3052. T1.direction_course_id,
  3053. T1.ncee_course_comb_id,
  3054. T1.class_number,
  3055. T1.ncee_line_level,
  3056. MAX(IF(T1.course_id = 1, T1.total_count, NULL)) AS total_count_1,
  3057. MAX(IF(T1.course_id = 2, T1.total_count, NULL)) AS total_count_2,
  3058. MAX(IF(T1.course_id = 3, T1.total_count, NULL)) AS total_count_3,
  3059. MAX(IF(T1.course_id = 4, T1.total_count, NULL)) AS total_count_4,
  3060. MAX(IF(T1.course_id = 8, T1.total_count, NULL)) AS total_count_8,
  3061. MAX(IF(T1.course_id = 101, T1.total_count, NULL)) AS total_count_101,
  3062. MAX(IF(T1.course_id = 1, T1.line_count, NULL)) AS line_count_1,
  3063. MAX(IF(T1.course_id = 2, T1.line_count, NULL)) AS line_count_2,
  3064. MAX(IF(T1.course_id = 3, T1.line_count, NULL)) AS line_count_3,
  3065. MAX(IF(T1.course_id = 4, T1.line_count, NULL)) AS line_count_4,
  3066. MAX(IF(T1.course_id = 8, T1.line_count, NULL)) AS line_count_8,
  3067. MAX(IF(T1.course_id = 101, T1.line_count, NULL)) AS line_count_101,
  3068. MAX(IF(T1.course_id = 1, T1.line_rate, NULL)) AS line_rate_1,
  3069. MAX(IF(T1.course_id = 2, T1.line_rate, NULL)) AS line_rate_2,
  3070. MAX(IF(T1.course_id = 3, T1.line_rate, NULL)) AS line_rate_3,
  3071. MAX(IF(T1.course_id = 4, T1.line_rate, NULL)) AS line_rate_4,
  3072. MAX(IF(T1.course_id = 8, T1.line_rate, NULL)) AS line_rate_8,
  3073. MAX(IF(T1.course_id = 101, T1.line_rate, NULL)) AS line_rate_101
  3074. FROM ncee_line_course AS T1
  3075. WHERE T1.ncee_plan_id = @nceePlanId AND T1.sys_org_id = @sysOrgId AND T1.type < 4 AND T1.is_double_line = 0
  3076. GROUP BY T1.type, T1.direction_course_id, T1.sys_org_id, T1.ncee_line_level, T1.ncee_course_comb_id, T1.class_number
  3077. ) AS T1
  3078. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  3079. LEFT JOIN
  3080. (
  3081. SELECT sys_org_id, type, ncee_line_level, direction_course_id, ncee_course_comb_id, class_number,line_count, total_count, line_rate
  3082. FROM ncee_line_total AS T1
  3083. WHERE T1.ncee_plan_id = @nceePlanId AND T1.sys_org_id = @sysOrgId AND T1.type < 4
  3084. ) AS T3
  3085. ON T1.type = T3.type AND T1.sys_org_id = T3.sys_org_id AND
  3086. T1.ncee_line_level = T3.ncee_line_level AND
  3087. T1.direction_course_id = T3.direction_course_id AND
  3088. IFNULL(T1.ncee_course_comb_id, 0) = IFNULL(T3.ncee_course_comb_id, 0) AND
  3089. IFNULL(T1.class_number, 0) = IFNULL(T3.class_number, 0)
  3090. ORDER BY T1.ncee_line_level, T1.direction_course_id, T1.type, T1.ncee_course_comb_id
  3091. ", new { NceePlanId = nceePlanId, SysOrgId = sysOrgId });
  3092. return dt;
  3093. }
  3094. /// <summary>
  3095. /// 获取机构组合班级有效分上线(总分上线,不含单科)
  3096. /// </summary>
  3097. /// <param name="nceePlanId"></param>
  3098. /// <param name="sysOrgId">0表示全部</param>
  3099. /// <returns></returns>
  3100. private async Task<DataTable> GetOrgLineTotalTable2(int nceePlanId, short sysOrgId = 0)
  3101. {
  3102. var dt = await rep.SqlQueryAsync(@"
  3103. SELECT *
  3104. FROM
  3105. (
  3106. SELECT T1.*, IFNULL(T1.total_count_1, IFNULL(T1.total_count_2, T1.total_count_3)) AS total_count
  3107. FROM
  3108. (
  3109. SELECT
  3110. T1.direction_course_id,
  3111. T1.type,
  3112. T1.sys_org_id,
  3113. T3.short_name AS sys_org_name,
  3114. T1.ncee_course_comb_id,
  3115. T2.short_name AS ncee_course_comb_name,
  3116. T1.class_number,
  3117. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_count ELSE NULL END) AS line_count_1,
  3118. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_rate ELSE NULL END) AS line_rate_1,
  3119. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.total_count ELSE NULL END) AS total_count_1,
  3120. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_count ELSE NULL END) AS line_count_2,
  3121. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_rate ELSE NULL END) AS line_rate_2,
  3122. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.total_count ELSE NULL END) AS total_count_2,
  3123. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_count ELSE NULL END) AS line_count_3,
  3124. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_rate ELSE NULL END) AS line_rate_3,
  3125. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.total_count ELSE NULL END) AS total_count_3
  3126. FROM ncee_line_total AS T1
  3127. LEFT JOIN ncee_course_comb AS T2 ON T1.ncee_course_comb_id = T2.id
  3128. LEFT JOIN sys_org AS T3 ON T1.sys_org_id = T3.id
  3129. WHERE T1.ncee_plan_id = @nceePlanId AND T1.type < 4 AND (T1.sys_org_id = @sysOrgId OR @sysOrgId = 0)
  3130. GROUP BY T1.direction_course_id, T1.type, T1.sys_org_id, T3.short_name, T1.ncee_course_comb_id, T2.short_name, T1.class_number
  3131. ) AS T1
  3132. UNION ALL
  3133. SELECT
  3134. T1.direction_course_id,
  3135. CAST(3 AS SIGNED) AS type,
  3136. T1.sys_org_id,
  3137. T4.short_name AS sys_org_name,
  3138. T1.ncee_course_comb_id,
  3139. T3.short_name AS ncee_course_comb_name,
  3140. T1.class_number,
  3141. NULL AS line_count_1,
  3142. NULL AS line_rate_1,
  3143. NULL AS total_count_1,
  3144. NULL AS line_count_2,
  3145. NULL AS line_rate_2,
  3146. NULL AS total_count_2,
  3147. NULL AS line_count_3,
  3148. NULL AS line_rate_3,
  3149. NULL AS total_count_3,
  3150. COUNT(1) AS total_count
  3151. FROM (SELECT * FROM ncee_student WHERE ncee_plan_id = @nceePlanId AND (sys_org_id = @sysOrgId OR @sysOrgId = 0)) AS T1
  3152. LEFT JOIN
  3153. (
  3154. SELECT DISTINCT T1.sys_org_id, T1.class_number, T1.ncee_course_comb_id
  3155. FROM ncee_line_total AS T1
  3156. WHERE T1.ncee_plan_id = @nceePlanId AND T1.type = 3 AND (T1.sys_org_id = @sysOrgId OR @sysOrgId = 0)
  3157. ) AS T2 ON T1.sys_org_id = T2.sys_org_id AND T1.class_number = T2.class_number AND T1.ncee_course_comb_id = T2.ncee_course_comb_id
  3158. LEFT JOIN ncee_course_comb AS T3 ON T1.ncee_course_comb_id = T3.id
  3159. LEFT JOIN sys_org AS T4 ON T1.sys_org_id = T4.id
  3160. WHERE T2.class_number IS NULL AND T1.score_x > 0
  3161. GROUP BY T1.direction_course_id, T1.sys_org_id, T4.short_name, T1.ncee_course_comb_id, T3.short_name, T1.class_number
  3162. UNION ALL
  3163. SELECT
  3164. T1.direction_course_id,
  3165. CAST(2 AS SIGNED) AS type,
  3166. T1.sys_org_id,
  3167. T4.short_name AS sys_org_name,
  3168. T1.ncee_course_comb_id,
  3169. T3.short_name AS ncee_course_comb_name,
  3170. NULL AS class_number,
  3171. NULL AS line_count_1,
  3172. NULL AS line_rate_1,
  3173. NULL AS total_count_1,
  3174. NULL AS line_count_2,
  3175. NULL AS line_rate_2,
  3176. NULL AS total_count_2,
  3177. NULL AS line_count_3,
  3178. NULL AS line_rate_3,
  3179. NULL AS total_count_3,
  3180. COUNT(1) AS total_count
  3181. FROM (SELECT * FROM ncee_student WHERE ncee_plan_id = @nceePlanId AND (sys_org_id = @sysOrgId OR @sysOrgId = 0)) AS T1
  3182. LEFT JOIN
  3183. (
  3184. SELECT DISTINCT T1.sys_org_id, T1.ncee_course_comb_id
  3185. FROM ncee_line_total AS T1
  3186. WHERE T1.ncee_plan_id = @nceePlanId AND T1.type = 2 AND (T1.sys_org_id = @sysOrgId OR @sysOrgId = 0)
  3187. ) AS T2 ON T1.sys_org_id = T2.sys_org_id AND T1.ncee_course_comb_id = T2.ncee_course_comb_id
  3188. LEFT JOIN ncee_course_comb AS T3 ON T1.ncee_course_comb_id = T3.id
  3189. LEFT JOIN sys_org AS T4 ON T1.sys_org_id = T4.id
  3190. WHERE T2.ncee_course_comb_id IS NULL AND T1.score_x > 0
  3191. GROUP BY T1.direction_course_id, T1.sys_org_id, T4.short_name, T1.ncee_course_comb_id, T3.short_name
  3192. ) AS T1
  3193. ORDER BY T1.direction_course_id, T1.sys_org_id, T1.ncee_course_comb_id, T1.class_number
  3194. ;
  3195. ", new { NceePlanId = nceePlanId, SysOrgId = sysOrgId });
  3196. return dt;
  3197. }
  3198. /// <summary>
  3199. /// 获取机构组合班级有效分双上线数据
  3200. /// </summary>
  3201. /// <param name="nceePlanId"></param>
  3202. /// <param name="sysOrgId"></param>
  3203. /// <returns></returns>
  3204. private async Task<DataTable> GetOrgLineCourseTable(int nceePlanId, short sysOrgId)
  3205. {
  3206. var dt = await rep.SqlQueryAsync(@"
  3207. SELECT T2.short_name AS sys_org_name, T1.*
  3208. FROM
  3209. (
  3210. SELECT T1.type,
  3211. T1.sys_org_id,
  3212. T1.direction_course_id,
  3213. T1.ncee_course_comb_id,
  3214. T1.class_number,
  3215. T1.ncee_line_level,
  3216. MAX(IF(T1.course_id = 1, T1.total_count, NULL)) AS total_count_1,
  3217. MAX(IF(T1.course_id = 2, T1.total_count, NULL)) AS total_count_2,
  3218. MAX(IF(T1.course_id = 3, T1.total_count, NULL)) AS total_count_3,
  3219. MAX(IF(T1.course_id = 4, T1.total_count, NULL)) AS total_count_4,
  3220. MAX(IF(T1.course_id = 101, T1.total_count, NULL)) AS total_count_101,
  3221. MAX(IF(T1.course_id = 1, T1.line_count, NULL)) AS line_count_1,
  3222. MAX(IF(T1.course_id = 2, T1.line_count, NULL)) AS line_count_2,
  3223. MAX(IF(T1.course_id = 3, T1.line_count, NULL)) AS line_count_3,
  3224. MAX(IF(T1.course_id = 4, T1.line_count, NULL)) AS line_count_4,
  3225. MAX(IF(T1.course_id = 101, T1.line_count, NULL)) AS line_count_101,
  3226. MAX(IF(T1.course_id = 1, T1.line_rate, NULL)) AS line_rate_1,
  3227. MAX(IF(T1.course_id = 2, T1.line_rate, NULL)) AS line_rate_2,
  3228. MAX(IF(T1.course_id = 3, T1.line_rate, NULL)) AS line_rate_3,
  3229. MAX(IF(T1.course_id = 4, T1.line_rate, NULL)) AS line_rate_4,
  3230. MAX(IF(T1.course_id = 101, T1.line_rate, NULL)) AS line_rate_101
  3231. FROM ncee_line_course AS T1
  3232. WHERE T1.ncee_plan_id = @nceePlanId AND T1.sys_org_id = @sysOrgId AND T1.type < 4 AND T1.is_double_line = 1
  3233. GROUP BY T1.type, T1.direction_course_id, T1.sys_org_id, T1.ncee_line_level, T1.ncee_course_comb_id, T1.class_number
  3234. ) AS T1
  3235. LEFT JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  3236. ORDER BY T1.ncee_line_level, T1.direction_course_id, T1.type, T1.sys_org_id
  3237. ", new { NceePlanId = nceePlanId, SysOrgId = sysOrgId });
  3238. return dt;
  3239. }
  3240. /// <summary>
  3241. /// 获取机构组合班级有效分双上线数据(科目未转置)
  3242. /// </summary>
  3243. /// <param name="nceePlanId"></param>
  3244. /// <param name="sysOrgId">0表示全部</param>
  3245. /// <returns></returns>
  3246. private async Task<DataTable> GetOrgLineCourseTable2(int nceePlanId, short sysOrgId = 0)
  3247. {
  3248. var dt = await rep.SqlQueryAsync(@"
  3249. SELECT T1.*, IFNULL(T1.total_count_1, IFNULL(T1.total_count_2, T1.total_count_3)) AS total_count
  3250. FROM
  3251. (
  3252. SELECT
  3253. T1.direction_course_id,
  3254. T1.course_id,
  3255. T1.type,
  3256. T1.sys_org_id,
  3257. T3.short_name AS sys_org_name,
  3258. T1.ncee_course_comb_id,
  3259. T2.short_name AS ncee_course_comb_name,
  3260. T1.class_number,
  3261. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_count ELSE NULL END) AS line_count_1,
  3262. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.line_rate ELSE NULL END) AS line_rate_1,
  3263. MAX(CASE WHEN T1.ncee_line_level = 1 THEN T1.total_count ELSE NULL END) AS total_count_1,
  3264. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_count ELSE NULL END) AS line_count_2,
  3265. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.line_rate ELSE NULL END) AS line_rate_2,
  3266. MAX(CASE WHEN T1.ncee_line_level = 2 THEN T1.total_count ELSE NULL END) AS total_count_2,
  3267. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_count ELSE NULL END) AS line_count_3,
  3268. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.line_rate ELSE NULL END) AS line_rate_3,
  3269. MAX(CASE WHEN T1.ncee_line_level = 3 THEN T1.total_count ELSE NULL END) AS total_count_3
  3270. FROM ncee_line_course AS T1
  3271. LEFT JOIN ncee_course_comb AS T2 ON T1.ncee_course_comb_id = T2.id
  3272. LEFT JOIN sys_org AS T3 ON T1.sys_org_id = T3.id
  3273. WHERE T1.ncee_plan_id = @nceePlanId AND T1.type < 4 AND T1.is_double_line = 1 AND (T1.sys_org_id = @sysOrgId OR @sysOrgId = 0)
  3274. GROUP BY T1.direction_course_id, T1.course_id, T1.type, T1.sys_org_id, T3.short_name, T1.ncee_course_comb_id, T2.short_name, T1.class_number
  3275. ) AS T1
  3276. ORDER BY T1.direction_course_id, T1.course_id, T1.sys_org_id, T1.ncee_course_comb_id, T1.class_number
  3277. ", new { NceePlanId = nceePlanId, SysOrgId = sysOrgId });
  3278. return dt;
  3279. }
  3280. /// <summary>
  3281. /// 获取总分分数段统计表
  3282. /// </summary>
  3283. /// <param name="nceePlanId"></param>
  3284. /// <param name="directionCourseId"></param>
  3285. /// <param name="orgList"></param>
  3286. /// <returns></returns>
  3287. private async Task<DataTable> GetTotalScoreRangeTable(int nceePlanId, short directionCourseId, List<SysOrgOutput> orgList)
  3288. {
  3289. var orgSum = "";
  3290. if (orgList is not null && orgList.Count > 0)
  3291. {
  3292. var orgSumSelects = orgList.Select(t => @$"
  3293. SUM(CASE WHEN T2.sys_org_id = {t.Id} THEN T2.total_count ELSE 0 END) AS total_count_{t.Id}");
  3294. orgSum = string.Join(",", orgSumSelects) + ",";
  3295. }
  3296. var orgSelect = $@"
  3297. UNION ALL
  3298. -- 机构分段统计
  3299. SELECT T1.sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3300. FROM
  3301. (
  3302. SELECT T1.sys_org_id, get_exam_score_range_id_s(1, 10, 200, 750, T1.score_x) AS exam_score_range_id
  3303. FROM ncee_student AS T1
  3304. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3305. ) AS T1
  3306. GROUP BY T1.sys_org_id, T1.exam_score_range_id
  3307. ";
  3308. var dt = await rep.SqlQueryAsync(@$"
  3309. SELECT T1.id AS exam_score_range_id, T1.`name` AS exam_score_range_name, {orgSum}
  3310. SUM(CASE WHEN T2.sys_org_id = 9998 THEN T2.total_count ELSE 0 END) AS total_count_range_current,
  3311. SUM(CASE WHEN T2.sys_org_id = 9999 THEN T2.total_count ELSE 0 END) AS total_count_range_sum
  3312. FROM exam_score_range AS T1
  3313. LEFT JOIN
  3314. (
  3315. -- 全部分段统计
  3316. SELECT 9998 AS sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3317. FROM
  3318. (
  3319. SELECT get_exam_score_range_id_s(1, 10, 200, 750, T1.score_x) AS exam_score_range_id
  3320. FROM ncee_student AS T1
  3321. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3322. ) AS T1
  3323. GROUP BY T1.exam_score_range_id
  3324. UNION ALL
  3325. -- 全部分段累计
  3326. SELECT 9999 AS sys_org_id, T1.exam_score_range_id,
  3327. SUM(T1.total_count) OVER (ORDER BY T1.sequence ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS total_count
  3328. FROM
  3329. (
  3330. SELECT T1.*, T2.sequence
  3331. FROM
  3332. (
  3333. SELECT T1.exam_score_range_id, SUM(T1.count) AS total_count
  3334. FROM
  3335. (
  3336. SELECT get_exam_score_range_id_s(1, 10, 200, 750, T1.score_x) AS exam_score_range_id, 1 AS count
  3337. FROM ncee_student AS T1
  3338. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3339. UNION ALL
  3340. SELECT id, 0 FROM exam_score_range WHERE type = 1
  3341. ) AS T1
  3342. GROUP BY T1.exam_score_range_id
  3343. ) AS T1
  3344. LEFT JOIN exam_score_range AS T2 ON T1.exam_score_range_id = T2.id
  3345. ) AS T1
  3346. GROUP BY T1.exam_score_range_id
  3347. {orgSelect}
  3348. ) AS T2 ON T1.id = T2.exam_score_range_id
  3349. WHERE T1.type = 1
  3350. GROUP BY T1.id, T1.`name`
  3351. ORDER BY T1.sequence
  3352. ", new { NceePlanId = nceePlanId, DirectionCourseId = directionCourseId });
  3353. return dt;
  3354. }
  3355. /// <summary>
  3356. /// 获取总分分数段统计表(未选科)
  3357. /// </summary>
  3358. /// <param name="nceePlanId"></param>
  3359. /// <param name="orgList"></param>
  3360. /// <returns></returns>
  3361. private async Task<DataTable> GetTotalScoreRangeTableUnselected(int nceePlanId, List<SysOrgOutput> orgList)
  3362. {
  3363. var orgSum = "";
  3364. if (orgList is not null && orgList.Count > 0)
  3365. {
  3366. var orgSumSelects = orgList?.Select(t => @$"
  3367. SUM(CASE WHEN T2.sys_org_id = {t.Id} THEN T2.total_count ELSE 0 END) AS total_count_{t.Id}");
  3368. orgSum = string.Join(",", orgSumSelects) + ",";
  3369. }
  3370. var orgSelect = $@"
  3371. UNION ALL
  3372. -- 机构分段统计
  3373. SELECT T1.sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3374. FROM
  3375. (
  3376. SELECT T1.sys_org_id, get_exam_score_range_id_s(4, 10, 240, 900, T1.score_x) AS exam_score_range_id
  3377. FROM ncee_student AS T1
  3378. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3379. ) AS T1
  3380. GROUP BY T1.sys_org_id, T1.exam_score_range_id
  3381. ";
  3382. var dt = await rep.SqlQueryAsync(@$"
  3383. SELECT T1.id AS exam_score_range_id, T1.`name` AS exam_score_range_name, {orgSum}
  3384. SUM(CASE WHEN T2.sys_org_id = 9998 THEN T2.total_count ELSE 0 END) AS total_count_range_current,
  3385. SUM(CASE WHEN T2.sys_org_id = 9999 THEN T2.total_count ELSE 0 END) AS total_count_range_sum
  3386. FROM exam_score_range AS T1
  3387. LEFT JOIN
  3388. (
  3389. -- 全部分段统计
  3390. SELECT 9998 AS sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3391. FROM
  3392. (
  3393. SELECT get_exam_score_range_id_s(4, 10, 240, 900, T1.score_x) AS exam_score_range_id
  3394. FROM ncee_student AS T1
  3395. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3396. ) AS T1
  3397. GROUP BY T1.exam_score_range_id
  3398. UNION ALL
  3399. -- 全部分段累计
  3400. SELECT 9999 AS sys_org_id, T1.exam_score_range_id,
  3401. SUM(T1.total_count) OVER (ORDER BY T1.sequence ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS total_count
  3402. FROM
  3403. (
  3404. SELECT T1.*, T2.sequence
  3405. FROM
  3406. (
  3407. SELECT T1.exam_score_range_id, SUM(T1.count) AS total_count
  3408. FROM
  3409. (
  3410. SELECT get_exam_score_range_id_s(4, 10, 240, 900, T1.score_x) AS exam_score_range_id, 1 AS count
  3411. FROM ncee_student AS T1
  3412. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId
  3413. UNION ALL
  3414. SELECT id, 0 FROM exam_score_range WHERE type = 4
  3415. ) AS T1
  3416. GROUP BY T1.exam_score_range_id
  3417. ) AS T1
  3418. LEFT JOIN exam_score_range AS T2 ON T1.exam_score_range_id = T2.id
  3419. ) AS T1
  3420. GROUP BY T1.exam_score_range_id
  3421. {orgSelect}
  3422. ) AS T2 ON T1.id = T2.exam_score_range_id
  3423. WHERE T1.type = 4
  3424. GROUP BY T1.id, T1.`name`
  3425. ORDER BY T1.sequence
  3426. ", new { NceePlanId = nceePlanId, DirectionCourseId = CourseConst.WEI_XUAN_KE });
  3427. return dt;
  3428. }
  3429. /// <summary>
  3430. /// 获取单科分数段统计表
  3431. /// </summary>
  3432. /// <param name="nceePlanId"></param>
  3433. /// <param name="directionCourseId"></param>
  3434. /// <param name="courseId"></param>
  3435. /// <param name="orgList"></param>
  3436. /// <returns></returns>
  3437. private async Task<DataTable> GetCourseScoreRangeTable(int nceePlanId, short directionCourseId, short courseId, List<SysOrgOutput> orgList)
  3438. {
  3439. int type = 3; // 总分100分
  3440. int rangeScore = 5; // 5分一段
  3441. int highScore = 100;
  3442. if (courseId == CourseConst.YU_WEN || courseId == CourseConst.SHU_XUE || courseId == CourseConst.YING_YU)
  3443. {
  3444. type = 2; // 总分150分
  3445. highScore = 150;
  3446. }
  3447. var orgSum = "";
  3448. if (orgList is not null && orgList.Count > 0)
  3449. {
  3450. var orgSumSelects = orgList.Select(t => @$"
  3451. SUM(CASE WHEN T2.sys_org_id = {t.Id} THEN T2.total_count ELSE 0 END) AS total_count_{t.Id}");
  3452. orgSum = string.Join(",", orgSumSelects) + ",";
  3453. }
  3454. var orgSelect = $@"
  3455. UNION ALL
  3456. -- 机构分段统计
  3457. SELECT T1.sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3458. FROM
  3459. (
  3460. SELECT T1.sys_org_id, get_exam_score_range_id_s(@type, @rangeScore, @rangeScore, @highScore, T2.score_x) AS exam_score_range_id
  3461. FROM ncee_student AS T1
  3462. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  3463. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId AND T2.course_id = @courseId
  3464. ) AS T1
  3465. GROUP BY T1.sys_org_id, T1.exam_score_range_id
  3466. ";
  3467. var dt = await rep.SqlQueryAsync($@"
  3468. SELECT T1.id AS exam_score_range_id, T1.`name` AS exam_score_range_name, {orgSum}
  3469. SUM(CASE WHEN T2.sys_org_id = 9998 THEN T2.total_count ELSE 0 END) AS total_count_range_current,
  3470. SUM(CASE WHEN T2.sys_org_id = 9999 THEN T2.total_count ELSE 0 END) AS total_count_range_sum
  3471. FROM exam_score_range AS T1
  3472. LEFT JOIN
  3473. (
  3474. -- 全部分段统计
  3475. SELECT 9998 AS sys_org_id, T1.exam_score_range_id, COUNT(T1.exam_score_range_id) AS total_count
  3476. FROM
  3477. (
  3478. SELECT get_exam_score_range_id_s(@type, @rangeScore, @rangeScore, @highScore, T2.score_x) AS exam_score_range_id
  3479. FROM ncee_student AS T1
  3480. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  3481. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId AND T2.course_id = @courseId
  3482. ) AS T1
  3483. GROUP BY T1.exam_score_range_id
  3484. UNION ALL
  3485. -- 全部分段累计
  3486. SELECT 9999 AS sys_org_id, T1.exam_score_range_id,
  3487. SUM(T1.total_count) OVER (ORDER BY T1.sequence ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS total_count
  3488. FROM
  3489. (
  3490. SELECT T1.*, T2.sequence
  3491. FROM
  3492. (
  3493. SELECT T1.exam_score_range_id, SUM(T1.count) AS total_count
  3494. FROM
  3495. (
  3496. SELECT get_exam_score_range_id_s(@type, @rangeScore, @rangeScore, @highScore, T2.score_x) AS exam_score_range_id, 1 AS count
  3497. FROM ncee_student AS T1
  3498. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  3499. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId AND T2.course_id = @courseId
  3500. UNION ALL
  3501. SELECT id, 0 FROM exam_score_range WHERE type = @type
  3502. ) AS T1
  3503. GROUP BY T1.exam_score_range_id
  3504. ) AS T1
  3505. LEFT JOIN exam_score_range AS T2 ON T1.exam_score_range_id = T2.id
  3506. ) AS T1
  3507. GROUP BY T1.exam_score_range_id
  3508. {orgSelect}
  3509. ) AS T2 ON T1.id = T2.exam_score_range_id
  3510. WHERE T1.type = @type
  3511. GROUP BY T1.id, T1.`name`
  3512. ORDER BY T1.sequence
  3513. ", new { NceePlanId = nceePlanId, DirectionCourseId = directionCourseId, CourseId = courseId, Type = type, RangeScore = rangeScore, HighScore = highScore });
  3514. return dt;
  3515. }
  3516. /// <summary>
  3517. /// 获取单科分数段统计表(未选科)
  3518. /// </summary>
  3519. /// <param name="nceePlanId"></param>
  3520. /// <param name="courseId"></param>
  3521. /// <param name="orgList"></param>
  3522. /// <returns></returns>
  3523. private async Task<DataTable> GetCourseScoreRangeTableUnselected(int nceePlanId, short courseId, List<SysOrgOutput> orgList = null)
  3524. {
  3525. return await GetCourseScoreRangeTable(nceePlanId, CourseConst.WEI_XUAN_KE, courseId, orgList);
  3526. }
  3527. /// <summary>
  3528. /// 获取各科原始分转换区间表
  3529. /// </summary>
  3530. /// <param name="nceePlanId"></param>
  3531. /// <returns></returns>
  3532. private async Task<DataTable> GetConvertRangeTable(int nceePlanId)
  3533. {
  3534. var dt = await rep.SqlQueryAsync(@"
  3535. SELECT T2.`name` AS course_name, T1.*
  3536. FROM
  3537. (
  3538. SELECT course_id,
  3539. MAX(IF(ncee_convert_grade_id = 1, min_score, NULL)) AS min_score_a,
  3540. MAX(IF(ncee_convert_grade_id = 1, max_score, NULL)) AS max_score_a,
  3541. MAX(IF(ncee_convert_grade_id = 2, min_score, NULL)) AS min_score_b,
  3542. MAX(IF(ncee_convert_grade_id = 2, max_score, NULL)) AS max_score_b,
  3543. MAX(IF(ncee_convert_grade_id = 3, min_score, NULL)) AS min_score_c,
  3544. MAX(IF(ncee_convert_grade_id = 3, max_score, NULL)) AS max_score_c,
  3545. MAX(IF(ncee_convert_grade_id = 4, min_score, NULL)) AS min_score_d,
  3546. MAX(IF(ncee_convert_grade_id = 4, max_score, NULL)) AS max_score_d,
  3547. MAX(IF(ncee_convert_grade_id = 5, min_score, NULL)) AS min_score_e,
  3548. MAX(IF(ncee_convert_grade_id = 5, max_score, NULL)) AS max_score_e
  3549. FROM ncee_convert_range
  3550. WHERE ncee_plan_id = @nceePlanId
  3551. GROUP BY course_id
  3552. ) AS T1
  3553. JOIN base_course AS T2 ON T1.course_id = T2.id
  3554. ", new { NceePlanId = nceePlanId });
  3555. return dt;
  3556. }
  3557. /// <summary>
  3558. /// 获取转换分明细表
  3559. /// </summary>
  3560. /// <param name="nceePlanId"></param>
  3561. /// <param name="directionCourseId"></param>
  3562. /// <param name="sysOrgId"></param>
  3563. /// <returns></returns>
  3564. private async Task<DataTable> GetConvertScoreTable(int nceePlanId, short directionCourseId, short sysOrgId)
  3565. {
  3566. var dt = await rep.SqlQueryAsync(@"
  3567. SELECT
  3568. T2.`name` AS sys_org_name,
  3569. T2.short_name AS sys_org_short_name,
  3570. T3.`name` AS direction_course_name,
  3571. T4.short_name AS ncee_course_comb_short_name,
  3572. T1.*,
  3573. IFNULL(T1.score_5, 0) + IFNULL(T1.score_6, 0) + IFNULL(T1.score_7, 0) + IFNULL(T1.score_9, 0) AS comb_score,
  3574. IFNULL(T1.score_x_5, 0) + IFNULL(T1.score_x_6, 0) + IFNULL(T1.score_x_7, 0) + IFNULL(T1.score_x_9, 0) AS comb_score_x
  3575. FROM
  3576. (
  3577. SELECT
  3578. T1.sys_org_id,
  3579. T1.direction_course_id,
  3580. T1.ncee_course_comb_id,
  3581. T1.class_number,
  3582. T1.id,
  3583. T1.exam_number,
  3584. T1.`name`,
  3585. MAX(T1.score) AS score,
  3586. MAX(T1.score_x) AS score_x,
  3587. MAX(T1.order_in_total) AS order_in_total,
  3588. MAX(T1.order_in_total_x) AS order_in_total_x,
  3589. MAX(T1.order_in_org) AS order_in_org,
  3590. MAX(T1.order_in_org_x) AS order_in_org_x,
  3591. MAX(CASE WHEN T2.course_id = 1 THEN T2.score ELSE NULL END) AS score_1,
  3592. MAX(CASE WHEN T2.course_id = 2 THEN T2.score ELSE NULL END) AS score_2,
  3593. MAX(CASE WHEN T2.course_id = 3 THEN T2.score ELSE NULL END) AS score_3,
  3594. MAX(CASE WHEN T2.course_id = 4 THEN T2.score ELSE NULL END) AS score_4,
  3595. MAX(CASE WHEN T2.course_id = 5 THEN T2.score ELSE NULL END) AS score_5,
  3596. MAX(CASE WHEN T2.course_id = 6 THEN T2.score ELSE NULL END) AS score_6,
  3597. MAX(CASE WHEN T2.course_id = 7 THEN T2.score ELSE NULL END) AS score_7,
  3598. MAX(CASE WHEN T2.course_id = 8 THEN T2.score ELSE NULL END) AS score_8,
  3599. MAX(CASE WHEN T2.course_id = 9 THEN T2.score ELSE NULL END) AS score_9,
  3600. MAX(CASE WHEN T2.course_id = 5 THEN T2.score_x ELSE NULL END) AS score_x_5,
  3601. MAX(CASE WHEN T2.course_id = 6 THEN T2.score_x ELSE NULL END) AS score_x_6,
  3602. MAX(CASE WHEN T2.course_id = 7 THEN T2.score_x ELSE NULL END) AS score_x_7,
  3603. MAX(CASE WHEN T2.course_id = 9 THEN T2.score_x ELSE NULL END) AS score_x_9,
  3604. MAX(CASE WHEN T2.course_id = 5 THEN T2.ncee_convert_grade_name ELSE '' END) AS ncee_convert_grade_name_5,
  3605. MAX(CASE WHEN T2.course_id = 6 THEN T2.ncee_convert_grade_name ELSE '' END) AS ncee_convert_grade_name_6,
  3606. MAX(CASE WHEN T2.course_id = 7 THEN T2.ncee_convert_grade_name ELSE '' END) AS ncee_convert_grade_name_7,
  3607. MAX(CASE WHEN T2.course_id = 9 THEN T2.ncee_convert_grade_name ELSE '' END) AS ncee_convert_grade_name_9
  3608. FROM ncee_student AS T1
  3609. JOIN ncee_score AS T2 ON T1.id = T2.ncee_student_id
  3610. WHERE T1.ncee_plan_id = @nceePlanId AND T1.direction_course_id = @directionCourseId AND (T1.sys_org_id = @sysOrgId OR @sysOrgId = 0)
  3611. GROUP BY T1.sys_org_id, T1.direction_course_id, T1.ncee_course_comb_id, T1.class_number, T1.id, T1.exam_number, T1.`name`
  3612. ) AS T1
  3613. JOIN sys_org AS T2 ON T1.sys_org_id = T2.id
  3614. LEFT JOIN base_course AS T3 ON T1.direction_course_id = T3.id
  3615. LEFT JOIN ncee_course_comb AS T4 ON T1.ncee_course_comb_id = T4.id
  3616. ORDER BY T1.direction_course_id, T1.score_x DESC
  3617. ", new { NceePlanId = nceePlanId, DirectionCourseId = directionCourseId, SysOrgId = sysOrgId });
  3618. return dt;
  3619. }
  3620. /// <summary>
  3621. /// 获取参与划线机构列表
  3622. /// </summary>
  3623. /// <param name="nceePlanId"></param>
  3624. /// <returns></returns>
  3625. private async Task<List<SysOrgOutput>> GetSysOrgList(int nceePlanId)
  3626. {
  3627. var ret = await rep.Change<NceeStudent>().DetachedEntities.Where(t => t.NceePlanId == nceePlanId && t.Score > 0)
  3628. .Select(t => t.SysOrg).Distinct()
  3629. .OrderBy(t => t.Id)
  3630. .ProjectToType<SysOrgOutput>().ToListAsync();
  3631. return ret;
  3632. }
  3633. /// <summary>
  3634. /// 获取划线依据
  3635. /// </summary>
  3636. /// <param name="nceePlanId"></param>
  3637. /// <returns></returns>
  3638. private async Task<DataTable> GetBaseLineTable(int nceePlanId)
  3639. {
  3640. var dt = await rep.SqlQueryAsync(@"
  3641. SELECT T1.ncee_line_level, T2.`name` AS ncee_line_level_name, T1.direction_course_id, T1.line_rate, T1.line_score, T1.line_score_x
  3642. FROM ncee_base_line AS T1
  3643. JOIN (SELECT * FROM sys_dict_data WHERE sys_dict_type_id = 211) AS T2 ON T1.ncee_line_level = T2.`value`
  3644. WHERE T1.ncee_plan_id = @nceePlanId
  3645. ", new { NceePlanId = nceePlanId });
  3646. return dt;
  3647. }
  3648. #endregion
  3649. #region 静态方法
  3650. /// <summary>
  3651. /// 获取等级合并名
  3652. /// </summary>
  3653. /// <param name="gradeNames"></param>
  3654. /// <returns></returns>
  3655. private static string GetMergeGradeName(List<string> gradeNames)
  3656. {
  3657. if (gradeNames == null)
  3658. {
  3659. return "";
  3660. }
  3661. var gns = gradeNames.Where(t => !string.IsNullOrEmpty(t) && !string.IsNullOrWhiteSpace(t)).OrderBy(t => t).ToList();
  3662. Dictionary<string, int> cs = [];
  3663. for (int i = 0; i < gns.Count; i++)
  3664. {
  3665. var g = gns[i];
  3666. if (cs.TryGetValue(g, out int value))
  3667. {
  3668. cs[g] = ++value;
  3669. }
  3670. else
  3671. {
  3672. cs.Add(g, 1);
  3673. }
  3674. }
  3675. string cgn = "";
  3676. foreach (var c in cs)
  3677. {
  3678. cgn = $"{cgn}{c.Value}[{c.Key}]";
  3679. }
  3680. return cgn;
  3681. }
  3682. ///// <summary>
  3683. ///// 导出柱状图
  3684. ///// </summary>
  3685. ///// <param name="sheet"></param>
  3686. ///// <param name="drawing"></param>
  3687. ///// <param name="anchor"></param>
  3688. ///// <param name="startDataRow"></param>
  3689. ///// <param name="endDataRow"></param>
  3690. ///// <param name="columnIndex"></param>
  3691. ///// <param name="title"></param>
  3692. ///// <param name="serieTitle"></param>
  3693. ///// <param name="catalogTitle"></param>
  3694. ///// <param name="valueTile"></param>
  3695. //private static void CreateBarChart(ISheet sheet, IDrawing drawing, IClientAnchor anchor, int startDataRow, int endDataRow, int columnIndex, string title = null, string serieTitle = null, string catalogTitle = null, string valueTile = null)
  3696. //{
  3697. // XSSFChart chart = (XSSFChart)drawing.CreateChart(anchor);
  3698. // if (!string.IsNullOrEmpty(title))
  3699. // {
  3700. // chart.SetTitle(title);
  3701. // chart.GetCTChart().title.tx.rich.p[0].pPr = new NPOI.OpenXmlFormats.Dml.CT_TextParagraphProperties
  3702. // {
  3703. // defRPr = new NPOI.OpenXmlFormats.Dml.CT_TextCharacterProperties() { sz = 1400 }
  3704. // };
  3705. // }
  3706. // IBarChartData<string, double> barChartData = chart.ChartDataFactory.CreateBarChartData<string, double>();
  3707. // IChartLegend legend = chart.GetOrCreateLegend();
  3708. // legend.Position = LegendPosition.TopRight;
  3709. // legend.IsOverlay = true;
  3710. // IChartAxis bottomAxis = chart.ChartAxisFactory.CreateCategoryAxis(AxisPosition.Bottom);
  3711. // bottomAxis.MajorTickMark = AxisTickMark.None;
  3712. // IValueAxis leftAxis = chart.ChartAxisFactory.CreateValueAxis(AxisPosition.Left);
  3713. // leftAxis.Crosses = AxisCrosses.AutoZero;
  3714. // leftAxis.SetCrossBetween(AxisCrossBetween.Between);
  3715. // IChartDataSource<string> categoryAxis = DataSources.FromStringCellRange(sheet, new CellRangeAddress(startDataRow, endDataRow, 0, 0));
  3716. // IChartDataSource<double> valueAxis = DataSources.FromNumericCellRange(sheet, new CellRangeAddress(startDataRow, endDataRow, columnIndex, columnIndex));
  3717. // var serie = barChartData.AddSeries(categoryAxis, valueAxis);
  3718. // if (!string.IsNullOrEmpty(serieTitle))
  3719. // {
  3720. // serie.SetTitle(serieTitle);
  3721. // }
  3722. // chart.Plot(barChartData, bottomAxis, leftAxis);
  3723. // var plotArea = chart.GetCTChart().plotArea;
  3724. // plotArea.catAx[0].txPr = new CT_TextBody();
  3725. // plotArea.catAx[0].txPr.AddNewP().pPr = new NPOI.OpenXmlFormats.Dml.CT_TextParagraphProperties()
  3726. // {
  3727. // defRPr = new NPOI.OpenXmlFormats.Dml.CT_TextCharacterProperties() { sz = 900 }
  3728. // };
  3729. // plotArea.catAx[0].majorTickMark = new CT_TickMark() { val = ST_TickMark.@out };
  3730. // plotArea.valAx[0].txPr = new CT_TextBody();
  3731. // plotArea.valAx[0].txPr.AddNewP().pPr = new NPOI.OpenXmlFormats.Dml.CT_TextParagraphProperties()
  3732. // {
  3733. // defRPr = new NPOI.OpenXmlFormats.Dml.CT_TextCharacterProperties() { sz = 900 }
  3734. // };
  3735. // plotArea.valAx[0].majorTickMark = new CT_TickMark() { val = ST_TickMark.@out };
  3736. // var barChart = plotArea.barChart.First();
  3737. // barChart.barDir = new CT_BarDir { val = ST_BarDir.col };
  3738. // if (!string.IsNullOrEmpty(catalogTitle))
  3739. // {
  3740. // var aTitle = new CT_Title
  3741. // {
  3742. // tx = new CT_Tx()
  3743. // };
  3744. // aTitle.tx.rich = new CT_TextBody();
  3745. // aTitle.tx.rich.AddNewP().AddNewR().t = catalogTitle;
  3746. // plotArea.valAx[0].title = aTitle;
  3747. // }
  3748. // if (!string.IsNullOrEmpty(valueTile))
  3749. // {
  3750. // var aTitle = new CT_Title
  3751. // {
  3752. // tx = new CT_Tx()
  3753. // };
  3754. // aTitle.tx.rich = new CT_TextBody();
  3755. // aTitle.tx.rich.AddNewP().AddNewR().t = valueTile;
  3756. // plotArea.catAx[0].title = aTitle;
  3757. // }
  3758. //}
  3759. #endregion
  3760. }