Ordersstatement.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. <?php
  2. /**
  3. * 对账角色用于对账的订单详情
  4. */
  5. namespace app\admin\controller;
  6. use app\common\controller\Backend;
  7. use app\main\constants\AdminConstants;
  8. /**
  9. * 订单管理
  10. *
  11. * @icon fa fa-circle-o
  12. */
  13. class Ordersstatement extends Backend
  14. {
  15. /**
  16. * @var \app\common\model\Orders Orders模型对象
  17. */
  18. protected $model;
  19. protected $noNeedRight = ['ordersexport'];
  20. public function _initialize()
  21. {
  22. parent::_initialize();
  23. $this->model = model('Orders');
  24. }
  25. /**
  26. * 查看
  27. */
  28. public function index()
  29. {
  30. //设置过滤方法
  31. $this->request->filter(['strip_tags']);
  32. if ($this->request->isAjax()) {
  33. ini_set('memory_limit', '1024M'); //内存限制
  34. //如果发送的来源是Selectpage,则转发到Selectpage
  35. if ($this->request->request('pkey_name')) {
  36. return $this->selectpage();
  37. }
  38. $whereArr = [];
  39. $whereArr['deduct'] = 0;
  40. $filter = $this->request->get("filter", '');
  41. $filter = json_decode($filter, true);
  42. $filter = $filter ? $filter : [];
  43. if (array_key_exists('createtime', $filter)) {
  44. //判断时间区间
  45. $timeRange = explode(' - ', $filter['createtime']);
  46. $stime = strtotime($timeRange[0]);
  47. $etime = strtotime($timeRange[1]);
  48. if (abs($etime - $stime) > (86400 * 31)) {
  49. $this->error("查询时间范围超过 31 天", null, 13);
  50. }
  51. if ($stime < strtotime('2020-01-01 00:00:00') && $etime >= strtotime('2020-01-01 00:00:00')) {
  52. $this->error("查询时间范围禁止跨年", null, 13);
  53. }
  54. // 查询 2020 年明细时,带扣量
  55. if ($stime >= strtotime('2020-01-01 00:00:00') || $etime >= strtotime('2020-01-01 00:00:00')) {
  56. unset($whereArr['deduct']);
  57. }
  58. }
  59. if (!array_key_exists('createtime', $filter)) {
  60. $whereArr['createtime'] = [">=", time() - 3600];
  61. }
  62. list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  63. $total = $this->model
  64. ->where($where)
  65. ->where($whereArr)
  66. ->order($sort, $order)
  67. ->count();
  68. $list = $this->model
  69. ->where($where)
  70. ->where($whereArr)
  71. ->order($sort, $order)
  72. ->limit($offset, $limit)
  73. ->select();
  74. $result = array("total" => $total, "rows" => $list);
  75. return json($result);
  76. }
  77. return $this->view->fetch();
  78. }
  79. /**
  80. * 导出csv
  81. */
  82. public function ordersexport()
  83. {
  84. ini_set('memory_limit', '1024M'); //内存限制
  85. // ID = 1 or 13 超管 & 对账角色才有导出权限
  86. if (!in_array($this->group,
  87. [AdminConstants::ADMIN_GROUP_ID_SUPER_ADMIN, AdminConstants::ADMIN_GROUP_ID_STATEMENT])) {
  88. $this->error("权限错误", '/admin');
  89. }
  90. $whereArr = [];
  91. $whereArr['deduct'] = 0;
  92. $filter = $this->request->get("filter", '');
  93. $filter = json_decode($filter, true);
  94. $filter = $filter ? $filter : [];
  95. if (array_key_exists('createtime', $filter)) {
  96. //判断时间区间
  97. $timeRange = explode(' - ', $filter['createtime']);
  98. $stime = strtotime($timeRange[0]);
  99. $etime = strtotime($timeRange[1]);
  100. if (abs($etime - $stime) > (86400 * 31)) {
  101. $this->error("查询时间范围超过 31 天", null, 13);
  102. }
  103. if ($stime < strtotime('2020-01-01 00:00:00') && $etime >= strtotime('2020-01-01 00:00:00')) {
  104. $this->error("查询时间范围禁止跨年", null, 13);
  105. }
  106. // 查询 2020 年明细时,带扣量
  107. if ($stime >= strtotime('2020-01-01 00:00:00') || $etime >= strtotime('2020-01-01 00:00:00')) {
  108. unset($whereArr['deduct']);
  109. }
  110. }
  111. if (!array_key_exists('createtime', $filter)) {
  112. $whereArr['createtime'] = [">=", time() - 3600];
  113. }
  114. $columns = ['商户单号', '交易单号', '类型', '用户 ID', '充值金额', '支付状态', '下单时间', '完成时间'];
  115. list($where, $sort, $order, $offset, $limit) = $this->buildparams();
  116. $limit = 2000;
  117. $fileName = "导出订单数据-" . date('YmdHis', time()) . ".csv";
  118. header('Content-Description: File Transfer');
  119. header('Content-Type: application/vnd.ms-excel');
  120. header("Content-Disposition: attachment; filename=" . $fileName);
  121. header('Expires: 0');
  122. header('Cache-Control: must-revalidate');
  123. header('Pragma: public');
  124. $fp = fopen('php://output', 'a');//打开output流
  125. mb_convert_variables('GBK', 'UTF-8', $columns);
  126. fputcsv($fp, $columns);//将数据格式化为CSV格式并写入到output流中
  127. $total = $this->model
  128. ->where($where)
  129. ->where($whereArr)
  130. ->count();
  131. $pages = ceil($total / $limit);
  132. $orderId = 0;
  133. for ($i = 1; $i <= $pages; $i++) {
  134. $offset = 0;
  135. if ($i > 1) {
  136. $whereArr['id'] = ['<', $orderId];
  137. }
  138. $list = $this->model
  139. ->field('id,out_trade_no,transaction_id,type,user_id,money,state,createtime,finishtime')
  140. ->where($where)
  141. ->where($whereArr)
  142. ->order(['createtime' => 'desc', 'id' => 'desc'])
  143. ->limit($offset, $limit)
  144. ->select();
  145. if (!empty($list)) {
  146. $endArr = end($list);
  147. $orderId = $endArr['id'];
  148. foreach ($list as $k => $v) {
  149. // '\t' 可以解决科学技术法问题
  150. $rowData = [
  151. '"' . $v['out_trade_no'] . '"',
  152. empty($v['transaction_id']) ? "无" : "\t" . $v['transaction_id'] . "\t",
  153. $v['type'] == 1 ? '书币充值' : 'VIP充值',
  154. $v['user_id'],
  155. $v['money'],
  156. $v['state'] == 1 ? '已支付' : '未支付',
  157. date('Y-m-d H:i:s', $v['createtime']),
  158. $v['state'] == 1 ? date('Y-m-d H:i:s', $v['finishtime']) : '',
  159. ];
  160. mb_convert_variables('GBK', 'UTF-8', $rowData); //需要格式转换,否则会乱码
  161. fputcsv($fp, $rowData);
  162. }
  163. }
  164. }
  165. fclose($fp);
  166. exit;
  167. }
  168. }