pdlog_clear.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. namespace refill;
  3. use Log;
  4. use trans_wapper;
  5. use Exception;
  6. class pdlog_clear
  7. {
  8. const pdlog_table_name = 'pd_log';
  9. const step_length = 200;
  10. public function clear($start_date, $end_date)
  11. {
  12. $lgid_getter = function ($start,$end)
  13. {
  14. $cond = ['lg_add_time' => [['egt', $start], ['lt',$end], 'and']];
  15. $item = Model()->table(self::pdlog_table_name)->field('min(lg_id) as minid,max(lg_id) as maxid')
  16. ->where($cond)->find();
  17. if(empty($item)) {
  18. return [false,0,0];
  19. }
  20. else {
  21. return [true,intval($item['minid']),intval($item['maxid'])];
  22. }
  23. };
  24. [$succ,$minid,$maxid] = $lgid_getter($start_date,$end_date);
  25. if($succ) {
  26. $this->delete_log($minid,$maxid);
  27. }
  28. return true;
  29. }
  30. private function delete_log($minid,$maxid)
  31. {
  32. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. $mod_refill = Model('refill_order');
  34. $pd_log = Model();
  35. /// 一批一批的删除日志
  36. $batch_finder = function ($start, $end)
  37. {
  38. if($start > $end) return;
  39. $quit = false;
  40. while (!$quit)
  41. {
  42. $flag = $start + self::step_length > $end ? $end : $start + self::step_length;
  43. $cond = ['lg_id' => [['egt', $start], ['elt',$flag], 'and']];
  44. $items = Model()->table(self::pdlog_table_name)
  45. ->field('*')
  46. ->where($cond)
  47. ->order('lg_id asc')->select();
  48. if(!empty($items)) {
  49. yield $items;
  50. }
  51. if($flag >= $end) {
  52. break;
  53. }
  54. else {
  55. $start = $flag;
  56. }
  57. }
  58. };
  59. //return:1,可以直接删除,不需要存储; 2,不可以删除,3,检查后可以删除
  60. $batch_check_log = function ($log)
  61. {
  62. $sdate = date('Y-m-d H:i:s', $log['lg_add_time']);
  63. Log::record("{$sdate} lgid={$log['lg_id']},type={$log['lg_type']},sn={$log['lg_order_sn']}", Log::DEBUG);
  64. $logid = intval($log['lg_id']);
  65. $order_sn = $log['lg_order_sn'];
  66. $lgtype = $log['lg_type'];
  67. if (in_array($lgtype, ['bonus_add_money', 'hand_out_bonus', 'bonus_refund', 'bonus_expire'])) {
  68. return [1, $logid, $order_sn];
  69. }
  70. if (empty($order_sn) && strlen($order_sn) < 20) {
  71. return [2, false, false];
  72. }
  73. if (!in_array($lgtype, ['order_pay', 'order_freeze', 'order_cancel'])) {
  74. return [2, false, false];
  75. }
  76. return [3, $logid, $order_sn];
  77. };
  78. $batch_checker = function ($logs) use ($mod_refill,$batch_check_log)
  79. {
  80. $del_ids = [];
  81. $savers = [];
  82. $exist_logs = [];
  83. $sns = [];
  84. foreach ($logs as $log)
  85. {
  86. [$type,$logid,$order_sn] = $batch_check_log($log);
  87. if($type === 1) {
  88. $del_ids[] = $logid;
  89. }
  90. elseif($type === 3) {
  91. $exist_logs[$logid] = $log;
  92. $sns[] = $order_sn;
  93. }
  94. else {
  95. }
  96. }
  97. if(!empty($sns))
  98. {
  99. $sns = array_unique($sns);
  100. $orders = $mod_refill->table('refill_order')->field('order_sn')->where(['order_sn' => ['in', $sns]])->master(true)->select();
  101. $sn_sns = [];
  102. foreach ($orders as $item) {
  103. $sn = $item['order_sn'];
  104. $sn_sns[$sn] = $sn;
  105. }
  106. foreach ($exist_logs as $logid => $log)
  107. {
  108. $sn = $log['lg_order_sn'];
  109. if(!array_key_exists($sn,$sn_sns)) {
  110. $del_ids[] = $logid;
  111. $savers[] = $log;
  112. }
  113. }
  114. }
  115. return [$del_ids,$savers];
  116. };
  117. $batch_delter = function ($logids) use ($pd_log)
  118. {
  119. if (!empty($logids)) {
  120. $result = $pd_log->table(self::pdlog_table_name)->where(['lg_id' => ['in',$logids]])->delete();
  121. return $result;
  122. } else {
  123. return false;
  124. }
  125. };
  126. $batch_handler = function ($minid, $maxid, $fLog) use($batch_finder,$batch_checker,$batch_delter)
  127. {
  128. $batch_logs = $batch_finder($minid,$maxid);
  129. foreach ($batch_logs as $logs)
  130. {
  131. [$logids,$savers] = $batch_checker($logs);
  132. $batch_delter($logids);
  133. foreach ($savers as $item) {
  134. fputcsv($fLog,$item);
  135. }
  136. }
  137. };
  138. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  139. $cur_time = time();
  140. $sdate = date('Y-m-d',time());
  141. $filename = BASE_DATA_PATH . "/log/pdlog/{$sdate}-{$cur_time}.csv";
  142. $fLog = fopen($filename,'w+');
  143. if (!$fLog) {
  144. return false;
  145. } else {
  146. $batch_handler($minid, $maxid, $fLog);
  147. fclose($fLog);
  148. return true;
  149. }
  150. }
  151. }