TestRefillUtil.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  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. require_once(BASE_HELPER_PATH . '/PHPExcel/PHPExcel.php');
  9. require_once(BASE_HELPER_PATH . '/refill/RefillFactory.php');
  10. class TestRefillUtil extends TestCase
  11. {
  12. public static function setUpBeforeClass(): void
  13. {
  14. Base::run_util();
  15. }
  16. //docker-compose run phpcli php /var/www/html/phpunit-9.2.5.phar --filter "/(TestRefillUtil::testRefillFromExecl)( .*)?$/" --test-suffix TestRefillUtil.php /var/www/html/test
  17. public function testRefillFromExecl()
  18. {
  19. $filename = BASE_ROOT_PATH . "/data/upload/refill/cards.xls";
  20. if(!file_exists($filename)) {
  21. Log::record("{$filename} not exists.",Log::ERR);
  22. return false;
  23. }
  24. $field_reader = function ($filename)
  25. {
  26. $fileType = PHPExcel_IOFactory::identify($filename);
  27. $objReader = PHPExcel_IOFactory::createReader($fileType);
  28. $objPHPExcel = $objReader->load($filename);
  29. foreach ($objPHPExcel->getWorkSheetIterator() as $sheet)
  30. {
  31. foreach ($sheet->getRowIterator() as $row)
  32. {
  33. $items = [];
  34. foreach ($row->getCellIterator() as $cell) {
  35. $items[] = $cell->getValue();
  36. }
  37. yield $items;
  38. }
  39. }
  40. };
  41. $cardno_checker = function ($card_no)
  42. {
  43. $card_no = trim($card_no);
  44. $ret = preg_match("/^\d{11}$/i",$card_no) > 0;
  45. if($ret) {
  46. return $card_no;
  47. } else {
  48. return false;
  49. }
  50. };
  51. $amount_checker = function ($amount)
  52. {
  53. $amount = floatval($amount) + 0.0005;
  54. $amount = intval($amount);
  55. if($amount > 0) {
  56. return $amount;
  57. } else {
  58. return false;
  59. }
  60. };
  61. $mchid = 10239;
  62. $buyer_id = 66221;
  63. $sender = function ($card_no, $amount, $order_sn) use ($mchid, $buyer_id)
  64. {
  65. $params = [ 'mchid' => $mchid,
  66. 'buyer_id' => $buyer_id,
  67. 'amount' => $amount,
  68. 'mch_order' => $order_sn,
  69. 'card_no' => $card_no
  70. ];
  71. $ret = refill\util::push_add($params);
  72. return $ret;
  73. };
  74. $record_csv = fopen(BASE_ROOT_PATH . "/data/upload/refill/record.csv", 'a+');
  75. $items = $field_reader($filename);
  76. foreach ($items as $item)
  77. {
  78. Log::record("{$item[0]}:{$item[1]}", Log::DEBUG);
  79. $card_no = $cardno_checker($item[0]);
  80. $amount = $amount_checker($item[1]);
  81. if ($card_no != false && $amount != false) {
  82. $order_sn = $this->make_sn();
  83. $ret = $sender($card_no, $amount, $order_sn);
  84. Log::record("{$order_sn}:{$card_no}:{$amount}:{$ret}", Log::DEBUG);
  85. $order_time = date('Y-m-d H:i:S',time());
  86. $row = [$order_sn,$card_no, $amount,$order_time];
  87. if($ret) {
  88. $row[] = 'SUCC';
  89. } else {
  90. $row[] = 'FAIL';
  91. }
  92. fputcsv($record_csv,$row);
  93. }
  94. sleep(1);
  95. }
  96. fclose($record_csv);
  97. }
  98. private function make_sn()
  99. {
  100. return mt_rand(1000, 9999)
  101. . sprintf('%010d', time())
  102. . sprintf('%06d', (float)microtime() * 1000000);
  103. }
  104. public function testDiffFromExecl()
  105. {
  106. $field_reader = function ($filename)
  107. {
  108. $fileType = PHPExcel_IOFactory::identify($filename);
  109. $objReader = PHPExcel_IOFactory::createReader($fileType);
  110. $objPHPExcel = $objReader->load($filename);
  111. foreach ($objPHPExcel->getWorkSheetIterator() as $sheet)
  112. {
  113. foreach ($sheet->getRowIterator() as $row)
  114. {
  115. $items = [];
  116. foreach ($row->getCellIterator() as $cell) {
  117. $items[] = $cell->getValue();
  118. }
  119. yield $items;
  120. }
  121. }
  122. };
  123. $cardno_checker = function ($card_no)
  124. {
  125. $card_no = trim($card_no);
  126. $ret = preg_match("/^\d{11}$/i",$card_no) > 0;
  127. if($ret) {
  128. return $card_no;
  129. } else {
  130. return false;
  131. }
  132. };
  133. $differ = function ($left,$right)
  134. {
  135. $result = [];
  136. $ll = count($left);
  137. $lr = count($right);
  138. $i = $j = 0;
  139. while ($i < $ll && $j < $lr)
  140. {
  141. if ($left[$i] > $right[$j]) {
  142. $j += 1;
  143. } elseif ($left[$i] === $right[$j]) {
  144. $i += 1;
  145. $j += 1;
  146. } else {
  147. $result[] = $left[$i];
  148. $i += 1;
  149. }
  150. }
  151. for (; $i < $ll; $i++) {
  152. $result[] = $left[$i];
  153. }
  154. return $result;
  155. };
  156. $filename = BASE_ROOT_PATH . "/data/upload/refill/all.xls";
  157. if(!file_exists($filename)) {
  158. Log::record("{$filename} not exists.",Log::ERR);
  159. return false;
  160. }
  161. $items = $field_reader($filename);
  162. $left = [];
  163. $right = [];
  164. foreach ($items as $item) {
  165. $noa = $cardno_checker($item[0]);
  166. $nob = $cardno_checker($item[2]);
  167. if ($noa != false) $left[] = $noa;
  168. if ($nob != false) $right[] = $noa;
  169. }
  170. sort($left);
  171. sort($right);
  172. $result = $differ($left,$right);
  173. $csv = fopen(BASE_ROOT_PATH . "/data/upload/refill/diff.csv", 'a+');
  174. foreach ($result as $item) {
  175. $row = [$item,10];
  176. fputcsv($csv,$row);
  177. }
  178. fclose($csv);
  179. }
  180. }