> /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 = "
"; } 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}";