goiintra/public_html/lib/runForecast.20231106.php

751 lines
28 KiB
PHP

<?
///////////////////////////////////////////////////
// CRON
///////////////////////////////////////////////////
//
// Service 서버로 옮기기 전에 25 라인과 384 라인 DB Login 정보 수정할것
//
// /usr/local/bin/php -q /home/goiintra/public_html/lib/runForecast.php "0" "2000"
// /usr/local/bin/php -q /home2/ifreshy/public_html/goi/lib/runForecast.php "0" "2000"
// /usr/local/bin/php -q /home2/ifreshy/public_html/goi/lib/runForecast.php >> /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") {
//$GETDIR = "/home2/ifreshy/public_html/goi";
$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 = "<br>";
}
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 = "
<br>Hi<br><br>
Someone [".$_SERVER["HTTP_CLIENT_IP"]."] tried to run cron at ".$currentDate.".<br><br>";
$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;
for($i=0; $i<sizeof($list); $i++) {
//list($key, $value) = each($list);
foreach ( (Array) $list as $key => $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";
}
/////////////////////////////////////////////////////////
//
// 배열에 데이터가 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]<br>";
$emptyDiff ="";
}
//////////////////////////////
//
// cycle 강제 조정시 처리 로직
//
//////////////////////////////
if ($c_fullcycleflag == 1) {
// 날짜간 일수 계산
// c_forceddate 없으면 어제 일자로 계산
if ($c_forceddate == "") $c_forceddate = date('Ymd', strtotime("-1 days"));
$c_forceddateTmp = new DateTime($c_forceddate);
$getPeriodNowTmp = new DateTime('now');
$nowDiffTmp = $c_forceddateTmp->diff($getPeriodNowTmp);
$nowDiff = $nowDiffTmp->format('%r%a');
// 일일 오일량 계산
// 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);
// c_forceddate 이후에 pickup 한 경우가 있다면 이 날짜부터 누적 오일량 계산
$qry_n = "SELECT d_orderdate FROM tbl_daily
WHERE d_customeruid = '".$c_uid."' AND d_status = 'F'
AND d_orderdate >= '".$c_forceddate."'
ORDER BY d_orderdate DESC LIMIT 1";
$rt_n = $jdb->fQuery($qry_n, "list error");
$getPeriodPickup = $rt_n['d_orderdate'];
if ($getPeriodPickup != "") {
$getPeriodPickupTmp = new DateTime($getPeriodPickup);
$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 : LAST PICKUP DATA[".$getPeriodPickup."][PICKUPDIFF=$pickupDiff]$ENT";
$addCronLog .= "FORCED : LAST PICKUP DATA[".$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 [FORCEDDAY=$c_forceddate][LASTPICKUPDAY=$getPeriodPickup][PICKUPDIFF=$pickupDiff][[DAILYOIL=$dailyOil][NOWDIFF=$nowDiff][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$c_fullcycleforced][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]$ENT";
$addCronLog .= "[FORCEDDAY=$c_forceddate][LASTPICKUPDAY=$getPeriodPickup][PICKUPDIFF=$pickupDiff][[DAILYOIL=$dailyOil][NOWDIFF=$nowDiff][MAINVOL=$c_mainvolumeTmp][FULLCYCLE=$c_fullcycleforced][FULLDATE=$getFullCycleDate][FORECAST=$forecastOil]\n";
$addCronLog .= "[UPDATE=$qry_up]\n";
}
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]####";
?>
<?
class JDB {
VAR $HostName = ""; //server
VAR $UserName = ""; //User ID
VAR $UserPass = ""; //User Password
VAR $DBName = ""; //Database Name
VAR $DBConn=""; //Database Handler
/*
** Function : Constructor
** Input : Database Connection Information
** Output : None
*/
function __construct() {
// Test Server
/*
$DB_HOST = "localhost";
$DB_NAME = "ifreshy_goi";
$DB_USER = "ifreshy_goi";
$DB_PASSWORD = "L0C2CKN5GHHY";
*/
// Service Server
$DB_HOST = "localhost";
$DB_NAME = "goiintra_db";
$DB_USER = "goiintra_root";
$DB_PASSWORD = "L0C2CKN5GHHY";
$this->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)", "[ <i>$table</i> ] 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", "[ <i>$table</i> ] 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("<b>JDB Error Message !!</b><p>");
$msg=mysqli_errno($this->DBConn)." : ".mysqli_error($this->DBConn)."<p><b>User Message</b> :<br> ".$msg."<p><b>Query String</b> :<br> ".$query;
echo ("$msg");
exit;
}
}
?>