工作流--超时计算介绍原创
金蝶云社区-eris
eris
5人赞赏了该文章 760次浏览 未经作者许可,禁止转载编辑于2022年12月06日 11:30:49

名词解释

工作流超时计算涉及到使用工作流日历和非日历的情况,下面是相关名词

1、任务限期:等于任务产生时间,取任务详情表T_WF_APPROVALASSIGN(FDEALTIME)

2、是否启用超时:审批动作高级选项设置中的超时设置,取任务详情表T_WF_APPROVALASSIGN(FTimeoutDeal),1代表启用,其他代表未启用

3、超时小时值:审批动作高级选项设置的超时小时值,任务详情表T_WF_APPROVALASSIGN(FDEALDATEHOURS

4、超时分钟值:审批动作高级选项设置的超时分钟值,任务详情表T_WF_APPROVALASSIGN(FTimeoutMinute

5、流程实例状态:取流程实例表T_WF_PROCINST(FSTATUS),并且需要满足状态为准备和挂起(既0和2)

6、任务状态:取流程任务表T_WF_ASSIGN(FStatus),并且需要满足状态为分配(既状态值为0)

7、任务当天剩余工时:任务产生的当天剩余工作小时数,任务详情表T_WF_APPROVALASSIGN(FDEALDATEHOURS  

8、当前天已耗工时:计算超时的当前天,根据工作流日历算出来的已耗工时小时数,取自工作流日历主表T_WF_CALENDAR(FTEMPCOSTHOURS

9、任务当天的日历工时:任务产生的当天根据工作流日历得到的工作时间数,取自工作流日历分表T_WF_CALENDARDATA(FWORKHOURS

10、任务后当前天前已耗工时:计算任务产生后一天起到当前天前一天的所有工作日的工作时总值,取自工作流日历分表T_WF_CALENDARDATA(FWORKHOURS)

11、工作流日历工时:当前天已耗工时+任务后当前天前已耗工时

计算公式和脚本

1、不使用日历的超时条件计算公式和脚本

公式为:

流程实例状态为准备或挂起 + 任务状态为分配 + (没有关联日历或日历已禁用)+

时间条件(当前时间 - 任务限期 > (1.0*超时小时值/24 + 1.0*超时小时值 /60/24))

脚本为:

SELECT T.FAPPROVALASSIGNID FROM T_WF_APPROVALASSIGN T
            INNER JOIN T_WF_ASSIGN B ON B.FASSIGNID = T.FASSIGNID  
            WHERE B.FStatus='0' AND T.FTimeoutDeal = '1' 
            AND GETDATE() - T.FDEALTIME  > (1.0*T.FTimeoutHours/24 + 1.0*T.FTimeoutMinute/60/24) 
            AND EXISTS(SELECT 1 FROM T_WF_PROCINST C WHERE B.FPROCINSTID = C.FPROCINSTID AND C.FSTATUS IN('0', '2'))
             and (T.FCALENDARID <= 0 or Exists(select 1 from T_WF_CALENDAR tc where tc.FID= T.FCALENDARID and tc.FFORBIDSTATUS='B'))

2、使用日的历超时条件计算公式和脚本

公式为:

流程实例状态为准备或挂起 + 任务状态为分配 + (没有关联日历或日历已禁用)+

时间条件(任务当天剩余工时 +工作流日历工时 > (超时小时值/+ 1.0*超时小时值 /60))

 如果任务产生时的当天和计算超时的当天是同一天,则还需要减去当天的日历工时

具体分解为 = 任务当天剩余工时 + 当前天已耗工时+任务后当前天前已耗工时 - 任务产生和计算超时为同一天的日历工时

脚本为:

SELECT T.FAPPROVALASSIGNID FROM T_WF_APPROVALASSIGN T
            INNER JOIN T_WF_ASSIGN B ON B.FASSIGNID = T.FASSIGNID 
            WHERE B.FStatus='0' AND T.FTimeoutDeal = '1' AND (T.FCALENDARID > 0 and 
            Exists(select 1 from T_WF_CALENDAR tc where tc.FID= T.FCALENDARID and tc.FFORBIDSTATUS='A'))
                AND EXISTS(SELECT 1 FROM T_WF_PROCINST C WHERE B.FPROCINSTID = C.FPROCINSTID AND C.FSTATUS IN('0', '2'))
                AND (
                      ISNULL(FDEALDATEHOURS,0) --任务剩余工时
                    ---工作流日历工时
                   + (SELECT ISNULL(SUM(FTEMPCOSTHOURS),0) FROM T_WF_CALENDAR  
                            WHERE FFORBIDSTATUS='A' AND FID = T.FCALENDARID)
                  + (SELECT ISNULL(SUM(t0.FWORKHOURS),0) FROM T_WF_CALENDARDATA t0
                       WHERE t0.FID = T.FCALENDARID AND t0.FISWORKTIME = '1' 
                       AND t0.FDAY > FDEALTIME AND t0.FDAY <= @NowDate3 - 1)
                    --- 任务当天的日历工时
                   - ( CASE WHEN DAYS_BETWEEN(FDEALTIME,@NowDate1) <= 0
                    THEN (SELECT ISNULL(SUM(t0.FWORKHOURS),0) FROM T_WF_CALENDARDATA t0
                         WHERE t0.FID = T.FCALENDARID AND t0.FISWORKTIME = '1' 
                         AND DAYS_BETWEEN(t0.FDAY,@NowDate2) = 0)
                    ELSE 0
                    END) )*1.0 > (1.0*T.FTimeoutHours + 1.0*T.FTimeoutMinute/60)







赞 5