=', 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) ->leftJoin ('shop s', 's.id = o.shop_id') ->leftJoin ('user u', 'u.id = o.user_id') ->with(['order_goods', 'user']) ->where($where) ->group('o.id') ->count(); $lists = $order ->alias('o') ->field($field) ->leftJoin('shop s', 's.id = o.shop_id') ->leftJoin('user u', 'u.id = o.user_id') ->with(['order_goods', 'user']) ->where($where) ->append(['delivery_address', 'pay_status_text', 'order_source_text']) ->page($page, $limit) ->order('o.id desc') ->group('o.id') ->select()->toArray(); $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']); foreach ($list['order_goods'] as $order_good) { $order_good['image'] = UrlServer::getFileUrl($order_good['image']); } if ($list['order_type'] == OrderEnum::TEAM_ORDER) { $team = TeamJoin::field('TJ.status,TF.status as found_status')->alias('TJ') ->where(['TJ.order_id'=>$list['id']]) ->join('team_found TF', 'TF.id = TJ.team_id') ->findOrEmpty()->toArray(); $list['is_team_success'] = false; if ($team) { $list['is_team_success'] = $team['found_status'] == 1 ? true : false; } } // 会员等级 $list['user_level'] = '暂无等级'; if(isset($user_level[$list['level']])) { $list['user_level'] = $user_level[$list['level']]; } } return ['count' => $count, 'lists' => $lists]; } public static function totalCount($shopId) { $all = Order::where(['shop_id' => $shopId, 'del' => 0, 'delete' => 0])->count(); $waitPay = Order::where(['shop_id' => $shopId, 'order_status' => 0 , 'del' => 0, 'delete' => 0])->count(); $waitDelivery = Order::where(['shop_id' => $shopId, 'order_status' => 1 , 'del' => 0, 'delete' => 0])->count(); $waitReceipt = Order::where(['shop_id' => $shopId, 'order_status' => 2 , 'del' => 0, 'delete' => 0])->count(); $waitComplete = Order::where(['shop_id' => $shopId, 'order_status' => 3 , 'del' => 0, 'delete' => 0])->count(); $waitClose = Order::where(['shop_id' => $shopId, 'order_status' => 4 , 'del' => 0, 'delete' => 0])->count(); return [ 'all' => $all, 'wait_pay' => $waitPay, 'wait_delivery' => $waitDelivery, 'wait_receipt' => $waitReceipt, 'wait_complete' => $waitComplete, 'wait_close' => $waitClose, ]; } /** * @notes 订单详情 * @param $id * @return array|Model|null * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author suny * @date 2021/7/14 10:23 上午 */ 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']); $user = $result['user']; $user['avatar'] = UrlServer::getFileUrl($user['avatar']); $result['user'] = $user; 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']); } if ($result['order_type'] == OrderEnum::TEAM_ORDER) { $team = TeamJoin::field('TJ.status,TF.status as found_status')->alias('TJ') ->where(['TJ.order_id'=>$result['id']]) ->join('team_found TF', 'TF.id = TJ.team_id') ->findOrEmpty()->toArray(); $result['is_team_success'] = false; if ($team) { $result['is_team_success'] = $team['found_status'] == 1 ? true : false; } } return $result; } /** * @notes 物流信息 * @param $order_id * @return array|\PDOStatement|string|Model|null * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException * @author suny * @date 2021/7/14 10:24 上午 */ 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:24 上午 */ 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:24 上午 */ public static function express() { return Express::where('del', 0)->select(); } /** * @notes 发货操作 * @param $data * @param $admin_id * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException * @author suny * @date 2021/7/14 10:24 上午 */ public static function deliveryHandle($data, $admin_id) { $order_id = $data['order_id']; $order = Order::where(['del' => 0, 'id' => $order_id], ['order_goods'])->find(); if ($order['shipping_status'] == 1) { return true; } $shipping = Db::name('express')->where('id', $data['shipping_id'])->find(); //添加发货单 $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' => $data['invoice_no'], 'send_type' => $data['send_type'], 'create_time' => time(), ]; //配送方式->快递配送 if ($data['send_type'] == 1) { $delivery_data['shipping_id'] = $data['shipping_id']; $delivery_data['shipping_name'] = $shipping['name']; $delivery_data['shipping_status'] = 1; } $delivery_id = Db::name('delivery')->insertGetId($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, $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' => $delivery_data['shipping_name'] ?? '无需快递', 'invoice_no' => $data['invoice_no'] ?? '', ] ]); } } /** * @notes 判断是否可以发货 * @param $post * @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:24 上午 */ public static function checkDelivery($post) { $id = $post['order_id']; $order = Order::where(['id' => $id])->find(); if (!$order) { return '订单失效'; } if ($order['del'] == 1) { return '订单已删除'; } if ($order['shipping_status'] == 1) { return '此订单已发货'; } if ($order['order_type'] == OrderEnum::TEAM_ORDER) { $found = TeamJoin::where(['id' => $order['team_found_id']])->find(); if ($found['status'] != Team::STATUS_SUCCESS) { return '已支付的拼团订单需要等待拼团成功后才能发货'; } } return true; } /** * @notes 判断是否可以取消订单 * @param $post * @return bool|string * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException * @author suny * @date 2021/7/14 10:24 上午 */ public static function checkCancel($post) { $id = $post['order_id']; $order = Order::where(['id' => $id, 'del' => 0])->find(); if (!$order) { return '订单失效'; } if ($order['order_status'] > OrderEnum::ORDER_STATUS_DELIVERY) { return '此订单不可取消'; } if ($order['order_type'] == OrderEnum::TEAM_ORDER) { $found = Db::name('team_found')->where(['id' => $order['team_found_id']])->find(); if ($found['status'] == Team::STATUS_WAIT_SUCCESS) { return '已支付的拼团订单需要有拼团结果才可以取消'; } } return true; } /** * @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:24 上午 */ public static function cancel($order_id, $admin_id) { Db::startTrans(); try { $order = Order::where(['id' => $order_id], ['orderGoods'])->find(); // 如果是拼团订单 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_SHOP, $admin_id); //取消订单 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($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 判断是否可以删除订单 * @param $post * @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:24 上午 */ public static function checkDel($post) { $id = $post['order_id']; $order = Order::where(['id' => $id])->find(); if (!$order) { return '订单失效'; } if ($order['del'] == 1) { return '订单已删除'; } if ($order['order_status'] != OrderEnum::ORDER_STATUS_DOWN) { return '此订单不可删除'; } return true; } /** * @notes 删除已取消的订单 * @param $order_id * @param $admin_id * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author suny * @date 2021/7/14 10:24 上午 */ public static function del($order_id, $admin_id) { $order = Order::where(['delete' => 0, 'id' => $order_id])->find(); $order->save(['delete' => 1, 'update_time' => time()]); //订单日志 OrderLogLogic::record( OrderLogEnum::TYPE_SHOP, OrderLogEnum::SHOP_DEL_ORDER, $order_id, $admin_id, OrderLogEnum::SHOP_DEL_ORDER ); } /** * @notes 确认收货 * @param $order_id * @param $admin_id * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author suny * @date 2021/7/14 10:25 上午 */ public static function confirm($order_id, $admin_id) { $order = Order::where(['del' => 0, 'id' => $order_id])->find(); $order->order_status = Order::STATUS_FINISH; $order->update_time = time(); $order->confirm_take_time = time(); $order->save(); //订单日志 OrderLogLogic::record( OrderLogEnum::TYPE_SHOP, OrderLogEnum::SHOP_CONFIRM_ORDER, $order_id, $admin_id, OrderLogEnum::SHOP_CONFIRM_ORDER ); } /** * @notes 订单备注 * @param $post * @param string $type * @return Order|array|Model * @author suny * @date 2021/7/14 10:25 上午 */ public static function remarks($post, $type = "get") { if ($type === 'get') { return Order::field('id,order_remarks') ->where(['id' => $post['id']]) ->findOrEmpty(); } else { return Order::where(['id' => $post['id']]) ->update(['order_remarks' => $post['order_remarks']]); } } /** * @notes 打印订单 * @param $id * @param $shop_id * @return string|void * @author 段誉 * @date 2022/1/20 11:24 */ public static function orderPrint($id, $shop_id) { try { //打印机配置 $config = PrinterConfig::where(['status' => 1, 'shop_id' => $shop_id])->findOrEmpty(); //打印机列表 $printers = Printer::where([ 'shop_id' => $shop_id, 'config_id' => $config['id'], 'del' => 0, 'status' => 1 ])->select()->toArray(); if ($config->isEmpty() || empty($printers)) { throw new Exception('请先配置打印机'); } // 订单信息 $order = self::getPrintOrder($id); $yly_print = new YlyPrinter($config['client_id'], $config['client_secret'], $shop_id); // 模板 $template = PrinterLogic::getPrinterTpl($shop_id); $yly_print->ylyPrint($printers, $order, $template); return true; } catch (\Exception $e) { $msg = json_decode($e->getMessage(), true); if ($msg && isset($msg['error'])) { return '易联云:' . $msg['error_description']; } if (18 === $e->getCode()) { Cache::rm('yly_access_token' . $shop_id); Cache::rm('yly_refresh_token' . $shop_id); } return '易联云:' . $e->getMessage(); } } /** * @notes 获取打印订单 * @param $id * @return array * @author 段誉 * @date 2022/1/21 9:58 */ public static function getPrintOrder($id) { return (new Order()) ->with(['user', 'order_goods']) ->where('id', $id) ->append(['delivery_address']) ->findOrEmpty()->toArray(); } /** * @notes 获取地址 * @param $post * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author suny * @date 2021/7/14 10:25 上午 */ public static function change_address($post) { $order = new Order(); $info = $order->where(['id' => $post['id']]) ->field(['id', 'province', 'city', 'district', 'address','consignee','mobile']) ->find()->toArray(); $info = json_encode($info, JSON_UNESCAPED_UNICODE); $address_tree = json_encode(self::getAddressTree(), JSON_UNESCAPED_UNICODE); $data = [ 'info' => $info, 'address_tree' => $address_tree ]; return $data; } /** * @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:25 上午 */ public static function getAddressTree() { $DevRegion = new DevRegion(); $lists = $DevRegion ->field(['name', 'id', 'parent_id', 'level']) ->where('level', '>', 0) ->select(); return $lists; } /** * @notes 修改地址 * @param $post * @author suny * @date 2021/7/14 10:27 上午 */ public static function change_address_post($post) { $order = new Order(); $data = [ 'province' => $post['province'], 'city' => $post['city'], 'district' => $post['district'], 'address' => $post['address'], 'consignee' => $post['consignee'], 'mobile' => $post['mobile'], ]; $order->where(['id' => $post['order_id']])->update($data); } /** * @notes 获取各列表数量 * @param $shop_id * @return int * @author suny * @date 2021/7/14 10:27 上午 */ public static function getAll($shop_id) { $all = Order::where(['shop_id' => $shop_id, 'del' => 0, 'delete' => 0])->count('id'); return $all; } /** * @notes 拼装统计信息 * @param $order_status * @return array * @author suny * @date 2021/7/13 3:36 下午 */ public static function getStat($order_status, $shop_id) { foreach ($order_status as $key => $value) { $num = Order::where(['order_status' => $key, 'shop_id' => $shop_id, 'del' => 0, 'delete' => 0])->count('id'); $stat = $value . "(" . $num . ")"; $data[] = $stat; } return $data; } /** * @notes 虚拟商品发货 * @param $post * @param $admin_id * @return bool|void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException * @author 段誉 * @date 2022/4/7 17:55 */ 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; } } /** * @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'; $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); } $excelFields = [ '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; } } }