From a30a270443771870ab87db4a30bd6735d6cd29ad Mon Sep 17 00:00:00 2001 From: "altob.rd" Date: Mon, 18 Dec 2017 12:59:04 +0800 Subject: [PATCH] upd MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 移除備緩碼相關 2. 挑出重複入場記錄 log ( phase 1) 3. 調整 --- models/Carpayment_model.php | 173 +++++++++++++++++++++++++------------------- 1 file changed, 99 insertions(+), 74 deletions(-) diff --git a/models/Carpayment_model.php b/models/Carpayment_model.php index b43c43e..2f71296 100644 --- a/models/Carpayment_model.php +++ b/models/Carpayment_model.php @@ -28,11 +28,63 @@ class Carpayment_model extends CI_Model // 付款後, 付款資訊建檔 // //////////////////////////////////////// + + // [付款完成] 付款後續流程 + function payed_finished($cario_no, $lpr, $etag, $in_time) + { + trigger_error(__FUNCTION__ . "|$cario_no 付款完成|$lpr, $etag, $in_time|"); + + $in_time_value = strtotime($in_time); + $in_time_1 = date('Y-m-d H:i:s', $in_time_value + 1); // +1 sec + $in_time_2 = date('Y-m-d H:i:s', $in_time_value - 1); // -1 sec + $in_time_3 = date('Y-m-d H:i:s', $in_time_value + 2); // +2 sec + $in_time_4 = date('Y-m-d H:i:s', $in_time_value - 2); // -2 sec + + // 挑出已付款入場記錄, 入場時間附近 2 秒內, 但尚未結清之入場記錄 + $sql = "SELECT cario_no, obj_id as lpr, etag, in_time + FROM cario + WHERE in_time in ('$in_time', '$in_time_1', '$in_time_2', '$in_time_3', '$in_time_4') AND finished = 0 AND err = 0 + "; + $in_time_retults = $this->db->query($sql)->result_array(); + + if(!empty($in_time_retults) && count($in_time_retults) > 0) + { + $data = array(); + foreach ($in_time_retults as $idx => $rows) + { + $result_cario_no = $rows['cario_no']; + $result_lpr = $rows['lpr']; + $result_etag = $rows['etag']; + $result_in_time = $rows['in_time']; + + if(empty($result_lpr) || $result_lpr == 'NONE') + { + if(empty($result_etag) || $result_etag == 'NONE') + { + continue; // 跳過 無車牌 無ETAG + } + else if(strlen($result_etag) > 20 && $result_etag == $etag) + { + trigger_error('set_payed://' . "|時間ETAG相同|$cario_no, $lpr, $etag, $in_time|註記已繳費|$result_cario_no, $result_lpr, $result_etag, $result_in_time.."); + } + } + else + { + $levenshtein_value = levenshtein($result_lpr, $lpr); + if( $levenshtein_value == 0 || $levenshtein_value == 1) + { + trigger_error('set_payed://' . "|時間車牌相近|$cario_no, $lpr, $etag, $in_time|註記已繳費|$result_cario_no, $result_lpr, $result_etag, $result_in_time.."); + } + } + } + } + + } // 通知付款完成 public function p2payed($parms, $opay=false, $finished=false) { - $result = $this->db->select("in_time, cario_no, station_no") + $result = $this->db->select("in_time, cario_no, station_no, etag") ->from('cario') ->where(array('obj_type' => 1, 'obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0)) ->order_by('cario_no', 'desc') @@ -40,85 +92,58 @@ class Carpayment_model extends CI_Model ->get() ->row_array(); - // 查不到車號才找備援碼 - if(!isset($result['in_time']) && (is_numeric($parms['lpr']) && strlen($parms['lpr']) == 6)) + // 找不到記錄 + if(!isset($result['cario_no'])) { - $result = $this->db->select("in_time, cario_no, station_no") - ->from('cario') - ->where(array('obj_type' => 1, 'ticket_no' => $parms['lpr'], 'finished' => 0, 'err' => 0)) - ->order_by('cario_no', 'desc') - ->limit(1) - ->get() - ->row_array(); - - // 找不到記錄 - if(!isset($result['in_time'])) - { - trigger_error(__FUNCTION__ . '..not found..' . print_r($parms, true)); - return false; - } - - $in_time = new DateTime($result['in_time']); - $pay_time = new DateTime($parms['pay_time']); - - // 若間隔小於 15 分鐘, 拿現在時間來當付款時間 - $parms['pay_time'] = (($pay_time->getTimestamp() - $in_time->getTimestamp()) / 60 < 15) ? $this->now_str : $parms['pay_time']; - - if($opay) - { - // A. (備援碼)歐付寶 - $parms2 = array('seqno' => $result['cario_no'], 'amt' => $parms['amt'], 'lpr' => $parms['lpr']); - return $this->m2payed($parms2, $finished); - - } - else - { - // B. (備援碼)一般繳費機 - $data = array - ( - 'out_before_time' => date('Y-m-d H:i:s', strtotime("{$parms['pay_time']} + 15 minutes")), - 'pay_time' => $parms['pay_time'], - 'pay_type' => $parms['pay_type'], - 'payed' => 1 - ); - - // 是否註記完結 - if($finished) - $data['finished'] = 1; - - $this->db->where(array('cario_no' => $result['cario_no']))->update('cario', $data); - - if (!$this->db->affected_rows()) - { - trigger_error("(備援碼) 付款失敗:{$parms['lpr']}|{$data['out_before_time']}"); - return 'fail'; - } - - trigger_error("(備援碼) 付款後更新時間:{$parms['lpr']}|{$data['out_before_time']}"); - return 'ok'; - } + trigger_error(__FUNCTION__ . '..not found..' . print_r($parms, true)); + return false; } - // A. 歐付寶 if($opay) { - $parms2 = array('seqno' => $result['cario_no'], 'amt' => $parms['amt'], 'lpr' => $parms['lpr']); - return $this->m2payed($parms2, $finished); + $pay_time = date('Y-m-d H:i:s'); + $out_before_time = date('Y-m-d H:i:s', strtotime(" + 15 minutes")); + $pay_type = 4; + + $data = array + ( + 'out_before_time' => $out_before_time, + 'pay_time' => $pay_time, + 'pay_type' => 4, // 歐付寶行動支付 + 'payed' => 1 + ); + + // 是否註記完結 + if($finished) + $data['finished'] = 1; + + $this->db->where(array('cario_no' => $result['cario_no']))->update('cario', $data); + + if (!$this->db->affected_rows()) + { + trigger_error("歐付寶行動支付失敗,{$parms['lpr']}金額:{$parms['amt']},序號:{$parms['seqno']}"); + return 'fail'; + } + + trigger_error("歐付寶行動支付成功,{$parms['lpr']}金額:{$parms['amt']},序號:{$parms['seqno']}"); } else { - // B. 一般繳費機 - $in_time = new DateTime($result['in_time']); - $pay_time = new DateTime($parms['pay_time']); - // 若間隔小於 15 分鐘, 拿現在時間來當付款時間 - $parms['pay_time'] = (($pay_time->getTimestamp() - $in_time->getTimestamp()) / 60 < 15) ? $this->now_str : $parms['pay_time']; - + $pay_time = ((strtotime($result['pay_time']) - strtotime($result['in_time'])) / 60 < 15) ? $this->now_str : $parms['pay_time']; + + // 限時離場時間 + $out_before_time = date('Y-m-d H:i:s', strtotime("{$pay_time} + 15 minutes")); + + // 付款方式 + $pay_type = $parms['pay_type']; + + // B. 一般繳費機 $data = array ( - 'out_before_time' => date('Y-m-d H:i:s', strtotime("{$parms['pay_time']} + 15 minutes")), - 'pay_time' => $parms['pay_time'], - 'pay_type' => $parms['pay_type'], + 'out_before_time' => $out_before_time, + 'pay_time' => $pay_time, + 'pay_type' => $pay_type, 'payed' => 1 ); @@ -126,9 +151,7 @@ class Carpayment_model extends CI_Model if($finished) $data['finished'] = 1; - $this->db - ->where(array('obj_type' => 1, 'obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0)) - ->update('cario', $data); + $this->db->where(array('cario_no' => $result['cario_no']))->update('cario', $data); if (!$this->db->affected_rows()) { @@ -139,12 +162,14 @@ class Carpayment_model extends CI_Model trigger_error("付款後更新時間:{$parms['lpr']}|{$data['out_before_time']}|". print_r($data, true)); } + // 付款後續流程 + $this->payed_finished($result['cario_no'], $parms['lpr'], $result['etag'], $result['in_time']); + // 傳送付款更新記錄 $sync_agent = new AltobSyncAgent(); $sync_agent->init($result['station_no'], $result['in_time']); $sync_agent->cario_no = $result['cario_no']; // 進出編號 - $sync_result = $sync_agent->sync_st_pay($parms['lpr'], $parms['pay_time'], $parms['pay_type'], - date('Y-m-d H:i:s', strtotime("{$parms['pay_time']} + 15 minutes")), $finished); + $sync_result = $sync_agent->sync_st_pay($parms['lpr'], $pay_time, $pay_type, $out_before_time, $finished); trigger_error( "..sync_st_pay.." . $sync_result); return 'ok';