User.php 11 KB

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