MemberNodeService.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | LARAVEL8.0 框架 [ LARAVEL ][ RXThinkCMF ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2017~2021 LARAVEL研发中心
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://www.laravel.cn
  8. // +----------------------------------------------------------------------
  9. // | Author: laravel开发员 <laravel.qq.com>
  10. // +----------------------------------------------------------------------
  11. namespace App\Services\Api;
  12. use App\Models\AccountLogModel;
  13. use App\Models\MemberLevelModel;
  14. use App\Models\MemberModel;
  15. use App\Models\MemberNodeModel;
  16. use App\Models\MemberSettingModel;
  17. use App\Services\BaseService;
  18. use App\Services\ConfigService;
  19. use App\Services\RedisService;
  20. use Illuminate\Support\Facades\DB;
  21. /**
  22. * 节点会员服务管理-服务类
  23. * @author laravel开发员
  24. * @since 2020/11/11
  25. * @package App\Services\Common
  26. */
  27. class MemberNodeService extends BaseService
  28. {
  29. protected static $instance=null;
  30. /**
  31. * 构造函数
  32. * @author laravel开发员
  33. * @since 2020/11/11
  34. * MemberSettingService constructor.
  35. */
  36. public function __construct()
  37. {
  38. $this->model = new MemberNodeModel();
  39. }
  40. /**
  41. * 静态入口
  42. * @return static|null
  43. */
  44. public static function make()
  45. {
  46. if (!self::$instance) {
  47. self::$instance = (new static());
  48. }
  49. return self::$instance;
  50. }
  51. /**
  52. * 列表数据
  53. * @param $params
  54. * @param int $pageSize
  55. * @return array
  56. */
  57. public function getDataList($params, $pageSize = 15, $field = '', $userId=0)
  58. {
  59. $where = ['a.mark' => 1,'a.status'=>1];
  60. $field = $field? $field : 'lev_a.id,lev_a.name,lev_a.price,lev_a.upgrade_level_id,lev_b.global_bonus_rate,lev_a.limit_num,lev_a.box_num,lev_a.score_rate,lev_a.remark,lev_a.status';
  61. $sortType = isset($params['sort_type']) ? $params['sort_type'] : 1;
  62. $order = 'id asc';
  63. if($sortType == 1){
  64. $order = 'lev_a.id asc';
  65. }
  66. $list = $this->model->from('member_nodes as a')
  67. ->leftJoin('member_level as b','b.id','=','a.upgrade_level_id')
  68. ->where($where)
  69. ->selectRaw($field)
  70. ->orderByRaw($order)
  71. ->paginate($pageSize > 0 ? $pageSize : 9999999);
  72. $list = $list ? $list->toArray() : [];
  73. if ($list) {
  74. foreach ($list['data'] as &$item) {
  75. $item['level_box_num'] = (int)MemberLevelModel::where('id','<=', $item['upgrade_level_id'])->where(['status'=>1,'mark'=>1])->sum('box_num');
  76. // 是否已购买
  77. $buyLogId = AccountLogModel::where(['user_id'=> $userId,'source_id'=>$item['id'],'type'=>4,'status'=>1,'mark'=>1])->value('id');
  78. $item['buy_status'] = $buyLogId? 1 : 0;
  79. }
  80. }
  81. return [
  82. 'pageSize' => $pageSize,
  83. 'total' => isset($list['total']) ? $list['total'] : 0,
  84. 'list' => isset($list['data']) ? $list['data'] : []
  85. ];
  86. }
  87. /**
  88. * 购买节点
  89. * @param $userId 用户ID
  90. * @param $params 节点参数:id-节点ID,pay_password-交易密码
  91. * @return bool
  92. */
  93. public function buyNode($userId, $params)
  94. {
  95. $nodeId = isset($params['id'])? intval($params['id']) : 0;
  96. $payPassword = isset($params['pay_password'])? trim($params['pay_password']) : '';
  97. if($nodeId<=0){
  98. $this->error = 2014;
  99. return false;
  100. }
  101. $cacheKey = "caches:members:nodes:buy_{$userId}_{$nodeId}";
  102. if(RedisService::get($cacheKey.'_lock')){
  103. $this->error = 1034;
  104. return false;
  105. }
  106. $nodeInfo = $this->model->where(['a.id'=> $nodeId,'a.status'=>1,'a.mark'=>1])
  107. ->leftJoin('member_level as b','b.id','=','a.upgrade_level_id')
  108. ->select(['a.*','b.name as level_name'])
  109. ->first();
  110. $price = isset($nodeInfo['price'])? floatval($nodeInfo['price']) : 0;
  111. $boxNum = isset($nodeInfo['box_num'])? intval($nodeInfo['box_num']) : 0;
  112. $upgradeLevelId = isset($nodeInfo['upgrade_level_id'])? intval($nodeInfo['upgrade_level_id']) : 0;
  113. $nodeName = isset($nodeInfo['name'])? $nodeInfo['name'] : '';
  114. $levelName = isset($nodeInfo['level_name'])? $nodeInfo['level_name'] : '';
  115. if(empty($nodeInfo) || $price<=0){
  116. $this->error = 2501;
  117. return false;
  118. }
  119. $userInfo = $this->model->where(['id'=> $userId,'mark'=>1])
  120. ->select(['id','nickname','usdt','wait_score','trc_url','pay_password','status'])
  121. ->first();
  122. $status = isset($userInfo['status'])? $userInfo['status'] : 0;
  123. $userUsdt = isset($userInfo['usdt'])? $userInfo['usdt'] : 0;
  124. $userPayPassword = isset($userInfo['pay_password'])? $userInfo['pay_password'] : '';
  125. $userWaitScore = isset($userInfo['wait_score'])? $userInfo['wait_score'] : 0;
  126. if(empty($userInfo) || $status != 1){
  127. $this->error = 2024;
  128. return false;
  129. }
  130. // 是否已经购买过
  131. if(AccountLogModel::where(['user_id'=> $userId,'source_id'=>$nodeId,'type'=>4,'status'=>1,'mark'=>1])->value('id')){
  132. $this->error = 2502;
  133. return false;
  134. }
  135. // USDT余额是否足够
  136. if($userUsdt < $price){
  137. $this->error = 2035;
  138. return false;
  139. }
  140. // 交易密码
  141. if(empty($userPayPassword)){
  142. $this->error = 1040;
  143. return false;
  144. }
  145. if($userPayPassword != get_password($payPassword)){
  146. $this->error = 2038;
  147. return false;
  148. }
  149. // 购买明细
  150. $orderNo = get_order_num('VN');
  151. DB::beginTransaction();
  152. $log = [
  153. 'user_id' => $userId,
  154. 'source_id' => $nodeId,
  155. 'source_order_no' => $orderNo,
  156. 'type' => 4,
  157. 'coin_type' => 1,
  158. 'user_type'=> 1,
  159. 'money' => -$price,
  160. 'actual_money' => -$price,
  161. 'balance' => $userUsdt,
  162. 'create_time' => time(),
  163. 'update_time' => time(),
  164. 'remark' => "购买{$nodeName}",
  165. 'status' => 1,
  166. 'mark' => 1,
  167. ];
  168. if(!AccountLogModel::insertGetId($log)){
  169. DB::rollBack();
  170. $this->error = 2029;
  171. RedisService::clear($cacheKey);
  172. return false;
  173. }
  174. // 待返积分明细
  175. $xdPrice = ConfigService::make()->getConfigByCode('xd_price',100);
  176. $xdPrice = $xdPrice>0 && $xdPrice<=10000? $xdPrice : 100;
  177. $waitScoreRate = ConfigService::make()->getConfigByCode('node_award_score_rate', 200);
  178. $waitScoreRate = $waitScoreRate>0 && $waitScoreRate<=1000? $waitScoreRate : 0;
  179. $waitScore = moneyFormat($price * $xdPrice * $waitScoreRate/100, 2);
  180. if($waitScore>0){
  181. $log = [
  182. 'user_id' => $userId,
  183. 'source_id' => $nodeId,
  184. 'source_order_no' => $orderNo,
  185. 'type' => 9,
  186. 'coin_type' => 5,
  187. 'user_type'=> 1,
  188. 'money' => $waitScore,
  189. 'actual_money' => $waitScore,
  190. 'balance' => $userWaitScore,
  191. 'create_time' => time(),
  192. 'update_time' => time(),
  193. 'remark' => "购买{$nodeName}",
  194. 'status' => 1,
  195. 'mark' => 1,
  196. ];
  197. if(!AccountLogModel::insertGetId($log)){
  198. DB::rollBack();
  199. $this->error = 2029;
  200. RedisService::clear($cacheKey);
  201. return false;
  202. }
  203. }
  204. // 账户
  205. $updateData = [
  206. 'usdt'=> DB::raw("usdt - {$price}"), // 扣除USDT
  207. 'supper_point'=>$nodeId,
  208. 'member_level'=> $upgradeLevelId, // 直达等级
  209. 'box_num'=>DB::raw("box_num + {$boxNum}"), // 奖励盲盒数量
  210. 'wait_score'=>DB::raw("wait_score + {$waitScore}"), // 奖励盲盒数量
  211. 'update_time'=>time()
  212. ];
  213. if(!MemberModel::where(['id'=> $userId])->update($updateData)){
  214. DB::rollBack();
  215. $this->error = 2036;
  216. RedisService::clear($cacheKey);
  217. return false;
  218. }
  219. // 消息
  220. $dateTime = date('Y-m-d H:i:s');
  221. $levelTip = $upgradeLevelId>0? ",并升级为{$levelName}" :'';
  222. MessageService::make()->pushMessage($userId,"购买{$nodeName}成功","您在{$dateTime}(UTC+8)成功支付{$price}USDT购买【{$nodeName}】{$levelTip}。",3);
  223. DB::commit();
  224. $this->error = 2503;
  225. return true;
  226. }
  227. }