Advertisement
Guest User

Untitled

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