732 lines
32 KiB
PHP
Raw Normal View History

2023-12-01 18:24:44 +08:00
<?php
namespace app\controller\api\dataview;
use app\common\dao\store\order\StoreOrderDao;
use app\common\dao\store\order\StoreRefundOrderDao;
2023-12-09 15:49:18 +08:00
use app\common\model\store\order\StoreOrder;
2023-12-02 19:52:39 +08:00
use app\common\repositories\BaseRepository;
use app\common\repositories\store\order\StoreOrderRepository;
use app\common\repositories\store\order\StoreRefundOrderRepository;
2023-12-01 18:24:44 +08:00
use crmeb\basic\BaseController;
2023-12-11 18:38:23 +08:00
use Exception;
2023-12-01 18:24:44 +08:00
use think\App;
use think\exception\ValidateException;
use think\facade\Db;
class Order extends BaseController
{
/**
* @var repository
*/
protected $repository;
public $areaCode; // 区县地区码
public $streetCode; // 镇街道地区码
2023-12-08 17:51:49 +08:00
public $token;
2023-12-02 19:52:39 +08:00
public function __construct(App $app, BaseRepository $repository)
2023-12-01 18:24:44 +08:00
{
parent::__construct($app);
$this->repository = $repository;
2023-12-08 17:51:49 +08:00
$this->token = trim($this->request->header('X-Token'));
2023-12-01 18:24:44 +08:00
$this->areaCode = $this->request->param('areaCode', '');
$this->streetCode = $this->request->param('streetCode', '');
if ($this->areaCode == '' && $this->streetCode == '') {
throw new ValidateException('请选择地区');
}
}
2023-12-02 11:54:06 +08:00
// 今日订单
2023-12-01 18:24:44 +08:00
public function currOrderInfo()
{
try {
2023-12-22 17:07:09 +08:00
$day = 'today'; // today
2023-12-01 18:24:44 +08:00
$currOrderCountQuery = Db::name('store_order')->alias('o')
->field(['o.order_sn', 'o.real_name', 'o.user_phone', 'o.user_address', 'o.user_address_code', 'p.store_name', 'm.mer_name', 'o.create_time', 'o.status'])
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->leftJoin('merchant m', 'o.mer_id = m.mer_id')
->leftJoin('store_order_product op', 'o.order_id = op.order_id')
->leftJoin('store_product p', 'op.product_id = p.product_id')
2023-12-01 18:52:22 +08:00
->whereDay('og.create_time', $day)
2023-12-01 18:24:44 +08:00
->where('o.paid', 1)
->whereNotNull('o.pay_time');
2023-12-01 18:52:22 +08:00
// 待取货订单数统计query 订单待发货
$pendingPickupOrderCountQuery = Db::name('store_order')->alias('o')
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->whereDay('og.create_time', $day)
->where('o.status', 0)
->where('o.paid', 1)
->whereNotNull('o.pay_time');;
// 未配送订单数统计query 订单待收货
$undeliveredOrderCountQuery = Db::name('store_order')->alias('o')
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->whereDay('og.create_time', $day)
->where('o.status', 1)
->where('o.paid', 1)
->whereNotNull('o.pay_time');;
// 已完成订单数统计query 订单已完成
$doneOrderCountQuery = Db::name('store_order')->alias('o')
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->whereDay('og.create_time', $day)
->whereIn('o.status', [2,3])
->where('o.paid', 1)
->whereNotNull('o.pay_time');
2023-12-01 18:24:44 +08:00
if ($this->areaCode != '') {
$currOrderCountQuery->where('og.district_code', $this->areaCode);
2023-12-01 18:52:22 +08:00
$pendingPickupOrderCountQuery->where('og.district_code', $this->areaCode);
$undeliveredOrderCountQuery->where('og.district_code', $this->areaCode);
$doneOrderCountQuery->where('og.district_code', $this->areaCode);
2023-12-02 19:52:39 +08:00
} else if ($this->streetCode != '') {
2023-12-01 18:24:44 +08:00
$currOrderCountQuery->where('og.street_code', $this->streetCode);
2023-12-01 18:52:22 +08:00
$pendingPickupOrderCountQuery->where('og.street_code', $this->streetCode);
$undeliveredOrderCountQuery->where('og.street_code', $this->streetCode);
$doneOrderCountQuery->where('og.street_code', $this->streetCode);
2023-12-01 18:24:44 +08:00
}
2023-12-01 18:52:22 +08:00
// 今日订单数
2023-12-01 18:24:44 +08:00
$currOrderCount = $currOrderCountQuery->count();
[$page, $limit] = $this->getPage();
$client = new \GuzzleHttp\Client();
// 今日订单列表
$currOrderList = $currOrderCountQuery->page($page, $limit)->select()->toArray();
foreach ($currOrderList as $k => $order) {
$courierName = Db::connect('logistics')->name('logistics')->where(['order_sn'=>$order['order_sn']])->value('courier_name');
$currOrderList[$k]['courier'] = $courierName;
2023-12-02 14:45:58 +08:00
$currOrderList[$k]['status'] = $this->getStatusDesc($order['status']);
2023-12-01 18:24:44 +08:00
}
2023-12-01 18:52:22 +08:00
// 待取货订单数
$pendingOrderCount = $pendingPickupOrderCountQuery->count();
// 未配送订单数
$undeliveredOrderCount = $undeliveredOrderCountQuery->count();
// 已完成订单数
$doneOrderCountQuery = $doneOrderCountQuery->count();
return app('json')->success(compact('currOrderCount', 'pendingOrderCount', 'undeliveredOrderCount', 'doneOrderCountQuery', 'currOrderList'));
2023-12-01 18:24:44 +08:00
} catch (ValidateException $e) {
throw new ValidateException($e->getMessage());
}
}
2023-12-02 11:54:06 +08:00
// 镇级订单数排行榜
public function orderRanking()
{
$type = $this->request->get('type',2); // 1今日 2总计
$townList = Db::name('geo_street')->field('street_code,street_name')->where('area_code', $this->areaCode)->select()->toArray(); // 镇/街道列表
2023-12-02 13:53:21 +08:00
$orderCount = 0;
2023-12-02 13:57:38 +08:00
$townOrderList = [];
foreach ($townList as $town) {
2023-12-02 11:54:06 +08:00
// 查询订单数
$orderCountQuery = Db::name('product_order_log')->where('street_code', $town['street_code'])->where('status', 1);
if ($type == 1) {
$orderCountQuery->whereDay('create_time', 'today');
}
2023-12-02 13:53:21 +08:00
$tempOrderCount = $orderCountQuery->count();
$town['order_count'] = $tempOrderCount;
$orderCount += $tempOrderCount;
2023-12-02 13:57:38 +08:00
$townOrderList[] = $town;
2023-12-02 11:54:06 +08:00
}
// $orderRankingQuery = Db::name('product_order_log')->alias('op')
// ->leftJoin('geo_street s','op.street_code = s.street_code')
// ->field('op.street_code,COUNT(op.order_id) AS order_count,s.street_name')
// ->where('op.district_code',$this->areaCode)
// ->where('op.status',1);
//
// if ($type == 1) {
// $orderCountQuery->whereDay('create_time', 'today');
// }
// $orderRankingList = $orderRankingQuery->group('op.street_code')->order('order_count desc')->select();
2023-12-02 11:56:48 +08:00
2023-12-02 13:57:38 +08:00
$orderCountArr = array_column($townOrderList, 'order_count');
array_multisort($orderCountArr, SORT_DESC, $townOrderList);
return app('json')->success(compact('orderCount', 'townOrderList'));
2023-12-02 11:54:06 +08:00
}
2023-12-02 14:45:58 +08:00
public function getStatusDesc($status)
2023-12-02 14:45:58 +08:00
{
// 订单状态0待发货1待收货2待评价3已完成 9: 拼团中 10: 待付尾款 11:尾款超时未付 -1已退款
$desc = [
0 => '待取货',
1 => '待配送',
2 => '待评价',
3 => '已完成',
9 => '拼团中',
10 => '待付尾款',
11 => '尾款超时未付',
-1 => '已退款',
];
if (!isset($desc[$status])) {
return '未知';
}
return $desc[$status];
}
2023-12-02 19:52:39 +08:00
// 配送商品排行榜
2023-12-02 19:52:39 +08:00
public function deliveredProductRanking()
{
// 查到镇级
if ($this->areaCode != '' && $this->streetCode != '') {
2023-12-22 17:02:37 +08:00
$list = Db::query("SELECT p.store_name, SUM(op.`product_num`) AS total_quantity
2023-12-02 19:52:39 +08:00
FROM `eb_store_product` p
JOIN `eb_store_order_product` op ON p.product_id = op.product_id
JOIN `eb_store_order` o ON o.`order_id` = op.`order_id`
JOIN `eb_product_order_log` opg ON o.`order_id`= opg.`order_id`
WHERE opg.`street_code`= '{$this->streetCode}'
GROUP BY p.store_name
ORDER BY total_quantity DESC
LIMIT 50");
} else {
// 查到区县级
2023-12-22 17:02:37 +08:00
$list = Db::query("SELECT p.store_name, SUM(op.`product_num`) AS total_quantity
2023-12-02 19:52:39 +08:00
FROM `eb_store_product` p
JOIN `eb_store_order_product` op ON p.product_id = op.product_id
JOIN `eb_store_order` o ON o.`order_id` = op.`order_id`
JOIN `eb_product_order_log` opg ON o.`order_id`= opg.`order_id`
WHERE opg.`district_code`= '{$this->areaCode}'
GROUP BY p.store_name
ORDER BY total_quantity DESC
LIMIT 50");
}
return app('json')->success($list);
}
// 首页 镇地图统计信息
public function townMapCount()
{
$townList = Db::connect('work_task')->name('geo_street')->field('street_name, street_code, lng, lat')->where('area_code', $this->areaCode)->select()->toArray();
foreach ($townList as &$town) {
// 店铺数
$town['mer_count'] = Db::name('merchant')->where('street_id', $town['street_code'])->count();
// 小组服务团队数
$town['service_group_count'] = Db::connect('work_task')->name('company')->where(['street'=> $town['street_code'], 'company_type'=>18])->count();
}
unset($town);
return app('json')->success(compact('townList'));
}
// 第二页 时间段订单统计
public function dateRangeOrderCount()
{
$list = [];
// 00:00-02:00
$startTime0 = strtotime(date('Y-m-d', time()));
$endTime2 = strtotime(date('Y-m-d 01:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime0, $endTime2]);
// 02:00-04:00
$startTime2 = strtotime(date('Y-m-d 02:00:00'));
$endTime4 = strtotime(date('Y-m-d 03:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime2, $endTime4]);
// 04:00-06:00
$startTime4 = strtotime(date('Y-m-d 04:00:00'));
$endTime6 = strtotime(date('Y-m-d 05:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime4, $endTime6]);
// 06:00-08:00
$startTime6 = strtotime(date('Y-m-d 06:00:00'));
$endTime8 = strtotime(date('Y-m-d 07:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime6, $endTime8]);
// 08:00-10:00
$startTime8 = strtotime(date('Y-m-d 08:00:00'));
$endTime10 = strtotime(date('Y-m-d 09:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime8, $endTime10]);
// 10:00-12:00
$startTime10 = strtotime(date('Y-m-d 10:00:00'));
$endTime12 = strtotime(date('Y-m-d 11:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime10, $endTime12]);
// 12:00-14:00
$startTime12 = strtotime(date('Y-m-d 12:00:00'));
$endTime14 = strtotime(date('Y-m-d 13:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime12, $endTime14]);
// 14:00-16:00
$startTime14 = strtotime(date('Y-m-d 14:00:00'));
$endTime16 = strtotime(date('Y-m-d 15:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime14, $endTime16]);
// 16:00-18:00
$startTime16 = strtotime(date('Y-m-d 16:00:00'));
$endTime18 = strtotime(date('Y-m-d 17:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime16, $endTime18]);
// 18:00-20:00
$startTime18 = strtotime(date('Y-m-d 18:00:00'));
$endTime20 = strtotime(date('Y-m-d 19:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime18, $endTime20]);
// 20:00-22:00
$startTime20 = strtotime(date('Y-m-d 20:00:00'));
$endTime22 = strtotime(date('Y-m-d 21:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime20, $endTime22]);
// 22:00-24:00
$startTime22 = strtotime(date('Y-m-d 22:00:00'));
$endTime24 = strtotime(date('Y-m-d 23:59:59'));
$list[] = $this->getTimeRangeOrderCount([$startTime22, $endTime24]);
return app('json')->success($list);
}
private function getTimeRangeOrderCount($timeRange)
{
$hourOrderCountQuery = Db::name('store_order')->alias('o')
->field(['o.order_sn', 'o.real_name', 'o.user_phone', 'o.user_address', 'o.user_address_code', 'p.store_name', 'm.mer_name', 'o.create_time', 'o.status'])
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->leftJoin('merchant m', 'o.mer_id = m.mer_id')
->leftJoin('store_order_product op', 'o.order_id = op.order_id')
->leftJoin('store_product p', 'op.product_id = p.product_id')
->whereTime('og.create_time', 'between', $timeRange) // whereTime('create_time', 'between', [$a[0],$a[1]]);
->where('o.paid', 1)
->whereNotNull('o.pay_time');
// 待取货订单数统计query 订单待发货
$pendingPickupOrderCountQuery = Db::name('store_order')->alias('o')
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->whereTime('og.create_time', 'between', $timeRange)
->where('o.status', 0)
->where('o.paid', 1)
->whereNotNull('o.pay_time');;
// 未配送订单数统计query 订单待收货
$undeliveredOrderCountQuery = Db::name('store_order')->alias('o')
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->whereTime('og.create_time', 'between', $timeRange)
->where('o.status', 1)
->where('o.paid', 1)
->whereNotNull('o.pay_time');;
// 已完成订单数统计query 订单已完成
$doneOrderCountQuery = Db::name('store_order')->alias('o')
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->whereTime('og.create_time', 'between', $timeRange)
->whereIn('o.status', [2,3])
->where('o.paid', 1)
->whereNotNull('o.pay_time');
if ($this->areaCode != '') {
$hourOrderCountQuery->where('og.district_code', $this->areaCode);
$pendingPickupOrderCountQuery->where('og.district_code', $this->areaCode);
$undeliveredOrderCountQuery->where('og.district_code', $this->areaCode);
$doneOrderCountQuery->where('og.district_code', $this->areaCode);
} else if ($this->streetCode != '') {
$hourOrderCountQuery->where('og.street_code', $this->streetCode);
$pendingPickupOrderCountQuery->where('og.street_code', $this->streetCode);
$undeliveredOrderCountQuery->where('og.street_code', $this->streetCode);
$doneOrderCountQuery->where('og.street_code', $this->streetCode);
}
// 今日订单数
$hourOrderCount = $hourOrderCountQuery->count();
// 待取货订单数
$pendingOrderCount = $pendingPickupOrderCountQuery->count();
// 未配送订单数
$undeliveredOrderCount = $undeliveredOrderCountQuery->count();
// 已完成订单数
$doneOrderCount = $doneOrderCountQuery->count();
return compact('hourOrderCount', 'pendingOrderCount', 'undeliveredOrderCount', 'doneOrderCount');
}
2023-12-06 10:08:21 +08:00
// 区县订单数据统计
2023-12-06 10:08:21 +08:00
public function orderStatistics()
{
$list = [];
// 该地区下所有乡镇
$geoStreetList = Db::name('geo_street')->field('street_name, street_code')->where('area_code',$this->areaCode)->select()->toArray();
foreach ($geoStreetList as $k=>$street) {
$dayOrderquery = Db::name('store_order')->alias('o')
->field(['o.order_sn', 'o.real_name', 'o.user_phone', 'o.user_address', 'o.user_address_code', 'p.store_name', 'm.mer_name', 'o.create_time', 'o.status'])
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->where('o.paid', 1)
->whereNotNull('o.pay_time')
->whereDay('o.create_time', 'today')
->where('og.street_code', $street['street_code']);
$monthOrderquery = Db::name('store_order')->alias('o')
->field(['o.order_sn', 'o.real_name', 'o.user_phone', 'o.user_address', 'o.user_address_code', 'p.store_name', 'm.mer_name', 'o.create_time', 'o.status'])
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->where('o.paid', 1)
->whereNotNull('o.pay_time')
->whereMonth('o.create_time', 'this month')
->where('og.street_code', $street['street_code']);
// 日订单数
$street['dayOrderCount'] = $dayOrderquery->count();
// 日订单金额
$street['dayOrderAmount'] = $dayOrderquery->sum('o.total_price');
// 月订单数
$street['monthOrderCount'] = $monthOrderquery->count();
// 月订单金额
$street['monthOrderAmount'] = $monthOrderquery->sum('o.total_price');
$list[$k] = $street;
}
unset($street);
return \app('json')->success(compact('list'));
}
// 镇/街道 当日订单金额
public function streetCurrDayOrderCount()
{
if ($this->streetCode == '') {
return app('json')->fail('请选择镇/街道');
}
$list = [];
// 00:00-04:00
$startTime = strtotime(date('Y-m-d 00:00:00'));
$endTime = strtotime(date('Y-m-d 03:59:59'));
$list[] = $this->getTimeRangeOrderAmount([$startTime, $endTime]);
// 04:00-08:00
$startTime = strtotime(date('Y-m-d 04:00:00'));
$endTime = strtotime(date('Y-m-d 07:59:59'));
$list[] = $this->getTimeRangeOrderAmount([$startTime, $endTime]);
// 08:00-12:00
$startTime = strtotime(date('Y-m-d 08:00:00'));
$endTime = strtotime(date('Y-m-d 11:59:59'));
$list[] = $this->getTimeRangeOrderAmount([$startTime, $endTime]);
// 12:00-16:00
$startTime = strtotime(date('Y-m-d 12:00:00'));
$endTime = strtotime(date('Y-m-d 15:59:59'));
$list[] = $this->getTimeRangeOrderAmount([$startTime, $endTime]);
// 16:00-20:00
$startTime = strtotime(date('Y-m-d 16:00:00'));
$endTime = strtotime(date('Y-m-d 19:59:59'));
$list[] = $this->getTimeRangeOrderAmount([$startTime, $endTime]);
// 20:00-24:00
$startTime = strtotime(date('Y-m-d 20:00:00'));
$endTime = strtotime(date('Y-m-d 23:59:59'));
$list[] = $this->getTimeRangeOrderAmount([$startTime, $endTime]);
return app('json')->success($list);
}
public function getTimeRangeOrderAmount($timeRange=[])
{
$todayAmount = Db::name('store_order')->alias('o')
->field(['o.order_sn', 'o.real_name', 'o.user_phone', 'o.user_address', 'o.user_address_code', 'p.store_name', 'm.mer_name', 'o.create_time', 'o.status'])
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->where('o.paid', 1)
->whereNotNull('o.pay_time')
->whereTime('o.create_time', 'between', $timeRange)
->where('og.street_code', $this->streetCode)
->sum('o.total_price');
$yesterdayStartTime = strtotime('-1 days', $timeRange[0]);
$yesterdayEndTime = strtotime('-1 days', $timeRange[1]);
$yesterdayAmount = Db::name('store_order')->alias('o')
->field(['o.order_sn', 'o.real_name', 'o.user_phone', 'o.user_address', 'o.user_address_code', 'p.store_name', 'm.mer_name', 'o.create_time', 'o.status'])
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->where('o.paid', 1)
->whereNotNull('o.pay_time')
->whereTime('o.create_time', 'between', [$yesterdayStartTime, $yesterdayEndTime])
->where('og.street_code', $this->streetCode)
->sum('o.total_price');
return compact('todayAmount', 'yesterdayAmount');
}
// 平台商品/店铺销量排行
public function salesRanking()
{
$list = [];
// 商品销量排行榜
$productRankingList = Db::name('store_product')->alias('p')
->field('p.product_id, p.store_name, p.image, COUNT(o.`order_id`) AS total_sales')
->join('store_order_product op', 'p.product_id = op.product_id')
->join('store_order o', 'op.order_id = o.order_id')
2023-12-19 14:29:58 +08:00
->join('product_order_log og', 'o.order_id = og.order_id')
->where(function($query) {
if ($this->streetCode != '') {
$query->where('og.street_code', $this->streetCode);
} else {
$query->where('og.district_code', $this->areaCode);
}
})
->group('p.product_id')
->order('total_sales DESC')
->limit(10)
->select()->toArray();
$productRankingTotal = 0;
foreach ($productRankingList as $k => $v) {
$productRankingTotal += $v['total_sales'];
}
// 店铺销量排行榜
$merchantRankingList = Db::name('store_order')->alias('o')
->field('m.`mer_id`, m.`mer_name`, m.mini_banner, COUNT(o.`order_id`) AS total_sales')
->join('merchant m', 'o.`mer_id` = m.`mer_id`')
2023-12-19 14:29:58 +08:00
->where(function($query) {
if ($this->streetCode != '') {
$query->where('m.street_id', $this->streetCode);
} else {
$query->where('m.area_id', $this->areaCode);
}
})
->group('m.mer_id')
->order('total_sales DESC')
->limit(10)
->select()->toArray();
$merchantRankingTotal = 0;
foreach ($merchantRankingList as $k => $v) {
$merchantRankingTotal += $v['total_sales'];
}
// 统计每个镇的商品数.
$townProductCount = 0;
$townProductCountList = [];
$geoStreetList = Db::name('geo_street')->field('street_name, street_code')->where('area_code',$this->areaCode)->select()->toArray();
foreach ($geoStreetList as $k => $street) {
$street['product_count'] = Db::name('merchant')->alias('m')->field('p.`product_id`')
->join('store_product p', 'm.mer_id = p.mer_id')
->where('m.street_id', $street['street_code'])
->count();
$townProductCountList[] = $street;
$townProductCount += $street['product_count'];
}
return \app('json')->success(compact('productRankingTotal','productRankingList', 'merchantRankingTotal','merchantRankingList', 'townProductCount','townProductCountList'));
}
2023-12-06 14:01:14 +08:00
// 当日订单金额
public function currDayOrderAmount()
{
$geoStreetList = Db::name('geo_street')->field('street_name, street_code')->where('area_code',$this->areaCode)->select()->toArray();
foreach ($geoStreetList as &$street) {
$street['today_order_amount'] = Db::name('store_order')->alias('o')
->field(['o.order_sn', 'o.real_name', 'o.user_phone', 'o.user_address', 'o.user_address_code', 'p.store_name', 'm.mer_name', 'o.create_time', 'o.status'])
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->where('o.paid', 1)
->whereNotNull('o.pay_time')
->whereDay('o.create_time', 'today')
->where('og.street_code', $street['street_code'])
->sum('o.total_price');
$street['yesterday_order_amount'] = Db::name('store_order')->alias('o')
->field(['o.order_sn', 'o.real_name', 'o.user_phone', 'o.user_address', 'o.user_address_code', 'p.store_name', 'm.mer_name', 'o.create_time', 'o.status'])
->leftJoin('product_order_log og', 'o.order_id = og.order_id')
->where('o.paid', 1)
->whereNotNull('o.pay_time')
->whereDay('o.create_time', 'yesterday')
->where('og.street_code', $street['street_code'])
->sum('o.total_price');
}
unset($street);
return \app('json')->success(compact('geoStreetList'));
}
// 订单列表
public function orderList(StoreOrderRepository $repository, StoreOrderDao $dao)
{
[$page, $limit] = $this->getPage();
$where = $this->request->params(['type', 'date', 'mer_id','keywords','status','username','order_sn','is_trader','activity_type','group_order_sn','store_name']);
$status = $where['status'];
unset($where['status']);
2023-12-08 13:50:37 +08:00
$query = $dao->search($where, null)->where($repository->getOrderType($status))
->with([
'orderProduct',
'merchant' => function ($query) {
return $query->field('mer_id,mer_name,is_trader');
},
'groupOrder' => function ($query) {
$query->field('group_order_id,group_order_sn');
},
'user' => function ($query) {
$query->field('uid,nickname,avatar');
},
2023-12-19 14:48:05 +08:00
])->join('product_order_log og', 'StoreOrder.order_id = og.order_id')
2023-12-19 14:46:20 +08:00
->where(function($query) {
if ($this->streetCode != '') {
$query->where('og.street_code', $this->streetCode);
} else {
$query->where('og.district_code', $this->areaCode);
}
});
2023-12-19 14:49:21 +08:00
$count = $query->count();
$list = $query->page($page, $limit)->select();
return app('json')->success(compact('count', 'list'));
}
// 订单列表统计标题
public function orderCountTitle(StoreOrderRepository $repository)
{
$where = $this->request->params(['type', 'date', 'mer_id','keywords','status','username','order_sn','is_trader','activity_type']);
$data[0] = $repository->getStat($where, $where['status'])[0];
$data[1] = $repository->getStat($where, $where['status'])[1];
$data[2] = $repository->getStat($where, $where['status'])[2];
return app('json')->success($data);
}
// 退款订单列表
2023-12-08 15:24:06 +08:00
public function refundOrderList(StoreRefundOrderRepository $repository)
{
2023-12-11 18:38:23 +08:00
try{
[$page,$limit] = $this->getPage();
$where = $this->request->params(['refund_order_sn','status','refund_type','date','mer_id','order_sn','is_trader']);
$list = $repository->getAllList($where, $page, $limit);
$list['list'] = $list['list']->toArray();
foreach($list['list'] as &$item) {
if(!empty($item['order'])) {
$userAddressCode = explode(',', $item['order']['user_address_code']??'')??[];
if(!empty($userAddressCode)) {
$area = Db::name('geo_area')->where('area_code', $userAddressCode[2])->value('area_name');
$street = Db::name('geo_street')->where('street_code', $userAddressCode[3])->value('street_name');
$item['order']['order_from'] = $area.$street;
} else {
$item['order']['order_from'] = '';
}
}
2023-12-11 18:22:58 +08:00
}
2023-12-11 18:38:23 +08:00
unset($item);
return app('json')->success($list);
} catch(Exception $e) {
throw new ValidateException($e->getFile().$e->getLine().$e->getMessage());
2023-12-11 17:31:47 +08:00
}
2023-12-11 18:38:23 +08:00
}
// 核销订单
public function takeOrderList(StoreOrderRepository $repository, StoreOrderDao $dao)
{
[$page, $limit] = $this->getPage();
$where = $this->request->params(['date','order_sn','keywords','username','is_trader']);
$where['take_order'] = 1;
$where['status'] = '';
$where['verify_date'] = $where['date'];
unset($where['date']);
$status = $where['status'];
unset($where['status']);
2023-12-09 13:35:47 +08:00
$query = $dao->search($where, null)->where($repository->getOrderType($status))->with([
2023-12-08 17:51:49 +08:00
'orderProduct',
'merchant' => function ($query) {
return $query->field('mer_id,mer_name,is_trader');
},
'groupOrder' => function ($query) {
$query->field('group_order_id,group_order_sn');
},
'user' => function ($query) {
$query->field('uid,nickname,avatar');
},
2023-12-09 13:35:47 +08:00
]);
$count = $query->count();
$list = $query->page($page, $limit)->select();
foreach($list as &$item) {
2023-12-11 18:38:23 +08:00
if(!empty($item['order'])) {
$userAddressCode = explode(',', $item['user_address_code']??'')??[];
if(!empty($userAddressCode)){
$area = Db::name('geo_area')->where('area_code', $userAddressCode[2])->value('area_name');
$street = Db::name('geo_street')->where('street_code', $userAddressCode[3])->value('street_name');
$item['order_from'] = $area.$street;
} else{
$item['order_from'] = '';
}
2023-12-11 18:22:58 +08:00
}
2023-12-11 18:38:23 +08:00
2023-12-11 18:22:58 +08:00
2023-12-11 17:33:47 +08:00
}
return app('json')->success(compact('count', 'list'));
}
public function takeOrderCountTitle(StoreOrderRepository $repository)
{
$where = $this->request->params(['date','order_sn','keywords','username','is_trader']);
$where['take_order'] = 1;
$where['status'] = '';
$where['verify_date'] = $where['date'];
unset($where['date']);
$data[0] = $repository->getStat($where, '')[0];
$data[1] = $repository->getStat($where, '')[1];
$data[2] = $repository->getStat($where, '')[2];
return app('json')->success($data);
}
2023-12-09 15:49:18 +08:00
public function orderUserNumCount()
{
// 订单数
$orderNum = $this->dayOrderNum('today');
$yesterdayNum = $this->dayOrderNum('yesterday');
$monthOrderNum = $this->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 = $this->dayOrderNum($date);
$monthOrderNumRate = $this->getRate($beforeOrderNum, $monthOrderNum);
$orderNumRate = $this->getRate($yesterdayNum, $orderNum);
// 支付数
$orderPayNum = $this->dayOrderUserNum('today');
$yesterdayNum = $this->dayOrderUserNum('yesterday');
$monthOrderPayNum = $this->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 = $this->dayOrderUserNum($date);
$monthOrderPayRate = $this->getRate($beforeOrderNum, $monthOrderNum);
$orderOrderPayRate = $this->getRate($yesterdayNum, $orderNum);
return app('json')->success(compact('orderNum', 'monthOrderNum', 'monthOrderNumRate', 'orderNumRate', 'orderPayNum', 'monthOrderPayNum', 'monthOrderPayRate', 'orderOrderPayRate'));
}
public function dayOrderNum($day)
{
return StoreOrder::getDB()->alias('o')
->join('product_order_log pog', 'o.order_id=pog.order_id')
->where('o.paid', 1)
->when($day, function ($query, $day) {
getModelTime($query, $day, 'o.pay_time');
})
->where('pog.street_code', $this->streetCode)
->count();
}
public function dayOrderUserNum($day, $merId = null)
{
return StoreOrder::getDB()->alias('o')
->join('product_order_log pog', 'o.order_id=pog.order_id')
->where('o.paid', 1)
->when($day, function ($query, $day) {
getModelTime($query, $day, 'o.pay_time');
})
->where('pog.street_code', $this->streetCode)->group('o.uid')->count();
}
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);
}
2023-12-01 18:24:44 +08:00
}