周、月、季度、半年、年自动生成任务,存储过程
2015-02-06 14:24
405 查看
<span style="font-size:14px;">create or replace package body pg_task_generate as procedure p_biz_task_generate /****************************************************************** 功能说明:自动任务生成,定时扫描任务配置中任务计划,分周、月、季度、半年、年生成 ******************************************************************/ is begin declare --周任务配置 r_taskConfig_w biz_t_taskconfig%rowtype; --月任务配置 r_taskConfig_m biz_t_taskconfig%rowtype; --季度任务配置 r_taskConfig_q biz_t_taskconfig%rowtype; --半年任务配置 r_taskConfig_hy biz_t_taskconfig%rowtype; --年任务配置 r_taskConfig_y biz_t_taskconfig%rowtype; --异常错误 v_sqlcode number; v_sqlerr varchar2(4000); begin --周 for r_taskConfig_w in (select * from biz_t_taskconfig t where t.status='1' and t.checkcycle='1' and t.starttime < sysdate and (t.lasttime < trunc(trunc(next_day(sysdate-7,'星期一')),'dd') or t.lasttime is null)) loop pg_task_generate.p_biz_task(r_taskConfig_w.Taskconfigid); end loop; --月 for r_taskConfig_m in (select * from biz_t_taskconfig t where t.status='1' and t.checkcycle='2' and t.starttime < sysdate and (t.lasttime < trunc(sysdate,'mm') or t.lasttime is null)) loop pg_task_generate.p_biz_task(r_taskConfig_m.Taskconfigid); end loop; --季度 for r_taskConfig_q in (select * from biz_t_taskconfig t where t.status='1' and t.checkcycle='3' and (t.lasttime < trunc(sysdate,'q') or t.lasttime is null)) loop pg_task_generate.p_biz_task(r_taskConfig_q.taskConfigid); end loop; --半年 for r_taskConfig_hy in (select * from biz_t_taskconfig t where t.status='1' and t.checkcycle='4' and ( t.lasttime < ( case when to_number(to_char(sysdate, 'mm')) < 7 then --'前半年' trunc(sysdate,'yyyy') --ADD_MONTHS(trunc(sysdate,'yyyy'),6) else --'后半年' ADD_MONTHS(trunc(sysdate,'yyyy'),6) --ADD_MONTHS(trunc(sysdate,'yyyy'),12) end) or t.lasttime is null )) loop pg_task_generate.p_biz_task(r_taskConfig_hy.taskConfigid); end loop; --年 for r_taskConfig_y in (select * from biz_t_taskconfig t where t.status = '1' and t.checkcycle = '5' and t.starttime < sysdate and (t.lasttime < trunc(sysdate, 'YYYY') or t.lasttime is null)) loop pg_task_generate.p_biz_task(r_taskConfig_y.Taskconfigid); end loop; commit; EXCEPTION when others then rollback; dbms_output.put_line(Sqlcode || '---' || SQLERRM); v_sqlcode := sqlcode; v_sqlerr := sqlerrm; insert into log_t_taskgenerateerror (id, sqlcode, sqlerror, generatetime) values (sys_guid(), v_sqlcode, v_sqlerr, sysdate); commit; end; end p_biz_task_generate; Procedure p_biz_task(configId varchar2) /****************************************************************** 功能说明:根据任务配置生成任务 ******************************************************************/ is begin declare --配置类型 v_checkcycle varchar2(50); --任务Id v_taskid varchar2(32); --任务编号 v_taskNum varchar2(16); --任务开始时间 v_taskStartTime date; --任务结束时间 v_taskEndTime date; r_taskConfig biz_t_taskConfig%rowtype; Begin select t.* into r_taskConfig from biz_t_taskConfig t where t.taskconfigid = configId; v_checkcycle := r_taskConfig.checkcycle; --生成任务编号 select to_char(to_number(nvl(max(taskNum), to_char(sysdate, 'yyyymmdd') || '000000')) + 1) into v_taskNum from biz_t_task t where t.tasknum like to_char(sysdate, 'yyyymmdd') || '%'; --任务时间期限 if v_checkcycle = '1' then v_taskStartTime := trunc(next_day(sysdate-7,'星期一'),'dd'); v_taskEndTime := trunc(next_day(sysdate,'星期一'),'dd') -1/86400; --dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'--|周|任务'); elsif v_checkcycle='2' then v_taskStartTime := trunc(sysdate, 'mm'); v_taskEndTime := add_months(trunc(sysdate, 'mm'), 1) - 1 / 86400; --dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'--|月|任务'); elsif v_checkcycle = '3' then v_taskStartTime := trunc(sysdate, 'Q'); v_taskEndTime := add_months(trunc(sysdate, 'Q'), 3) - 1 / 86400; --dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'--|季|度任务'); elsif v_checkcycle = '4' then --'前半年' if to_number(to_char(sysdate, 'mm')) < 7 then v_taskStartTime := trunc(sysdate,'yyyy'); v_taskEndTime := ADD_MONTHS(trunc(sysdate,'yyyy'),6) - 1/86400; --'后半年' else v_taskStartTime := ADD_MONTHS(trunc(sysdate,'yyyy'),6); v_taskEndTime := ADD_MONTHS(trunc(sysdate,'yyyy'),12) - 1/86400; end if; --dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'--|半年|度任务'); elsif v_checkcycle = '5' then v_taskStartTime := trunc(sysdate, 'YYYY'); v_taskEndTime := add_months(trunc(sysdate, 'YYYY'), 12) - 1 / 86400; --dbms_output.put_line(to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')||'--|年|度任务'); end if; v_taskid := sys_guid(); --生成任务,指派机构为创建配置计划的人机构 insert into biz_t_task (taskid, taskProType, ptaskid, tasknum, tasktype, tasktitle, taskcontent, starttime, endtime, dispatchorgcode, dispatchorgname, templateid, status, generatetype, generatetime, taskcheckstatus, versiontime, isownerexec, taskstatus, taskstatusname, urgencycode, urgencyname, taskSourceName, taskSourceCode, taskObjectType, createrId, createrName, createTime) values (v_taskid, '1', '', v_taskNum, '1', r_taskConfig.Title, r_taskConfig.Checkdesc, v_taskStartTime, v_taskEndTime, r_taskConfig.Createrorgcode, r_taskConfig.Createrorgname, r_taskConfig.Templateid, '1', '1', sysdate, '0', sysdate, '1', '3', '待处理', '1000', '一般', '周期任务', '1007', '1', 'admin', '系统管理员', sysdate); pg_task_generate.p_biz_task_object(configId, v_taskid); --更新日常配置-生成任务时间 update biz_t_taskconfig t set t.lasttime = sysdate where t.taskconfigid = configId; end; End p_biz_task; Procedure p_biz_task_object(configId varchar2, taskId varchar2) /****************************************************************** 功能说明:任务对象生成 ******************************************************************/ is begin declare r_configObject biz_t_taskconfigobject%rowtype; --机构Id v_monitorOrgCode varchar2(50); --机构名 v_monitorOrgName varchar2(100); --指派人 v_dispatchManId varchar2(50); --指派人姓名 v_dispatchManName varchar2(50); v_templateId varchar2(32); v_taskObjectid varchar2(32); v_netGridCode varchar2(16); v_netGridName varchar2(50); v_contactman varchar2(50); v_contacttel varchar2(50); Begin for r_configObject in (select * from biz_t_taskconfigobject t where t.taskconfigid = configId) loop select g.netgridcode, g.netgridname, g.dutyunitcode, g.dutyunit, g.griddutymanid, g.griddutyman, p.contactman, p.contacttel into v_netGridCode, v_netGridName, v_monitorOrgCode, v_monitorOrgName, v_dispatchManId, v_dispatchManName, v_contactman, v_contacttel from bc_t_netGrid g, bc_t_netGridObject o, bc_t_polluteorg p where g.netgridcode = o.netgridcode and o.objectid = p.pollutecompanyid and g.status = '1' and rownum = 1 and o.objectid = r_configObject.Objectid; v_taskObjectid := sys_guid(); --生成任务对象 insert into biz_t_taskobjectmonitor (taskobjectid, taskid, polluteobjectid, objectname, address, monitortypename, monitortypecode, pollutetype, pollutetypecode, monitororgcode, monitororgname, dispatchmanid, dispatchmanname, versiontime, netgridcode, netgridname, objectPrincipal, principalTel, taskStatus ) values (v_taskObjectid, taskId, r_configObject.objectid, r_configObject.Objectname, r_configObject.Address, r_configObject.Monitortypename, r_configObject.Monitortypecode, r_configObject.Pollutetype, r_configObject.Pollutetypecode, v_monitorOrgCode, v_monitorOrgName, v_dispatchManId, v_dispatchManName, sysdate, v_netGridCode, v_netGridName, v_contactman, v_contacttel, '0'); select t.templateid into v_templateId from biz_t_taskconfig t where rownum = 1 and t.status = '1' and t.taskconfigid = configId; pg_task_generate.p_biz_object_check_Item(v_templateId, v_taskObjectid, r_configObject.objectid, taskId); pg_task_generate.p_biz_object_ElecMark(v_taskObjectid, r_configObject.objectid); end loop; end; End p_biz_task_object; Procedure p_biz_object_check_Item(templateId varchar2, taskObjectid varchar2, objectid varchar2, taskId varchar2) /****************************************************************** 功能说明:任务对象检查项生成 ******************************************************************/ is begin declare r_templateItemRelation bc_t_templateItemRelation%rowtype; r_pollOrgMonitorPoint bc_t_pollOrgMonitorPoint%rowtype; --检查项Id v_checkItemId varchar2(50); --检查项监控点类型 v_monitorTypeCode varchar2(50); v_monitorTypeName varchar2(50); v_checkItemName varchar2(100); v_itemTypeCode varchar2(50); v_itemTypeName varchar2(50); v_isMustCheck varchar2(2); v_isPhoto varchar2(2); v_isCamera varchar2(2); v_isSampling varchar2(2); v_isSignIn varchar2(2); v_monitorPointId varchar2(50); v_monitorPointName varchar2(50); v_ordernumber number(3); v_optionTypecode varchar2(100); v_valuetype varchar2(2); v_checkvalue varchar2(4000); v_checkvaluestatus varchar2(2); v_checkremark varchar2(4000); --v_taskId varchar2(32); Begin for r_templateItemRelation in (select * from bc_t_templateItemRelation t where t.checktemplateid = templateId) loop v_checkItemId := r_templateItemRelation.Checkitemid; v_ordernumber := r_templateItemRelation.Ordernumber; select t.checkitemid, t.checkitemname, t.itemtypecode, t.itemtypename, t.monitortypecode, t.monitortypename, t.ismustcheck, t.isphoto, t.iscamera, t.issampling, t.issignin, optionTypecode into v_checkItemId, v_checkItemName, v_itemTypeCode, v_itemTypeName, v_monitorTypeCode, v_monitorTypeName, v_isMustCheck, v_isPhoto, v_isCamera, v_isSampling, v_isSignIn, v_optionTypecode from bc_t_checkitem t where t.status = '1' and t.checkitemid = v_checkItemId; if v_monitorTypeCode is null then /*******查询上一次检查结果记录 非必检查项才需要**********/ if v_isMustCheck = '0' then if f_getLastCheckItemStatus(v_checkItemId, objectid) = 'Y' then select valuetype, checkvalue, checkvaluestatus, checkremark into v_valuetype, v_checkvalue, v_checkvaluestatus, v_checkremark from (select * from (select tm.monitortime, td.checkdetailid, td.taskobjectid, td.valuetype, td.checkvalue, td.checkremark, td.checkvaluestatus from biz_t_taskObjectMonitor tm, biz_t_taskCheckDetail td where tm.taskobjectid = td.taskobjectid and tm.taskstatus = 1 and td.checkitemid = v_checkItemId and tm.polluteObjectId = objectid order by tm.monitortime desc) where rownum = 1); else v_valuetype := ''; v_checkvalue := ''; v_checkvaluestatus := ''; v_checkremark := ''; end if; else v_valuetype := ''; v_checkvalue := ''; v_checkvaluestatus := ''; v_checkremark := ''; end if; insert into biz_t_taskcheckdetail (checkDetailId, taskobjectid, taskid, checkitemid, checkitemname, itemtypecode, itemtypename, ismustcheck, isphoto, iscamera, issampling, issignin, ordernumber, optionTypecode, valuetype, checkvalue, checkremark, checkvaluestatus) values (sys_guid(), taskObjectid, taskId, v_checkItemId, v_checkItemName, v_itemTypeCode, v_itemTypeName, v_isMustCheck, v_isPhoto, v_isCamera, v_isSampling, v_isSignIn, v_ordernumber, v_optionTypecode, v_valuetype, v_checkvalue, v_checkremark, v_checkvaluestatus); else for r_pollOrgMonitorPoint in (select * from bc_t_pollOrgMonitorPoint t where t.polluteCompanyId = objectId and t.pointtypecode = v_monitorTypeCode) loop v_monitorPointId := r_pollOrgMonitorPoint.Monitorpointid; v_monitorPointName := r_pollOrgMonitorPoint.Monitorpointname; /*******查询上一次检查结果记录 非必检查项才需要**********/ if v_isMustCheck = '0' then if f_getLastCheckItemStatus2(v_checkItemId, objectid,v_monitorPointId) = 'Y' then select valuetype, checkvalue, checkvaluestatus, checkremark into v_valuetype, v_checkvalue, v_checkvaluestatus, v_checkremark from (select * from (select tm.monitortime, td.checkdetailid, td.taskobjectid, td.valuetype, td.checkvalue, td.checkremark, td.checkvaluestatus from biz_t_taskObjectMonitor tm, biz_t_taskCheckDetail td where tm.taskobjectid = td.taskobjectid and tm.taskstatus = 1 and td.checkitemid = v_checkItemId and tm.polluteObjectId = objectid and td.monitorpointid = v_monitorPointId order by tm.monitortime desc) where rownum = 1); else v_valuetype := ''; v_checkvalue := ''; v_checkvaluestatus := ''; v_checkremark := ''; end if; else v_valuetype := ''; v_checkvalue := ''; v_checkvaluestatus := ''; v_checkremark := ''; end if; insert into biz_t_taskcheckdetail (checkDetailId, taskobjectid, taskid, checkitemid, checkitemname, itemtypecode, itemtypename, monitorTypeCode, monitorTypeName, ismustcheck, isphoto, iscamera, issampling, issignin, monitorPointId, monitorPointName, ordernumber, optionTypecode, valuetype, checkvalue, checkremark, checkvaluestatus) values (sys_guid(), taskObjectid, taskId, v_checkItemId, v_checkItemName, v_itemTypeCode, v_itemTypeName, v_monitorTypeCode, v_monitorTypeName, v_isMustCheck, v_isPhoto, v_isCamera, v_isSampling, v_isSignIn, v_monitorPointId, v_monitorPointName, v_ordernumber, v_optionTypecode, v_valuetype, v_checkvalue, v_checkremark, v_checkvaluestatus); end loop; end if; --dbms_output.put_line(r_templateItemRelation.Checkitemid); end loop; end; End p_biz_object_check_Item; procedure p_biz_object_ElecMark(taskObjectid varchar2, objectid varchar2) /****************************************************************** 功能说明:任务对象电子标签生成 ******************************************************************/ is begin declare r_pollorgmonitorpointmark bc_t_pollorgmonitorpointmark%rowtype; Begin for r_pollorgmonitorpointmark in (select m.* from bc_t_pollorgmonitorpointmark m where m.status = '1' and m.pollutecompanyid = objectid) loop insert into biz_t_objectelecmark (id, taskobjectid, cardcode, rfid, monitorpointid,polluteCompanyId) values (sys_guid(), taskObjectid, r_pollorgmonitorpointmark.cardcode, r_pollorgmonitorpointmark.rfid, r_pollorgmonitorpointmark.monitorpointid, objectid ); end loop; end; End p_biz_object_ElecMark; /******* 查询 v_checkItemId objectid 为条件的记录是否存在 ****/ function f_getLastCheckItemStatus(v_checkItemId varchar2, objectid varchar2) return char is v_c Number := 0; begin select count(1) into v_c from biz_t_taskObjectMonitor tm, biz_t_taskCheckDetail td where tm.taskobjectid = td.taskobjectid and tm.taskstatus = 1 and td.checkitemid = v_checkItemId and tm.polluteObjectId = objectid; if v_c > 0 then return 'Y'; else return 'N'; end if; end f_getLastCheckItemStatus; /******* 查询 v_checkItemId objectid v_monitorPointId 为条件的记录是否存在 ****/ function f_getLastCheckItemStatus2(v_checkItemId varchar2, objectid varchar2,v_monitorPointId varchar2) return char is v_c Number := 0; begin select count(1) into v_c from biz_t_taskObjectMonitor tm, biz_t_taskCheckDetail td where tm.taskobjectid = td.taskobjectid and tm.taskstatus = 1 and td.checkitemid = v_checkItemId and td.monitorpointid = v_monitorPointId and tm.polluteObjectId = objectid; if v_c > 0 then return 'Y'; else return 'N'; end if; end f_getLastCheckItemStatus2; end pg_task_generate; </span>
相关文章推荐
- Linq调用存储过程自动生成Int结果集的解决方法
- 自动生成人才编号的存储过程
- 一个自动生成预制SQL 的存储过程(一)
- 通过存储过程自动生成AWR报告
- 转: 用 System.Reflection.Emit 来自动生成调用存储过程的实现(接自别人的成果)
- Sql Server - SQL分页存储过程自动生成
- 自动生成INSERT语句的SQL存储过程
- 根据表或者视图自动生成分页语句的存储过程,适用于Sql Server 2005及以上版本
- 自动生成订单编号存储过程
- 自动生成INSERT语句的SQL存储过程
- 自动生成对表进行插入和更新的存储过程的存储过程
- .NET 项目开发工具:自动生成分页存储过程
- 存储过程的作用是自动生成编号
- 自动生成对表进行插入和更新的存储过程的存储过程
- SQL过程自动C#封装,支持从表到基本存储过程生成,
- 关于codesmith的一点使用--自动生成数据库中所有表的存储过程使用模板
- 存储过程自动生成软件
- Linq调用存储过程自动生成Int结果集的解决方法
- 根据表名,自动生成增、删、改参数化存储过程和调用代码
- 给你的表自动生成CRUD存储过程