Balance.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Author: 芸众商城 www.yunzshop.com
  5. * Date: 2017/3/29
  6. * Time: 下午5:23
  7. */
  8. namespace app\common\models\finance;
  9. use app\common\models\BaseModel;
  10. use app\common\models\Withdraw;
  11. use app\common\observers\balance\BalanceChangeObserver;
  12. use app\common\services\credit\ConstService;
  13. use function foo\func;
  14. use Illuminate\Database\Eloquent\Builder;
  15. /*
  16. * 余额变动记录表
  17. *
  18. * */
  19. class Balance extends BaseModel
  20. {
  21. public $table = 'yz_balance';
  22. protected $guarded= [''];
  23. protected $appends = ['service_type_name','type_name'];
  24. /**
  25. * 设置全局作用域 拼接 uniacid()
  26. */
  27. public static function boot()
  28. {
  29. parent::boot();
  30. static::addGlobalScope(function (Builder $builder) {
  31. return $builder->uniacid();
  32. });
  33. self::observe(BalanceChangeObserver::class);
  34. }
  35. /**
  36. * 模型关联,关联会员数据表
  37. * @return \Illuminate\Database\Eloquent\Relations\HasOne
  38. */
  39. public function member()
  40. {
  41. return $this->hasOne('app\common\models\Member', 'uid', 'member_id');
  42. }
  43. /**
  44. * 模型关联,关联余额转让记录表
  45. * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
  46. */
  47. public function Transfer()
  48. {
  49. return $this->belongsTo('app\common\models\finance\BalanceTransfer', 'order_sn', 'serial_number');
  50. }
  51. /**
  52. * @param $balance
  53. * @return mixed|string
  54. */
  55. public static function getBalanceComment($balance)
  56. {
  57. $balanceComment = static::getSourceComment();
  58. return isset($balanceComment[$balance]) ? $balanceComment[$balance]: '';
  59. }
  60. /**
  61. * @param $balance
  62. * @return mixed|string
  63. */
  64. public static function getTypeNameComment($balance)
  65. {
  66. return isset(static::$type_name[$balance]) ? static::$type_name[$balance]: '';
  67. }
  68. /**
  69. * 通过字段 service_type 输出 service_type_name ;
  70. * @return string
  71. */
  72. public function getServiceTypeNameAttribute()
  73. {
  74. return static::getBalanceComment($this->attributes['service_type']);
  75. }
  76. public function withdraw()
  77. {
  78. return $this->hasOne(Withdraw::class, 'withdraw_sn', 'serial_number');
  79. }
  80. public function balanceRecharge()
  81. {
  82. return $this->hasOne(BalanceRecharge::class, 'ordersn', 'serial_number');
  83. }
  84. /**
  85. * 通过字段 type 输出 type_name 名称
  86. * @return mixed|string
  87. */
  88. public function getTypeNameAttribute()
  89. {
  90. return static::getTypeNameComment($this->attributes['type']);
  91. }
  92. /**
  93. * 检索条件 服务类型
  94. * @param $query
  95. * @param $source
  96. * @return mixed
  97. */
  98. public function scopeOfSource($query, $source)
  99. {
  100. return $query->where('service_type', $source);
  101. }
  102. /**
  103. * 检索条件 会员ID
  104. * @param $query
  105. * @param $memberId
  106. * @return mixed
  107. */
  108. public function scopeOfMemberId($query, $memberId)
  109. {
  110. return $query->where('member_id', $memberId);
  111. }
  112. /**
  113. * 检索条件 单号/流水号
  114. * @param $query
  115. * @param $orderSn
  116. * @return mixed
  117. */
  118. public function scopeOfOrderSn($query, $orderSn)
  119. {
  120. return $query->where('serial_number', $orderSn);
  121. }
  122. public function scopeWithMember($query)
  123. {
  124. return $query->with(['member' => function($query) {
  125. return $query->select('uid', 'nickname', 'realname', 'avatar', 'mobile', 'credit2');
  126. }]);
  127. }
  128. public function scopeSearch($query,$search)
  129. {
  130. if ($search['source']) {
  131. $query->ofSource($search['source']);
  132. }
  133. if ($search['type']) {
  134. $query->whereType($search['type']);
  135. }
  136. if ($search['member_id']) {
  137. $query->where('yz_balance.member_id', $search['member_id']);
  138. }
  139. if ($search['order_sn']) {
  140. $query->where('serial_number', 'like', $search['order_sn'] . '%');
  141. }
  142. if ($search['search_time']) {
  143. if (!is_numeric($search['search_time'][0])) {
  144. $search['search_time'][0] = strtotime($search['search_time'][0]);
  145. $search['search_time'][1] = strtotime($search['search_time'][1]);
  146. } elseif (is_string($search['search_time'])) {
  147. $search['search_time'] = explode(',', $search['search_time']);
  148. $search['search_time'][0] = $search['search_time'][0] / 1000;
  149. $search['search_time'][1] = $search['search_time'][1] / 1000;
  150. } else {
  151. $search['search_time'][0] = $search['search_time'][0] / 1000;
  152. $search['search_time'][1] = $search['search_time'][1] / 1000;
  153. }
  154. $query->whereBetween('yz_balance.created_at', [$search['search_time'][0], $search['search_time'][1]]);
  155. }
  156. return $query;
  157. }
  158. public function scopeSearchMember($query,$search)
  159. {
  160. if ($search['member']) {
  161. $query = $query->join('mc_members', function ($join) use ($search) {
  162. $join->on('yz_balance.member_id', 'mc_members.uid')->where(function ($w) use ($search) {
  163. if ($search['member']) {
  164. $w->where('mc_members.realname', 'like', '%'.$search['member'].'%')
  165. ->orWhere('mc_members.mobile', 'like', '%'.$search['member'].'%')
  166. ->orWhere('mc_members.nickname', 'like', '%'.$search['member'].'%');
  167. }
  168. });
  169. });
  170. }
  171. if ($search['member_level'] || $search['member_group']) {
  172. $query = $query->join('yz_member', function ($join_) use ($search) {
  173. $join_->on('yz_balance.member_id', 'yz_member.member_id')->where(function ($w) use ($search) {
  174. if ($search['member_level']) {
  175. $w->where('yz_member.level_id', $search['member_level']);
  176. }
  177. if ($search['member_group']) {
  178. $w->where('yz_member.group_id', $search['member_group']);
  179. }
  180. });
  181. });
  182. }
  183. return $query;
  184. }
  185. /**
  186. * 获取分页列表
  187. * @param $pageSize
  188. * @return mixed
  189. */
  190. public static function getPageList($pageSize)
  191. {
  192. return self::uniacid()
  193. ->with(['member' => function($query) {
  194. return $query->select('uid', 'nickname', 'realname', 'avatar', 'mobile', 'credit2');
  195. }])
  196. ->orderBy('created_at', 'desc')
  197. ->paginate($pageSize);
  198. }
  199. public static function getSearchPageList($pageSize, $search)
  200. {
  201. $query = static::uniacid();
  202. if ($search['realname']) {
  203. $query = $query->whereHas('member', function ($member)use($search) {
  204. if ($search['realname']) {
  205. $member = $member->select('uid', 'nickname','realname','mobile','avatar','credit2')
  206. ->where('realname', 'like', '%' . $search['realname'] . '%')
  207. ->orWhere('mobile', 'like', '%' . $search['realname'] . '%')
  208. ->orWhere('nickname', 'like', '%' . $search['realname'] . '%');
  209. }
  210. });
  211. }
  212. if ($search['service_type']) {
  213. $query = $query->where('service_type', $search['service_type']);
  214. }
  215. if ($search['searchtime'] == 1) {
  216. $query = $query->whereBetween('created_at', [strtotime($search['time_range']['start']),strtotime($search['time_range']['end'])]);
  217. }
  218. return $query->orderBy('created_at', 'desc')->paginate($pageSize);
  219. }
  220. /**
  221. * 前端接口,通过 type 查看会员余额变动明细
  222. * @param $memberId
  223. * @param string $type
  224. * @return mixed
  225. * @Author yitian */
  226. public static function getMemberDetailRecord($memberId, $type= '')
  227. {
  228. $query = self::uniacid()->with(['balanceRecharge' => function($query) {
  229. $query->select('ordersn', 'remark');
  230. }])->where('member_id',$memberId);
  231. if ($type == static::TYPE_INCOME || $type == static::TYPE_EXPENDITURE) {
  232. $query = $query->where('type', $type);
  233. }
  234. return $query->orderBy('created_at','desc')->orderBy('id','desc')->paginate(15);
  235. }
  236. /**
  237. * 通过记录ID获取记录详情
  238. * @param $id
  239. * @return mixed
  240. * @Author yitian */
  241. public static function getDetailById($id)
  242. {
  243. return static::uniacid()->where('id', $id)
  244. ->with(['member' => function($member) {
  245. return $member->select('uid', 'nickname', 'realname', 'avatar', 'mobile', 'credit2');
  246. }])
  247. ->first();
  248. }
  249. public static function getSourceComment()
  250. {
  251. return (new ConstService())->sourceComment();
  252. }
  253. //2018/5/21 快递单增加余额记录
  254. public static function getBalanceById($member_id)
  255. {
  256. return self::uniacid()->where('member_id', $member_id)->first();
  257. }
  258. //以下常量、方法已经废弃, 防止报错,暂时未删除,请不要使用
  259. //
  260. //
  261. //
  262. const OPERATOR_ORDER_ = -1; //操作者 订单
  263. const OPERATOR_MEMBER = -2; //操作者 会员
  264. //类型:收入
  265. const TYPE_INCOME = 1;
  266. //类型:支出
  267. const TYPE_EXPENDITURE = 2;
  268. const BALANCE_RECHARGE = 1; //充值
  269. const BALANCE_CONSUME = 2; //消费
  270. const BALANCE_TRANSFER = 3; //转让
  271. const BALANCE_DEDUCTION = 4; //抵扣
  272. const BALANCE_AWARD = 5; //奖励
  273. const BALANCE_WITHDRAWAL= 6; //余额提现
  274. const BALANCE_INCOME = 7; //提现至余额
  275. const BALANCE_CANCEL_DEDUCTION = 8; //抵扣取消余额回滚
  276. const BALANCE_CANCEL_AWARD = 9; //奖励取消回滚
  277. const BALANCE_CANCEL_CONSUME = 10; //消费取消回滚
  278. //删除 2017-12-04
  279. /* public static $balanceComment = [
  280. self::BALANCE_RECHARGE => '余额充值',
  281. self::BALANCE_CONSUME => '余额消费',
  282. self::BALANCE_TRANSFER => '余额转让',
  283. self::BALANCE_DEDUCTION => '余额抵扣',
  284. self::BALANCE_AWARD => '余额奖励',
  285. self::BALANCE_WITHDRAWAL => '余额提现',
  286. self::BALANCE_INCOME => '提现至余额',
  287. self::BALANCE_CANCEL_DEDUCTION => '抵扣取消回滚',
  288. self::BALANCE_CANCEL_AWARD => '奖励取消回滚',
  289. self::BALANCE_CANCEL_CONSUME => '消费取消回滚'
  290. ];*/
  291. public static $type_name = [
  292. self::TYPE_INCOME => '收入',
  293. self::TYPE_EXPENDITURE => '支出'
  294. ];
  295. }