2023-08-10 06:59:52 +00:00
< ? 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' ]];
}
2023-08-16 05:49:32 +00:00
// 前置订单
if ( isset ( $get [ 'is_frontend' ]) && $get [ 'is_frontend' ] != '' ) {
$where [] = [ 'o.is_frontend' , '=' , $get [ 'is_frontend' ]];
}
2023-08-10 06:59:52 +00:00
//订单来源
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' ;
$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' )
-> 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' )
-> 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 [ '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 ;
}
}
}