Common.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. <?php
  2. namespace app\controller\admin;
  3. use ln\basic\BaseController;
  4. use app\common\repositories\store\order\StoreOrderProductRepository;
  5. use app\common\repositories\store\order\StoreOrderRepository;
  6. use app\common\repositories\store\product\ProductRepository;
  7. use app\common\repositories\system\config\ConfigClassifyRepository;
  8. use app\common\repositories\system\config\ConfigRepository;
  9. use app\common\repositories\system\config\ConfigValueRepository;
  10. use app\common\repositories\system\merchant\MerchantCategoryRepository;
  11. use app\common\repositories\system\merchant\MerchantRepository;
  12. use app\common\repositories\user\UserRelationRepository;
  13. use app\common\repositories\user\UserRepository;
  14. use app\common\repositories\user\UserVisitRepository;
  15. use ln\services\HttpService;
  16. use think\App;
  17. use think\facade\Cache;
  18. use think\facade\Db;
  19. /**
  20. * Class Common
  21. * @package app\controller\admin
  22. * @author zfy
  23. * @day 2020/6/25
  24. */
  25. class Common extends BaseController
  26. {
  27. /**
  28. * @return mixed
  29. * @author zfy
  30. * @day 2020/6/25
  31. */
  32. public function main()
  33. {
  34. $res = Cache::store('file')->remember(self::class . '@main', function () {
  35. $today = $this->mainGroup('today');
  36. $yesterday = $this->mainGroup('yesterday');
  37. $lastWeek = $this->mainGroup(date('Y-m-d', strtotime('- 7day')));
  38. $lastWeekRate = [];
  39. foreach ($lastWeek as $k => $item) {
  40. $lastWeekRate[$k] = $this->getRate($item, $today[$k], 4);
  41. }
  42. return compact('today', 'yesterday', 'lastWeekRate');
  43. }, 2000 + random_int(600, 1200));
  44. return app('json')->success($res);
  45. }
  46. /**
  47. * @param $date
  48. * @return array
  49. * @author zfy
  50. * @day 2020/6/25
  51. */
  52. protected function mainGroup($date)
  53. {
  54. $userRepository = app()->make(UserRepository::class);
  55. $storeOrderRepository = app()->make(StoreOrderRepository::class);
  56. $merchantRepository = app()->make(MerchantRepository::class);
  57. $userVisitRepository = app()->make(UserVisitRepository::class);
  58. $payPrice = (float)$storeOrderRepository->dayOrderPrice($date);
  59. $userNum = (float)$userRepository->newUserNum($date);
  60. $storeNum = (float)$merchantRepository->dateMerchantNum($date);
  61. $visitUserNum = (float)$userVisitRepository->dateVisitUserNum($date);
  62. $visitNum = (float)$userVisitRepository->dateVisitNum($date);
  63. return compact('payPrice', 'userNum', 'storeNum', 'visitUserNum', 'visitNum');
  64. }
  65. /**
  66. * @param StoreOrderRepository $repository
  67. * @return mixed
  68. * @author zfy
  69. * @day 2020/6/25
  70. */
  71. public function order(StoreOrderRepository $repository)
  72. {
  73. $today = $repository->dayOrderPriceGroup('today')->toArray();
  74. $yesterday = $repository->dayOrderPriceGroup('yesterday')->toArray();
  75. $today = array_combine(array_column($today, 'time'), array_column($today, 'price'));
  76. $yesterday = array_combine(array_column($yesterday, 'time'), array_column($yesterday, 'price'));
  77. $time = getTimes();
  78. $order = [];
  79. foreach ($time as $item) {
  80. $order[] = [
  81. 'time' => $item,
  82. 'today' => $today[$item] ?? 0,
  83. 'yesterday' => $yesterday[$item] ?? 0,
  84. ];
  85. }
  86. $todayPrice = $repository->dayOrderPrice('today');
  87. $yesterdayPrice = $repository->dayOrderPrice('yesterday');
  88. return app('json')->success(compact('order', 'todayPrice', 'yesterdayPrice'));
  89. }
  90. /**
  91. * @param StoreOrderRepository $repository
  92. * @return mixed
  93. * @author zfy
  94. * @day 2020/6/25
  95. */
  96. public function orderNum(StoreOrderRepository $repository)
  97. {
  98. $orderNum = $repository->dayOrderNum('today');
  99. $yesterdayNum = $repository->dayOrderNum('yesterday');
  100. $today = $repository->dayOrderNumGroup('today')->toArray();
  101. $today = array_combine(array_column($today, 'time'), array_column($today, 'total'));
  102. $monthOrderNum = $repository->dayOrderNum(date('Y/m/d', strtotime('first day of')) . ' 00:00:00' . '-' . date('Y/m/d H:i:s'));
  103. $beforeOrderNum = $repository->dayOrderNum(date('Y/m/01 00:00:00', strtotime('last Month')) . '-' . date('Y/m/d 00:00:00', strtotime('-1 day', strtotime('first day of'))));
  104. $monthRate = $this->getRate($beforeOrderNum, $monthOrderNum);
  105. $orderRate = $this->getRate($yesterdayNum, $orderNum);
  106. $time = getTimes();
  107. $data = [];
  108. foreach ($time as $item) {
  109. $data[] = [
  110. 'total' => $today[$item] ?? 0,
  111. 'time' => $item
  112. ];
  113. }
  114. $today = $data;
  115. return app('json')->success(compact('orderNum', 'today', 'monthOrderNum', 'monthRate', 'orderRate'));
  116. }
  117. /**
  118. * @param StoreOrderRepository $repository
  119. * @return mixed
  120. * @author zfy
  121. * @day 2020/6/25
  122. */
  123. public function orderUser(StoreOrderRepository $repository)
  124. {
  125. $orderNum = $repository->dayOrderUserNum('today');
  126. $yesterdayNum = $repository->dayOrderUserNum('yesterday');
  127. $today = $repository->dayOrderUserGroup('today')->toArray();
  128. $today = array_combine(array_column($today, 'time'), array_column($today, 'total'));
  129. $monthOrderNum = $repository->dayOrderUserNum(date('Y/m/d', strtotime('first day of')) . ' 00:00:00' . '-' . date('Y/m/d H:i:s'));
  130. $beforeOrderNum = $repository->dayOrderUserNum(gmdate('Y/m/01 00:00:00', strtotime('last Month')) . '-' . date('Y/m/d 00:00:00', strtotime('-1 day', strtotime('first day of'))));
  131. $monthRate = $this->getRate($beforeOrderNum, $monthOrderNum);
  132. $orderRate = $this->getRate($yesterdayNum, $orderNum);
  133. $time = getTimes();
  134. $data = [];
  135. foreach ($time as $item) {
  136. $data[] = [
  137. 'total' => $today[$item] ?? 0,
  138. 'time' => $item
  139. ];
  140. }
  141. $today = $data;
  142. return app('json')->success(compact('orderNum', 'today', 'monthOrderNum', 'monthRate', 'orderRate'));
  143. }
  144. /**
  145. * @param StoreOrderProductRepository $repository
  146. * @return mixed
  147. * @author zfy
  148. * @day 2020/6/25
  149. */
  150. public function merchantStock(StoreOrderProductRepository $repository)
  151. {
  152. $date = $this->request->param('date') ?: 'lately7';
  153. $res = Cache::store('file')->remember(self::class . '@merchantStock' . $date, function () use ($date, $repository) {
  154. $total = $repository->dateProductNum($date);
  155. $list = $repository->orderProductGroup($date)->toArray();
  156. foreach ($list as &$item) {
  157. $item['rate'] = bcdiv($item['total'], $total, 2);
  158. }
  159. return compact('list', 'total');
  160. }, 2000 + random_int(600, 1200));
  161. return app('json')->success($res);
  162. }
  163. /**
  164. * @param UserVisitRepository $repository
  165. * @return mixed
  166. * @author zfy
  167. * @day 2020/6/25
  168. */
  169. public function merchantVisit(UserVisitRepository $repository)
  170. {
  171. $date = $this->request->param('date') ?: 'lately7';
  172. $res = Cache::store('file')->remember(self::class . '@merchantVisit' . $date, function () use ($date, $repository) {
  173. $total = $repository->dateVisitMerchantTotal($date);
  174. $list = $repository->dateVisitMerchantNum($date)->toArray();
  175. foreach ($list as &$item) {
  176. $item['rate'] = bcdiv($item['total'], $total, 2);
  177. }
  178. return compact('list', 'total');
  179. }, 2000 + random_int(600, 1200));
  180. return app('json')->success($res);
  181. }
  182. /**
  183. * @param StoreOrderRepository $repository
  184. * @param MerchantCategoryRepository $merchantCategoryRepository
  185. * @return mixed
  186. * @author zfy
  187. * @day 2020/6/25
  188. */
  189. public function merchantRate(StoreOrderRepository $repository, MerchantCategoryRepository $merchantCategoryRepository)
  190. {
  191. $date = $this->request->param('date') ?: 'lately7';
  192. $res = Cache::store('file')->remember(self::class . '@merchantRate' . $date, function () use ($repository, $merchantCategoryRepository, $date) {
  193. $total = $repository->dateOrderPrice($date);
  194. $list = $merchantCategoryRepository->dateMerchantPriceGroup($date)->toArray();
  195. $rate = 1;
  196. $pay_price = $total;
  197. foreach ($list as &$item) {
  198. $item['rate'] = bcdiv($item['pay_price'], $total, 2);
  199. $rate = bcsub($rate, $item['rate'], 2);
  200. $pay_price = bcsub($pay_price, $item['pay_price'], 2);
  201. }
  202. if ($rate > 0 && count($list)) {
  203. $list[] = [
  204. 'pay_price' => $pay_price,
  205. 'category_name' => '其他类',
  206. 'rate' => $rate
  207. ];
  208. }
  209. return compact('list', 'total');
  210. }, 2000 + random_int(600, 1200));
  211. return app('json')->success($res);
  212. }
  213. public function userData(UserRepository $repository, UserVisitRepository $visitRepository)
  214. {
  215. $date = $this->request->param('date') ?: 'lately7';
  216. $res = Cache::store('file')->remember(self::class . '@userData' . $date, function () use ($visitRepository, $repository, $date) {
  217. $newUserList = $repository->userNumGroup($date)->toArray();
  218. $newUserList = array_combine(array_column($newUserList, 'time'), array_column($newUserList, 'new'));
  219. $visitList = $visitRepository->dateVisitNumGroup($date)->toArray();
  220. $visitList = array_combine(array_column($visitList, 'time'), array_column($visitList, 'total'));
  221. $base = $repository->beforeUserNum(getStartModelTime($date));
  222. $time = getDatesBetweenTwoDays(getStartModelTime($date), date('Y-m-d'));
  223. $userList = [];
  224. $before = $base;
  225. foreach ($time as $item) {
  226. $new = $newUserList[$item] ?? 0;
  227. $before += $new;
  228. $userList[] = [
  229. 'total' => $before,
  230. 'new' => $new,
  231. 'visit' => $visitList[$item] ?? 0,
  232. 'day' => $item
  233. ];
  234. }
  235. return $userList;
  236. }, 2000 + random_int(600, 1200));
  237. return app('json')->success($res);
  238. }
  239. /**
  240. * @param $last
  241. * @param $today
  242. * @param int $scale
  243. * @return int|string|null
  244. * @author zfy
  245. * @day 2020/6/25
  246. */
  247. protected function getRate($last, $today, $scale = 2)
  248. {
  249. if ($last == $today)
  250. return 0;
  251. else if ($last == 0)
  252. return $today;
  253. else if ($today == 0)
  254. return -$last;
  255. else
  256. return (float)bcdiv(bcsub($today, $last, $scale), $last, $scale);
  257. }
  258. /**
  259. * 申请授权
  260. * @return mixed
  261. */
  262. public function auth_apply()
  263. {
  264. $data = $this->request->params([
  265. ['company_name', ''],
  266. ['domain_name', ''],
  267. ['order_id', ''],
  268. ['phone', ''],
  269. ['label', 10],
  270. ['captcha', ''],
  271. ]);
  272. if (!$data['company_name']) {
  273. return app('json')->fail('请填写公司名称');
  274. }
  275. if (!$data['domain_name']) {
  276. return app('json')->fail('请填写授权域名');
  277. }
  278. if (!$data['phone']) {
  279. return app('json')->fail('请填写手机号码');
  280. }
  281. if (!$data['order_id']) {
  282. return app('json')->fail('请填写订单id');
  283. }
  284. if (!$data['captcha']) {
  285. return app('json')->fail('请填写验证码');
  286. }
  287. $res = HttpService::postRequest('http://authorize.crmeb.net/api/auth_apply', $data);
  288. if ($res === false) {
  289. return app('json')->fail('申请失败,服务器没有响应!');
  290. }
  291. $res = json_decode($res, true);
  292. if (isset($res['status'])) {
  293. if ($res['status'] == 400) {
  294. return app('json')->fail($res['msg'] ?? "申请失败");
  295. } else {
  296. return app('json')->success($res['msg'] ?? '申请成功', $res);
  297. }
  298. }
  299. return app('json')->fail("申请授权失败!");
  300. }
  301. public function uploadConfig(ConfigRepository $repository)
  302. {
  303. return app('json')->success(formToData($repository->uploadForm()));
  304. }
  305. public function saveUploadConfig(ConfigRepository $repository)
  306. {
  307. $formData = $this->request->post();
  308. if (!count($formData)) return app('json')->fail('保存失败');
  309. $repository->saveUpload($formData);
  310. return app('json')->success('保存成功');
  311. }
  312. public function loginConfig()
  313. {
  314. $login_logo = systemConfig('sys_login_logo');
  315. $menu_logo = systemConfig('sys_menu_logo');
  316. $menu_slogo = systemConfig('sys_menu_slogo');
  317. $login_title = systemConfig('sys_login_title');
  318. $login_banner = systemGroupData('sys_login_banner');
  319. return app('json')->success(compact('login_banner', 'login_logo', 'login_title', 'menu_slogo', 'menu_logo'));
  320. }
  321. public function version()
  322. {
  323. $sys_open_version = systemConfig('sys_open_version');
  324. return app('json')->success(['version' => get_crmeb_version('未知'), 'sys_open_version' => $sys_open_version === '' ? '1' : $sys_open_version]);
  325. }
  326. }