| @@ -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) | 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') | ->from('cario') | ||||
| ->where(array('obj_type' => 1, 'obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0)) | ->where(array('obj_type' => 1, 'obj_id' => $parms['lpr'], 'finished' => 0, 'err' => 0)) | ||||
| ->order_by('cario_no', 'desc') | ->order_by('cario_no', 'desc') | ||||
| @@ -40,85 +92,58 @@ class Carpayment_model extends CI_Model | |||||
| ->get() | ->get() | ||||
| ->row_array(); | ->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) | 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 | else | ||||
| { | { | ||||
| // B. 一般繳費機 | |||||
| $in_time = new DateTime($result['in_time']); | |||||
| $pay_time = new DateTime($parms['pay_time']); | |||||
| // 若間隔小於 15 分鐘, 拿現在時間來當付款時間 | // 若間隔小於 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 | $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 | 'payed' => 1 | ||||
| ); | ); | ||||
| @@ -126,9 +151,7 @@ class Carpayment_model extends CI_Model | |||||
| if($finished) | if($finished) | ||||
| $data['finished'] = 1; | $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()) | 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)); | 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 = new AltobSyncAgent(); | ||||
| $sync_agent->init($result['station_no'], $result['in_time']); | $sync_agent->init($result['station_no'], $result['in_time']); | ||||
| $sync_agent->cario_no = $result['cario_no']; // 進出編號 | $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); | trigger_error( "..sync_st_pay.." . $sync_result); | ||||
| return 'ok'; | return 'ok'; | ||||