Common.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  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\controller\admin;
  12. use app\common\repositories\store\order\StoreOrderProductRepository;
  13. use app\common\repositories\store\order\StoreOrderRepository;
  14. use app\common\repositories\system\CacheRepository;
  15. use app\common\repositories\system\config\ConfigRepository;
  16. use app\common\repositories\system\config\ConfigValueRepository;
  17. use app\common\repositories\system\merchant\MerchantCategoryRepository;
  18. use app\common\repositories\system\merchant\MerchantRepository;
  19. use app\common\repositories\user\UserRepository;
  20. use app\common\repositories\user\UserVisitRepository;
  21. use crmeb\basic\BaseController;
  22. use crmeb\services\HttpService;
  23. use crmeb\services\UploadService;
  24. use think\facade\Cache;
  25. /**
  26. * Class Common
  27. * @package app\controller\admin
  28. * @author xaboy
  29. * @day 2020/6/25
  30. */
  31. class Common extends BaseController
  32. {
  33. /**
  34. * @return mixed
  35. * @author xaboy
  36. * @day 2020/6/25
  37. */
  38. public function main()
  39. {
  40. $res = Cache::store('file')->remember(self::class . '@main', function () {
  41. $today = $this->mainGroup('today');
  42. $yesterday = $this->mainGroup('yesterday');
  43. $lastWeek = $this->mainGroup(date('Y-m-d', strtotime('- 7day')));
  44. $lastWeekRate = [];
  45. foreach ($lastWeek as $k => $item) {
  46. $lastWeekRate[$k] = $this->getRate($item, $today[$k], 4);
  47. }
  48. return compact('today', 'yesterday', 'lastWeekRate');
  49. }, 2000 + random_int(600, 1200));
  50. return app('json')->success($res);
  51. }
  52. /**
  53. * TODO 上传视频key
  54. * @return \think\response\Json
  55. * @author Qinii
  56. * @day 3/11/22
  57. */
  58. public function temp_key()
  59. {
  60. $upload = UploadService::create();
  61. $re = $upload->getTempKeys();
  62. return app('json')->success($re);
  63. }
  64. /**
  65. * @param $date
  66. * @return array
  67. * @author xaboy
  68. * @day 2020/6/25
  69. */
  70. protected function mainGroup($date)
  71. {
  72. $userRepository = app()->make(UserRepository::class);
  73. $storeOrderRepository = app()->make(StoreOrderRepository::class);
  74. $merchantRepository = app()->make(MerchantRepository::class);
  75. $userVisitRepository = app()->make(UserVisitRepository::class);
  76. $payPrice = (float)$storeOrderRepository->dayOrderPrice($date);
  77. $userNum = (float)$userRepository->newUserNum($date);
  78. $storeNum = (float)$merchantRepository->dateMerchantNum($date);
  79. $visitUserNum = (float)$userVisitRepository->dateVisitUserNum($date);
  80. $visitNum = (float)$userVisitRepository->dateVisitNum($date);
  81. return compact('payPrice', 'userNum', 'storeNum', 'visitUserNum', 'visitNum');
  82. }
  83. /**
  84. * @param StoreOrderRepository $repository
  85. * @return mixed
  86. * @author xaboy
  87. * @day 2020/6/25
  88. */
  89. public function order(StoreOrderRepository $repository)
  90. {
  91. $today = $repository->dayOrderPriceGroup('today')->toArray();
  92. $yesterday = $repository->dayOrderPriceGroup('yesterday')->toArray();
  93. $today = array_combine(array_column($today, 'time'), array_column($today, 'price'));
  94. $yesterday = array_combine(array_column($yesterday, 'time'), array_column($yesterday, 'price'));
  95. $time = getTimes();
  96. $order = [];
  97. foreach ($time as $item) {
  98. $order[] = [
  99. 'time' => $item,
  100. 'today' => $today[$item] ?? 0,
  101. 'yesterday' => $yesterday[$item] ?? 0,
  102. ];
  103. }
  104. $todayPrice = $repository->dayOrderPrice('today');
  105. $yesterdayPrice = $repository->dayOrderPrice('yesterday');
  106. return app('json')->success(compact('order', 'todayPrice', 'yesterdayPrice'));
  107. }
  108. /**
  109. * @param StoreOrderRepository $repository
  110. * @return mixed
  111. * @author xaboy
  112. * @day 2020/6/25
  113. */
  114. public function orderNum(StoreOrderRepository $repository)
  115. {
  116. $orderNum = $repository->dayOrderNum('today');
  117. $yesterdayNum = $repository->dayOrderNum('yesterday');
  118. $today = $repository->dayOrderNumGroup('today')->toArray();
  119. $today = array_combine(array_column($today, 'time'), array_column($today, 'total'));
  120. $monthOrderNum = $repository->dayOrderNum(date('Y/m/d', strtotime('first day of')) . ' 00:00:00' . '-' . date('Y/m/d H:i:s'));
  121. $date = date('Y/m/01 00:00:00', strtotime('last Month')) . '-' . date('Y/m/d 00:00:00', strtotime('-1 day', strtotime('first day of')));
  122. $beforeOrderNum = $repository->dayOrderNum($date);
  123. $monthRate = $this->getRate($beforeOrderNum, $monthOrderNum);
  124. $orderRate = $this->getRate($yesterdayNum, $orderNum);
  125. $time = getTimes();
  126. $data = [];
  127. foreach ($time as $item) {
  128. $data[] = [
  129. 'total' => $today[$item] ?? 0,
  130. 'time' => $item
  131. ];
  132. }
  133. $today = $data;
  134. return app('json')->success(compact('orderNum', 'today', 'monthOrderNum', 'monthRate', 'orderRate'));
  135. }
  136. /**
  137. * @param StoreOrderRepository $repository
  138. * @return mixed
  139. * @author xaboy
  140. * @day 2020/6/25
  141. */
  142. public function orderUser(StoreOrderRepository $repository)
  143. {
  144. $orderNum = $repository->dayOrderUserNum('today');
  145. $yesterdayNum = $repository->dayOrderUserNum('yesterday');
  146. $today = $repository->dayOrderUserGroup('today')->toArray();
  147. $today = array_combine(array_column($today, 'time'), array_column($today, 'total'));
  148. $monthOrderNum = $repository->dayOrderUserNum(date('Y/m/d', strtotime('first day of')) . ' 00:00:00' . '-' . date('Y/m/d H:i:s'));
  149. $date = gmdate('Y/m/01 00:00:00', strtotime('last Month')) . '-' . date('Y/m/d 00:00:00', strtotime('-1 day', strtotime('first day of')));
  150. $beforeOrderNum = $repository->dayOrderUserNum($date);
  151. $monthRate = $this->getRate($beforeOrderNum, $monthOrderNum);
  152. $orderRate = $this->getRate($yesterdayNum, $orderNum);
  153. $time = getTimes();
  154. $data = [];
  155. foreach ($time as $item) {
  156. $data[] = [
  157. 'total' => $today[$item] ?? 0,
  158. 'time' => $item
  159. ];
  160. }
  161. $today = $data;
  162. return app('json')->success(compact('orderNum', 'today', 'monthOrderNum', 'monthRate', 'orderRate'));
  163. }
  164. /**
  165. * @param StoreOrderProductRepository $repository
  166. * @return mixed
  167. * @author xaboy
  168. * @day 2020/6/25
  169. */
  170. public function merchantStock(StoreOrderProductRepository $repository)
  171. {
  172. $date = $this->request->param('date') ?: 'lately7';
  173. $res = Cache::store('file')->remember(self::class . '@merchantStock' . $date, function () use ($date, $repository) {
  174. $total = $repository->dateProductNum($date);
  175. $list = $repository->orderProductGroup($date)->toArray();
  176. foreach ($list as &$item) {
  177. $item['rate'] = bcdiv($item['total'], $total, 2);
  178. }
  179. return compact('list', 'total');
  180. }, 2000 + random_int(600, 1200));
  181. return app('json')->success($res);
  182. }
  183. /**
  184. * @param UserVisitRepository $repository
  185. * @return mixed
  186. * @author xaboy
  187. * @day 2020/6/25
  188. */
  189. public function merchantVisit(UserVisitRepository $repository)
  190. {
  191. $date = $this->request->param('date') ?: 'lately7';
  192. $res = Cache::store('file')->remember(self::class . '@merchantVisit' . $date, function () use ($date, $repository) {
  193. $total = $repository->dateVisitMerchantTotal($date);
  194. $list = $repository->dateVisitMerchantNum($date)->toArray();
  195. foreach ($list as &$item) {
  196. $item['rate'] = bcdiv($item['total'], $total, 2);
  197. }
  198. return compact('list', 'total');
  199. }, 2000 + random_int(600, 1200));
  200. return app('json')->success($res);
  201. }
  202. /**
  203. * @param StoreOrderRepository $repository
  204. * @param MerchantCategoryRepository $merchantCategoryRepository
  205. * @return mixed
  206. * @author xaboy
  207. * @day 2020/6/25
  208. */
  209. public function merchantRate(StoreOrderRepository $repository, MerchantCategoryRepository $merchantCategoryRepository)
  210. {
  211. $date = $this->request->param('date') ?: 'lately7';
  212. $res = Cache::store('file')->remember(self::class . '@merchantRate' . $date, function () use ($repository, $merchantCategoryRepository, $date) {
  213. $total = $repository->dateOrderPrice($date);
  214. $list = $merchantCategoryRepository->dateMerchantPriceGroup($date)->toArray();
  215. $rate = 1;
  216. $pay_price = $total;
  217. foreach ($list as &$item) {
  218. $item['rate'] = bcdiv($item['pay_price'], $total, 2);
  219. $rate = bcsub($rate, $item['rate'], 2);
  220. $pay_price = bcsub($pay_price, $item['pay_price'], 2);
  221. }
  222. if ($rate > 0 && count($list)) {
  223. $list[] = [
  224. 'pay_price' => $pay_price,
  225. 'category_name' => '其他类',
  226. 'rate' => $rate
  227. ];
  228. }
  229. return compact('list', 'total');
  230. }, 2000 + random_int(600, 1200));
  231. return app('json')->success($res);
  232. }
  233. public function userData(UserRepository $repository, UserVisitRepository $visitRepository)
  234. {
  235. $date = $this->request->param('date') ?: 'lately7';
  236. $res = Cache::store('file')->remember(self::class . '@userData' . $date, function () use ($visitRepository, $repository, $date) {
  237. $newUserList = $repository->userNumGroup($date)->toArray();
  238. $newUserList = array_combine(array_column($newUserList, 'time'), array_column($newUserList, 'new'));
  239. $visitList = $visitRepository->dateVisitNumGroup($date)->toArray();
  240. $visitList = array_combine(array_column($visitList, 'time'), array_column($visitList, 'total'));
  241. $base = $repository->beforeUserNum(getStartModelTime($date));
  242. $time = getDatesBetweenTwoDays(getStartModelTime($date), date('Y-m-d'));
  243. $userList = [];
  244. $before = $base;
  245. foreach ($time as $item) {
  246. $new = $newUserList[$item] ?? 0;
  247. $before += $new;
  248. $userList[] = [
  249. 'total' => $before,
  250. 'new' => $new,
  251. 'visit' => $visitList[$item] ?? 0,
  252. 'day' => $item
  253. ];
  254. }
  255. return $userList;
  256. }, 2000 + random_int(600, 1200));
  257. return app('json')->success($res);
  258. }
  259. /**
  260. * @param $last
  261. * @param $today
  262. * @param int $scale
  263. * @return int|string|null
  264. * @author xaboy
  265. * @day 2020/6/25
  266. */
  267. protected function getRate($last, $today, $scale = 2)
  268. {
  269. if ($last == $today)
  270. return 0;
  271. else if ($last == 0)
  272. return $today;
  273. else if ($today == 0)
  274. return -$last;
  275. else
  276. return (float)bcdiv(bcsub($today, $last, $scale), $last, $scale);
  277. }
  278. /**
  279. * 申请授权
  280. * @return mixed
  281. */
  282. public function auth_apply()
  283. {
  284. $data = $this->request->params([
  285. ['company_name', ''],
  286. ['domain_name', ''],
  287. ['order_id', ''],
  288. ['phone', ''],
  289. ['label', 10],
  290. ['captcha', ''],
  291. ]);
  292. if (!$data['company_name']) {
  293. return app('json')->fail('请填写公司名称');
  294. }
  295. if (!$data['domain_name']) {
  296. return app('json')->fail('请填写授权域名');
  297. }
  298. if (!$data['phone']) {
  299. return app('json')->fail('请填写手机号码');
  300. }
  301. if (!$data['order_id']) {
  302. return app('json')->fail('请填写订单id');
  303. }
  304. if (!$data['captcha']) {
  305. return app('json')->fail('请填写验证码');
  306. }
  307. $res = HttpService::postRequest('http://authorize.crmeb.net/api/auth_apply', $data);
  308. if ($res === false) {
  309. return app('json')->fail('申请失败,服务器没有响应!');
  310. }
  311. $res = json_decode($res, true);
  312. if (isset($res['status'])) {
  313. if ($res['status'] == 400) {
  314. return app('json')->fail($res['msg'] ?? "申请失败");
  315. } else {
  316. return app('json')->success($res['msg'] ?? '申请成功', $res);
  317. }
  318. }
  319. return app('json')->fail("申请授权失败!");
  320. }
  321. public function uploadConfig(ConfigRepository $repository)
  322. {
  323. return app('json')->success(formToData($repository->uploadForm()));
  324. }
  325. public function saveUploadConfig(ConfigRepository $repository)
  326. {
  327. $formData = $this->request->post();
  328. if (!count($formData)) return app('json')->fail('保存失败');
  329. $repository->saveUpload($formData);
  330. return app('json')->success('保存成功');
  331. }
  332. public function loginConfig()
  333. {
  334. $login_logo = systemConfig('sys_login_logo');
  335. $menu_logo = systemConfig('sys_menu_logo');
  336. $menu_slogo = systemConfig('sys_menu_slogo');
  337. $login_title = systemConfig('sys_login_title');
  338. $sys_login_banner = systemConfig('sys_login_banner');
  339. $beian_sn = systemConfig('beian_sn');
  340. $login_banner = [];
  341. foreach ($sys_login_banner as $item) {
  342. $login_banner[] = [
  343. 'pic' => $item,
  344. 'name' => $item
  345. ];
  346. }
  347. return app('json')->success(compact('login_banner', 'login_logo', 'login_title', 'menu_slogo', 'menu_logo', 'beian_sn'));
  348. }
  349. public function version()
  350. {
  351. $sys_open_version = systemConfig('sys_open_version');
  352. $data = [
  353. 'version' => get_crmeb_version('未知'),
  354. 'year' => '© 2014-' . date('Y', time()),
  355. 'beian_sn' => systemConfig('beian_sn'),
  356. 'url' => 'www.crmeb.com',
  357. 'Copyright' => 'Copyright',
  358. 'sys_open_version' => $sys_open_version === '' ? '1' : $sys_open_version,
  359. ];
  360. $copyright = app()->make(CacheRepository::class)->getResultByKey('copyright_status');
  361. if (!$copyright) {
  362. $data['status'] = -1;
  363. } else {
  364. $copyright = app()->make(CacheRepository::class)->search(['copyright_status', 'copyright_context', 'copyright_image']);
  365. $data['status'] = 1;
  366. $data['Copyright'] = $copyright['copyright_context'] ?? '';
  367. $data['image'] = $copyright['copyright_image'] ?? '';
  368. }
  369. return app('json')->success($data);
  370. }
  371. public function config()
  372. {
  373. $config = systemConfig(['delivery_type', 'delivery_status', 'sms_use_type', 'hot_ranking_lv', 'hot_ranking_switch']);
  374. return app('json')->success($config);
  375. }
  376. public function getChangeColor()
  377. {
  378. return app('json')->success(systemConfig(['global_theme']));
  379. }
  380. public function setChangeColor()
  381. {
  382. $data = $this->request->params(['global_theme']);
  383. $make = app()->make(ConfigValueRepository::class);
  384. $make->setFormData($data, 0);
  385. return app('json')->success('修改成功');
  386. }
  387. public function svaeCopyright()
  388. {
  389. $data = $this->request->params(['copyright_context', 'copyright_image']);
  390. $copyright = app()->make(CacheRepository::class)->getResultByKey('copyright_status');
  391. if (!$copyright)
  392. return app('json')->fail('请先获取版权授权');
  393. app()->make(CacheRepository::class)->saveAll($data);
  394. return app('json')->success('修改成功');
  395. }
  396. public function payAuth()
  397. {
  398. $host = 'https://shop.crmeb.net/html/index.html';
  399. $version = get_crmeb_version_code();
  400. $url = rtrim($this->request->host(), '/');
  401. $data['url'] = $host . '?url=' . $url . '&product=mer&label=10&venrsion=' . $version;
  402. return app('json')->success($data);
  403. }
  404. }