123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- <?php
- namespace refill;
- use Log;
- use trans_wapper;
- use Exception;
- class pdlog_clear
- {
- const pdlog_table_name = 'pd_log';
- const step_length = 200;
- public function clear($start_date, $end_date)
- {
- $lgid_getter = function ($start,$end)
- {
- $cond = ['lg_add_time' => [['egt', $start], ['lt',$end], 'and']];
- $item = Model()->table(self::pdlog_table_name)->field('min(lg_id) as minid,max(lg_id) as maxid')
- ->where($cond)->find();
- if(empty($item)) {
- return [false,0,0];
- }
- else {
- return [true,intval($item['minid']),intval($item['maxid'])];
- }
- };
- [$succ,$minid,$maxid] = $lgid_getter($start_date,$end_date);
- if($succ) {
- $this->delete_log($minid,$maxid);
- }
- return true;
- }
- private function delete_log($minid,$maxid)
- {
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- $mod_refill = Model('refill_order');
- $pd_log = Model();
- /// 一批一批的删除日志
- $batch_finder = function ($start, $end)
- {
- if($start > $end) return;
- $quit = false;
- while (!$quit)
- {
- $flag = $start + self::step_length > $end ? $end : $start + self::step_length;
- $cond = ['lg_id' => [['egt', $start], ['elt',$flag], 'and']];
- $items = Model()->table(self::pdlog_table_name)
- ->field('*')
- ->where($cond)
- ->order('lg_id asc')->select();
- if(!empty($items)) {
- yield $items;
- }
- if($flag >= $end) {
- break;
- }
- else {
- $start = $flag;
- }
- }
- };
- //return:1,可以直接删除,不需要存储; 2,不可以删除,3,检查后可以删除
- $batch_check_log = function ($log)
- {
- $sdate = date('Y-m-d H:i:s', $log['lg_add_time']);
- Log::record("{$sdate} lgid={$log['lg_id']},type={$log['lg_type']},sn={$log['lg_order_sn']}", Log::DEBUG);
- $logid = intval($log['lg_id']);
- $order_sn = $log['lg_order_sn'];
- $lgtype = $log['lg_type'];
- if (in_array($lgtype, ['bonus_add_money', 'hand_out_bonus', 'bonus_refund', 'bonus_expire'])) {
- return [1, $logid, $order_sn];
- }
- if (empty($order_sn) && strlen($order_sn) < 20) {
- return [2, false, false];
- }
- if (!in_array($lgtype, ['order_pay', 'order_freeze', 'order_cancel'])) {
- return [2, false, false];
- }
- return [3, $logid, $order_sn];
- };
- $batch_checker = function ($logs) use ($mod_refill,$batch_check_log)
- {
- $del_ids = [];
- $savers = [];
- $exist_logs = [];
- $sns = [];
- foreach ($logs as $log)
- {
- [$type,$logid,$order_sn] = $batch_check_log($log);
- if($type === 1) {
- $del_ids[] = $logid;
- }
- elseif($type === 3) {
- $exist_logs[$logid] = $log;
- $sns[] = $order_sn;
- }
- else {
- }
- }
- if(!empty($sns))
- {
- $sns = array_unique($sns);
- $orders = $mod_refill->table('refill_order')->field('order_sn')->where(['order_sn' => ['in', $sns]])->master(true)->select();
- $sn_sns = [];
- foreach ($orders as $item) {
- $sn = $item['order_sn'];
- $sn_sns[$sn] = $sn;
- }
- foreach ($exist_logs as $logid => $log)
- {
- $sn = $log['lg_order_sn'];
- if(!array_key_exists($sn,$sn_sns)) {
- $del_ids[] = $logid;
- $savers[] = $log;
- }
- }
- }
- return [$del_ids,$savers];
- };
- $batch_delter = function ($logids) use ($pd_log)
- {
- if (!empty($logids)) {
- $result = $pd_log->table(self::pdlog_table_name)->where(['lg_id' => ['in',$logids]])->delete();
- return $result;
- } else {
- return false;
- }
- };
- $batch_handler = function ($minid, $maxid, $fLog) use($batch_finder,$batch_checker,$batch_delter)
- {
- $batch_logs = $batch_finder($minid,$maxid);
- foreach ($batch_logs as $logs)
- {
- [$logids,$savers] = $batch_checker($logs);
- $batch_delter($logids);
- foreach ($savers as $item) {
- fputcsv($fLog,$item);
- }
- }
- };
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- $cur_time = time();
- $sdate = date('Y-m-d',time());
- $filename = BASE_DATA_PATH . "/log/pdlog/{$sdate}-{$cur_time}.csv";
- $fLog = fopen($filename,'w+');
- if (!$fLog) {
- return false;
- } else {
- $batch_handler($minid, $maxid, $fLog);
- fclose($fLog);
- return true;
- }
- }
- }
|