DELIMITER //

CREATE OR REPLACE PROCEDURE bpmm02_sign_assign (
  IN p_token VARCHAR(100),           -- 可轉為 userid
  IN p_sign_type VARCHAR(1),         -- A(gree)/R(eject)  
  IN p_uuid VARCHAR(100),            -- 也可以傳入 functiontag
  IN p_source_pk_value VARCHAR(100)  -- 單號
)
/*
  功能      : 配合 vue+jsplumb 的 bpm, 配合簽核同意, 駁回時的 [指定簽核人] select 元件所需內容
  描述      : 本程式用於 [指定簽核人]
  建立日期  : 2022/11/27
  
  修改歷史
    項目  誰         日期        修改說明
    ====  ========== ==========  ================================================
    1    Michael    2022-11-27  Init
*/
BEGIN
  DECLARE v_userid VARCHAR(20);
  DECLARE v_id INT;      -- 當前 id
  DECLARE v_flow_level INT;      -- 當前 id 的 flow_level
  
  -- 根據傳入的 token 取得 userid, 並會判斷 token 是否仍有效(無效傳回空白)
  proc_label: BEGIN
  SELECT checktoken(p_token) INTO v_userid;
  IF v_userid = '' THEN 
    LEAVE proc_label;
  END IF;
    
  -- 以請假單為例(由 tag 轉 uuid)
  IF LENGTH(p_uuid) < 20 THEN
    SELECT flow_id INTO p_uuid FROM bpm_list WHERE functiontag = p_uuid;
  END IF;
  
  -- 取得當前待簽核的 id, 及前一或後一步驟的 id
  SELECT id, flow_level INTO v_id, v_flow_level FROM bpm_flow_sign
  WHERE flow_id = p_uuid AND sourceid = p_source_pk_value AND signerid = v_userid AND sign_status = 'P';
  
  -- 如果不符合條件, 就直接離開
  IF v_id IS NULL THEN 
    LEAVE proc_label;
  END IF;
  
  -- 返回基本狀態
  SELECT 0 AS code, 'ok' AS msg;
  
  IF p_sign_type = 'A' THEN
    -- 同意, 下一關
    SELECT '*' AS value, '不指派' AS label
    UNION
    SELECT s.signerid AS value, p.personcname AS label FROM bpm_flow_sign s
    LEFT JOIN basperson p ON s.signerid = p.personid
    WHERE flow_id = p_uuid AND sourceid = p_source_pk_value AND flow_level = v_flow_level + 1;
    
  ELSEIF p_sign_type = 'R' THEN
    -- 駁回, 前一關(駁回可以回之前任何一關), 但是必須 assign_to=Y(之前有簽過的人)
    SELECT '*' AS value, '不指派' AS label
    UNION
    SELECT s.signerid AS value, p.personcname AS label FROM bpm_flow_sign s
    LEFT JOIN basperson p ON s.signerid = p.personid
    WHERE flow_id = p_uuid AND sourceid = p_source_pk_value AND flow_level < v_flow_level AND assign_to = 'Y';
  END IF;
  
  END;
END //

DELIMITER ;