$PBExportHeader$uo_bgtr_timer.sru forward global type uo_bgtr_timer from nonvisualobject end type end forward global type uo_bgtr_timer from nonvisualobject end type global uo_bgtr_timer uo_bgtr_timer type variables long ID string name long TimerType string TimerParm long TaskType string TaskParm DateTime NextExecTime DateTime LastExecTime long IsRunning string opemp DateTime opdate string modemp DateTime moddate string c_emp DateTime c_date end variables forward prototypes public function integer uf_save (ref string arg_msg) public function integer uf_getinfo (long arg_id, ref string arg_msg) public function integer uf_del (long arg_id, ref string arg_msg) public function integer uf_reallocqty_for_order_by_mtrlid (long arg_mtrlid, long arg_fpgrade, ref string arg_msg) public function integer uf_update_saleoutcodestr (long arg_scid, long arg_taskid, long arg_printid, ref string arg_msg) public function integer uf_trigger_timer (long arg_id, ref string arg_msg) end prototypes public function integer uf_save (ref string arg_msg);Int rslt = 1 Long ll_newid IF ID = 0 THEN ll_newid = f_sys_scidentity(0,"bgtr_timer","ID", Ref arg_msg,True,id_sqlca) IF ll_newid <= 0 THEN rslt = 0 GOTO ext END IF INSERT INTO bgtr_timer (ID, name, TimerType, TimerParm, TaskType, TaskParm, NextExecTime, IsRunning, opemp, opdate) Values (:ll_newid,:Name,:TimerType,:TimerParm,:TaskType,:TaskParm,:NextExecTime,:IsRunning,:publ_operator, GETDATE()) ; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '插入任务失败,' + sqlca.SQLErrText GOTO ext END IF ID = ll_newid ELSE UPDATE bgtr_timer SET name = :Name, TimerType = :TimerType, TimerParm = :TimerParm, TaskType = :TaskType, TaskParm = :TaskParm, NextExecTime = :NextExecTime, IsRunning = :IsRunning, modemp = :publ_operator, moddate = GETDATE() Where (ID = :ID); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '更新任务失败,' + sqlca.SQLErrText GOTO ext END IF END IF ext: IF rslt = 0 THEN ROLLBACK; ELSE COMMIT; END IF RETURN rslt end function public function integer uf_getinfo (long arg_id, ref string arg_msg);Int rslt = 1 IF arg_id <= 0 THEN rslt = 0 arg_msg = '无效任务ID' GOTO ext END IF Long ll_cnt SELECT COUNT(0) Into :ll_cnt From bgtr_timer Where ID = :arg_id; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '数据库连接失败,' + sqlca.SQLErrText GOTO ext END IF IF ll_cnt = 0 THEN rslt = 0 arg_msg = '任务不存在' GOTO ext END IF SELECT Name, TimerType, TimerParm, TaskType, TaskParm, NextExecTime, IsRunning, LastExecTime, opemp, opdate, modemp, moddate, c_emp, c_date Into :Name, :TimerType, :TimerParm, :TaskType, :TaskParm, :NextExecTime, :IsRunning, :LastExecTime, :opemp, :opdate, :modemp, :moddate, :c_emp, :c_date From bgtr_timer Where (ID = :arg_id); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询任务信息失败,' + sqlca.SQLErrText GOTO ext END IF ID = arg_id ext: RETURN rslt end function public function integer uf_del (long arg_id, ref string arg_msg);Int rslt = 1 IF arg_id <= 0 THEN rslt = 0 arg_msg = '非法任务ID' GOTO ext END IF Long ll_cnt SELECT count(0) Into :ll_cnt From bgtr_timer Where id = :arg_id; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '数据库连接失败,' + sqlca.SQLErrText GOTO ext END IF IF ll_cnt = 0 THEN rslt = 0 arg_msg = '任务已经被删除,请刷新后再试' GOTO ext END IF DELETE From bgtr_timer Where id = :arg_id; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '删除任务失败,' + sqlca.SQLErrText GOTO ext END IF IF sqlca.SQLNRows = 0 THEN rslt = 0 arg_msg = '任务已经被删除,请刷新后再试' GOTO ext END IF ext: IF rslt = 1 THEN COMMIT; ELSE ROLLBACK; END IF RETURN rslt end function public function integer uf_reallocqty_for_order_by_mtrlid (long arg_mtrlid, long arg_fpgrade, ref string arg_msg);Int rslt = 1 Long ll_cnt ID = 0 Name = '自动生成' TimerType = 1 TimerParm = '' TaskType = 24 TaskParm = 'mtrlid=' + String(arg_mtrlid) + ';fpgrade=' + String(arg_fpgrade) SELECT top 1 GETDATE() INTO :NextExecTime From u_user; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '获取系统时间失败,' + sqlca.SQLErrText GOTO ext END IF IsRunning = 1 SELECT COUNT(0) INTO :ll_cnt FROM bgtr_timer WHERE TimerType = :TimerType AND TimerParm = :TimerParm AND TaskType = :TaskType AND TaskParm = :TaskParm AND Name = :Name AND IsRunning = :IsRunning And NextExecTime <= :NextExecTime; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询未执行的相同任务失败,' + sqlca.SQLErrText GOTO ext END IF IF ll_cnt > 0 THEN // 不添加重复任务 GOTO ext END IF IF uf_save(Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF ext: RETURN rslt end function public function integer uf_update_saleoutcodestr (long arg_scid, long arg_taskid, long arg_printid, ref string arg_msg);Int rslt = 1 Long ll_cnt ID = 0 Name = '自动生成' TimerType = 1 TimerParm = '' TaskType = 34 TaskParm = 'scid=' + String(arg_scid) + ';taskid=' + String(arg_taskid) + ';printid=' + string(arg_printid) SELECT top 1 GETDATE() INTO :NextExecTime From u_user; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '获取系统时间失败,' + sqlca.SQLErrText GOTO ext END IF IsRunning = 1 SELECT COUNT(0) INTO :ll_cnt FROM bgtr_timer WHERE TimerType = :TimerType AND TimerParm = :TimerParm AND TaskType = :TaskType AND TaskParm = :TaskParm AND Name = :Name AND IsRunning = :IsRunning And NextExecTime <= :NextExecTime; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询未执行的相同任务失败,' + sqlca.SQLErrText GOTO ext END IF IF ll_cnt > 0 THEN // 不添加重复任务 GOTO ext END IF IF uf_save(Ref arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF ext: RETURN rslt end function public function integer uf_trigger_timer (long arg_id, ref string arg_msg);Int rslt = 1 DateTime dt_server uo_ljjob job SetNull(job) IF Not IsValid(uo_ljjob_creator_spi) THEN rslt = 0 arg_msg = 'uo_ljjob_creator_spi未赋值' GOTO ext END IF SELECT top 1 GETDATE() INTO :dt_server From u_user; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询服务器间失败,' + sqlca.SQLErrText GOTO ext END IF DateTime dt_bdate SELECT bdate INTO :dt_bdate FROM bgtr_timer Where ID = :arg_id; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '查询任务最近执行时间失败,' + sqlca.SQLErrText GOTO ext END IF IF dt_bdate <= dt_server THEN UPDATE bgtr_timer SET block = 1, bdate = GETDATE() WHERE ID = :arg_id And (block = 0 Or GETDATE() > dateadd(ss, 10, bdate)); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '任务加锁失败,' + sqlca.SQLErrText GOTO ext END IF DO WHILE sqlca.SQLNRows = 0 UPDATE bgtr_timer SET block = 1, bdate = GETDATE() WHERE ID = :arg_id And (block = 0 Or GETDATE() > dateadd(ss, 10, bdate)); IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '任务加锁失败,' + sqlca.SQLErrText GOTO ext END IF LOOP IF uf_getinfo(arg_id, arg_msg) <> 1 THEN rslt = 0 GOTO ext END IF job = uo_ljjob_creator_spi.create_job(TaskType) IF Not IsNull(job) THEN job.uf_setparm(TaskParm) job.uf_dojob(arg_msg) END IF UPDATE bgtr_timer SET block = 0 Where ID = :arg_id; IF sqlca.SQLCode <> 0 THEN rslt = 0 arg_msg = '任务解锁失败,' + sqlca.SQLErrText GOTO ext END IF END IF ext: IF Not IsNull(job) THEN Destroy job END IF IF rslt = 1 THEN COMMIT; ELSE ROLLBACK; END IF RETURN rslt end function on uo_bgtr_timer.create call super::create TriggerEvent( this, "constructor" ) end on on uo_bgtr_timer.destroy TriggerEvent( this, "destructor" ) call super::destroy end on