create or replace procedure km_document_draft_audit(
kid_v in varchar2, mark_v in varchar2, sug_v in varchar2
) is
click_num integer; -- 知识点击率信息
ver_id_current integer; -- 草稿通过审核后的 版本号
current_link integer ; --当前的环节
last_link integer; -- 审核流程的最终环节
doc_num integer; -- 正式知识表 中 是否有 已经有草稿表的信息 (kid 相同)
doc_row km_document%rowtype;
draft_row km_document_draft%rowtype;
cursor content_add is select * from KM_CONTENT_ADD where kid = kid_v; --正式知识关联的 content——add
content_k content_add%rowtype;
cursor att_list is select * from KM_ATTACHMENT_LIST where kid = kid_v; --正式知识关联的 附件列表
att_k att_list%rowtype;
cursor draft_node_list is select * from KM_DOCNODE_DRAFT where kid = kid_v; --草稿节点表
draft_node draft_node_list%rowtype;
cursor draft_content_list is select * from KM_CONTENT_ADD_DRAFT where kid=kid_v; --草稿内容附加信息
draft_content draft_content_list%rowtype;
cursor draft_att_list is select * from KM_ATTACHMENT_LIST_DRAFT where kid=kid_v; --草稿附件
draft_att draft_att_list%rowtype;
begin
if (mark_v =1) then -- 审核通过处理 开始。。。。。。。。。
select b.pass_link_id into current_link from KM_DOCUMENT_DRAFT a , KM_PROCESS_LINK b
where a.audit_link =b.link_id and a.p_id = b.pid and a.kid = kid_v;
-- 改变审核环节
update KM_DOCUMENT_DRAFT k set k.audit_link = current_link ,k.audit_sug = sug_v where k.kid = kid_v;
-- 判断当前的 审核环节是否是最终的 环节 是 进行发布, 检测当前库 是否有该知识 有 先 copy 到 历史 再删除 再将 draft 拷贝到 当前库
select max(b.link_id) into last_link from KM_DOCUMENT_DRAFT a , KM_PROCESS_LINK b --最大的环节
where a.p_id = b.pid and a.kid = kid_v;
if(last_link = current_link) then --是最终的环节 进行发布操作 开始。。。。。。。。。。。
--- 拷贝
select count(*) into doc_num from km_document where kid = kid_v;
if(doc_num >0) then --正式库有 先拷贝 到 历史库 删除正式 拷贝 draft 到正式 draf再删除
--拷贝 正是知识
select * into doc_row from km_document where kid = kid_v;
insert into Km_Document_Ver (
KID ,VER_ID,TITLE,CONTENT ,ISADDITION,STATUS,BEGINTIME,ENDTIME ,GATHERERS,GATHERTTIME ,AUDITOR ,
AUDITTIME,UPDATETIME ,KEYWORDS,SUMMARY,K_SOURCE,ISADDFILE,KIND_ID )
values(
doc_row.kid,doc_row.ver_id,doc_row.title,doc_row.content,nvl(doc_row.isaddition,0),doc_row.status,doc_row.begintime,
doc_row.endtime,doc_row.gatherers,doc_row.gatherttime,doc_row.auditor,doc_row.audittime,doc_row.updatetime,
doc_row.keywords,doc_row.summary,doc_row.k_source,nvl(doc_row.isaddfile,0),doc_row.kind_id
);
-- 拷贝 content——add
for content_k in content_add loop
insert into KM_CONTENT_ADD_VER ( KID ,VER_ID,T_ID ,CONTENT ,UPDATETIME )
values(content_k.kid, doc_row.ver_id,content_k.t_id,content_k.content,content_k.updatetime);
end loop;
--- 拷贝附件表
for att_k in att_list loop
insert into KM_ATTACHMENT_LIST_VER (
KID ,VER_ID,ATTACHMENT_ID ,FILE_VER_ID ,ISDOWNLOAD,ISVIEW,
SORT_NUM,DL_COUNT ,VIEW_COUNT )
values (
att_k.kid,att_k.ver_id,att_k.attachment_id,att_k.file_ver_id,att_k.isdownload,att_k.isview,
att_k.sort_num,att_k.dl_count,att_k.view_count
);
end loop;
--- 删除正式 关联信息 (修改 drft into 正式 删除其他的附件信息)
delete from KM_DOC_NODE where kid = kid_v;
delete from KM_CONTENT_ADD where kid = kid_v;
delete from KM_ATTACHMENT_LIST where kid = kid_v;
--delete from KM_DOCUMENT where kid = kid_v;
end if;
---- 正式库 没有 复制 draft 到正式
select max(t.max_num) into ver_id_current from ( -- 获取三表中最大的版本号 +1 为最新的版本号
select max(a.ver_id) max_num from km_document a where a.kid = kid_v union all
select max(b.ver_id) max_num from km_document_draft b where b.kid = kid_v union all
select max(c.ver_id) max_num from km_document_ver c where c.kid = kid_v) t;
select * into draft_row from km_document_draft where kid = kid_v;
if(doc_num >0) then ver_id_current := ver_id_current+1;
end if;
if(doc_num >0) then ---正式表中有 进行更新 相关联的表太多
update km_document set
VER_ID = ver_id_current,TITLE = draft_row.title,CONTENT = draft_row.content ,ISADDITION = nvl( draft_row.isaddition,0),
STATUS = 1,BEGINTIME = draft_row.begintime,ENDTIME = draft_row.endtime ,GATHERERS = draft_row.gatherers,
GATHERTTIME = draft_row.gatherttime ,AUDITOR = draft_row.auditor ,AUDITTIME = draft_row.audittime,UPDATETIME = draft_row.updatetime ,
KEYWORDS = draft_row.keywords,SUMMARY = draft_row.summary,K_SOURCE = draft_row.k_source,
ISADDFILE = nvl(draft_row.isaddfile,0),KIND_ID = draft_row.kind_id
where kid = kid_v;
else
insert into km_document (
KID ,VER_ID,TITLE,CONTENT ,ISADDITION,STATUS,BEGINTIME,ENDTIME ,GATHERERS,GATHERTTIME ,AUDITOR ,
AUDITTIME,UPDATETIME ,KEYWORDS,SUMMARY,K_SOURCE,ISADDFILE,KIND_ID
)
values(
draft_row.kid,ver_id_current,draft_row.title,draft_row.content,nvl(draft_row.isaddition,0),1,draft_row.begintime,draft_row.endtime,
draft_row.gatherers,draft_row.gatherttime,draft_row.auditor,draft_row.audittime,draft_row.updatetime,draft_row.keywords,
draft_row.summary,draft_row.k_source,nvl(draft_row.isaddfile,0),draft_row.kind_id
) ;
-- 点击率统计 初始化
select count(1) into click_num from RP_DOC_CLICK_SUM where kid = kid_v;
if(click_num < 1) then
insert into RP_DOC_CLICK_SUM (kid,view_count,fav_count) values (kid_v,0,0);
end if;
end if ;
-- 复制node节点
for draft_node in draft_node_list loop
insert into KM_DOC_NODE ( KID ,TREE_ID ,NODE_ID ,VER_ID)
values(draft_node.kid,draft_node.tree_id,draft_node.node_id,ver_id_current);
end loop;
-- 复制 KM_CONTENT_ADD_DRAFT
for draft_content in draft_content_list loop
insert into KM_CONTENT_ADD (KID,T_ID ,CONTENT,UPDATETIME )
values (draft_content.kid,draft_content.t_id,draft_content.content,draft_content.updatetime);
end loop;
-- 复制 KM_KM_ATTACHMENT_LIST_DRAFT
for draft_att in draft_att_list loop
insert into KM_ATTACHMENT_LIST ( ATTACHMENT_ID ,KID ,FILE_VER_ID ,ISDOWNLOAD,ISVIEW,
SORT_NUM,DL_COUNT,VIEW_COUNT,VER_ID)
values (draft_att.attachment_id,draft_att.kid,draft_att.file_ver_id,draft_att.isdownload,draft_att.isview,
draft_att.sort_num,draft_att.dl_count,draft_att.view_count,ver_id_current);
end loop;
--- 复制完毕 删除 draft 以及相关联的表
delete from KM_DOCNODE_DRAFT where kid = kid_v;
delete from KM_CONTENT_ADD_DRAFT where kid = kid_v;
delete from KM_ATTACHMENT_LIST_DRAFT where kid = kid_v;
delete from KM_DOCUMENT_DRAFT where kid = kid_v;
end if ; --是最终的环节 进行发布操作 结束。。。。。。。。。。。
end if; -- 审核通过处理 结束。。。。。。。。。
if (mark_v=0) then -- 审核未通过 处理 开始。。。。
select min(b.link_id) into current_link from KM_DOCUMENT_DRAFT a , KM_PROCESS_LINK b
where a.p_id = b.pid and a.kid = kid_v;
-- 改变审核环节
update KM_DOCUMENT_DRAFT k set k.audit_link = current_link ,k.audit_sug = sug_v ,k.edit_status=4 where k.kid = kid_v;
end if; -- 审核未通过 处理 结束。。。。
commit;
/*
exception
when others then
dbms_output.put_line(': 异常了');
rollback;
*/
end;
**************************************************************************************************************************************
create or replace procedure UPDATE_NODE_TREE_MOVE_HASAU(v_treeId in integer,
v_sourceId in integer, v_targetId in integer, v_pId in integer,
v_moveType in varchar2, v_sameLevel in integer
) is
type cur_type is ref cursor;
sameLevel_cursor cur_type; --同级别的游标(存node_Id)
node_item km_tree_node%rowtype;
sortNum_s integer; -- 源的
sortNum_t integer; -- 目标
begin
if('inner'= v_moveType) then -- 变成子节点 ,source 父id 改为tagert的 node_id
select nvl(max(sort_num),0)+1 into sortNum_s from km_tree_node where parent_id = v_targetId ;
update km_tree_node t set t.parent_id = v_targetId ,t.sort_num = sortNum_s where t.node_id = v_sourceId ;
else
-- 同级别之间移动
if(v_sameLevel = 1) then
select sort_num into sortNum_s from km_tree_node where node_id = v_sourceId ;-- 源
select sort_num into sortNum_t from km_tree_node where node_id = v_targetId ;-- 目标
if('prev'= v_moveType) then --同级的节点移动 前面 目标节点 向下 移动 为源节点留出位置
-- 源节点 在下方 移动到 目标节点的前边
if(sortNum_s > sortNum_t) then
-- 源节点与 目标节点的之间的 节点 (包括目标 不包括源)
open sameLevel_cursor for select t.node_id ,t.sort_num from km_tree_node t where t.tree_id = v_treeId
and t.sort_num >=sortNum_t and t.sort_num < sortNum_s order by t.sort_num asc;
-- 再将所有的节点同时 向下 移动1格 sort_num +1
loop
fetch sameLevel_cursor into node_item.node_id,node_item.sort_num ;
EXIT WHEN sameLevel_cursor%notfound;
update km_tree_node set sort_num = sort_num+1 where node_id = node_item.node_id ;
end loop;
-- 将源节点 移到 目标节点 原先的 位置
update km_tree_node set sort_num = sortNum_t where node_id = v_sourceId;
end if;
-- 源节点 在上方 移动到 目标节点的后边
if(sortNum_s < sortNum_t) then
-- 源节点与 目标节点的之间的 节点 (包括目标 不包括源)
open sameLevel_cursor for select t.node_id ,t.sort_num from km_tree_node t where t.tree_id = v_treeId
and t.sort_num >sortNum_s and t.sort_num < sortNum_t ;
-- 再将所有的节点同时 向上 移动1格 sort_num -1
loop
fetch sameLevel_cursor into node_item.node_id,node_item.sort_num ;
EXIT WHEN sameLevel_cursor%notfound;
update km_tree_node set sort_num = sort_num-1 where node_id = node_item.node_id ;
end loop;
-- 将源节点 移到 目标节点 原先的 位置
update km_tree_node set sort_num = sortNum_t-1 where node_id = v_sourceId;
end if;
elsif('next'= v_moveType) then --同级的节点移动 后面 目标节点 不动
-- 源节点 在下方 移动到 目标节点的前边
if(sortNum_s > sortNum_t) then
-- 源节点与 目标节点的之间的 节点 (不包括边界)
open sameLevel_cursor for select t.node_id ,t.sort_num from km_tree_node t where t.tree_id = v_treeId
and t.sort_num >sortNum_t and t.sort_num < sortNum_s ;
-- 再将所有的节点同时 向下 移动1格 sort_num +1
loop
fetch sameLevel_cursor into node_item.node_id,node_item.sort_num ;
EXIT WHEN sameLevel_cursor%notfound;
update km_tree_node set sort_num = sort_num+1 where node_id = node_item.node_id ;
end loop;
-- 将源节点 移到 目标节点 位置下方 目标sort_num-1
update km_tree_node set sort_num = sortNum_t+1 where node_id = v_sourceId;
end if;
-- 源节点 在上方 移动到 目标节点的后边
if(sortNum_s < sortNum_t) then
-- 源节点与 目标节点的之间的 节点 不包括边界)
open sameLevel_cursor for select t.node_id ,t.sort_num from km_tree_node t where t.tree_id = v_treeId
and t.sort_num >sortNum_s and t.sort_num < sortNum_t ;
-- 再将所有的节点同时 向上 移动1格 sort_num -1
loop
fetch sameLevel_cursor into node_item.node_id,node_item.sort_num ;
EXIT WHEN sameLevel_cursor%notfound;
update km_tree_node set sort_num = sort_num-1 where node_id = node_item.node_id ;
end loop;
-- 将源节点 移到 目标节点 位置下方 目标sort_num-1
update km_tree_node set sort_num = sortNum_t+1 where node_id = v_sourceId;
end if;
end if;
-- 非同级别 移动 (前 后)
else
if('prev'= v_moveType) then
-- 目标的sortnum 为 源最终的sort num (目标与其他的节点下移1格)
select sort_num into sortNum_s from km_tree_node where node_id = v_targetId ;
---包括目标节点 都要下移1格
open sameLevel_cursor for select t.node_id from km_tree_node t where t.tree_id= v_treeId
and t.parent_id = v_pId and t.sort_num >= sortNum_s;
loop
fetch sameLevel_cursor into node_item.node_id ;
EXIT WHEN sameLevel_cursor%notfound;
update km_tree_node set sort_num = sort_num+1 where node_id = node_item.node_id;
end loop;
-- 源节点 放到 目标节点的位置(目标节点已经下移1格)
update km_tree_node set sort_num = sortNum_s , parent_id = v_pId where node_id =v_sourceId ;
end if;
if('next'= v_moveType) then
select sort_num into sortNum_s from km_tree_node where node_id = v_targetId ;
-- 不包括目标节点 下移1格
open sameLevel_cursor for select t.node_id from km_tree_node t where t.tree_id= v_treeId
and t.parent_id = v_pId and t.sort_num > sortNum_s;
loop
fetch sameLevel_cursor into node_item.node_id ;
EXIT WHEN sameLevel_cursor%notfound;
update km_tree_node set sort_num = sort_num+1 where node_id = node_item.node_id;
end loop;
-- +1 放在目标节点的下方
update km_tree_node set sort_num = sortNum_s+1 , parent_id = v_pId where node_id =v_sourceId ;
end if;
end if ;
end if;
commit;
end;
联系客服