User.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. <?php
  2. /**
  3. *
  4. * @author: xaboy<365615158@qq.com>
  5. * @day: 2017/12/21
  6. */
  7. namespace app\wap\model\user;
  8. use basic\ModelBasic;
  9. use app\core\util\SystemConfigService;
  10. use think\Request;
  11. use think\response\Redirect;
  12. use think\Session;
  13. use think\Url;
  14. use traits\ModelTrait;
  15. class User extends ModelBasic
  16. {
  17. use ModelTrait;
  18. protected $insert = ['add_time','add_ip','last_time','last_ip'];
  19. protected function setAddTimeAttr($value)
  20. {
  21. return time();
  22. }
  23. protected function setAddIpAttr($value)
  24. {
  25. return Request::instance()->ip();
  26. }
  27. protected function setLastTimeAttr($value)
  28. {
  29. return time();
  30. }
  31. protected function setLastIpAttr($value)
  32. {
  33. return Request::instance()->ip();
  34. }
  35. public static function setWechatUser($wechatUser,$spread_uid = 0)
  36. {
  37. return self::set([
  38. 'account'=>'wx'.$wechatUser['uid'].time(),
  39. 'pwd'=>md5(123456),
  40. 'nickname'=>$wechatUser['nickname']?:'',
  41. 'avatar'=>$wechatUser['headimgurl']?:'',
  42. 'spread_uid'=>$spread_uid,
  43. 'uid'=>$wechatUser['uid'],
  44. 'user_type'=>'wechat'
  45. ]);
  46. }
  47. public static function updateWechatUser($wechatUser,$uid)
  48. {
  49. return self::edit([
  50. 'nickname'=>$wechatUser['nickname']?:'',
  51. 'avatar'=>$wechatUser['headimgurl']?:''
  52. ],$uid,'uid');
  53. }
  54. public static function setSpreadUid($uid,$spreadUid)
  55. {
  56. //TODO 获取后台分销类型
  57. $storeBrokerageStatus = SystemConfigService::get('store_brokerage_statu');
  58. $storeBrokerageStatus = $storeBrokerageStatus ? $storeBrokerageStatus : 1;
  59. if($storeBrokerageStatus == 1){
  60. $spreadCount = self::where('uid',$spreadUid)->count();
  61. if($spreadCount){
  62. $spreadInfo = self::where('uid',$spreadUid)->find();
  63. if($spreadInfo->is_promoter){
  64. //TODO 只有扫码才可以获得推广权限
  65. if(isset($wechatUser['isPromoter'])) $data['is_promoter'] = 1;
  66. }
  67. }
  68. }
  69. return self::where('uid',$uid)->update(['spread_uid'=>$spreadUid,'spread_time'=>time()]);
  70. }
  71. public static function getUserInfo($uid)
  72. {
  73. $userInfo = self::where('uid',$uid)->find();
  74. if(!$userInfo) exception('读取用户信息失败!');
  75. return $userInfo->toArray();
  76. }
  77. /**
  78. * 获得当前登陆用户UID
  79. * @return int $uid
  80. */
  81. public static function getActiveUid()
  82. {
  83. $uid = null;
  84. if(Session::has('loginUid','wap')) $uid = Session::get('loginUid','wap');
  85. if(!$uid && Session::has('loginOpenid','wap') && ($openid = Session::get('loginOpenid','wap')))
  86. $uid = WechatUser::openidToUid($openid);
  87. if(!$uid) exit(exception('请登陆!'));
  88. return $uid;
  89. }
  90. /**
  91. * TODO 一级返佣
  92. * @param $orderInfo
  93. * @return bool
  94. */
  95. public static function backOrderBrokerage($orderInfo)
  96. {
  97. //TODO 如果时营销产品不返佣金
  98. if(isset($orderInfo['combination_id']) && $orderInfo['combination_id']) return true;
  99. if(isset($orderInfo['seckill_id']) && $orderInfo['seckill_id']) return true;
  100. if(isset($orderInfo['bargain_id']) && $orderInfo['bargain_id']) return true;
  101. //TODO 支付金额减掉邮费
  102. $orderInfo['pay_price'] = bcsub($orderInfo['pay_price'],$orderInfo['pay_postage'],2);
  103. //TODO 获取购买商品的用户
  104. $userInfo = User::getUserInfo($orderInfo['uid']);
  105. //TODO 当前用户不存在 或者 没有上级 直接返回
  106. if(!$userInfo || !$userInfo['spread_uid']) return true;
  107. //TODO 获取后台分销类型 1 指定分销 2 人人分销
  108. $storeBrokerageStatus = SystemConfigService::get('store_brokerage_statu');
  109. $storeBrokerageStatus = $storeBrokerageStatus ? $storeBrokerageStatus : 1;
  110. //TODO 指定分销 判断 上级是否时推广员 如果不是推广员直接跳转二级返佣
  111. if($storeBrokerageStatus == 1){
  112. if(!User::be(['uid'=>$userInfo['spread_uid'],'is_promoter'=>1])) return self::backOrderBrokerageTwo($orderInfo);
  113. }
  114. //TODO 获取后台一级返佣比例
  115. $storeBrokerageRatio = SystemConfigService::get('store_brokerage_ratio');
  116. //TODO 一级返佣比例 小于等于零时直接返回 不返佣
  117. if($storeBrokerageRatio <= 0) return true;
  118. //TODO 计算获取一级返佣比例
  119. $brokerageRatio = bcdiv($storeBrokerageRatio,100,2);
  120. //TODO 成本价
  121. $cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;
  122. //TODO 成本价大于等于支付价格时直接返回
  123. if($cost >= $orderInfo['pay_price']) return true;
  124. //TODO 获取订单毛利
  125. $payPrice = bcsub($orderInfo['pay_price'],$cost,2);
  126. //TODO 返佣金额 = 毛利 / 一级返佣比例
  127. $brokeragePrice = bcmul($payPrice,$brokerageRatio,2);
  128. //TODO 返佣金额小于等于0 直接返回不返佣金
  129. if($brokeragePrice <= 0) return true;
  130. //TODO 获取上级推广员信息
  131. $spreadUserInfo = User::getUserInfo($userInfo['spread_uid']);
  132. //TODO 上级推广员返佣之后的金额
  133. $balance = bcadd($spreadUserInfo['brokerage_price'],$brokeragePrice,2);
  134. $mark = $userInfo['nickname'].'成功消费'.floatval($orderInfo['pay_price']).'元,奖励推广佣金'.floatval($brokeragePrice);
  135. self::beginTrans();
  136. //TODO 添加推广记录
  137. $res1 = UserBill::income('获得推广佣金',$userInfo['spread_uid'],'now_money','brokerage',$brokeragePrice,$orderInfo['id'],$balance,$mark);
  138. //TODO 添加用户余额
  139. $res2 = self::bcInc($userInfo['spread_uid'],'brokerage_price',$brokeragePrice,'uid');
  140. $res = $res1 && $res2;
  141. self::checkTrans($res);
  142. //TODO 一级返佣成功 跳转二级返佣
  143. if($res) return self::backOrderBrokerageTwo($orderInfo);
  144. return $res;
  145. }
  146. /**
  147. * TODO 二级推广
  148. * @param $orderInfo
  149. * @return bool
  150. */
  151. public static function backOrderBrokerageTwo($orderInfo){
  152. //TODO 获取购买商品的用户
  153. $userInfo = User::getUserInfo($orderInfo['uid']);
  154. //TODO 获取上推广人
  155. $userInfoTwo = User::getUserInfo($userInfo['spread_uid']);
  156. //TODO 上推广人不存在 或者 上推广人没有上级 直接返回
  157. if(!$userInfoTwo || !$userInfoTwo['spread_uid']) return true;
  158. //TODO 获取后台分销类型 1 指定分销 2 人人分销
  159. $storeBrokerageStatus = SystemConfigService::get('store_brokerage_statu');
  160. $storeBrokerageStatus = $storeBrokerageStatus ? $storeBrokerageStatus : 1;
  161. //TODO 指定分销 判断 上上级是否时推广员 如果不是推广员直接返回
  162. if($storeBrokerageStatus == 1){
  163. if(!User::be(['uid'=>$userInfoTwo['spread_uid'],'is_promoter'=>1])) return true;
  164. }
  165. //TODO 获取二级返佣比例
  166. $storeBrokerageTwo = SystemConfigService::get('store_brokerage_two');
  167. //TODO 二级返佣比例小于等于0 直接返回
  168. if($storeBrokerageTwo <= 0) return true;
  169. //TODO 计算获取二级返佣比例
  170. $brokerageRatio = bcdiv($storeBrokerageTwo,100,2);
  171. //TODO 获取成本价
  172. $cost = isset($orderInfo['cost']) ? $orderInfo['cost'] : 0;
  173. //TODO 成本价大于等于支付价格时直接返回
  174. if($cost >= $orderInfo['pay_price']) return true;
  175. //TODO 获取订单毛利
  176. $payPrice = bcsub($orderInfo['pay_price'],$cost,2);
  177. //TODO 返佣金额 = 毛利 / 二级返佣比例
  178. $brokeragePrice = bcmul($payPrice,$brokerageRatio,2);
  179. //TODO 返佣金额小于等于0 直接返回不返佣金
  180. if($brokeragePrice <= 0) return true;
  181. //TODO 获取上上级推广员信息
  182. $spreadUserInfoTwo = User::getUserInfo($userInfoTwo['spread_uid']);
  183. //TODO 获取上上级推广员返佣之后余额
  184. $balance = bcadd($spreadUserInfoTwo['brokerage_price'],$brokeragePrice,2);
  185. $mark = '二级推广人'.$userInfo['nickname'].'成功消费'.floatval($orderInfo['pay_price']).'元,奖励推广佣金'.floatval($brokeragePrice);
  186. self::beginTrans();
  187. //TODO 添加返佣记录
  188. $res1 = UserBill::income('获得推广佣金',$userInfoTwo['spread_uid'],'now_money','brokerage',$brokeragePrice,$orderInfo['id'],$balance,$mark);
  189. //TODO 添加用户余额
  190. $res2 = self::bcInc($userInfoTwo['spread_uid'],'brokerage_price',$brokeragePrice,'uid');
  191. $res = $res1 && $res2;
  192. self::checkTrans($res);
  193. return $res;
  194. }
  195. }