DELIMITER //

CREATE OR REPLACE FUNCTION bpmm02_udf_spread_signer(
  p_uuid VARCHAR(100),
  p_personid VARCHAR(20),          -- 起單人
  p_source_pk_value VARCHAR(100),  -- 原單單號
  p_stepId VARCHAR(100),
  p_typeName VARCHAR(20),
  p_nodeName VARCHAR(20),
  p_filterSet VARCHAR(2000),
  p_step INT
)
RETURNS TEXT
BEGIN
  -- 變數宣告 (對應 MS-SQL 的 declare)
  DECLARE v_sql VARCHAR(1000);
  DECLARE v_tablename VARCHAR(100);
  DECLARE v_source_pk VARCHAR(100);
  DECLARE v_stepName VARCHAR(100);
  DECLARE v_roleName VARCHAR(100);
  DECLARE v_source_note VARCHAR(100);
  DECLARE v_userid VARCHAR(100);
  DECLARE v_status CHAR(1);
  
  -- 簡化狀態邏輯：第一關為 P，其餘為 N 
  SET v_status = CASE WHEN p_step = 1 THEN 'P' ELSE 'N' END;

  IF p_nodeName = 'nodeNode' THEN
    -- 取得來源表資訊
    SELECT source_table, source_pk, source_note 
    INTO v_tablename, v_source_pk, v_source_note 
    FROM bpm_list WHERE flow_id = p_uuid;

    -- 取得關卡設定資訊
    SELECT roleName, stepName 
    INTO v_roleName, v_stepName 
    FROM bpm_setup WHERE flow_id = p_uuid AND stepId = p_stepId;

    -- 1. fields 模式
    IF p_typeName = 'fields' THEN
      -- 直接用 INSERT ... SELECT，省去組裝宣告變數的字串 
      SET v_sql = CONCAT(
        'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ',
        'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ', 
        v_roleName, ', ', QUOTE(v_status), ', NOW(), ', v_source_note, 
        ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ', QUOTE(p_source_pk_value)
      );

    -- 2. roles 模式
    ELSEIF p_typeName = 'roles' THEN
      IF v_roleName = 'manager' THEN
        -- 取直屬主管 (目前僅能處理起單人的直屬主管)
        SELECT bossid INTO v_userid FROM sys_users WHERE userid = p_personid;
        SET v_userid = IFNULL(v_userid, '4734'); -- ISNULL 替換為 IFNULL 
        
        SET v_sql = CONCAT(
          'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ',
          'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ', 
          QUOTE(v_userid), ', ', QUOTE(v_status), ', NOW(), ', v_source_note, 
          ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ', QUOTE(p_source_pk_value)
        );
      ELSE
        -- 取 role table 處理多人角色，利用 CROSS JOIN 合併表單資訊
        SET v_sql = CONCAT(
          'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ',
          'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ', 
          'UR.userid, ', QUOTE(v_status), ', NOW(), T.', v_source_note, 
          ' FROM sys_userroles UR CROSS JOIN ', v_tablename, ' T ',
          ' WHERE UR.roleid = ', QUOTE(v_roleName), ' AND T.', v_source_pk, ' = ', QUOTE(p_source_pk_value)
        );
      END IF;

    -- 3. users 模式
    ELSEIF p_typeName = 'users' THEN
      SET v_sql = CONCAT(
        'INSERT INTO bpm_flow_sign (flow_id, sourceid, stepName, flow_level, signerid, sign_status, create_date, sign_note) ',
        'SELECT ', QUOTE(p_uuid), ', ', QUOTE(p_source_pk_value), ', ', QUOTE(v_stepName), ', ', p_step, ', ', 
        QUOTE(v_roleName), ', ', QUOTE(v_status), ', NOW(), ', v_source_note, 
        ' FROM ', v_tablename, ' WHERE ', v_source_pk, ' = ', QUOTE(p_source_pk_value)
      );
    END IF;
  END IF;
  
  RETURN v_sql;
END //

DELIMITER ;