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


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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多来哈米

还可以打赏???来试一毛

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值