Esempio n. 1
0
 public function actionShowNext()
 {
     $key = EnvUtil::getRequest("key");
     if ($key) {
         $param = WfCommonUtil::param($key, "DECODE");
         $flowId = $param["flowid"];
         $runId = $param["runid"];
         $processId = $param["processid"];
         $flowProcess = $param["flowprocess"];
         $op = isset($param["op"]) ? $param["op"] : "";
         $topflag = EnvUtil::getRequest("topflag");
         $lang = Ibos::getLangSources();
         $this->nextAccessCheck($topflag, $runId, $processId);
         $run = new ICFlowRun($runId);
         $process = new ICFlowProcess($flowId, $flowProcess);
         $notAllFinished = array();
         $parent = "";
         foreach (FlowRunProcess::model()->fetchAllByRunIDProcessID($runId, $processId) as $rp) {
             if ($rp["flowprocess"] == $flowProcess) {
                 $parent .= $rp["parent"] . ",";
                 if (($rp["flag"] == self::TRANS || $rp["flag"] == self::DONE) && $rp["uid"] == $this->uid) {
                     $turnForbidden = true;
                 } else {
                     $turnForbidden = false;
                 }
                 if ($rp["flag"] != self::DONE && $rp["uid"] != $this->uid) {
                     $notAllFinished[] = $rp["uid"];
                 }
             }
         }
         if ($turnForbidden) {
             EnvUtil::iExit(Ibos::lang("Already trans"));
         }
         if (!empty($notAllFinished)) {
             $notAllFinished = User::model()->fetchRealnamesbyUids($notAllFinished);
         } else {
             $notAllFinished = "";
         }
         if ($process->gathernode == self::FORCE) {
             foreach (FlowProcess::model()->fetchAllGatherNode($flowId, $flowProcess) as $fp) {
                 $isUntrans = FlowRunProcess::model()->getIsUntrans($runId, $fp["processid"]);
                 if (!StringUtil::findIn($fp["processid"], $parent)) {
                     if ($isUntrans) {
                         EnvUtil::iExit(Ibos::lang("Gathernode trans error"));
                     }
                 }
             }
         }
         if ($process->processto == "") {
             $prcsMax = FlowProcess::model()->fetchMaxProcessIDByFlowID($flowId);
             if ($flowProcess !== $prcsMax) {
                 $process->processto = $flowProcess + 1;
             } else {
                 $process->processto = "0";
             }
         }
         $prcsArr = explode(",", trim($process->processto, ","));
         $prcsArrCount = count($prcsArr);
         $prcsEnableCount = 0;
         $prcsStop = "S";
         $prcsback = "";
         $prcsEnableFirst = null;
         $list = array();
         $formData = WfHandleUtil::getFormData($flowId, $runId);
         foreach ($prcsArr as $key => $to) {
             $param = array("checked" => "false");
             if ($to == "0") {
                 $param["isover"] = true;
                 $param["prcsname"] = $run->parentrun !== "0" ? Ibos::lang("End subflow") : Ibos::lang("Form endflow");
                 $prcsStop = $key;
                 $prcsEnableCount++;
                 if ($prcsEnableCount == 1) {
                     $param["checked"] = "true";
                     $prcsEnableFirst = $key;
                 }
                 if ($run->parentrun !== "0") {
                     $parentFlowId = FlowRun::model()->fetchFlowIdByRunId($run->parentrun);
                     $parentProcess = FlowRun::model()->fetchIDByChild($run->parentrun, $runId);
                     $parentFlowProcess = $parentProcess["flowprocess"];
                     if ($parentFlowId && $parentFlowProcess) {
                         $temp = FlowProcess::model()->fetchProcess($parentFlowId, $parentFlowProcess);
                         if ($temp) {
                             $prcsback = $temp["processto"];
                             $backUserOP = $temp["autouserop"];
                             $param["backuser"] = $temp["autouser"];
                         }
                     }
                     if ($prcsback != "") {
                         $param["prcsusers"] = WfHandleUtil::getPrcsUser($flowId, $prcsback);
                         $param["display"] = $prcsEnableFirst !== $prcsStop ? false : true;
                         if (isset($backUserOP)) {
                             $param["prcsopuser"] = $backUserOP;
                         }
                     }
                 }
             } else {
                 $param["isover"] = false;
                 $curProcess = FlowProcess::model()->fetchProcess($flowId, $to);
                 $param["prcsname"] = $curProcess["name"];
                 $processOut = FlowProcessTurn::model()->fetchByUnique($flowId, $processId, $to);
                 if (!$processOut) {
                     $processOut = array("processout" => "", "conditiondesc" => "");
                 }
                 $notpass = WfHandleUtil::checkCondition($formData, $processOut["processout"], $processOut["conditiondesc"]);
                 if ($curProcess["childflow"] !== "0") {
                     $param["prcsname"] .= "(" . $lang["Subflow"] . ")";
                 }
                 if (substr($notpass, 0, 5) == "setok") {
                     $notpass = "";
                 }
                 if ($notpass == "") {
                     $prcsEnableCount++;
                     if ($prcsEnableCount == 1 || 0 < $process->syncdeal && !is_numeric($prcsStop)) {
                         $param["checked"] = "true";
                         if ($prcsEnableCount == 1) {
                             $prcsEnableFirst = $key;
                         }
                     }
                     unset($param["notpass"]);
                     $param["selectstr"] = $this->makeUserSelect($runId, $key, $curProcess, $param["prcsname"], $flowId, $processId);
                 } else {
                     $param["notpass"] = $notpass;
                 }
             }
             $list[$key] = $param;
         }
         if ($prcsEnableCount == 0) {
             if ($notpass == "") {
                 EnvUtil::iExit($lang["Process define error"]);
             } else {
                 EnvUtil::iExit($notpass);
             }
         }
         $data = array("lang" => $lang, "notAllFinished" => $notAllFinished, "enableCount" => $prcsEnableCount, "prcsto" => $prcsArr, "prcsback" => $prcsback, "notpass" => isset($notpass) ? $notpass : "", "process" => $process->toArray(), "run" => $run->toArray(), "runid" => $runId, "flowid" => $flowId, "processid" => $processId, "flowprocess" => $flowProcess, "count" => $prcsArrCount, "prcsStop" => $prcsStop, "topflag" => $topflag, "list" => $list, "op" => $op);
         $this->ajaxReturn($data, "JSONP");
     }
 }
