123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488 |
- <?php
- use PHPUnit\Framework\TestCase;
- define('APP_ID', 'test');
- define('BASE_ROOT_PATH', str_replace('/test', '', dirname(__FILE__)));
- require_once(BASE_ROOT_PATH . '/global.php');
- require_once(BASE_CORE_PATH . '/lrlz.php');
- require_once(BASE_ROOT_PATH . '/fooder.php');
- class TestRefillClear extends TestCase
- {
- public static function setUpBeforeClass(): void
- {
- Base::run_util();
- }
- //docker-compose run phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testClearFirstDay)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testClearFirstDay()
- {
- $start_date = strtotime($this->earlist_orderday());
- $end_date = $start_date + 86400;
- $this->clear($start_date,$end_date);
- }
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testEightMonth)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testEightMonth()
- {
- $start_date = strtotime('2021-08-01');
- $end_date = strtotime('2021-09-01');
- $this->clear($start_date,$end_date);
- }
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testNineMonth)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testNineMonth()
- {
- $start_date = strtotime('2021-09-05');
- $end_date = strtotime('2021-10-01');
- $this->clear($start_date,$end_date);
- }
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testTenMonth)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testTenMonth()
- {
- $start_date = strtotime('2021-10-20');
- $end_date = strtotime('2021-11-01');
- $this->clear($start_date,$end_date);
- }
- //8-9-10 已经处理
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testNovember1)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testNovember1()
- {
- $start_date = strtotime('2021-11-10');
- $end_date = strtotime('2021-11-13');
- $this->clear($start_date,$end_date);
- }
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testNovember2)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testNovember2()
- {
- $start_date = strtotime('2021-11-13');
- $end_date = strtotime('2021-11-16');
- $this->clear($start_date,$end_date);
- }
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testNovember3)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testNovember3()
- {
- $start_date = strtotime('2021-11-16');
- $end_date = strtotime('2021-11-20');
- $this->clear($start_date,$end_date);
- }
- //2012-12-28 执行清理
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testNovember4)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testNovember4()
- {
- $start_date = strtotime('2021-11-20');
- $end_date = strtotime('2021-11-23');
- $this->clear($start_date,$end_date);
- }
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testNovember5)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testNovember5()
- {
- $start_date = strtotime('2021-11-23');
- $end_date = strtotime('2021-11-25');
- $this->clear($start_date,$end_date);
- }
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testNovember6)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testNovember6()
- {
- $start_date = strtotime('2021-11-25');
- $end_date = strtotime('2021-11-26');
- $this->clear($start_date,$end_date);
- }
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testNovember7)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testNovember7()
- {
- $start_date = strtotime('2021-11-26');
- $end_date = strtotime('2021-11-27');
- $this->clear($start_date,$end_date);
- }
- //12-30执行
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testNovember8)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testNovember8()
- {
- $start_date = strtotime('2021-11-27');
- $end_date = strtotime('2021-11-29');
- $this->clear($start_date,$end_date);
- }
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testNovember9)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testNovember9()
- {
- $start_date = strtotime('2021-11-29');
- $end_date = strtotime('2021-11-30');
- $this->clear($start_date,$end_date);
- }
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testNovember10)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testNovember10()
- {
- $start_date = strtotime('2021-11-30');
- $end_date = strtotime('2021-12-01');
- $this->clear($start_date,$end_date);
- }
- private function clear($start_date, $end_date)
- {
- $order_finder = function ($start,$fp)
- {
- $end = $start + 3600;
- $cond = ['order_time&order_time' => ['_multi' => true, ['egt', $start], ['lt', $end]],
- 'inner_status' => 0];
- $i = 0;
- while (true)
- {
- $start = $i * 1000;
- $items = Model()->table('refill_order')
- ->field('mchid,mch_order,order_time')
- ->where($cond)
- ->order('order_time desc')->limit("{$start},1000")->select();
- $i++;
- if(empty($items)) break;
- foreach ($items as $item) {
- fputcsv($fp,$item);
- }
- }
- };
- $order_saver = function ($start,$file) use ($order_finder)
- {
- $fp = fopen($file,'w+');
- if($fp === false) {
- Log::record("Cannot open file {$file}.",Log::ERR);
- return false;
- }
- $end = $start + 86400;
- for ($hour = $start; $hour < $end; $hour += 3600) {
- $order_finder($hour,$fp);
- }
- fclose($fp);
- return $file;
- };
- $handle_days = function ($start_date, $end_date) use ($order_saver)
- {
- for ($date = $start_date; $date < $end_date; $date += 86400)
- {
- $sdate = date('Y-m-d',$date);
- $morder_file = BASE_DATA_PATH . "/log/order/{$sdate}-morder.csv";
- $check_file = BASE_DATA_PATH . "/log/order/{$sdate}-check.csv";
- $refill_file = BASE_DATA_PATH . "/log/order/{$sdate}-refill.csv";
- $vr_file = BASE_DATA_PATH . "/log/order/{$sdate}-vr.csv";
- $file = $order_saver($date,$morder_file);
- if($file === false) {
- Log::record("order_saver cannot open morder file.",Log::ERR);
- break;
- }
- $this->order_delete($file,$check_file,$refill_file,$vr_file);
- }
- };
- $handle_days($start_date, $end_date);
- }
- private function order_delete($file,$check_file,$refill_file,$vr_file)
- {
- $order_checker = function ($mchid,$mch_order,$order_time,$frefill,$fvr)
- {
- $mod_refill = Model('refill_order');
- $ritems = $mod_refill->table('refill_order')->field('*')
- ->where(['mchid' => $mchid, 'mch_order' => $mch_order,'order_time' => $order_time])
- ->order('order_id desc')
- ->limit(0,1000)->select();
- if(empty($ritems)) {
- return [false,'没查到记录.'];
- }
- elseif(count($ritems) === 1) {
- return [true,[]];
- }
- $ctimes = array_column($ritems,'commit_time');
- $upbound = max($ctimes);
- $lowbound = min($ctimes);
- if($lowbound < $order_time || $upbound < $order_time) {
- return [false,'提单时间小于接单时间'];
- }
- // $order_time = intval($ritems[0]['order_time']);
- // //检查下单时间是否一致。
- // foreach ($ritems as $item)
- // {
- // if($order_time != intval($item['order_time'])) {
- // return [false,'下单时间记录不一致'];
- // }
- // }
- $oids = [];
- $inner_state = [0 => 0 ,1 => 1];
- foreach ($ritems as $item) {
- $oids[] = $item['order_id'];
- $state = intval($item['inner_status']);
- $inner_state[$state] += 1;
- }
- //检查inner_status=0唯一。
- if($inner_state[0] != 1) {
- return [false,"inner_status=0 counts = {$inner_state[0]}"];
- }
- $mod_vr = Model('vr_order');
- $vitems = $mod_vr->table('vr_order')->field('*')
- ->where(['order_id' => ['in', $oids],
- 'add_time' => [['egt', $order_time], ['elt', $upbound], 'and']])
- ->order('order_id asc')->select();
- //检查refill 表记录和vr_order表记录是否一致
- if(count($ritems) !== count($vitems)) {
- return [false,'refill_orders != vr_orders'];
- }
- $order_state = [];
- foreach ($vitems as $item)
- {
- $state = intval($item['order_state']);
- if(!array_key_exists($state,$order_state)) {
- $order_state[$state] = 0;
- }
- $order_state[$state] += 1;
- }
- //检查一种订单只能有,成功或者失败状态.
- $vcount = count($vitems);
- if($vcount != $order_state[ORDER_STATE_SUCCESS] + $order_state[ORDER_STATE_CANCEL]) {
- return [false,'ORDER_STATE_SUCCESS + ORDER_STATE_CANCEL != order count.'];
- }
- elseif($order_state[ORDER_STATE_SUCCESS] > 1) {
- //成功订单只能小于等于1,否则为错误
- return [false,'ORDER_STATE_SUCCESS count > 1'];
- }
- else {
- foreach ($ritems as $item) {
- fputcsv($frefill,$item);
- }
- foreach ($vitems as $item) {
- fputcsv($fvr,$item);
- }
- }
- $inner_orders = [];
- foreach ($ritems as $item)
- {
- $status = intval($item['inner_status']);
- if($status === 1) {
- $inner_orders[] = $item['order_id'];
- }
- }
- return [true,$inner_orders];
- };
- $delter = function ($order_ids,$order_time)
- {
- $mod_refill = Model('refill_order');
- $mod_refill->table('refill_order')->where(['order_id' => ['in',$order_ids],'order_time' => $order_time])->delete();
- $mod_vr = Model('vr_order');
- $mod_vr->table('vr_order')->where(['order_id' => ['in',$order_ids]])->delete();
- };
- $fp = fopen($file,'r');
- if($fp === false) {
- return false;
- }
- $fcheck = fopen($check_file,'w+');
- if($fcheck === false) {
- fclose($fp);
- return false;
- }
- $frefill = fopen($refill_file,'w+');
- $fvr = fopen($vr_file,'w+');
- while(!feof($fp))
- {
- $trace = new scope_trace('order_clear');
- [$mchid, $mch_order, $order_time] = fgetcsv($fp);
- [$succ,$err] = $order_checker($mchid,$mch_order,$order_time,$frefill,$fvr);
- if($succ === false) {
- fputcsv($fcheck,[$mchid,$mch_order,$err]);
- }
- else {
- $order_ids = $err;
- if(!empty($order_ids)) {
- $delter($order_ids,$order_time);
- }
- }
- }
- fclose($fp);
- fclose($fcheck);
- fclose($frefill);
- fclose($fvr);
- }
- private function earlist_orderday()
- {
- $mod_refill = Model('refill_order');
- $item = $mod_refill->table('refill_order')->field('order_time')->order('order_id asc')->find();
- if(empty($item)) {
- return false;
- } else {
- $order_time = intval($item['order_time']);
- $day_stamp = date('Y-m-d',$order_time);
- return $day_stamp;
- }
- }
- public function testEarlist()
- {
- $time = $this->earlist_orderday();
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- /// 以下代码为清除pdlog
- const pdlog_table_name = 'pd_log_bak';
- //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testLogSeventh)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
- public function testLogSeventh()
- {
- $this->delete_log(74224997,strtotime('2021-09-01'));
- }
- private function delete_log($start_id,$endtime)
- {
- $lgid_getter = function ()
- {
- $lgid = rkcache('lastest_lgid');
- $lgid = intval($lgid);
- return $lgid;
- };
- $lgid_writter = function ($lgid)
- {
- wkcache('lastest_lgid',$lgid);
- };
- $maxid_getter = function () {
- $items = Model()->table(self::pdlog_table_name)->field('max(lg_id) as maxid')->select();
- return intval($items['0']['maxid']);
- };
- $finder = function ($start_id, $endtime, $maxid)
- {
- $start = $start_id;
- while (true)
- {
- if($start >= $maxid) break;
- $end = $start + 1000;
- $cond = ['lg_id' => [['egt', $start], ['lt',$end], 'and']];
- $items = Model()->table(self::pdlog_table_name)
- ->field('*')
- ->where($cond)
- ->order('lg_id asc')->select();
- foreach ($items as $item)
- {
- $add_time = intval($item['lg_add_time']);
- if($add_time >= $endtime){
- break;
- }
- yield $item;
- }
- $start = $end;
- }
- };
- $mod_refill = Model('refill_order');
- $checker = function ($log) use ($mod_refill)
- {
- $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']);
- $lgtype = $log['lg_type'];
- if (in_array($lgtype, ['bonus_add_money','hand_out_bonus', 'bonus_refund', 'bonus_expire'])) {
- return [$logid,false];
- }
- $order_sn = $log['lg_order_sn'];
- if(empty($order_sn) && strlen($order_sn) < 16) {
- return [false,false];
- }
- if (!in_array($lgtype, ['order_pay', 'order_freeze', 'order_cancel'])) {
- return [false,false];
- }
- $order = $mod_refill->table('refill_order')->field('*')->where(['order_sn' => $order_sn])->master(true)->find();
- if(empty($order)) {
- return [$logid,true];
- } else {
- return [false,false];
- }
- };
- $pd_log = Model();
- $delter = function ($logid) use ($pd_log)
- {
- if ($logid > 0) {
- $result = $pd_log->table(self::pdlog_table_name)->where(['lg_id' => $logid])->delete();
- return $result;
- } else {
- return false;
- }
- };
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- if($start_id === 0) {
- $start_id = $lgid_getter();
- }
- $cur_time = time();
- $sdate = date('Y-m-d',time());
- $filename = BASE_DATA_PATH . "/log/pdlog/{$sdate}-{$cur_time}.csv";
- $fLog = fopen($filename,'w+');
- $logid = $start_id;
- $maxid = $maxid_getter();
- $logs = $finder($start_id,$endtime,$maxid);
- foreach ($logs as $item)
- {
- [$logid,$save] = $checker($item);
- if($logid !== false) {
- $delter($logid);
- }
- if($save) {
- fputcsv($fLog,$item);
- }
- }
- $lgid_writter($logid);
- }
- }
|