1 /* 2 办件流转 3 */ 4 procedure P_DoFileFlow(varError out varchar2, 5 varWaitID in varchar2, 6 varFlowID in varchar2, 7 varUserID in varchar2, 8 varDepID in varchar2, 9 varModifytime in varchar2) as 10 11 varPackagename varchar2(50); 12 varFunctionname varchar2(50); 13 varFunctionParam varchar2(200); 14 numDataCount number(12); 15 16 varStepID varchar2(20); 17 varTargetStepID varchar2(20); 18 varFileID varchar2(20); 19 numControlID number(12); 20 varUserRealname oa_user.user_realname%type; 21 varUserName oa_user.user_name%type; 22 varDepName oa_department.dep_name%type; 23 varIslast ly_f_flowinfo.islast%type; 24 varFlowName ly_f_flowinfo.flowname%type; 25 26 varAdviseID oa_advise.advise_id%type; 27 varDestId ly_f_flowinfo.dest_content%type; 28 varDestType ly_f_flowinfo.dest_type%type; 29 varOpinion oa_wait.opinion%type; 30 31 varFileTitle ly_s_docbase.file_title%type; 32 varSql varchar2(2000); 33 varAbbSql varchar2(2000); 34 begin 35 select count(1) 36 into numDataCount 37 from oa_wait 38 where wait_id = varWaitID; 39 40 if numDataCount = 0 then 41 raise_application_error('-20001', '该办件不存在或已被转至其他步骤'); 42 end if; 43 44 select file_id, file_title 45 into varFileID, varFileTitle 46 from oa_wait 47 where wait_id = varWaitID; 48 49 select count(1) 50 into numDataCount 51 from ly_s_docbase t 52 where file_id = varFileID 53 and t.modifytime = varModifytime; 54 55 if numDataCount = 0 then 56 raise_application_error('-20001', pk_systemoperation.ConModify); 57 end if; 58 59 /*本流是否需要写意见,1为写意见*/ 60 select count(1) 61 into numDataCount 62 from ly_f_flowinfo t 63 where flowid = varFlowID 64 and t.opinion = '1'; 65 select opinion into varOpinion from oa_wait where wait_id = varWaitID; 66 /*需要写意见*/ 67 if numDataCount > 0 then 68 69 if varOpinion is null then 70 varError := '请填写转件意见'; 71 return; 72 end if; 73 end if; 74 75 select f.stepid, f.tarstepid, f.control_id, f.islast 76 into varStepID, varTargetStepID, numControlID, varIslast 77 from ly_f_flowinfo f 78 where flowid = varFlowID; 79 80 select user_name, user_realname 81 into varUserName, varUserRealname 82 from oa_user 83 where user_id = varUserID; 84 85 select dep_name 86 into varDepName 87 from oa_department 88 where dep_id = varDepID; 89 90 for cc in (select * 91 from LY_F_FLOWINFO_todolist 92 where flowid = varFlowID 93 and VALID_FLAG = 0 94 order by orderno) loop 95 begin 96 select upper(substr(cc.todo, 1, instr(cc.todo, '.') - 1)), 97 upper(substr(cc.todo, 98 instr(cc.todo, '.') + 1, 99 length(cc.todo))) 100 into varPackagename, varFunctionname 101 from dual; 102 103 select count(*) 104 into numDataCount 105 from ALL_PROCEDURES 106 where procedure_name = upper(varFunctionname) 107 and object_name = upper(varPackagename); 108 if numDataCount = 0 then 109 raise_application_error('-20001', '不存在函数' || cc.todo); 110 end if; 111 112 varFunctionParam := cc.todoparameter; 113 114 varFunctionParam := replace(varFunctionParam, 115 'varSTEP_ID', 116 varStepID); 117 varFunctionParam := replace(varFunctionParam, 118 'varDESTSTEP_ID', 119 varTargetStepID); 120 varFunctionParam := replace(varFunctionParam, 121 'varCONTROL_ID', 122 numControlID); 123 varFunctionParam := replace(varFunctionParam, 124 'varFILE_ID', 125 varFileID); 126 varFunctionParam := replace(varFunctionParam, 127 'varWAIT_ID', 128 varWaitID); 129 varFunctionParam := replace(varFunctionParam, 130 'varUSER_NAME', 131 '''' || varUserName || ''''); 132 varFunctionParam := replace(varFunctionParam, 133 'varUSER_REALNAME', 134 '''' || varUserRealname || ''''); 135 varFunctionParam := replace(varFunctionParam, 136 'varUSER_ID', 137 varUserID); 138 varFunctionParam := replace(varFunctionParam, 'varDEP_ID', varDepID); 139 varFunctionParam := replace(varFunctionParam, 140 'varDEP_NAME', 141 '''' || varDepName || ''''); 142 143 varSql := 'declare varError varchar2(2000); begin varError:=' || 144 cc.todo || '(' || varFunctionParam || '); 145 if varError is not null then raise_application_error(''-20001'',varError) ; end if; 146 end;'; 147 execute immediate varSql; 148 149 exception 150 when others then 151 varError := sqlerrm; 152 raise_application_error('-20001', varError); 153 end; 154 155 end loop; 156 157 select f.dest_content, 158 f.dest_type, 159 f.flowname, 160 SEQ_MAXID_OA_ADVISE.Nextval 161 into varDestId, varDestType, varFlowName, varAdviseID 162 from ly_f_flowinfo f 163 where flowid = varFlowID; 164 165 if varIslast = '0' then 166 /*已经是最后一步啦,删件、更新走人;*/ 167 update ly_s_docbase set is_flow = '0' where file_id = varFileID; 168 else 169 /* 170 Dest_Type 171 1人员 部门 角色 列信息 拟稿部门 上一步操作者 177 人员代词 178 部门代词 179 本部门 180 上级部门 181 abb中用100之后的代词 182 */ 183 if varDestType = '5' then 184 select dep_id 185 into varDestId 186 from ly_s_docbase 187 where file_id = varFileID; 188 varDestType := 2; 189 end if; 190 191 if varDestType = '6' then 192 select w.source_id 193 into varDestId 194 from oa_wait w 195 where wait_id = varWaitID; 196 varDestType := 2; 197 end if; 198 199 if varDestType in ('1', '3', '7') then 200 raise_application_error('-20001', 201 '人员、角色、人员代词已停用,请联系管理员修改流程'); 202 end if; 203 204 if varDestType = '8' then 205 select ABB_CONTENT 206 into varAbbSql 207 from oa_abbreviate abb 208 where abb.abb_id = varDestId; 209 210 execute immediate varAbbSql 211 into varDestId 212 using varFileID; 213 varDestType := 2; 214 215 end if; 216 217 --本部门 218 if varDestType = '9' then 219 varDestType := 2; 220 varDestId := varDepID; 221 end if; 222 --上级部门 223 if varDestType = '10' then 224 varDestType := 2; 225 select father_id 226 into varDestId 227 from oa_department 228 where dep_id = varDepID; 229 end if; 230 231 insert into oa_wait 232 (wait_id, 233 control_id, 234 step_id, 235 file_id, 236 file_title, 237 wait_date, 238 dest_id, 239 dest_type, 240 source_id, 241 advise_id, 242 flowid, 243 DB_NAME) 244 values 245 (SEQ_MAXID_OA_WAIT.nextval, 246 numControlID, 247 varTargetStepID, 248 varFileID, 249 varFileTitle, 250 to_char(sysdate, 'yyyy-mm-dd hh24:mi;ss'), 251 varDestId, 252 varDestType, 253 varDepID, 254 varAdviseID, 255 varFlowID, 256 (select controlname 257 from ly_f_controlflow 258 where control_id = numControlID)); 259 260 end if; 261 262 insert into oa_advise 263 (advise_id, 264 control_id, 265 file_id, 266 advise, 267 user_name, 268 user_id, 269 dep_id, 270 dep_name, 271 ad_date, 272 tarcontestname, 273 targetstep, 274 doflow, 275 sourcestep, 276 flowid, 277 userrealname, 278 tarcontestid) 279 values 280 (varAdviseID, 281 numControlID, 282 varFileID, 283 varOpinion, 284 varUserName, 285 varUserID, 286 varDepID, 287 varDepName, 288 to_char(sysdate, 'yyyy-mm-dd hh24:mi;ss'), 289 (select dep_name from oa_department where dep_id = varDestId), 290 varTargetStepID, 291 varFlowName, 292 varStepID, 293 varFlowID, 294 varUserRealname, 295 varDestId); 296 297 delete from oa_wait where wait_id = varWaitID; 298 299 commit; 300 exception 301 when others then 302 rollback; 303 varError := sqlerrm; 304 end P_DoFileFlow;