Esempio n. 2
0
 public function actionIndex()
 {
     $flow = new ICFlowType(intval($this->flowid));
     if (EnvUtil::submitCheck("formhash")) {
         $data = array();
         $readOnly = $_POST["readonly"];
         $hidden = $_POST["hidden"];
         $saveflag = $_POST["saveflag"];
         $fbAttachmentId = $_POST["fbattachmentid"];
         $attachmentId = $_POST["attachmentid"];
         $content = isset($_POST["content"]) ? StringUtil::filterCleanHtml($_POST["content"]) : "";
         $topflag = $_POST["topflag"];
         $this->checkRunAccess($this->runid, $this->processid, $this->createUrl("list/index"));
         if (FlowRunProcess::model()->getIsOp($this->uid, $this->runid, $this->processid)) {
             $formData = array();
             $structure = $flow->form->parser->structure;
             foreach ($structure as $index => $item) {
                 if (StringUtil::findIn($hidden, $item["itemid"]) || StringUtil::findIn($readOnly, $item["itemid"])) {
                     continue;
                 }
                 $value = isset($_POST[$index]) ? $_POST[$index] : "";
                 $formData[$index] = $value;
             }
             $formData && $this->handleImgComponent($formData);
             $formData && FlowDataN::model()->update($this->flowid, $this->runid, $formData);
         }
         if (!empty($content) || !empty($fbAttachmentId)) {
             $fbData = array("runid" => $this->runid, "processid" => $this->processid, "flowprocess" => $this->flowprocess, "uid" => $this->uid, "content" => $content, "attachmentid" => $fbAttachmentId, "edittime" => TIMESTAMP);
             FlowRunfeedback::model()->add($fbData);
             AttachUtil::updateAttach($fbAttachmentId, $this->runid);
         }
         FlowRun::model()->modify($this->runid, array("attachmentid" => $attachmentId));
         AttachUtil::updateAttach($attachmentId, $this->runid);
         $plugin = FlowProcess::model()->fetchSavePlugin($this->flowid, $this->flowprocess);
         if (!empty($plugin)) {
             $pluginFile = "./system/modules/workflow/plugins/save/" . $plugin;
             if (file_exists($pluginFile)) {
                 include_once $pluginFile;
             }
         }
         switch ($saveflag) {
             case "save":
                 MainUtil::setCookie("save_flag", 1);
                 $this->redirect($this->createUrl("form/index", array("key" => $this->key)));
                 break;
             case "turn":
                 MainUtil::setCookie("turn_flag", 1);
                 $this->redirect($this->createUrl("form/index", array("key" => $this->key)));
                 break;
             case "end":
             case "finish":
                 if ($saveflag == "end") {
                     $param = array("opflag" => 1);
                 } else {
                     $param = array("topflag" => $topflag);
                 }
                 $this->redirect($this->createUrl("handle/complete", array_merge($param, array("key" => $this->key))));
                 break;
             default:
                 break;
         }
     } else {
         $this->checkRunDel();
         $this->checkIllegal();
         $len = strlen($flow->autonum);
         for ($i = 0; $i < $flow->autolen - $len; $i++) {
             $flow->autonum = "0" . $flow->autonum;
         }
         $runProcess = new ICFlowRunProcess($this->runid, $this->processid, $this->flowprocess, $this->uid);
         $checkitem = "";
         if ($flow->isFixed()) {
             $process = new ICFlowProcess($this->flowid, $this->flowprocess);
             if ($runProcess->opflag != 0) {
                 $checkitem = $process->checkitem;
             }
             if (0 < $process->allowback) {
                 $isAllowBack = $this->isAllowBack($runProcess->parent);
             }
         } else {
             $process = array();
         }
         $run = new ICFlowRun($this->runid);
         $hasOtherOPUser = FlowRunProcess::model()->getHasOtherOPUser($this->runid, $this->processid, $this->flowprocess, $this->uid);
         if ($runProcess->flag == FlowConst::PRCS_UN_RECEIVE) {
             $this->setSelfToHandle($runProcess->id);
         }
         if ($runProcess->topflag == 1 && $runProcess->opflag == 1) {
             FlowRunProcess::model()->updateTop($this->uid, $this->runid, $this->processid, $this->flowprocess);
         }
         if ($runProcess->topflag == 2) {
             if (!$hasOtherOPUser) {
                 $runProcess->opflag = 1;
             }
         }
         if ($this->processid == 1) {
             FlowRun::model()->modify($this->runid, array("beginuser" => $this->uid, "begintime" => TIMESTAMP));
             if (!empty($run->parentrun)) {
                 $this->setParentToHandle($run->parentrun, $this->runid);
             }
         }
         $preProcess = $this->processid - 1;
         if ($preProcess) {
             if ($flow->isFree() || $flow->isFixed() && $process->gathernode != 1) {
                 $this->setProcessDone($preProcess);
             }
         }
         if ($flow->isFixed() && $process->timeout != 0) {
             if ($runProcess->flag == FlowConst::PRCS_UN_RECEIVE && $this->processid != 1) {
                 $processBegin = FlowRunProcess::model()->fetchDeliverTime($this->runid, $preProcess);
             } else {
                 $processBegin = $runProcess->processtime ? $runProcess->processtime : TIMESTAMP;
             }
             $timeUsed = TIMESTAMP - $processBegin;
         }
         $viewer = new ICFlowFormViewer(array("flow" => $flow, "form" => $flow->getForm(), "run" => $run, "process" => $process, "rp" => $runProcess));
         $data = array_merge(array("flow" => $flow->toArray(), "run" => $run->toArray(), "processid" => $this->processid, "process" => !empty($process) ? $process->toArray() : $process, "checkItem" => $checkitem, "prcscache" => WfCommonUtil::loadProcessCache($this->flowid), "rp" => $runProcess->toArray(), "fbSigned" => $this->isFeedBackSigned(), "allowBack" => isset($isAllowBack) ? $isAllowBack : false, "timeUsed" => isset($timeUsed) ? $timeUsed : 0, "uploadConfig" => AttachUtil::getUploadConfig()), $viewer->render());
         if ($this->isEnabledAttachment($flow, $run, $process, $runProcess)) {
             $data["allowAttach"] = true;
             if (!empty($run->attachmentid)) {
                 $attachPurv = $this->getAttachPriv($flow, $process, $runProcess);
                 $down = $attachPurv["down"];
                 $edit = $attachPurv["edit"];
                 $del = $attachPurv["del"];
                 $data["attachData"] = AttachUtil::getAttach($run->attachmentid, $down, $down, $edit, $del);
             }
         } else {
             $data["allowAttach"] = false;
         }
         if ($flow->isFixed() && $process->feedback != 1 || $flow->isFree()) {
             $data["allowFeedback"] = true;
         } else {
             $data["allowFeedback"] = false;
         }
         if ($data["allowBack"]) {
             $data["backlist"] = $this->getBackList($runProcess->flowprocess);
         }
         $data["feedback"] = WfHandleUtil::loadFeedback($flow->getID(), $run->getID(), $flow->type, $this->uid);
         if ($flow->isFree() && $runProcess->opflag == "1") {
             $hasDefault = FlowRunProcess::model()->getHasDefaultStep($this->runid, $this->processid);
             if (!$hasDefault) {
                 $data["defaultEnd"] = true;
             }
         }
         if ($flow->isFree() && $runProcess->topflag == "2") {
             if (!$hasOtherOPUser) {
                 $data["otherEnd"] = true;
             }
         }
         $this->setPageTitle(Ibos::lang("Handle work"));
         $this->setPageState("breadCrumbs", array(array("name" => Ibos::lang("Workflow")), array("name" => Ibos::lang("My work"), "url" => $this->createUrl("list/index")), array("name" => Ibos::lang("Handle work"))));
         $this->render("index", $data);
     }
 }