> /home2/ifreshy/public_html/goi/lib/cronlog/`date +\%Y\%m\%d\%H\%M\%S`-cron.log 2>&1 // ifreshy 는 cron 22시면 실제 23시에 동작 // /////////////////////////////////////////////////// date_default_timezone_set('America/Toronto'); $time_start = microtime(true); $mode = "SHELL"; //$mode = "WEB"; if ($mode == "SHELL") { if(stristr(gethostname(), 'goiintranet.com') === FALSE) $GETDIR = "/home2/ifreshy/public_html/goi"; else $GETDIR = "/home/goiintra/public_html"; //$GETDIR = "/home/goiintra/public_html"; if ($argv[1] != "") $ROWCNT = trim($argv[1]); if ($argv[2] != "") $LIMITCNT = trim($argv[2]); $ENT = "\n"; } else { $GETDIR = getenv("DOCUMENT_ROOT"); $ROWCNT = $_GET['ROWCNT']; $LIMITCNT = $_GET['LIMITCNT']; $ENT = "
"; } if ($ROWCNT != "" && $LIMITCNT != "") $add_qry = " LIMIT $ROWCNT, $LIMITCNT"; else $add_qry = ""; // For Web (/home2/ifreshy/public_html/goi) include_once $GETDIR . "/include/function_class.php"; include_once $GETDIR . "/include/arrayinfo.php"; $func = new Func(); $jdb = new JDB(); $getForecastDay = date('Ymd', strtotime('-180 days')); // 포케스트 기간 $getForecastYear = date('Ymd', strtotime('-1 years')); // 데이터 없는 경우 1개 데이터 가져오는 기간 $getToday = date('Ymd'); //echo "[$getForecastDay][".$_SERVER["REMOTE_ADDR"]."]";exit; // For Monitoring $ToMail = 'iamchoi@gmail.com'; // For service monitoring $logName = $GETDIR."/lib/access.log"; $funcMsg = "ACTION[Cron - Start]"; $func -> PwriteLog($logName, $funcMsg); // Cron Result Log $setDIRNAME = $GETDIR."/lib/forecastlog/".date('Ym'); $setFILENAME = $setDIRNAME."/".date("YmdHis").".log"; if (!is_dir($setDIRNAME)) { mkdir($setDIRNAME, 0755, true); } touch($setFILENAME); $addCronLog = file_get_contents($setFILENAME); //////////////////// // Duplication Check //////////////////// /* $query = "select UID,CNT_NUMBER from tbl_cron where CNT_DATE = '$getToday' "; $result = $jdb->fQuery($query, "fetched query error"); if($result['UID'] == "") { $columns[] = "CNT_DATE"; $columns[] = "CNT_NUMBER"; $values[] = $getToday; $values[] = 1; $jdb->iQuery("tbl_cron", $columns, $values); //echo "[IN]"; } else { $currentDate = date("Y-m-d H:i:s"); $err_subject = "[NALOX-IT] Someone tried to run cron."; $err_mailCont = "
Hi

Someone [".$_SERVER["HTTP_CLIENT_IP"]."] tried to run cron at ".$currentDate.".

