TestRefillClear.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  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. //2021年,8、9、10、11
  22. //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testDecember20)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
  23. public function testDecember20()
  24. {
  25. $start_date = strtotime('2021-12-20');
  26. $end_date = strtotime('2022-12-28');
  27. $this->clear($start_date,$end_date);
  28. }
  29. //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::test202201)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
  30. public function test202201()
  31. {
  32. $start_date = strtotime('2022-01-10');
  33. $end_date = strtotime('2022-01-16');
  34. $this->clear($start_date,$end_date);
  35. }
  36. public function testAllRecords()
  37. {
  38. $rorder_getter = function ($mchid,$mch_order,$mod_refill)
  39. {
  40. $result = [];
  41. $i = 0;
  42. while(true)
  43. {
  44. $start = $i * 1000;
  45. $ritems = $mod_refill->table('refill_order')->field('*')
  46. ->where(['mchid' => $mchid, 'mch_order' => $mch_order])
  47. ->order('order_id desc')
  48. ->limit("{$start},1000")->master(true)->select();
  49. $i++;
  50. $result = array_merge($ritems,$result);
  51. if(count($ritems) < 1000) {
  52. break;
  53. }
  54. }
  55. return $result;
  56. };
  57. $vorder_getter = function ($order_ids,$mod_vr)
  58. {
  59. $result = [];
  60. $i = 0;
  61. while(true)
  62. {
  63. $start = $i * 1000;
  64. $vitems = $mod_vr->table('vr_order')->field('*')
  65. ->where(['order_id' => ['in', $order_ids]])
  66. ->order('order_id asc')
  67. ->limit("{$start},1000")->master(true)->select();
  68. $i++;
  69. $result = array_merge($vitems,$result);
  70. if(count($vitems) < 1000) {
  71. break;
  72. }
  73. }
  74. return $result;
  75. };
  76. $mod_refill = Model('refill_order');
  77. $ritems = $rorder_getter(10234,'2021120700113026892979',$mod_refill);
  78. $oids = [];
  79. foreach ($ritems as $item) {
  80. $oids[] = $item['order_id'];
  81. }
  82. $mod_vr = Model('vr_order');
  83. $vitems = $vorder_getter($oids,$mod_vr);
  84. $ret = count($vitems) == count($ritems);
  85. }
  86. private function clear($start_date, $end_date,$line = 0)
  87. {
  88. $order_finder = function ($start,$fp)
  89. {
  90. $end = $start + 3600;
  91. $cond = ['order_time&order_time' => ['_multi' => true, ['egt', $start], ['lt', $end]],
  92. 'inner_status' => 0];
  93. $i = 0;
  94. while (true)
  95. {
  96. $start = $i * 1000;
  97. $items = Model()->table('refill_order')
  98. ->field('mchid,mch_order,order_time')
  99. ->where($cond)
  100. ->order('order_time desc')->limit("{$start},1000")->select();
  101. $i++;
  102. if(empty($items)) break;
  103. foreach ($items as $item) {
  104. fputcsv($fp,$item);
  105. }
  106. }
  107. };
  108. $order_saver = function ($start,$file) use ($order_finder)
  109. {
  110. if(file_exists($file)) {
  111. return $file;
  112. }
  113. $fp = fopen($file,'w+');
  114. if($fp === false) {
  115. Log::record("Cannot open file {$file}.",Log::ERR);
  116. return false;
  117. }
  118. $end = $start + 86400;
  119. for ($hour = $start; $hour < $end; $hour += 3600) {
  120. $order_finder($hour,$fp);
  121. }
  122. fclose($fp);
  123. return $file;
  124. };
  125. $handle_days = function ($start_date, $end_date,$line = 0) use ($order_saver)
  126. {
  127. for ($date = $start_date; $date < $end_date; $date += 86400)
  128. {
  129. $sdate = date('Y-m-d',$date);
  130. $morder_file = BASE_DATA_PATH . "/log/order/{$sdate}-morder.csv";
  131. $check_file = BASE_DATA_PATH . "/log/order/{$sdate}-check.csv";
  132. $refill_file = BASE_DATA_PATH . "/log/order/{$sdate}-refill.csv";
  133. $vr_file = BASE_DATA_PATH . "/log/order/{$sdate}-vr.csv";
  134. $file = $order_saver($date,$morder_file);
  135. if($file === false) {
  136. Log::record("order_saver cannot open morder file.",Log::ERR);
  137. break;
  138. }
  139. $this->order_delete($file,$check_file,$refill_file,$vr_file,$line);
  140. }
  141. };
  142. $handle_days($start_date, $end_date,$line);
  143. }
  144. private function order_delete($file,$check_file,$refill_file,$vr_file,$line)
  145. {
  146. $rorder_getter = function ($mchid,$mch_order,$mod_refill)
  147. {
  148. $result = [];
  149. $i = 0;
  150. while(true)
  151. {
  152. $start = $i * 1000;
  153. $ritems = $mod_refill->table('refill_order')->field('*')
  154. ->where(['mchid' => $mchid, 'mch_order' => $mch_order])
  155. ->order('order_id desc')
  156. ->limit("{$start},1000")->master(true)->select();
  157. $i++;
  158. $result = array_merge($ritems,$result);
  159. if(count($ritems) < 1000) {
  160. break;
  161. }
  162. }
  163. return $result;
  164. };
  165. $vorder_getter = function ($order_ids,$mod_vr)
  166. {
  167. $result = [];
  168. $i = 0;
  169. while(true)
  170. {
  171. $start = $i * 1000;
  172. $vitems = $mod_vr->table('vr_order')->field('*')
  173. ->where(['order_id' => ['in', $order_ids]])
  174. ->order('order_id asc')
  175. ->limit("{$start},1000")->master(true)->select();
  176. $i++;
  177. $result = array_merge($vitems,$result);
  178. if(count($vitems) < 1000) {
  179. break;
  180. }
  181. }
  182. return $result;
  183. };
  184. $order_checker = function ($mchid,$mch_order,$frefill,$fvr) use($rorder_getter,$vorder_getter)
  185. {
  186. $mod_refill = Model('refill_order');
  187. $ritems = $rorder_getter($mchid,$mch_order,$mod_refill);
  188. if(empty($ritems)) {
  189. return [false,'没查到记录.'];
  190. }
  191. elseif(count($ritems) === 1) {
  192. return [true,[]];
  193. }
  194. $oids = [];
  195. $inner_state = [0 => 0 ,1 => 1];
  196. foreach ($ritems as $item) {
  197. $oids[] = $item['order_id'];
  198. $state = intval($item['inner_status']);
  199. $inner_state[$state] += 1;
  200. }
  201. //检查inner_status=0唯一。
  202. if($inner_state[0] != 1) {
  203. return [false,"inner_status=0 counts = {$inner_state[0]}"];
  204. }
  205. $mod_vr = Model('vr_order');
  206. $vitems = $vorder_getter($oids,$mod_vr);
  207. //检查refill 表记录和vr_order表记录是否一致
  208. if(count($ritems) !== count($vitems)) {
  209. return [false,'refill_orders != vr_orders'];
  210. }
  211. $order_state = [];
  212. foreach ($vitems as $item)
  213. {
  214. $state = intval($item['order_state']);
  215. if(!array_key_exists($state,$order_state)) {
  216. $order_state[$state] = 0;
  217. }
  218. $order_state[$state] += 1;
  219. }
  220. //检查一种订单只能有,成功或者失败状态.
  221. $vcount = count($vitems);
  222. if($vcount != $order_state[ORDER_STATE_SUCCESS] + $order_state[ORDER_STATE_CANCEL]) {
  223. return [false,'ORDER_STATE_SUCCESS + ORDER_STATE_CANCEL != order count.'];
  224. }
  225. elseif($order_state[ORDER_STATE_SUCCESS] > 1) {
  226. //成功订单只能小于等于1,否则为错误
  227. return [false,'ORDER_STATE_SUCCESS count > 1'];
  228. }
  229. else {
  230. foreach ($ritems as $item) {
  231. fputcsv($frefill,$item);
  232. }
  233. foreach ($vitems as $item) {
  234. fputcsv($fvr,$item);
  235. }
  236. }
  237. $inner_orders = [];
  238. foreach ($ritems as $item)
  239. {
  240. $status = intval($item['inner_status']);
  241. if($status === 1) {
  242. $inner_orders[] = $item['order_id'];
  243. }
  244. }
  245. return [true,$inner_orders];
  246. };
  247. $delter = function ($order_ids,$order_time)
  248. {
  249. $mod_refill = Model('refill_order');
  250. $mod_refill->table('refill_order')->where(['order_id' => ['in',$order_ids],'order_time' => $order_time])->delete();
  251. $mod_vr = Model('vr_order');
  252. $mod_vr->table('vr_order')->where(['order_id' => ['in',$order_ids]])->delete();
  253. };
  254. $position = function ($fp,$line)
  255. {
  256. $index = 0;
  257. while(!feof($fp) && $index < $line) {
  258. $items = fgetcsv($fp);
  259. $index += 1;
  260. }
  261. };
  262. $fp = fopen($file,'r');
  263. if($fp === false) {
  264. return false;
  265. }
  266. $fcheck = fopen($check_file,'a+');
  267. if($fcheck === false) {
  268. fclose($fp);
  269. return false;
  270. }
  271. $frefill = fopen($refill_file,'a+');
  272. $fvr = fopen($vr_file,'a+');
  273. $position($fp,$line);
  274. while(!feof($fp))
  275. {
  276. [$mchid, $mch_order, $order_time] = fgetcsv($fp);
  277. if(empty($mchid) || empty($mch_order)) continue;
  278. [$succ,$err] = $order_checker($mchid,$mch_order,$frefill,$fvr);
  279. if($succ === false) {
  280. fputcsv($fcheck,[$mchid,$mch_order,$err]);
  281. }
  282. else
  283. {
  284. $order_ids = $err;
  285. if(!empty($order_ids)) {
  286. $delter($order_ids,$order_time);
  287. }
  288. }
  289. }
  290. fclose($fp);
  291. fclose($fcheck);
  292. fclose($frefill);
  293. fclose($fvr);
  294. }
  295. private function earlist_orderday()
  296. {
  297. $mod_refill = Model('refill_order');
  298. $item = $mod_refill->table('refill_order')->field('order_time')->order('order_id asc')->find();
  299. if(empty($item)) {
  300. return false;
  301. } else {
  302. $order_time = intval($item['order_time']);
  303. $day_stamp = date('Y-m-d',$order_time);
  304. return $day_stamp;
  305. }
  306. }
  307. public function testEarlist()
  308. {
  309. $time = $this->earlist_orderday();
  310. }
  311. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  312. /// 以下代码为清除pdlog
  313. // const pdlog_table_name = 'pd_log_bak';
  314. const pdlog_table_name = 'pd_log';
  315. //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
  316. public function testLogSeventh()
  317. {
  318. $this->delete_log(74224997,strtotime('2021-09-01'));
  319. }
  320. //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testLogNine)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
  321. public function testLogNine()
  322. {
  323. $this->delete_log(127113184,strtotime('2021-10-01'));
  324. }
  325. //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testLogTen)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
  326. public function testLogTen()
  327. {
  328. $this->delete_log(306132968,strtotime('2021-11-01'));
  329. }
  330. //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testLogEleven)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
  331. public function testLogEleven()
  332. {
  333. $this->delete_log(619026072,strtotime('2021-12-01'));
  334. }
  335. //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testLogDec20)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
  336. public function testLogDec20()
  337. {
  338. $this->delete_log(1079138574,strtotime('2021-12-20'));
  339. }
  340. //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testLogDec29)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
  341. public function testLogDec29()
  342. {
  343. $this->delete_log(2147483648,strtotime('2022-01-01'));
  344. }
  345. private function delete_log($start_id,$endtime)
  346. {
  347. //需要的函数
  348. $lgid_getter = function ()
  349. {
  350. $lgid = rkcache('lastest_lgid');
  351. $lgid = intval($lgid);
  352. return $lgid;
  353. };
  354. $lgid_writter = function ($lgid)
  355. {
  356. wkcache('lastest_lgid',$lgid);
  357. };
  358. $maxid_getter = function () {
  359. $items = Model()->table(self::pdlog_table_name)->field('max(lg_id) as maxid')->select();
  360. return intval($items['0']['maxid']);
  361. };
  362. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  363. $mod_refill = Model('refill_order');
  364. $pd_log = Model();
  365. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  366. /// 一条一条的删除日志
  367. $finder = function ($start_id, $endtime, $maxid)
  368. {
  369. $start = $start_id;
  370. $quit = false;
  371. while (!$quit)
  372. {
  373. if($start >= $maxid) break;
  374. $end = $start + 1000;
  375. $cond = ['lg_id' => [['egt', $start], ['lt',$end], 'and']];
  376. $items = Model()->table(self::pdlog_table_name)
  377. ->field('*')
  378. ->where($cond)
  379. ->order('lg_id asc')->select();
  380. foreach ($items as $item)
  381. {
  382. $add_time = intval($item['lg_add_time']);
  383. if($add_time >= $endtime){
  384. $quit = true;
  385. break;
  386. }
  387. yield $item;
  388. }
  389. $start = $end;
  390. }
  391. };
  392. $checker = function ($log) use ($mod_refill)
  393. {
  394. $sdate = date('Y-m-d H:i:s',$log['lg_add_time']);
  395. Log::record("{$sdate} lgid={$log['lg_id']},type={$log['lg_type']},sn={$log['lg_order_sn']}",Log::DEBUG);
  396. $logid = intval($log['lg_id']);
  397. $lgtype = $log['lg_type'];
  398. if (in_array($lgtype, ['bonus_add_money','hand_out_bonus', 'bonus_refund', 'bonus_expire'])) {
  399. return [$logid,false];
  400. }
  401. $order_sn = $log['lg_order_sn'];
  402. if(empty($order_sn) && strlen($order_sn) < 16) {
  403. return [false,false];
  404. }
  405. if (!in_array($lgtype, ['order_pay', 'order_freeze', 'order_cancel'])) {
  406. return [false,false];
  407. }
  408. $order = $mod_refill->table('refill_order')->field('*')->where(['order_sn' => $order_sn])->master(true)->find();
  409. if(empty($order)) {
  410. return [$logid,true];
  411. } else {
  412. return [false,false];
  413. }
  414. };
  415. $delter = function ($logid) use ($pd_log)
  416. {
  417. if ($logid > 0) {
  418. $result = $pd_log->table(self::pdlog_table_name)->where(['lg_id' => $logid])->delete();
  419. return $result;
  420. } else {
  421. return false;
  422. }
  423. };
  424. $onebyone_handler = function ($start_id,$endtime,$maxid,$fLog) use($finder,$checker,$delter)
  425. {
  426. $logs = $finder($start_id,$endtime,$maxid);
  427. foreach ($logs as $item)
  428. {
  429. [$logid,$save] = $checker($item);
  430. if($logid !== false) {
  431. $delter($logid);
  432. }
  433. if($save) {
  434. fputcsv($fLog,$item);
  435. }
  436. }
  437. };
  438. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  439. /// 一批一批的删除日志
  440. $batch_finder = function ($start_id, $endtime, $maxid)
  441. {
  442. $start = $start_id;
  443. $quit = false;
  444. while (!$quit)
  445. {
  446. if($start >= $maxid) break;
  447. $end = $start + 200;
  448. $cond = ['lg_id' => [['egt', $start], ['lt',$end], 'and']];
  449. $items = Model()->table(self::pdlog_table_name)
  450. ->field('*')
  451. ->where($cond)
  452. ->order('lg_id asc')->select();
  453. $logs = [];
  454. foreach ($items as $item)
  455. {
  456. $add_time = intval($item['lg_add_time']);
  457. if($add_time >= $endtime){
  458. $quit = true;
  459. break;
  460. }
  461. else {
  462. $logs[] = $item;
  463. }
  464. }
  465. if(!empty($logs)) {
  466. yield $logs;
  467. }
  468. $start = $end;
  469. }
  470. };
  471. //return:1,可以直接删除,不需要存储; 2,不可以删除,3,检查后可以删除
  472. $batch_check_log = function ($log)
  473. {
  474. $sdate = date('Y-m-d H:i:s',$log['lg_add_time']);
  475. Log::record("{$sdate} lgid={$log['lg_id']},type={$log['lg_type']},sn={$log['lg_order_sn']}",Log::DEBUG);
  476. $logid = intval($log['lg_id']);
  477. $order_sn = $log['lg_order_sn'];
  478. $lgtype = $log['lg_type'];
  479. if (in_array($lgtype, ['bonus_add_money','hand_out_bonus', 'bonus_refund', 'bonus_expire'])) {
  480. return [1,$logid,$order_sn];
  481. }
  482. if(empty($order_sn) && strlen($order_sn) < 16) {
  483. return [2,false,false];
  484. }
  485. if (!in_array($lgtype, ['order_pay', 'order_freeze', 'order_cancel'])) {
  486. return [2,false,false];
  487. }
  488. return [3,$logid,$order_sn];
  489. };
  490. $batch_checker = function ($logs) use ($mod_refill,$batch_check_log)
  491. {
  492. $del_ids = [];
  493. $savers = [];
  494. $exist_logs = [];
  495. $sns = [];
  496. foreach ($logs as $log)
  497. {
  498. [$type,$logid,$order_sn] = $batch_check_log($log);
  499. if($type === 1) {
  500. $del_ids[] = $logid;
  501. }
  502. elseif($type === 3) {
  503. $exist_logs[$logid] = $log;
  504. $sns[] = $order_sn;
  505. }
  506. else {
  507. }
  508. }
  509. if(!empty($sns))
  510. {
  511. $sns = array_unique($sns);
  512. $orders = $mod_refill->table('refill_order')->field('order_sn')->where(['order_sn' => ['in', $sns]])->master(true)->select();
  513. $sn_sns = [];
  514. foreach ($orders as $item) {
  515. $sn = $item['order_sn'];
  516. $sn_sns[$sn] = $sn;
  517. }
  518. foreach ($exist_logs as $logid => $log)
  519. {
  520. $sn = $log['lg_order_sn'];
  521. if(!array_key_exists($sn,$sn_sns)) {
  522. $del_ids[] = $logid;
  523. $savers[] = $log;
  524. }
  525. }
  526. }
  527. return [$del_ids,$savers];
  528. };
  529. $batch_delter = function ($logids) use ($pd_log)
  530. {
  531. if (!empty($logids)) {
  532. $result = $pd_log->table(self::pdlog_table_name)->where(['lg_id' => ['in',$logids]])->delete();
  533. return $result;
  534. } else {
  535. return false;
  536. }
  537. };
  538. $batch_handler = function ($start_id,$endtime,$maxid,$fLog) use($batch_finder,$batch_checker,$batch_delter)
  539. {
  540. $logs = $batch_finder($start_id,$endtime,$maxid);
  541. foreach ($logs as $batch)
  542. {
  543. [$logids,$savers] = $batch_checker($batch);
  544. $batch_delter($logids);
  545. foreach ($savers as $item) {
  546. fputcsv($fLog,$item);
  547. }
  548. }
  549. };
  550. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  551. if($start_id === 0) {
  552. $start_id = $lgid_getter();
  553. }
  554. $cur_time = time();
  555. $sdate = date('Y-m-d',time());
  556. $filename = BASE_DATA_PATH . "/log/pdlog/{$sdate}-{$cur_time}.csv";
  557. $fLog = fopen($filename,'w+');
  558. $logid = $start_id;
  559. $maxid = $maxid_getter();
  560. // $onebyone_handler($start_id,$endtime,$maxid,$fLog);
  561. $batch_handler($start_id,$endtime,$maxid,$fLog);
  562. $lgid_writter($logid);
  563. }
  564. public function testImport()
  565. {
  566. $filename = BASE_DATA_PATH . "/log/pdlog/2022-01-02-1641055749.csv";
  567. $this->import_pdlog($filename);
  568. }
  569. //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testImportNine)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
  570. public function testImportNine()
  571. {
  572. $filename = BASE_DATA_PATH . "/log/pdlog/2021-09-01.csv";
  573. $this->import_pdlog($filename);
  574. }
  575. //docker-compose run -d phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillClear::testImportTen)( .*)?$/" --test-suffix TestRefillClear.php /var/www/html/test
  576. public function testImportTen()
  577. {
  578. $filename = BASE_DATA_PATH . "/log/pdlog/2022-01-03-1641141137.csv";
  579. $this->import_pdlog($filename);
  580. }
  581. private function import_pdlog($filename,$start_line = 0)
  582. {
  583. $position = function ($fp,$line)
  584. {
  585. $index = 0;
  586. while(!feof($fp) && $index < $line) {
  587. $items = fgetcsv($fp);
  588. $index += 1;
  589. }
  590. };
  591. $reader = function ($fp)
  592. {
  593. while(!feof($fp))
  594. {
  595. $logs = [];
  596. for ($index = 0; $index < 200 && !feof($fp); $index++) {
  597. $log = fgetcsv($fp);
  598. $logs[] = $log;
  599. }
  600. yield $logs;
  601. }
  602. };
  603. $converter = function ($logs)
  604. {
  605. $result = [];
  606. $sns = [];
  607. foreach ($logs as $log) {
  608. $item = [];
  609. $logid = $log[0];
  610. $item['lg_id'] = $log[0];
  611. $item['lg_member_id'] = $log[1];
  612. $item['lg_member_name'] = $log[2];
  613. $item['lg_admin_name'] = $log[3];
  614. $item['lg_type'] = $log[4];
  615. $item['lg_av_amount'] = $log[5];
  616. $item['lg_freeze_amount'] = $log[6];
  617. $item['lg_add_time'] = $log[7];
  618. $item['lg_desc'] = $log[8];
  619. $item['lg_order_sn'] = $log[9];
  620. $item['lg_available'] = $log[10];
  621. $sns[] = $log[9];
  622. $result[$logid] = $item;
  623. }
  624. return [$result,$sns];
  625. };
  626. $mod_refill = Model('refill_order');
  627. $filter = function ($logs,$sns) use($mod_refill)
  628. {
  629. $sns = array_unique($sns);
  630. $sn2sn = [];
  631. $orders = $mod_refill->table('refill_order')->field('order_sn')->where(['order_sn' => ['in', $sns]])->master(true)->select();
  632. foreach ($orders as $order) {
  633. $sn = $order['order_sn'];
  634. $sn2sn[$sn] = $sn;
  635. }
  636. $inserts = [];
  637. $dels = [];
  638. foreach ($logs as $lgid => $log)
  639. {
  640. $sn = $log['lg_order_sn'];
  641. if(array_key_exists($sn,$sn2sn)) {
  642. $inserts[] = $log;
  643. } else {
  644. $dels[] = $log;
  645. }
  646. }
  647. return [$inserts,$dels];
  648. };
  649. $inserter = function ($records)
  650. {
  651. if(empty($records)) return false;
  652. try {
  653. $ret = Model()->table(self::pdlog_table_name)->insertAll($records);
  654. return $ret;
  655. }
  656. catch (Exception $ex) {
  657. Log::record($ex->getMessage(),Log::ERR);
  658. return false;
  659. }
  660. };
  661. $delname = BASE_DATA_PATH . "/log/pdlog/del.csv";
  662. $fDel = fopen($delname,'a+');
  663. $delter = function ($records) use ($fDel)
  664. {
  665. foreach ($records as $item) {
  666. $log = [];
  667. $log[] = $item['lg_id'];
  668. $log[] = $item['lg_member_id'];
  669. $log[] = $item['lg_member_name'];
  670. $log[] = $item['lg_admin_name'];
  671. $log[] = $item['lg_type'];
  672. $log[] = $item['lg_av_amount'];
  673. $log[] = $item['lg_freeze_amount'];
  674. $log[] = $item['lg_add_time'];
  675. $log[] = $item['lg_desc'];
  676. $log[] = $item['lg_order_sn'];
  677. $log[] = $item['lg_available'];
  678. fputcsv($fDel,$log);
  679. }
  680. };
  681. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  682. $fLog = fopen($filename,'r');
  683. $position($fLog,$start_line);
  684. $logger = $reader($fLog);
  685. foreach ($logger as $items) {
  686. [$logs, $sns] = $converter($items);
  687. [$inserts, $dels] = $filter($logs, $sns);
  688. $inserter($inserts);
  689. $delter($dels);
  690. }
  691. fclose($fLog);
  692. fclose($fDel);
  693. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  694. }
  695. }