/** * 儲存結算結果 * @param array $empSettleAry - array('02010007'=>array) * @param array $empSettle - array('02010007'=>'姓名') * @param string $daymonth * @return boolean * @throws @var:$empitem@mtd:getErrors */ private function saveSettleItems($empSettleAry) { $model = TbmEmpItem::model(); $transaction = $model->dbConnection->beginTransaction(); $valid = TRUE; $errorMsg = ''; try { $sql = ''; $result = 0; // 因為逐筆新增太耗資源, 直接一次全部寫入. 300個員工. 也不過 300 X 20 = 6000筆 $sqlStart = "INSERT INTO `tbm_emp_item` (`id`, `daymonth`, `empno`, `empname`, `itemno`, `value`, `eachmonth`, `memo`, \n `opt1`, `opt2`, `opt3`, `cemp`, `uemp`, `ctime`, `utime`, `ip`) VALUES "; $sql = $sqlStart; $i = 0; foreach ($empSettleAry as $empitem) { $this->createData($empitem); if ($valid) { $sql = $sql . "(DEFAULT, '{$empitem->daymonth}', '{$empitem->empno}', '{$empitem->empname}', '{$empitem->itemno}', "; $sql = $sql . "'{$empitem->value}', '{$empitem->eachmonth}', '{$empitem->memo}', '{$empitem->opt1}', '{$empitem->opt2}', "; $sql = $sql . "'{$empitem->opt3}', '{$empitem->cemp}', '{$empitem->uemp}', '{$empitem->ctime}', '{$empitem->utime}', '{$empitem->ip}'),"; } else { $valid = FALSE; $errorMsg = $errorMsg . "驗證失敗: {$empitem->empname}, {$empitem->itemno} 差勤結算失敗 !" . CVarDumper::dumpAsString($empitem->getErrors()) . "<br>"; break; } if ($i++ > 5000) { $sql = substr_replace($sql, ";", -1); $result = Yii::app()->db->createCommand($sql)->execute(); $sql = $sqlStart; $i = 0; } } // 最後一將最後一個,號改成;號 $sql = substr_replace($sql, ";", -1); $result = Yii::app()->db->createCommand($sql)->execute(); if (!$valid or $result < 1) { $valid = FALSE; } if ($valid) { $transaction->commit(); } else { $errorMsg = " 差勤結算失敗 !<br>" . $errorMsg; $transaction->rollback(); } } catch (Exception $e) { $transaction->rollback(); throw $e; } return array($valid, $errorMsg); }
/** * 新增支出 * @param type $perform */ private function createOutputData($array, $perform) { //支出金額初始值 $outputTotal = 0; // 取得LOG的類別及細項 $ary = $this->getLogItem(); $logItemArray = $ary[0]; // 細項 $logTypeArray = $ary[1]; // 類別 $logMainArray = $ary[2]; // 主項 $logSubArray = $ary[3]; // 次項 // 錯誤訊息 $errMsg = ''; $model = TbmEmpItem::model(); $transaction = $model->dbConnection->beginTransaction(); try { // 處理刪除 $checkDelete = TRUE; // 驗證 $valid = TRUE; // 刪除與取消刪除優先處理 if (isset($_POST['TbpOutputLog'])) { foreach ($_POST['TbpOutputLog'] as $j => $TbpOutputLog) { if (isset($_POST['TbpOutputLog'][$j])) { $array[$j] = new TbpOutputLog(); $array[$j]->attributes = $TbpOutputLog; $array[$j]->pdate = $perform->pdate; $array[$j]->storecode = $perform->storecode; $array[$j]->storename = $perform->storename; // 幫itemID都查詢好main跟sub if ($array[$j]->itemid != '') { $array[$j]->itemname = $logItemArray[$array[$j]->itemid]; //得到細項名稱 $array[$j]->type = $logTypeArray[$array[$j]->itemid]; //得到細項型態 $array[$j]->mainid = $logMainArray[$array[$j]->itemid]; //得到主項ID $array[$j]->subid = $logSubArray[$array[$j]->itemid]; //得到次項ID } if ($TbpOutputLog['id'] != '') { $array[$j]->id = $TbpOutputLog['id']; //當按了支出明細的刪除 if (isset($_POST[$j . 'delete'])) { // Yii::app()->user->setFlash('success', '1'); $array[$j] = TbpOutputLog::model()->findByPk($TbpOutputLog['id']); $array[$j]->opt1 = 0; $this->updateData($array[$j]); $valid = $array[$j]->save() && $valid; $checkDelete = FALSE; } elseif (isset($_POST[$j . 'cancel_del'])) { //當按了支出明細的取消刪除 $array[$j] = TbpOutputLog::model()->findByPk($TbpOutputLog['id']); $array[$j]->opt1 = 1; $this->updateData($array[$j]); $valid = $array[$j]->save() && $valid; $checkDelete = FALSE; } if (!$valid) { $errMsg = $errMsg . '第' . ($j + 2) . '筆' . CVarDumper::dumpAsString($array[$j]->getErrors() . '<br>'); } } // if($TbpOutputLog['id'] != '') { } // if (isset($_POST['TbpOutputLog'][$j])) { } //foreach ($_POST['TbpOutputLog'] as $j=>$TbpOutputLog) } if ($checkDelete && isset($_POST['send'])) { // 先針對所有的資料,做一次加總,看看總和對不對 foreach ($array as $log) { // 以 price、itemid 值判斷金額相加 if ($log->itemid != '' && $log->price > 0) { $outputTotal = $outputTotal + $log->price; //支出金額相加 } } // 檢查總計是否正確 if ($perform->output > 0) { if ($perform->output == $outputTotal) { Yii::app()->user->setFlash('success', '支出金額: ' . $perform->output . ' 與零用金明細金額: ' . $outputTotal . ' 吻合!'); } else { Yii::app()->user->setFlash('error', '支出金額: ' . $perform->output . ' 與零用金明細金額: ' . $outputTotal . ' 比對不吻合,重新輸入!!'); $valid = false; } } if ($valid) { // 先針對所有的資料,做一次加總,看看總和對不對 foreach ($array as $k => $log) { // 判斷資料是否已存在 if ($array[$k]->id != '') { $tbpLog = TbpOutputLog::model()->findByPk($array[$k]->id); if (isset($tbpLog)) { /* 不加下面這個 下面$array[$i]->save(FALSE)資料庫驗證會錯誤 */ $theSame = $array[$k]->compare($tbpLog); $array[$k]->isNewRecord = FALSE; //他是舊的,如果是true Yii會認為是新的create if (!$theSame) { $this->updateData($array[$k]); } } } else { // if($TbpOutputLog['id'] != '') $this->createData($array[$k]); } // 以 price、itemid 值判斷 if ($array[$k]->itemid != '' && $array[$k]->price > 0) { $valid = $array[$k]->validate() && $valid; if (!$valid) { $errMsg = $errMsg . '第' . ($k + 2) . '筆' . CVarDumper::dumpAsString($array[$k]->getErrors() . '<br>'); } } } if ($valid) { for ($i = 0; $i < count($array); $i++) { if (isset($array[$i]) && $array[$i]->price > 0 && $array[$i]->itemid != '') { $array[$i]->save(FALSE); } } } } if ($errMsg != '') { Yii::app()->user->setFlash('error', $errMsg); } } if ($valid) { $transaction->commit(); // Yii::app()->user->setFlash('success', "成功!"); } else { $transaction->rollback(); // Yii::app()->user->setFlash('error', $errMsg ."失敗!"); } } catch (Exception $e) { $transaction->rollback(); throw $e; } return $array; }