徐总多门店
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
jiuhaoshenghuo/app/services/order/store/BranchOrderServices.php

323 lines
13 KiB

<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\services\order\store;
use app\dao\order\StoreOrderDao;
use app\services\BaseServices;
use app\services\order\OtherOrderServices;
use app\services\order\StoreOrderRefundServices;
use app\services\order\StoreOrderServices;
use app\services\store\StoreUserServices;
use app\services\user\UserCardServices;
use app\services\user\UserRechargeServices;
use think\exception\ValidateException;
/**
* Class StoreOrderWapServices
* @package app\services\order
* @mixin StoreOrderDao
*/
class BranchOrderServices extends BaseServices
{
/**
* StoreOrderWapServices constructor.
* @param StoreOrderDao $dao
*/
public function __construct(StoreOrderDao $dao)
{
$this->dao = $dao;
}
/**
* 获取订单数量
* @param int $store_id
* @param int $staff_id
* @return array
*/
public function getOrderData(int $store_id, int $staff_id = 0)
{
$where = ['pid' => 0, 'store_id' => $store_id, 'refund_status' => [0, 3], 'is_del' => 0, 'is_system_del' => 0];
$data['order_count'] = (string)$this->dao->count($where);
$where = $where + ['paid' => 1];
$data['sum_price'] = (string)$this->dao->sum($where, 'pay_price', true);
$countWhere = ['store_id' => $store_id];
if ($staff_id) {
$countWhere['staff_id'] = $staff_id;
}
$pid_where = ['pid' => 0];
$not_pid_where = ['not_pid' => 1];
$data['unpaid_count'] = (string)$this->dao->count(['status' => 0] + $countWhere + $pid_where);
$data['unshipped_count'] = (string)$this->dao->count(['status' => 1] + $countWhere + $pid_where);
$data['unwriteoff_count'] = (string)$this->dao->count(['status' => 5] + $countWhere + $pid_where);
$data['received_count'] = (string)$this->dao->count(['status' => 2] + $countWhere + $pid_where);
$data['evaluated_count'] = (string)$this->dao->count(['status' => 3] + $countWhere + $pid_where);
$data['complete_count'] = (string)$this->dao->count(['status' => 4] + $countWhere + $pid_where);
/** @var StoreOrderRefundServices $storeOrderRefundServices */
$storeOrderRefundServices = app()->make(StoreOrderRefundServices::class);
$refund_where = ['store_id' => $store_id, 'is_cancel' => 0];
$data['refunding_count'] = (string)$storeOrderRefundServices->count($refund_where + ['refund_type' => [0, 1, 2, 4, 5]]);
$data['refunded_count'] = (string)$storeOrderRefundServices->count($refund_where + ['refund_type' => [3, 6]]);
$data['refund_count'] = (string)$storeOrderRefundServices->count($refund_where);
return $data;
}
/**
* 订单统计详情列表
* @param int $store_id
* @param int $staff_id
* @param int $type
* @param array $time
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function time(int $store_id, int $staff_id = 0, int $type = 1, array $time = [], string $timeType = 'day')
{
if (!$time) {
return [[], []];
}
$order_where = ['pid' => 0, 'is_del' => 0, 'paid' => 1, 'store_id' => $store_id];
if ($type != 4) {
$order_where['refund_status'] = [0, 3];
}
if ($staff_id) $order_where['staff_id'] = $staff_id;
switch ($type) {
case 1://所有订单:
break;
case 2://配送
case 3://配送订单数量
$order_where['type'] = 107;
break;
case 4://退款
$order_where['status'] = -3;
break;
case 5://收银订单
$order_where['type'] = 106;
break;
case 6://核销
$order_where['type'] = 105;
break;
}
return $this->dao->orderAddTimeList($order_where, $time, $timeType);
}
/**
* 订单每月统计数据(按天分组)
* @param array $where
* @param array|string[] $field
* @return array
*/
public function getOrderDataPriceCount(array $where, array $field = ['sum(pay_price) as price', 'count(id) as count', 'FROM_UNIXTIME(add_time, \'%m-%d\') as time'])
{
[$page, $limit] = $this->getPageValue();
$order_where = ['is_del' => 0, 'is_system_del' => 0, 'paid' => 1, 'refund_status' => [0, 3]];
$where = array_merge($where, $order_where);
return $this->dao->getOrderDataPriceCount($where, $field, $page, $limit);
}
/**
* 获取订单列表
* @param array $where
* @param array $with
* @param false $is_count
* @return array|null
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getStoreOrderList(array $where, array $field = ['*'], array $with = [], $is_count = false)
{
[$page, $limit] = $this->getPageValue();
$list = $this->dao->getOrderList($where, $field, $page, $limit, $with, 'id desc');
if ($is_count) {
$count = $this->dao->count($where);
return compact('list', 'count');
}
/** @var StoreOrderServices $orderServices */
$orderServices = app()->make(StoreOrderServices::class);
$list = $orderServices->tidyOrderList($list);
foreach ($list as &$item) {
$refund_num = array_sum(array_column($item['refund'], 'refund_num'));
$cart_num = 0;
foreach ($item['_info'] as $items) {
if (isset($items['cart_info']['is_gift']) && $items['cart_info']['is_gift']) continue;
$cart_num += $items['cart_info']['cart_num'];
}
$item['is_all_refund'] = $refund_num == $cart_num;
}
return $list;
}
/**
* 取消订单
* @param $id
* @param int $store_id
* @return bool
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function cancelOrder($id, int $store_id = 0)
{
$where = ['id' => $id, 'is_del' => 0, 'store_id' => $store_id];
$order = $this->dao->getOne($where);
if (!$order) {
throw new ValidateException('没有查到此订单');
}
if ($order->paid) {
throw new ValidateException('订单已经支付无法取消');
}
/** @var StoreOrderRefundServices $refundServices */
$refundServices = app()->make(StoreOrderRefundServices::class);
$this->transaction(function () use ($refundServices, $order) {
//回退积分和优惠卷
$res = $refundServices->integralAndCouponBack($order);
//回退库存和销量
$res = $res && $refundServices->regressionStock($order);
$order->is_del = 1;
if (!($res && $order->save())) {
throw new ValidateException('取消订单失败');
}
});
return true;
}
/**
* 门店首页头部统计
* @param int $store_id
* @param $time
* @return array
*/
public function homeStatics(int $store_id, $time)
{
$data = [];
$where = ['time' => $time];
if ($store_id) $where['store_id'] = $store_id;
$order_where = ['paid' => 1, 'pid' => 0, 'is_system_del' => 0, 'refund_status' => [0, 3]];
//门店营收
$data['store_income'] = $this->dao->sum($order_where + $where, 'pay_price', true);
//消耗余额
$data['store_use_yue'] = $this->dao->sum(['pay_type' => 'yue'] + $order_where + $where, 'pay_price', true);
//收银订单
$data['cashier_order_price'] = $this->dao->sum(['type' => 106] + $order_where + $where, 'pay_price', true);
//分配订单
$data['store_order_price'] = $this->dao->sum(['type' => 107] + $order_where + $where, 'pay_price', true);
//核销订单
$data['store_writeoff_order_price'] = $this->dao->sum(['shipping_type' => 2] + $order_where + $where, 'pay_price', true);
/** @var StoreUserServices $storeUserServices */
$storeUserServices = app()->make(StoreUserServices::class);
$data['store_user_count'] = $storeUserServices->count($where);
//门店成交用户数
$data['store_pay_user_count'] = count(array_unique($this->dao->getColumn($order_where + $where, 'uid', '', true)));
/** @var OtherOrderServices $vipOrderServices */
$vipOrderServices = app()->make(OtherOrderServices::class);
$data['vip_price'] = $vipOrderServices->sum(['paid' => 1, 'type' => [0, 1, 2, 4]] + $where, 'pay_price', true);
/** @var UserRechargeServices $userRecharge */
$userRecharge = app()->make(UserRechargeServices::class);
$data['recharge_price'] = $userRecharge->sum(['paid' => 1] + $where, 'price', true);
/** @var UserCardServices $userCard */
$userCard = app()->make(UserCardServices::class);
$data['card_count'] = $userCard->count($where + ['is_submit' => 1]);
return $data;
}
/**
* 门店首页运营统计
* @param int $store_id
* @param array $time
* @return array
*/
public function operateChart(int $store_id, array $time)
{
[$start, $end, $timeType, $timeKey] = $time;
$where = [];
if ($store_id == -1) {
$where[] = ['store_id', '>', 0];
} else {
$where['store_id'] = $store_id;
}
$order = $this->dao->orderAddTimeList($where, [$start, $end], $timeType);
/** @var StoreUserServices $storeUserServices */
$storeUserServices = app()->make(StoreUserServices::class);
$storeUser = $storeUserServices->userTimeList($where, [$start, $end], $timeType);
$order = array_column($order, 'price', 'day');
$storeUser = array_column($storeUser, 'count', 'day');
$data = $series = [];
$xAxis = [];
foreach ($timeKey as $key) {
$data['门店收款'][] = isset($order[$key]) ? floatval($order[$key]) : 0;
$data['新增用户数'][] = isset($storeUser[$key]) ? floatval($storeUser[$key]) : 0;
$xAxis[] = date('m-d', strtotime($key));
}
foreach ($data as $key => $item) {
$series[] = [
'name' => $key,
'data' => $item,
'type' => 'line',
'smooth' => 'true',
'yAxisIndex' => 1,
];
}
return compact('xAxis', 'series');
}
/**
* 首页交易统计
* @param int $store_id
* @param array $time
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function orderChart(int $store_id, array $time)
{
$chartdata = [];
$where = ['time' => $time, 'pid' => 0];
if ($store_id) $where['store_id'] = $store_id;
$order_where = ['paid' => 1, 'pid' => 0, 'is_system_del' => 0, 'refund_status' => [0, 3]];
$list = $this->dao->getOrderList($where + $order_where, ['id', 'order_id', 'uid', 'pay_price', 'pay_time'], 0, 10);
$chartdata['order_list'] = $list;
$chartdata['bing_xdata'] = ['收银订单', '充值订单', '分配订单', '核销订单', '付费会员订单'];
$color = ['#2EC479', '#7F7AE5', '#FFA21B', '#46A3FF', '#FF6046'];
//收银订单
$pay[] = $this->dao->sum(['type' => 106] + $order_where + $where, 'pay_price', true);
/** @var UserRechargeServices $userRecharge */
$userRecharge = app()->make(UserRechargeServices::class);
$pay[] = $userRecharge->sum(['paid' => 1] + $where, 'price', true);
//分配订单
$pay[] = $this->dao->sum(['type' => 107] + $order_where + $where, 'pay_price', true);
//核销订单
$pay[] = $this->dao->sum(['type' => 105] + $order_where + $where, 'pay_price', true);
/** @var OtherOrderServices $vipOrderServices */
$vipOrderServices = app()->make(OtherOrderServices::class);
$pay[] = $vipOrderServices->sum(['paid' => 1, 'type' => [0, 1, 2, 4]] + $where, 'pay_price', true);
foreach ($pay as $key => $item) {
$bing_data[] = ['name' => $chartdata['bing_xdata'][$key], 'value' => $pay[$key], 'itemStyle' => ['color' => $color[$key]]];
}
$chartdata['bing_data'] = $bing_data;
return $chartdata;
}
}