예제 #1
0
 public function actionConfirmPost()
 {
     if (EnvUtil::submitCheck("formhash")) {
         $key = EnvUtil::getRequest("key");
         $param = WfCommonUtil::param($key, "DECODE");
         $runId = intval($param["runid"]);
         $processId = intval($param["processid"]);
         $flowId = intval($param["flowid"]);
         $flowProcess = intval($param["flowprocess"]);
         $opflag = intval($_POST["opflag"]);
         $oldUid = intval($_POST["oldUid"]);
         $this->checkRunAccess($runId);
         $this->checkEntrustType($flowId);
         $referer = EnvUtil::referer();
         $frp = FlowRunProcess::model()->fetchRunProcess($runId, $processId, $flowProcess, $oldUid);
         if ($frp) {
             $parent = $frp["parent"];
             $topflag = $frp["topflag"];
         }
         $toid = implode(",", StringUtil::getId($_POST["prcs_other"]));
         $tempFRP = FlowRunProcess::model()->fetchRunProcess($runId, $processId, $flowProcess, $toid);
         if (!$tempFRP) {
             $data = array("runid" => $runId, "processid" => $processId, "uid" => $toid, "flag" => 1, "flowprocess" => $flowProcess, "opflag" => $opflag, "topflag" => $topflag, "parent" => $parent, "createtime" => TIMESTAMP);
             FlowRunProcess::model()->add($data);
         } else {
             if ($tempFRP["opflag"] == 0 && $opflag == 1) {
                 FlowRunProcess::model()->updateAll(array("opflag" => 1, "flag" => 2), sprintf("runid = %d AND processid = %d AND flowprocess = %d AND uid = %d", $runId, $processId, $flowProcess, $toid));
             } else {
                 $name = User::model()->fetchRealnameByUid($toid);
                 $this->error(Ibos::lang("Already are opuser", "", array("{name}" => $name)), $referer);
             }
         }
         FlowRunProcess::model()->updateProcessTime($runId, $processId, $flowProcess, $oldUid);
         FlowRunProcess::model()->updateAll(array("flag" => 4, "opflag" => 0, "delivertime" => TIMESTAMP), "runid = :runid AND processid = :prcsid AND flowprocess = :fp AND uid = :uid", array(":runid" => $runId, ":prcsid" => $processId, ":fp" => $flowProcess, ":uid" => $oldUid));
         $toName = User::model()->fetchRealnameByUid($toid);
         $userName = User::model()->fetchRealnameByUid($oldUid);
         $content = Ibos::lang("Entrust to desc", "", array("{username}" => $userName, "{toname}" => $toName));
         WfCommonUtil::runlog($runId, $processId, $flowProcess, $this->uid, 2, $content, $toid);
         $message = StringUtil::filterCleanHtml($_POST["message"]);
         if (!empty($message)) {
             Notify::model()->sendNotify($toid, "workflow_entrust_notice", array("{message}" => $message));
         }
         $this->redirect($referer);
     }
 }
예제 #2
0
파일: FlowRun.php 프로젝트: AxelPanda/ibos
 public function del($id, $uid)
 {
     $ids = is_array($id) ? $id : explode(",", $id);
     $count = 0;
     $logContent = Ibos::lang("Del run", "workflow.default");
     foreach ($ids as $runID) {
         $per = WfCommonUtil::getRunPermission($runID, $uid, 1);
         $isOnly = FlowRunProcess::model()->getIsOnlyOne($runID);
         if (!StringUtil::findIn($per, 2) && $isOnly && !StringUtil::findIn($per, 1) && !StringUtil::findIn($per, 3)) {
             continue;
         }
         if ($this->modify($runID, array("delflag" => 1))) {
             $count++;
             WfCommonUtil::runlog($runID, 0, 0, $uid, 3, $logContent);
         }
     }
     return $count;
 }
예제 #3
0
 public function actionTurnNextPost()
 {
     $runId = $_GET["runid"];
     $flowId = $_GET["flowid"];
     $processId = $_GET["processid"];
     $flowProcess = $_GET["flowprocess"];
     $topflag = isset($_GET["topflag"]) ? $_GET["topflag"] : null;
     $this->nextAccessCheck($topflag, $runId, $processId);
     $plugin = FlowProcess::model()->fetchTurnPlugin($flowId, $flowProcess);
     if ($plugin) {
         $pluginFile = "./system/modules/workflow/plugins/turn/" . $plugin;
         if (file_exists($pluginFile)) {
             include_once $pluginFile;
         }
     }
     $prcsTo = $_GET["processto"];
     $prcsToArr = explode(",", trim($prcsTo, ","));
     $prcsChooseArr = $_GET["prcs_choose"];
     $prcsChoose = implode($prcsChooseArr, ",");
     $message = $_GET["message"];
     $toId = $nextId = $beginUserId = $toallId = "";
     $ext = array("{url}" => Ibos::app()->urlManager->createUrl("workflow/list/index", array("op" => "category")), "{message}" => $message);
     if (isset($_GET["remind"][1])) {
         $nextId = "";
         if (isset($_GET["prcs_user_op"])) {
             $nextId = intval($_GET["prcs_user_op"]);
         } else {
             foreach ($prcsChooseArr as $k => $v) {
                 if (isset($_GET["prcs_user_op" . $k])) {
                     $nextId .= $_GET["prcs_user_op" . $k] . ",";
                 }
             }
             $nextId = trim($nextId, ",");
         }
     }
     if (isset($_GET["remind"][2])) {
         $beginuser = FlowRunProcess::model()->fetchAllOPUid($runId, 1, true);
         if ($beginuser) {
             $beginUserId = StringUtil::wrapId($beginuser[0]["uid"]);
         }
     }
     if (isset($_GET["remind"]["3"])) {
         $toallId = "";
         if (isset($_GET["prcs_user"])) {
             $toallId = filter_input(INPUT_POST, "prcs_user", FILTER_SANITIZE_STRING);
         } else {
             foreach ($prcsChooseArr as $k => $v) {
                 if (isset($_GET["prcs_user" . $k])) {
                     $toallId .= filter_input(INPUT_POST, "prcs_user" . $k, FILTER_SANITIZE_STRING);
                 }
             }
         }
     }
     $idstr = $nextId . "," . $beginUserId . "," . $toallId;
     $toId = StringUtil::filterStr($idstr);
     if ($toId) {
         Notify::model()->sendNotify($toId, "workflow_turn_notice", $ext);
     }
     if ($prcsChoose == "") {
         $prcsUserOp = isset($_GET["prcs_user_op"]) ? intval($_GET["prcs_user_op"]) : "";
         $prcsUser = isset($_GET["prcs_user"]) ? $_GET["prcs_user"] : "";
         $run = FlowRun::model()->fetchByPk($runId);
         if ($run) {
             $pId = $run["parentrun"];
             $runName = $run["name"];
         }
         FlowRunProcess::model()->updateAll(array("flag" => FlowConst::PRCS_DONE), sprintf("runid = %d AND processid = %d AND flowprocess = %d", $runId, $processId, $flowProcess));
         FlowRunProcess::model()->updateAll(array("flag" => FlowConst::PRCS_DONE), sprintf("runid = %d AND flag = 3", $runId));
         FlowRunProcess::model()->updateAll(array("delivertime" => TIMESTAMP), sprintf("runid = %d AND processid = %d AND flowprocess = %d AND uid = %d", $runId, $processId, $flowProcess, $this->uid));
         $isUnique = FlowRunProcess::model()->getIsUnique($runId);
         if (!$isUnique) {
             FlowRun::model()->modify($runId, array("endtime" => TIMESTAMP));
         }
         if ($pId != 0) {
             $parentflowId = FlowRun::model()->fetchFlowIdByRunId($pId);
             $parentFormId = FlowType::model()->fetchFormIDByFlowID($parentflowId);
             $parentPrcs = FlowRunProcess::model()->fetchIDByChild($pId, $runId);
             if ($parentPrcs) {
                 $parentPrcsId = $parentPrcs["processid"];
                 $parentFlowProcess = $parentPrcs["flowprocess"];
             }
             $parentProcess = FlowProcess::model()->fetchProcess($parentflowId, $parentPrcsId);
             if ($parentProcess["relationout"] !== "") {
                 $relationArr = explode(",", trim($parentProcess["relationout"], ","));
                 $src = $des = $set = array();
                 foreach ($relationArr as $field) {
                     $src[] = substr($field, 0, strpos($field, "=>"));
                     $des[] = substr($field, strpos($field, "=>") + strlen("=>"));
                 }
                 $runData = WfHandleUtil::getRunData($runId);
                 $form = new ICFlowForm($parentFormId);
                 $structure = $form->parser->structure;
                 foreach ($structure as $k => $v) {
                     if ($v["data-type"] !== "label" && in_array($v["data-title"], $des)) {
                         $i = array_search($v["data-title"], $des);
                         $ptitle = $src[$i];
                         $itemData = $runData[$ptitle];
                         if (is_array($itemData) && $v["data-type"] == "listview") {
                             $itemDataStr = "";
                             $newDataStr = "";
                             for ($j = 1; $j < count($itemData); ++$j) {
                                 foreach ($itemData[$i] as $val) {
                                     $newDataStr .= $val . "`";
                                 }
                                 $itemDataStr .= $newDataStr . "\r\n";
                                 $newDataStr = "";
                             }
                             $itemData = $itemDataStr;
                         }
                         $field = "data_" . $v["itemid"];
                         $set[$field] = $itemData;
                     }
                 }
                 if (!empty($set)) {
                     FlowDataN::model()->update($parentflowId, $pId, $set);
                 }
             }
             WfHandleUtil::updateParentOver($runId, $pId);
             $prcsBack = $_GET["prcsback"] . "";
             if ($prcsBack != "") {
                 $parentPrcsIdNew = $parentPrcsId + 1;
                 $data = array("runid" => $pId, "processid" => $parentPrcsIdNew, "uid" => $prcsUserOp, "flag" => "1", "flowprocess" => $prcsBack, "opflag" => 1, "topflag" => 0, "parent" => $parentFlowProcess);
                 FlowRunProcess::model()->add($data);
                 foreach (explode(",", trim($prcsUser, ",")) as $k => $v) {
                     if ($v != $prcsUserOp && !empty($v)) {
                         $data = array("runid" => $pId, "processid" => $parentPrcsIdNew, "uid" => $v, "flag" => "1", "flowprocess" => $prcsBack, "opflag" => 0, "topflag" => 0, "parent" => $parentFlowProcess);
                         FlowRunProcess::model()->add($data);
                     }
                 }
                 $parentRunName = FlowRun::model()->fetchNameByRunID($pId);
                 $content = "[{$runName}]" . Ibos::lang("Log return the parent process") . ":[{$parentRunName}]";
                 WfCommonUtil::runlog($runId, $processId, $flowProcess, $this->uid, 1, $content);
                 FlowRun::model()->modify($pId, array("endtime" => null));
             }
         }
         $content = Ibos::lang("Form endflow");
         WfCommonUtil::runlog($runId, $processId, $flowProcess, $this->uid, 1, $content);
     } else {
         $freeother = FlowType::model()->fetchFreeOtherByFlowID($flowId);
         $prcsChooseArrCount = count($prcsChooseArr);
         for ($i = 0; $i < $prcsChooseArrCount; $i++) {
             $flowPrcsNext = $prcsToArr[$prcsChooseArr[$i]];
             $prcsIdNew = $processId + 1;
             $str = "prcs_user_op" . $prcsChooseArr[$i];
             $prcsUserOp = $_GET[$str];
             if (empty($prcsUserOp)) {
                 $this->ajaxReturn(array("isSuccess" => false, "msg" => "必须选择主办人"), "JSONP");
                 exit;
             }
             if ($freeother == 2) {
                 $prcsUserOp = WfHandleUtil::turnOther($prcsUserOp, $flowId, $runId, $processId, $flowProcess);
             }
             $str = "prcs_user" . $prcsChooseArr[$i];
             $prcsUser = explode(",", $_GET[$str]);
             array_push($prcsUser, $prcsUserOp);
             $prcsUser = implode(",", array_unique($prcsUser));
             if ($freeother == 2) {
                 $prcsUser = WfHandleUtil::turnOther($prcsUser, $flowId, $runId, $processId, $flowProcess, $prcsUserOp);
             }
             $str = "topflag" . $prcsChooseArr[$i];
             $topflag = intval($_GET[$str]);
             $fp = FlowProcess::model()->fetchProcess($flowId, $flowPrcsNext);
             if ($fp["childflow"] == 0) {
                 $_topflag = FlowRunProcess::model()->fetchTopflag($runId, $prcsIdNew, $flowPrcsNext);
                 if ($_topflag) {
                     $topflag = $_topflag;
                 }
                 $isOpHandle = FlowRunProcess::model()->getIsOpOnTurn($runId, $prcsIdNew, $flowPrcsNext);
                 if ($isOpHandle) {
                     $prcsUserOp = "";
                     $t_flag = 1;
                 } else {
                     $t_flag = 0;
                 }
                 foreach (explode(",", trim($prcsUser)) as $k => $v) {
                     if ($v == $prcsUserOp || $topflag == 1) {
                         $opflag = 1;
                     } else {
                         $opflag = 0;
                     }
                     if ($topflag == 2) {
                         $opflag = 0;
                     }
                     $workedId = FlowRunProcess::model()->fetchProcessIDOnTurn($runId, $prcsIdNew, $flowPrcsNext, $v, $fp["gathernode"]);
                     if (!$workedId) {
                         $wrp = FlowRunProcess::model()->fetchRunProcess($runId, $processId, $flowProcess, $this->uid);
                         if ($wrp) {
                             $otherUser = $wrp["otheruser"] != "" ? $wrp["otheruser"] : "";
                         } else {
                             $otherUser = "";
                         }
                         $data = array("runid" => $runId, "processid" => $prcsIdNew, "uid" => $v, "flag" => 1, "flowprocess" => $flowPrcsNext, "opflag" => $opflag, "topflag" => $topflag, "parent" => $flowProcess, "createtime" => TIMESTAMP, "otheruser" => $otherUser);
                         FlowRunProcess::model()->add($data);
                     } else {
                         if ($prcsIdNew < $workedId) {
                             $prcsIdNew = $workedId;
                         }
                         $lastPrcsId = $workedId;
                         FlowRunProcess::model()->updateTurn($flowProcess, $prcsIdNew, $runId, $lastPrcsId, $flowPrcsNext, $v);
                     }
                 }
                 if ($t_flag == 1) {
                     FlowRunProcess::model()->updateToOver($runId, $processId, $flowProcess);
                 } else {
                     FlowRunProcess::model()->updateToTrans($runId, $processId, $flowProcess);
                 }
                 $userNameStr = User::model()->fetchRealnamesByUids($prcsUser);
                 $content = Ibos::lang("To the steps") . $prcsIdNew . "," . Ibos::lang("Transactor") . ":" . $userNameStr;
                 WfCommonUtil::runlog($runId, $processId, $flowProcess, $this->uid, 1, $content);
             } else {
                 $runidNew = WfNewUtil::createNewRun($fp["childflow"], $prcsUserOp, $prcsUser, $runId);
                 $data = array("runid" => $runId, "processid" => $prcsIdNew, "uid" => $prcsUserOp, "flag" => 1, "flowprocess" => $flowPrcsNext, "opflag" => 1, "topflag" => 0, "parent" => $flowProcess, "childrun" => $runidNew, "createtime" => TIMESTAMP);
                 FlowRunProcess::model()->add($data);
                 FlowRunProcess::model()->updateToOver($runId, $processId, $flowProcess);
                 $content = Ibos::lang("Log new subflow") . $runidNew;
                 WfCommonUtil::runlog($runId, $processId, $flowProcess, $this->uid, 1, $content);
             }
         }
     }
     $this->ajaxReturn(array("isSuccess" => true), "JSONP");
 }
