// +---------------------------------------------------------------------- namespace App\Services\Api; use App\Models\AccountLogModel; use App\Models\ActionLogModel; use App\Models\AgentModel; use App\Models\BalanceLogModel; use App\Models\MemberModel; use App\Services\BaseService; use App\Services\ConfigService; use App\Services\RedisService; use Illuminate\Support\Facades\DB; /** * 余额管理-服务类 * @author laravel开发员 * @since 2020/11/11 */ class BalanceLogService extends BaseService { public static $instance = null; /** * 构造函数 * @author laravel开发员 * @since 2020/11/11 * AccountService constructor. */ public function __construct() { $this->model = new BalanceLogModel(); } /** * 静态入口 * @return static|null */ public static function make() { if (!self::$instance) { self::$instance = (new static()); } return self::$instance; } /** * @param $params * @param int $pageSize * @return array */ public function getDataList($params, $pageSize = 15) { $query = $this->getQuery($params); $list = $query->select(['a.*']) ->orderBy('a.status','asc') ->orderBy('a.create_time','desc') ->orderBy('a.id','desc') ->paginate($pageSize > 0 ? $pageSize : 9999999); $list = $list? $list->toArray() :[]; if($list){ foreach($list['data'] as &$item){ $item['create_time'] = $item['create_time']? datetime($item['create_time'],'Y-m-d H:i:s') : ''; $item['time_text'] = $item['create_time']? datetime($item['create_time'],'Y年m月d日') : ''; } } return [ 'pageSize'=> $pageSize, 'total'=>isset($list['total'])? $list['total'] : 0, 'list'=> isset($list['data'])? $list['data'] : [] ]; } public function getQuery($params) { $where = ['a.mark' => 1]; $status = isset($params['status'])? $params['status'] : 0; $type = isset($params['type'])? $params['type'] : 0; if($status>0){ $where['a.status'] = $status; } if($type>0){ $where['a.type'] = $type; } return $this->model->with(['member'])->from("balance_logs as a") ->leftJoin('member as b','b.id','=','a.user_id') ->where($where) ->where(function ($query) use($params) { $keyword = isset($params['keyword']) ? $params['keyword'] : ''; $userId = isset($params['user_id'])? $params['user_id'] : 0; if($userId){ $query->where('a.user_id',$userId); } if ($keyword) { $query->where(function($query) use($keyword){ $query->where('b.nickname','like',"%{$keyword}%") ->orWhere('b.mobile','like',"%{$keyword}%") ->orWhere('b.realname','like',"%{$keyword}%"); }); } $orderNo = isset($params['order_no'])? trim($params['order_no']) : ''; if($orderNo){ $query->where(function($query) use($orderNo){ $query->where('a.order_no','like',"%{$orderNo}%"); }); } $account = isset($params['account'])? trim($params['account']) : ''; if($account){ $query->where(function($query) use($account){ $query->where('a.account','like',"%{$account}%"); }); } }) ->where(function ($query) use($params){ // 日期 $date = isset($params['date']) ? $params['date'] : []; $start = isset($date[0])? $date[0] : ''; $end = isset($date[1])? $date[1] : ''; $end = $start>=$end? '' : $end; if ($start) { $query->where('a.create_time','>=', strtotime($start)); } if($end){ $query->where('a.create_time','<=', strtotime($end)); } }); } /** * 收入提现 * @param $userId * @param $params * @return array|false */ public function withdraw($userId, $params) { // 参数验证 $accountType = isset($params['account_type']) && $params['account_type']? intval($params['account_type']) : 2; $money = isset($params['money'])? floatval($params['money']) : 0; $accountRemark = isset($params['account_remark'])? trim($params['account_remark']) : ''; $account = isset($params['account'])? trim($params['account']) : ''; $realname = isset($params['realname'])? trim($params['realname']) : ''; if($money<=0){ $this->error = 2301; return false; } if(empty($realname) || empty($account)){ $this->error = 2302; return false; } $openWithdraw = ConfigService::make()->getConfigByCode('withdraw_open',1); if(!$openWithdraw){ $this->error = 2304; return false; } $withdrawMin = ConfigService::make()->getConfigByCode('withdraw_min',0.1); if($withdrawMin>0 && $money < $withdrawMin){ $this->error = lang(2305,['money'=>$withdrawMin]); return false; } // 锁 $cacheLockKey = "caches:members:withdraw:{$userId}"; if(RedisService::get($cacheLockKey)){ $this->error = 1034; return false; } // 判断用户账号状态 RedisService::set($cacheLockKey, ['user_id'=>$userId,'params'=>$params], rand(10,20)); $userInfo = MemberService::make()->getInfo($userId,[], true); $status = isset($userInfo['status'])? $userInfo['status'] : 0; $balance = isset($userInfo['balance'])? $userInfo['balance'] : 0; $agent = isset($userInfo['agent'])? $userInfo['agent'] : []; $agentBalance = isset($agent['balance'])? $agent['balance'] : 0; $nickname = isset($userInfo['nickname'])? $userInfo['nickname'] : ''; $balance = $accountType==2?$agentBalance:$balance; if(empty($userInfo) || $status != 1){ $this->error = 1045; RedisService::clear($cacheLockKey); return false; } if($accountType==2 && empty($agent)){ $this->error = '代理账号或已被冻结,请联系客服'; RedisService::clear($cacheLockKey); return false; } if($money > $balance){ $this->error = '可提现金额不足'; RedisService::clear($cacheLockKey); return false; } // 提现处理 DB::beginTransaction(); $updateData = ['balance'=>DB::raw("balance - {$money}"),'update_time'=>time()]; // 会员账户 if($accountType==1 && !MemberModel::where(['id'=> $userId])->update($updateData)){ DB::rollBack(); $this->error = '提现处理失败'; RedisService::clear($cacheLockKey); return false; } // 代理账户 else if($accountType==2 && !AgentModel::where(['user_id'=> $userId])->update($updateData)){ DB::rollBack(); $this->error = '提现处理失败'; RedisService::clear($cacheLockKey); return false; } $orderNo = get_order_num('LW'); $order = [ 'user_id'=> $userId, 'order_no'=> $orderNo, 'money'=> $money, 'type'=>2, 'account_type'=> $accountType, 'pay_type'=>0, 'account_remark'=> $accountRemark, 'realname'=> $realname, 'account'=> $account, 'create_time'=> time(), 'status'=>1, 'mark'=>1 ]; if(!$orderId = $this->model::insertGetId($order)){ DB::rollBack(); $this->error = '提现处理失败'; RedisService::clear($cacheLockKey); return false; } $log = [ 'user_id' => $userId, 'source_order_no' => $orderNo, 'type' => 4, 'money' => $money, 'before_money' => $balance, 'date'=> date('Y-m-d'), 'create_time' => time(), 'remark' => '收入提现', 'status' => 1, 'mark' => 1, ]; if(!AccountLogModel::insertGetId($log)){ DB::rollBack(); $this->error = '提现处理失败'; RedisService::clear($cacheLockKey); return false; } DB::commit(); // 操作日志 ActionLogModel::setRecord($userId,['type'=>2,'title'=>'收入提现','content'=>"姓名:{$realname},账号:{$account},提现{$money}元,单号:{$orderNo}",'module'=>'balanceLog']); ActionLogModel::record(); RedisService::clear($cacheLockKey); $this->error = '提现申请成功,请耐心等候审核~'; return ['id'=>$orderId,'money'=>$money]; } }