167 lines
5.8 KiB
PHP
167 lines
5.8 KiB
PHP
<?php
|
|
///////////////////////////////////////////////////
|
|
// UCO DAILY TARGET → ERP OUTBOX
|
|
///////////////////////////////////////////////////
|
|
//
|
|
// CRON (매일 08:00 실행 예정)
|
|
//
|
|
// 0 8 * * * /usr/local/bin/php -q /home/.../lib/runUcoTargetOutbox.php
|
|
// >> /home/.../lib/cronlog/`date +\%Y\%m\%d\%H\%M\%S`-cron-uco.log 2>&1
|
|
//
|
|
// 인자: [1] 대상일자 YYYYMMDD (선택, 미지정 시 오늘)
|
|
///////////////////////////////////////////////////
|
|
|
|
date_default_timezone_set('America/Toronto');
|
|
|
|
$time_start = microtime(true);
|
|
|
|
$mode = (PHP_SAPI === 'cli') ? "SHELL" : "WEB";
|
|
|
|
if ($mode == "SHELL") {
|
|
$GETDIR = dirname(__DIR__); // .../public_html (lib 의 상위)
|
|
$ENT = "\n";
|
|
putenv("DOCUMENT_ROOT=" . $GETDIR);
|
|
} else {
|
|
$GETDIR = getenv("DOCUMENT_ROOT");
|
|
$ENT = "<br>";
|
|
}
|
|
|
|
echo "####[START UCO TARGET OUTBOX]####{$ENT}";
|
|
|
|
include_once $GETDIR . "/include/function_class.php";
|
|
include_once $GETDIR . "/include/arrayinfo.php";
|
|
include_once $GETDIR . "/include/mysql_class_v7.php";
|
|
|
|
$func = new Func();
|
|
$jdb = new JDB();
|
|
|
|
///////////////////////////////////////////////////
|
|
// 대상 일자
|
|
///////////////////////////////////////////////////
|
|
$getDate = (isset($argv[1]) && preg_match('/^\d{8}$/', $argv[1]))
|
|
? $argv[1]
|
|
: date('Ymd');
|
|
|
|
$syncedAt = date('YmdHis');
|
|
|
|
$logName = $GETDIR . "/lib/access.log";
|
|
$func->PwriteLog($logName, "ACTION[Cron - Start - UCO Target Outbox for {$getDate}]");
|
|
|
|
echo "[TARGET DATE][$getDate]{$ENT}";
|
|
|
|
///////////////////////////////////////////////////
|
|
// tbl_daily 집계 (드라이버별 UCO 목표)
|
|
///////////////////////////////////////////////////
|
|
$qry = "
|
|
SELECT
|
|
d.d_druid AS driveruid,
|
|
COALESCE(SUM(d.d_estquantity), 0) AS target_qty,
|
|
COUNT(*) AS target_visit_cnt,
|
|
dr.dr_target_limit AS target_limit,
|
|
dr.dr_trip_qty AS trip_qty,
|
|
dr.dr_trip2_from AS trip2_from
|
|
FROM tbl_daily d
|
|
LEFT JOIN tbl_driver dr ON d.d_druid = dr.dr_uid
|
|
WHERE d.d_orderdate = '{$getDate}'
|
|
AND d.d_jobtype = 'UCO'
|
|
AND d.d_status <> 'D'
|
|
AND d.d_druid IS NOT NULL
|
|
AND d.d_druid <> ''
|
|
AND d.d_driveruid <> d.d_createruid
|
|
GROUP BY d.d_druid, dr.dr_target_limit, dr.dr_trip_qty, dr.dr_trip2_from
|
|
";
|
|
|
|
echo "[DAILY AGG QUERY][$qry]{$ENT}";
|
|
|
|
$result = $jdb->nQuery($qry, "uco daily aggregate query error");
|
|
|
|
$cnt = 0;
|
|
|
|
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
|
|
|
|
// 목표량 = 예측 합계. 드라이버별 조정(라이센스 상한 / 트립 모델) 적용
|
|
$rawQty = (float)$row['target_qty'];
|
|
$targetQty = $rawQty;
|
|
|
|
$limit = $row['target_limit']; // 최종 상한 T2 (NULL=무제한)
|
|
$tripQty = $row['trip_qty']; // 1트립 용량 T1
|
|
$trip2From = $row['trip2_from']; // 2트립 시작 임계 TH
|
|
|
|
$hasLimit = ($limit !== null && $limit !== '');
|
|
$hasTrip = ($tripQty !== null && $tripQty !== '' && $trip2From !== null && $trip2From !== '');
|
|
|
|
if ($hasTrip) {
|
|
// 단계형(2트립) 모델: T1=1트립 용량, TH=2트립 시작 임계, T2=최종 상한
|
|
$T1 = (float)$tripQty;
|
|
$TH = (float)$trip2From;
|
|
$T2 = $hasLimit ? (float)$limit : INF;
|
|
|
|
if ($rawQty <= $T1) {
|
|
$targetQty = $rawQty; // 1트립 이내 → 그대로
|
|
} elseif ($rawQty <= $TH) {
|
|
$targetQty = $T1; // 애매 구간 → 1트립으로 조정
|
|
} elseif ($rawQty <= $T2) {
|
|
$targetQty = $rawQty; // 2트립 진입 → 그대로
|
|
} else {
|
|
$targetQty = $T2; // 2트립 상한
|
|
}
|
|
} elseif ($hasLimit) {
|
|
// 단순 상한
|
|
if ($rawQty > (float)$limit) {
|
|
$targetQty = (float)$limit;
|
|
}
|
|
}
|
|
|
|
$payload = array(
|
|
"action" => "TARGET",
|
|
"after" => array(
|
|
"u_date" => $getDate,
|
|
"u_druid" => $row['driveruid'],
|
|
"u_target_qty" => $targetQty,
|
|
"u_target_visit_cnt" => (int)$row['target_visit_cnt'],
|
|
"u_synced_at" => $syncedAt,
|
|
"u_createruid" => "SYSTEM",
|
|
),
|
|
);
|
|
|
|
$payloadJson = addslashes(
|
|
json_encode($payload, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)
|
|
);
|
|
|
|
$qry_ins = "
|
|
INSERT INTO tbl_erp_outbox
|
|
(eo_entity_type, eo_action_type, eo_key1, eo_key2, eo_payload, eo_status, eo_retry_count)
|
|
VALUES
|
|
('UCO', 'CREATED', '{$row['driveruid']}', '{$getDate}', '{$payloadJson}', 'PENDING', 0)
|
|
";
|
|
|
|
$jdb->nQuery($qry_ins, "uco outbox insert error");
|
|
|
|
///////////////////////////////////////////////////
|
|
// 로컬 스냅샷 저장 (map.php 조회용) - UNIQUE(dut_date, dut_druid) UPSERT
|
|
///////////////////////////////////////////////////
|
|
$qry_snap = "
|
|
INSERT INTO tbl_daily_uco_target
|
|
(dut_date, dut_druid, dut_target_qty, dut_target_visit_cnt, dut_synced_at, dut_createruid)
|
|
VALUES
|
|
('{$getDate}', '{$row['driveruid']}', " . $targetQty . ", " . (int)$row['target_visit_cnt'] . ", '{$syncedAt}', 'SYSTEM')
|
|
ON DUPLICATE KEY UPDATE
|
|
dut_target_qty = VALUES(dut_target_qty),
|
|
dut_target_visit_cnt = VALUES(dut_target_visit_cnt),
|
|
dut_synced_at = VALUES(dut_synced_at),
|
|
dut_createruid = VALUES(dut_createruid)
|
|
";
|
|
|
|
$jdb->nQuery($qry_snap, "uco daily target snapshot upsert error");
|
|
|
|
echo "[QUEUED][driver:{$row['driveruid']}][qty:{$targetQty}][raw:{$rawQty}][limit:{$limit}][T1:{$tripQty}][TH:{$trip2From}][visit:{$row['target_visit_cnt']}]{$ENT}";
|
|
|
|
$cnt++;
|
|
}
|
|
|
|
$func->PwriteLog($logName, "SUCCESS[UCO Target Outbox] Date={$getDate}, Queued={$cnt}\n");
|
|
|
|
$time_end = microtime(true);
|
|
$timeStr = "Running Time: " . round(($time_end - $time_start), 2) . " sec";
|
|
|
|
echo "####[END UCO TARGET OUTBOX][queued:$cnt][$timeStr]####{$ENT}"; |