예제 #4
0
 protected function redo($runId, $processId, $uid, $flowProcess)
 {
     if (FlowRunProcess::model()->updateRedo($runId, $processId, $uid, $flowProcess)) {
         $name = User::model()->fetchRealnameByUid($uid);
         $message = Ibos::lang("Agent redo", "", array("{user}" => $name));
         WfCommonUtil::runlog($runId, $processId, $flowProcess, $this->uid, 7, $message);
         return true;
     }
     return false;
 }
예제 #5
0
 protected function complete($runId, $processId, $opflag = 1, $topflag = 0, $inajax = 0, $flowProcess = "", $op = "")
 {
     $flowType = FlowRun::model()->fetchFlowTypeByRunId($runId);
     if ($opflag || $op == "manage") {
         $pidNext = $processId + 1;
         if (FlowRunProcess::model()->getHasDefaultStep($runId, $pidNext)) {
             if ($op != "manage") {
                 if ($inajax) {
                     $this->ajaxReturn(array("isSuccess" => false, "msg" => Ibos::lang("Subsequent default steps in the process")));
                 } else {
                     $this->error(Ibos::lang("Subsequent default steps in the process"), $this->createUrl("list/index"));
                 }
             } else {
                 FlowRunProcess::model()->deleteByIDScope($runId, $pidNext);
             }
         }
         if ($op != "manage") {
             FlowRunProcess::model()->updateAll(array("delivertime" => TIMESTAMP), sprintf("runid = %d AND processid = %d AND uid = %d", $runId, $processId, $this->uid));
         } else {
             FlowRunProcess::model()->updateAll(array("delivertime" => TIMESTAMP), sprintf("runid = %d AND delivertime = 0", $runId));
             FlowRunProcess::model()->updateAll(array("processtime" => TIMESTAMP), sprintf("runid = %d AND processtime = 0", $runId));
         }
         FlowRunProcess::model()->updateAll(array("flag" => FlowConst::PRCS_DONE), "runid = {$runId}");
         FlowRun::model()->modify($runId, array("endtime" => TIMESTAMP));
         $content = $op != "manage" ? Ibos::lang("Form endflow") : Ibos::app()->user->realname . Ibos::lang("Forced end process");
         WfCommonUtil::runlog($runId, $processId, $flowProcess, $this->uid, 1, $content);
         $parentRun = FlowRun::model()->fetchParentByRunID($runId);
         if ($parentRun != 0) {
             $parentFlowId = FlowRun::model()->fetchFlowIdByRunId($parentRun);
             $temp = FlowRunProcess::model()->fetchIDByChild($parentRun, $runId);
             if ($temp) {
                 $parentProcessId = $temp["processid"];
                 $parentFlowprocess = $temp["flowprocess"];
             }
             $parentProcess = FlowProcess::model()->fetchProcess($parentFlowId, $parentFlowprocess);
             if ($parentProcess) {
                 $prcsBack = $parentProcess["processto"];
                 $backUserOp = $parentProcess["autouserop"];
                 $backUser = $parentProcess["autouser"];
             }
             FlowRunProcess::model()->updateToOver($parentRun, $parentProcessId, $parentFlowprocess);
             if ($prcsBack != "") {
                 $parentProcessIdNew = $parentProcessId + 1;
                 $data = array("runid" => $parentRun, "processid" => $parentProcessIdNew, "uid" => $backUserOp, "flag" => 1, "flowprocess" => $prcsBack, "opflag" => 1, "topflag" => 0, "parent" => $parentFlowprocess);
                 FlowRunProcess::model()->add($data);
                 $backUserArr = explode(",", $backUser);
                 for ($k = 0; $k < count($backUserArr); $k++) {
                     if ($backUserArr[$k] != "" && $backUserArr[$k] != $backUserOp) {
                         $data = array("runid" => $parentRun, "processid" => $parentProcessIdNew, "uid" => $backUserArr[$k], "flag" => 1, "flowprocess" => $prcsBack, "opflag" => 0, "topflag" => 0, "parent" => $parentFlowprocess);
                         FlowRunProcess::model()->add($data);
                     }
                 }
             } elseif (!FlowRunProcess::model()->getIsNotOver($parentRun)) {
                 FlowRun::model()->modify($parentRun, array("endtime" => TIMESTAMP));
             }
         }
         $flag = EnvUtil::getRequest("flag");
         if ($flowType == 2 && $flag != 1) {
             $inajax && $this->ajaxReturn(array("isSuccess" => true));
             $this->redirect($this->createUrl("list/index"));
         }
         $inajax && $this->ajaxReturn(array("isSuccess" => true));
     } else {
         $flowId = FlowRun::model()->fetchFlowIDByRunID($runId);
         if ($topflag == 2) {
             if (!FlowRunProcess::model()->getHasOtherOPUser($runId, $processId, $flowProcess, $this->uid)) {
                 if (is_null($flowProcess) || $flowProcess == "0") {
                     $turnpage = "showNextFree";
                 } else {
                     $turnpage = "showNext";
                 }
                 $param = array("flowid" => $flowId, "processid" => $processId, "flowprocess" => $flowProcess, "runid" => $runId);
                 $url = $this->createUrl("handle/" . $turnpage, array("key" => WfCommonUtil::param($param), "topflag" => $topflag));
                 $this->ajaxReturn(array("status" => 2, "url" => $url));
             }
         }
         $con = sprintf("runid = %d AND processid = %d AND uid = %d", $runId, $processId, $this->uid);
         if ($flowProcess !== "" && $flowProcess !== "0") {
             $con .= " AND flowprocess = " . $flowProcess;
         }
         FlowRunProcess::model()->updateAll(array("flag" => "4", "delivertime" => TIMESTAMP), $con);
         if (!FlowRunProcess::model()->getHasOtherAgentNotDone($runId, $processId)) {
             $run = FlowRun::model()->fetchByPk($runId);
             $uid = FlowRunProcess::model()->fetchNotDoneOpuser($runId, $processId);
             if ($uid) {
                 $param = array("runid" => $runId, "flowid" => $flowId, "processid" => $processId, "flowprocess" => $flowProcess);
                 $config = array("{runname}" => $run["name"], "{url}" => Ibos::app()->urlManager->createUrl("workflow/form/index", array("key" => WfCommonUtil::param($param))));
                 Notify::model()->sendNotify($uid, "workflow_sign_notice", $config);
             }
         }
         MainUtil::setCookie("flow_complete_flag", 1, 30);
         $url = Ibos::app()->urlManager->createUrl("workflow/list/index", array("op" => "list", "type" => "trans", "sort" => "all"));
         $this->redirect($url);
     }
 }
