Balance.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/4/17
  6. * Time: 下午4:09
  7. */
  8. namespace app\frontend\modules\finance\models;
  9. use \app\common\models\finance\Balance as BalanceModel;
  10. use app\common\services\credit\ConstService;
  11. use \app\frontend\modules\finance\models\BalanceTransfer;
  12. use Illuminate\Database\Eloquent\Builder;
  13. use Illuminate\Support\Collection;
  14. class Balance extends BalanceModel
  15. {
  16. protected $appends = ['service_type_name','type_name','transfer_member_id','transfer_member_name'];
  17. /**
  18. * 设置全局作用域
  19. */
  20. public static function boot()
  21. {
  22. parent::boot();
  23. static::addGlobalScope(
  24. function(Builder $builder){
  25. return $builder->where('member_id',\YunShop::app()->getMemberId());
  26. }
  27. );
  28. }
  29. /**
  30. * 输出附加字段 transfer_member_id
  31. * @return string
  32. */
  33. public function getTransferMemberIdAttribute()
  34. {
  35. $transferModel = $this->getTransferModel();
  36. if ($this->attributes['type'] == ConstService::TYPE_INCOME) {
  37. return $transferModel->transferor ?: '';
  38. }
  39. return $transferModel->recipient ?: '';
  40. }
  41. /**
  42. * 输出附加字段 transfer_member_name
  43. * @return string
  44. */
  45. public function getTransferMemberNameAttribute()
  46. {
  47. $transferModel = $this->getTransferModel();
  48. if ($this->attributes['type'] == ConstService::TYPE_INCOME) {
  49. return $transferModel->transferInfo->realname ?: $transferModel->transferInfo->nickname ?: '';
  50. }
  51. return $transferModel->recipientInfo->realname ?: $transferModel->recipientInfo->nickname ?: '';
  52. }
  53. /**
  54. * 通过订单号获取
  55. * @return mixed
  56. */
  57. private function getTransferModel()
  58. {
  59. return BalanceTransfer::ofOrderSn($this->attributes['serial_number'])->withTransfer()->withRecipient()->first();
  60. }
  61. /**
  62. * 获取最新的三条记录
  63. * @return mixed
  64. */
  65. public static function getThreeData()
  66. {
  67. $log = self::orderBy('id', 'desc')
  68. ->limit(3)
  69. ->get(['type', 'created_at', 'new_money', 'change_money', 'service_type']);
  70. return $log;
  71. }
  72. /**
  73. * 获取余额明细列表
  74. * 按照月份分组
  75. * @return mixed
  76. */
  77. public static function getMemberRecordList()
  78. {
  79. $search = request()->search;
  80. $query = self::select(['id','created_at', 'type', 'change_money', 'new_money', 'service_type', 'serial_number'])
  81. ->with([
  82. 'withdraw'=>function($query){
  83. $query->select('withdraw_sn','reject_reason');
  84. }]);
  85. $query->when($search['date'], function ($table, $date){
  86. $date = date('Y-m-01', strtotime($date));
  87. $time = strtotime("{$date} +1 month -1 day") + 86399;
  88. $table->where('created_at', '<=', $time);
  89. });
  90. $query->searchRecord();
  91. $list = $query->orderBy('created_at','desc')->orderBy('id','desc')->paginate(15)->toArray();
  92. if($list['data']){
  93. foreach ($list['data'] as &$item){
  94. $item['group_date'] = date('Y-m', strtotime($item['created_at']));
  95. $item['action_type'] = '';
  96. if ($item['service_type'] == 3) {
  97. switch ($item['type']) {
  98. case 1:
  99. $item['action_type'] = '转让人';
  100. break;
  101. case 2:
  102. $item['action_type'] = '受让人';
  103. break;
  104. default;
  105. }
  106. }
  107. }
  108. $list['data'] = collect($list['data'])->groupBy('group_date');
  109. }
  110. return $list;
  111. }
  112. /**
  113. * 统计每个月的支出与收入
  114. * @param $date_key
  115. * @return array
  116. */
  117. public static function getExpendAndIncome($date_key = []) : Collection
  118. {
  119. if(!$date_key){
  120. return collect();
  121. }
  122. $query = self::select(['type', 'change_money', 'created_at']);
  123. $query->searchRecord();
  124. $query->whereBetween('created_at', $date_key);
  125. $query->orderBy('created_at', 'desc');
  126. $record_list = $query->get()->toArray();
  127. //先让数据按照月份分组
  128. foreach ($record_list as &$record){
  129. $record['group_date'] = date('Y-m', strtotime($record['created_at']));;
  130. }
  131. $data = [];
  132. //根据每组(月份)的支出,收入进行统计。以月份作为键值
  133. collect($record_list)->groupBy('group_date')->each(function ($recordList, $date) use (&$data){
  134. $data[$date]['income'] = 0;//收入
  135. $data[$date]['expend'] = 0;//支出
  136. $recordList->each(function ($record) use (&$data, $date){
  137. if($record['type'] == 1){
  138. $data[$date]['income'] = round($record['change_money'] + $data[$date]['income'], 2);
  139. }else if($record['type'] == 2){
  140. $data[$date]['expend'] -= $record['change_money'];
  141. $data[$date]['expend'] = round($data[$date]['expend'], 2);
  142. }
  143. });
  144. });
  145. return collect($data);
  146. }
  147. /**
  148. * 余额明细搜索记录
  149. * @param Builder $query
  150. * @return void
  151. */
  152. public function scopeSearchRecord(Builder $query)
  153. {
  154. $search = request()->search;
  155. $type_comment = [ConstService::TYPE_EXPENDITURE, ConstService::TYPE_INCOME];
  156. //如果条件是支出或者收入
  157. $query->when(in_array($search['record_type'], $type_comment), function ($table) use ($search) {
  158. $table->where('type', $search['record_type']);
  159. });
  160. //业务类型
  161. $query->when($search['service_type'], function ($table, $service_type){
  162. $table->where('service_type', $service_type);
  163. });
  164. }
  165. /**
  166. * 获取用户余额记录所拥有的服务类型
  167. * @return \app\framework\Database\Eloquent\Collection
  168. */
  169. public static function getServiceType()
  170. {
  171. $service_type = static::select(['service_type'])
  172. ->groupBy('service_type')
  173. ->pluck('service_type');
  174. return $service_type;
  175. }
  176. }