471 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			471 lines
		
	
	
		
			16 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\shopapi\logic; | |||
|  | 
 | |||
|  | 
 | |||
|  | use app\common\basics\Logic; | |||
|  | use app\common\enum\NoticeEnum; | |||
|  | use app\common\enum\OrderEnum; | |||
|  | use app\common\enum\OrderLogEnum; | |||
|  | use app\common\enum\PayEnum; | |||
|  | use app\common\enum\TeamEnum; | |||
|  | use app\common\logic\GoodsVirtualLogic; | |||
|  | use app\common\logic\OrderLogLogic; | |||
|  | use app\common\logic\OrderRefundLogic; | |||
|  | use app\common\model\Delivery; | |||
|  | use app\common\model\DevRegion; | |||
|  | use app\common\model\distribution\DistributionOrderGoods; | |||
|  | use app\common\model\Express; | |||
|  | use app\common\model\order\Order; | |||
|  | use app\common\model\team\TeamFound; | |||
|  | use app\common\model\team\TeamJoin; | |||
|  | use think\facade\Db; | |||
|  | 
 | |||
|  | /** | |||
|  |  * 商家移动端订单管理逻辑层 | |||
|  |  * Class OrderLogic | |||
|  |  * @package app\shopapi\logic | |||
|  |  */ | |||
|  | class OrderLogic extends Logic | |||
|  | { | |||
|  |     /** | |||
|  |      * @notes 订单列表 | |||
|  |      * @param $get | |||
|  |      * @param $page_no | |||
|  |      * @param $page_size | |||
|  |      * @param $shop_id | |||
|  |      * @return array | |||
|  |      * @author ljj | |||
|  |      * @date 2021/11/10 3:13 下午 | |||
|  |      */ | |||
|  |     public static function lists($get, $page_no, $page_size, $shop_id) | |||
|  |     { | |||
|  |         $get['type'] = $get['type'] ?? 'all'; | |||
|  |         $where[] = ['o.shop_id', '=', $shop_id]; | |||
|  |         $where[] = ['o.del', '=', 0]; | |||
|  |         $where[] = ['o.delete', '=', 0]; | |||
|  |         //订单状态
 | |||
|  |         if (isset($get['type']) && !empty($get['type'])) { | |||
|  |             switch ($get['type']) { | |||
|  |                 case 'pay': | |||
|  |                     $where[] = ['o.order_status', '=', 0]; | |||
|  |                     break; | |||
|  |                 case 'delivery': | |||
|  |                     $where[] = ['o.order_status', '=', 1]; | |||
|  |                     break; | |||
|  |                 case 'receiving': | |||
|  |                     $where[] = ['o.order_status', '=', 2]; | |||
|  |                     break; | |||
|  |                 case 'finish': | |||
|  |                     $where[] = ['o.order_status', '=', 3]; | |||
|  |                     break; | |||
|  |                 case 'close': | |||
|  |                     $where[] = ['o.order_status', '=', 4]; | |||
|  |                     break; | |||
|  |             } | |||
|  |         } | |||
|  |         //订单商品名称
 | |||
|  |         if (isset($get['goods_name']) && !empty($get['goods_name'])) { | |||
|  |             $where[] = ['og.goods_name', 'like', '%'.$get['goods_name'].'%']; | |||
|  |         } | |||
|  | 
 | |||
|  |         $count = Order::alias('o') | |||
|  |             ->join('order_goods og', 'og.order_id = o.id') | |||
|  |             ->where($where) | |||
|  |             ->group('o.id') | |||
|  |             ->count(); | |||
|  | 
 | |||
|  |         $lists = Order::alias('o') | |||
|  |             ->join('order_goods og', 'og.order_id = o.id') | |||
|  |             ->where($where) | |||
|  |             ->with(['order_goods']) | |||
|  |             ->field('o.id,o.order_sn,o.order_status,o.pay_status,o.shipping_status,o.order_amount,o.create_time,o.delivery_type') | |||
|  |             ->append(['shop_cancel_btn','edit_address_btn','to_ship_btn','take_btn','delivery_btn','del_btn','order_status_text','content_btn']) | |||
|  |             ->page($page_no, $page_size) | |||
|  |             ->order('o.id desc') | |||
|  |             ->group('o.id') | |||
|  |             ->select(); | |||
|  | 
 | |||
|  |         return [ | |||
|  |             'list' => $lists, | |||
|  |             'page' => $page_no, | |||
|  |             'size' => $page_size, | |||
|  |             'count' => $count, | |||
|  |             'more' => is_more($count, $page_no, $page_size) | |||
|  |         ]; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 订单详情 | |||
|  |      * @param $id | |||
|  |      * @return array | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author ljj | |||
|  |      * @date 2021/11/10 4:15 下午 | |||
|  |      */ | |||
|  |     public static function detail($id) | |||
|  |     { | |||
|  |         $result = Order::where('id',$id) | |||
|  |             ->field('id,user_id,order_sn,order_type,order_source,order_status,pay_status,pay_time,shipping_status,pay_way,order_amount,goods_price,shipping_price,discount_amount,member_amount,create_time,consignee,mobile,province,city,district,address,user_remark,delivery_type,delivery_content') | |||
|  |             ->with(['order_goods','user', 'invoice']) | |||
|  |             ->append(['shop_cancel_btn','edit_address_btn','to_ship_btn','take_btn','delivery_btn','del_btn','order_status_text','pay_way_text','delivery_address','order_type_text','order_source_text','pay_status_text']) | |||
|  |             ->find() | |||
|  |             ->toArray(); | |||
|  | 
 | |||
|  |         $result['pay_time'] = $result['pay_time'] ? date('Y-m-d H:i:s', $result['pay_time']) : '-'; | |||
|  | 
 | |||
|  |         // 虚拟商品 发货内容
 | |||
|  |         if ($result['delivery_type'] != OrderEnum::DELIVERY_TYPE_VIRTUAL || $result['shipping_status'] != OrderEnum::SHIPPING_FINISH) { | |||
|  |             $result['delivery_content'] = ''; | |||
|  |         } | |||
|  | 
 | |||
|  |         return $result; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 取消订单 | |||
|  |      * @param $id | |||
|  |      * @param $admin_id | |||
|  |      * @return bool|string | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author ljj | |||
|  |      * @date 2021/11/10 5:06 下午 | |||
|  |      */ | |||
|  |     public static function cancel($id,$admin_id) | |||
|  |     { | |||
|  |         $order = Order::where(['id' => $id], ['orderGoods'])->find()->toArray(); | |||
|  |         Db::startTrans(); | |||
|  |         try { | |||
|  |             // 如果是拼团订单
 | |||
|  |             if ($order['order_type'] == OrderEnum::TEAM_ORDER) { | |||
|  |                 $time = time(); | |||
|  |                 $team_id = (new TeamJoin())->where(['order_id' => $order['id']])->value('team_id'); | |||
|  |                 $teamJoin = (new TeamJoin())->alias('TJ') | |||
|  |                     ->field(['TJ.*,O.order_sn,O.order_status,O.pay_status,O.refund_status,O.order_amount']) | |||
|  |                     ->where(['team_id' => $team_id]) | |||
|  |                     ->join('order O', 'O.id=TJ.order_id') | |||
|  |                     ->select()->toArray(); | |||
|  | 
 | |||
|  |                 TeamFound::update(['status' => TeamEnum::TEAM_STATUS_FAIL, 'team_end_time' => $time], ['id' => $team_id]); | |||
|  |                 foreach ($teamJoin as $item) { | |||
|  |                     TeamJoin::update(['status' => TeamEnum::TEAM_STATUS_FAIL, 'update_time' => $time], ['id' => $item['id']]); | |||
|  |                     OrderRefundLogic::cancelOrder($item['order_id'], OrderLogEnum::TYPE_USER);  //取消订单
 | |||
|  | 
 | |||
|  |                     if ($item['pay_status'] == PayEnum::ISPAID) { | |||
|  |                         $order = (new Order())->findOrEmpty($item['order_id'])->toArray(); | |||
|  |                         OrderRefundLogic::cancelOrderRefundUpdate($order); //更新订单状态
 | |||
|  |                         OrderRefundLogic::refund($order, $order['order_amount'], $order['order_amount']); //订单退款
 | |||
|  |                     } | |||
|  |                 } | |||
|  | 
 | |||
|  | 
 | |||
|  |             } else { | |||
|  | 
 | |||
|  |                 //取消订单
 | |||
|  |                 OrderRefundLogic::cancelOrder($id, OrderLogEnum::TYPE_SHOP, $admin_id); | |||
|  |                 //已支付的订单,取消,退款
 | |||
|  |                 if ($order['pay_status'] == PayEnum::ISPAID) { | |||
|  |                     //更新订单状态
 | |||
|  |                     OrderRefundLogic::cancelOrderRefundUpdate($order); | |||
|  |                     //订单退款
 | |||
|  |                     OrderRefundLogic::refund($order, $order['order_amount'], $order['order_amount']); | |||
|  |                 } | |||
|  |             } | |||
|  | 
 | |||
|  |             // 查找对应的分销订单置为失效状态
 | |||
|  |             if ($order['pay_status'] == PayEnum::ISPAID) { | |||
|  |                 DistributionOrderGoods::where('order_id', $id)->update(['status' => 3]); | |||
|  |             } | |||
|  | 
 | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  | 
 | |||
|  |         } catch (\Exception $e) { | |||
|  |             Db::rollback(); | |||
|  |             //增加退款失败记录
 | |||
|  |             if ($order['pay_status'] == PayEnum::ISPAID) { | |||
|  |                 OrderRefundLogic::addErrorRefund($order, $e->getMessage()); | |||
|  |             } | |||
|  |             return $e->getMessage(); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 删除订单 | |||
|  |      * @param $id | |||
|  |      * @param $admin_id | |||
|  |      * @author ljj | |||
|  |      * @date 2021/11/10 5:37 下午 | |||
|  |      */ | |||
|  |     public static function del($id,$admin_id) | |||
|  |     { | |||
|  |         Order::update(['delete'=>1,'update_time'=>time()], ['id'=>$id]); | |||
|  | 
 | |||
|  |         //订单日志
 | |||
|  |         OrderLogLogic::record( | |||
|  |             OrderLogEnum::TYPE_SHOP, | |||
|  |             OrderLogEnum::SHOP_DEL_ORDER, | |||
|  |             $id, | |||
|  |             $admin_id, | |||
|  |             OrderLogEnum::SHOP_DEL_ORDER | |||
|  |         ); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 修改地址 | |||
|  |      * @param $post | |||
|  |      * @return bool | |||
|  |      * @author ljj | |||
|  |      * @date 2021/11/10 6:35 下午 | |||
|  |      */ | |||
|  |     public static function editAddress($post) | |||
|  |     { | |||
|  |         Order::update( | |||
|  |             [ | |||
|  |                 'consignee'=>$post['consignee'], | |||
|  |                 'province'=>$post['province'], | |||
|  |                 'city'=>$post['city'], | |||
|  |                 'district'=>$post['district'], | |||
|  |                 'address'=>$post['address'], | |||
|  |                 'mobile'=>$post['mobile'], | |||
|  |                 'update_time' => time(), | |||
|  |             ], ['id'=>$post['id']]); | |||
|  | 
 | |||
|  |         return true; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 获取地址详情 | |||
|  |      * @param $id | |||
|  |      * @return array | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author ljj | |||
|  |      * @date 2021/11/13 11:41 上午 | |||
|  |      */ | |||
|  |     public static function getAddress($id) | |||
|  |     { | |||
|  |         $result = Order::where('id',$id) | |||
|  |             ->field('consignee,province,city,district,address,mobile') | |||
|  |             ->find() | |||
|  |             ->toArray(); | |||
|  |         $result['region'] = DevRegion::where('id', 'in', $result['province'].','.$result['city'].','.$result['district'])->order('id','asc')->column('name'); | |||
|  | 
 | |||
|  |         return $result; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 发货 | |||
|  |      * @param $post | |||
|  |      * @param $admin_id | |||
|  |      * @return bool|string | |||
|  |      * @author ljj | |||
|  |      * @date 2021/11/11 10:27 上午 | |||
|  |      */ | |||
|  |     public static function delivery($post, $admin_id) | |||
|  |     { | |||
|  |         Db::startTrans(); | |||
|  |         try { | |||
|  |             $order = Order::where(['id' => $post['id']], ['order_goods'])->find(); | |||
|  | 
 | |||
|  |             if ($order['shipping_status'] == 1) { | |||
|  |                 return true; | |||
|  |             } | |||
|  | 
 | |||
|  | 
 | |||
|  |             //添加发货单
 | |||
|  |             $delivery_data = [ | |||
|  |                 'order_id' => $post['id'], | |||
|  |                 'order_sn' => $order['order_sn'], | |||
|  |                 'user_id' => $order['user_id'], | |||
|  |                 'admin_id' => $admin_id, | |||
|  |                 'consignee' => $order['consignee'], | |||
|  |                 'mobile' => $order['mobile'], | |||
|  |                 'province' => $order['province'], | |||
|  |                 'city' => $order['city'], | |||
|  |                 'district' => $order['district'], | |||
|  |                 'address' => $order['address'], | |||
|  |                 'invoice_no' => $post['invoice_no'] ?? '', | |||
|  |                 'send_type' => $post['send_type'], | |||
|  |                 'create_time' => time(), | |||
|  |             ]; | |||
|  |             //配送方式->快递配送
 | |||
|  |             if ($post['send_type'] == 1) { | |||
|  |                 $shipping = Express::where('id', $post['shipping_id'])->find(); | |||
|  |                 $delivery_data['shipping_id'] = $post['shipping_id']; | |||
|  |                 $delivery_data['shipping_name'] = $shipping['name']; | |||
|  |                 $delivery_data['shipping_status'] = 1; | |||
|  |             } | |||
|  |             $delivery = Delivery::create($delivery_data); | |||
|  | 
 | |||
|  | 
 | |||
|  |             //更新订单下商品的发货状态
 | |||
|  |             $order->update_time = time(); | |||
|  |             $order->shipping_time = time(); | |||
|  |             $order->shipping_status = 1; | |||
|  |             $order->order_status = Order::STATUS_WAIT_RECEIVE; | |||
|  |             $order->delivery_id = $delivery->id; | |||
|  |             $order->save(); | |||
|  | 
 | |||
|  |             //订单日志
 | |||
|  |             OrderLogLogic::record( | |||
|  |                 OrderLogEnum::TYPE_SHOP, | |||
|  |                 OrderLogEnum::SHOP_DELIVERY_ORDER, | |||
|  |                 $post['id'], | |||
|  |                 $admin_id, | |||
|  |                 OrderLogEnum::SHOP_DELIVERY_ORDER | |||
|  |             ); | |||
|  | 
 | |||
|  |             //通知用户发货
 | |||
|  |             if (!empty($order['mobile'])) { | |||
|  |                 event('Notice', [ | |||
|  |                     'scene' => NoticeEnum::ORDER_DELIVERY_NOTICE, | |||
|  |                     'mobile' => $order['mobile'], | |||
|  |                     'params' => [ | |||
|  |                         'order_id' => $order['id'], | |||
|  |                         'user_id' => $order['user_id'], | |||
|  |                         'shipping_name' => $delivery_data['shipping_name'] ?? '无需快递', | |||
|  |                         'invoice_no' => $post['invoice_no'] ?? '', | |||
|  |                     ] | |||
|  |                 ]); | |||
|  |             } | |||
|  | 
 | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  |         } catch (\Exception $e) { | |||
|  |             Db::rollback(); | |||
|  |             return $e->getMessage(); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 获取物流公司列表 | |||
|  |      * @return array | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author ljj | |||
|  |      * @date 2021/11/13 11:46 上午 | |||
|  |      */ | |||
|  |     public static function getExpress() | |||
|  |     { | |||
|  |         return Express::where('del',0)->field('id,name')->select()->toArray(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 确认收货 | |||
|  |      * @param $id | |||
|  |      * @param $admin_id | |||
|  |      * @author ljj | |||
|  |      * @date 2021/11/11 10:55 上午 | |||
|  |      */ | |||
|  |     public static function confirm($id, $admin_id) | |||
|  |     { | |||
|  |         Order::update( | |||
|  |             [ | |||
|  |                 'order_status' => Order::STATUS_FINISH, | |||
|  |                 'confirm_take_time' => time(), | |||
|  |                 'update_time' => time(), | |||
|  |             ], ['id'=>$id]); | |||
|  | 
 | |||
|  |         //订单日志
 | |||
|  |         OrderLogLogic::record( | |||
|  |             OrderLogEnum::TYPE_SHOP, | |||
|  |             OrderLogEnum::SHOP_CONFIRM_ORDER, | |||
|  |             $id, | |||
|  |             $admin_id, | |||
|  |             OrderLogEnum::SHOP_CONFIRM_ORDER | |||
|  |         ); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 查看物流 | |||
|  |      * @param $id | |||
|  |      * @return array | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author ljj | |||
|  |      * @date 2021/11/11 11:34 上午 | |||
|  |      */ | |||
|  |     public static function logistics($id) | |||
|  |     { | |||
|  |         return Delivery::where('order_id',$id) | |||
|  |             ->field('shipping_name,invoice_no') | |||
|  |             ->find() | |||
|  |             ->toArray(); | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 虚拟发货 | |||
|  |      * @param $post | |||
|  |      * @param $admin_id | |||
|  |      * @return bool | |||
|  |      * @author 段誉 | |||
|  |      * @date 2022/4/20 17:56 | |||
|  |      */ | |||
|  |     public static function virtualDelivery($post, $admin_id) | |||
|  |     { | |||
|  |         try { | |||
|  |             $order_id = $post['order_id']; | |||
|  |             $order = Order::with(['order_goods'])->where(['del' => 0, 'id' => $order_id])->find(); | |||
|  | 
 | |||
|  |             // 更新发货订单信息
 | |||
|  |             $result = GoodsVirtualLogic::shopSelfDelivery($order_id,  $post['delivery_content']); | |||
|  |             if (true !== $result) { | |||
|  |                 throw new \Exception($result); | |||
|  |             } | |||
|  | 
 | |||
|  |             //订单日志
 | |||
|  |             OrderLogLogic::record( | |||
|  |                 OrderLogEnum::TYPE_SHOP, | |||
|  |                 OrderLogEnum::SHOP_DELIVERY_ORDER, | |||
|  |                 $order_id, | |||
|  |                 $admin_id, | |||
|  |                 OrderLogEnum::SHOP_DELIVERY_ORDER | |||
|  |             ); | |||
|  | 
 | |||
|  |             //通知用户发货
 | |||
|  |             if (!empty($order['mobile'])) { | |||
|  |                 event('Notice', [ | |||
|  |                     'scene' => NoticeEnum::ORDER_DELIVERY_NOTICE, | |||
|  |                     'mobile' => $order['mobile'], | |||
|  |                     'params' => [ | |||
|  |                         'order_id' => $order['id'], | |||
|  |                         'user_id' => $order['user_id'], | |||
|  |                         'shipping_name' => '无需快递', | |||
|  |                         'invoice_no' => '', | |||
|  |                     ] | |||
|  |                 ]); | |||
|  |             } | |||
|  | 
 | |||
|  |             return true; | |||
|  |         } catch (\Exception $e) { | |||
|  |             self::$error = $e->getMessage(); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | } |