362 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			362 lines
		
	
	
		
			12 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\integral; | |||
|  | 
 | |||
|  | 
 | |||
|  | use app\common\basics\Logic; | |||
|  | use app\common\enum\IntegralOrderEnum; | |||
|  | use app\common\enum\NoticeEnum; | |||
|  | use app\common\enum\OrderLogEnum; | |||
|  | use app\common\enum\PayEnum; | |||
|  | use app\common\logic\IntegralOrderRefundLogic; | |||
|  | use app\common\logic\OrderLogLogic; | |||
|  | use app\common\model\Express; | |||
|  | use app\common\model\integral\IntegralDelivery; | |||
|  | use app\common\model\integral\IntegralOrder; | |||
|  | use app\common\model\order\Order; | |||
|  | use app\common\server\ConfigServer; | |||
|  | use app\common\server\UrlServer; | |||
|  | use expressage\Kd100; | |||
|  | use expressage\Kdniao; | |||
|  | use think\facade\Db; | |||
|  | 
 | |||
|  | class IntegralOrderLogic extends Logic | |||
|  | { | |||
|  |     /** | |||
|  |      * @notes 兑换订单列表 | |||
|  |      * @param array $get | |||
|  |      * @return array | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author ljj | |||
|  |      * @date 2022/3/3 10:38 上午 | |||
|  |      */ | |||
|  |     public static function lists($get = []) | |||
|  |     { | |||
|  |         $order = new IntegralOrder(); | |||
|  | 
 | |||
|  |         $where = []; | |||
|  |         //列表状态
 | |||
|  |         if (isset($get['status']) && $get['status'] != '') { | |||
|  |             $where[] = ['order_status', '=', $get['status']]; | |||
|  |         } | |||
|  |         //兑换单号
 | |||
|  |         if (isset($get['order_sn']) && $get['order_sn'] != '') { | |||
|  |             $where[] = ['order_sn', 'like', '%' . $get['order_sn'] . '%']; | |||
|  |         } | |||
|  |         //商品名称
 | |||
|  |         if (isset($get['goods_name']) && $get['goods_name'] != '') { | |||
|  |             $where[] = ['goods_snap->name', 'like', '%' . $get['goods_name'] . '%']; | |||
|  |         } | |||
|  |         //兑换类型
 | |||
|  |         if (isset($get['type']) && $get['type'] != '') { | |||
|  |             $where[] = ['exchange_type', '=', intval($get['type'])]; | |||
|  |         } | |||
|  |         //订单状态
 | |||
|  |         if (isset($get['order_status']) && $get['order_status'] != '') { | |||
|  |             $where[] = ['order_status', '=', $get['order_status']]; | |||
|  |         } | |||
|  |         //下单时间
 | |||
|  |         if (isset($get['start_time']) && $get['start_time'] != '') { | |||
|  |             $where[] = ['create_time', '>=', strtotime($get['start_time'])]; | |||
|  |         } | |||
|  |         if (isset($get['end_time']) && $get['end_time'] != '') { | |||
|  |             $where[] = ['create_time', '<=', strtotime($get['end_time'])]; | |||
|  |         } | |||
|  | 
 | |||
|  |         $count = $order->where($where)->count(); | |||
|  | 
 | |||
|  |         $lists = $order | |||
|  |             ->field('*') | |||
|  |             ->with(['user']) | |||
|  |             ->where($where) | |||
|  |             ->append(['pay_status_text', 'delivery_address', 'order_status_desc', 'type_desc']) | |||
|  |             ->page($get['page'], $get['limit']) | |||
|  |             ->order('id', 'desc') | |||
|  |             ->select() | |||
|  |             ->toArray(); | |||
|  | 
 | |||
|  |         foreach ($lists as $key=>&$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['goods_snap']['image'] = UrlServer::getFileUrl($list['goods_snap']['image']); | |||
|  |         } | |||
|  |         return ['count' => $count, 'lists' => $lists]; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 兑换订单详情 | |||
|  |      * @param $id | |||
|  |      * @return array | |||
|  |      * @author ljj | |||
|  |      * @date 2022/3/3 11:10 上午 | |||
|  |      */ | |||
|  |     public static function detail($id) | |||
|  |     { | |||
|  |         $result = (new IntegralOrder()) | |||
|  |             ->with(['user']) | |||
|  |             ->where('id', $id) | |||
|  |             ->append(['delivery_address', 'pay_status_desc', 'order_status_desc','type_desc','pay_way_desc']) | |||
|  |             ->findOrEmpty() | |||
|  |             ->toArray(); | |||
|  | 
 | |||
|  |         $result['pay_time'] = $result['pay_time'] == '0' ? '未支付' : date('Y-m-d H:i:s', $result['pay_time']); | |||
|  |         $result['confirm_time'] = empty($result['confirm_time']) ? '-' : date('Y-m-d H:i:s', $result['confirm_time']); | |||
|  |         $result['user']['avatar'] = UrlServer::getFileUrl($result['user']['avatar']); | |||
|  |         $result['goods_snap']['image'] = UrlServer::getFileUrl($result['goods_snap']['image']); | |||
|  | 
 | |||
|  |         return $result; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 发货详情 | |||
|  |      * @param $id | |||
|  |      * @return array | |||
|  |      * @author ljj | |||
|  |      * @date 2022/3/3 11:48 上午 | |||
|  |      */ | |||
|  |     public static function deliveryDetail($id) | |||
|  |     { | |||
|  |         $result = (new IntegralOrder()) | |||
|  |             ->where('id', $id) | |||
|  |             ->append(['delivery_address']) | |||
|  |             ->findOrEmpty() | |||
|  |             ->toArray(); | |||
|  | 
 | |||
|  |         $result['goods_snap']['image'] = UrlServer::getFileUrl($result['goods_snap']['image']); | |||
|  | 
 | |||
|  |         return $result; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 快递公司列表 | |||
|  |      * @return array|\think\Collection | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author ljj | |||
|  |      * @date 2022/3/3 11:35 上午 | |||
|  |      */ | |||
|  |     public static function express() | |||
|  |     { | |||
|  |         return Express::where('del', 0)->field('id,name')->select()->toArray(); | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 发货操作 | |||
|  |      * @param $post | |||
|  |      * @param $admin_id | |||
|  |      * @author ljj | |||
|  |      * @date 2022/3/3 2:53 下午 | |||
|  |      */ | |||
|  |     public static function deliveryHandle($post, $admin_id) | |||
|  |     { | |||
|  |         Db::startTrans(); | |||
|  |         try { | |||
|  |             $order = IntegralOrder::where(['del'=>0,'id'=>$post['id']])->findOrEmpty()->toArray(); | |||
|  | 
 | |||
|  |             $shipping = Express::where('id',$post['shipping_id'])->findOrEmpty()->toArray(); | |||
|  | 
 | |||
|  |             //添加发货单
 | |||
|  |             $delivery_data = [ | |||
|  |                 'order_id' => $order['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' => 1, | |||
|  |                 'shipping_id' => $post['shipping_id'], | |||
|  |                 'shipping_name' => $shipping['name'], | |||
|  |                 'shipping_status' => 1, | |||
|  |                 'create_time' => time(), | |||
|  |             ]; | |||
|  |             $delivery = IntegralDelivery::create($delivery_data); | |||
|  | 
 | |||
|  |             //更新订单信息
 | |||
|  |             IntegralOrder::update([ | |||
|  |                 'update_time' => time(), | |||
|  |                 'shipping_time' => time(), | |||
|  |                 'shipping_status' => 1, | |||
|  |                 'order_status' => IntegralOrderEnum::ORDER_STATUS_GOODS, | |||
|  |                 'delivery_id' => $delivery->id, | |||
|  |             ],['id'=>$order['id']]); | |||
|  | 
 | |||
|  |             //通知用户发货
 | |||
|  |             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 物流信息 | |||
|  |      * @param $order_id | |||
|  |      * @return array | |||
|  |      * @author ljj | |||
|  |      * @date 2022/3/3 3:31 下午 | |||
|  |      */ | |||
|  |     public static function shippingInfo($order_id) | |||
|  |     { | |||
|  |         $shipping = IntegralDelivery::where('order_id', $order_id)->findOrEmpty()->toArray(); | |||
|  |         $shipping['traces'] = self::getShipping($order_id); | |||
|  |         return $shipping; | |||
|  |     } | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 物流轨迹 | |||
|  |      * @param $order_id | |||
|  |      * @return bool|string[] | |||
|  |      * @author ljj | |||
|  |      * @date 2022/3/3 3:31 下午 | |||
|  |      */ | |||
|  |     public static function getShipping($order_id) | |||
|  |     { | |||
|  |         $order = IntegralOrder::alias('o') | |||
|  |             ->field('invoice_no,shipping_name,shipping_id,o.shipping_status,o.mobile') | |||
|  |             ->join('integral_delivery d', 'd.order_id = o.id') | |||
|  |             ->where(['o.id' => $order_id]) | |||
|  |             ->findOrEmpty() | |||
|  |             ->toArray(); | |||
|  | 
 | |||
|  |         $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 确认收货 | |||
|  |      * @param $order_id | |||
|  |      * @param $admin_id | |||
|  |      * @return bool | |||
|  |      * @author ljj | |||
|  |      * @date 2022/3/3 3:39 下午 | |||
|  |      */ | |||
|  |     public static function confirm($order_id, $admin_id) | |||
|  |     { | |||
|  |         IntegralOrder::update([ | |||
|  |             'order_status' => IntegralOrderEnum::ORDER_STATUS_COMPLETE, | |||
|  |             'update_time' => time(), | |||
|  |             'confirm_time' => time(), | |||
|  |         ],['id'=>$order_id]); | |||
|  | 
 | |||
|  |         return true; | |||
|  |     } | |||
|  | 
 | |||
|  | 
 | |||
|  |     /** | |||
|  |      * @notes 取消订单 | |||
|  |      * @param $id | |||
|  |      * @return bool | |||
|  |      * @throws \think\db\exception\DataNotFoundException | |||
|  |      * @throws \think\db\exception\DbException | |||
|  |      * @throws \think\db\exception\ModelNotFoundException | |||
|  |      * @author 段誉 | |||
|  |      * @date 2022/3/3 18:49 | |||
|  |      */ | |||
|  |     public static function cancel($id) | |||
|  |     { | |||
|  |         Db::startTrans(); | |||
|  |         try { | |||
|  |             $order = IntegralOrder::findOrEmpty($id); | |||
|  | 
 | |||
|  |             // 更新订单状态, 退回库存, 扣减销量
 | |||
|  |             IntegralOrderRefundLogic::cancelOrder($id); | |||
|  | 
 | |||
|  |             // 退回已支付积分
 | |||
|  |             IntegralOrderRefundLogic::refundOrderIntegral($id); | |||
|  | 
 | |||
|  |             // 退回订单已支付积分或已支付金额
 | |||
|  |             if ($order['pay_status'] == PayEnum::ISPAID) { | |||
|  |                 IntegralOrderRefundLogic::refundOrderAmount($id); | |||
|  |             } | |||
|  | 
 | |||
|  |             Db::commit(); | |||
|  |             return true; | |||
|  | 
 | |||
|  |         } catch (\Exception $e) { | |||
|  |             Db::rollback(); | |||
|  |             self::$error = $e->getMessage(); | |||
|  | 
 | |||
|  |             IntegralOrderRefundLogic::addRefundLog( | |||
|  |                 $order, $order['order_amount'], | |||
|  |                 2, $e->getMessage() | |||
|  |             ); | |||
|  |             return false; | |||
|  |         } | |||
|  |     } | |||
|  | } |