validate()) { return $this->getErrorSummary(false)[0]; } checkReplay([$this->order_id]); /** * @var Order $order */ $order = Order::find()->andWhere([ 'store_id' => $this->store_id, 'id' => $this->order_id, 'is_delete' => 0, ])->one(); $notAllow = !in_array($this->user_id, [$order->user_id, $order->giving_gifts_received_user_id]); if (!$order || $notAllow) { return [ 'code' => 1, 'msg' => '订单不存在' ]; } if ((int)$order->apply_delete === Order::ORDER_APPLY_DELETE && (int)$order->trade_status === 1) { return [ 'code' => 1, 'msg' => '订单已取消' ]; } if ((int)$order->apply_delete === Order::ORDER_APPLY_DELETE) { return [ 'code' => 1, 'msg' => '订单取消申请中' ]; } if ($order->is_delivery != 1 && !in_array($order->trade_status, [Order::ORDER_FLOW_DEFAULT, Order::ORDER_FLOW_NO_SEND])) { return [ 'code' => 1, 'msg' => '订单不存在' ]; } if($order->share_hold_pay_up == 1){ return [ 'code' => 1, 'msg' => '股东升级订单不能取消', ]; } // 已支付订单需要后台先审核 if ($order->is_pay == 1 && !$this->delete_pass ) { //如果是积分支付商品,只使用了积分抵扣就直接退款 if($order->order_type == 7 && $order->pay_price == 0){ return OrderRevoke::orderRevoke($order); } $order->apply_delete = Order::ORDER_APPLY_DELETE; if (Order::stbzGoodsHas($order) && !Order::stbzOrder($order->id)) { return [ 'code' => 1, 'msg' => 'no transfer order,try again in 1 minute' ]; } if ($order->save()) { NoticeSend::MchCancel($order->order_no, $order->mch_id); $merchant = new MerchantForm(); $merchant->order_id = $order->id; $merchant->syncMchOrderRefundStatus(1); return [ 'code' => 0, 'msg' => '订单取消申请已提交,请等候管理员审核' ]; } else { return ['code' => 1, 'msg' => implode(';', array_values($order->firstErrors))]; } } return OrderRevoke::orderRevoke($order); } //单个订单商品选择数量退款 public function orderGoodsCancel() { try { $user_id = $this->user_id; $order_id = $this->order_id; $order_detail_id = $this->order_detail_id; $num = $this->num; $store_id = $this->store_id; $order = \app\models\Order::findOne(['store_id' => $store_id, 'user_id' => $user_id, 'id' => $order_id]); if (!$order) { //订单不存在 throw new \Exception('订单不存在'); } // if (intval($order->is_pay) !== \app\models\Order::IS_PAY_TRUE) { // //订单已支付 // throw new \Exception('订单已发货'); // } if (intval($order->trade_status) !== \app\models\Order::ORDER_FLOW_NO_SEND) { //订单已发货 throw new \Exception('订单状态错误:已发货/已取消'); } if (intval($order->apply_delete) !== 0) { //订单已发货 throw new \Exception('订单已申请整单取消'); } $order_detail = \app\models\OrderDetail::findOne(['order_id' => $order_id, 'id' => $order_detail_id]); if (!$order_detail) { //订单详情不存在 throw new \Exception('订单详情不存在'); } if (!OrderGoodsCancel::is_activity_goods($order->id, $order_detail->id)) { throw new \Exception('营销活动产品不能取消'); } if ($num <= 0) { //申请数量错误 throw new \Exception('申请退款商品数量错误'); } $goods_info = OrderGoodsCancel::getCancelGoodsOrderQuery( $order->id, 'num, refund_price', false, $order_detail_id )->asArray()->all(); $goods_price = array_sum(array_column($goods_info, 'refund_price')) ?: 0; $goods_num = array_sum(array_column($goods_info, 'num')) ?: 0; if ($order_detail->num < ($num + $goods_num)) { //申请数量超过下单数量 throw new \Exception('申请退款数量超过下单数量'); } $refund_price = 0; //计算退款金额 如果带上这次已经全部退款 那么就将剩余的金额全退了 if ($order_detail->num - $goods_num == $num) { $refund_price = bcsub($order_detail->total_price, $goods_price, 2); } //如果没有全部退款 那么计算单个的商品金额 然后再乘以当前的退款商品数量 if ($order_detail['num'] - $goods_num > $num) { $once_goods_price = bcdiv($order_detail->total_price, $order_detail->num, 2);//计算单个的商品金额 $refund_price = bcmul($once_goods_price, $num, 2); } //开始入表 $order_goods_cancel = new OrderGoodsCancel(); $order_goods_cancel->order_id = $order_id; $order_goods_cancel->order_detail_id = $order_detail_id; $order_goods_cancel->num = $num; $order_goods_cancel->user_id = $user_id; $order_goods_cancel->store_id = $store_id; $order_goods_cancel->refund_price = $refund_price; $order_goods_cancel->status = \app\models\OrderGoodsCancel::STATUS_APPLY; $order_goods_cancel->refund_order_no = \app\models\OrderGoodsCancel::getOrderNo(); if (!$order_goods_cancel->save()) { //保存失败 throw new \Exception(implode(';', array_values($order_goods_cancel->firstErrors))); } return [ 'code' => 0, 'msg' => '申请成功', 'data' => [ 'order_goods_cancel_id' => $order_goods_cancel->id, 'refund_price' => $refund_price, ] ]; } catch (\Exception $e) { return [ 'code' => 1, 'msg' => $e->getMessage(), ]; } } }