1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269 |
- <?php
- namespace App\Http\Controllers\Admin;
- use App\Filters\BikeFilter;
- use App\Filters\CardRidingOrderFilter;
- use App\Filters\DepositCardOrderFilter;
- use App\Filters\OrderFilter;
- use App\Filters\OrderRentFilter;
- use App\Filters\RechargeOrderFilter;
- use App\Filters\StatisticFilter;
- use App\Filters\UserFilter;
- use App\Filters\WalletLogFilter;
- use App\Filters\WorkOrderFilter;
- use App\Models\AdminMerchant;
- use App\Models\AdminUser;
- use App\Models\AdminUserArea;
- use App\Models\Area;
- use App\Models\Bike;
- use App\Models\CardRidingOrder;
- use App\Models\DepositCardOrder;
- use App\Models\Model;
- use App\Models\Order;
- use App\Models\OrderRent;
- use App\Models\RechargeOrder;
- use App\Models\Statistic;
- use App\Models\User;
- use App\Models\UserPhoneDetail;
- use App\Models\WalletLog;
- use App\Models\WorkOrder;
- use App\Utils\Admin;
- use App\Utils\RedisKeys;
- use Carbon\Carbon;
- use Illuminate\Http\Request;
- use App\Http\Controllers\Controller;
- use App\Models\DepositOrder;
- use App\Models\DepositRefund;
- use Exception;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- /**
- * 后台 - 控制台 - 统计分析
- * Class DataStatisticsController
- * @package App\Http\Controllers\Admin
- */
- class DataStatisticsController extends Controller
- {
- // 验证是否有该区域的权限
- private function validateAreaId($area_id)
- {
- $area_ids = AdminUser::getAreaIdsByAdminId(Admin::user()->id);
- if (count($area_ids) !== 0 && in_array($area_id, $area_ids)) {
- return false;
- } else {
- $id = AdminUserArea::query()->where('admin_id', Admin::user()->id)->value('area_id');
- $id = $id ?? 0;
- if ($area_id == $id) return false;
- }
- return true;
- }
- /**
- * 商户列表
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- */
- public function adminMerchantList()
- {
- $data = [];
- // 管理员可以获取商户列表
- if (Admin::isAdministrator()) {
- // status 状态(1正常0暂停)
- $data = AdminMerchant::where('status', 1)->select(['id', 'username', 'name'])->get()->toArray();
- }
- return $this->ok($data);
- }
- /**
- * 区域列表 - 依据所选商户获取对应区域
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- */
- public function areaList(Request $request)
- {
- $admin_id = Admin::user()->id;
- if (Admin::user()->isRole(Admin::ROLE_JISHU_ADMIN)) {
- $merchant_id = $request->get('merchant_id') ?? 0;
- if ($merchant_id) {
- $data = Area::where('status', 1)->where('merchant_id', $merchant_id)->orderByDesc('id')->select(['id', 'name'])->get()->toArray();
- } else {
- $data = Area::where('status', 1)->orderByDesc('id')->select(['id', 'name'])->get()->toArray();
- }
- } else {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- $data = Area::whereIn('id', $area_ids)->where('status', 1)->orderByDesc('id')->select(['id', 'name'])->get()->toArray();
- }
- return $this->ok($data);
- }
- /**
- * topIndex 头部统计数据
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- *
- */
- public function topIndex(Request $request)
- {
- $area_id = $request->get('area_id') ?? '';
- if ($area_id) {
- $flag = $this->validateAreaId($area_id);
- if ($flag) return $this->error('无权限查看该区域');
- }
- $merchant_id = $request->get('merchant_id') ?? '';
- $data = [];
- $data['new_order'] = $this->newOrder($area_id, $merchant_id); // 新订单
- $data['total_user'] = $this->totalUser($area_id, $merchant_id); // 总用户
- $data['total_order'] = $this->totalOrder($area_id, $merchant_id); // 总订单
- $data['total_profit'] = $this->totalProfitMonth($area_id, $merchant_id); // 总收益 - 统计本月 和 上月的总收益
- $data['cumulative_profit'] = $this->cumulativeDeposit($area_id, $merchant_id); // 统计本月和上月的累计押金
- return $this->ok($data);
- }
- /**
- * topIndex 头部统计数据 - 统计本月和上月的累计押金,注意本月的包含当天的累计押金
- */
- protected function cumulativeDeposit($area_id, $merchant_id)
- {
- $DepositOrder = DepositOrder::query();
- if (!Admin::user()->inRoles([Admin::ROLE_JISHU_ADMIN])) {
- if ($merchant_id) {
- $DepositOrder->where('merchant_id', $merchant_id);
- } else {
- $DepositOrder->where(AdminMerchant::getMerchantWhere());
- }
- }
- if ($area_id) {
- $DepositOrder->where('area_id', $area_id);
- }
- $currentMonth = $DepositOrder->where('is_refund', DepositOrder::REFUND_NO)->where('pay_status', DepositOrder::PAY_STATUS_OK)->whereDate('pay_time', '>=', Carbon::now()->firstOfMonth()->toDateString())->sum('money');
- $data['cumulative_profit_num'] = floatval($currentMonth);
- return $data;
- }
- // topIndex 头部统计数据 - 新订单
- protected function newOrder($area_id = '', $merchant_id = '')
- {
- $totalOrder = [];
- $yesterday = Carbon::yesterday();
- $today = Carbon::today();
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $yesterdayOrderNum = Order::query()->where('merchant_id', $merchant_id);
- $todayOrderNum = Order::query()->where('merchant_id', $merchant_id);
- $yesterdayOrderRentNum = OrderRent::query()->where('merchant_id', $merchant_id);
- $todayOrderRentNum = OrderRent::query()->where('merchant_id', $merchant_id);
- } else {
- $yesterdayOrderNum = Order::query()->where(AdminMerchant::getMerchantWhere());
- $todayOrderNum = Order::query()->where(AdminMerchant::getMerchantWhere());
- $yesterdayOrderRentNum = OrderRent::query()->where(AdminMerchant::getMerchantWhere());
- $todayOrderRentNum = OrderRent::query()->where(AdminMerchant::getMerchantWhere());
- }
- if (!empty($area_id)) {
- $yesterdayOrderNum = $yesterdayOrderNum->where('area_id', $area_id);
- $todayOrderNum = $todayOrderNum->where('area_id', $area_id);
- $yesterdayOrderRentNum = $yesterdayOrderRentNum->where('area_id', $area_id);
- $todayOrderRentNum = $todayOrderRentNum->where('area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $yesterdayOrderNum = $yesterdayOrderNum->whereIn('area_id', $area_ids);
- $todayOrderNum = $todayOrderNum->whereIn('area_id', $area_ids);
- $yesterdayOrderRentNum = $yesterdayOrderRentNum->whereIn('area_id', $area_ids);
- $todayOrderRentNum = $todayOrderRentNum->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $yesterdayOrderNum = $yesterdayOrderNum->where('area_id', $area_id);
- $todayOrderNum = $todayOrderNum->where('area_id', $area_id);
- $yesterdayOrderRentNum = $yesterdayOrderRentNum->where('area_id', $area_id);
- $todayOrderRentNum = $todayOrderRentNum->where('area_id', $area_id);
- }
- }
- }
- // 昨日新订单数
- $yesterdayOrderNum = $yesterdayOrderNum
- ->where('pay_time', '>=', $yesterday)
- ->where('pay_time', '<=', $today)
- ->where('status', Order::STATUS_COMPLETE_ORDER)
- ->count('id');
- $yesterdayOrderRentNum = $yesterdayOrderRentNum
- ->where('pay_time', '>=', $yesterday)
- ->where('pay_time', '<=', $today)
- ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
- ->count('id');
- // 今日新订单数
- $todayOrderNum = $todayOrderNum
- ->where('pay_time', '>=', $today)
- ->where('status', Order::STATUS_COMPLETE_ORDER)
- ->count('id');
- $todayOrderRentNum = $todayOrderRentNum
- ->where('pay_time', '>=', $today)
- ->where('status', OrderRent::STATUS_COMPLETE_ORDER)
- ->count('id');
- $orderDifference = (int)$todayOrderNum - (int)$yesterdayOrderNum;
- $orderRentDifference = (int)$todayOrderRentNum - (int)$yesterdayOrderRentNum;
- $orderDifference += $orderRentDifference;
- $totalOrder['new_num'] = $todayOrderNum + $todayOrderRentNum;
- if ($orderDifference < 0) {
- $totalOrder['diff'] = '1'; // 表示下降
- } elseif ($orderDifference === 0) {
- $totalOrder['diff'] = '2'; // 表示无变化
- } else {
- $totalOrder['diff'] = '3'; // 表示上升
- }
- $totalOrder['difference'] = abs($orderDifference);
- return $totalOrder;
- }
- // topIndex 头部统计数据 - 总用户
- protected function totalUser($area_id = '', $merchant_id = '')
- {
- $totalUser = [];
- $yesterday = Carbon::yesterday();
- $today = Carbon::today();
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $yesterdayNewUser = User::query()->where('merchant_id', $merchant_id);
- $todayNewUser = User::query()->where('merchant_id', $merchant_id);
- $total = User::query()->where('merchant_id', $merchant_id);
- } else {
- $yesterdayNewUser = User::query()->where(AdminMerchant::getMerchantWhere());
- $todayNewUser = User::query()->where(AdminMerchant::getMerchantWhere());
- $total = User::query()->where(AdminMerchant::getMerchantWhere());
- }
- if (!empty($area_id)) {
- $yesterdayNewUser = $yesterdayNewUser->where('register_area_id', $area_id);
- $todayNewUser = $todayNewUser->where('register_area_id', $area_id);
- $total = $total->where('register_area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $yesterdayNewUser = $yesterdayNewUser->whereIn('register_area_id', $area_ids);
- $todayNewUser = $todayNewUser->whereIn('register_area_id', $area_ids);
- $total = $total->whereIn('register_area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $yesterdayNewUser = $yesterdayNewUser->where('register_area_id', $area_id);
- $todayNewUser = $todayNewUser->where('register_area_id', $area_id);
- $total = $total->where('register_area_id', $area_id);
- }
- }
- }
- //昨日新增用户数量
- $yesterdayNewUser = $yesterdayNewUser->where('created_at', '>=', $yesterday)->where('created_at', '<=', $today)->count('id');
- //今日新增用户数量
- $todayNewUser = $todayNewUser->where('created_at', '>=', $today)->count('id');
- //总用户数量
- $totalUser['total_num'] = $total->count('id');
- $userDifference = (int)$todayNewUser - (int)$yesterdayNewUser;
- if ($userDifference < 0) {
- $totalUser['diff'] = '1'; // 表示下降
- } elseif ($userDifference === 0) {
- $totalUser['diff'] = '2'; // 表示无变化
- } else {
- $totalUser['diff'] = '3'; // 表示上升
- }
- $totalUser['difference'] = abs($userDifference);
- return $totalUser;
- }
- // topIndex 头部统计数据 - 总订单
- protected function totalOrder($area_id = '', $merchant_id = '')
- {
- $totalOrder = [];
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $total = Order::query()->where('merchant_id', $merchant_id);
- $totalOrderRent = OrderRent::query()->where('merchant_id', $merchant_id);
- } else {
- $total = Order::query()->where(AdminMerchant::getMerchantWhere());
- $totalOrderRent = OrderRent::query()->where(AdminMerchant::getMerchantWhere());
- }
- if (!empty($area_id)) {
- $total = $total->where('area_id', $area_id);
- $totalOrderRent = $totalOrderRent->where('area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $total = $total->whereIn('area_id', $area_ids);
- $totalOrderRent = $totalOrderRent->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $total = $total->where('area_id', $area_id);
- $totalOrderRent = $totalOrderRent->where('area_id', $area_id);
- }
- }
- }
- // 总订单数
- $total = $total->where('status', Order::STATUS_COMPLETE_ORDER)->count('id');
- $totalOrderRent = $totalOrderRent->where('status', OrderRent::STATUS_COMPLETE_ORDER)->count('id');
- $totalOrder['total_num'] = $total + $totalOrderRent;
- /**
- * 这个统计没有意义,新订单里已经有了,为了保持数据一致性,就默认写上这两个参数,
- * 后期前台可以屏蔽掉 - 同比昨日的显示
- */
- $totalOrder['diff'] = '2';
- $totalOrder['difference'] = 0;
- return $totalOrder;
- }
- /**
- * topIndex 头部统计数据 - 总收益 - 今天收益 = 纯收益 + 骑行卡
- * profitChart 总收益趋势 - 总收益 - 今天收益 = 纯收益 + 骑行卡
- */
- protected function todayProfit($area_id = '', $merchant_id = '', $type = 'top')
- {
- $totalProfit = 0;
- // 管理员,并且选择了商户
- if ($merchant_id) {
- $walletLogProfit = WalletLog::query()->where('merchant_id', $merchant_id);
- $changeProfit = WalletLog::query()->where('merchant_id', $merchant_id);
- $cardRidingOrdersProfit = CardRidingOrder::query()->where('merchant_id', $merchant_id);
- } else {
- if (Admin::isAdministrator()) {
- $walletLogProfit = WalletLog::query();
- $changeProfit = WalletLog::query();
- $cardRidingOrdersProfit = CardRidingOrder::query();
- } else {
- $walletLogProfit = WalletLog::query()->where(AdminMerchant::getMerchantWhere());
- $changeProfit = WalletLog::query()->where(AdminMerchant::getMerchantWhere());
- $cardRidingOrdersProfit = CardRidingOrder::query()->where(AdminMerchant::getMerchantWhere());
- }
- }
- if (!empty($area_id)) {
- $walletLogProfit = $walletLogProfit->where('area_id', $area_id);
- $changeProfit = $changeProfit->where('area_id', $area_id);
- $cardRidingOrdersProfit = $cardRidingOrdersProfit->where('area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $walletLogProfit = $walletLogProfit->whereIn('area_id', $area_ids);
- $changeProfit = $changeProfit->whereIn('area_id', $area_ids);
- $cardRidingOrdersProfit = $cardRidingOrdersProfit->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $walletLogProfit = $walletLogProfit->where('area_id', $area_id);
- $changeProfit = $changeProfit->where('area_id', $area_id);
- $cardRidingOrdersProfit = $cardRidingOrdersProfit->where('area_id', $area_id);
- }
- }
- }
- // $walletLogProfit;
- $walletLogProfit
- // ->whereIn('type', WalletLog::$subType) // 交易类型 - subType 存收益
- ->whereIn('type', WalletLog::$statisticsType)
- ->where('status', WalletLog::STATUS_OK); // 数据状态 - 有效
- $cardRidingOrdersProfit = $cardRidingOrdersProfit
- ->where('pay_type', CardRidingOrder::PAY_TYPE_WECHAT) // 支付方式 - 微信支付
- ->where('pay_status', CardRidingOrder::PAY_STATUS_OK) // 支付状态 - 支付成功
- ->where('status', CardRidingOrder::STATUS_OK); // 订单状态 - 成功
- if ($type == 'top') { // topIndex 头部统计数据
- // 纯收益
- // $walletLogProfitMoney = 0;
- $walletLogProfitMoney = $walletLogProfit
- ->where('created_at', '>=', Carbon::today())
- ->select(['area_id', 'money'])->sum('money');
- // foreach ($walletLogProfitData as $wv) {
- // // 加上充值收益
- // $total_money_all = WalletLog::query()
- // ->where('created_at', '>=', Carbon::today())
- // ->where('type', WalletLog::TYPE_ADD_WECHAT_TO_WALLET)
- // ->where('area_id', $wv['area_id'])
- // ->select(DB::raw('CAST(SUM(money) as DECIMAL(18,2)) as money_all'))->value('money_all');
- // $total_money_all = bcsub(0, $total_money_all, 2);
- // $wv['money'] = bcadd($wv['money'], $total_money_all, 2);
- //
- $change_money = $changeProfit->where('area_id', $area_id)->where('created_at', '>=', Carbon::today())->where('type', WalletLog::TYPE_ADD_WECHAT_TO_WALLET)->sum('money');
- $walletLogProfitMoney = bcadd($walletLogProfitMoney, $change_money, 2);
- // }
- // 骑行卡总收益
- $cardRidingOrdersProfitMoney = 0;
- $cardRidingOrdersProfitData = $cardRidingOrdersProfit
- ->where('pay_time', '>=', Carbon::today())->select('pay_money')->get()->toArray();
- // ->sum('pay_money');
- foreach ($cardRidingOrdersProfitData as $cv) {
- $cardRidingOrdersProfitMoney = bcadd($cardRidingOrdersProfitMoney, $cv['pay_money']);
- }
- $w = $walletLogProfitMoney ? abs($walletLogProfitMoney) : 0;
- $c = $cardRidingOrdersProfitMoney ? abs($cardRidingOrdersProfitMoney) : 0;
- $totalProfit = bcadd($w, $c, 2);
- return $totalProfit;
- } else { // profitChart 总收益趋势
- $data = [];
- // 口袋钱包纯收益
- $da = $this->buildDate($walletLogProfit, 'created_at', 'money');
- $da3 = $this->buildDate($cardRidingOrdersProfit);
- $data = [];
- foreach ($da as $k => $v) {
- foreach ($da3 as $k3 => $v3) {
- if ($k == $k3) {
- $m = bcadd($v, $v3, 2);
- $data[$k] = $m;
- }
- }
- if (!isset($data[$k])) {
- $data[$k] = $v['value'];
- }
- }
- return $data;
- }
- }
- /**
- * topIndex 头部统计数据
- * 总收益 - 统计本月 和 上月的总收益 总收益 + 骑行卡
- * 本月总收益包含当天收益(纯收益+骑行卡收益)
- */
- protected function totalProfitMonth($area_id = 0, $merchant_id = 0)
- {
- $WalletLog = WalletLog::query();
- if (!Admin::user()->inRoles([Admin::ROLE_JISHU_ADMIN])) {
- if ($merchant_id) {
- $WalletLog->where('merchant_id', $merchant_id);
- } else {
- $WalletLog->where(AdminMerchant::getMerchantWhere());
- }
- }
- if ($area_id) {
- $WalletLog->where('area_id', $area_id);
- }
- $money = $WalletLog->whereDate('created_at', '>=', Carbon::now()->firstOfMonth()->toDateString())->whereIn('type', WalletLog::$subType)->sum('money');
- $totalProfit['total_num'] = abs($money);
- return $totalProfit;
- }
- /**
- * todoEvent 待办事项 统计数据
- *
- * @param Request $request
- * @param BikeFilter $bikeFilter
- * @param OrderFilter $orderFilter
- * @param OrderRentFilter $orderRentFilter
- * @param WorkOrderFilter $workOrderFilter
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- *
- */
- public function todoEvent(Request $request, BikeFilter $bikeFilter, OrderFilter $orderFilter, OrderRentFilter $orderRentFilter, WorkOrderFilter $workOrderFilter)
- {
- $area_id = $request->get('area_id') ?? '';
- if ($area_id) {
- $flag = $this->validateAreaId($area_id);
- if ($flag) return $this->error('无权限查看该区域');
- }
- $merchant_id = $request->get('merchant_id') ?? '';
- $data = [];
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $data['low_battery_num'] = Bike::query()->where('merchant_id', $merchant_id)->filter($bikeFilter);
- $data['current_cycling_num'] = Order::query()->where('merchant_id', $merchant_id)->filter($orderFilter);
- $current_cycling_num_order_rent = OrderRent::query()->where('merchant_id', $merchant_id)->filter($orderRentFilter);
- $data['long_time_no_return_ridding'] = Order::query()->where('merchant_id', $merchant_id)->filter($orderFilter);
- $long_time_no_return_ridding_order_rent = OrderRent::query()->where('merchant_id', $merchant_id)->filter($orderRentFilter);
- $data['trouble_num'] = Bike::query()->where('merchant_id', $merchant_id)->filter($bikeFilter);
- $data['warning_num'] = WorkOrder::query()->where('merchant_id', $merchant_id)->where('type', WorkOrder::TYPE_ALERT)->filter($workOrderFilter);
- } else {
- $data['low_battery_num'] = Bike::query()->where(AdminMerchant::getMerchantWhere())->filter($bikeFilter);
- $data['current_cycling_num'] = Order::query()->where(AdminMerchant::getMerchantWhere())->filter($orderFilter);
- $current_cycling_num_order_rent = OrderRent::query()->where(AdminMerchant::getMerchantWhere())->filter($orderRentFilter);
- $data['long_time_no_return_ridding'] = Order::query()->where(AdminMerchant::getMerchantWhere())->filter($orderFilter);
- $long_time_no_return_ridding_order_rent = OrderRent::query()->where(AdminMerchant::getMerchantWhere())->filter($orderRentFilter);
- $data['trouble_num'] = Bike::query()->where(AdminMerchant::getMerchantWhere())->filter($bikeFilter);
- $data['warning_num'] = WorkOrder::query()->where(AdminMerchant::getMerchantWhere())->where('type', WorkOrder::TYPE_ALERT)->filter($workOrderFilter);
- }
- if (!empty($area_id)) {
- $data['low_battery_num'] = $data['low_battery_num']->where('put_area_id', $area_id);
- $data['current_cycling_num'] = $data['current_cycling_num']->where('area_id', $area_id);
- $current_cycling_num_order_rent = $current_cycling_num_order_rent->where('area_id', $area_id);
- $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']->where('area_id', $area_id);
- $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent->where('area_id', $area_id);
- $data['trouble_num'] = $data['trouble_num']->where('put_area_id', $area_id);
- $data['warning_num'] = $data['warning_num']->where('area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $data['low_battery_num'] = $data['low_battery_num']->whereIn('put_area_id', $area_ids);
- $data['current_cycling_num'] = $data['current_cycling_num']->whereIn('area_id', $area_ids);
- $current_cycling_num_order_rent = $current_cycling_num_order_rent->whereIn('area_id', $area_ids);
- $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']->whereIn('area_id', $area_ids);
- $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent->whereIn('area_id', $area_ids);
- $data['trouble_num'] = $data['trouble_num']->whereIn('put_area_id', $area_ids);
- $data['warning_num'] = $data['warning_num']->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $data['low_battery_num'] = $data['low_battery_num']->where('put_area_id', $area_id);
- $data['current_cycling_num'] = $data['current_cycling_num']->where('area_id', $area_id);
- $current_cycling_num_order_rent = $current_cycling_num_order_rent->where('area_id', $area_id);
- $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']->where('area_id', $area_id);
- $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent->where('area_id', $area_id);
- $data['trouble_num'] = $data['trouble_num']->where('put_area_id', $area_id);
- $data['warning_num'] = $data['warning_num']->where('area_id', $area_id);
- }
- }
- }
- // 低电量车辆
- $data['low_battery_num'] = $data['low_battery_num']
- ->where('is_low_battery_power', Bike::BATTERY_POWER_LOW) // 低电量
- ->where('put_status', Bike::PUT_STATUS_YES) // 投放成功
- ->count('id');
- // 当前骑行车辆
- $data['current_cycling_num'] = $data['current_cycling_num']
- ->whereIn('status', [Order::STATUS_PAUSE_BIKE, Order::STATUS_RIDE_BIKE]) // 临时停车中 和 骑行中
- ->count('id');
- $current_cycling_num_order_rent = $current_cycling_num_order_rent
- ->where('status', OrderRent::STATUS_RENT_BIKE) // 租车中
- ->count('id');
- $data['current_cycling_num'] += $current_cycling_num_order_rent;
- // 24小时未还车 此处查询订单
- $data['long_time_no_return_ridding'] = $data['long_time_no_return_ridding']
- ->where(function ($q) {
- $q->where('status', Order::STATUS_PAUSE_BIKE)
- ->orWhere('status', Order::STATUS_RIDE_BIKE);
- })
- ->where('start_use_bike_time', '<=', date('Y-m-d H:i:s', strtotime('-1 days', time())))
- ->count('id');
- $long_time_no_return_ridding_order_rent = $long_time_no_return_ridding_order_rent
- ->where(function ($q) {
- $q->where('status', OrderRent::STATUS_RENT_BIKE);
- })
- ->where('start_use_bike_time', '<=', date('Y-m-d H:i:s', strtotime('-1 days', time())))
- ->count('id');
- $data['long_time_no_return_ridding'] += $long_time_no_return_ridding_order_rent;
- //故障车辆
- $data['trouble_num'] = $data['trouble_num']
- ->where('is_trouble', Bike::TROUBLE_YES) // 有故障
- ->count('id');
- // 报警信息
- $data['warning_num'] = $data['warning_num']
- ->where('status', WorkOrder::STATUS_NO) // 未确认
- ->count('id');
- return $this->ok($data);
- }
- /**
- * profitChart 总收益趋势
- *
- * @param Request $request
- * @param OrderFilter $orderFilter
- * @param RechargeOrderFilter $rechargeOrderFilter
- * @param CardRidingOrderFilter $cardRidingOrderFilter
- * @param DepositCardOrderFilter $depositCardOrderFilter
- * @param StatisticFilter $statisticFilter
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- *
- */
- public function profitChart(Request $request, OrderFilter $orderFilter, RechargeOrderFilter $rechargeOrderFilter, CardRidingOrderFilter $cardRidingOrderFilter, DepositCardOrderFilter $depositCardOrderFilter, StatisticFilter $statisticFilter)
- {
- $area_id = $request->get('area_id') ?? '';
- if ($area_id) {
- $flag = $this->validateAreaId($area_id);
- if ($flag) return $this->error('无权限查看该区域');
- }
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- if (!in_array($days, ['today', 'threeDays', 'sevenDays', 'fifteenDays', 'thirtyDays'])) return $this->error('参数错误');
- $merchant_id = $request->get('merchant_id') ?? '';
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $ordersChart = $this->profitPolygonalChart($request, $orderFilter, Order::query()->where('merchant_id', $merchant_id));
- $ordersDispatchMoneyChart = $this->profitPolygonalChart($request, $orderFilter, Order::query()->where('merchant_id', $merchant_id), 'dispatch_money');
- $rechargeOrdersChart = $this->profitPolygonalChart($request, $rechargeOrderFilter, RechargeOrder::query()->where('merchant_id', $merchant_id));
- $cardRidingOrdersChart = $this->profitPolygonalChart($request, $cardRidingOrderFilter, CardRidingOrder::query()->where('merchant_id', $merchant_id));
- $depositCardOrdersChart = $this->profitPolygonalChart($request, $depositCardOrderFilter, DepositCardOrder::query()->where('merchant_id', $merchant_id));
- $depositChart = $this->depositChart($request);
- } else {
- $ordersChart = $this->profitPolygonalChart($request, $orderFilter, Order::query()->where(AdminMerchant::getMerchantWhere()));
- $ordersDispatchMoneyChart = $this->profitPolygonalChart($request, $orderFilter, Order::query()->where(AdminMerchant::getMerchantWhere()), 'dispatch_money');
- $rechargeOrdersChart = $this->profitPolygonalChart($request, $rechargeOrderFilter, RechargeOrder::query()->where(AdminMerchant::getMerchantWhere()));
- $cardRidingOrdersChart = $this->profitPolygonalChart($request, $cardRidingOrderFilter, CardRidingOrder::query()->where(AdminMerchant::getMerchantWhere()));
- $depositCardOrdersChart = $this->profitPolygonalChart($request, $depositCardOrderFilter, DepositCardOrder::query()->where(AdminMerchant::getMerchantWhere()));
- $depositChart = $this->depositChart($request);
- }
- // 总收益 - 避免重复统计,这里计算只统计 口袋钱包纯收益
- $total = $this->totalProfitChart($request);
- $bikeDailyAverageChart = $this->bikeDailyAverage($request, $statisticFilter);
- return $this->ok([
- [
- 'name' => '普通订单收益',
- 'data' => $ordersChart
- ],
- [
- 'name' => '普通订单调度费收益',
- 'data' => $ordersDispatchMoneyChart
- ],
- [
- 'name' => '充值收益',
- 'data' => $rechargeOrdersChart
- ],
- [
- 'name' => '骑行卡收益',
- 'data' => $cardRidingOrdersChart
- ],
- [
- 'name' => '免押金卡收益',
- 'data' => $depositCardOrdersChart
- ],
- [
- 'name' => '总收益',
- 'data' => $total
- ],
- [
- 'name' => '日均车收益',
- 'data' => $bikeDailyAverageChart
- ],
- [
- 'name' => '押金收益',
- 'data' => $depositChart
- ]
- ]);
- }
- // profitChart 总收益趋势 - 押金收益(净押金) - 今天的押金收益(净收益) = 总押金 - 退回押金
- private function todayDeposit($area_id, $merchant_id, $type = '')
- {
- $DepositOrder = DepositOrder::query();
- if (!Admin::user()->inRoles([Admin::ROLE_JISHU_ADMIN])) {
- if ($merchant_id) {
- $DepositOrder->where('merchant_id', $merchant_id);
- } else {
- $DepositOrder->where(AdminMerchant::getMerchantWhere());
- }
- }
- if ($area_id) {
- $DepositOrder->where('area_id', $area_id);
- }
- $currentDayMoney = $DepositOrder->where('is_refund', DepositOrder::REFUND_NO)->where('pay_status', DepositOrder::PAY_STATUS_OK)->whereDate('pay_time', '>=', Carbon::now()->toDateString())->sum('money');
- $total = $currentDayMoney;
- $data[Carbon::now()->toDateString()] = $total;
- return ($type == 'total') ? $total : $data;
- }
- /**
- * profitChart 总收益趋势 - 押金收益(净押金)
- * 押金统计查询统计表,注意今天的押金统计是每小时统计的,直接查询数据表
- * 押金统计,筛选条件大于今天的时候,把今天的也包含进去
- */
- public function depositChart($request)
- {
- $days = $request->get('days') ?? '';
- $area_id = $request->get('area_id') ?? '';
- $merchant_id = $request->get('merchant_id') ?? '';
- // 管理员,并且选择了商户
- if (Admin::isAdministrator()) {
- if ($merchant_id) {
- $newOrders = Statistic::query()->where('merchant_id', $merchant_id)->where('slug', Statistic::SLUG_DEPOSIT_STATIC);
- } else {
- $newOrders = Statistic::query()->where('slug', Statistic::SLUG_DEPOSIT_STATIC);
- }
- } else {
- $newOrders = Statistic::query()->where(AdminMerchant::getMerchantWhere())->where('slug', Statistic::SLUG_DEPOSIT_STATIC);
- }
- if (!empty($area_id)) {
- $newOrders = $newOrders->where('area_id', $area_id);
- } else {
- // 平台的是 9999 商户的是 0
- if (Admin::isAdministrator()) {
- $newOrders = $newOrders->where('area_id', config('statistic.all'));
- } else {
- $newOrders = $newOrders->where('area_id', 0);
- }
- }
- switch ($days) {
- case 'today':
- // 因为今天的是统计每个小时的押金数据,直接查询押金表即可
- $newOrdersKeyVal = $this->todayDeposit($area_id, $merchant_id);
- // 为0得数组
- $i = Carbon::now()->format('H');
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subHours($i)->format('m-d H:00');
- $arr[$str] = 0;
- }
- //合并
- $merge = array_merge($arr, $newOrdersKeyVal);
- $data = [];
- foreach ($merge as $key => $value) {
- $data[] = ['date' => $key, 'value' => bcadd($value, 0, 2)];
- }
- break;
- case 'threeDays':
- $i = 2;
- break;
- case 'sevenDays':
- $i = 6;
- break;
- case 'fifteenDays':
- $i = 14;
- break;
- case 'thirtyDays':
- $i = 29;
- break;
- default:
- return $this->error('参数错误');
- }
- if ($days !== 'today') {
- $paramDays = Carbon::today()->subDays($i)->format('Y-m-d');
- // 赋值一个值为0得数组
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->where('date', '>=', $paramDays)
- ->selectRaw("DATE_FORMAT(date,'%Y/%m/%d') as date,body")
- ->get()->toArray();
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $body = json_decode($v['body'], true);
- $money_all = isset($body['money_all']) ? $body['money_all'] : 0;
- $money_refund_all = isset($body['money_refund_all']) ? $body['money_refund_all'] : 0;
- $val = bcsub($money_all, $money_refund_all, 2);
- if (isset($newOrdersKeyVal[$v['date']])) {
- $newOrdersKeyVal[$v['date']] = bcadd($newOrdersKeyVal[$v['date']], $val, 2);
- } else {
- $newOrdersKeyVal[$v['date']] = $val;
- }
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr, $newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks => $vs) {
- $data[] = ['date' => $ks, 'value' => bcadd($vs, 0, 2)];
- }
- // 包含今天的统计
- $total = $this->todayDeposit($area_id, $merchant_id, 'total');
- $data[sizeof($data) - 1]['value'] = bcadd($total, 0, 2);
- }
- return $data;
- }
- // profitChart 总收益趋势- [普通订单收益,普通订单调度费收益,充值收益,骑行卡收益,免押金卡收益] 统计数据
- public function profitPolygonalChart($request, $filter, $model, $money = 'pay_money')
- {
- $area_id = $request->get('area_id') ?? '';
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- $newOrders = $model->filter($filter)->where('pay_status', 1); // 支付状态 1 已支付
- if (!empty($area_id)) {
- $newOrders = $newOrders->where('area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $newOrders = $newOrders->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $newOrders = $newOrders->where('area_id', $area_id);
- }
- }
- }
- // 去掉余额支付
- $newOrders = $newOrders->where('pay_type', 1);
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $newOrders = $newOrders->where('pay_time', '>=', $today)
- // ->selectRaw("DATE_FORMAT(pay_time,'%m-%d %H:00') as date,sum($money) as value")
- ->selectRaw("DATE_FORMAT(pay_time,'%m-%d %H:00') as date,CAST(SUM($money) as DECIMAL(18,2)) as value")
- ->groupBy('date')->get()->toArray();
- // 有数据得数组
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 为0得数组
- $i = Carbon::now()->format('H');
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subHours($i)->format('m-d H:00');
- $arr[$str] = 0;
- }
- //合并
- $merge = array_merge($arr, $newOrdersKeyVal);
- $data = [];
- foreach ($merge as $key => $value) {
- $data[] = ['date' => $key, 'value' => $value];
- }
- break;
- case 'threeDays':
- $i = 2;
- break;
- case 'sevenDays':
- $i = 6;
- break;
- case 'fifteenDays':
- $i = 14;
- break;
- case 'thirtyDays':
- $i = 29;
- break;
- default:
- return $this->error('参数错误');
- }
- if ($days !== 'today') {
- $paramDays = Carbon::today()->subDays($i);
- // 赋值一个值为0得数组
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->where('pay_time', '>=', $paramDays)
- ->selectRaw("DATE_FORMAT(pay_time,'%Y/%m/%d') as date,CAST(SUM($money) as DECIMAL(18,2)) as value")
- ->groupBy('date')->get()->toArray();
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr, $newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks => $vs) {
- $data[] = ['date' => $ks, 'value' => $vs];
- }
- }
- return $data;
- }
- /**
- * profitChart 总收益趋势
- * 总收益统计查询统计表,注意今天的押金统计是每小时统计的,直接查询数据表
- * 总收益统计,筛选条件大于今天的时候,把今天的也包含进去
- */
- protected function totalProfitChart($request)
- {
- $area_id = $request->get('area_id') ?? '';
- $days = $request->get('days') ?? '';
- $merchant_id = $request->get('merchant_id') ?? '';
- // 管理员,并且选择了商户
- if (Admin::isAdministrator()) {
- if ($merchant_id) {
- $newOrders = Statistic::query()->where('merchant_id', $merchant_id)->where('slug', Statistic::SLUG_PROFIT_STATIC);
- } else {
- $newOrders = Statistic::query()->where('slug', Statistic::SLUG_PROFIT_STATIC);
- }
- } else {
- $newOrders = Statistic::query()->where(AdminMerchant::getMerchantWhere())->where('slug', Statistic::SLUG_PROFIT_STATIC);
- }
- if (!empty($area_id)) {
- $newOrders = $newOrders->where('area_id', $area_id);
- } else {
- // 平台的是 9999 商户的是 0
- if (Admin::isAdministrator()) {
- $newOrders = $newOrders->where('area_id', config('statistic.all'));
- } else {
- $newOrders = $newOrders->where('area_id', 0);
- }
- }
- switch ($days) {
- case 'today':
- // 因为今天的是统计每个小时的总数据,直接查询数据表即可
- $newOrdersKeyVal = $this->todayProfit($area_id, $merchant_id, 'all');
- // 为0得数组
- $i = Carbon::now()->format('H');
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subHours($i)->format('m-d H:00');
- $arr[$str] = 0;
- }
- //合并
- $merge = array_merge($arr, $newOrdersKeyVal);
- $data = [];
- foreach ($merge as $key => $value) {
- $data[] = ['date' => $key, 'value' => bcadd($value, 0, 2)];
- }
- break;
- case 'threeDays':
- $i = 2;
- break;
- case 'sevenDays':
- $i = 6;
- break;
- case 'fifteenDays':
- $i = 14;
- break;
- case 'thirtyDays':
- $i = 29;
- break;
- default:
- return $this->error('参数错误');
- }
- if ($days !== 'today') {
- $paramDays = Carbon::today()->subDays($i)->toDateString();
- // 赋值一个值为0得数组
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->whereDate('date', '>=', $paramDays)->get()->toArray();
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $body = json_decode($v['body'], true);
- $profit = isset($body['profit']) ? $body['profit'] : 0;
- $card_profit = isset($body['card_profit']) ? $body['card_profit'] : 0;
- $val = bcadd($profit, $card_profit, 2);
- $day = Carbon::parse($v['date'])->format("Y/m/d");
- if (isset($newOrdersKeyVal[$v['date']])) {
- $arr[$day] = bcadd($newOrdersKeyVal[$v['date']], $val, 2);
- // $newOrdersKeyVal[$v['date']] = bcadd($newOrdersKeyVal[$v['date']], $val, 2);
- } else {
- $arr[$day] = $val;
- // $newOrdersKeyVal[$v['date']] = $val;
- }
- }
- }
- // dd($arr);
- // 合并覆盖0
- // $merge = array_merge($arr, $newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($arr as $ks => $vs) {
- $data[] = ['date' => $ks, 'value' => bcadd($vs, 0, 2)];
- }
- // 包含今天的统计
- $total = $this->todayProfit($area_id, $merchant_id, 'top');
- $data[sizeof($data) - 1]['value'] = bcadd($total, 0, 2);
- }
- return $data;
- }
- // profitChart 总收益趋势 以特定的格式统计数据
- private function buildDate($newOrders, $time = 'pay_time', $money = 'pay_money')
- {
- $newOrdersTotal = $newOrders;
- $today = Carbon::today();
- $newOrders = $newOrders->where($time, '>=', $today)
- ->selectRaw("DATE_FORMAT($time,'%m-%d %H:00') as date,CAST(SUM($money) as DECIMAL(18,2)) as value")
- ->groupBy('date')->get()->toArray();
- // 有数据得数组
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- if ($time == 'created_at' && $money == 'pay_money') {
- // 加上充值收益
- $total_money_all = $newOrdersTotal
- ->where('created_at', '>=', $today)
- ->where('type', WalletLog::TYPE_ADD_WECHAT_TO_WALLET)
- ->select(DB::raw('CAST(SUM(money) as DECIMAL(18,2)) as money_all'))->value('money_all');
- $total_money_all = bcsub(0, $total_money_all, 2);
- $v['value'] = bcadd($v['value'], $total_money_all, 2);
- }
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 为0得数组
- $i = Carbon::now()->format('H');
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subHours($i)->format('m-d H:00');
- $arr[$str] = 0;
- }
- //合并
- $merge = array_merge($arr, $newOrdersKeyVal);
- return $merge;
- }
- // profitChart 总收益趋势 日均车收益
- private function bikeDailyAverage($request, $statisticFilter)
- {
- $area_id = $request->get('area_id') ?? '';
- $days = $request->get('days') ?? '';
- $merchant_id = $request->get('merchant_id') ?? '';
- // 管理员,并且选择了商户
- if (Admin::isAdministrator()) {
- if ($merchant_id) {
- $newOrders = Statistic::query()->where('merchant_id', $merchant_id)->filter($statisticFilter);
- } else {
- $newOrders = Statistic::query()->where('merchant_id', 0)->filter($statisticFilter);
- }
- } else {
- $newOrders = Statistic::query()->where(AdminMerchant::getMerchantWhere())->filter($statisticFilter);
- }
- if (!empty($area_id)) {
- $newOrders = $newOrders->where('area_id', $area_id);
- } else {
- // 平台的是 9999 商户的是 0
- if (Admin::isAdministrator()) {
- $newOrders = $newOrders->where('area_id', config('statistic.all'));
- } else {
- $newOrders = $newOrders->where('area_id', 0);
- }
- }
- switch ($days) {
- case 'today':
- return [];
- break;
- case 'threeDays':
- $i = 2;
- break;
- case 'sevenDays':
- $i = 6;
- break;
- case 'fifteenDays':
- $i = 14;
- break;
- case 'thirtyDays':
- $i = 29;
- break;
- default:
- return $this->error('参数错误');
- }
- if ($days !== 'today') {
- $paramDays = Carbon::today()->subDays($i);
- // 赋值一个值为0得数组
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->where('date', '>=', $paramDays)
- ->where('slug', Statistic::SLUG_PROFIT_STATIC)
- ->select(['date', 'body'])
- ->orderByDesc('date')
- ->get()
- ->toArray();
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $profit_statistics_arr = object_array(json_decode($v['body'], true));
- $profit_arr_statistics['profit'] = $profit_statistics_arr['profit'] ?? 0;
- $profit_arr_statistics['put_bikes'] = $profit_statistics_arr['put_bikes'] ?? 0;
- if ($profit_arr_statistics['put_bikes'] == 0) {
- $newOrdersKeyVal[Carbon::parse($v['date'])->format('Y/m/d')] = 0;
- } else {
- // $newOrdersKeyVal[Carbon::parse($v['date'])->format('Y/m/d')] = number_format($profit_arr_statistics['profit'] / $profit_arr_statistics['put_bikes'], 2);
- $newOrdersKeyVal[Carbon::parse($v['date'])->format('Y/m/d')] = bcdiv($profit_arr_statistics['profit'], $profit_arr_statistics['put_bikes'], 2);
- }
- }
- }
- // 合并覆盖
- $merge = array_merge($arr, $newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks => $vs) {
- $data[] = ['date' => $ks, 'value' => $vs];
- }
- }
- return $data;
- }
- /**
- * newUsersChart 新用户增长趋势
- * @param Request $request
- * @param UserFilter $userFilter
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- */
- public function newUsersChart(Request $request, UserFilter $userFilter)
- {
- $area_id = $request->get('area_id') ?? '';
- if ($area_id) {
- $flag = $this->validateAreaId($area_id);
- if ($flag) return $this->error('无权限查看该区域');
- }
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- if (!in_array($days, ['today', 'threeDays', 'sevenDays', 'fifteenDays', 'thirtyDays'])) return $this->error('参数错误');
- $usersChart = $this->usersChart($request, $userFilter);
- $usersChartDepositCard = $this->usersChart($request, $userFilter, true, User::DEPOSIT_CARD); // 免押金卡
- $usersChartDepositMoney = $this->usersChart($request, $userFilter, true, User::DEPOSIT_MONEY); // 缴纳押金
- return $this->ok([
- ['name' => '每日增长用户数', 'data' => $usersChart],
- ['name' => '每日增长用户(押金卡)', 'data' => $usersChartDepositCard],
- ['name' => '每日增长用户(缴纳押金)', 'data' => $usersChartDepositMoney]
- ]);
- }
- // 新用户增长趋势 统计数据
- public function usersChart($request, $userFilter, $deposit = false, $deposit_type = User::DEPOSIT_MONEY)
- {
- $area_id = $request->get('area_id') ?? '';
- $days = $request->get('days') ?? '';
- $merchant_id = $request->get('merchant_id') ?? '';
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $newUsers = User::query()
- ->where('merchant_id', $merchant_id)
- ->filter($userFilter)
- ->where('is_bind_mobile', User::BIND_MOBILE_OK); // 认证状态 - 已实名认证
- } else {
- $newUsers = User::query()
- ->where(AdminMerchant::getMerchantWhere())
- ->filter($userFilter)
- ->where('is_bind_mobile', User::BIND_MOBILE_OK); // 认证状态 - 已实名认证
- }
- if ($deposit) {
- $newUsers = $newUsers->where('deposit_type', $deposit_type);// 免押金卡 或 缴纳押金
- }
- if ($area_id) {
- $newUsers = $newUsers->where('register_area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $newUsers = $newUsers->whereIn('register_area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $newUsers = $newUsers->where('register_area_id', $area_id);
- }
- }
- }
- $newOrders = $newUsers;
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $newOrders = $newOrders->where('created_at', '>=', $today)
- ->selectRaw('DATE_FORMAT(created_at,"%m-%d %H:00") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- // 有数据得数组
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 为0得数组
- $i = Carbon::now()->format('H');
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subHours($i)->format('m-d H:00');
- $arr[$str] = 0;
- }
- //合并
- $merge = array_merge($arr, $newOrdersKeyVal);
- $data = [];
- foreach ($merge as $key => $value) {
- $data[] = ['date' => $key, 'value' => $value];
- }
- break;
- case 'threeDays':
- $i = 2;
- break;
- case 'sevenDays':
- $i = 6;
- break;
- case 'fifteenDays':
- $i = 14;
- break;
- case 'thirtyDays':
- $i = 29;
- break;
- default:
- return $this->error('参数错误');
- }
- if ($days !== 'today') {
- $paramDays = Carbon::today()->subDays($i);
- // 赋值一个值为0得数组
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->where('created_at', '>=', $paramDays)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr, $newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks => $vs) {
- $data[] = ['date' => $ks, 'value' => $vs];
- }
- }
- return $data;
- }
- /**
- * newOrderChart 新订单趋势 - 普通订单
- * @param Request $request
- * @param OrderFilter $orderFilter
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- */
- public function newOrderChart(Request $request, OrderFilter $orderFilter)
- {
- $area_id = $request->get('area_id') ?? '';
- if ($area_id) {
- $flag = $this->validateAreaId($area_id);
- if ($flag) return $this->error('无权限查看该区域');
- }
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- if (!in_array($days, ['today', 'threeDays', 'sevenDays', 'fifteenDays', 'thirtyDays'])) return $this->error('参数错误');
- $newOrderChart = $this->orderChart($request, $orderFilter);
- $dispatchMoneyNewOrderChart = $this->orderChart($request, $orderFilter, true);
- return $this->ok([
- ['name' => '总订单数', 'data' => $newOrderChart],
- ['name' => '有调度费的订单数', 'data' => $dispatchMoneyNewOrderChart]
- ]);
- }
- // 新订单趋势 统计数据 - 普通订单
- public function orderChart($request, $orderFilter, $dispatch_money = false)
- {
- $area_id = $request->get('area_id') ?? '';
- $days = $request->get('days') ?? '';
- $merchant_id = $request->get('merchant_id') ?? '';
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $newOrders = Order::query()
- ->where('merchant_id', $merchant_id)
- ->filter($orderFilter)
- ->where('status', Order::STATUS_COMPLETE_ORDER); // 订单完成
- } else {
- $newOrders = Order::query()
- ->where(AdminMerchant::getMerchantWhere())
- ->filter($orderFilter)
- ->where('status', Order::STATUS_COMPLETE_ORDER); // 订单完成
- }
- if ($dispatch_money) {
- $newOrders = $newOrders->where('dispatch_money', '>', 0); // 有调度费
- }
- if ($area_id) {
- $newOrders = $newOrders->where('area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $newOrders = $newOrders->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $newOrders = $newOrders->where('area_id', $area_id);
- }
- }
- }
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $newOrders = $newOrders->where('created_at', '>=', $today)
- ->selectRaw('DATE_FORMAT(created_at,"%m-%d %H:00") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- // 有数据得数组
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 为0得数组
- $i = Carbon::now()->format('H');
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subHours($i)->format('m-d H:00');
- $arr[$str] = 0;
- }
- //合并
- $merge = array_merge($arr, $newOrdersKeyVal);
- $data = [];
- foreach ($merge as $key => $value) {
- $data[] = ['date' => $key, 'value' => $value];
- }
- break;
- case 'threeDays':
- $i = 2;
- break;
- case 'sevenDays':
- $i = 6;
- break;
- case 'fifteenDays':
- $i = 14;
- break;
- case 'thirtyDays':
- $i = 29;
- break;
- default:
- return [];
- }
- if ($days !== 'today') {
- $paramDays = Carbon::today()->subDays($i);
- // 赋值一个值为0得数组
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->where('created_at', '>=', $paramDays)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr, $newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks => $vs) {
- $data[] = ['date' => $ks, 'value' => $vs];
- }
- }
- return $data;
- }
- /**
- * newOrderChart 新订单趋势 - 日租订单
- * @param Request $request
- * @param OrderRentFilter $orderRentFilter
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- */
- public function newDayRentOrderChart(Request $request, OrderRentFilter $orderRentFilter)
- {
- $area_id = $request->get('area_id') ?? '';
- if ($area_id) {
- $flag = $this->validateAreaId($area_id);
- if ($flag) return $this->error('无权限查看该区域');
- }
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- if (!in_array($days, ['today', 'threeDays', 'sevenDays', 'fifteenDays', 'thirtyDays'])) return $this->error('参数错误');
- $newOrderChart = $this->dayRentOrderChart($request, $orderRentFilter);
- $dispatchMoneyNewOrderChart = $this->dayRentOrderChart($request, $orderRentFilter, true);
- return $this->ok([
- ['name' => '新增日租订单', 'data' => $newOrderChart],
- ['name' => '新增日租订单(调度费大于0)', 'data' => $dispatchMoneyNewOrderChart]
- ]);
- }
- // 新订单趋势 统计数据 - 日租订单
- public function dayRentOrderChart($request, $orderRentFilter, $dispatch_money = false)
- {
- $area_id = $request->get('area_id') ?? '';
- $days = $request->get('days') ?? '';
- $merchant_id = $request->get('merchant_id') ?? '';
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $newOrders = OrderRent::query()
- ->where('merchant_id', $merchant_id)
- ->filter($orderRentFilter)
- ->where('status', OrderRent::STATUS_COMPLETE_ORDER); // 已完成
- } else {
- $newOrders = OrderRent::query()
- ->where(AdminMerchant::getMerchantWhere())
- ->filter($orderRentFilter)
- ->where('status', OrderRent::STATUS_COMPLETE_ORDER); // 已完成
- }
- if ($dispatch_money) {
- $newOrders = $newOrders->where('dispatch_money', '>', 0); // 有调度费
- }
- if ($area_id) {
- $newOrders = $newOrders->where('area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $newOrders = $newOrders->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $newOrders = $newOrders->where('area_id', $area_id);
- }
- }
- }
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $newOrders = $newOrders->where('created_at', '>=', $today)
- ->selectRaw('DATE_FORMAT(created_at,"%m-%d %H:00") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- // 有数据得数组
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 为0得数组
- $i = Carbon::now()->format('H');
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subHours($i)->format('m-d H:00');
- $arr[$str] = 0;
- }
- //合并
- $merge = array_merge($arr, $newOrdersKeyVal);
- $data = [];
- foreach ($merge as $key => $value) {
- $data[] = ['date' => $key, 'value' => $value];
- }
- break;
- case 'threeDays':
- $i = 2;
- break;
- case 'sevenDays':
- $i = 6;
- break;
- case 'fifteenDays':
- $i = 14;
- break;
- case 'thirtyDays':
- $i = 29;
- break;
- default:
- return [];
- }
- if ($days !== 'today') {
- $paramDays = Carbon::today()->subDays($i);
- // 赋值一个值为0得数组
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->where('created_at', '>=', $paramDays)
- ->selectRaw('DATE_FORMAT(created_at,"%Y/%m/%d") as date,count(id) as value')
- ->groupBy('date')->get()->toArray();
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr, $newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks => $vs) {
- $data[] = ['date' => $ks, 'value' => $vs];
- }
- }
- return $data;
- }
- /**
- * riddingRanking 骑行排行榜 - 普通订单
- * @param Request $request
- * @param OrderFilter $orderFilter
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- */
- public function riddingRanking(Request $request, OrderFilter $orderFilter)
- {
- $area_id = $request->get('area_id') ?? '';
- if ($area_id) {
- $flag = $this->validateAreaId($area_id);
- if ($flag) return $this->error('无权限查看该区域');
- }
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- if (!in_array($days, ['today', 'sevenDays', 'oneMonth', 'sixMonth'])) return $this->error('参数错误');
- $merchant_id = $request->get('merchant_id') ?? '';
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $order = Order::query()
- ->where('merchant_id', $merchant_id)
- ->filter($orderFilter)
- ->where('status', Order::STATUS_COMPLETE_ORDER) // 订单完成
- ->with(['users']);
- } else {
- $order = Order::query()
- ->where(AdminMerchant::getMerchantWhere())
- ->filter($orderFilter)
- ->where('status', Order::STATUS_COMPLETE_ORDER) // 订单完成
- ->with(['users']);
- }
- if ($area_id) {
- $order = $order->where('area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $order = $order->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $order = $order->where('area_id', $area_id);
- }
- }
- }
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $order = $order->where('created_at', '>=', $today);
- break;
- case 'sevenDays':
- $time = Carbon::today()->subDays(7);
- $order = $order->where('created_at', '>=', $time);
- break;
- case 'oneMonth':
- $time = Carbon::today()->subMonth();
- $order = $order->where('created_at', '>=', $time);
- break;
- case 'sixMonth':
- $time = Carbon::today()->subMonths(6);
- $order = $order->where('created_at', '>=', $time);
- break;
- default:
- return $this->error('参数错误');
- }
- $order = $order
- ->groupBy(['user_id'])
- ->select('user_id', DB::raw('count(id) as total_num'))
- ->orderByDesc('total_num')
- ->get()
- ->take(10);
- $i = 0;
- foreach ($order as &$v) {
- $v['username'] = $v->users->nickname ?? '';
- $v['phone'] = $v->users->mobile ?? '';
- $v['ranking'] = ++$i;
- // unset($v);
- }
- return $this->ok($order);
- }
- /**
- * riddingRankingByDayRentOrder 骑行排行榜 - 日租订单
- * @param Request $request
- * @param OrderRentFilter $orderRentFilter
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- */
- public function riddingRankingByDayRentOrder(Request $request, OrderRentFilter $orderRentFilter)
- {
- $area_id = $request->get('area_id') ?? '';
- if ($area_id) {
- $flag = $this->validateAreaId($area_id);
- if ($flag) return $this->error('无权限查看该区域');
- }
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- if (!in_array($days, ['today', 'sevenDays', 'oneMonth', 'sixMonth'])) return $this->error('参数错误');
- $merchant_id = $request->get('merchant_id') ?? '';
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $order = OrderRent::query()
- ->where('merchant_id', $merchant_id)
- ->filter($orderRentFilter)
- ->where('status', OrderRent::STATUS_COMPLETE_ORDER) // 已完成
- ->with(['users']);
- } else {
- $order = OrderRent::query()
- ->where(AdminMerchant::getMerchantWhere())
- ->filter($orderRentFilter)
- ->where('status', OrderRent::STATUS_COMPLETE_ORDER) // 已完成
- ->with(['users']);
- }
- if ($area_id) {
- $order = $order->where('area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $order = $order->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $order = $order->where('area_id', $area_id);
- }
- }
- }
- switch ($days) {
- case 'today':
- $today = Carbon::today();
- $order = $order->where('pay_time', '>=', $today);
- break;
- case 'sevenDays':
- $time = Carbon::today()->subDays(7);
- $order = $order->where('pay_time', '>=', $time);
- break;
- case 'oneMonth':
- $time = Carbon::today()->subMonth();
- $order = $order->where('pay_time', '>=', $time);
- break;
- case 'sixMonth':
- $time = Carbon::today()->subMonths(6);
- $order = $order->where('pay_time', '>=', $time);
- break;
- default:
- return [];
- }
- $order = $order
- ->groupBy(['user_id'])
- ->select('user_id', DB::raw('count(id) as total_num'))
- ->orderByDesc('total_num')
- ->get()
- ->take(10);
- if (count($order) == 0) return $this->ok([]);
- $i = 0;
- foreach ($order as &$v) {
- $v['username'] = $v->users->nickname ?? '';
- $v['phone'] = $v->users->mobile ?? '';
- $v['ranking'] = ++$i;
- unset($v);
- }
- return $this->ok($order);
- }
- /**
- * userPhoneChart 手机统计
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- */
- public function userPhoneChart(Request $request)
- {
- $area_id = $request->get('area_id') ?? '';
- if ($area_id) {
- $flag = $this->validateAreaId($area_id);
- if ($flag) return $this->error('无权限查看该区域');
- }
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少参数');
- if (!in_array($days, ['today', 'sevenDays', 'oneMonth', 'sixMonth'])) return $this->error('参数错误');
- $merchant_id = $request->get('merchant_id') ?? '';
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- //platform 系统平台 [ios,android]
- $platform = UserPhoneDetail::query()->where('merchant_id', $merchant_id);
- $userPhone = UserPhoneDetail::query()->where('merchant_id', $merchant_id);
- } else {
- //platform 系统平台 [ios,android]
- $platform = UserPhoneDetail::query()->where(AdminMerchant::getMerchantWhere());
- $userPhone = UserPhoneDetail::query()->where(AdminMerchant::getMerchantWhere());
- }
- if (!empty($area_id)) {
- $platform = $platform->whereHas('user', function ($q) use ($area_id) {
- $q->where('register_area_id', $area_id);
- });
- $userPhone = $userPhone->whereHas('user', function ($q) use ($area_id) {
- $q->where('register_area_id', $area_id);
- });
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $platform = $platform->whereHas('user', function ($q) use ($area_ids) {
- $q->whereIn('register_area_id', $area_ids);
- });
- $userPhone = $userPhone->whereHas('user', function ($q) use ($area_ids) {
- $q->whereIn('register_area_id', $area_ids);
- });
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $platform = $platform->whereHas('user', function ($q) use ($area_id) {
- $q->where('register_area_id', $area_id);
- });
- $userPhone = $userPhone->whereHas('user', function ($q) use ($area_id) {
- $q->where('register_area_id', $area_id);
- });
- }
- }
- }
- switch ($days) {
- case 'today':
- $param_days = Carbon::today();
- break;
- case 'threeDays':
- $param_days = Carbon::today()->subDays(3);
- break;
- case 'sevenDays':
- $param_days = Carbon::today()->subDays(7);
- break;
- case 'fifteenDays':
- $param_days = Carbon::today()->subDays(15);
- break;
- case 'thirtyDays':
- $param_days = Carbon::today()->subDays(30);
- break;
- case 'oneMonth':
- $param_days = Carbon::today()->subDays(30);
- break;
- case 'sixMonth':
- $param_days = Carbon::today()->subMonths(6);
- break;
- default:
- return [];
- }
- // 饼图
- $platform = $platform->where('created_at', '>', $param_days)
- ->where('platform', '!=', 'devtools')
- ->groupBy(['platform'])
- ->select('platform', DB::raw('count(id) as value'))
- ->get()
- ->toArray();
- // 列表
- $userPhone = $userPhone->where('created_at', '>', $param_days)
- ->groupBy(['model'])
- ->select('model', DB::raw('count(id) as number'))
- ->orderByDesc('number')
- ->limit(10)
- ->get()
- ->toArray();
- $total = UserPhoneDetail::query()->where(AdminMerchant::getMerchantWhere())->count('id');
- if (!empty($platform)) {
- foreach ($platform as &$v) {
- $v['name'] = $v['platform'];
- }
- }
- if (!empty($userPhone)) {
- foreach ($userPhone as &$i) {
- // $i['percent'] = (float)number_format($i['number'] / $total * 100, 2);
- $i['percent'] = bcmul(bcdiv($i['number'], $total, 2), 100, 2);
- }
- }
- return $this->ok(['platform' => $platform, 'userPhone' => $userPhone, 'total' => $total]);
- }
- /**
- * bikeProfitRanking 车辆收益排行榜
- *
- * @param Request $request
- * @param BikeFilter $bikeFilter
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- */
- public function bikeProfitRanking(Request $request, BikeFilter $bikeFilter)
- {
- $area_id = $request->get('area_id') ?? '';
- if ($area_id) {
- $flag = $this->validateAreaId($area_id);
- if ($flag) return $this->error('无权限查看该区域');
- }
- $merchant_id = $request->get('merchant_id') ?? '';
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $bikes = Bike::query()->where('merchant_id', $merchant_id)->filter($bikeFilter);
- } else {
- $bikes = Bike::query()->where(AdminMerchant::getMerchantWhere())->filter($bikeFilter);
- }
- if ($area_id) {
- $bikes = $bikes->where('put_area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $bikes = $bikes->whereIn('put_area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $bikes = $bikes->where('put_area_id', $area_id);
- }
- }
- }
- /**
- * todo
- * 这里可以优化
- * 因为是按照车辆日均收益进行排序的,而数据表里没有日均收益,
- * 所以要全查询之后通过计算得出日均收益,再按照日均收益结果排序取前10条
- * 但是这样的话有一个性能问题,数据表数量越大越影响性能,
- * 所以目前先验证一下当前商户查询的数量是否大于一个值1500,大于的就按照总金额查询,这个数据不是很准确
- *
- * 优化思路:添加一个字段,用来存放日均收益,在统计总收益的时候,可以把日均收益也顺手统计一下
- */
- if ($bikes->count() > 1500) {
- $bikes = $bikes->orderByDesc('total_money')->limit(10)->get();
- } else {
- $bikes = $bikes->get();
- }
- $data = [];
- if (count($bikes) === 0) return $this->ok($data);
- foreach ($bikes as $k => $v) {
- // total_money_time 车辆总收入起始时间
- $bike_insert_time = $v->total_money_time ? date('Y-m-d H:i:s', strtotime($v->total_money_time)) : date('Y-m-d H:i:s', strtotime($v->created_at));
- $days = Carbon::today()->diffInDays($bike_insert_time);
- $per_money = 0;
- if ($days != 0) {
- // $per_money = sprintf("%.2f", substr(sprintf("%.3f", ($v->total_money / $days)), 0, -2));
- $per_money = bcdiv($v->total_money, $days, 2);
- }
- // $v['phone'] = $v->users->mobile ?? '';
- $data[] = [
- 'bike_no' => $v->bike_no ?? '',
- 'put_days' => $days,
- 'total_money' => $v->total_money,
- 'per_money' => $per_money
- ];
- $volume[$k] = $per_money; // 排序依据
- $edition[$k] = $v->bike_no ?? ''; // 排序人
- // $v['ranking'] = ++$i;
- unset($v);
- }
- array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
- if (count($data) > 10) {
- $res = array_slice($data, 0, 10);
- } else {
- $res = $data;
- }
- return $this->ok($res);
- }
- /**
- * shareOutBonus 分红统计
- *
- * @param Request $request
- * @return \Illuminate\Http\JsonResponse
- * @author ht
- */
- public function shareOutBonus(Request $request)
- {
- $area_id = $request->get('area_id') ?? '';
- if ($area_id) {
- $flag = $this->validateAreaId($area_id);
- if ($flag) return $this->error('无权限查看该区域');
- }
- $days = $request->get('days') ?? '';
- if (empty($days)) return $this->error('缺少days参数');
- // [当月=> current_month ,上月 =>last_month ,近一年 => almost_year]
- if (!in_array($days, ['current_month', 'last_month', 'almost_year'])) return $this->error('参数错误');
- $merchant_id = $request->get('merchant_id') ?? '';
- // if (empty($merchant_id)) return $this->error('缺少merchant_id参数');
- if ($merchant_id) {
- /**
- * 查询当月的可以查询 wallet_logs 这个表
- * 查询上个月的查询 statistics
- * 查询近一年的时候,本月之前的查询statistics,本月的还是查询wallet_logs
- */
- switch ($days) {
- case 'current_month':
- $data = $this->monthShare($merchant_id, $area_id);
- break;
- case 'last_month':
- $data = $this->lastMonthShare($merchant_id, $area_id);
- break;
- case 'almost_year':
- $data = $this->yearShare($merchant_id, $area_id);
- break;
- default:
- return [];
- }
- } else {
- $da = [];
- // 没有商户,就统计所有的商户,避免每个商户的分成不一致,就循环统计,然后再合并
- $marr = AdminMerchant::where('status', 1)->pluck('id')->toArray();
- foreach ($marr as $v) {
- /**
- * 查询当月的可以查询 wallet_logs 这个表
- * 查询上个月的查询 statistics
- * 查询近一年的时候,本月之前的查询statistics,本月的还是查询wallet_logs
- */
- switch ($days) {
- case 'current_month':
- $da[] = $this->monthShare($v, $area_id);
- break;
- case 'last_month':
- $da[] = $this->lastMonthShare($v, $area_id);
- break;
- case 'almost_year':
- $da[] = $this->yearShare($v, $area_id);
- break;
- default:
- return [];
- }
- }
- $data = [];
- // 合并数据
- if (isset($da[0])) {
- // foreach($da[0] as $k=>$v){
- // foreach($da as $k1=>$v1){
- // if($k1>0){
- // foreach($v1 as $v2){
- // if($v['date'] == $v2['date']){
- // $data[] = [
- // 'date' => $v['date'],
- // 'value' => bcadd($v['value'],$v2['value'],2),
- // 'share' => bcadd($v['share'],$v2['share'],2)
- // ];
- // }
- // }
- // }
- // }
- // }
- // 优化foreach循环
- $valueArr = [];
- $shareArr = [];
- foreach ($da as $v) {
- $valueArr[] = array_column($v, 'value', 'date');
- $shareArr[] = array_column($v, 'share', 'date');
- }
- // 获取所有的键值
- $keyArr = array_keys($valueArr[0]);
- $valueA = [];
- $shareA = [];
- foreach ($keyArr as $v) {
- foreach ($valueArr as $v1) {
- $valueA[$v][] = $v1[$v];
- }
- foreach ($shareArr as $v2) {
- $shareA[$v][] = $v2[$v];
- }
- }
- // 弃用 array_sum , 采用 bcadd
- $i = 0;
- foreach ($valueA as $k => $v) {
- $value = 0.00;
- foreach ($v as $v1) {
- $value = bcadd($value, $v1, 2);
- }
- $data[$i] = [
- 'date' => $k,
- 'value' => $value
- ];
- $i++;
- }
- $i = 0;
- foreach ($shareA as $k => $v) {
- $share = 0.00;
- foreach ($v as $v1) {
- $share = bcadd($share, $v1, 2);
- }
- $data[$i]['share'] = $share;
- $i++;
- }
- }
- }
- return $data;
- }
- // 当月分红 (纯收益 + 骑行卡收益) 乘以 商户分成比例
- private function monthShare($merchant_id, $area_id)
- {
- // 管理员,并且选择了商户
- if (Admin::isAdministrator() && $merchant_id) {
- $walletLogProfit = WalletLog::query()->where('merchant_id', $merchant_id);
- $cardRidingOrdersProfit = CardRidingOrder::query()->where('merchant_id', $merchant_id);
- } else {
- $walletLogProfit = WalletLog::query()->where(AdminMerchant::getMerchantWhere());
- $cardRidingOrdersProfit = CardRidingOrder::query()->where(AdminMerchant::getMerchantWhere());
- }
- if (!empty($area_id)) {
- $walletLogProfit = $walletLogProfit->where('area_id', $area_id);
- $cardRidingOrdersProfit = $cardRidingOrdersProfit->where('area_id', $area_id);
- } else {
- $admin_id = Admin::user()->id;
- if (!Admin::isAdministrator()) {
- $area_ids = AdminUser::getAreaIdsByAdminId($admin_id);
- if (count($area_ids) !== 0) {
- $walletLogProfit = $walletLogProfit->whereIn('area_id', $area_ids);
- $cardRidingOrdersProfit = $cardRidingOrdersProfit->whereIn('area_id', $area_ids);
- } else {
- $area_id = AdminUserArea::query()->where('admin_id', $admin_id)->value('area_id');
- $area_id = $area_id ?? 0;
- $walletLogProfit = $walletLogProfit->where('area_id', $area_id);
- $cardRidingOrdersProfit = $cardRidingOrdersProfit->where('area_id', $area_id);
- }
- }
- }
- // 口袋钱包纯收益
- $newOrders = $walletLogProfit
- ->whereIn('type', WalletLog::$subType) // 交易类型 - subType 存收益
- ->where('status', WalletLog::STATUS_OK); // 数据状态 - 有效
- $now = Carbon::now();
- $startTime = $now->firstOfMonth();
- $endTime = $now->today()->format('Y-m-d H:i:s');
- $i = (int)date('d') - 1;
- // 赋值一个值为0得数组
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::today()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->whereBetween('created_at', [$startTime, $endTime])
- ->selectRaw("DATE_FORMAT(created_at,'%Y/%m/%d') as date,sum(money) as value")
- ->groupBy('date')->get()->toArray();
- $newOrdersKeyVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $newOrdersKeyVal[$v['date']] = abs($v['value']); // 数据表里的是负数,所以要取正
- }
- }
- // 骑行卡收益
- $cardNewOrders = $cardRidingOrdersProfit->whereBetween('pay_time', [$startTime, $endTime])
- ->selectRaw("DATE_FORMAT(pay_time,'%Y/%m/%d') as date,sum(pay_money) as value")
- ->groupBy('date')->get()->toArray();
- if (!empty($cardNewOrders)) {
- foreach ($cardNewOrders as $v) {
- if (isset($newOrdersKeyVal[$v['date']])) {
- $newOrdersKeyVal[$v['date']] = bcadd($newOrdersKeyVal[$v['date']], $v['value'], 2);
- } else {
- $newOrdersKeyVal[$v['date']] = $v['value'];
- }
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr, $newOrdersKeyVal);
- // 重组结构
- $data = [];
- // 该商户的分红比例 proportion
- $proportion = AdminMerchant::where('id', $merchant_id)->value('proportion');
- $proportion = $proportion ? bcdiv($proportion, 100, 2) : 0.00;
- foreach ($merge as $ks => $vs) {
- $data[] = [
- 'date' => $ks,
- 'value' => bcadd($vs, 0, 2),
- 'share' => bcmul($vs, $proportion, 2)
- ];
- }
- return $data;
- }
- // 上月分红
- private function lastMonthShare($merchant_id, $area_id)
- {
- // 管理员,并且选择了商户
- if (Admin::isAdministrator()) {
- if ($merchant_id) {
- $newOrders = Statistic::query()->where('merchant_id', $merchant_id)->where('slug', Statistic::SLUG_PROFIT_STATIC);
- } else {
- $newOrders = Statistic::query()->where('merchant_id', 0)->where('slug', Statistic::SLUG_PROFIT_STATIC);
- }
- } else {
- $newOrders = Statistic::query()->where(AdminMerchant::getMerchantWhere())->where('slug', Statistic::SLUG_PROFIT_STATIC);
- }
- // 区域
- if (!empty($area_id)) {
- $newOrders = $newOrders->where('area_id', $area_id);
- } else {
- // 平台的是 9999 商户的是 0
- if (Admin::isAdministrator()) {
- $newOrders = $newOrders->where('area_id', config('statistic.all'));
- } else {
- $newOrders = $newOrders->where('area_id', 0);
- }
- }
- // 上月时间
- $now = Carbon::now()->subMonth(1);
- $startTime = $now->firstOfMonth()->format('Y-m-d');
- $endTime = $now->lastOfMonth()->format('Y-m-d');
- $i = (int)date('t', strtotime($endTime)) - 1;
- // 赋值一个值为0得数组
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = $now->lastOfMonth()->subDays($i)->format('Y/m/d');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->whereBetween('date', [$startTime, $endTime])
- ->selectRaw("DATE_FORMAT(date,'%Y/%m/%d') as date,body")
- ->get()->toArray();
- $newOrdersKeyVal = [];
- $totalVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $body = json_decode($v['body'], true);
- // 分红
- $val = (float)$body['share_out_bonus'];
- if (isset($newOrdersKeyVal[$v['date']])) {
- $newOrdersKeyVal[$v['date']] = bcadd($newOrdersKeyVal[$v['date']], $val, 2);
- } else {
- $newOrdersKeyVal[$v['date']] = $val;
- }
- //商户总收益
- $total_val = (float)$body['profit'] + (float)$body['card_profit'];
- if (isset($totalVal[$v['date']])) {
- $totalVal[$v['date']] = bcadd($totalVal[$v['date']], $total_val, 2);
- } else {
- $totalVal[$v['date']] = $total_val;
- }
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr, $newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks => $vs) {
- $data[] = [
- 'date' => $ks,
- 'value' => isset($totalVal[$ks]) ? bcadd($totalVal[$ks], 0, 2) : 0.00,
- 'share' => bcadd($vs, 0, 2)
- ];
- }
- return $data;
- }
- // 近一年分红
- private function yearShare($merchant_id, $area_id)
- {
- // 管理员,并且选择了商户
- if (Admin::isAdministrator()) {
- if ($merchant_id) {
- $newOrders = Statistic::query()->where('merchant_id', $merchant_id)->where('slug', Statistic::SLUG_PROFIT_STATIC);
- } else {
- $newOrders = Statistic::query()->where('merchant_id', 0)->where('slug', Statistic::SLUG_PROFIT_STATIC);
- }
- } else {
- $newOrders = Statistic::query()->where(AdminMerchant::getMerchantWhere())->where('slug', Statistic::SLUG_PROFIT_STATIC);
- }
- // 区域
- if (!empty($area_id)) {
- $newOrders = $newOrders->where('area_id', $area_id);
- } else {
- // 平台的是 9999 商户的是 0
- if (Admin::isAdministrator()) {
- $newOrders = $newOrders->where('area_id', config('statistic.all'));
- } else {
- $newOrders = $newOrders->where('area_id', 0);
- }
- }
- $now = Carbon::now();
- $startTime = $now->startOfYear()->format('Y-m-d');
- $endTime = $now->endOfYear()->format('Y-m-d');
- $i = (int)date('m') - 1;
- // 赋值一个值为0得数组
- $arr = [];
- for ($i; $i >= 0; $i--) {
- $str = Carbon::now()->subMonth($i)->format('Y/m');
- $arr[$str] = 0;
- }
- // 有数据得数组
- $newOrders = $newOrders->whereBetween('date', [$startTime, $endTime])
- ->selectRaw("DATE_FORMAT(date,'%Y/%m') as date,body")
- ->get()->toArray();
- $newOrdersKeyVal = [];
- $totalVal = [];
- if (!empty($newOrders)) {
- foreach ($newOrders as $v) {
- $body = json_decode($v['body'], true);
- $val = (float)$body['share_out_bonus'];
- if (isset($newOrdersKeyVal[$v['date']])) {
- $newOrdersKeyVal[$v['date']] = bcadd($newOrdersKeyVal[$v['date']], $val, 2);
- } else {
- $newOrdersKeyVal[$v['date']] = $val;
- }
- //商户总收益
- $total_val = (float)$body['profit'] + (float)$body['card_profit'];
- if (isset($totalVal[$v['date']])) {
- $totalVal[$v['date']] = bcadd($totalVal[$v['date']], $total_val, 2);
- } else {
- $totalVal[$v['date']] = $total_val;
- }
- }
- }
- // 合并覆盖0
- $merge = array_merge($arr, $newOrdersKeyVal);
- // 重组结构
- $data = [];
- foreach ($merge as $ks => $vs) {
- $data[] = [
- 'date' => $ks,
- 'value' => isset($totalVal[$ks]) ? bcadd($totalVal[$ks], 0, 2) : 0.00,
- 'share' => bcadd($vs, 0, 2)
- ];
- }
- return $data;
- }
- }
|