UserExtract.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2022 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\wap\model\user;
  12. use basic\ModelBasic;
  13. use service\WechatTemplateService;
  14. use think\Url;
  15. use traits\ModelTrait;
  16. use app\wap\model\routine\RoutineTemplate;
  17. use app\wap\model\merchant\Merchant as MerchantModel;
  18. use app\wap\model\merchant\MerchantBill;
  19. use service\SystemConfigService;
  20. /**佣金提现
  21. * Class UserExtract
  22. * @package app\wap\model\user
  23. */
  24. class UserExtract extends ModelBasic
  25. {
  26. use ModelTrait;
  27. //审核中
  28. const AUDIT_STATUS = 0;
  29. //未通过
  30. const FAIL_STATUS = -1;
  31. //已提现
  32. const SUCCESS_STATUS = 1;
  33. protected static $extractType = ['alipay', 'bank', 'weixin', 'yue'];
  34. protected static $extractTypeMsg = ['alipay' => '支付宝', 'bank' => '银行卡', 'weixin' => '微信', 'yue' => '余额'];
  35. public static function getPartnerTradeNoId()
  36. {
  37. $count = (int)self::where('add_time', ['>=', strtotime(date("Y-m-d"))], ['<', strtotime(date("Y-m-d", strtotime('+1 day')))])->count();
  38. return 'tk' . date('YmdHis', time()) . (10000 + $count + 1);
  39. }
  40. protected static $status = array(
  41. -1 => '未通过',
  42. 0 => '审核中',
  43. 1 => '已提现'
  44. );
  45. /**
  46. * 用户自主提现记录提现记录,后台执行审核
  47. * @param array $userInfo 用户个人信息
  48. * @param array $data 提现详细信息
  49. * @return bool
  50. */
  51. public static function userExtract($userInfo, $data)
  52. {
  53. if (!in_array($data['extract_type'], self::$extractType)) return self::setErrorInfo('提现方式不存在');
  54. $userInfo = User::get($userInfo['uid']);
  55. $extractPrice = $userInfo['brokerage_price'];
  56. if ($extractPrice < 0) return self::setErrorInfo('提现佣金不足' . $data['money']);
  57. if ($data['money'] > $extractPrice) return self::setErrorInfo('提现佣金不足' . $data['money']);
  58. if ($data['money'] <= 0) return self::setErrorInfo('提现佣金大于0');
  59. $balance = bcsub($userInfo['brokerage_price'], $data['money'], 2);
  60. if ($balance < 0) $balance = 0;
  61. $insertData = [
  62. 'uid' => $userInfo['uid'],
  63. 'extract_type' => $data['extract_type'],
  64. 'extract_price' => $data['money'],
  65. 'add_time' => time(),
  66. 'balance' => $balance,
  67. 'status' => self::AUDIT_STATUS
  68. ];
  69. if (isset($data['name']) && strlen(trim($data['name']))) $insertData['real_name'] = $data['name'];
  70. else $insertData['real_name'] = $userInfo['nickname'];
  71. if (isset($data['cardnum'])) $insertData['bank_code'] = $data['cardnum'];
  72. else $insertData['bank_code'] = '';
  73. if (isset($data['bankname'])) $insertData['bank_address'] = $data['bankname'];
  74. else $insertData['bank_address'] = '';
  75. if (isset($data['weixin'])) $insertData['wechat'] = $data['weixin'];
  76. else $insertData['wechat'] = $userInfo['nickname'];
  77. if ($data['extract_type'] == 'alipay') {
  78. if (!$data['alipay_code']) return self::setErrorInfo('请输入支付宝账号');
  79. $insertData['alipay_code'] = $data['alipay_code'];
  80. $mark = '使用支付宝提现' . $insertData['extract_price'] . '元';
  81. } else if ($data['extract_type'] == 'bank') {
  82. if (!$data['cardnum']) return self::setErrorInfo('请输入银行卡账号');
  83. if (!$data['bankname']) return self::setErrorInfo('请输入开户行信息');
  84. $mark = '使用银联卡' . $insertData['bank_code'] . '提现' . $insertData['extract_price'] . '元';
  85. } else if ($data['extract_type'] == 'weixin') {
  86. if (!$data['weixin']) return self::setErrorInfo('请输入微信账号');
  87. $mark = '使用微信提现' . $insertData['extract_price'] . '元';
  88. } else if ($data['extract_type'] == 'yue') {
  89. $mark = '使用余额提现' . $insertData['extract_price'] . '元';
  90. }
  91. self::beginTrans();
  92. try {
  93. $res1 = self::create($insertData);
  94. if (!$res1) return self::setErrorInfo('提现失败');
  95. $res2 = User::edit(['brokerage_price' => $balance], $userInfo['uid'], 'uid');
  96. $res3 = UserBill::expend('佣金提现', $userInfo['uid'], 'now_money', 'extract', $data['money'], $res1['id'], $balance, $mark);
  97. $res = $res2 && $res3;
  98. if ($res) {
  99. self::commitTrans();
  100. return true;
  101. } else return self::setErrorInfo('提现失败!');
  102. } catch (\Exception $e) {
  103. self::rollbackTrans();
  104. return self::setErrorInfo('提现失败!');
  105. }
  106. }
  107. /**
  108. * 用户自主提现记录提现记录,后台执行审核
  109. * @param array $userInfo 用户个人信息
  110. * @param array $data 提现详细信息
  111. * @return bool
  112. */
  113. public static function userMerExtract($userInfo, $data)
  114. {
  115. if (!$userInfo['business']) return self::setErrorInfo('您不是讲师,不能走讲师提现');
  116. if (!in_array($data['extract_type'], self::$extractType)) return self::setErrorInfo('提现方式不存在');
  117. $merchant = MerchantModel::where(['uid' => $userInfo['uid']])->find();
  118. $extractPrice = $merchant['now_money'];
  119. if ($extractPrice < 0) return self::setErrorInfo('您没有余额');
  120. if ($data['money'] > $extractPrice) return self::setErrorInfo('提现余额不足' . $data['money']);
  121. if ($data['money'] <= 0) return self::setErrorInfo('提现佣金大于0');
  122. $balance = bcsub($merchant['now_money'], $data['money'], 2);
  123. if ($balance < 0) $balance = 0;
  124. $insertData = [
  125. 'uid' => $merchant['uid'],
  126. 'mer_id' => $merchant['id'],
  127. 'extract_type' => $data['extract_type'],
  128. 'extract_price' => $data['money'],
  129. 'add_time' => time(),
  130. 'balance' => $balance,
  131. 'status' => self::AUDIT_STATUS
  132. ];
  133. if (isset($data['name']) && strlen(trim($data['name']))) $insertData['real_name'] = $data['name'];
  134. else $insertData['real_name'] = $merchant['mer_name'];
  135. if (isset($data['cardnum'])) $insertData['bank_code'] = $data['cardnum'];
  136. else $insertData['bank_code'] = '';
  137. if (isset($data['bankname'])) $insertData['bank_address'] = $data['bankname'];
  138. else $insertData['bank_address'] = '';
  139. if (isset($data['weixin'])) $insertData['wechat'] = $data['weixin'];
  140. else $insertData['wechat'] = $merchant['mer_name'];
  141. if ($data['extract_type'] == 'alipay') {
  142. if (!$data['alipay_code']) return self::setErrorInfo('请输入支付宝账号');
  143. $insertData['alipay_code'] = $data['alipay_code'];
  144. $mark = '使用支付宝提现' . $insertData['extract_price'] . '元';
  145. } else if ($data['extract_type'] == 'bank') {
  146. if (!$data['cardnum']) return self::setErrorInfo('请输入银行卡账号');
  147. if (!$data['bankname']) return self::setErrorInfo('请输入开户行信息');
  148. $mark = '使用银联卡' . $insertData['bank_code'] . '提现' . $insertData['extract_price'] . '元';
  149. } else if ($data['extract_type'] == 'weixin') {
  150. if (!$data['weixin']) return self::setErrorInfo('请输入微信账号');
  151. $mark = '使用微信提现' . $insertData['extract_price'] . '元';
  152. }
  153. self::beginTrans();
  154. try {
  155. $res1 = self::create($insertData);
  156. if (!$res1) return self::setErrorInfo('提现失败');
  157. $res2 = MerchantModel::edit(['now_money' => $balance], $merchant['id'], 'id');
  158. $res3 = MerchantBill::expend('余额提现', 0, $merchant['id'], 'now_money', 'extract', $insertData['extract_price'], $balance, $mark);
  159. $res = $res2 && $res3;
  160. if ($res) {
  161. self::commitTrans();
  162. return true;
  163. } else return self::setErrorInfo('提现失败!');
  164. } catch (\Exception $e) {
  165. self::rollbackTrans();
  166. return self::setErrorInfo('提现失败!');
  167. }
  168. }
  169. /**
  170. * 获得用户最后一次提现信息
  171. * @param $openid
  172. * @return mixed
  173. */
  174. public static function userLastInfo($uid)
  175. {
  176. return self::where(compact('uid'))->order('add_time DESC')->find();
  177. }
  178. /**
  179. * 获得用户提现总金额
  180. * @param $uid
  181. * @return mixed
  182. */
  183. public static function userExtractTotalPrice($uid)
  184. {
  185. return self::where('uid', $uid)->where('status', self::SUCCESS_STATUS)->value('SUM(extract_price)') ?: 0;
  186. }
  187. /**
  188. * 获得讲师提现总金额
  189. * @param $uid
  190. * @return mixed
  191. */
  192. public static function userMerExtractTotalPrice($mer_id)
  193. {
  194. return self::where('mer_id', $mer_id)->where('status', self::SUCCESS_STATUS)->value('SUM(extract_price)') ?: 0;
  195. }
  196. }