478 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			478 lines
		
	
	
		
			17 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['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; | |||
|  |         } | |||
|  |     } | |||
|  | } |