Advertisement
DrankUser

Функции выгрузки журнала

Sep 5th, 2019
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION get_timetable_lessons1(date_begin date, date_end date)
  2.   RETURNS TABLE (
  3.     s_timetable_subject timetable_subject.id%type,
  4.     s_department        timetable_subject.s_department%type,
  5.     "time"              TIME,
  6.     "date"              DATE,
  7.     s_group             profile_student_group.id%type,
  8.     s_subject           spr_subject.id%type,
  9.     s_vfur              spr_vfur.id%type,
  10.     half_year           SMALLINT,
  11.     year_begin          SMALLINT
  12.   )
  13.   LANGUAGE SQL
  14. AS $$
  15.   WITH
  16.     dates AS (
  17.       SELECT
  18.         date.date::date as date,
  19.         getweektype(date.date::date) AS s_weektype,
  20.         date_part('dow', date.date) AS s_dayweek
  21.       FROM generate_series(date_begin, date_end, interval '1 day') date
  22.     )
  23.   SELECT
  24.     ts.id AS s_timetable_subject,
  25.     ts.s_department,
  26.     coalesce(ts.time_begin, pair.time_begin) AS time,
  27.     dates.date,
  28.     ts.s_student_group AS s_group,
  29.     ts.s_subject,
  30.     ts.s_vfur,
  31.     ts.half_year,
  32.     getBeginYear(dates.date) AS year_begin
  33.   FROM timetable_subject ts
  34.     INNER JOIN timetable_subject_date ts_date ON ts.id = ts_date.s_timetable_subject
  35.     INNER JOIN spr_pair pair ON ts.s_pair = pair.id
  36.     INNER JOIN dates ON dates.date BETWEEN ts_date.date_begin AND ts_date.date_end
  37.     AND (ts.s_weektype = 3 OR ts.s_weektype = dates.s_weektype)
  38.     AND ts.s_dayweek = dates.s_dayweek
  39.   WHERE ts.s_vfur NOTNULL;
  40. $$;
  41.  
  42. CREATE OR REPLACE FUNCTION insert_group_book_columns1(
  43.   date_begin date,
  44.   date_end date,
  45.   OUT pages_inserted INT,
  46.   OUT cols_inserted INT,
  47.   OUT cells_inserted INT,
  48.   OUT signs_inserted INT,
  49.   OUT rows_inserted INT
  50. )
  51.   LANGUAGE plpgsql
  52. AS
  53. $$
  54. DECLARE
  55.   v_page_type group_book_page_type.id%type;
  56.   v_col_type group_book_column_type.id%type;
  57.   v_content_empty group_book_cell_content.id%type;
  58.   v_signer_teacher group_book_column_signer.id%type;
  59.   v_signer_student group_book_column_signer.id%type;
  60.   v_year_begin INT;
  61.   v_dopcps_id INT;
  62. BEGIN
  63.   SELECT id INTO v_page_type FROM group_book_page_type WHERE code = 'university';
  64.   SELECT id INTO v_col_type FROM group_book_column_type WHERE code = 'lesson';
  65.   SELECT id INTO v_content_empty FROM group_book_cell_content WHERE code = 'empty';
  66.   SELECT id INTO v_signer_teacher FROM group_book_column_signer WHERE code = 'teacher';
  67.   SELECT id INTO v_signer_student FROM group_book_column_signer WHERE code = 'group_headman';
  68.  
  69.   v_year_begin := getbeginyear();
  70.   v_dopcps_id := getdopcpsid();
  71.  
  72.   pages_inserted := 0;
  73.   cols_inserted := 0;
  74.   cells_inserted := 0;
  75.   signs_inserted := 0;
  76.   rows_inserted := 0;
  77.  
  78.   -- Вставка страниц
  79.   INSERT INTO group_book_page (s_group, s_vfur, s_subject, half_year, year_begin, s_type)
  80.   SELECT DISTINCT
  81.    sg.id s_group,
  82.    es.s_vfur,
  83.    es.s_subject,
  84.    es.half_year,
  85.    es.b_year year_begin,
  86.    v_page_type s_type
  87.   FROM profile_emp_subject es
  88.     INNER JOIN profile_emp_student_group esg ON esg.s_emp_subject=es.id
  89.     INNER JOIN profile_student_group sg ON esg.s_student_group=sg.id
  90.     INNER JOIN spr_speciality s ON sg.s_speciality=s.id
  91.     INNER JOIN spr_qualif_level ql ON s.s_qualif_level=ql.id
  92.     INNER JOIN spr_vfur vf ON es.s_vfur=vf.id
  93.     LEFT OUTER JOIN group_book_page p ON p.half_year=es.half_year
  94.       AND p.s_group = sg.id
  95.       AND p.s_subject = es.s_subject
  96.       AND p.s_type = v_page_type
  97.       AND p.s_vfur = es.s_vfur
  98.       AND p.year_begin =es.b_year
  99.   WHERE ql.codestring IN ('bachelor', 'specialist', 'master')
  100.     AND es.s_group_lessons = 1 AND vf.is_reporting = 0
  101.     AND es.s_chair <> v_dopcps_id AND es.b_year = v_year_begin
  102.     AND p.id IS NULL;
  103.  
  104.   GET DIAGNOSTICS pages_inserted = ROW_COUNT;
  105.  
  106.   -- Вставка колонок
  107.   WITH
  108.     lesson AS (
  109.       SELECT * FROM get_timetable_lessons1(date_begin, date_end)
  110.         WHERE s_department <> v_dopcps_id
  111.     ),
  112.     t AS (
  113.       SELECT
  114.         p.id s_page,
  115.         v_col_type s_type,
  116.         l.date,
  117.         l.time,
  118.         TRUE is_imported
  119.       FROM group_book_page p
  120.       INNER JOIN lesson l ON p.s_group = l.s_group
  121.         AND p.s_vfur = l.s_vfur
  122.         AND p.s_subject = l.s_subject
  123.         AND p.half_year = l.half_year
  124.         AND p.year_begin = l.year_begin
  125.     ),
  126.     col_ins AS (
  127.       INSERT INTO group_book_column (s_page, s_type, date, "time", is_imported)
  128.       SELECT DISTINCT t.s_page, t.s_type, t.date, t.time, t.is_imported
  129.       FROM t
  130.         LEFT OUTER JOIN group_book_column c ON c.s_page = t.s_page
  131.           AND c.s_type = t.s_type
  132.           AND c.date = t.date
  133.           AND c.time = t.time
  134.       WHERE c.id IS NULL
  135.       RETURNING
  136.         group_book_column.id,
  137.         group_book_column.s_page,
  138.         group_book_column.s_type,
  139.         group_book_column."date",
  140.         group_book_column."time",
  141.         group_book_column.is_imported
  142.     ),
  143.     sign_ins AS (
  144.       INSERT INTO group_book_column_sign (s_signer, s_column, subgroup)
  145.       SELECT
  146.         v_signer_teacher AS s_signer,
  147.         col.id AS s_column,
  148.         pesg.subgroup
  149.       FROM group_book_page page
  150.         INNER JOIN col_ins col ON page.id = col.s_page
  151.         INNER JOIN profile_emp_subject pes
  152.           ON page.s_vfur = pes.s_vfur
  153.             AND page.s_subject = pes.s_subject
  154.             AND page.half_year = pes.half_year
  155.             AND page.year_begin = pes.b_year
  156.         INNER JOIN profile_emp_student_group pesg ON pes.id = pesg.s_emp_subject
  157.           AND page.s_group = pesg.s_student_group
  158.       UNION SELECT
  159.         v_signer_student AS s_signer,
  160.         col.id as s_column,
  161.         NULL as subgroup
  162.       FROM col_ins col
  163.       RETURNING group_book_column_sign.id
  164.     )
  165.   SELECT
  166.     (SELECT count(id) FROM col_ins) as cols_ins,
  167.     (SELECT count(id) FROM sign_ins) as signs_ins
  168.   INTO cols_inserted, signs_inserted;
  169.  
  170.  
  171.   --Вставка студентов
  172.   WITH
  173.     s AS (
  174.       SELECT s.*
  175.       FROM profile_student s
  176.         INNER JOIN spr_qualif_level ql ON s.s_qualif_level = ql.id
  177.         INNER JOIN sys_user u ON u.id = s.s_user
  178.         INNER JOIN spr_choose c ON c.id = u.activity AND c.code = 'yes'
  179.       WHERE ql.codestring IN ('bachelor', 'specialist', 'master')
  180.     ),
  181.     t AS (
  182.       SELECT
  183.         s.s_user s_student_user,
  184.         s.id s_student_profile,
  185.         CASE WHEN s.s_student_status = 1
  186.           THEN TRUE
  187.           ELSE FALSE
  188.         END is_active,
  189.         s.s_student_group s_group,
  190.         r.id r_id,
  191.         r.s_student_user r_s_student_user,
  192.         r.s_student_profile r_s_student_profile,
  193.         COALESCE(r.is_active, FALSE) r_is_active,
  194.         r.s_group r_s_group
  195.       FROM s
  196.       FULL OUTER JOIN group_book_row r ON r.s_student_profile = s.id
  197.         AND r.s_group = s.s_student_group
  198.       WHERE CASE WHEN s.s_student_status = 1
  199.         THEN TRUE
  200.         ELSE FALSE
  201.         END <> COALESCE(r.is_active, FALSE)
  202.     ),
  203.     ins AS (
  204.       INSERT INTO group_book_row (s_student_user, s_student_profile, is_active, s_group)
  205.       SELECT s_student_user, s_student_profile, is_active, s_group
  206.       FROM t
  207.       WHERE is_active = TRUE AND r_id IS NULL
  208.       RETURNING group_book_row.id
  209.     ),
  210.     upd AS (
  211.       UPDATE group_book_row r SET is_active = t.is_active
  212.       FROM t
  213.       WHERE t.r_id=r.id
  214.     )
  215.   SELECT count(id) INTO rows_inserted FROM ins;
  216.  
  217.   --Вставка строк в журнал
  218.   INSERT INTO group_book_page_row (s_page,s_row)
  219.   SELECT p.id s_page, r.id s_row
  220.   FROM group_book_page p
  221.     INNER JOIN group_book_row r ON r.s_group = p.s_group
  222.     LEFT OUTER JOIN group_book_page_row pr ON pr.s_page = p.id AND pr.s_row = r.id
  223.   WHERE pr.s_row IS NULL;
  224.  
  225.   -- Вставка ячеек в журнал
  226.   INSERT INTO group_book_cell (s_col,s_row,s_content)
  227.   SELECT
  228.     c.id s_col,
  229.     pr.s_row,
  230.     v_content_empty s_content
  231.   FROM group_book_column c
  232.     INNER JOIN group_book_page_row pr ON pr.s_page = c.s_page
  233.     INNER JOIN group_book_row row ON pr.s_row = row.id AND row.is_active IS TRUE
  234.     LEFT OUTER JOIN group_book_cell cell ON cell.s_col = c.id AND cell.s_row = pr.s_row
  235.     LEFT OUTER JOIN (
  236.         -- уже подписанные колонки
  237.         SELECT DISTINCT s_column
  238.         FROM group_book_column_sign
  239.         WHERE s_user IS NOT NULL AND created_at IS NOT NULL
  240.  
  241.         UNION SELECT DISTINCT s_column
  242.         FROM group_book_column_history h
  243.           INNER JOIN group_book_column_status status ON h.s_status = status.id
  244.             AND status.code IN ('closed', 'completed', 'failed')
  245.       ) s ON s.s_column = c.id
  246.   WHERE s.s_column IS NULL AND cell.id IS NULL;
  247.  
  248.   GET DIAGNOSTICS cells_inserted = ROW_COUNT;
  249. END
  250. $$;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement