getUserId(); if (!$user_id) { return $this->renderError('请先登录'); } $product_id = $this->request->param('product_id', 0); $address_id = $this->request->param('address_id', 0); $coupon_id = $this->request->param('coupon_id', 0); // $total_price = $this->request->param('total_price', 0); if (empty($product_id) || empty($address_id)) { return $this->renderError('缺少必要参数'); } $product = FFProducts::where('id', $product_id)->find(); if (!$product) { return $this->renderError('商品不存在'); } $address = UserAddress::where('id', $address_id)->find(); if (!$address) { return $this->renderError('地址不存在'); } $coupon = null; if ($coupon_id > 0) { $coupon = CouponReceive::where('id', $coupon_id)->find(); if (!$coupon) { return $this->renderError('优惠券不存在'); } } //$user, $price, $title, $attach, $pre = "MH_", $pay_type = 1, $client = null $total_price = $product['price']; if ($coupon) { $total_price = $total_price - $coupon['price']; } $user = $this->getUser(); $payRes = PlatformFactory::createPay($user, $total_price, $product['product_name'], 'order_product', 'YS_', 1); if ($payRes['status'] !== 1) { return $this->renderError("购买失败,请稍后再试"); } //使用优惠卷 if ($coupon) { $coupon['status'] = 1; $coupon->save(); } # 订单号 $order_num = $payRes['data']['order_no']; $receiver_name = $address['receiver_name']; $receiver_phone = $address['receiver_phone']; $receiver_address = $address['detailed_address']; # 保存到ff_orders 表 $orderData = [ 'order_no' => $order_num, 'user_id' => $user_id, 'product_id' => $product_id, 'total_amount' => $product['price'], 'payment_amount' => $total_price, 'discount_amount' => $coupon ? $coupon['price'] : 0, 'payment_type' => 1, // 假设这里是微信支付 'order_status' => 0, // 待支付 'pay_status' => 0, // 未支付 'shipping_status' => 0, // 未发货 'receiver_name' => $receiver_name, 'receiver_phone' => $receiver_phone, 'receiver_address' => $receiver_address, 'source' => 2, // APP来源 'create_time' => date('Y-m-d H:i:s') ]; // 将该用户的所有未支付订单状态变成已取消 \app\common\model\FFOrders::where([ 'user_id' => $user_id, 'order_status' => 0, // 待支付 'pay_status' => 0 // 未支付 ])->update([ 'order_status' => 5, // 已取消 'cancel_time' => date('Y-m-d H:i:s') // 取消时间 ]); // 创建订单 $order = new \app\common\model\FFOrders(); $result = $order->save($orderData); if (!$result) { return $this->renderError('订单创建失败'); } return $this->renderSuccess('订单创建成功', [ 'order_no' => $order_num, 'user_info' => ['is_test' => $user['istest']], 'payment_data' => $payRes['data']['res'] ]); } public function orderPaySuccess() { $order_no = $this->request->param('order_no', ''); if (empty($order_no)) { return $this->renderError('订单号不能为空'); } // 根据订单号查询订单 $order = \app\common\model\FFOrders::where('order_no', $order_no)->find(); if (!$order) { return $this->renderError('订单不存在'); } // 判断订单状态,避免重复处理 if ($order['pay_status'] == 2) { return $this->renderSuccess('订单已支付', ['order_no' => $order_no]); } // 查询订单对应的商品信息 $product_id = $order['product_id']; $product = FFProducts::where('id', $product_id)->find(); if (!$product) { return $this->renderError('商品不存在'); } // 开启事务 \think\facade\Db::startTrans(); try { // 扣减库存 if ($product['stock'] > 0) { $product->sales = $product['sales'] - 1; // 增加销量 $product->save(); } else { throw new \Exception('商品库存不足'); } // 更新订单状态 $order->order_status = 2; // 已支付待发货 $order->pay_status = 2; // 已支付 $order->shipping_status = 1; // 未发货 $order->shipping_company = '京东快递'; // 快递公司 $order->shipping_no = "TEST_" . time();//TEST_开头 $order->shipping_time = date('Y-m-d H:i:s'); // 发货时间 $order->payment_time = date('Y-m-d H:i:s'); // 支付时间 $order->payment_no = $this->request->param('payment_no', ''); // 支付流水号 // 保存订单 if (!$order->save()) { throw new \Exception('订单状态更新失败'); } // 提交事务 \think\facade\Db::commit(); return $this->renderSuccess('购买成功', [ 'order_no' => $order_no, 'order_status' => $order->order_status, 'pay_status' => $order->pay_status ]); } catch (\Exception $e) { // 回滚事务 \think\facade\Db::rollback(); return $this->renderError('支付处理失败:' . $e->getMessage()); } } /** * 获取订单列表 * @return \think\Response */ public function getOrderList() { $user_id = $this->getUserId(); if (!$user_id) { return $this->renderError('请先登录'); } // 接收参数 $status = $this->request->param('status', 0); // 订单状态,0表示全部 $keyword = $this->request->param('keyword', ''); // 商品标题搜索关键词 $page = (int) $this->request->param('page', 1); $limit = (int) $this->request->param('limit', 10); // 构建查询条件 $where = [ 'user_id' => $user_id, 'delete_status' => 0 ]; // 初始化查询对象 $query = \app\common\model\FFOrders::alias('o'); // 根据状态筛选 if ($status > 0) { if ($status == 4) { // 当status为4时,查询状态为6和7的订单(申请售后和退款售后成功) $query = $query->where($where) ->where('o.order_status', 'in', [6, 7]); } else { // 其他状态正常查询 $query = $query->where($where) ->where('o.order_status', $status); } } else { // status为0时查询所有订单 $query = $query->where($where); } // 如果有搜索关键词,则需要联表查询 if (!empty($keyword)) { // 通过product_id关联FFProducts表 $query = $query->join('ff_products p', 'o.product_id = p.id') ->where('p.product_name', 'like', "%{$keyword}%"); } // 排序方式 - 最新订单在前 $query = $query->order('o.create_time desc'); // 分页查询 $count = $query->count(); $list = $query->page($page, $limit)->select(); // 处理结果 $result = []; foreach ($list as $order) { // 获取商品信息 $product = \app\common\model\FFProducts::where('id', $order['product_id'])->find(); $item = [ 'order_id' => $order['order_id'], 'order_no' => $order['order_no'], 'product_id' => $product ? $product['id'] : '', // 'product_cover' => $product ? $product['cover_image'] : '', // 商品封面图 'product_title' => $product ? $product['product_name'] : '', // 商品标题 'payment_amount' => $order['payment_amount'], // 支付金额 'payment_time' => $order['payment_time'] ?: '', // 支付时间 'order_status' => $order['order_status'], // 订单状态 'order_status_text' => $this->getOrderStatusText($order['order_status']), // 订单状态文本 'create_time' => $order['create_time'], // 创建时间 'receive_time' => $order['receive_time'] ?: '', // 收货时间 'is_invoice' => $order['invoice_title'] == '' ? 0 : 1, // 是否开票 ]; $result[] = $item; } return $this->renderSuccess('获取成功', [ 'total' => $count, 'page' => $page, 'limit' => $limit, 'list' => $result ]); } /** * 获取订单状态文本 * @param int $status 订单状态 * @return string 状态文本 */ private function getOrderStatusText($status) { $statusArr = [ 0 => '待支付', 1 => '已支付待发货', 2 => '已发货', 3 => '已完成', 4 => '已关闭', 5 => '已取消', 6 => '申请售后', 7 => '售后结束' ]; return isset($statusArr[$status]) ? $statusArr[$status] : '未知状态'; } /** * 订单收货接口 * @return \think\Response */ public function orderReceive() { $user_id = $this->getUserId(); if (!$user_id) { return $this->renderError('请先登录'); } // 接收订单编号参数 $order_no = $this->request->param('order_no', ''); if (empty($order_no)) { return $this->renderError('订单编号不能为空'); } // 查询订单 $order = \app\common\model\FFOrders::where([ 'order_no' => $order_no, 'user_id' => $user_id ])->find(); if (!$order) { return $this->renderError('订单不存在或不属于当前用户'); } // 判断订单状态是否为已发货 if ($order['order_status'] != 2) { return $this->renderError('只有已发货的订单才能确认收货'); } // 更新订单状态和收货时间 $order->order_status = 3; // 已完成 $order->receive_time = date('Y-m-d H:i:s'); // 收货时间 // 保存订单 if ($order->save()) { return $this->renderSuccess('确认收货成功', [ 'order_no' => $order_no, 'order_status' => $order->order_status, 'order_status_text' => $this->getOrderStatusText($order->order_status), 'receive_time' => $order->receive_time ]); } else { return $this->renderError('确认收货失败'); } } /** * 申请售后接口 * @return \think\Response */ public function applyRefund() { $user_id = $this->getUserId(); if (!$user_id) { return $this->renderError('请先登录'); } // 接收参数 $order_no = $this->request->param('order_no', ''); $extend_info = $this->request->param('extend_info', ''); if (empty($order_no)) { return $this->renderError('订单编号不能为空'); } // 查询订单 $order = \app\common\model\FFOrders::where([ 'order_no' => $order_no, 'user_id' => $user_id ])->find(); if (!$order) { return $this->renderError('订单不存在或不属于当前用户'); } // 判断订单状态是否可申请售后 if ($order['order_status'] == 0 || $order['order_status'] == 4 || $order['order_status'] == 5 || $order['order_status'] == 6 || $order['order_status'] == 7) { return $this->renderError('当前订单状态不可申请售后'); } try { // 将当前订单状态保存到扩展信息中 $extendData = json_decode($extend_info, true) ?: []; $extendData['original_status'] = $order['order_status']; // 更新订单状态和扩展信息 $order->order_status = 6; // 申请退款 $order->extend_info = json_encode($extendData); // 保存订单 if ($order->save()) { return $this->renderSuccess('申请售后成功', [ 'order_no' => $order_no, 'order_status' => $order->order_status, 'order_status_text' => $this->getOrderStatusText($order->order_status) ]); } else { return $this->renderError('申请售后失败'); } } catch (\Exception $e) { return $this->renderError('申请售后失败:' . $e->getMessage()); } } /** * 取消售后接口 * @return \think\Response */ public function cancelRefund() { $user_id = $this->getUserId(); if (!$user_id) { return $this->renderError('请先登录'); } // 接收参数 $order_no = $this->request->param('order_no', ''); if (empty($order_no)) { return $this->renderError('订单编号不能为空'); } // 查询订单 $order = \app\common\model\FFOrders::where([ 'order_no' => $order_no, 'user_id' => $user_id ])->find(); if (!$order) { return $this->renderError('订单不存在或不属于当前用户'); } // 判断订单状态是否为申请退款 if ($order['order_status'] != 6) { return $this->renderError('只有申请退款状态的订单才能取消售后'); } try { // 从扩展信息中读取原始状态 $extendInfo = $order['extend_info'] ? json_decode($order['extend_info'], true) : []; $originalStatus = isset($extendInfo['original_status']) ? $extendInfo['original_status'] : 3; // 默认为已完成 // 移除原始状态信息 if (isset($extendInfo['original_status'])) { unset($extendInfo['original_status']); } // 更新订单状态和扩展信息 $order->order_status = $originalStatus; $order->extend_info = !empty($extendInfo) ? json_encode($extendInfo) : ''; // 保存订单 if ($order->save()) { return $this->renderSuccess('取消售后成功', [ 'order_no' => $order_no, 'order_status' => $order->order_status, 'order_status_text' => $this->getOrderStatusText($order->order_status) ]); } else { return $this->renderError('取消售后失败'); } } catch (\Exception $e) { return $this->renderError('取消售后失败:' . $e->getMessage()); } } /** * 删除订单接口 * @return \think\Response */ public function deleteOrder() { $user_id = $this->getUserId(); if (!$user_id) { return $this->renderError('请先登录'); } // 接收订单编号参数 $order_no = $this->request->param('order_no', ''); if (empty($order_no)) { return $this->renderError('订单编号不能为空'); } // 查询订单 $order = \app\common\model\FFOrders::where([ 'order_no' => $order_no, 'user_id' => $user_id, 'delete_status' => 0 // 未删除的订单 ])->find(); if (!$order) { return $this->renderError('订单不存在或不属于当前用户'); } // 判断订单状态是否可删除 // 通常只有已完成(3)、已关闭(4)、已取消(5)、退款成功(7)的订单可以删除 $allowDeleteStatus = [3, 4, 5, 7]; if (!in_array($order['order_status'], $allowDeleteStatus)) { return $this->renderError('当前订单状态不允许删除'); } try { // 更新订单删除状态 $order->delete_status = 1; // 标记为已删除 // 保存订单 if ($order->save()) { return $this->renderSuccess('订单删除成功'); } else { return $this->renderError('订单删除失败'); } } catch (\Exception $e) { return $this->renderError('订单删除失败:' . $e->getMessage()); } } /** * 获取订单详情接口 * @return \think\Response */ public function getOrderDetail() { $user_id = $this->getUserId(); if (!$user_id) { return $this->renderError('请先登录'); } // 接收订单编号参数 $order_no = $this->request->param('order_no', ''); if (empty($order_no)) { return $this->renderError('订单编号不能为空'); } // 查询订单 $order = \app\common\model\FFOrders::where([ 'order_no' => $order_no, 'user_id' => $user_id, 'delete_status' => 0 // 未删除的订单 ])->find(); if (!$order) { return $this->renderError('订单不存在或不属于当前用户'); } // 查询关联商品 $product = \app\common\model\FFProducts::where('id', $order['product_id'])->find(); // 组装订单详情数据 $orderDetail = [ // 商品信息 'product_id' => $product ? $product['id'] : '', 'product_cover' => $product ? $product['cover_image'] : '', 'product_title' => $product ? $product['product_name'] : '', 'product_price' => $product ? $product['price'] : 0.00, // 订单信息 'order_id' => $order['order_id'], 'order_no' => $order['order_no'], 'total_amount' => $order['total_amount'], // 订单总金额 'payment_amount' => $order['payment_amount'], // 实际支付金额 'discount_amount' => $order['discount_amount'], // 优惠金额 'shipping_fee' => $order['shipping_fee'], // 运费 'order_status' => $order['order_status'], 'order_status_text' => $this->getOrderStatusText($order['order_status']), 'pay_status' => $order['pay_status'], 'payment_type' => $order['payment_type'], // 支付方式 // 物流信息 'shipping_company' => $order['shipping_company'] ?: '', 'shipping_no' => $order['shipping_no'] ?: '', 'create_time' => $order['create_time'], // 下单时间 'shipping_time' => $order['shipping_time'] ?: '', // 发货时间 'receive_time' => $order['receive_time'] ?: '', // 收货时间 'payment_time' => $order['payment_time'] ?: '', // 支付时间 // 收货人信息 'receiver_name' => $order['receiver_name'], 'receiver_phone' => $order['receiver_phone'], 'receiver_address' => $order['receiver_address'], // 发票信息 'invoice_title' => $order['invoice_title'] ?: '', 'invoice_content' => $order['invoice_content'] ?: '', 'invoice_type' => $order['invoice_type'], 'invoice_type_text' => $order['invoice_type'] == 1 ? '个人' : ($order['invoice_type'] == 2 ? '企业' : ''), // 扩展信息 'extend_info' => $order['extend_info'] ? json_decode($order['extend_info'], true) : [] ]; return $this->renderSuccess('获取成功', $orderDetail); } /** * 申请发票接口 * @return \think\Response */ public function applyInvoice() { $user_id = $this->getUserId(); if (!$user_id) { return $this->renderError('请先登录'); } // 接收参数 $order_no = $this->request->param('order_no', ''); $invoice_title = $this->request->param('invoice_title', ''); $invoice_content = $this->request->param('invoice_content', ''); $invoice_type = (int) $this->request->param('invoice_type', 1); // 默认个人 $user_email = $this->request->param('user_email', ''); // 用户邮箱,不存储 // 参数验证 if (empty($order_no)) { return $this->renderError('订单编号不能为空'); } if (empty($invoice_title)) { return $this->renderError('发票抬头不能为空'); } if (empty($invoice_content)) { return $this->renderError('发票内容不能为空'); } if (!in_array($invoice_type, [1, 2])) { return $this->renderError('发票类型不正确'); } if (empty($user_email)) { return $this->renderError('用户邮箱不能为空'); } // 邮箱格式验证 if (!filter_var($user_email, FILTER_VALIDATE_EMAIL)) { return $this->renderError('邮箱格式不正确'); } // 查询订单 $order = \app\common\model\FFOrders::where([ 'order_no' => $order_no, 'user_id' => $user_id, 'delete_status' => 0 // 未删除的订单 ])->find(); if (!$order) { return $this->renderError('订单不存在或不属于当前用户'); } // 验证订单状态,通常只有已支付的订单才能申请发票 if ($order['pay_status'] != 2) { // 2表示已支付 return $this->renderError('只有已支付的订单才能申请发票'); } try { // 更新订单发票信息 $order->invoice_title = $invoice_title; $order->invoice_content = $invoice_content; $order->invoice_type = $invoice_type; // 保存订单 if ($order->save()) { return $this->renderSuccess('发票申请成功', true); } else { return $this->renderError('发票申请失败'); } } catch (\Exception $e) { return $this->renderError('发票申请失败:' . $e->getMessage()); } } /** * 获取用户订单统计数据 * @return \think\Response */ public function getOrderStatistics() { $user_id = $this->getUserId(); if (!$user_id) { return $this->renderError('请先登录'); } try { // 查询条件 - 用户ID和未删除 $where = [ 'user_id' => $user_id, 'delete_status' => 0 ]; // 查询待发货订单数量 - 订单状态为1(已支付待发货) $waitingShipCount = \app\common\model\FFOrders::where($where) ->where('order_status', 1) ->count(); // 查询待收货订单数量 - 订单状态为2(已发货) $waitingReceiveCount = \app\common\model\FFOrders::where($where) ->where('order_status', 2) ->count(); // 查询已收货订单数量 - 订单状态为3(已完成) $receivedCount = \app\common\model\FFOrders::where($where) ->where('order_status', 3) ->count(); // 查询申请售后订单数量 - 订单状态为6(申请售后)和7(售后结束) $afterSalesCount = \app\common\model\FFOrders::where($where) ->where('order_status', 'in', [6]) ->count(); // 返回统计结果 return $this->renderSuccess('获取成功', [ 'waiting_ship_count' => $waitingShipCount, // 待发货数量 'waiting_receive_count' => $waitingReceiveCount, // 待收货数量 'received_count' => $receivedCount, // 已收货数量 'after_sales_count' => $afterSalesCount // 申请售后数量 ]); } catch (\Exception $e) { return $this->renderError('获取订单统计数据失败:' . $e->getMessage()); } } }