merchant_order.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. <?php
  2. require_once(BASE_ROOT_PATH . '/mobile/control/merchantweb.php');
  3. class merchant_orderControl extends mbMerchantControl
  4. {
  5. public function __construct()
  6. {
  7. parent::__construct();
  8. }
  9. public function listOp()
  10. {
  11. $model_vr_order = Model('refill_order');
  12. $cond['mchid'] = $this->mchid();
  13. $cond['inner_status'] = 0;
  14. $fSingle = false;
  15. if (!empty($_GET['card_type'])) {
  16. if(in_array($_GET['card_type'] , ['1' , '2' , '4' , '5' , '6'])) {
  17. $cond['refill_order.card_type'] = $_GET['card_type'];
  18. }
  19. if($_GET['card_type'] == 'oil') {
  20. $cond['refill_order.card_type'] = ['in' , ['1' , '2']];
  21. }
  22. if($_GET['card_type'] == 'phone') {
  23. $cond['refill_order.card_type'] = ['in' , ['4' , '5' , '6']];
  24. }
  25. }
  26. if (!empty($_GET['card_no'])) {
  27. $fSingle = true;
  28. $cond['refill_order.card_no'] = $_GET['card_no'];
  29. }
  30. if (!empty($_GET['refill_amount'])) {
  31. $cond['refill_order.refill_amount'] = $_GET['refill_amount'];
  32. }
  33. if (!empty($_GET['mch_order'])) {
  34. $fSingle = true;
  35. $cond['refill_order.mch_order'] = $_GET['mch_order'];
  36. }
  37. if (!empty($_GET['order_sn'])) {
  38. $fSingle = true;
  39. $cond['refill_order.order_sn'] = $_GET['order_sn'];
  40. }
  41. if (!empty($_GET['quality'])) {
  42. $cond['refill_order.quality'] = $_GET['quality'];
  43. }
  44. $cur_time = time();
  45. $end_date = strtotime(date('Y-m-d',$cur_time));
  46. $add_end = $end_date + 86400 * 5;
  47. if($fSingle)
  48. {
  49. $start = intval($_GET['start_time']);
  50. $end = intval($_GET['end_time']);
  51. if($start <= 0) {
  52. $start = $cur_time - 3600;
  53. }
  54. if($end <= 0) {
  55. $end = $cur_time;
  56. }
  57. }
  58. else{
  59. $start = $cur_time - 3600;
  60. $end = $cur_time;
  61. }
  62. $cond['refill_order.order_time'] = [['egt', $start], ['lt', $end], 'and'];
  63. $cond['vr_order.add_time'] = [['egt', $start], ['elt', $add_end], 'and'];
  64. if (in_array($_GET['order_state'], array('0', '30', '40'))) {
  65. $cond['vr_order.order_state'] = $_GET['order_state'];
  66. if($_GET['order_state'] == 30 && $_GET['time'] == 1){
  67. $cond['refill_order.order_time'] = ['lt', (time() - 3600)];
  68. }
  69. }
  70. $fields = 'refill_order.*,vr_order.order_state';
  71. $order_list = $model_vr_order->getMerchantOrderList($cond, $this->page, 0, $fields, 'refill_order.order_time desc');
  72. $order_list = $this->merchant_order_format($order_list);
  73. $result['data'] = $order_list;
  74. $result['total'] = $model_vr_order->gettotalpage();
  75. return self::outsuccess($result);
  76. }
  77. public function OrderStatsOp()
  78. {
  79. if(empty($_GET['time_type']) || empty($_GET['start_time']) || empty($_GET['end_time'])) {
  80. return self::outerr(errcode::ErrInputParam, "参数错误.");
  81. }
  82. $cond['inner_status'] = 0;
  83. $time_type = $_GET['time_type'];
  84. $start = $_GET['start_time'];
  85. $end = $_GET['end_time'];
  86. $start_date = strtotime(date('Y-m-d',$start));
  87. $end_date = strtotime(date('Y-m-d',$end));
  88. if ($time_type == 'order_time') {
  89. $add_end = $end_date + 86400 * 5;
  90. $cond['refill_order.order_time'] = [['egt', $start], ['lt', $end], 'and'];
  91. $cond['vr_order.add_time'] = [['egt', $start], ['elt', $add_end], 'and'];
  92. } elseif ($time_type == 'notify_time') {
  93. $add_begin = $start_date - 86400 * 5;
  94. $cond['refill_order.order_time'] = [['egt', $add_begin], ['lt', $end], 'and'];
  95. $cond['vr_order.add_time'] = [['egt', $add_begin], ['elt', $end], 'and'];
  96. $cond['refill_order.notify_time'] = [['egt', $start], ['elt', $end], 'and'];
  97. } else {
  98. return self::outerr(errcode::ErrInputParam, "筛选日期类型错误.");
  99. }
  100. $cond['mchid'] = $this->mchid();
  101. $stats = Model('')->table('refill_order,vr_order')->join('inner')
  102. ->on('refill_order.order_id=vr_order.order_id')
  103. ->field('count(*) as order_count ,sum(refill_amount) as refill_amounts, sum(mch_amount) as mch_amounts, order_state')
  104. ->where($cond)->group('order_state')->select();
  105. $result['count'] = $result['sendCount'] = $result['errorCount'] = $result['successCount'] = $result['refill_amounts'] = $result['mch_amounts'] = 0;
  106. foreach ($stats as $stat) {
  107. $result['count'] += $stat['order_count'];
  108. if($stat['order_state'] == ORDER_STATE_SEND) {
  109. $result['sendCount'] = $stat['order_count'];
  110. }
  111. if($stat['order_state'] == ORDER_STATE_CANCEL) {
  112. $result['errorCount'] = $stat['order_count'];
  113. }
  114. if($stat['order_state'] == ORDER_STATE_SUCCESS) {
  115. $result['successCount'] = $stat['order_count'];
  116. $result['mch_amounts'] = $stat['mch_amounts'];
  117. $result['refill_amounts'] = $stat['refill_amounts'];
  118. }
  119. }
  120. return self::outsuccess($result);
  121. }
  122. private function merchant_order_format($orders)
  123. {
  124. $data = [];
  125. foreach ($orders as $order) {
  126. if($order['notify_time'] > 0)
  127. {
  128. $order['diff_time_text'] = $this->elapse_time($order['notify_time'] - $order['order_time']);
  129. $order['diff_time'] = $order['notify_time'] - $order['order_time'];
  130. }
  131. else
  132. {
  133. $order['diff_time_text'] = $this->elapse_time(time() - $order['order_time']);
  134. $order['diff_time'] = time() - $order['order_time'];
  135. }
  136. if (isset($order['order_time'])) {
  137. $order['order_time'] = date('Y-m-d H:i:s', $order['order_time']);
  138. }
  139. if (isset($order['notify_time'])) {
  140. $order['notify_time'] = date('Y-m-d H:i:s', $order['notify_time']);
  141. }
  142. if($order['is_retrying'] == 1) {
  143. $order['order_state'] = ORDER_STATE_SEND;
  144. }
  145. if ($order['order_state'] == ORDER_STATE_NEW || $order['order_state'] == ORDER_STATE_PAY) {
  146. $order['order_state'] = ORDER_STATE_SEND;
  147. }
  148. $order['order_state_text'] = $this->_orderState($order['order_state']);
  149. $order['card_type_name'] = $this->scard_type($order['card_type']);
  150. $data[] = $order;
  151. }
  152. return $data;
  153. }
  154. /**
  155. * 取得订单状态文字输出形式
  156. *
  157. * @param int $order_state 订单数组
  158. * @return string
  159. */
  160. private function _orderState($order_state)
  161. {
  162. switch ($order_state) {
  163. case ORDER_STATE_CANCEL:
  164. $text = '已取消';
  165. break;
  166. case ORDER_STATE_NEW:
  167. $text = '新订单';
  168. break;
  169. case ORDER_STATE_SEND:
  170. $text = '充值中';
  171. break;
  172. case ORDER_STATE_PAY:
  173. $text = '支付成功';
  174. break;
  175. case ORDER_STATE_SUCCESS:
  176. $text = '充值成功';
  177. break;
  178. case 'retrying':
  179. $text = '重试中';
  180. break;
  181. default:
  182. $text = '未知状态';
  183. }
  184. return $text;
  185. }
  186. private function scard_type(int $card_type)
  187. {
  188. if ($card_type == mtopcard\PetroChinaCard) { //中石油
  189. return '中石油';
  190. } elseif ($card_type == mtopcard\SinopecCard) { //中石化
  191. return '中石化';
  192. } elseif ($card_type == mtopcard\ChinaMobileCard) { //中国移动
  193. return '中国移动';
  194. } elseif ($card_type == mtopcard\ChinaUnicomCard) { //中国联通
  195. return '中国联通';
  196. } elseif ($card_type == mtopcard\ChinaTelecomCard) { //中国电信
  197. return '中国电信';
  198. } elseif ($card_type == mtopcard\ThirdRefillCard) { //中国电信
  199. return '增值业务';
  200. } else {
  201. return 'unknown';
  202. }
  203. }
  204. private function elapse_time($seconds)
  205. {
  206. $minutes = intval($seconds / 60);
  207. $second = intval($seconds % 60);
  208. if($minutes >= 60) {
  209. $minute = $minutes % 60;
  210. $hours = intval($minutes / 60);
  211. $result = "{$minute}:{$second}";
  212. }
  213. else {
  214. if($minutes > 0){
  215. $result = "{$minutes}:{$second}";
  216. }else{
  217. $result = "{$second}";
  218. }
  219. }
  220. if(isset($hours))
  221. {
  222. $result = "{$hours}:" . $result;
  223. }
  224. return $result;
  225. }
  226. public function OrderExportOp()
  227. {
  228. $cond['mchid'] = $this->mchid();
  229. $cond['inner_status'] = 0;
  230. $fSingle = false;
  231. if (!empty($_GET['card_type'])) {
  232. if(in_array($_GET['card_type'] , ['1' , '2' , '4' , '5' , '6'])) {
  233. $cond['refill_order.card_type'] = $_GET['card_type'];
  234. }
  235. if($_GET['card_type'] == 'oil') {
  236. $cond['refill_order.card_type'] = ['in' , ['1' , '2']];
  237. }
  238. if($_GET['card_type'] == 'phone') {
  239. $cond['refill_order.card_type'] = ['in' , ['4' , '5' , '6']];
  240. }
  241. }
  242. if (!empty($_GET['card_no'])) {
  243. $fSingle = true;
  244. $cond['refill_order.card_no'] = $_GET['card_no'];
  245. }
  246. if (!empty($_GET['refill_amount'])) {
  247. $cond['refill_order.refill_amount'] = $_GET['refill_amount'];
  248. }
  249. if (!empty($_GET['mch_order'])) {
  250. $fSingle = true;
  251. $cond['refill_order.mch_order'] = $_GET['mch_order'];
  252. }
  253. if (!empty($_GET['order_sn'])) {
  254. $fSingle = true;
  255. $cond['refill_order.order_sn'] = $_GET['order_sn'];
  256. }
  257. if (!empty($_GET['quality'])) {
  258. $cond['refill_order.quality'] = $_GET['quality'];
  259. }
  260. $cur_time = time();
  261. $end_date = strtotime(date('Y-m-d',$cur_time));
  262. $add_end = $end_date + 86400 * 5;
  263. if($fSingle)
  264. {
  265. $start = intval($_GET['start_time']);
  266. $end = intval($_GET['end_time']);
  267. if($start <= 0) {
  268. $start = $cur_time - 3600;
  269. }
  270. if($end <= 0) {
  271. $end = $cur_time;
  272. }
  273. }
  274. else{
  275. $start = $cur_time - 3600;
  276. $end = $cur_time;
  277. }
  278. $cond['refill_order.order_time'] = [['egt', $start], ['lt', $end], 'and'];
  279. $cond['vr_order.add_time'] = [['egt', $start], ['elt', $add_end], 'and'];
  280. if (in_array($_GET['order_state'], array('0', '30', '40'))) {
  281. $cond['vr_order.order_state'] = $_GET['order_state'];
  282. if($_GET['order_state'] == 30 && $_GET['time'] == 1){
  283. $cond['refill_order.order_time'] = ['lt', (time() - 3600)];
  284. }
  285. }
  286. $order_list = $this->getAllOrders($cond);
  287. $order_list = $this->merchant_order_format($order_list);
  288. $result = $this->export_order_exec($order_list);
  289. return self::outsuccess($result);
  290. }
  291. private function getAllOrders($condition): array
  292. {
  293. $len = 1000;
  294. $i = 0;
  295. $orders = [];
  296. while (true)
  297. {
  298. $start = $i * $len;
  299. $items = Model('')->table('refill_order,vr_order')
  300. ->field('refill_order.*,vr_order.order_state')
  301. ->join('inner')
  302. ->on('refill_order.order_id=vr_order.order_id')
  303. ->where($condition)
  304. ->order('refill_order.order_time desc')
  305. ->limit("{$start},{$len}")
  306. ->select();
  307. $orders = array_merge($orders,$items);
  308. if (empty($items) || count($items) < $len) {
  309. break;
  310. }
  311. $i++;
  312. }
  313. return $orders;
  314. }
  315. private function export_order_exec($order_list)
  316. {
  317. $card_type = ['1'=>'中石油' , '2' =>'中石化' , '4' => '移动' , '5' => '联通' , '6' => '电信'];
  318. $datas = [];
  319. if(defined('COMPANY_NAME') && COMPANY_NAME === 'LZKJ_COMPANY') {
  320. $title = [
  321. ['value' => '代理商账号'],
  322. ['value' => '商品名称'],
  323. ['value' => '交易账号'],
  324. ['value' => '交易金额'],
  325. ['value' => '交易面值'],
  326. ['value' => '交易日期'],
  327. ['value' => '交易状态'],
  328. ['value' => '处理时间'],
  329. ['value' => '第三方流水']
  330. ];
  331. foreach ($order_list as $order) {
  332. $data = [];
  333. $official_sn = $order['official_sn'];
  334. $notify_time = $order['$notify_time'];
  335. if(empty($order['official_sn'])) {
  336. $official_sn = '';
  337. }
  338. if(empty($order['$notify_time'])) {
  339. $notify_time = '';
  340. }
  341. $data[] = ['value' => $order['mchid']];
  342. $data[] = ['value' => "{$card_type[$order['card_type']]}{$order['refill_amount']}元"];
  343. $data[] = ['value' => $order['card_no']];
  344. $data[] = ['value' => $order['mch_amount']];
  345. $data[] = ['value' => $order['refill_amount']];
  346. $data[] = ['value' => $order['order_time']];
  347. $data[] = ['value' => $order['order_state_text']];
  348. $data[] = ['value' => $notify_time];
  349. $data[] = ['value' => $official_sn];
  350. $datas[] = $data;
  351. }
  352. }
  353. else
  354. {
  355. $title = [
  356. ['value' => '商户号'],
  357. ['value' => '客户订单号'],
  358. ['value' => '平台单号'],
  359. ['value' => '面额'],
  360. ['value' => '充值卡号'],
  361. ['value' => '充值卡类型'],
  362. ['value' => '下单日期'],
  363. ['value' => '完成日期'],
  364. ['value' => '官方流水号'],
  365. ['value' => '订单状态'],
  366. ['value' => '扣款金额']
  367. ];
  368. foreach ($order_list as $order) {
  369. $data = [];
  370. $data[] = ['value'=>$order['mchid']];
  371. $data[] = ['value'=>$order['mch_order']];
  372. $data[] = ['value'=>$order['order_sn']];
  373. $data[] = ['value'=>$order['refill_amount']];
  374. $data[] = ['value'=>$order['card_no']];
  375. $data[] = ['value'=>$order['card_type_name']];
  376. $data[] = ['value'=>$order['order_time']];
  377. $data[] = ['value'=>$order['notify_time']];
  378. $data[] = ['value'=>$order['official_sn']];
  379. $data[] = ['value'=>$order['order_state_text']];
  380. $data[] = ['value'=>$order['mch_amount']];
  381. $datas[] = $data;
  382. }
  383. }
  384. return ['title' => $title , 'data' => $datas];
  385. }
  386. }