new-admin-api/app/controller/admin/Common.php

654 lines
23 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\controller\admin;
use app\common\repositories\marketing\AgentBrokerageRepository;
use app\common\repositories\store\order\StoreOrderProductRepository;
use app\common\repositories\store\order\StoreOrderRepository;
use app\common\repositories\system\CacheRepository;
use app\common\repositories\system\config\ConfigRepository;
use app\common\repositories\system\config\ConfigValueRepository;
use app\common\repositories\system\merchant\MerchantCategoryRepository;
use app\common\repositories\system\merchant\MerchantRepository;
use app\common\repositories\user\UserRepository;
use app\common\repositories\user\UserVisitRepository;
use crmeb\basic\BaseController;
use crmeb\services\HttpService;
use crmeb\services\UploadService;
use think\facade\Cache;
use think\facade\Db;
/**
* Class Common
* @package app\controller\admin
* @author xaboy
* @day 2020/6/25
*/
class Common extends BaseController
{
/**
* @return mixed
* @author xaboy
* @day 2020/6/25
*/
public function main()
{
$res = Cache::store('file')->remember(self::class . '@main', function () {
$today = $this->mainGroup('today');
$yesterday = $this->mainGroup('yesterday');
$lastWeek = $this->mainGroup(date('Y-m-d', strtotime('- 7day')));
$lastWeekRate = [];
foreach ($lastWeek as $k => $item) {
$lastWeekRate[$k] = $this->getRate($item, $today[$k], 4);
}
return compact('today', 'yesterday', 'lastWeekRate');
}, 2000 + random_int(600, 1200));
return app('json')->success($res);
}
/**
* TODO 上传视频key
* @return \think\response\Json
* @author Qinii
* @day 3/11/22
*/
public function temp_key()
{
$upload = UploadService::create();
$re = $upload->getTempKeys();
return app('json')->success($re);
}
/**
* @param $date
* @return array
* @author xaboy
* @day 2020/6/25
*/
protected function mainGroup($date)
{
$userRepository = app()->make(UserRepository::class);
$storeOrderRepository = app()->make(StoreOrderRepository::class);
$merchantRepository = app()->make(MerchantRepository::class);
$userVisitRepository = app()->make(UserVisitRepository::class);
$payPrice = (float)$storeOrderRepository->dayOrderPrice($date);
$userNum = (float)$userRepository->newUserNum($date);
$storeNum = (float)$merchantRepository->dateMerchantNum($date);
$visitUserNum = (float)$userVisitRepository->dateVisitUserNum($date);
$visitNum = (float)$userVisitRepository->dateVisitNum($date);
return compact('payPrice', 'userNum', 'storeNum', 'visitUserNum', 'visitNum');
}
/**
* @param StoreOrderRepository $repository
* @return mixed
* @author xaboy
* @day 2020/6/25
*/
public function order(StoreOrderRepository $repository)
{
$today = $repository->dayOrderPriceGroup('today')->toArray();
$yesterday = $repository->dayOrderPriceGroup('yesterday')->toArray();
$today = array_combine(array_column($today, 'time'), array_column($today, 'price'));
$yesterday = array_combine(array_column($yesterday, 'time'), array_column($yesterday, 'price'));
$time = getTimes();
$order = [];
foreach ($time as $item) {
$order[] = [
'time' => $item,
'today' => $today[$item] ?? 0,
'yesterday' => $yesterday[$item] ?? 0,
];
}
$todayPrice = $repository->dayOrderPrice('today');
$yesterdayPrice = $repository->dayOrderPrice('yesterday');
return app('json')->success(compact('order', 'todayPrice', 'yesterdayPrice'));
}
/**
* @param StoreOrderRepository $repository
* @return mixed
* @author xaboy
* @day 2020/6/25
*/
public function orderNum(StoreOrderRepository $repository)
{
$orderNum = $repository->dayOrderNum('today');
$yesterdayNum = $repository->dayOrderNum('yesterday');
$today = $repository->dayOrderNumGroup('today')->toArray();
$today = array_combine(array_column($today, 'time'), array_column($today, 'total'));
$monthOrderNum = $repository->dayOrderNum(date('Y/m/d', strtotime('first day of')) . ' 00:00:00' . '-' . date('Y/m/d H:i:s'));
$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')));
$beforeOrderNum = $repository->dayOrderNum($date);
$monthRate = $this->getRate($beforeOrderNum, $monthOrderNum);
$orderRate = $this->getRate($yesterdayNum, $orderNum);
$time = getTimes();
$data = [];
foreach ($time as $item) {
$data[] = [
'total' => $today[$item] ?? 0,
'time' => $item
];
}
$today = $data;
return app('json')->success(compact('orderNum', 'today', 'monthOrderNum', 'monthRate', 'orderRate'));
}
/**
* @param StoreOrderRepository $repository
* @return mixed
* @author xaboy
* @day 2020/6/25
*/
public function orderUser(StoreOrderRepository $repository)
{
$orderNum = $repository->dayOrderUserNum('today');
$yesterdayNum = $repository->dayOrderUserNum('yesterday');
$today = $repository->dayOrderUserGroup('today')->toArray();
$today = array_combine(array_column($today, 'time'), array_column($today, 'total'));
$monthOrderNum = $repository->dayOrderUserNum(date('Y/m/d', strtotime('first day of')) . ' 00:00:00' . '-' . date('Y/m/d H:i:s'));
$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')));
$beforeOrderNum = $repository->dayOrderUserNum($date);
$monthRate = $this->getRate($beforeOrderNum, $monthOrderNum);
$orderRate = $this->getRate($yesterdayNum, $orderNum);
$time = getTimes();
$data = [];
foreach ($time as $item) {
$data[] = [
'total' => $today[$item] ?? 0,
'time' => $item
];
}
$today = $data;
return app('json')->success(compact('orderNum', 'today', 'monthOrderNum', 'monthRate', 'orderRate'));
}
/**
* @param StoreOrderProductRepository $repository
* @return mixed
* @author xaboy
* @day 2020/6/25
*/
public function merchantStock(StoreOrderProductRepository $repository)
{
$date = $this->request->param('date') ?: 'lately7';
$res = Cache::store('file')->remember(self::class . '@merchantStock' . $date, function () use ($date, $repository) {
$total = $repository->dateProductNum($date);
$list = $repository->orderProductGroup($date)->toArray();
foreach ($list as &$item) {
$item['rate'] = bcdiv($item['total'], $total, 2);
}
return compact('list', 'total');
}, 2000 + random_int(600, 1200));
return app('json')->success($res);
}
/**
* @param UserVisitRepository $repository
* @return mixed
* @author xaboy
* @day 2020/6/25
*/
public function merchantVisit(UserVisitRepository $repository)
{
$date = $this->request->param('date') ?: 'lately7';
$res = Cache::store('file')->remember(self::class . '@merchantVisit' . $date, function () use ($date, $repository) {
$total = $repository->dateVisitMerchantTotal($date);
$list = $repository->dateVisitMerchantNum($date)->toArray();
foreach ($list as &$item) {
$item['rate'] = bcdiv($item['total'], $total, 2);
}
return compact('list', 'total');
}, 2000 + random_int(600, 1200));
return app('json')->success($res);
}
/**
* @param StoreOrderRepository $repository
* @param MerchantCategoryRepository $merchantCategoryRepository
* @return mixed
* @author xaboy
* @day 2020/6/25
*/
public function merchantRate(StoreOrderRepository $repository, MerchantCategoryRepository $merchantCategoryRepository)
{
$date = $this->request->param('date') ?: 'lately7';
$res = Cache::store('file')->remember(self::class . '@merchantRate' . $date, function () use ($repository, $merchantCategoryRepository, $date) {
$total = $repository->dateOrderPrice($date);
$list = $merchantCategoryRepository->dateMerchantPriceGroup($date)->toArray();
$rate = 1;
$pay_price = $total;
foreach ($list as &$item) {
$item['rate'] = bcdiv($item['pay_price'], $total, 2);
$rate = bcsub($rate, $item['rate'], 2);
$pay_price = bcsub($pay_price, $item['pay_price'], 2);
}
if ($rate > 0 && count($list)) {
$list[] = [
'pay_price' => $pay_price,
'category_name' => '其他类',
'rate' => $rate
];
}
return compact('list', 'total');
}, 2000 + random_int(600, 1200));
return app('json')->success($res);
}
public function userData(UserRepository $repository, UserVisitRepository $visitRepository)
{
$date = $this->request->param('date') ?: 'lately7';
$res = Cache::store('file')->remember(self::class . '@userData' . $date, function () use ($visitRepository, $repository, $date) {
$newUserList = $repository->userNumGroup($date)->toArray();
$newUserList = array_combine(array_column($newUserList, 'time'), array_column($newUserList, 'new'));
$visitList = $visitRepository->dateVisitNumGroup($date)->toArray();
$visitList = array_combine(array_column($visitList, 'time'), array_column($visitList, 'total'));
$base = $repository->beforeUserNum(getStartModelTime($date));
$time = getDatesBetweenTwoDays(getStartModelTime($date), date('Y-m-d'));
$userList = [];
$before = $base;
foreach ($time as $item) {
$new = $newUserList[$item] ?? 0;
$before += $new;
$userList[] = [
'total' => $before,
'new' => $new,
'visit' => $visitList[$item] ?? 0,
'day' => $item
];
}
return $userList;
}, 2000 + random_int(600, 1200));
return app('json')->success($res);
}
/**
* @param $last
* @param $today
* @param int $scale
* @return int|string|null
* @author xaboy
* @day 2020/6/25
*/
protected function getRate($last, $today, $scale = 2)
{
if ($last == $today)
return 0;
else if ($last == 0)
return $today;
else if ($today == 0)
return -$last;
else
return (float)bcdiv(bcsub($today, $last, $scale), $last, $scale);
}
/**
* 申请授权
* @return mixed
*/
public function auth_apply()
{
// $data = $this->request->params([
// ['company_name', ''],
// ['domain_name', ''],
// ['order_id', ''],
// ['phone', ''],
// ['label', 10],
// ['captcha', ''],
// ]);
// if (!$data['company_name']) {
// return app('json')->fail('请填写公司名称');
// }
// if (!$data['domain_name']) {
// return app('json')->fail('请填写授权域名');
// }
// if (!$data['phone']) {
// return app('json')->fail('请填写手机号码');
// }
// if (!$data['order_id']) {
// return app('json')->fail('请填写订单id');
// }
// if (!$data['captcha']) {
// return app('json')->fail('请填写验证码');
// }
// $res = HttpService::postRequest('http://authorize.crmeb.net/api/auth_apply', $data);
// if ($res === false) {
// return app('json')->fail('申请失败,服务器没有响应!');
// }
// $res = json_decode($res, true);
// if (isset($res['status'])) {
// if ($res['status'] == 400) {
// return app('json')->fail($res['msg'] ?? "申请失败");
// } else {
// return app('json')->success($res['msg'] ?? '申请成功', $res);
// }
// }
// return app('json')->fail("申请授权失败!");
return app('json')->success($res['msg'] ?? '申请成功', $res);
}
public function uploadConfig(ConfigRepository $repository)
{
return app('json')->success(formToData($repository->uploadForm()));
}
public function saveUploadConfig(ConfigRepository $repository)
{
$formData = $this->request->post();
if (!count($formData)) return app('json')->fail('保存失败');
$repository->saveUpload($formData);
return app('json')->success('保存成功');
}
public function loginConfig()
{
$login_logo = systemConfig('sys_login_logo');
$menu_logo = systemConfig('sys_menu_logo');
$menu_slogo = systemConfig('sys_menu_slogo');
$login_title = systemConfig('sys_login_title');
$sys_login_banner = systemConfig('sys_login_banner');
$beian_sn = systemConfig('beian_sn');
$login_banner = [];
foreach ($sys_login_banner ?: [] as $item) {
$login_banner[] = [
'pic' => $item,
'name' => $item
];
}
return app('json')->success(compact('login_banner', 'login_logo', 'login_title', 'menu_slogo', 'menu_logo', 'beian_sn'));
}
public function version()
{
$sys_open_version = systemConfig('sys_open_version');
$data = [
'version' => get_crmeb_version('未知'),
'year' => '© 2014-' . date('Y', time()),
'beian_sn' => systemConfig('beian_sn'),
'url' => 'http://www.crmeb.com',
'Copyright' => 'Copyright',
'sys_open_version' => $sys_open_version === '' ? '1' : $sys_open_version,
];
$copyright = app()->make(CacheRepository::class)->getResultByKey('copyright_status');
if (!$copyright) {
$data['status'] = -1;
} else {
$copyright = app()->make(CacheRepository::class)->search(['copyright_status', 'copyright_context', 'copyright_image']);
$data['status'] = 1;
$data['Copyright'] = $copyright['copyright_context'] ?? '';
$data['image'] = $copyright['copyright_image'] ?? '';
$data['url'] = systemConfig('site_url');
}
return app('json')->success($data);
}
public function config()
{
$config = systemConfig(['delivery_type', 'delivery_status', 'sms_use_type', 'hot_ranking_lv', 'hot_ranking_switch','tx_map_key']);
return app('json')->success($config);
}
public function getChangeColor()
{
return app('json')->success(systemConfig(['global_theme']));
}
public function setChangeColor()
{
$data = $this->request->params(['global_theme']);
$make = app()->make(ConfigValueRepository::class);
$make->setFormData($data, 0);
return app('json')->success('修改成功');
}
public function svaeCopyright()
{
$data = $this->request->params(['copyright_context', 'copyright_image']);
$copyright = app()->make(CacheRepository::class)->getResultByKey('copyright_status');
if (!$copyright)
return app('json')->fail('请先获取版权授权');
app()->make(CacheRepository::class)->saveAll($data);
return app('json')->success('修改成功');
}
public function test(){
// app()->make(AgentBrokerageRepository::class)->inviteAgentGive((int)247);
// $this->sqlInit();
debug("调试结束...");
}
/******** 数据库批量处理 ***************************************/
private function sqlInit(){
// 不清除数据的表
$notCleanUp = [
// 文章
'tk_article',
'tk_article_category',
'tk_article_content',
// 社区
'tk_community',
'tk_community_category',
// 'tk_community_topic',
// 系统
'tk_cache',
'tk_city_area',
'tk_diy',
'tk_express',
'tk_relevance',
'tk_system_admin',
'tk_system_attachment',
'tk_system_attachment_category',
'tk_system_config',
'tk_system_config_classify',
'tk_system_config_value',
'tk_system_group',
'tk_system_group_data',
'tk_system_menu',
'tk_system_notice_config',
'tk_system_role',
'tk_template_message',
'tk_sms_record',
// 反馈建议
'tk_feedback_category',
// 保障服务
'tk_guarantee',
'tk_guarantee_template',
'tk_guarantee_value',
// 平台&商户积分
// 'tk_integral',
// 'tk_integral_give_record',
// 用户相关
'tk_member_interests',
'tk_user',
'tk_user_address',
'tk_user_bill',
'tk_user_history',
'tk_user_merchant',
'tk_user_order',
'tk_user_relation',
'tk_user_spread_log',
'tk_user_brokerage',// 分销商等级
'tk_wechat_user',
// 商户相关
'tk_merchant',
'tk_merchant_admin',
'tk_merchant_category',
// 'tk_merchant_intention',
'tk_merchant_type',
'tk_shipping_template',
'tk_shipping_template_free',
'tk_shipping_template_region',
'tk_shipping_template_undelivery',
// 装修相关
'tk_page_category',
'tk_page_link',
// 商品相关
'tk_parameter',
'tk_parameter_template',
'tk_parameter_value',
'price_rule',
'tk_store_attr_template',
'tk_store_brand',
'tk_store_brand_category',
'tk_store_category',
'tk_store_product',
'tk_store_product_attr',
'tk_store_product_attr_value',
'tk_store_product_cate',
'tk_store_product_content',
'tk_store_product_label',
'tk_store_spu',
// 'tk_store_product_reply',// 商品评论
'tk_price_rule',
// 商品助力
// 'tk_store_product_assist',
// 'tk_store_product_assist_set',
// 'tk_store_product_assist_sku',
// 'tk_store_product_assist_user',
// 优惠券相关
// 'tk_store_coupon',
// 'tk_store_coupon_issue_user',
// 'tk_store_coupon_product',
// 'tk_store_coupon_send',
// 'tk_store_coupon_user',
// 套餐相关
// 'tk_store_discounts',
// 'tk_store_discounts_product',
// 拼团商品
// 'tk_store_product_group',
// 'tk_store_product_group_buying',
// 'tk_store_product_group_sku',
// 'tk_store_product_group_user',
// 预售商品
// 'tk_store_product_presell',
// 'tk_store_product_presell_sku',
// 活动商品
'tk_store_product_sku',
// 供应商
'tk_system_supplier',
// 兑换
'tk_exchange_pickup_point',
// 活动
'tk_store_activity',
];
// 获取全部数据库列表
$tables = $this->getAllTable();
// 获取存在数据的表
// $hasTable = $this->getHasSpecifyDataTable($tables);
$hasTable = $this->getHasDataTable($tables,$notCleanUp);
debug($hasTable);
// 执行清除操作
// foreach($tables as $name){
// if(!in_array($name,$notCleanUp)){
// // 执行清除操作
// $res = Db::query('TRUNCATE TABLE '.$name.';');
// }
// }
debug("处理完成");
}
// 数据库处理 - 获取全部数据库
private function getAllTable(){
$database = Db::query('SELECT DATABASE() as database_name')[0]['database_name'];
$tables = Db::query('SHOW TABLES');
return array_column($tables,'Tables_in_'.$database);
}
// 数据库处理 - 获取存在数据的表(任意数据)
private function getHasDataTable($tables,$notCleanUp){
$tableList = [];
foreach($tables as $tableName){
if(!in_array($tableName,$notCleanUp)){
// echo "{$tableName}<br />\n\r";
// 获取字段信息
$result = Db::query("select count(*) as count_data from {$tableName}");
$countData = $result[0]['count_data'] ?? 0;
if($countData > 0){
$tableList[] = $tableName;
}
}
}
return $tableList;
}
// 数据库处理 - 域名替换
private function getHasSpecifyDataTable($tables){
$tableList = [];
foreach($tables as $tableName){
echo "{$tableName}\n\r";
// 获取字段信息
$allFieldDesc = Db::query("show columns from {$tableName}");
$allField = array_column($allFieldDesc,'Field');
// if($this->isHasSpecifyData($allField,$name)) $tableList[] = $name;
$res = $this->isHasSpecifyData($allField,$tableName);
echo $res ? "存在\n\r" : "不存在\n\r";
if($res){
// 批量替换
$query = "UPDATE {$tableName} SET ";
$handleFieldNum = 0;
foreach($allFieldDesc as $fieldInfo){
if(strpos($fieldInfo['Type'], 'int') !== false || $fieldInfo['Key'] == 'PRI') continue;
$fieldName = $fieldInfo['Field'];
$query .= "`{$fieldName}` = REPLACE(`{$fieldName}`,'bt.test.cdlfjy.com','mp.scwmbh.cn'),";
++$handleFieldNum;
}
$query = trim($query);
$query = trim($query,',');
$query = trim($query);
echo "SQL({$handleFieldNum}){$query}\n";
if($handleFieldNum > 0) Db::query($query);
}
echo "\n\n\n";
}
return $tableList;
}
// 数据库处理 - 判断当前表是否具有指定内容
private function isHasSpecifyData($allField,$tableName){
$query = "select * from {$tableName} where (";
foreach($allField as $fieldName){
$query .= "`{$fieldName}` like '%bt.test.cdlfjy.com%' OR ";
}
$query = trim($query);
$query = trim($query,'OR');
$query = trim($query) . ")";
$result = Db::query($query);
if($result) return true;
return false;
}
}