TestRefillClear.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839
  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-17');
  33. $end_date = strtotime('2022-01-21');
  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. try {
  250. $mod_refill = Model('refill_order');
  251. $mod_vr = Model('vr_order');
  252. $trans = new trans_wapper($mod_refill, __METHOD__);
  253. $mod_refill->table('refill_order')->where(['order_id' => ['in',$order_ids],'order_time' => $order_time])->delete();
  254. $mod_vr->table('vr_order')->where(['order_id' => ['in',$order_ids]])->delete();
  255. $trans->commit();
  256. } catch (Exception $e) {
  257. $trans->rollback();
  258. }
  259. };
  260. $position = function ($fp,$line)
  261. {
  262. $index = 0;
  263. while(!feof($fp) && $index < $line) {
  264. $items = fgetcsv($fp);
  265. $index += 1;
  266. }
  267. };
  268. $fp = fopen($file,'r');
  269. if($fp === false) {
  270. return false;
  271. }
  272. $fcheck = fopen($check_file,'a+');
  273. if($fcheck === false) {
  274. fclose($fp);
  275. return false;
  276. }
  277. $frefill = fopen($refill_file,'a+');
  278. $fvr = fopen($vr_file,'a+');
  279. $position($fp,$line);
  280. while(!feof($fp))
  281. {
  282. [$mchid, $mch_order, $order_time] = fgetcsv($fp);
  283. if(empty($mchid) || empty($mch_order)) continue;
  284. [$succ,$err] = $order_checker($mchid,$mch_order,$frefill,$fvr);
  285. if($succ === false) {
  286. fputcsv($fcheck,[$mchid,$mch_order,$err]);
  287. }
  288. else
  289. {
  290. $order_ids = $err;
  291. if(!empty($order_ids)) {
  292. $delter($order_ids,$order_time);
  293. }
  294. }
  295. }
  296. fclose($fp);
  297. fclose($fcheck);
  298. fclose($frefill);
  299. fclose($fvr);
  300. }
  301. private function earlist_orderday()
  302. {
  303. $mod_refill = Model('refill_order');
  304. $item = $mod_refill->table('refill_order')->field('order_time')->order('order_id asc')->find();
  305. if(empty($item)) {
  306. return false;
  307. } else {
  308. $order_time = intval($item['order_time']);
  309. $day_stamp = date('Y-m-d',$order_time);
  310. return $day_stamp;
  311. }
  312. }
  313. public function testEarlist()
  314. {
  315. $time = $this->earlist_orderday();
  316. }
  317. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  318. /// 以下代码为清除pdlog
  319. // const pdlog_table_name = 'pd_log_bak';
  320. const pdlog_table_name = 'pd_log';
  321. //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
  322. public function testLogSeventh()
  323. {
  324. $this->delete_log(74224997,strtotime('2021-09-01'));
  325. }
  326. //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
  327. public function testLogNine()
  328. {
  329. $this->delete_log(127113184,strtotime('2021-10-01'));
  330. }
  331. //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
  332. public function testLogTen()
  333. {
  334. $this->delete_log(306132968,strtotime('2021-11-01'));
  335. }
  336. //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
  337. public function testLogEleven()
  338. {
  339. $this->delete_log(619026072,strtotime('2021-12-01'));
  340. }
  341. //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
  342. public function testLogDec20()
  343. {
  344. $this->delete_log(1079138574,strtotime('2021-12-20'));
  345. }
  346. //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
  347. public function testLogDec29()
  348. {
  349. $this->delete_log(2147483648,strtotime('2022-01-01'));
  350. }
  351. //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
  352. public function testLog202201()
  353. {
  354. $this->delete_log(2147483648,strtotime('2022-01-01'));
  355. }
  356. private function delete_log($start_id,$endtime)
  357. {
  358. //需要的函数
  359. $lgid_getter = function ()
  360. {
  361. $lgid = rkcache('lastest_lgid');
  362. $lgid = intval($lgid);
  363. return $lgid;
  364. };
  365. $lgid_writter = function ($lgid)
  366. {
  367. wkcache('lastest_lgid',$lgid);
  368. };
  369. $maxid_getter = function () {
  370. $items = Model()->table(self::pdlog_table_name)->field('max(lg_id) as maxid')->select();
  371. return intval($items['0']['maxid']);
  372. };
  373. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  374. $mod_refill = Model('refill_order');
  375. $pd_log = Model();
  376. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  377. /// 一条一条的删除日志
  378. $finder = function ($start_id, $endtime, $maxid)
  379. {
  380. $start = $start_id;
  381. $quit = false;
  382. while (!$quit)
  383. {
  384. if($start >= $maxid) break;
  385. $end = $start + 1000;
  386. $cond = ['lg_id' => [['egt', $start], ['lt',$end], 'and']];
  387. $items = Model()->table(self::pdlog_table_name)
  388. ->field('*')
  389. ->where($cond)
  390. ->order('lg_id asc')->select();
  391. foreach ($items as $item)
  392. {
  393. $add_time = intval($item['lg_add_time']);
  394. if($add_time >= $endtime){
  395. $quit = true;
  396. break;
  397. }
  398. yield $item;
  399. }
  400. $start = $end;
  401. }
  402. };
  403. $checker = function ($log) use ($mod_refill)
  404. {
  405. $sdate = date('Y-m-d H:i:s',$log['lg_add_time']);
  406. Log::record("{$sdate} lgid={$log['lg_id']},type={$log['lg_type']},sn={$log['lg_order_sn']}",Log::DEBUG);
  407. $logid = intval($log['lg_id']);
  408. $lgtype = $log['lg_type'];
  409. if (in_array($lgtype, ['bonus_add_money','hand_out_bonus', 'bonus_refund', 'bonus_expire'])) {
  410. return [$logid,false];
  411. }
  412. $order_sn = $log['lg_order_sn'];
  413. if(empty($order_sn) && strlen($order_sn) < 16) {
  414. return [false,false];
  415. }
  416. if (!in_array($lgtype, ['order_pay', 'order_freeze', 'order_cancel'])) {
  417. return [false,false];
  418. }
  419. $order = $mod_refill->table('refill_order')->field('*')->where(['order_sn' => $order_sn])->master(true)->find();
  420. if(empty($order)) {
  421. return [$logid,true];
  422. } else {
  423. return [false,false];
  424. }
  425. };
  426. $delter = function ($logid) use ($pd_log)
  427. {
  428. if ($logid > 0) {
  429. $result = $pd_log->table(self::pdlog_table_name)->where(['lg_id' => $logid])->delete();
  430. return $result;
  431. } else {
  432. return false;
  433. }
  434. };
  435. $onebyone_handler = function ($start_id,$endtime,$maxid,$fLog) use($finder,$checker,$delter)
  436. {
  437. $logs = $finder($start_id,$endtime,$maxid);
  438. foreach ($logs as $item)
  439. {
  440. [$logid,$save] = $checker($item);
  441. if($logid !== false) {
  442. $delter($logid);
  443. }
  444. if($save) {
  445. fputcsv($fLog,$item);
  446. }
  447. }
  448. };
  449. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  450. /// 一批一批的删除日志
  451. $batch_finder = function ($start_id, $endtime, $maxid)
  452. {
  453. $start = $start_id;
  454. $quit = false;
  455. while (!$quit)
  456. {
  457. if($start >= $maxid) break;
  458. $end = $start + 200;
  459. $cond = ['lg_id' => [['egt', $start], ['lt',$end], 'and']];
  460. $items = Model()->table(self::pdlog_table_name)
  461. ->field('*')
  462. ->where($cond)
  463. ->order('lg_id asc')->select();
  464. $logs = [];
  465. foreach ($items as $item)
  466. {
  467. $add_time = intval($item['lg_add_time']);
  468. if($add_time >= $endtime){
  469. $quit = true;
  470. break;
  471. }
  472. else {
  473. $logs[] = $item;
  474. }
  475. }
  476. if(!empty($logs)) {
  477. yield $logs;
  478. }
  479. $start = $end;
  480. }
  481. };
  482. //return:1,可以直接删除,不需要存储; 2,不可以删除,3,检查后可以删除
  483. $batch_check_log = function ($log)
  484. {
  485. $sdate = date('Y-m-d H:i:s',$log['lg_add_time']);
  486. Log::record("{$sdate} lgid={$log['lg_id']},type={$log['lg_type']},sn={$log['lg_order_sn']}",Log::DEBUG);
  487. $logid = intval($log['lg_id']);
  488. $order_sn = $log['lg_order_sn'];
  489. $lgtype = $log['lg_type'];
  490. if (in_array($lgtype, ['bonus_add_money','hand_out_bonus', 'bonus_refund', 'bonus_expire'])) {
  491. return [1,$logid,$order_sn];
  492. }
  493. if(empty($order_sn) && strlen($order_sn) < 16) {
  494. return [2,false,false];
  495. }
  496. if (!in_array($lgtype, ['order_pay', 'order_freeze', 'order_cancel'])) {
  497. return [2,false,false];
  498. }
  499. return [3,$logid,$order_sn];
  500. };
  501. $batch_checker = function ($logs) use ($mod_refill,$batch_check_log)
  502. {
  503. $del_ids = [];
  504. $savers = [];
  505. $exist_logs = [];
  506. $sns = [];
  507. foreach ($logs as $log)
  508. {
  509. [$type,$logid,$order_sn] = $batch_check_log($log);
  510. if($type === 1) {
  511. $del_ids[] = $logid;
  512. }
  513. elseif($type === 3) {
  514. $exist_logs[$logid] = $log;
  515. $sns[] = $order_sn;
  516. }
  517. else {
  518. }
  519. }
  520. if(!empty($sns))
  521. {
  522. $sns = array_unique($sns);
  523. $orders = $mod_refill->table('refill_order')->field('order_sn')->where(['order_sn' => ['in', $sns]])->master(true)->select();
  524. $sn_sns = [];
  525. foreach ($orders as $item) {
  526. $sn = $item['order_sn'];
  527. $sn_sns[$sn] = $sn;
  528. }
  529. foreach ($exist_logs as $logid => $log)
  530. {
  531. $sn = $log['lg_order_sn'];
  532. if(!array_key_exists($sn,$sn_sns)) {
  533. $del_ids[] = $logid;
  534. $savers[] = $log;
  535. }
  536. }
  537. }
  538. return [$del_ids,$savers];
  539. };
  540. $batch_delter = function ($logids) use ($pd_log)
  541. {
  542. if (!empty($logids)) {
  543. $result = $pd_log->table(self::pdlog_table_name)->where(['lg_id' => ['in',$logids]])->delete();
  544. return $result;
  545. } else {
  546. return false;
  547. }
  548. };
  549. $batch_handler = function ($start_id,$endtime,$maxid,$fLog) use($batch_finder,$batch_checker,$batch_delter)
  550. {
  551. $logs = $batch_finder($start_id,$endtime,$maxid);
  552. foreach ($logs as $batch)
  553. {
  554. [$logids,$savers] = $batch_checker($batch);
  555. $batch_delter($logids);
  556. foreach ($savers as $item) {
  557. fputcsv($fLog,$item);
  558. }
  559. }
  560. };
  561. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  562. if($start_id === 0) {
  563. $start_id = $lgid_getter();
  564. }
  565. $cur_time = time();
  566. $sdate = date('Y-m-d',time());
  567. $filename = BASE_DATA_PATH . "/log/pdlog/{$sdate}-{$cur_time}.csv";
  568. $fLog = fopen($filename,'w+');
  569. $logid = $start_id;
  570. $maxid = $maxid_getter();
  571. // $onebyone_handler($start_id,$endtime,$maxid,$fLog);
  572. $batch_handler($start_id,$endtime,$maxid,$fLog);
  573. $lgid_writter($logid);
  574. }
  575. public function testImport()
  576. {
  577. $filename = BASE_DATA_PATH . "/log/pdlog/2022-01-02-1641055749.csv";
  578. $this->import_pdlog($filename);
  579. }
  580. //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
  581. public function testImportNine()
  582. {
  583. $filename = BASE_DATA_PATH . "/log/pdlog/2021-09-01.csv";
  584. $this->import_pdlog($filename);
  585. }
  586. //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
  587. public function testImportTen()
  588. {
  589. $filename = BASE_DATA_PATH . "/log/pdlog/2022-01-03-1641141137.csv";
  590. $this->import_pdlog($filename);
  591. }
  592. private function import_pdlog($filename,$start_line = 0)
  593. {
  594. $position = function ($fp,$line)
  595. {
  596. $index = 0;
  597. while(!feof($fp) && $index < $line) {
  598. $items = fgetcsv($fp);
  599. $index += 1;
  600. }
  601. };
  602. $reader = function ($fp)
  603. {
  604. while(!feof($fp))
  605. {
  606. $logs = [];
  607. for ($index = 0; $index < 200 && !feof($fp); $index++) {
  608. $log = fgetcsv($fp);
  609. $logs[] = $log;
  610. }
  611. yield $logs;
  612. }
  613. };
  614. $converter = function ($logs)
  615. {
  616. $result = [];
  617. $sns = [];
  618. foreach ($logs as $log) {
  619. $item = [];
  620. $logid = $log[0];
  621. $item['lg_id'] = $log[0];
  622. $item['lg_member_id'] = $log[1];
  623. $item['lg_member_name'] = $log[2];
  624. $item['lg_admin_name'] = $log[3];
  625. $item['lg_type'] = $log[4];
  626. $item['lg_av_amount'] = $log[5];
  627. $item['lg_freeze_amount'] = $log[6];
  628. $item['lg_add_time'] = $log[7];
  629. $item['lg_desc'] = $log[8];
  630. $item['lg_order_sn'] = $log[9];
  631. $item['lg_available'] = $log[10];
  632. $sns[] = $log[9];
  633. $result[$logid] = $item;
  634. }
  635. return [$result,$sns];
  636. };
  637. $mod_refill = Model('refill_order');
  638. $filter = function ($logs,$sns) use($mod_refill)
  639. {
  640. $sns = array_unique($sns);
  641. $sn2sn = [];
  642. $orders = $mod_refill->table('refill_order')->field('order_sn')->where(['order_sn' => ['in', $sns]])->master(true)->select();
  643. foreach ($orders as $order) {
  644. $sn = $order['order_sn'];
  645. $sn2sn[$sn] = $sn;
  646. }
  647. $inserts = [];
  648. $dels = [];
  649. foreach ($logs as $lgid => $log)
  650. {
  651. $sn = $log['lg_order_sn'];
  652. if(array_key_exists($sn,$sn2sn)) {
  653. $inserts[] = $log;
  654. } else {
  655. $dels[] = $log;
  656. }
  657. }
  658. return [$inserts,$dels];
  659. };
  660. $inserter = function ($records)
  661. {
  662. if(empty($records)) return false;
  663. try {
  664. $ret = Model()->table(self::pdlog_table_name)->insertAll($records);
  665. return $ret;
  666. }
  667. catch (Exception $ex) {
  668. Log::record($ex->getMessage(),Log::ERR);
  669. return false;
  670. }
  671. };
  672. $delname = BASE_DATA_PATH . "/log/pdlog/del.csv";
  673. $fDel = fopen($delname,'a+');
  674. $delter = function ($records) use ($fDel)
  675. {
  676. foreach ($records as $item) {
  677. $log = [];
  678. $log[] = $item['lg_id'];
  679. $log[] = $item['lg_member_id'];
  680. $log[] = $item['lg_member_name'];
  681. $log[] = $item['lg_admin_name'];
  682. $log[] = $item['lg_type'];
  683. $log[] = $item['lg_av_amount'];
  684. $log[] = $item['lg_freeze_amount'];
  685. $log[] = $item['lg_add_time'];
  686. $log[] = $item['lg_desc'];
  687. $log[] = $item['lg_order_sn'];
  688. $log[] = $item['lg_available'];
  689. fputcsv($fDel,$log);
  690. }
  691. };
  692. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  693. $fLog = fopen($filename,'r');
  694. $position($fLog,$start_line);
  695. $logger = $reader($fLog);
  696. foreach ($logger as $items) {
  697. [$logs, $sns] = $converter($items);
  698. [$inserts, $dels] = $filter($logs, $sns);
  699. $inserter($inserts);
  700. $delter($dels);
  701. }
  702. fclose($fLog);
  703. fclose($fDel);
  704. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  705. }
  706. }