"; $func -> DsendMail("iamchoi@gmail.com", $FromMail, $err_subject, $err_mailCont, $attachments); // For Test //echo "[$err_mailCont]"; exit; } */ ////////////////////////////////////////// // Customer ID 별로 tbl_daily 의 6개월치 데이터를 조회 후 // 제일 오래된것의 일자를, 그이전것의 일자와 양... 최근것의 일자와 양을 찾아서 // 최근것의 일자 - 오래된것의 일자 = 기간 // 그이전것의 양부터 최근것의 양의 합 = 총량 // 총량 / 기간 = 일일 예상량 // 2023.10.24 : 200L 대신 c_mainvolume 으로 변경. 없는 경우 기본 200L // xxxx 200L 기준으로 해서 200 / 일일 예상량 = Cycle 산출 // strtotime (+cycle days) 예상 픽업일자 산출 // 업데이트 후 c_crontime 에 업데이트시간 저장 // // Batch 작업후 account No, R name, history data, 기간, 총량, 일일 예상량, cycle, 예상픽업일자 파일로그 저장 // ////////////////////////////////////////// // Customer ID 별로 tbl_daily 의 6개월치 데이터를 조회 $qry = "SELECT * FROM tbl_customer WHERE c_uid <> '' AND c_status = 'A' ORDER BY c_uid DESC ". $add_qry; $result = $jdb->nQuery($qry, "list error"); //echo "[$qry]$ENT"; $runcnt = 1; $emptyFlag = 0; while($list=mysqli_fetch_array($result, MYSQLI_ASSOC)) { $emptyFlag = 0; $nodataFLAG = 0; for($i=0; $i $value ) $$key = $value; } $oilData = array(); $qry_d_cnt = "SELECT COUNT(d_uid) FROM tbl_daily WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastDay."' AND d_quantity > 9 ORDER BY d_orderdate DESC"; $tot_d_cnt=$jdb->rQuery($qry_d_cnt, "record query error"); // 6개월동안 2개이상의 데이터가 존재하는 경우 // 6개월동안의 모든 데이터와 일자 계산 if ($tot_d_cnt > 1) { $qry_d = "SELECT d_customeruid, d_accountno, d_name, d_orderdate, d_quantity FROM tbl_daily WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastDay."' AND d_quantity > 1 ORDER BY d_orderdate DESC"; $rt_d = $jdb->nQuery($qry_d, "list error"); //echo "[$qry_d]$ENT"; $addCronLog .= "6M-DM[$qry_d]\n"; while($lt_d=mysqli_fetch_array($rt_d, MYSQLI_ASSOC)) { echo "6M-DM[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]$ENT"; $addCronLog .= "6M-DM[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n"; $oilDataAdd = array($lt_d['d_orderdate'] => $lt_d['d_quantity']); $oilData += $oilDataAdd; //var_dump($oilData); } } else if ($tot_d_cnt == 1) { // 6개월동안 1개의 데이터가 존재하는 경우 // Data 가 1개이고 install date 이 Forecasting day (6개월) 안에 존재하는 경우 // Install date 를 시작일자로 지정 if ($c_installdate != "" && $c_installdate != "N/A" && $c_installdate >= $getForecastDay) { /* $qry_d = "SELECT d_customeruid, d_accountno, d_name, d_orderdate, d_quantity FROM tbl_daily WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastDay."' AND d_quantity > 1 ORDER BY d_orderdate DESC"; $rt_d = $jdb->nQuery($qry_d, "list error"); //echo "[$qry_d]$ENT"; $addCronLog .= "6M-D1[$qry_d]\n"; while($lt_d=mysqli_fetch_array($rt_d, MYSQLI_ASSOC)) { echo "6M-IN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]$ENT"; $addCronLog .= "6M-IN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n"; $oilDataAdd = array($lt_d['d_orderdate'] => $lt_d['d_quantity']); $oilData += $oilDataAdd; //var_dump($oilData); } $oilData = array($c_installdate => 0); $oilData += $oilDataAdd; */ echo "6M-IN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]$ENT"; $addCronLog .= "6M-IN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n"; } // Data 가 1개이고 install date 이 없는 경우 Contract date 를 시작일자로 지정 // Contract date 이 Forecasting day (6개월) 안에 존재하는 경우 else if ($c_installdate == "" && $c_contractdate >= $getForecastDay) { /* $qry_d = "SELECT d_customeruid, d_accountno, d_name, d_orderdate, d_quantity FROM tbl_daily WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastDay."' AND d_quantity > 1 ORDER BY d_orderdate DESC"; $rt_d = $jdb->nQuery($qry_d, "list error"); //echo "[$qry_d]$ENT"; $addCronLog .= "6M-CN[$qry_d]\n"; while($lt_d=mysqli_fetch_array($rt_d, MYSQLI_ASSOC)) { echo "6M-CN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]$ENT"; $addCronLog .= "6M-CN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n"; $oilDataAdd = array($lt_d['d_orderdate'] => $lt_d['d_quantity']); $oilData += $oilDataAdd; } $oilData = array($c_contractdate => 0); $oilData += $oilDataAdd; */ echo "6M-CN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]$ENT"; $addCronLog .= "6M-CN[CNT=$runcnt][6MCNT=$tot_d_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n"; } else { // 6개월동안 데이터가 1개만 존재해서 최근 1년치로 데이터를 조회하고 최근 1개를 가져옴 $qry_y_cnt = "SELECT COUNT(d_uid) FROM tbl_daily WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastYear."' AND d_quantity > 1 ORDER BY d_orderdate DESC LIMIT 2"; $tot_y_cnt=$jdb->rQuery($qry_y_cnt, "record query error"); //echo "1Y[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."]".$ENT; // 최근 1년간 데이터가 1개만 존재한다면 Forecasting 에는 보이지 않음 if ($tot_y_cnt <= 1) { echo "1Y-D0[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."]$ENT"; $addCronLog .= "1Y-D0[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."]\n"; } // 데이터가 2인 경우만 Forecasting 에 보여줌 else { $qry_d = "SELECT d_customeruid, d_accountno, d_orderdate, d_quantity FROM tbl_daily WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getForecastYear."' AND d_quantity > 1 ORDER BY d_orderdate DESC LIMIT 2"; $rt_d = $jdb->nQuery($qry_d, "list error"); //echo "[$qry_d]$ENT"; $addCronLog .= "1Y-D2[$qry_d]\n"; while($lt_d=mysqli_fetch_array($rt_d, MYSQLI_ASSOC)) { echo "1Y-D2[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]".$ENT; $addCronLog .= "1Y-D2[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$lt_d['d_customeruid']."][ACCOUNTNO=".$lt_d['d_accountno']."][INSTALLDATE=".$c_installdate."][ORDDATE=".$lt_d['d_orderdate']."][QTY=".$lt_d['d_quantity']."]\n"; $oilDataAdd = array($lt_d['d_orderdate'] => $lt_d['d_quantity']); $oilData += $oilDataAdd; } } } } else { // // 6개월동안 데이터가 없는 경우 echo "NO-D0[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."]$ENT"; $addCronLog .= "NO-D0[CNT=$runcnt][6MCNT=$tot_d_cnt][1YCNT=$tot_y_cnt][CUID=".$c_uid."][ACCOUNTNO=".$c_accountno."][INSTALLDATE=".$c_installdate."][CONTRACTDATE=".$c_contractdate."]\n"; $nodataFLAG = 1; } ///////////////////////////////////////////////////////// // // 배열에 데이터가 2개 이상 저장된 경우 & Cycle 을 강제로 수정하지 않은 경우 // Forecasting 시작 // ///////////////////////////////////////////////////////// if (count($oilData) >= 2 && $c_fullcycleflag == 0) { $oilDataCnt = 1; $oilSum = 0; krsort($oilData); // descending sort foreach ($oilData as $key => $value) { echo "\t OIL DATA[$key][$value]$ENT"; $addCronLog .= "OIL DATA[$key][$value]\n"; //$getPeriodEnd = ; //$getPeriodStart = ; if ($oilDataCnt == 1) $getPeriodEnd = $key; else if ($oilDataCnt == count($oilData)) $getPeriodStart = $key; if ($oilDataCnt != count($oilData)) $oilSum += $value; $oilDataCnt++; } // 날짜간 일수 계산 $getPeriodStartTmp = new DateTime($getPeriodStart); $getPeriodEndTmp = new DateTime($getPeriodEnd); $getPeriodNowTmp = new DateTime('now'); $dDiffTmp = $getPeriodStartTmp->diff($getPeriodEndTmp); $dDiff = $dDiffTmp->format('%r%a'); $nowDiffTmp = $getPeriodEndTmp->diff($getPeriodNowTmp); $nowDiff = $nowDiffTmp->format('%r%a'); // 버림 계산 //$dailyOil = floor($oilSum/$dDiff); // 올림 계산 //$dailyOil = ceil($oilSum/$dDiff); // 소숫점 1자리까지 보여줌. 반올림 계산 $dailyOil = round($oilSum/$dDiff, 1); if ($dailyOil > 0) { // 맨 최근것 중에 9보다 작은것이 있는지 확인. // 있다면 d_orderdate 가져와서 현재일과 차이를 계산하고 c_fullquantity 를 계산해줌 $qry_n = "SELECT d_orderdate FROM tbl_daily WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' AND d_orderdate >= '".$getPeriodEnd."' AND d_quantity <= 9 ORDER BY d_orderdate DESC LIMIT 1"; $rt_n = $jdb->fQuery($qry_n, "list error"); $getPeriodEmpty = $rt_n['d_orderdate']; if ($getPeriodEmpty != "") { $emptyFlag = 1; $getPeriodEmptyTmp = new DateTime($getPeriodEmpty); $emptyDiffTmp = $getPeriodEmptyTmp->diff($getPeriodNowTmp); $emptyDiff = $emptyDiffTmp->format('%r%a'); // 내일 일자의 Forecast 이 필요하므로 d_quantity <= 9 인 일자부터 현재까지의 일수+1 함 $forecastOil = round($dailyOil * ($emptyDiff+1)); echo "\t EMPTY DATA[".$getPeriodEmpty."][EMPTYDIFF=$emptyDiff]$ENT"; $addCronLog .= "EMPTY DATA[".$getPeriodEmpty."][EMPTYDIFF=$emptyDiff]\n"; } else { // 내일 일자의 Forecast 이 필요하므로 일수+1 함 $forecastOil = round($dailyOil * ($nowDiff+1)); } // xx 200L Full Cycle 처리, 버림 계산 // 2023.10.22 200L 대신 $c_mainvolume 사용. 소숫점 아래 계산하도록 수정 // $c_mainvolume 없는 경우 기본 200 으로 처리 //$getCycle = floor(200/$dailyOil); if ($c_mainvolume != "" && (float)$c_mainvolume != 0) $c_mainvolumeTmp = $c_mainvolume; else $c_mainvolumeTmp = 200; $getCycle = ($c_mainvolumeTmp/$dailyOil); //$getCycleTmp = "+".$getCycle." days"; $getCycleTmp = "+".round($getCycle)." days"; if ($emptyFlag == 1) $getFullCycleDate = date('Ymd', strtotime($getCycleTmp, strtotime($getPeriodEmpty))); else $getFullCycleDate = date('Ymd', strtotime($getCycleTmp, strtotime($getPeriodEnd))); } else { $forecastOil = 0; $getCycle = 0; $getFullCycleDate = ""; } $qry_up = "UPDATE tbl_customer SET c_fullcycle='".$getCycle."',c_fullquantity='".$forecastOil."', c_fullquantitydaily='".$dailyOil."', c_fullquantitydate='".$getFullCycleDate."', c_crondate='".date("YmdHis")."' WHERE c_uid = '$c_uid' "; $jdb->nQuery($qry_up, "update error"); //$jdb->CLOSE(); echo "\t [ENDDAY=$getPeriodEnd][STARTDAY=$getPeriodStart][EMPTYDIFF=$emptyDiff][SUM=$oilSum][[DAILYOIL=$dailyOil][DAYDIFF=$dDiff][NOWDIFF=$nowDiff][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$getCycle][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]$ENT"; $addCronLog .= "[ENDDAY=$getPeriodEnd][STARTDAY=$getPeriodStart][EMPTYDIFF=$emptyDiff][SUM=$oilSum][[DAILYOIL=$dailyOil][DAYDIFF=$dDiff][NOWDIFF=$nowDiff][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$getCycle][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]\n"; $addCronLog .= "[UPDATE=$qry_up]\n"; //$new_key = min(array_keys($oilData)); //$new_val = $oilData[$new_key]; //$mnew_key = max(array_keys($oilData)); //$mnew_val = $oilData[$mnew_key]; //echo"[KEY=$new_key][VAL=$new_val][MAXKEY=$mnew_key][MAXVAL=$mnew_val]
"; $emptyDiff =""; } ///////////////////////////////////////////////////////////////////////// // // cycle 강제 조정시 처리 로직 // xx 6개월동안 데이터가 존재하는 경우 // 제일 마지막 오일 픽업일자부터 계산. dailyOil = c_mainvolume / forced cycle // 없는 경우 계약일 // ///////////////////////////////////////////////////////////////////////// if ($c_fullcycleflag == 1) { // 일일 오일량 계산 // customer or forecast 에서 cycle 강제 조정시 dailyOil = c_mainvolume / forced cycle if ($c_mainvolume != "" && (float)$c_mainvolume != 0) $c_mainvolumeTmp = $c_mainvolume; else $c_mainvolumeTmp = 200; $dailyOil = ($c_mainvolumeTmp/$c_fullcycleforced); // 맨 최근 Oil Pickup Data 가져옴. 없다면 Contract Date 가져옴 $qry_n = "SELECT d_orderdate FROM tbl_daily WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' ORDER BY d_orderdate DESC LIMIT 1"; $rt_n = $jdb->fQuery($qry_n, "list error"); if ($rt_n['d_orderdate'] == "") { $getPeriodPickup = $c_contractdate; $contractFLAG = "CONTRACTDATE"; } else { $getPeriodPickup = $rt_n['d_orderdate']; $contractFLAG = "LASTPICKUPDATE"; } // 날짜간 일수 계산 //$getPeriodPickup = new DateTime($getPeriodPickup); //$getPeriodNowTmp = new DateTime('now'); //$nowDiffTmp = $getPeriodPickup->diff($getPeriodNowTmp); //$nowDiff = $nowDiffTmp->format('%r%a'); if ($getPeriodPickup != "") { // 날짜간 일수 계산 $getPeriodPickupTmp = new DateTime($getPeriodPickup); $getPeriodNowTmp = new DateTime('now'); $pickupDiffTmp = $getPeriodPickupTmp->diff($getPeriodNowTmp); $pickupDiff = $pickupDiffTmp->format('%r%a'); // 내일 일자의 Forecast 이 필요하므로 현재까지의 일수+1 함 $forecastOil = round($dailyOil * ($pickupDiff+1)); $getCycleTmp = "+".round($c_fullcycleforced)." days"; $getFullCycleDate = date('Ymd', strtotime($getCycleTmp, strtotime($getPeriodPickup))); echo "\t FORCED : [".$contractFLAG."=".$getPeriodPickup."][PICKUPDIFF=$pickupDiff]$ENT"; $addCronLog .= "FORCED : [".$contractFLAG."=".$getPeriodPickup."][PICKUPDIFF=$pickupDiff]\n"; } else { // 내일 일자의 Forecast 이 필요하므로 일수+1 함 //$forecastOil = round($dailyOil * ($nowDiff+1)); //$getCycleTmp = "+".round($c_fullcycleforced)." days"; //$getFullCycleDate = date('Ymd', strtotime($getCycleTmp, strtotime($c_forceddate))); } // c_fullcycle 은 업데이트 하지 않음 $qry_up = "UPDATE tbl_customer SET c_fullquantity='".$forecastOil."', c_fullquantitydaily='".$dailyOil."', c_fullquantitydate='".$getFullCycleDate."', c_crondate='".date("YmdHis")."' WHERE c_uid = '$c_uid' "; $jdb->nQuery($qry_up, "update error"); //$jdb->CLOSE(); echo "\t [[DAILYOIL=$dailyOil][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$c_fullcycleforced][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]$ENT"; $addCronLog .= "[[DAILYOIL=$dailyOil][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$c_fullcycleforced][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]\n"; $addCronLog .= "[UPDATE=$qry_up]\n"; } ///////////////////////////////////////////////////////////////////////// // // 6개월안에 실데이터가 없고 마지막 오일픽업이 9이하인 경우 // 9이하인 일자부터 오일량 새로 계산 // 존재하는 dailyquantity 를 가져와서 누적 계산 // 없으면 forecast하지 않음 // ///////////////////////////////////////////////////////////////////////// if ($nodataFLAG == 1 && $c_fullcycleflag == 0) { if ((float)$c_fullquantitydaily != 0) { // 맨 최근것 중에 9보다 작은것이 있는지 확인. // 있다면 d_orderdate 가져와서 현재일과 차이를 계산하고 c_fullquantity 를 계산해줌 $qry_n = "SELECT d_orderdate, d_quantity FROM tbl_daily WHERE d_customeruid = '".$c_uid."' AND d_status = 'F' ORDER BY d_orderdate DESC LIMIT 1"; $rt_n = $jdb->fQuery($qry_n, "list error"); $getPeriodPickup = $rt_n['d_orderdate']; $d_quantityTmp = $rt_n['d_quantity']; $getPeriodNowTmp = new DateTime('now'); $dailyOil = $c_fullquantitydaily; if ($getPeriodPickup != "") { if ($d_quantityTmp <= 9) { // 픽업오일량이 9이하인 경우 픽업다음일부터 누적 $emptyFlag = 1; $getPeriodPickupTmp = new DateTime($getPeriodPickup); $emptyDiffTmp = $getPeriodPickupTmp->diff($getPeriodNowTmp); $emptyDiff = $emptyDiffTmp->format('%r%a'); // 내일 일자의 Forecast 이 필요하므로 d_quantity <= 9 인 일자부터 현재까지의 일수+1 함 $forecastOil = round($dailyOil * ($emptyDiff+1)); echo "\t NO/EMPTY DATA[".$getPeriodPickup."][EMPTYDIFF=$emptyDiff]$ENT"; $addCronLog .= "NO/EMPTY DATA[".$getPeriodPickup."][EMPTYDIFF=$emptyDiff]\n"; } else { // 픽업오일량이 9이상인 경우 픽업다음일부터 누적 $emptyFlag = 1; $getPeriodPickupTmp = new DateTime($getPeriodPickup); $emptyDiffTmp = $getPeriodPickupTmp->diff($getPeriodNowTmp); $emptyDiff = $emptyDiffTmp->format('%r%a'); // 내일 일자의 Forecast 이 필요하므로 d_quantity <= 9 인 일자부터 현재까지의 일수+1 함 $forecastOil = round($dailyOil * ($emptyDiff+1)); echo "\t NO/LAST DATA[".$getPeriodPickup."][LASTDIFF=$emptyDiff]$ENT"; $addCronLog .= "NO/LAST DATA[".$getPeriodPickup."][LASTDIFF=$emptyDiff]\n"; } $getCycleTmp = "+".round($c_fullcycle)." days"; $getFullCycleDate = date('Ymd', strtotime($getCycleTmp, strtotime($getPeriodPickup))); // c_fullcycle 은 업데이트 하지 않음 $qry_up = "UPDATE tbl_customer SET c_fullquantity='".$forecastOil."', c_fullquantitydaily='".$dailyOil."', c_fullquantitydate='".$getFullCycleDate."', c_crondate='".date("YmdHis")."' WHERE c_uid = '$c_uid' "; $jdb->nQuery($qry_up, "update error"); //$jdb->CLOSE(); echo "\t [[DAILYOIL=$dailyOil][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$c_fullcycle][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]$ENT"; $addCronLog .= "[[DAILYOIL=$dailyOil][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$c_fullcycle][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]\n"; $addCronLog .= "[UPDATE=$qry_up]\n"; } else { // 픽업이 한번도 없었으면 forecasting 하지 않음 } } else { // dailyquantity 없으면 forecasting 하지 않음 } } unset($oilData); unset($oilDataAdd); //if ($runcnt ==500) break; $runcnt++; $addCronLog .= "=============================================================\n"; } // 오더장 생성후 픽업하지 않은 경우 리셋처리 // c_orderdate이 Cron 동작일보다 작고 c_orderflag = 1 이면 픽업하지 않은것이므로 // c_orderdate = "", c_orderflag = 0 으로 셋팅 // c_orderflag = 0 이 되어야 forecast 검색 가능함 $qry_customer = "UPDATE tbl_customer SET c_orderdate='', c_orderflag = 0 WHERE c_orderdate < '".date("Ymd")."'"; $jdb->nQuery($qry_customer, "update error"); $addCronLog .= $qry_customer."\n"; file_put_contents($setFILENAME, $addCronLog, FILE_APPEND); // For service monitoring $logName = $GETDIR."/lib/access.log"; $funcMsg = "ACTION[Cron - Finished]\n"; $func -> PwriteLog($logName, $funcMsg); $time_end = microtime(true); $timeStr = "Running Time: ".($time_end - $time_start); echo "####[END][$timeStr]####"; ?> HostName=$DB_HOST; $this->UserName=$DB_USER; $this->UserPass=$DB_PASSWORD; $this->DBName=$DB_NAME; $this->CONNECT(); } /* ** Function : Connect ** Input : None ** Output : None */ function CONNECT() { $this->DBConn=mysqli_connect($this->HostName, $this->UserName, $this->UserPass, $this->DBName); if (!$this->DBConn) //연결실패 $this->errMsg("Database Connection Error !!!", ""); else //연결성공 if (!(mysqli_select_db($this->DBConn, $this->DBName))) //Database 선택 실패 $this->errMsg("Database Select Error !!!", ""); mysqli_query($this->DBConn, "SET NAMES UTF8"); //mysqli_query($this->DBConn, "SET NAMES latin1"); //mysqli_query($this->DBConn, "SET NAMES EUC-KR"); } /* ** Function : nQuery ** Input : Query String, Error Message ** Output : Recordset ** Descript : mysql_query() */ function nQuery($query, $msg) { if (!($rlt=mysqli_query($this->DBConn, $query))) $this->errMsg($msg, $query); return $rlt; } /* ** Function : rQuery ** Input : Query string, Error message ** Output : Record ** Descript : mysql_result() ** 이부분은 mysql_fetch_arrary와 비슷하지만 가끔씩 쓰일때가 많아서요..넣었습니다. */ function mysqli_result($res,$row=0,$col=0){ $numrows = mysqli_num_rows($res); if ($numrows && $row <= ($numrows-1) && $row >=0){ mysqli_data_seek($res,$row); $resrow = (is_numeric($col)) ? mysqli_fetch_row($res) : mysqli_fetch_assoc($res); if (isset($resrow[$col])){ return $resrow[$col]; } } return false; } function rQuery($query, $msg) { if (!($rlt=mysqli_query($this->DBConn, $query))) $this->errMsg($msg, $query); return $this->mysqli_result($rlt, 0, 0); } /* ** Function : fQuery ** Input : Query string, Error message ** Output : Fetched array ** Descript : mysql_fetch_array() ** 레코드셋에서 맨 첫번째 레코드를 array로 리턴해줍니다. ** 하나의 레코드셋에서 이함수를 여러번 적용한다면.. ** 자동으로 다음 레코드로 넘어가겠죠 ??? */ function fQuery($query, $msg) { if (!($rlt=mysqli_query($this->DBConn, $query))) $this->errMsg($msg, $query); return mysqli_fetch_array($rlt); } /* ** Function : numQuery ** Input : Query string, Error message ** Output : The number of rows ** Descript : mysql_num_rows() */ function numQuery($query, $msg) { if(!($rlt=mysqli_query($this->DBConn, $query))) $this->errMsg($msg, $query); return mysqli_num_rows($rlt); } /* ** Function : iQuery ** Input : Table name, arrayed fields, arrayed values ** Output : None ** Descript : Input arrayed data */ function iQuery($table, $fields, $values) { $fields_count=count($fields); // fileds 배열의 갯수 추출 $values_count=count($values); // values 배열의 갯수 추출 // fields와 values 갯수가 맞지않을 경우 0을 return // 혹 프로그래밍 상에서 실수가 발생했을 경우 사용하기 위해 if($fields_count != $values_count) $this->errMsg("Input Data Error.", "Fields # : $fields_count, Value # : $values_count"); for ($i=0; $i < $fields_count; $i++) { // 입력된 fields와 values를 이용 퀴리 생성 if (0 < $i) { // fields와 values가 2개 이상일 경우 , 자동 입력 $fields_que.=","; $values_que.=","; } $fields_que.=$fields[$i]; // fields에 해당하는 쿼리 $values_que.="'".addslashes($values[$i])."'"; // values에 해당하는 쿼리 } $this->nQuery("insert into $table ($fields_que) values ($values_que)", "[ $table ] Table Input Error"); } /* ** Function : uQuery ** Input : Table name, arrayed fields, arrayed values, where ** Output : None ** Descript : update arrayed data */ function uQuery($table, $fields, $values, $where="") { if(is_array($fields) & is_array($values)) { // fields와 values가 배열일 경우 $fields_count=count($fields); // fileds 배열의 갯수 추출 $values_count=count($values); // values 배열의 갯수 추출 // fields와 values 갯수가 맞지않을 경우 0을 return // 혹 프로그래밍 상에서 실수가 발생했을 경우 사용하기 위해 if ($fields_count != $values_count) $this->errMsg("Input Data Error.", "Fields # : $fields_count, Value # : $values_count"); for ($i=0; $i < $fields_count; $i++) { // insert와 달리 sub쿼리를 이용 if (0 < $i) $sub_que.=","; $sub_que.=$fields[$i]."='".addslashes($values[$i])."'"; // 서브 쿼리 생성 } } else if (!is_array($fields) & !is_array($values)) // fields와 values가 배열이 아닐 경우 $sub_que=" ".$fields."='".addslashes($values)."' "; else $this->errMsg("Input Data Error.", "Fields # : $fields_count, Value # : $values_count"); if($where) $sub_que.=" ".$where; // where 쿼리가 존재할 경우 입력 $this->nQuery("update $table set $sub_que", "[ $table ] Table Input Error"); } /* ** Function : CLOSE ** Input : None ** Output : None ** Descript : mysql_close() */ function CLOSE() { mysqli_close($this->DBConn); $this->DELETE(); } /* ** Function : DELETE ** Input : None ** Output : None ** Descript : Member variable unset */ function DELETE() { unset($this->DBConn); unset($this->UserName); unset($this->UserPass); unset($this->HostName); unset($this->DBName); } //Print Error Message and Exit function errMsg($msg, $query) { echo("JDB Error Message !!

"); $msg=mysqli_errno($this->DBConn)." : ".mysqli_error($this->DBConn)."

User Message :
".$msg."

Query String :
".$query; echo ("$msg"); exit; } } ?>