Advertisement
Guest User

Untitled

a guest
Mar 24th, 2016
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 9.33 KB | None | 0 0
  1. package com.hmkcode
  2.  
  3. ;
  4.  
  5. import java.io._
  6. import java.nio.charset.Charset
  7. import java.sql.{Connection, DriverManager}
  8.  
  9. import com.itextpdf.text.pdf.PdfWriter
  10. import com.itextpdf.text.{Document, FontFactory, PageSize}
  11. import com.itextpdf.tool.xml.{XMLWorkerFontProvider, XMLWorkerHelper}
  12. import org.scalatest.FunSuite
  13. import scalikejdbc.{DB, _}
  14.  
  15.  
  16. /**
  17.   * Created by ksenya on 08.02.16.
  18.   */
  19. //noinspection ScalaDeprecation
  20.  
  21. case class Member(post: Option[String], rate: String, part: Option[Int], discilineName: Option[String],
  22.                   faculty: Option[String], department:Int, cipherGroup: Option[String], disciplineIndex: Option[String],
  23.                   course: String, fo: Option[String], trainingPeriod: Option[String], nameWork: String,
  24.                   contingentVolume: Int, calculationHours: Int, term: Int)
  25. case class Full_name(last_name:Option[String],first_name:Option[String],middle_name:Option[String])
  26.  
  27. class ReportTest extends FunSuite {
  28.   test ("A Scala XML generation test") {
  29.     Class.forName ("oracle.jdbc.driver.OracleDriver")
  30.     val c: Connection = DriverManager.getConnection ("jdbc:oracle:thin:@//[192.168.11.36][1521]/student", "portal_owner", "portal_owner")
  31.     val person_id=54412
  32.     val study_year="2015/2016"
  33.    DB (c).readOnly { implicit session =>
  34.       val members =sql"""SELECT genericvac1_.title AS post,
  35.              employeety2_.наименования AS rate,
  36.              genericvac1_.part AS part,
  37.              payloaddis4_.discipline AS disciplineName,
  38.              payloaddis4_.faculty AS faculty,
  39.              genericvac1_.DEPARTMENT_ID as department,
  40.              payloaddis4_.group_codes AS cipherGroup,
  41.              payloaddis4_.discipline_index AS disciplineIndex,
  42.              resource3_.course AS course,
  43.              payloaddis4_.study_form AS fo,
  44.              payloaddis4_.study_length AS trainingPeriod,
  45.              tasktype5_.аббревиатура AS nameWork,
  46.              resource3_.term AS term,
  47.              assignment0_.payload AS calculationHours,
  48.              assignment0_.qty AS contingentVolume
  49.              FROM w_assignments assignment0_
  50.              INNER JOIN w_generic_vacancies genericvac1_ ON assignment0_.employee_id=genericvac1_.id
  51.              INNER JOIN и_типы_долж employeety2_ ON genericvac1_.TYPE=employeety2_.наим_сокр
  52.              INNER JOIN W_Resource resource3_ ON assignment0_.resource_id=resource3_.id
  53.              LEFT OUTER JOIN w_payload_discipline payloaddis4_ ON resource3_.payload_dis_id=payloaddis4_.id
  54.              INNER JOIN и_виды_работ tasktype5_ ON resource3_.task_type_id=tasktype5_.ид
  55.              WHERE genericvac1_.id IN (SELECT employee6_.id
  56.              FROM w_generic_vacancies employee6_
  57.              WHERE employee6_.vac_type='employee'
  58.              AND employee6_.person_id= $person_id
  59.              AND employee6_.study_year=$study_year)
  60.              ORDER BY genericvac1_.id, payloaddis4_.discipline, payloaddis4_.study_form, payloaddis4_.study_length,
  61.              resource3_.course, payloaddis4_.group_codes, tasktype5_.аббревиатура"""
  62.           .map { rs => Member (
  63.             rs.stringOpt ("post"),
  64.             rs.string ("rate"),
  65.             rs.intOpt ("part"),
  66.             rs.stringOpt ("disciplineName"),
  67.             rs.stringOpt ("faculty"),
  68.             rs.int("department"),
  69.             rs.stringOpt ("cipherGroup"),
  70.             rs.stringOpt ("disciplineIndex"),
  71.             rs.string ("course"),
  72.             rs.stringOpt ("fo"),
  73.             rs.stringOpt ("trainingPeriod"),
  74.             rs.string ("nameWork"),
  75.             rs.int ("contingentVolume"),
  76.             rs.int ("calculationHours"),
  77.             rs.int ("term"))
  78.           }.list.apply()
  79.  
  80.       val department_group = members.groupBy(group=> group.department)
  81.  
  82.       def sumYear(rows: List[Member]) = rows.map (row => row.calculationHours).sum
  83.  
  84.       val full_name_person =sql"""select LAST_NAME, FIRST_NAME, MIDDLE_NAME from IIAS_OWNER.WV_PERSONS where id=$person_id"""
  85.        .map { rs =>  Full_name(
  86.          rs.stringOpt ("LAST_NAME"),
  87.          rs.stringOpt ("FIRST_NAME"),
  88.          rs.stringOpt ("MIDDLE_NAME"))
  89.        }.list.apply()
  90.  
  91.     val doc = <html>
  92.       <head>
  93.         <meta charset="utf-8"/>
  94.         <link href="style.css" rel="stylesheet" type="text/css"/>
  95.       </head>
  96.       <body>
  97.         <h3 align="center">УЧЕБНАЯ НАГРУЗКА ПРЕПОДАВАТЕЛЯ НА {study_year} УЧ. ГОД</h3>
  98.         <p>Ф.И.О. преподавателя:
  99.           {
  100.             full_name_person.map{name=>
  101.               (name.last_name.getOrElse(""),
  102.                 name.first_name.getOrElse(""),
  103.                 name.middle_name.getOrElse(""))
  104.                 .toString().replaceAll(","," ")}
  105.           } </p>
  106.        { department_group.map { case (depart, dat) =>
  107.         <p>КАФЕДРА:
  108.                 { sql"""SELECT "НАИМЕНОВАНИЕ" FROM IIAS_OWNER.WV_DEPARTMENTS where "ИД"=$depart"""
  109.                 .map { rs =>  rs.string("наименование")
  110.                 }.list.apply()}
  111.         </p>
  112.         <table border="1" class="jewel">
  113.           <tr>
  114.             <td>Исполнение должности</td>
  115.             <td>Наименование дисциплины</td>
  116.             <td>Факультет</td>
  117.             <td>Шифр группы</td>
  118.             <td>Индекс дисциплины</td>
  119.             <td>Курс</td>
  120.             <td>Ф.О</td>
  121.             <td>Срок обучения</td>
  122.             <td>Наимен/вид работ</td>
  123.             <td>Объем контингента</td>
  124.             <td>Расчет часов</td>
  125.             <td>1 сем</td>
  126.             <td>2 сем</td>
  127.             <td>год</td>
  128.           </tr>{
  129.             val data = dat.groupBy(record => (record.post.getOrElse (""), record.rate, record.part.getOrElse ("")))
  130.             data.map {
  131.               case (name, rows) =>
  132.                 rows.groupBy (discipline_group =>
  133.                   (discipline_group.discilineName,
  134.                     discipline_group.faculty,
  135.                     discipline_group.cipherGroup,
  136.                     discipline_group.disciplineIndex,
  137.                     discipline_group.course,
  138.                     discipline_group.fo,
  139.                     discipline_group.trainingPeriod)).map { case (disciplonegroup, row_) =>
  140.                   var sum_one_sem = 0
  141.                   var sum_two_sem = 0
  142.                   var sum_year = 0
  143.                   row_.map { row =>
  144.                     val (post, rate, part) = name
  145.                     var one_sem = 0
  146.                     var two_sem = 0
  147.                     var year = 0
  148.                   <tr>
  149.                     {if (row eq rows.head) <td rowspan={rows.length.toString}>{post}, {rate}, {part}</td>}
  150.                     <td>{row.discilineName.getOrElse ("")}</td>
  151.                     <td>{row.faculty.getOrElse ("")}</td>
  152.                     <td>{row.cipherGroup.getOrElse ("")}</td>
  153.                     <td>{row.disciplineIndex.getOrElse ("")}</td>
  154.                     <td>{row.course}</td>
  155.                     <td>{row.fo.getOrElse ("")}</td>
  156.                     <td>{row.trainingPeriod.getOrElse ("")}</td>
  157.                     <td>{row.nameWork}</td>
  158.                     <td>{row.contingentVolume}</td>
  159.                     <td>{row.calculationHours}</td>
  160.                     {if ( {row.term} == 1)
  161.                     one_sem = {row.calculationHours};
  162.                     sum_one_sem += one_sem;
  163.                       <td> {one_sem}</td>
  164.                     }
  165.                     {if ( {row.term} == 2)
  166.                     two_sem = {row.calculationHours};
  167.                     sum_two_sem += two_sem;
  168.                       <td> {two_sem}</td>
  169.                     }
  170.                     {year = {row.calculationHours};
  171.                     sum_year += year;
  172.                     <td>{row.calculationHours}</td>
  173.                     }
  174.                   </tr>
  175.                   } ++ {
  176.                 <tr>
  177.                  <th>Итого: </th>
  178.                   <td></td>
  179.                   <td></td>
  180.                   <td></td>
  181.                   <td></td>
  182.                   <td></td>
  183.                   <td></td>
  184.                   <td></td>
  185.                   <td></td>
  186.                   <td></td>
  187.                   <th>{sum_one_sem}</th>
  188.                   <th>{sum_two_sem}</th>
  189.                   <th>{sum_year}</th>
  190.               </tr>}
  191.  
  192.                   }
  193.                 }
  194.             }
  195.         </table>
  196.       }}
  197.         <p>Данные подготовлены в ИИАС "Учебный процесс"</p>
  198.       </body>
  199.     </html>
  200.  
  201.     val document: Document = new Document(PageSize.A4.rotate())
  202.     val writer: PdfWriter = PdfWriter.getInstance (document, new FileOutputStream ("/tmp/out.pdf"))
  203.     document.open
  204.  
  205.     val fontProvider: XMLWorkerFontProvider = new XMLWorkerFontProvider (XMLWorkerFontProvider.DONTLOOKFORFONTS)
  206.     fontProvider.register ("/usr/share/fonts/truetype/dejavu/DejaVuSerif.ttf")
  207.     FontFactory.setFontImp (fontProvider)
  208.     val is: InputStream = new ByteArrayInputStream (doc.toString ().getBytes (Charset.forName ("UTF-8")))
  209.     XMLWorkerHelper.getInstance ().parseXHtml (writer, document, is, Charset.forName ("UTF-8"), fontProvider)
  210.     document.close
  211.  
  212.     println ("PDF Created!")
  213.   }
  214. }}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement