TestRefillClear.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. <?php
  2. use PHPUnit\Framework\TestCase;
  3. define('APP_ID', 'test');
  4. define('BASE_ROOT_PATH', str_replace('/test', '', dirname(__FILE__)));
  5. require_once(BASE_ROOT_PATH . '/global.php');
  6. require_once(BASE_CORE_PATH . '/lrlz.php');
  7. require_once(BASE_ROOT_PATH . '/fooder.php');
  8. class TestRefillClear extends TestCase
  9. {
  10. public static function setUpBeforeClass(): void
  11. {
  12. Base::run_util();
  13. }
  14. //docker-compose run phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testClearFirstDay)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
  15. public function testClearFirstDay()
  16. {
  17. $start_date = strtotime($this->earlist_orderday());
  18. $end_date = $start_date + 86400;
  19. $this->clear($start_date,$end_date);
  20. }
  21. //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
  22. public function testEightMonth()
  23. {
  24. $start_date = strtotime('2021-08-01');
  25. $end_date = strtotime('2021-09-01');
  26. $this->clear($start_date,$end_date);
  27. }
  28. //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
  29. public function testNineMonth()
  30. {
  31. $start_date = strtotime('2021-09-05');
  32. $end_date = strtotime('2021-10-01');
  33. $this->clear($start_date,$end_date);
  34. }
  35. //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
  36. public function testTenMonth()
  37. {
  38. $start_date = strtotime('2021-10-20');
  39. $end_date = strtotime('2021-11-01');
  40. $this->clear($start_date,$end_date);
  41. }
  42. //8-9-10 已经处理
  43. //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
  44. public function testNovember1()
  45. {
  46. $start_date = strtotime('2021-11-10');
  47. $end_date = strtotime('2021-11-13');
  48. $this->clear($start_date,$end_date);
  49. }
  50. //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
  51. public function testNovember2()
  52. {
  53. $start_date = strtotime('2021-11-13');
  54. $end_date = strtotime('2021-11-16');
  55. $this->clear($start_date,$end_date);
  56. }
  57. //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
  58. public function testNovember3()
  59. {
  60. $start_date = strtotime('2021-11-16');
  61. $end_date = strtotime('2021-11-20');
  62. $this->clear($start_date,$end_date);
  63. }
  64. //2012-12-28 执行清理
  65. //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
  66. public function testNovember4()
  67. {
  68. $start_date = strtotime('2021-11-20');
  69. $end_date = strtotime('2021-11-23');
  70. $this->clear($start_date,$end_date);
  71. }
  72. //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
  73. public function testNovember5()
  74. {
  75. $start_date = strtotime('2021-11-23');
  76. $end_date = strtotime('2021-11-25');
  77. $this->clear($start_date,$end_date);
  78. }
  79. //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
  80. public function testNovember6()
  81. {
  82. $start_date = strtotime('2021-11-25');
  83. $end_date = strtotime('2021-11-26');
  84. $this->clear($start_date,$end_date);
  85. }
  86. //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
  87. public function testNovember7()
  88. {
  89. $start_date = strtotime('2021-11-26');
  90. $end_date = strtotime('2021-11-27');
  91. $this->clear($start_date,$end_date);
  92. }
  93. //12-30执行
  94. //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
  95. public function testNovember8()
  96. {
  97. $start_date = strtotime('2021-11-27');
  98. $end_date = strtotime('2021-11-29');
  99. $this->clear($start_date,$end_date);
  100. }
  101. //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
  102. public function testNovember9()
  103. {
  104. $start_date = strtotime('2021-11-29');
  105. $end_date = strtotime('2021-11-30');
  106. $this->clear($start_date,$end_date);
  107. }
  108. //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
  109. public function testNovember10()
  110. {
  111. $start_date = strtotime('2021-11-30');
  112. $end_date = strtotime('2021-12-01');
  113. $this->clear($start_date,$end_date);
  114. }
  115. private function clear($start_date, $end_date)
  116. {
  117. $order_finder = function ($start,$fp)
  118. {
  119. $end = $start + 3600;
  120. $cond = ['order_time&order_time' => ['_multi' => true, ['egt', $start], ['lt', $end]],
  121. 'inner_status' => 0];
  122. $i = 0;
  123. while (true)
  124. {
  125. $start = $i * 1000;
  126. $items = Model()->table('refill_order')
  127. ->field('mchid,mch_order,order_time')
  128. ->where($cond)
  129. ->order('order_time desc')->limit("{$start},1000")->select();
  130. $i++;
  131. if(empty($items)) break;
  132. foreach ($items as $item) {
  133. fputcsv($fp,$item);
  134. }
  135. }
  136. };
  137. $order_saver = function ($start,$file) use ($order_finder)
  138. {
  139. $fp = fopen($file,'w+');
  140. if($fp === false) {
  141. Log::record("Cannot open file {$file}.",Log::ERR);
  142. return false;
  143. }
  144. $end = $start + 86400;
  145. for ($hour = $start; $hour < $end; $hour += 3600) {
  146. $order_finder($hour,$fp);
  147. }
  148. fclose($fp);
  149. return $file;
  150. };
  151. $handle_days = function ($start_date, $end_date) use ($order_saver)
  152. {
  153. for ($date = $start_date; $date < $end_date; $date += 86400)
  154. {
  155. $sdate = date('Y-m-d',$date);
  156. $morder_file = BASE_DATA_PATH . "/log/order/{$sdate}-morder.csv";
  157. $check_file = BASE_DATA_PATH . "/log/order/{$sdate}-check.csv";
  158. $refill_file = BASE_DATA_PATH . "/log/order/{$sdate}-refill.csv";
  159. $vr_file = BASE_DATA_PATH . "/log/order/{$sdate}-vr.csv";
  160. $file = $order_saver($date,$morder_file);
  161. if($file === false) {
  162. Log::record("order_saver cannot open morder file.",Log::ERR);
  163. break;
  164. }
  165. $this->order_delete($file,$check_file,$refill_file,$vr_file);
  166. }
  167. };
  168. $handle_days($start_date, $end_date);
  169. }
  170. private function order_delete($file,$check_file,$refill_file,$vr_file)
  171. {
  172. $order_checker = function ($mchid,$mch_order,$order_time,$frefill,$fvr)
  173. {
  174. $mod_refill = Model('refill_order');
  175. $ritems = $mod_refill->table('refill_order')->field('*')
  176. ->where(['mchid' => $mchid, 'mch_order' => $mch_order,'order_time' => $order_time])
  177. ->order('order_id desc')
  178. ->limit(0,1000)->select();
  179. if(empty($ritems)) {
  180. return [false,'没查到记录.'];
  181. }
  182. elseif(count($ritems) === 1) {
  183. return [true,[]];
  184. }
  185. $ctimes = array_column($ritems,'commit_time');
  186. $upbound = max($ctimes);
  187. $lowbound = min($ctimes);
  188. if($lowbound < $order_time || $upbound < $order_time) {
  189. return [false,'提单时间小于接单时间'];
  190. }
  191. // $order_time = intval($ritems[0]['order_time']);
  192. // //检查下单时间是否一致。
  193. // foreach ($ritems as $item)
  194. // {
  195. // if($order_time != intval($item['order_time'])) {
  196. // return [false,'下单时间记录不一致'];
  197. // }
  198. // }
  199. $oids = [];
  200. $inner_state = [0 => 0 ,1 => 1];
  201. foreach ($ritems as $item) {
  202. $oids[] = $item['order_id'];
  203. $state = intval($item['inner_status']);
  204. $inner_state[$state] += 1;
  205. }
  206. //检查inner_status=0唯一。
  207. if($inner_state[0] != 1) {
  208. return [false,"inner_status=0 counts = {$inner_state[0]}"];
  209. }
  210. $mod_vr = Model('vr_order');
  211. $vitems = $mod_vr->table('vr_order')->field('*')
  212. ->where(['order_id' => ['in', $oids],
  213. 'add_time' => [['egt', $order_time], ['elt', $upbound], 'and']])
  214. ->order('order_id asc')->select();
  215. //检查refill 表记录和vr_order表记录是否一致
  216. if(count($ritems) !== count($vitems)) {
  217. return [false,'refill_orders != vr_orders'];
  218. }
  219. $order_state = [];
  220. foreach ($vitems as $item)
  221. {
  222. $state = intval($item['order_state']);
  223. if(!array_key_exists($state,$order_state)) {
  224. $order_state[$state] = 0;
  225. }
  226. $order_state[$state] += 1;
  227. }
  228. //检查一种订单只能有,成功或者失败状态.
  229. $vcount = count($vitems);
  230. if($vcount != $order_state[ORDER_STATE_SUCCESS] + $order_state[ORDER_STATE_CANCEL]) {
  231. return [false,'ORDER_STATE_SUCCESS + ORDER_STATE_CANCEL != order count.'];
  232. }
  233. elseif($order_state[ORDER_STATE_SUCCESS] > 1) {
  234. //成功订单只能小于等于1,否则为错误
  235. return [false,'ORDER_STATE_SUCCESS count > 1'];
  236. }
  237. else {
  238. foreach ($ritems as $item) {
  239. fputcsv($frefill,$item);
  240. }
  241. foreach ($vitems as $item) {
  242. fputcsv($fvr,$item);
  243. }
  244. }
  245. $inner_orders = [];
  246. foreach ($ritems as $item)
  247. {
  248. $status = intval($item['inner_status']);
  249. if($status === 1) {
  250. $inner_orders[] = $item['order_id'];
  251. }
  252. }
  253. return [true,$inner_orders];
  254. };
  255. $delter = function ($order_ids,$order_time)
  256. {
  257. $mod_refill = Model('refill_order');
  258. $mod_refill->table('refill_order')->where(['order_id' => ['in',$order_ids],'order_time' => $order_time])->delete();
  259. $mod_vr = Model('vr_order');
  260. $mod_vr->table('vr_order')->where(['order_id' => ['in',$order_ids]])->delete();
  261. };
  262. $fp = fopen($file,'r');
  263. if($fp === false) {
  264. return false;
  265. }
  266. $fcheck = fopen($check_file,'w+');
  267. if($fcheck === false) {
  268. fclose($fp);
  269. return false;
  270. }
  271. $frefill = fopen($refill_file,'w+');
  272. $fvr = fopen($vr_file,'w+');
  273. while(!feof($fp))
  274. {
  275. $trace = new scope_trace('order_clear');
  276. [$mchid, $mch_order, $order_time] = fgetcsv($fp);
  277. [$succ,$err] = $order_checker($mchid,$mch_order,$order_time,$frefill,$fvr);
  278. if($succ === false) {
  279. fputcsv($fcheck,[$mchid,$mch_order,$err]);
  280. }
  281. else {
  282. $order_ids = $err;
  283. if(!empty($order_ids)) {
  284. $delter($order_ids,$order_time);
  285. }
  286. }
  287. }
  288. fclose($fp);
  289. fclose($fcheck);
  290. fclose($frefill);
  291. fclose($fvr);
  292. }
  293. private function earlist_orderday()
  294. {
  295. $mod_refill = Model('refill_order');
  296. $item = $mod_refill->table('refill_order')->field('order_time')->order('order_id asc')->find();
  297. if(empty($item)) {
  298. return false;
  299. } else {
  300. $order_time = intval($item['order_time']);
  301. $day_stamp = date('Y-m-d',$order_time);
  302. return $day_stamp;
  303. }
  304. }
  305. public function testEarlist()
  306. {
  307. $time = $this->earlist_orderday();
  308. }
  309. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  310. /// 以下代码为清除pdlog
  311. const pdlog_table_name = 'pd_log_bak';
  312. //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
  313. public function testLogSeventh()
  314. {
  315. $this->delete_log(74224997,strtotime('2021-09-01'));
  316. }
  317. private function delete_log($start_id,$endtime)
  318. {
  319. $lgid_getter = function ()
  320. {
  321. $lgid = rkcache('lastest_lgid');
  322. $lgid = intval($lgid);
  323. return $lgid;
  324. };
  325. $lgid_writter = function ($lgid)
  326. {
  327. wkcache('lastest_lgid',$lgid);
  328. };
  329. $maxid_getter = function () {
  330. $items = Model()->table(self::pdlog_table_name)->field('max(lg_id) as maxid')->select();
  331. return intval($items['0']['maxid']);
  332. };
  333. $finder = function ($start_id, $endtime, $maxid)
  334. {
  335. $start = $start_id;
  336. while (true)
  337. {
  338. if($start >= $maxid) break;
  339. $end = $start + 1000;
  340. $cond = ['lg_id' => [['egt', $start], ['lt',$end], 'and']];
  341. $items = Model()->table(self::pdlog_table_name)
  342. ->field('*')
  343. ->where($cond)
  344. ->order('lg_id asc')->select();
  345. foreach ($items as $item)
  346. {
  347. $add_time = intval($item['lg_add_time']);
  348. if($add_time >= $endtime){
  349. break;
  350. }
  351. yield $item;
  352. }
  353. $start = $end;
  354. }
  355. };
  356. $mod_refill = Model('refill_order');
  357. $checker = function ($log) use ($mod_refill)
  358. {
  359. $sdate = date('Y-m-d H:i:s',$log['lg_add_time']);
  360. Log::record("{$sdate} lgid={$log['lg_id']},type={$log['lg_type']},sn={$log['lg_order_sn']}",Log::DEBUG);
  361. $logid = intval($log['lg_id']);
  362. $lgtype = $log['lg_type'];
  363. if (in_array($lgtype, ['bonus_add_money','hand_out_bonus', 'bonus_refund', 'bonus_expire'])) {
  364. return [$logid,false];
  365. }
  366. $order_sn = $log['lg_order_sn'];
  367. if(empty($order_sn) && strlen($order_sn) < 16) {
  368. return [false,false];
  369. }
  370. if (!in_array($lgtype, ['order_pay', 'order_freeze', 'order_cancel'])) {
  371. return [false,false];
  372. }
  373. $order = $mod_refill->table('refill_order')->field('*')->where(['order_sn' => $order_sn])->master(true)->find();
  374. if(empty($order)) {
  375. return [$logid,true];
  376. } else {
  377. return [false,false];
  378. }
  379. };
  380. $pd_log = Model();
  381. $delter = function ($logid) use ($pd_log)
  382. {
  383. if ($logid > 0) {
  384. $result = $pd_log->table(self::pdlog_table_name)->where(['lg_id' => $logid])->delete();
  385. return $result;
  386. } else {
  387. return false;
  388. }
  389. };
  390. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  391. if($start_id === 0) {
  392. $start_id = $lgid_getter();
  393. }
  394. $cur_time = time();
  395. $sdate = date('Y-m-d',time());
  396. $filename = BASE_DATA_PATH . "/log/pdlog/{$sdate}-{$cur_time}.csv";
  397. $fLog = fopen($filename,'w+');
  398. $logid = $start_id;
  399. $maxid = $maxid_getter();
  400. $logs = $finder($start_id,$endtime,$maxid);
  401. foreach ($logs as $item)
  402. {
  403. [$logid,$save] = $checker($item);
  404. if($logid !== false) {
  405. $delter($logid);
  406. }
  407. if($save) {
  408. fputcsv($fLog,$item);
  409. }
  410. }
  411. $lgid_writter($logid);
  412. }
  413. }