您的位置:首页 > 其它

周、月、季度、半年、年自动生成任务,存储过程

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: