User.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\common\model\user;
  12. use app\common\model\BaseModel;
  13. use app\common\model\store\service\StoreService;
  14. use app\common\model\store\staff\Staffs;
  15. use app\common\model\wechat\WechatUser;
  16. use app\common\repositories\store\coupon\StoreCouponUserRepository;
  17. use app\common\repositories\store\order\StoreGroupOrderRepository;
  18. use app\common\repositories\store\order\StoreOrderRepository;
  19. use app\common\repositories\store\service\StoreServiceLogRepository;
  20. use app\common\repositories\system\config\ConfigValueRepository;
  21. use app\common\repositories\user\UserBillRepository;
  22. use app\common\repositories\user\UserExtractRepository;
  23. use app\common\repositories\user\UserHistoryRepository;
  24. use app\common\repositories\user\UserRelationRepository;
  25. use app\common\repositories\user\UserRepository;
  26. /**
  27. * Class User
  28. * @package app\common\model\user
  29. * @author xaboy
  30. * @day 2020-04-28
  31. */
  32. class User extends BaseModel
  33. {
  34. /**
  35. * @return string
  36. * @author xaboy
  37. * @day 2020-03-30
  38. */
  39. public static function tablePk(): string
  40. {
  41. return 'uid';
  42. }
  43. /**
  44. * @return string
  45. * @author xaboy
  46. * @day 2020-03-30
  47. */
  48. public static function tableName(): string
  49. {
  50. return 'user';
  51. }
  52. /**
  53. * @param $value
  54. * @return string
  55. * @author xaboy
  56. * @day 2020-05-09
  57. */
  58. public function getBirthdayAttr($value)
  59. {
  60. return $value == '0000-00-00' ? '' : $value;
  61. }
  62. public function getIsSvipAttr($value)
  63. {
  64. if (systemConfig('svip_switch_status') == 1) {
  65. return $value;
  66. } else {
  67. return $value > 0 ? 0 : $value;
  68. }
  69. }
  70. public function getPhoneAttr($value)
  71. {
  72. if (env('SHOW_PHONE', false) && app('request')->hasMacro('adminInfo') && $value && is_numeric($value)) {
  73. if (app('request')->userType() !== 2 || app('request')->adminInfo()['level'] !== 0) {
  74. return substr_replace($value, '****', 3, 4);
  75. }
  76. }
  77. return $value;
  78. }
  79. public function getAccountAttr($value)
  80. {
  81. if (env('SHOW_PHONE', false) && app('request')->hasMacro('adminInfo') && $value && is_numeric($value)) {
  82. if (app('request')->userType() !== 2 || app('request')->adminInfo()['level'] !== 0) {
  83. return substr_replace($value, '****', 3, 4);
  84. }
  85. }
  86. return $value;
  87. }
  88. /**
  89. * @param $value
  90. * @return array
  91. * @author xaboy
  92. * @day 2020-05-09
  93. */
  94. public function getLabelIdAttr($value)
  95. {
  96. if (empty($value)) {
  97. return [];
  98. }
  99. return array_map(function ($item) {
  100. return (int)$item;
  101. }, explode(',', $value));
  102. }
  103. /**
  104. * @param $value
  105. * @return string
  106. * @author xaboy
  107. * @day 2020-05-09
  108. */
  109. public function setLabelIdAttr($value)
  110. {
  111. return is_array($value) ? implode(',', $value) : $value;
  112. }
  113. public function getValidSpreadUidAttr()
  114. {
  115. if (!$this->spread_uid) return 0;
  116. $data = self::getDB()->where('uid', $this->spread_uid)->field('is_promoter,spread_uid')->find();
  117. $extensionInfo = get_extension_info($data);//获取用户是否可以分销以及是否内购
  118. return $data && $extensionInfo['isPromoter'] ? $this->spread_uid : 0;
  119. }
  120. public function getValidSpreadAttr()
  121. {
  122. if (!$this->spread_uid) return null;
  123. $data = self::getDB()->where('uid', $this->spread_uid)->find();
  124. $extensionInfo = get_extension_info($data);//获取用户是否可以分销以及是否内购
  125. return $data && $extensionInfo['isPromoter'] ? $data : null;
  126. }
  127. public function getValidTopUidAttr()
  128. {
  129. if (!$this->top_uid) return 0;
  130. $data = self::getDB()->where('uid', $this->spread_uid)->find();
  131. $extensionInfo = get_extension_info($data);//获取用户是否可以分销以及是否内购
  132. return $data && $extensionInfo['isPromoter'] ? $this->top_uid : 0;
  133. }
  134. public function getValidTopAttr()
  135. {
  136. if (!$this->top_uid) return null;
  137. $data = self::getDB()->where('uid', $this->top_uid)->find();
  138. $extensionInfo = get_extension_info($data);//获取用户是否可以分销以及是否内购
  139. return $data && $extensionInfo['isPromoter'] ? $data : null;
  140. }
  141. public function getTopUidAttr()
  142. {
  143. return self::getDB()->where('uid', $this->spread_uid)->value('spread_uid') ?: 0;
  144. }
  145. /**
  146. * @return \think\model\relation\HasOne
  147. * @author xaboy
  148. * @day 2020-05-09
  149. */
  150. public function group()
  151. {
  152. return $this->hasOne(UserGroup::class, 'group_id', 'group_id');
  153. }
  154. public function spread()
  155. {
  156. return $this->hasOne(User::class, 'uid', 'spread_uid');
  157. }
  158. public function brokerage()
  159. {
  160. return $this->hasOne(UserBrokerage::class, 'brokerage_level', 'brokerage_level')->where('type', 0);
  161. }
  162. public function member()
  163. {
  164. return $this->hasOne(UserBrokerage::class, 'brokerage_level', 'member_level')->where('type', 1);
  165. }
  166. public function memberIcon()
  167. {
  168. return $this->hasOne(UserBrokerage::class, 'brokerage_level', 'member_level')->where('type', 1)->bind(['member_icon' => 'brokerage_icon']);
  169. }
  170. public function getUserLabelAttr()
  171. {
  172. return UserLabel::whereIn('label_id', $this->label_id)->select();
  173. }
  174. public function getUserFields()
  175. {
  176. return $this->hasOne(UserFields::class, 'uid', 'uid');
  177. }
  178. /**
  179. * @param $spreadUid
  180. * @author xaboy
  181. * @day 2020-04-28
  182. */
  183. public function setSpread($spreadUid)
  184. {
  185. if (self::getDB()->where('uid', $spreadUid)->value('is_promoter'))
  186. $this->save([
  187. 'spread_uid' => $spreadUid,
  188. 'spread_time' => date('Y-m-d H:i:s')
  189. ]);
  190. }
  191. public function service()
  192. {
  193. return $this->hasOne(StoreService::class, 'uid', 'uid')
  194. ->where('mer_id', '<>', 0)
  195. ->where('is_del', 0)
  196. ->where('is_open', 1)
  197. ->field('service_id,uid,nickname,avatar,customer,mer_id,is_verify,is_goods,is_open')
  198. ->order('is_verify DESC,customer DESC');
  199. }
  200. public function topService()
  201. {
  202. return $this->hasOne(StoreService::class, 'uid', 'uid')
  203. ->where('mer_id', 0)->where('is_open',1)
  204. ->where('is_del', 0)
  205. ->field('service_id,uid,nickname,avatar,customer,mer_id,is_verify,is_goods')
  206. ->order('is_verify DESC,customer DESC');
  207. }
  208. public function staffs()
  209. {
  210. return $this->hasMany(Staffs::class, 'uid', 'uid')->where('status', 1);
  211. }
  212. public function getLockBrokerageAttr()
  213. {
  214. return app()->make(UserBillRepository::class)->lockBrokerage($this->uid) ?: 0;
  215. }
  216. public function getLockIntegralAttr()
  217. {
  218. return app()->make(UserBillRepository::class)->lockIntegral($this->uid) ?: 0;
  219. }
  220. public function getYesterdayBrokerageAttr()
  221. {
  222. return app()->make(UserBillRepository::class)->yesterdayBrokerage($this->uid) ?: 0;
  223. }
  224. public function getTotalExtractAttr()
  225. {
  226. return app()->make(UserExtractRepository::class)->userTotalExtract($this->uid) ?: 0;
  227. }
  228. public function getTotalBrokerageAttr()
  229. {
  230. return app()->make(UserBillRepository::class)->totalBrokerage($this->uid) ?: 0;
  231. }
  232. public function getTotalBrokeragePriceAttr()
  233. {
  234. return bcadd($this->lock_brokerage, $this->brokerage_price, 2);
  235. }
  236. public function getTotalIntegralAttr()
  237. {
  238. return bcadd($this->lock_integral, $this->integral, 0);
  239. }
  240. public function getTotalRechargeAttr()
  241. {
  242. return app()->make(UserBillRepository::class)->userNowMoneyIncTotal($this->uid);
  243. }
  244. public function getTotalConsumeAttr()
  245. {
  246. return app()->make(StoreGroupOrderRepository::class)->totalNowMoney($this->uid);
  247. }
  248. public function getTotalCollectProductAttr()
  249. {
  250. return app()->make(UserRelationRepository::class)->getWhereCount(['uid' => $this->uid, 'type' => 1]);
  251. }
  252. public function getTotalCollectStoreAttr()
  253. {
  254. return app()->make(UserRelationRepository::class)->getWhereCount(['uid' => $this->uid, 'type' => 10]);
  255. }
  256. public function getTotalVisitProductAttr()
  257. {
  258. return app()->make(UserHistoryRepository::class)->userTotalHistory($this->uid);
  259. }
  260. public function getTotalCouponAttr()
  261. {
  262. return app()->make(StoreCouponUserRepository::class)->userTotal($this->uid, 0);
  263. }
  264. public function getTotalUnreadAttr()
  265. {
  266. return app()->make(StoreServiceLogRepository::class)->totalUnReadNum($this->uid);
  267. }
  268. public function getOneLevelCountAttr()
  269. {
  270. return app()->make(UserRepository::class)->getOneLevelCount($this->uid);
  271. }
  272. public function getTwoLevelCountAttr()
  273. {
  274. return app()->make(UserRepository::class)->getTwoLevelCount($this->uid);
  275. }
  276. public function getSpreadTotalAttr()
  277. {
  278. return $this->one_level_count + $this->two_level_count;
  279. }
  280. public function wechat()
  281. {
  282. return $this->hasOne(WechatUser::class, 'wechat_user_id', 'wechat_user_id');
  283. }
  284. public function fields()
  285. {
  286. return $this->hasOne(UserFields::class, 'uid', 'uid');
  287. }
  288. public function getIntegralAttr($val)
  289. {
  290. return is_null($val) ? 0 : $val;
  291. }
  292. // public function getUserTypeAttr()
  293. // {
  294. // if($this->wechat['openid']){
  295. // return 'wechat';
  296. // }elseif($this->wechat['routine_openid']){
  297. // return 'routine';
  298. // }else{
  299. // return 'H5';
  300. // }
  301. // }
  302. public function getSubscribeAttr()
  303. {
  304. if ($this->wechat['openid'] && $this->wechat['subscribe']) {
  305. return true;
  306. } else {
  307. return false;
  308. }
  309. }
  310. public function getAvatarAttr($value)
  311. {
  312. if (empty($value)) {
  313. return systemConfig('user_default_avatar') ?: rtrim(systemConfig('site_url'), '/') . '/static/f.png';
  314. }
  315. return $value;
  316. }
  317. /**
  318. * 是否分销获取器
  319. * @param $value
  320. * @param $data
  321. * @return void
  322. */
  323. public function getIsPromoterAttr($value,$data)
  324. {
  325. $extensionInfo = get_extension_info($data);//获取用户是否可以分销以及是否内购
  326. return $extensionInfo['isPromoter'];
  327. }
  328. // 判断是否有推荐订单(推荐下级是否有订单)
  329. public function spread_order($uid){
  330. // $user = User::find($uid);
  331. // $group_users = app()->make(GiftLevel::class)->get_group_user($uid);
  332. $group_users = User::where('spread_uid',$uid)->column('uid');
  333. $order_count = app()->make(StoreOrderRepository::class)->getWhereCount(['uid' => ['in',$group_users],'paid' => 1]);
  334. return $order_count;
  335. }
  336. }