名词解释
工作流超时计算涉及到使用工作流日历和非日历的情况,下面是相关名词
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)
推荐阅读