508 lines
18 KiB
PHP
508 lines
18 KiB
PHP
<?php
|
||
// +----------------------------------------------------------------------
|
||
// | likeshop开源商城系统
|
||
// +----------------------------------------------------------------------
|
||
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
|
||
// | gitee下载:https://gitee.com/likeshop_gitee
|
||
// | github下载:https://github.com/likeshop-github
|
||
// | 访问官网:https://www.likeshop.cn
|
||
// | 访问社区:https://home.likeshop.cn
|
||
// | 访问手册:http://doc.likeshop.cn
|
||
// | 微信公众号:likeshop技术社区
|
||
// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
|
||
// | likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
|
||
// | 禁止对系统程序代码以任何目的,任何形式的再发布
|
||
// | likeshop团队版权所有并拥有最终解释权
|
||
// +----------------------------------------------------------------------
|
||
// | author: likeshop.cn.team
|
||
// +----------------------------------------------------------------------
|
||
|
||
|
||
namespace app\admin\logic\order;
|
||
|
||
|
||
use app\common\basics\Logic;
|
||
use app\common\enum\GoodsEnum;
|
||
use app\common\enum\OrderEnum;
|
||
use app\common\enum\ShopEnum;
|
||
use app\common\model\order\Order;
|
||
use app\common\model\order\OrderGoods;
|
||
use app\common\model\order\OrderLog;
|
||
use app\common\logic\OrderLogLogic;
|
||
use app\common\enum\OrderLogEnum;
|
||
use app\common\enum\PayEnum;
|
||
use app\common\logic\OrderRefundLogic;
|
||
use app\common\model\order\OrderRefund;
|
||
use app\common\model\order\OrderTrade;
|
||
|
||
use app\common\model\order\Supplier;
|
||
use app\common\model\Express;
|
||
use app\common\model\team\Team;
|
||
use app\common\model\user\UserLevel;
|
||
use app\common\server\ExportExcelServer;
|
||
use app\common\server\UrlServer;
|
||
use expressage\Kd100;
|
||
use expressage\Kdniao;
|
||
use app\common\server\ConfigServer;
|
||
use think\facade\Db;
|
||
|
||
|
||
/**
|
||
* 订单管理-逻辑
|
||
* Class GoodsLogic
|
||
* @package app\shop\logic\goods
|
||
*/
|
||
class OrderLogic extends Logic
|
||
{
|
||
/**
|
||
* @notes 订单统计
|
||
* @param array $get
|
||
* @return array
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\DbException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @author suny
|
||
* @date 2021/7/14 10:04 上午
|
||
*/
|
||
public static function statistics($get = [], $is_export = false)
|
||
{
|
||
|
||
$order = new Order();
|
||
$where = [];
|
||
$page = '1';
|
||
$limit = '10';
|
||
// $where[] = ['o.del', '=', 0];
|
||
//订单状态选项卡
|
||
if (isset($get['type']) && $get['type'] != '') {
|
||
$where[] = ['order_status', '=', $get['type']];
|
||
}
|
||
//订单搜素
|
||
if (!empty($get['search_key']) && !empty($get['keyword'])) {
|
||
$keyword = $get['keyword'];
|
||
switch ($get['search_key']) {
|
||
case 'order_sn':
|
||
$where[] = ['o.order_sn', '=', $keyword];
|
||
break;
|
||
case 'user_sn':
|
||
$where[] = ['u.sn', '=', $keyword];
|
||
break;
|
||
case 'shop_name':
|
||
$where[] = ['s.name', 'like', '%' . $keyword . '%'];
|
||
break;
|
||
case 'goods_name':
|
||
$where[] = ['g.goods_name', 'like', '%' . $keyword . '%'];
|
||
break;
|
||
case 'user_id':
|
||
$where[] = ['o.user_id', '=', $keyword];
|
||
break;
|
||
case 'nickname':
|
||
$where[] = ['u.nickname', 'like', '%' . $keyword . '%'];
|
||
break;
|
||
case 'user_mobile':
|
||
$where[] = ['u.mobile', '=', $keyword];
|
||
break;
|
||
case 'consignee':
|
||
$where[] = ['consignee', '=', $keyword];
|
||
break;
|
||
case 'consignee_mobile':
|
||
$where[] = ['o.mobile', '=', $keyword];
|
||
break;
|
||
}
|
||
}
|
||
//商家名称
|
||
if (isset($get['shop_name']) && $get['shop_name'] != '') {
|
||
$where[] = ['s.name', 'like', '%' . $get['shop_name'] . '%'];
|
||
}
|
||
//商品名称
|
||
if (isset($get['goods_name']) && $get['goods_name'] != '') {
|
||
$where[] = ['g.goods_name', 'like', '%' . $get['goods_name'] . '%'];
|
||
}
|
||
//配送方式
|
||
if (isset($get['delivery_type']) && $get['delivery_type'] != '') {
|
||
$where[] = ['o.delivery_type', '=', $get['delivery_type']];
|
||
}
|
||
//订单状态
|
||
if (isset($get['order_status']) && $get['order_status'] != '') {
|
||
$where[] = ['o.order_status', '=', $get['order_status']];
|
||
}
|
||
//订单类型
|
||
if (isset($get['order_type']) && $get['order_type'] != '') {
|
||
$where[] = ['o.order_type', '=', $get['order_type']];
|
||
}
|
||
//付款方式
|
||
if (isset($get['pay_way']) && $get['pay_way'] != '') {
|
||
$where[] = ['o.pay_way', '=', $get['pay_way']];
|
||
}
|
||
|
||
//业务团队
|
||
if (isset($get['team_id']) && $get['team_id'] != '') {
|
||
$where[] = ['o.team_id', '=', $get['team_id']];
|
||
}
|
||
|
||
// 前置订单
|
||
if (isset($get['is_frontend']) && $get['is_frontend'] != '') {
|
||
$where[] = ['o.is_frontend', '=', $get['is_frontend']];
|
||
}
|
||
|
||
//订单来源
|
||
if (isset($get['order_source']) && $get['order_source'] != '') {
|
||
$where[] = ['o.order_source', '=', $get['order_source']];
|
||
}
|
||
|
||
//下单时间
|
||
if (isset($get['start_time']) && $get['start_time'] != '') {
|
||
$where[] = ['o.create_time', '>=', strtotime($get['start_time'])];
|
||
}
|
||
|
||
if (isset($get['end_time']) && $get['end_time'] != '') {
|
||
$where[] = ['o.create_time', '<=', strtotime($get['end_time'])];
|
||
}
|
||
|
||
if (isset($get['page']) && $get['page'] != '') {
|
||
$page = $get['page'];
|
||
}
|
||
|
||
if (isset($get['limit']) && $get['limit'] != '') {
|
||
$limit = $get['limit'];
|
||
}
|
||
|
||
// 导出excel
|
||
if (true === $is_export) {
|
||
return self::export($where);
|
||
}
|
||
|
||
$field = 'o.*,order_status as order_status_text,pay_way as pay_way_text,delivery_type as delivery_type_text,s.name as shop_name,order_type as order_type_text,u.level,bt.name as team_name';
|
||
|
||
$count = $order
|
||
->alias('o')
|
||
->field($field)
|
||
->join('shop s', 's.id = o.shop_id')
|
||
->join('user u', 'u.id = o.user_id')
|
||
->join('order_goods g', 'g.order_id = o.id')
|
||
->leftJoin('business_team bt', 'bt.id = o.team_id')
|
||
->with(['order_goods', 'user', 'shop'])
|
||
->where($where)
|
||
->group('o.id')
|
||
->count();
|
||
|
||
$lists = $order
|
||
->alias('o')
|
||
->field($field)
|
||
->join('shop s', 's.id = o.shop_id')
|
||
->join('user u', 'u.id = o.user_id')
|
||
->join('order_goods g', 'g.order_id = o.id')
|
||
->leftJoin('business_team bt', 'bt.id = o.team_id')
|
||
->with(['order_goods', 'user', 'shop'])
|
||
->where($where)
|
||
->append(['delivery_address', 'pay_status_text', 'order_source_text'])
|
||
->page($page, $limit)
|
||
->order('o.id desc')
|
||
->group('o.id')
|
||
->select();
|
||
|
||
$user_level = UserLevel::where(['del'=>0])->column('name','id');
|
||
|
||
foreach ($lists as $list) {
|
||
$list['pay_time'] = $list['pay_time'] == '0' ? '未支付' : date('Y-m-d H:i:s', $list['pay_time']);
|
||
$list['user']['avatar'] = UrlServer::getFileUrl($list['user']['avatar']);
|
||
$list['shop']['logo'] = UrlServer::getFileUrl($list['shop']['logo']);
|
||
foreach ($list['order_goods'] as $order_good) {
|
||
$order_good['image'] = UrlServer::getFileUrl($order_good['image']);
|
||
}
|
||
|
||
$list['team_name'] = $list['team_name'] ?: '无';
|
||
|
||
// 会员等级
|
||
$list['user_level'] = '暂无等级';
|
||
if(isset($user_level[$list['level']])) {
|
||
$list['user_level'] = $user_level[$list['level']];
|
||
}
|
||
}
|
||
return ['count' => $count, 'lists' => $lists];
|
||
}
|
||
|
||
/**
|
||
* @notes 订单详情
|
||
* @param $id
|
||
* @return array|\think\Model|null
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\DbException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @author suny
|
||
* @date 2021/7/14 10:04 上午
|
||
*/
|
||
|
||
public static function getDetail($id)
|
||
{
|
||
$order = new Order();
|
||
$result = $order
|
||
->with(['user', 'order_goods', 'invoice'])
|
||
->where('id', $id)
|
||
->append(['delivery_address', 'pay_status_text', 'order_status_text', 'pay_way_text', 'order_type_text'])
|
||
->find();
|
||
$result['pay_time'] = $result['pay_time'] == '0' ? '未支付' : date('Y-m-d H:i:s', $result['pay_time']);
|
||
$result['user']['avatar'] = UrlServer::getFileUrl($result['user']['avatar']);
|
||
foreach ($result['order_goods'] as &$order_goods) {
|
||
$order_goods['goods_image'] = empty($order_goods['spec_image']) ?
|
||
UrlServer::getFileUrl($order_goods['image']) : UrlServer::getFileUrl($order_goods['spec_image']);
|
||
}
|
||
return $result;
|
||
}
|
||
|
||
/**
|
||
* @notes 物流信息
|
||
* @param $order_id
|
||
* @return array|\PDOStatement|string|\think\Model|null
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @throws \think\exception\DbException
|
||
* @author suny
|
||
* @date 2021/7/14 10:05 上午
|
||
*/
|
||
public static function shippingInfo($order_id)
|
||
{
|
||
$shipping = Db::name('delivery')->where('order_id', $order_id)->find();
|
||
if ($shipping) {
|
||
$shipping['create_time_text'] = date('Y-m-d H:i:s', $shipping['create_time']);
|
||
}
|
||
$shipping['traces'] = self::getShipping($order_id);
|
||
return $shipping;
|
||
}
|
||
|
||
/**
|
||
* @notes 物流轨迹
|
||
* @param $order_id
|
||
* @return bool|string[]
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\DbException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @author suny
|
||
* @date 2021/7/14 10:05 上午
|
||
*/
|
||
public static function getShipping($order_id)
|
||
{
|
||
|
||
$orderModel = new Order();
|
||
$order = $orderModel->alias('o')
|
||
->field('invoice_no,shipping_name,shipping_id,o.shipping_status,o.mobile')
|
||
->join('delivery d', 'd.order_id = o.id')
|
||
->where(['o.id' => $order_id])
|
||
->find();
|
||
$express = ConfigServer::get('express', 'way', '', '');
|
||
$key = ConfigServer::get($express, 'appkey', '', '');
|
||
$app = ConfigServer::get($express, 'appsecret', '', '');
|
||
|
||
if (empty($express) || $order['shipping_status'] != 1 || empty($app) || empty($key)) {
|
||
return $traces[] = ['暂无物流信息'];
|
||
}
|
||
//快递配置设置为快递鸟时
|
||
if ($express === 'kdniao') {
|
||
$expressage = (new Kdniao($app, $key, true));
|
||
$shipping_field = 'codebird';
|
||
} else {
|
||
$expressage = (new Kd100($app, $key, true));
|
||
$shipping_field = 'code100';
|
||
}
|
||
|
||
//快递编码
|
||
$shipping_code = Db::name('express')
|
||
->where(['id' => $order['shipping_id']])
|
||
->value($shipping_field);
|
||
|
||
//获取物流轨迹
|
||
if ($shipping_code === 'SF' && $express === 'kdniao') {
|
||
$expressage->logistics($shipping_code, $order['invoice_no'], substr($order['mobile'],-4));
|
||
}else {
|
||
$expressage->logistics($shipping_code, $order['invoice_no']);
|
||
}
|
||
|
||
$traces = $expressage->logisticsFormat();
|
||
if ($traces == false) {
|
||
$traces[] = [$expressage->getError()];
|
||
} else {
|
||
foreach ($traces as &$item) {
|
||
$item = array_values(array_unique($item));
|
||
}
|
||
}
|
||
return $traces;
|
||
}
|
||
|
||
/**
|
||
* @notes 获取物流
|
||
* @return \think\Collection
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\DbException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @author suny
|
||
* @date 2021/7/14 10:05 上午
|
||
*/
|
||
public static function express()
|
||
{
|
||
|
||
return Express::where('del', 0)->select();
|
||
}
|
||
|
||
|
||
|
||
|
||
/**
|
||
* @notes 取消订单(返回商品规格表库存)
|
||
* @param $order_id
|
||
* @param $admin_id
|
||
* @return bool|string
|
||
* @throws \think\db\exception\DataNotFoundException
|
||
* @throws \think\db\exception\ModelNotFoundException
|
||
* @throws \think\exception\DbException
|
||
* @throws \think\exception\PDOException
|
||
* @author suny
|
||
* @date 2021/7/14 10:07 上午
|
||
*/
|
||
public static function cancel($order_id, $admin_id)
|
||
{
|
||
|
||
Db::startTrans();
|
||
try {
|
||
$order = Order::where(['id' => $order_id], ['orderGoods'])->find();
|
||
//取消订单
|
||
OrderRefundLogic::cancelOrder($order_id, OrderLogEnum::TYPE_SHOP, $admin_id);
|
||
//已支付的订单,取消,退款
|
||
if ($order['pay_status'] == PayEnum::ISPAID) {
|
||
//更新订单状态
|
||
OrderRefundLogic::cancelOrderRefundUpdate($order);
|
||
//订单退款
|
||
OrderRefundLogic::refund($order, $order['order_amount'], $order['order_amount']);
|
||
}
|
||
Db::commit();
|
||
|
||
return true;
|
||
|
||
} catch (\Exception $e) {
|
||
Db::rollback();
|
||
//增加退款失败记录
|
||
OrderRefundLogic::addErrorRefund($order, $e->getMessage());
|
||
return $e->getMessage();
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* @notes 获取各列表数量
|
||
* @return int
|
||
* @author suny
|
||
* @date 2021/7/14 10:08 上午
|
||
*/
|
||
public static function getAll()
|
||
{
|
||
$all = Order::count('id');
|
||
return $all;
|
||
}
|
||
|
||
/**
|
||
* @notes 拼装统计信息
|
||
* @param $order_status
|
||
* @return array
|
||
* @author suny
|
||
* @date 2021/7/14 10:08 上午
|
||
*/
|
||
public static function getStat($order_status)
|
||
{
|
||
foreach ($order_status as $key => $value) {
|
||
$num = Order::where('order_status', $key)->count('id');
|
||
$stat = $value . "(" . $num . ")";
|
||
$data[] = $stat;
|
||
}
|
||
return $data;
|
||
}
|
||
|
||
|
||
/**
|
||
* @notes 导出Excel
|
||
* @param array $condition
|
||
* @return array|false
|
||
* @author 段誉
|
||
* @date 2022/4/24 10:10
|
||
*/
|
||
public static function export($condition = [])
|
||
{
|
||
try {
|
||
$field = 'o.*,order_status as order_status_text,pay_way as pay_way_text,
|
||
delivery_type as delivery_type_text,order_type as order_type_text,
|
||
u.nickname,s.name as shop_name,s.type as shop_type';
|
||
|
||
$lists = Order::alias('o')
|
||
->leftjoin('shop s', 's.id = o.shop_id')
|
||
->leftjoin('user u', 'u.id = o.user_id')
|
||
->join('order_goods g', 'g.order_id = o.id')
|
||
->with(['order_goods'])
|
||
->field($field)
|
||
->where($condition)
|
||
->append(['delivery_address', 'pay_status_text', 'order_source_text'])
|
||
->order('o.id desc')
|
||
->group('o.id')
|
||
->select()
|
||
->toArray();
|
||
|
||
foreach ($lists as &$item) {
|
||
$orderGoodsList = [];
|
||
$goodsItemList = [];
|
||
$goodsPriceList = [];
|
||
$goodsNumList = [];
|
||
foreach ($item['order_goods'] as $good) {
|
||
$orderGoodsList[] = $good['goods_name'];
|
||
$goodsItemList[] = $good['spec_value'];
|
||
$goodsPriceList[] = $good['goods_price'];
|
||
$goodsNumList[] = $good['goods_num'];
|
||
}
|
||
$item['order_goods_list'] = implode(';', $orderGoodsList);
|
||
$item['goods_item_list'] = implode(';', $goodsItemList);
|
||
$item['goods_price_list'] = implode(';', $goodsPriceList);
|
||
$item['goods_num_list'] = implode(';', $goodsNumList);
|
||
$item['shop_type'] = ShopEnum::getShopTypeDesc($item['shop_type']);
|
||
}
|
||
|
||
$excelFields = [
|
||
'shop_name' => '商家名称',
|
||
'shop_type' => '商家类型',
|
||
'order_sn' => '订单编号',
|
||
'order_type_text' => '订单类型',
|
||
'nickname' => '用户名称',
|
||
'order_goods_list' => '商品信息',
|
||
'goods_item_list' => '规格',
|
||
'goods_price_list' => '商品价格',
|
||
'goods_num_list' => '商品数量',
|
||
'order_amount' => '实付金额',
|
||
'consignee' => '收货人',
|
||
'mobile' => '收货人手机',
|
||
'delivery_address' => '收货地址',
|
||
'pay_status_text' => '支付状态',
|
||
'order_status_text' => '订单状态',
|
||
'create_time' => '下单时间',
|
||
];
|
||
|
||
$export = new ExportExcelServer();
|
||
$export->setFileName('订单');
|
||
$result = $export->createExcel($excelFields, $lists);
|
||
|
||
return ['url' => $result];
|
||
|
||
} catch (\Exception $e) {
|
||
self::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public static function setTeam($post)
|
||
{
|
||
try{
|
||
Order::where([
|
||
['id', 'in', $post['order_ids']]
|
||
])->update([
|
||
'team_id' => $post['team_id']
|
||
]);
|
||
return true;
|
||
}catch(\Exception $e) {
|
||
self::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
} |