通達OA批量處理沒有結束但前臺顯示已經結束的流程

鄭子明發表於2016-02-18

問題描述:

通達OA系統出現大量流程沒有結束,系統顯示結束的問題
通過查詢作業系統日誌,資料庫日誌,包括程式日誌沒有發現異常,通過觀察發現大量的流程結束時間都是在2016-02-16 17:32:XX時間的標誌
通過前臺可以直接恢復,這樣只能一個個手動處理,對大批量的問題需要通過其他方式進行


思路:



1.檢視OA的檔案restore.php



原始碼:
<?php

include_once( "inc/auth.php" );
include_once( "inc/utility_all.php" );
include_once( "../prcs_role.php" );
if ( $LOGIN_USER_PRIV != 1 )
{
exit( );
}
$query = "update FLOW_RUN_PRCS set PRCS_FLAG='2' where RUN_ID=".$RUN_ID." and OP_FLAG='1' ORDER BY PRCS_ID DESC,PRCS_TIME DESC LIMIT 1";
exequery( $connection, $query );
$query = "update FLOW_RUN set END_TIME=NULL where RUN_ID=".$RUN_ID." LIMIT 1";
exequery( $connection, $query );
$CONTENT = "恢復執行此工作";
run_log( $RUN_ID, $PRCS_ID, $FLOW_PRCS, $LOGIN_USER_ID, 1, $CONTENT );
ob_end_clean( );
if ( !mysql_affected_rows( ) )
{
echo "您的恢復執行操作沒有成功!";
}
else
{
echo "流水號為[";
echo $RUN_ID;
echo "]的工作已經恢復到執行狀態!";
}
?>

2.找到核心問題處理語句:

$query = "update FLOW_RUN_PRCS set PRCS_FLAG='2' where RUN_ID=".$RUN_ID." and OP_FLAG='1' ORDER BY PRCS_ID DESC,PRCS_TIME DESC LIMIT 1";
$query = "update FLOW_RUN set END_TIME=NULL where RUN_ID=".$RUN_ID." LIMIT 1";

3.通過語句將這部分有問題的流程查詢出來,用指令碼批量處理

<?php
header('content-type:text/html;charset=utf-8');
/*
   批量插入使用者工號指令碼

   1.連線資料庫
   2.迴圈有問題的流程流水號
   3.迴圈修改資料
*/
//連線資料庫
$conn=mysql_connect('192.168.8.200:3306','root','pass');

if(!$conn) {
   print_r(mysql_error());
}

//選庫
$sql='use TD_OA';
mysql_query($sql) or die('select database error');
//設定字符集
$sql='set names utf8';

mysql_query($sql);

//找到有問題的流水
/*
//流程沒有結束,但是顯示結束的流程
SELECT a.* from FLOW_RUN a,FLOW_RUN_PRCS b

where a.run_id=b.run_id and a.end_time like '2016-02-16 17:32%' and a.begin_time>='2016-02-01 00:00:00' and a.del_flag=0 and a.end_time is not null
and (b.prcs_time is null and b.deliver_time is not null)
*/

$run_id=array('1956932','1957092','1957208','1957217','1957258','1957413','1957413','1957452','1957602','1957690','1957690','1957690');

foreach($run_id as $v)
{
    $sql1 = "update FLOW_RUN_PRCS set PRCS_FLAG='2' where RUN_ID='".$v."' and OP_FLAG='1' ORDER BY PRCS_ID DESC,PRCS_TIME DESC LIMIT 1";
    echo $sql1,'<br />';
    mysql_query($sql1);
    $sql2 = "update FLOW_RUN set END_TIME=NULL where RUN_ID='".$v."' LIMIT 1";
    echo $sql2,'<br />';
    mysql_query($sql2);
}

echo 'ok';

相關文章