ExtensionCenterService.php 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * Name: 芸众商城系统
  5. * Author: 广州市芸众信息科技有限公司
  6. * Profile: 广州市芸众信息科技有限公司位于国际商贸中心的广州,专注于移动电子商务生态系统打造,拥有芸众社交电商系统、区块链数字资产管理系统、供应链管理系统、电子合同等产品/服务。官网 :www.yunzmall.com www.yunzshop.com
  7. * Date: 2021/7/29
  8. * Time: 10:24
  9. */
  10. namespace app\frontend\modules\finance\services;
  11. use app\common\facades\Setting;
  12. use app\common\helpers\ImageHelper;
  13. use app\common\models\Income;
  14. use app\common\models\member\ChildrenOfMember;
  15. use app\common\models\Order;
  16. use app\common\services\income\IncomeService;
  17. use app\common\services\member\MemberCenterService;
  18. use app\common\services\popularize\PortType;
  19. use app\frontend\models\Member;
  20. use app\frontend\models\MemberLevel;
  21. use app\frontend\models\MemberRelation;
  22. use app\frontend\models\MemberShopInfo;
  23. use app\frontend\modules\finance\controllers\OrderAllController;
  24. use app\frontend\modules\finance\factories\IncomePageFactory;
  25. use app\frontend\modules\member\models\MemberModel;
  26. use Carbon\Carbon;
  27. use Illuminate\Support\Facades\DB;
  28. use phpDocumentor\Reflection\Types\Self_;
  29. class ExtensionCenterService
  30. {
  31. protected static $request;
  32. protected static $memberId;
  33. protected static $member;
  34. protected static $total_income;
  35. protected static $relation;
  36. protected static $power;
  37. protected static $buttonEnabled;
  38. const PLUGIN = [
  39. 'm-erweima' => '二维码',
  40. 'material-center' => '素材中心',
  41. 'article' => '拓客文章',
  42. 'video-share' => '拓客视频',
  43. 'micro-communities' => '种草社区',
  44. 'business_card' => '个人名片',
  45. 'group-develop-user' => '群拓客',
  46. 'group-code' => '群活码',
  47. 'room' => '直播',
  48. 'ranking' => '排行榜',
  49. ];
  50. public static function init($request)
  51. {
  52. self::$memberId = \Yunshop::app()->getMemberId();
  53. self::$request = $request;
  54. }
  55. /**
  56. * @return Member
  57. * @throws \app\common\exceptions\AppException
  58. */
  59. private static function member()
  60. {
  61. if (!isset(self::$member)) {
  62. self::$member = Member::current();
  63. }
  64. return self::$member;
  65. }
  66. /**
  67. * @return array
  68. * @throws \app\common\exceptions\AppException
  69. */
  70. public static function getIncomePage()
  71. {
  72. $power = self::power();
  73. $relation_set = \Setting::get('member.relation');
  74. $extension_set = \Setting::get('popularize.mini');
  75. $jump_link = '';
  76. $small_jump_link = '';
  77. $small_extension_link = '';
  78. if ($relation_set['is_jump'] && !empty($relation_set['jump_link'])) {
  79. if (!self::isAgent()) {
  80. $jump_link = $relation_set['jump_link'];
  81. $small_jump_link = $relation_set['small_jump_link'];
  82. $small_extension_link = $extension_set['small_extension_link'];
  83. }
  84. }
  85. //提现额度
  86. $withdraw_limit = [
  87. 'is_show' => false
  88. ];
  89. if(app('plugins')->isEnabled('withdrawal-limit')) {
  90. $limit_set = array_pluck(\Setting::getAllByGroup('withdrawal-limit')->toArray(), 'value', 'key');
  91. if($limit_set['is_open'] == 1 && $limit_set['is_show'] == 1) {
  92. $memberModel = \Yunshop\WithdrawalLimit\Common\models\MemberWithdrawalLimit::uniacid()->where('member_id',self::$memberId)->first();
  93. if($memberModel){
  94. $limit = $memberModel->total_amount;
  95. }else{
  96. $limit = 0;
  97. }
  98. $withdraw_limit = [
  99. 'is_show' => true,
  100. 'amount' => $limit
  101. ];
  102. }
  103. }
  104. return [
  105. 'set' => self::getSet(),
  106. 'jump_link' => $jump_link,
  107. 'small_jump_link' => $small_jump_link,
  108. 'small_extension_link' => $small_extension_link,
  109. 'button_enabled' => self::buttonEnabled(),
  110. 'button' => self::button(),
  111. 'info' => self::userInfo(),
  112. 'identity' => self::identity(),
  113. 'income_statistic' => self::incomeStatistic(),
  114. 'income_dynamic' => self::incomeDynamic(),
  115. 'available' => $power['available'],
  116. 'unavailable' => $power['unavailable'],
  117. 'fans_fission' => self::fansFission(),
  118. 'plugin_data' => self::pluginData(),
  119. 'extension_order' => self::extensionOrder(),
  120. 'service' => self::getService(),
  121. 'withdraw_limit' => $withdraw_limit,
  122. 'member_auth_pop_switch' => Setting::get('plugin.min_app.member_auth_pop_switch') ? 1 : 0,
  123. ];
  124. }
  125. protected static function getSet()
  126. {
  127. $type = PortType::determineType(self::$request['type']);
  128. $background_color = '';
  129. if ($type) {
  130. $info = Setting::get('popularize.'.$type);
  131. $background_color = $info['background_color'] ? : '';
  132. }
  133. return ['background_color' => $background_color];
  134. }
  135. /**
  136. * 按钮
  137. * @return array
  138. */
  139. protected static function button()
  140. {
  141. $button = [];
  142. $buttonEnabled = self::buttonEnabled();
  143. $lang_set = \Setting::get('shop.lang', ['lang' => 'zh_cn']);
  144. if (!empty($buttonEnabled['plugin_settle_show'])) {
  145. $button[] = [
  146. 'title' => "领取收益",
  147. 'icon' => 'icon-fontclass-leiji',
  148. 'mini_url' => "/packageA/member/extension/myEarnings/myEarnings",
  149. 'url' => "myEarnings"
  150. ];
  151. }
  152. $button[] = [
  153. 'title' => ($lang_set['income_name'] ? : '收入')."明细",
  154. 'icon' => 'icon-fontclass-shouru1',
  155. 'mini_url' => "/packageA/member/extension/incomedetails/incomedetails",
  156. 'url' => "incomedetails"
  157. ];
  158. $button[] = [
  159. 'title' => ($lang_set['name_of_withdrawal'] ? : '提现')."明细",
  160. 'icon' => 'icon-fontclass-ticheng',
  161. 'mini_url' => "/packageA/member/presentationRecord_v2/presentationRecord_v2?orderType=extension",
  162. 'url' => "presentationRecord"
  163. ];
  164. if (!empty($buttonEnabled['is_show_performance'])) {
  165. $button[] = [
  166. 'title' => "营业额",
  167. 'icon' => 'icon-fontclass-yingye',
  168. 'mini_url' => "/packageA/member/extension/Performance/Performance",
  169. 'url' => "Performance"
  170. ];
  171. }
  172. $plugins = app('plugins')->getEnabledPlugins('*');
  173. foreach ($plugins as $plugin) {
  174. $class = $plugin->app();
  175. if (method_exists($class,'incomePageButton')) {
  176. $button[] = $class->incomePageButton(self::$memberId);
  177. }
  178. }
  179. return array_values(array_filter($button));
  180. }
  181. protected static function buttonEnabled()
  182. {
  183. if (!isset(self::$buttonEnabled)) {
  184. $is_show_performance = OrderAllController::isShow();
  185. $share_page = self::getSharePageStatus();
  186. self::$buttonEnabled = [
  187. 'is_show_performance' => $is_show_performance, //营业额按钮显示
  188. 'share_page' => $share_page, //收入分享按钮显示
  189. 'plugin_settle_show' => PluginSettleService::doesIsShow(), //领取收益按钮显示
  190. 'show_member_id' => PortType::showMemberId(self::$request['type']),
  191. 'is_show_unable' => PortType::isShowUnable(self::$request['type']),//更多权限是否显示
  192. 'withdraw_date' => self::getWithdrawDate(),
  193. ];
  194. }
  195. return self::$buttonEnabled;
  196. }
  197. private static function getWithdrawDate()
  198. {
  199. $income_set = Setting::get('withdraw.income');
  200. $withdraw_date = [
  201. 'day' => 0, //可提现日期
  202. 'disable' => 0 //是否禁用
  203. ];
  204. $day_msg = '无提现限制';
  205. if (is_array($income_set['withdraw_date'])) {
  206. $day = date('d');
  207. $day_msg = '可提现日期为:'.implode(',',$income_set['withdraw_date']).'号';
  208. $withdraw_date = [
  209. 'day' => min($income_set['withdraw_date']),
  210. 'disable' => 1
  211. ];
  212. foreach ($income_set['withdraw_date'] as $date) {
  213. if ($day == $date) {
  214. $withdraw_date = [
  215. 'day' => $date,
  216. 'disable' => 0,
  217. ];
  218. break;
  219. }
  220. if ($day < $date) {
  221. $withdraw_date = [
  222. 'day' => $date,
  223. 'disable' => 1,
  224. ];
  225. }
  226. }
  227. }
  228. $withdraw_date['day_msg'] = $day_msg;
  229. return $withdraw_date;
  230. }
  231. /**
  232. * 会员基础信息
  233. * @return array
  234. * @throws \app\common\exceptions\AppException
  235. */
  236. protected static function userInfo()
  237. {
  238. $memberModel = self::member();
  239. //IOS时,把微信头像url改为https前缀
  240. $avatar = ImageHelper::iosWechatAvatar($memberModel->avatar);
  241. $autoWithdraw = 0;
  242. if (app('plugins')->isEnabled('mryt')) {
  243. $uid = \YunShop::app()->getMemberId();
  244. $autoWithdraw = (new \Yunshop\Mryt\services\AutoWithdrawService())->isWithdraw($uid);
  245. }
  246. if (app('plugins')->isEnabled('team-dividend')) {
  247. $uid = \YunShop::app()->getMemberId();
  248. $autoWithdraw = (new \Yunshop\TeamDividend\services\AutoWithdrawService())->isWithdraw($uid);
  249. }
  250. return [
  251. 'avatar' => $avatar,
  252. 'nickname' => $memberModel->nickname,
  253. 'member_id' => $memberModel->uid,
  254. 'autoWithdraw' => $autoWithdraw,
  255. 'has_avatar' => $memberModel->has_avatar,
  256. ];
  257. }
  258. /**
  259. * 会员身份信息
  260. * @return array
  261. * @throws \app\common\exceptions\AppException
  262. */
  263. protected static function identity()
  264. {
  265. $identity = [];
  266. $memberModel = self::member();
  267. //会员等级
  268. if ($memberModel->yzMember->level_id == 0) {
  269. $set = Setting::get('shop.member');
  270. $identity[] = $set['level_name']?:'普通会员';
  271. } else {
  272. $level = MemberLevel::getMemberLevel($memberModel->yzMember->level_id);
  273. $identity[] = $level?$level->level_name:'';
  274. }
  275. $plugins = app('plugins')->getEnabledPlugins('*');
  276. foreach ($plugins as $plugin) {
  277. $class = $plugin->app();
  278. if (method_exists($class,'incomePageIdentity')) {
  279. $new = $class->incomePageIdentity(self::$memberId);
  280. $identity = is_array($new) ? array_merge($new,$identity) : $identity;
  281. }
  282. }
  283. return array_values(array_filter(array_unique($identity)));
  284. }
  285. public static function popularizeSet($type)
  286. {
  287. $type = PortType::determineType($type);
  288. if ($type) {
  289. $info = \Setting::get('popularize.'.$type);
  290. if (isset($info['plugin_mark'])) {
  291. return $info['plugin_mark'];
  292. }
  293. }
  294. return array();
  295. }
  296. /**
  297. * 权限
  298. * @return array
  299. * @throws \app\common\exceptions\AppException
  300. */
  301. protected static function power()
  302. {
  303. if (!isset(self::$power)) {
  304. $lang_set = self::getLangSet();
  305. $is_relation = self::isOpenRelation();
  306. $config = self::getIncomePageConfig();
  307. $total_income = self::getTotalIncome();
  308. //是否显示推广插件入口
  309. $popularize_set = self::popularizeSet(self::$request['type']);
  310. $available = [];
  311. $unavailable = [];
  312. foreach ($config as $key => $item) {
  313. $incomeFactory = new IncomePageFactory(new $item['class'], $lang_set, $is_relation, self::isAgent(), $total_income,$key);
  314. if (!$incomeFactory->isShow()) {
  315. continue;
  316. }
  317. //不显示
  318. if (in_array($incomeFactory->getMark(), $popularize_set)) {
  319. continue;
  320. }
  321. $income_data = $incomeFactory->getIncomeData(false);
  322. if ($incomeFactory->isAvailable()) {
  323. $available[] = $income_data;
  324. } else {
  325. $unavailable[] = $income_data;
  326. }
  327. }
  328. self::$power = ['available' => $available, 'unavailable' => $unavailable];
  329. }
  330. return self::$power;
  331. }
  332. /**
  333. * 收入统计
  334. * @return array
  335. */
  336. public static function incomeStatistic()
  337. {
  338. if (!empty(self::$request['income_statistic_type'])) {
  339. list($start,$end) = self::timeSolt(self::$request['income_statistic_type']);
  340. }
  341. //收入统计
  342. $total_amount = Income::uniacid()
  343. ->where('member_id',self::$memberId);
  344. // ->whereIn('incometable_type', $incomeConfig);
  345. if (!empty($start) && !empty($end)) {
  346. $total_amount = $total_amount->whereBetween('created_at',[$start,$end]);
  347. }
  348. $total_amount = $total_amount->sum('amount');
  349. $income = Income::uniacid()
  350. ->select(DB::raw('SUM(IF(status=1,amount,0)) as withdraw,'
  351. .'SUM(IF(status=1 and pay_status IN(0,1),amount,0)) as withdrawing'))
  352. ->where('member_id',self::$memberId)
  353. // ->whereIn('incometable_type', $incomeConfig)
  354. ->first();
  355. //粉丝统计
  356. $total_fans = ChildrenOfMember::uniacid()
  357. ->where('member_id',self::$memberId)
  358. ->count();
  359. $first_fans = MemberShopInfo::uniacid()
  360. ->where('parent_id',self::$memberId);
  361. if (!empty($start) && !empty($end)) {
  362. $first_fans = $first_fans->whereBetween('child_time',[$start,$end]);
  363. }
  364. $first_fans = $first_fans->count();
  365. $un_withdraw = 0;
  366. $income_config = \app\backend\modules\income\Income::current()->getItems();
  367. foreach ($income_config as $income) {
  368. //余额不计算 拍卖预付款不计算
  369. if ($income['type'] == 'balance' || $income['type'] == 'auction_prepayment') {
  370. continue;
  371. }
  372. $incomeAmount = Income::uniacid()->canWithdraw()
  373. ->where('member_id', self::$memberId)
  374. ->where('incometable_type', $income['class'])
  375. ->sum('amount');
  376. if ($incomeAmount > 0) {
  377. $un_withdraw += $incomeAmount;
  378. }
  379. }
  380. return [
  381. [
  382. 'title' => '累计收入',
  383. 'url' => 'incomedetails',
  384. 'mini_url' => '/packageA/member/extension/incomedetails/incomedetails',
  385. 'value' => $total_amount ? : 0
  386. ],
  387. [
  388. 'title' => '已提现收入',
  389. 'url' => 'presentationRecord',
  390. 'mini_url' => '/packageA/member/presentationRecord_v2/presentationRecord_v2?orderType=extension',
  391. 'value' => $income &&$income->withdraw ? $income->withdraw : 0
  392. ],
  393. [
  394. 'title' => '未提现收入',
  395. 'url' => 'withdrawal',
  396. 'mini_url' => '/packageA/member/withdrawal/withdrawal',
  397. 'value' => sprintf("%01.2f", $un_withdraw)],
  398. [
  399. 'title' => '提现中收入',
  400. 'url' => 'presentationRecord',
  401. 'mini_url' => '/packageA/member/presentationRecord_v2/presentationRecord_v2?orderType=extension',
  402. 'value' => $income && $income->withdrawing ? $income->withdrawing : 0],
  403. [
  404. 'title' => '团队粉丝',
  405. 'url' => 'myRelationship',
  406. 'mini_url' => '/packageD/member/myRelationship/myRelationship',
  407. 'value' => $total_fans ? : 0
  408. ],
  409. [
  410. 'title' => '直推粉丝',
  411. 'url' => 'myRelationship',
  412. 'mini_url' => '/packageD/member/myRelationship/myRelationship',
  413. 'value' => $first_fans ? : 0
  414. ],
  415. ];
  416. }
  417. /**
  418. * 收入动态
  419. * @return array
  420. */
  421. public static function incomeDynamic()
  422. {
  423. list($start,$end) = self::getSearchTime();
  424. $income = Income::uniacid()
  425. ->select(DB::raw('SUM(amount) as total_amount,COUNT(*) as income_count,FROM_UNIXTIME(created_at,"%m%d") as time_str'))
  426. ->where('member_id',self::$memberId)
  427. ->whereBetween('created_at',[$start,$end])
  428. ->groupBy('time_str')
  429. ->get();
  430. $x_axis = [];
  431. $income_count = [];
  432. $total_amount = [];
  433. while ($start <= $end) {
  434. $x_axis[] = date('m/d',$start);
  435. $data = $income->where('time_str',date('md',$start))->first();
  436. $income_count[] = $data ? $data['income_count'] : 0;
  437. $total_amount[] = $data ? $data['total_amount'] : 0;
  438. $start = strtotime('+1 days',$start);
  439. }
  440. return [
  441. 'x_axis' => $x_axis,
  442. 'income_count' => $income_count,
  443. 'total_amount' => $total_amount,
  444. ];
  445. }
  446. /**
  447. * 收入占比
  448. * @return array
  449. */
  450. public static function incomeProportion()
  451. {
  452. if (!empty(self::$request['income_statistic_type'])) {
  453. list($start,$end) = self::timeSolt(self::$request['income_statistic_type']);
  454. }
  455. $incomeConfig = \app\backend\modules\income\Income::current()->getItems();
  456. $incomeConfig = collect($incomeConfig)->pluck('class')->toArray();
  457. $income = Income::uniacid()
  458. ->select('dividend_code','type_name',DB::raw('SUM(amount) as total_amount'))
  459. ->whereIn('incometable_type', $incomeConfig)
  460. ->where('member_id',self::$memberId);
  461. if (!empty($start) && !empty($end)) {
  462. $income = $income->whereBetween('created_at',[$start,$end]);
  463. }
  464. $income = $income->groupBy('incometable_type')
  465. ->get();
  466. $income = collect(array_values($income->sortByDesc('total_amount')->all()));
  467. //集合切割
  468. $order = $income->splice(5);
  469. $proportion = [];
  470. foreach ($income->all() as $item) {
  471. $type_name = IncomeService::dividendCodeCustomPluginName($item['dividend_code']);
  472. $proportion[] = [
  473. 'name' => $type_name ? : $item['type_name'],
  474. 'value' => $item['total_amount'] ? : 0,
  475. ];
  476. }
  477. $proportion[] = [
  478. 'name' => '其他',
  479. 'value' => $order->sum('total_amount') ? bcmul($order->sum('total_amount'),1,2) : 0,
  480. ];
  481. return $proportion;
  482. }
  483. /**
  484. * 粉丝裂变数据
  485. * @return array
  486. */
  487. public static function fansFission()
  488. {
  489. list($start,$end) = self::getSearchTime();
  490. //每天新增全部统计
  491. $fans = MemberShopInfo::uniacid()
  492. ->select(DB::raw('COUNT(*) as new_fans,FROM_UNIXTIME(child_time,"%Y%m%d") as time_str'))
  493. ->where('parent_id',self::$memberId)
  494. ->where('child_time','>',0)
  495. ->groupBy('time_str')
  496. ->get();
  497. $totalFans = round(($fans->sum('new_fans') ? : 0),2);
  498. $maxHistory = $fans->max('new_fans') ? : 0;
  499. $totalFans15 = round(($fans->where('time_str','>=',date('Ymd',$start))->sum('new_fans') ? : 0),2);
  500. $max15 = $fans->where('time_str','>=',date('Ymd',$start))->max('new_fans') ? : 0;
  501. $x_axis = [];
  502. $totalFansSeries = [];
  503. $fansNewSeries = [];
  504. while ($start <= $end) {
  505. $x_axis[] = date('m/d',$start);
  506. $totalFansSeries[] = $fans->where('time_str','<=',date('Ymd',$start))->sum('new_fans') ? : 0;
  507. $fansNewSeries[] = $fans->where('time_str',date('Ymd',$start))->sum('new_fans') ? : 0;
  508. $start = strtotime('+1 days',$start);
  509. }
  510. return [
  511. 'data' => [
  512. ['title' => '粉丝总数','value' => $totalFans],
  513. ['title' => '15日粉丝总数','value' => $totalFans15],
  514. ['title' => '历史单日最高','value' => $maxHistory],
  515. ['title' => '15日内单日最高','value' => $max15],
  516. ],
  517. 'x_axis' => $x_axis,
  518. 'totalFansSeries' => $totalFansSeries,
  519. 'fansNewSeries' => $fansNewSeries,
  520. ];
  521. }
  522. /**
  523. * 粉丝转化数据
  524. * @return array
  525. */
  526. public static function fansConversion()
  527. {
  528. $prefix = app('db')->getTablePrefix();
  529. list($start,$end) = self::getSearchTime();
  530. //每天新增全部统计
  531. $order = ChildrenOfMember::uniacid()
  532. ->select(DB::raw('COUNT('.$prefix.'yz_order.id) as order_count,SUM(price) as order_price,'
  533. .'FROM_UNIXTIME('.$prefix.'yz_order.create_time,"%Y%m%d") as time_str'))
  534. ->leftJoin('yz_order',function ($join) {
  535. $join->on('yz_order.uid','yz_member_children.child_id')
  536. ->whereIn('yz_order.status',[1,2,3]);
  537. })
  538. ->where('member_id',self::$memberId)
  539. ->where('level',1)//直推
  540. ->groupBy('time_str')
  541. ->get();
  542. $totalOrderCount = $order->sum('order_count') ? bcmul($order->sum('order_count'),1,2) : 0;
  543. $maxOrderCount = $order->max('order_count') ? : 0;
  544. $totalOrderPrice = $order->sum('order_price') ? bcmul($order->sum('order_price'),1,2) : 0;
  545. $maxOrderPrice = $order->max('order_price') ? : 0;
  546. $x_axis = [];
  547. $orderCountSeries = [];
  548. $orderPriceSeries = [];
  549. while ($start <= $end) {
  550. $x_axis[] = date('m/d',$start);
  551. $orderCountSeries[] = $order->where('time_str',date('Ymd',$start))->sum('order_count') ? : 0;
  552. $orderPriceSeries[] = $order->where('time_str',date('Ymd',$start))->sum('order_price') ? : 0;
  553. $start = strtotime('+1 days',$start);
  554. }
  555. return [
  556. 'data' => [
  557. ['title' => '推广订单总数','value' => $totalOrderCount],
  558. ['title' => '单日最高订单数','value' => $maxOrderCount],
  559. ['title' => '推广订单总额','value' => $totalOrderPrice],
  560. ['title' => '单日最高订单总额','value' => $maxOrderPrice],
  561. ],
  562. 'x_axis' => $x_axis,
  563. 'orderCountSeries' => $orderCountSeries,
  564. 'orderPriceSeries' => $orderPriceSeries,
  565. ];
  566. }
  567. /**
  568. * 插件入口
  569. * @return array
  570. */
  571. public static function pluginData()
  572. {
  573. $memberCenter = new MemberCenterService();
  574. $arr = $memberCenter->getMemberData(self::$memberId);//获取会员中心页面各入口
  575. $plugin = $memberCenter->defaultPluginData(self::$memberId);
  576. foreach ($arr as $key => $item) {
  577. if (!in_array($key,['is_open','hotel','plugins','ViewSet'])) {
  578. $plugin = array_merge($plugin,$item);
  579. }
  580. }
  581. unset($arr);
  582. $returnPlugin = [];
  583. if ($plugin) {
  584. $plugin = collect($plugin);
  585. foreach (self::PLUGIN as $key => $item) {
  586. $data = $plugin->where('name',$key)->first();
  587. if ($data) {
  588. $data['title'] = $item;
  589. $returnPlugin[] = $data;
  590. }
  591. }
  592. }
  593. return $returnPlugin;
  594. }
  595. /**
  596. * 推广订单
  597. * @return mixed
  598. */
  599. public static function extensionOrder()
  600. {
  601. $order = Order::uniacid()
  602. ->select('yz_order.id','order_sn','goods_price','price','create_time','status')
  603. ->join('yz_member_children',function ($join) {
  604. $join->on('yz_order.uid','yz_member_children.child_id')
  605. ->where('yz_member_children.member_id',self::$memberId)
  606. ->where('level',1);
  607. })
  608. ->orderBy('yz_order.id','desc')
  609. ->paginate(6)->toArray();
  610. return $order;
  611. }
  612. /**
  613. * 推广粉丝
  614. * @return mixed
  615. */
  616. public static function extensionFans()
  617. {
  618. $data = MemberShopInfo::uniacid()
  619. ->select('mc_members.nickname','mc_members.avatar',DB::raw('uid as child_id,child_time as created_at'))
  620. ->join('mc_members',function ($join) {
  621. $join->on('mc_members.uid','yz_member.member_id');
  622. })
  623. ->where('yz_member.parent_id',self::$memberId)
  624. // ->where('child_time','>',1)//直推
  625. ->orderBy('child_time','desc')
  626. ->paginate(6)->toArray();
  627. $uid = array_column($data['data'],'child_id');//取出所有uid
  628. if ($uid) {
  629. $order = Order::uniacid()
  630. ->select('uid',DB::raw('COUNT(id) as order_count,SUM(price) as order_price'))
  631. ->whereIn('uid',$uid)
  632. ->whereIn('status',[-1,1,2,3])
  633. ->where('pay_time','>',0)
  634. ->groupBy('uid')
  635. ->get()->toArray();
  636. $order = array_column($order,null,'uid');
  637. foreach ($data['data'] as &$value) {
  638. $value['order_count'] = 0;
  639. $value['order_price'] = 0;
  640. if (!empty($order[$value['child_id']])) {
  641. $value['order_count'] = $order[$value['child_id']]['order_price'] ? : 0;
  642. $value['order_price'] = $order[$value['child_id']]['order_count'] ? : 0;
  643. }
  644. }
  645. }
  646. return $data;
  647. }
  648. private static function getSearchTime()
  649. {
  650. $start = Carbon::now()->addDays(-14)->startOfDay()->timestamp;
  651. $end = Carbon::now()->endOfDay()->timestamp;
  652. return [$start,$end];
  653. }
  654. private static function timeSolt($type)
  655. {
  656. switch ($type) {
  657. case 1://今日
  658. $start = Carbon::today()->startOfDay()->timestamp;
  659. $end = Carbon::today()->endOfDay()->timestamp;
  660. break;
  661. case 2://昨日
  662. $start = Carbon::yesterday()->startOfDay()->timestamp;
  663. $end = Carbon::yesterday()->endOfDay()->timestamp;
  664. break;
  665. case 3://本周
  666. $start = Carbon::now()->startOfWeek()->timestamp;
  667. $end = Carbon::now()->endOfWeek()->timestamp;
  668. break;
  669. case 4://上周
  670. $start = Carbon::now()->addWeeks(-1)->startOfWeek()->timestamp;
  671. $end = Carbon::now()->addWeeks(-1)->endOfWeek()->timestamp;
  672. break;
  673. case 5://本月
  674. $start = Carbon::now()->startOfMonth()->timestamp;
  675. $end = Carbon::now()->endOfMonth()->timestamp;
  676. break;
  677. case 6://上月
  678. $start = Carbon::now()->addMonth(-1)->startOfMonth()->timestamp;
  679. $end = Carbon::now()->addMonth(-1)->endOfMonth()->timestamp;
  680. break;
  681. default:
  682. $start = '';
  683. $end = '';
  684. }
  685. return [$start,$end];
  686. }
  687. /**
  688. * 获取商城中的插件名称自定义设置
  689. * @return mixed
  690. */
  691. private static function getLangSet()
  692. {
  693. $lang = Setting::get('shop.lang', ['lang' => 'zh_cn']);
  694. return $lang[$lang['lang']];
  695. }
  696. private static function relation()
  697. {
  698. if (!isset(self::$relation)) {
  699. self::$relation = MemberRelation::uniacid()->first();
  700. }
  701. return self::$relation;
  702. }
  703. /**
  704. * 关系链是否开启
  705. * @return bool
  706. */
  707. private static function isOpenRelation()
  708. {
  709. $relation = self::relation();
  710. if (!is_null($relation) && $relation->status == 1) {
  711. return true;
  712. }
  713. return false;
  714. }
  715. private static function getSharePageStatus()
  716. {
  717. $relation = self::relation();
  718. if (!is_null($relation) && $relation->share_page == 1) {
  719. return true;
  720. }
  721. return false;
  722. }
  723. /**
  724. * 收入页面配置 config
  725. * @return mixed
  726. */
  727. private static function getIncomePageConfig()
  728. {
  729. return \app\backend\modules\income\Income::current()->getPageItems();
  730. }
  731. private static function getTotalIncome()
  732. {
  733. if (!isset(self::$total_income)) {
  734. $incomeConfig = \app\backend\modules\income\Income::current()->getItems();
  735. $incomeConfig = collect($incomeConfig)->pluck('class')->toArray();
  736. self::$total_income = Income::uniacid()
  737. ->select('member_id', 'incometable_type',
  738. DB::raw('SUM(amount) as total_amount,SUM(IF(status=0,amount,0)) as usable_total'))
  739. ->whereIn('incometable_type', $incomeConfig)
  740. ->where('member_id',self::$memberId)
  741. ->groupBy('incometable_type', 'member_id')
  742. ->get();
  743. }
  744. return self::$total_income;
  745. }
  746. private static function getService()
  747. {
  748. //1.商城客服设置
  749. $shopSet = Setting::get('shop.shop');
  750. $cservice = $shopSet['cservice'];
  751. if (request()->type == 2) {
  752. $cservice = $shopSet['cservice_mini'];
  753. }
  754. $shop_cservice = !empty($cservice) ? $cservice : '';
  755. //2.客服插件设置
  756. if (app('plugins')->isEnabled('customer-service')) {
  757. $set = array_pluck(\Setting::getAllByGroup('customer-service')->toArray(), 'value', 'key');
  758. if ($set['is_open'] == 1) {
  759. if (request()->type == 2) {
  760. $arr = [
  761. 'cservice'=>$set['mini_link']?:$shop_cservice,
  762. 'customer_open'=>$set['mini_open'],
  763. 'service_QRcode' => yz_tomedia($set['mini_QRcode']),
  764. 'service_mobile' => $set['mini_mobile']
  765. ];
  766. }else{
  767. $arr = [
  768. 'cservice'=>$set['link']?:$shop_cservice,
  769. 'service_QRcode' => yz_tomedia($set['QRcode']),
  770. 'service_mobile' => $set['mobile']
  771. ];
  772. }
  773. $alonge_cservice = $arr;
  774. }
  775. }
  776. return !empty($alonge_cservice)?$alonge_cservice:$shop_cservice;
  777. }
  778. /**
  779. * 登陆会员是否是推客
  780. * @return bool
  781. */
  782. private static function isAgent()
  783. {
  784. return MemberModel::isAgent();
  785. }
  786. }