예제 #6
0
 public function nextPost()
 {
     $var = $this->_var;
     $topflag = $this->getTopflag();
     $topflagOld = filter_input(INPUT_POST, "topflagOld", FILTER_SANITIZE_NUMBER_INT);
     $prcsUserOpNext = implode(",", StringUtil::getId(filter_input(INPUT_POST, "prcsUserOp", FILTER_SANITIZE_STRING)));
     $op = $this->getOp();
     $prcsUserNext = StringUtil::getId(filter_input(INPUT_POST, "prcsUser", FILTER_SANITIZE_STRING));
     array_push($prcsUserNext, $prcsUserOpNext);
     $prcsUserNext = implode(",", array_unique($prcsUserNext));
     $freeOther = $var["flow"]->freeother;
     $processIdNext = $var["processid"] + 1;
     $preset = filter_input(INPUT_POST, "preset", FILTER_SANITIZE_NUMBER_INT);
     if (is_null($preset)) {
         $lineCount = filter_input(INPUT_POST, "lineCount", FILTER_SANITIZE_NUMBER_INT);
         for ($i = 0; $i <= $lineCount; $i++) {
             $prcsIdSet = $processIdNext + $i;
             $tmp = $i == 0 ? "" : $i;
             $str = "prcsUserOp" . $tmp;
             $prcsUserOp = implode(",", StringUtil::getId(filter_input(INPUT_POST, $str, FILTER_SANITIZE_STRING)));
             $prcsUserOpOld = $prcsUserOp;
             if ($freeOther == 2) {
                 $prcsUserOp = WfHandleUtil::turnOther($prcsUserOp, $var["flowid"], $var["runid"], $var["processid"], $var["flowprocess"]);
             }
             $str = "prcsUser" . $tmp;
             $prcsUser = StringUtil::getId(filter_input(INPUT_POST, $str, FILTER_SANITIZE_STRING));
             array_push($prcsUser, $prcsUserOp);
             $prcsUser = implode(",", array_unique($prcsUser));
             if ($freeOther == 2) {
                 $prcsUser = WfHandleUtil::turnOther($prcsUser, $var["flowid"], $var["runid"], $var["processid"], $var["flowprocess"], $prcsUserOpOld);
             }
             $str = "topflag" . $tmp;
             $topflag = filter_input(INPUT_POST, $str, FILTER_SANITIZE_NUMBER_INT);
             $prcsFlag = $i == 0 ? 1 : 5;
             $str = "freeItem" . $tmp;
             $freeItem = filter_input(INPUT_POST, $str, FILTER_SANITIZE_STRING);
             if (is_null($freeItem) || empty($freeItem)) {
                 $freeItem = filter_input(INPUT_POST, "freeItemOld", FILTER_SANITIZE_STRING);
             }
             $tok = strtok($prcsUser, ",");
             while ($tok != "") {
                 if ($tok == $prcsUserOp || $topflag == 1) {
                     $opflag = 1;
                 } else {
                     $opflag = 0;
                 }
                 if ($topflag == 2) {
                     $opflag = 0;
                 }
                 if ($opflag == 0) {
                     $freeItem = "";
                 }
                 $data = array("runid" => $var["runid"], "processid" => $prcsIdSet, "flowprocess" => $prcsIdSet, "uid" => $tok, "flag" => $prcsFlag, "opflag" => $opflag, "topflag" => $topflag, "freeitem" => $freeItem);
                 FlowRunProcess::model()->add($data);
                 $tok = strtok(",");
             }
         }
     } else {
         FlowRunProcess::model()->updateAll(array("flag" => 1), sprintf("runid = %d AND processid = %d", $var["runid"], $processIdNext));
     }
     $presetDesc = !is_null($preset) ? $var["lang"]["Default step"] : "";
     $userNameStr = User::model()->fetchRealnamesByUids($prcsUserNext);
     $content = $var["lang"]["To the steps"] . $processIdNext . $presetDesc . "," . $var["lang"]["Transactor"] . ":" . $userNameStr;
     WfCommonUtil::runlog($var["runid"], $var["processid"], 0, Ibos::app()->user->uid, 1, $content);
     FlowRunProcess::model()->updateAll(array("flag" => 3), sprintf("runid = %d AND processid = %d", $var["runid"], $var["processid"]));
     FlowRunProcess::model()->updateAll(array("delivertime" => TIMESTAMP), sprintf("runid = %d AND processid = %d AND uid = %d", $var["runid"], $var["processid"], Ibos::app()->user->uid));
     $content = filter_input(INPUT_POST, "message", FILTER_SANITIZE_STRING);
     if (!is_null($content)) {
         $key = array("runid" => $var["runid"], "flowid" => $var["flowid"], "processid" => $processIdNext, "flowprocess" => $var["flowprocess"]);
         $ext = array("{url}" => Ibos::app()->createUrl("workflow/form/index", array("key" => WfCommonUtil::param($key))), "{message}" => $content);
         Notify::model()->sendNotify($prcsUserNext, "workflow_turn_notice", $ext);
     }
     if ($op == "manage") {
         $prcsFirst = $var["processid"] - 1;
         $prcsNext = $var["processid"] - 2;
         FlowRunProcess::model()->updateAll(array("flag" => 4), sprintf("runid = %d AND (processid = %d OR processid = %d)", $var["runid"], $prcsFirst, $prcsNext));
     }
     MainUtil::setCookie("flow_turn_flag", 1, 30);
     $url = Ibos::app()->createUrl("workflow/list/index", array("op" => "list", "type" => "trans", "sort" => "all"));
     $this->getController()->redirect($url);
 }