Receipt.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types = 1);
  12. namespace app\store\model;
  13. use app\common\enum\order\OrderStatus as OrderStatusEnum;
  14. use app\common\model\Receipt as ReceiptModel;
  15. /**
  16. * 商家记录表模型
  17. * Class Store
  18. * @package app\store\model
  19. */
  20. class Receipt extends ReceiptModel
  21. {
  22. public function getList($conditions){
  23. $model = $this->getQuery($conditions);
  24. return $model->alias('receipt')
  25. ->leftJoin('order','receipt.order_id=order.order_id')
  26. ->leftJoin("member_order",'receipt.order_id=member_order.id')
  27. ->field('receipt.*,order.pay_status,order.order_status,order.finished_refund')
  28. ->order('receipt_id','desc')->paginate(15)
  29. ->each(function($v) {
  30. // 是否可开票
  31. $v['can_invoice'] = $this->checkCanInvoice($v,$v['ftype']);
  32. if ($v['order_status'] != OrderStatusEnum::CLOSE) { // 未关闭的订单
  33. $v['finished_refund'] = 0;
  34. }
  35. //会员卡不可以退款
  36. if($v['ftype']==2){
  37. $v['finished_refund'] = 0;
  38. }
  39. });
  40. }
  41. /**
  42. * 验证是否可开票 会员卡付款后可开票
  43. * ftype=1 商品
  44. * @param $order
  45. * @return bool
  46. */
  47. private function checkCanInvoice($order,$ftype=0) {
  48. //会员卡付款后可开票,也即是
  49. if($ftype==2){
  50. return 1;
  51. }
  52. $orderGoods = OrderGoods::with(['refund'])->where('order_id', $order['order_id'])->select()->toArray();
  53. $refundClose = false; // 是否 订单所有商品售后入口关闭; 订单商品表 refund_time 中最大的时间 < 当前时间
  54. $oneNotRefund = false; // 订单中至少有一款商品未退款成功 订单表 order_status 不等于40-已关闭
  55. $refundTimeMax = 0;
  56. if(count($orderGoods)){
  57. $refundTimeMax = max(array_column($orderGoods, 'refund_time'));
  58. }
  59. //$refundTimeMax = max(array_column($orderGoods, 'refund_time'));
  60. if ($refundTimeMax > 0 && time() > $refundTimeMax) {
  61. $refundClose = true;
  62. }
  63. if ($order['order_status'] != OrderStatusEnum::CLOSE) {
  64. $oneNotRefund = true;
  65. }
  66. if (
  67. $refundClose // 订单所有商品售后入口关闭
  68. && OrderRefund::where('status', 0)->where('order_id', $order['order_id'])->count() == 0 // 不存在 进行中的售后单
  69. && $oneNotRefund // 订单中至少有一款商品未退款成功。(所有商品都退款完成订单会关闭,所以不建议开票)
  70. ) {
  71. return 1;
  72. }
  73. return 0;
  74. }
  75. private function getQuery($conditions) {
  76. $model = new self();
  77. $from = 1633017600 ;$to = time();
  78. if ($conditions and count($conditions)){
  79. foreach ($conditions as $key=>$c){
  80. if ($key == "headup" && trim($c,' ')){
  81. $model = $model->whereLike('receipt.'.$key,'%'.$c.'%');
  82. }
  83. if ($key == 'tax_no' && trim($c,' ')){
  84. $model = $model->whereLike('receipt.'.$key,'%'.$c.'%');
  85. }
  86. if ($key == 'status' && $c != '-1'){
  87. $model = $model->where('receipt.'.$key,$c);
  88. }
  89. if ($key =='betweenTime'){
  90. if (isset($c[0]) && $c[0] && isset($c[1]) && $c[1]){
  91. $times = between_time($c);
  92. $from = $times['start_time'];
  93. $to = $times['end_time'] + 86400;
  94. $model = $model->whereBetweenTime('receipt.create_time',$from,$to);
  95. }
  96. }
  97. if ($key == 'receipt_ids' && !empty($c)) {
  98. $model = $model->whereIn('receipt.receipt_id', $c);
  99. }
  100. if ($key == 'order_status'){
  101. if ($c == 40){
  102. $model = $model->where('order.order_status',$c);
  103. }else{
  104. $model = $model->where('order.order_status','<>',40);
  105. }
  106. }
  107. if ($key == 'order_no' && trim($c,' ')){
  108. $model = $model->whereLike('receipt.'.$key,'%'.$c.'%');
  109. }
  110. // 是否已全部退款成功
  111. if ($key == 'finished_refund' && $c != '-1'){
  112. if ($c == 1) {
  113. $model = $model->where('order.'.$key,$c)->where('order.order_status', '=', OrderStatusEnum::CLOSE);
  114. } else {
  115. $model = $model->where('order.order_status', '<>', OrderStatusEnum::CLOSE)
  116. ->whereOr('order.order_status', '=', null);
  117. }
  118. }
  119. //邮箱搜索
  120. if ($key == "email" && trim($c,' ')){
  121. $model = $model->whereLike('receipt.'.$key,'%'.$c.'%');
  122. }
  123. }
  124. }
  125. return $model;
  126. }
  127. public static function updateStatus($id,$receipt_no){
  128. self::where('receipt_id',$id)->update(['status'=>20,'receipt_no'=>$receipt_no]);
  129. return true;
  130. }
  131. public static function getDetail($id){
  132. return self::find($id);
  133. }
  134. /**
  135. * 获取待开发票数量
  136. * @return int
  137. */
  138. public function getWaitReceiptTotal()
  139. {
  140. $orders = $this->where('status', 10)->select();
  141. $total = 0;
  142. foreach ($orders as $order){
  143. $can_invoice = $this->checkCanInvoice($order,$order['ftype']);
  144. if($can_invoice) $total += 1;
  145. }
  146. return $total;
  147. }
  148. /**
  149. * 导出发票申请记录
  150. */
  151. public function export(array $param)
  152. {
  153. $data['header'] = ['订单编号', '发票抬头', '税号', '发票金额','邮箱地址', '申请时间','是否已退款', '是否可开票', '开票状态'];// '发票类型',
  154. $data['filename'] = '发票申请导出';
  155. $data['data'] = [];
  156. $model = $this->getQuery($param);
  157. $list = $model->alias('receipt')
  158. ->leftJoin('order','receipt.order_id=order.order_id')
  159. ->field('receipt.*,order.pay_status,order.order_status,order.finished_refund')
  160. ->order('receipt_id','desc')
  161. ->select();
  162. foreach ($list as $arr){
  163. $new_list['order_no'] = (string)$arr['order_no'];
  164. $new_list['headup'] = $arr['headup'];
  165. $new_list['tax_no'] = $arr['tax_no'];
  166. $new_list['pay_money'] = $arr['pay_money'];
  167. //$new_list['receipt_type'] = $arr['receipt_type']==10?'增值税电子普通发票':'其它';
  168. $new_list['email'] = $arr['email'];
  169. $new_list['create_time'] = $arr['create_time'];
  170. $new_list['finished_refund'] = $arr['finished_refund']?'是' : '否';
  171. $new_list['can_invoice'] = $this->checkCanInvoice($arr) ? '是' : '否';
  172. $new_list['status'] = str_replace([10,20],['待开票', '已开票'], $arr['status']);
  173. $data['data'][] = $new_list;
  174. }
  175. return $data;
  176. }
  177. }