TestRefillUtil.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  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. $amount_checker = function ($amount)
  134. {
  135. $amount = floatval($amount) + 0.0005;
  136. $amount = intval($amount);
  137. if($amount > 0) {
  138. return $amount;
  139. } else {
  140. return false;
  141. }
  142. };
  143. $differ = function ($left,$right)
  144. {
  145. $result = [];
  146. $ll = count($left);
  147. $lr = count($right);
  148. $i = $j = 0;
  149. while ($i < $ll && $j < $lr)
  150. {
  151. if ($left[$i] > $right[$j]) {
  152. $j += 1;
  153. } elseif ($left[$i] === $right[$j]) {
  154. $i += 1;
  155. $j += 1;
  156. } else {
  157. $result[] = $left[$i];
  158. $i += 1;
  159. }
  160. }
  161. for (; $i < $ll; $i++) {
  162. $result[] = $left[$i];
  163. }
  164. return $result;
  165. };
  166. $refill_reader = function ($file) use ($field_reader,$cardno_checker,$amount_checker)
  167. {
  168. if(!file_exists($file)) {
  169. Log::record("{$file} not exists.",Log::ERR);
  170. return [];
  171. }
  172. $result = [];
  173. $items = $field_reader($file);
  174. foreach ($items as $item) {
  175. $no = $cardno_checker($item[0]);
  176. $amount = $amount_checker($item[1]);
  177. if ($no != false && $amount != false) {
  178. $result[] = "{$no}-{$amount}";
  179. }
  180. }
  181. return $result;
  182. };
  183. $all = $refill_reader(BASE_ROOT_PATH . "/data/upload/refill/all.xls");
  184. $succ = $refill_reader(BASE_ROOT_PATH . "/data/upload/refill/succ.xls");
  185. sort($all);
  186. sort($succ);
  187. $result = $differ($all,$succ);
  188. $csv = fopen(BASE_ROOT_PATH . "/data/upload/refill/diff.csv", 'a+');
  189. foreach ($result as $item) {
  190. $row = explode('-',$item);
  191. fputcsv($csv,$row);
  192. }
  193. fclose($csv);
  194. }
  195. public function testWriteCard()
  196. {
  197. refill\util::write_card('1000113300017553895',mtopcard\SinopecCard,'13911129867');
  198. }
  199. }