delimiter //

create or replace procedure get_menustructure()
/*
  Function   : 配合 amis 的 transfer, 取得 module-menu 資料, 主要是建立 role-menu permissions 用
  Description: 本 sp 修改自 get_orgstructure
  Build Date : 2021/10/19
  
  Modify History
    Item Who        Date       Modify Docs
    ==== ========== ========== ================================================
    1    Michael    2021/10/19
    
*/
begin

declare max_val int;
declare curr_id int;
declare group_id int;
declare next_group_id int;
declare datas nvarchar(max);
declare footer varchar(600);
declare dept_name varchar(100);
declare emp_name varchar(100);
declare person_id varchar(100);
declare crlf varchar(2);
declare comm varchar(1);

set crlf = char(10) + char(13);

select
  bp.moduleid, bp.menuid, '(' || bp.moduleid || ')' || bm.modulename as deptname,
  '(' || bp.menuid || ')' || bp.caption as empname,
  ROW_NUMBER() OVER(PARTITION BY bp.moduleid ORDER BY bp.moduleid, bp.menuid) AS groupid,
  ROW_NUMBER() OVER(ORDER BY bp.moduleid, bp.menuid) AS rowid
into #tmp
from sys_menutable bp 
left join sys_module bm on bp.moduleid = bm.moduleid
where coalesce(bp.moduleid, '') <> ''
order by bp.moduleid, bp.menuid;

select count(*) into max_val from #tmp;
select min(rowid) into curr_id from #tmp;

set datas = '';
set comm = '';
while (curr_id <= max_val) do
  -- 取得現有資料
  select groupid, deptname, empname, menuid into group_id, dept_name, emp_name, person_id
  from #tmp where rowid = curr_id;
  
  if curr_id = max_val then
    set comm = '';
  else
    select groupid into next_group_id from #tmp where rowid = curr_id + 1;
    if next_group_id = 1 then
      set comm = '';
    else
      set comm = ',';
    end if;
  end if;
  
  if group_id = 1 then
    if curr_id > 1 then
      set footer = '			]' || crlf ||
        '          },' || crlf;
    else
      set footer = '';
    end if;
	  
    set datas = datas || footer || 
      '        {' || crlf ||
      '            "label": "' || dept_name || '",' || crlf ||
      '            "children": [' || crlf || 
      '			   {' || crlf ||
      '                "label": "' || emp_name || '",' || crlf ||
      '                "value": "' || person_id || '"' || crlf ||
      '              }' || comm || crlf;  
  else
    set datas = datas ||
      '			   {' || crlf ||
      '                "label": "' || emp_name || '",' || crlf ||
      '                "value": "' || person_id || '"' || crlf ||
      '              }' || comm || crlf;  
  end if;
  
  set curr_id = curr_id + 1;
end while;

set datas = '	[' || crlf || datas ||
  '			]' || crlf ||
  '		}' || crlf ||
  '	]';

drop table #tmp;

select 0 as code, 'ok' as msg;
select datas as jsoncode;

end //

delimiter ;
