validate()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } /** * @var Order $order */ $order = Order::find()->andWhere([ 'store_id' => $this->store_id, 'user_id' => $this->user_id, 'id' => $this->order_id, 'is_delete' => Order::IS_DELETE_FALSE, ])->andWhere(['NOT IN', 'trade_status', [Order::ORDER_FLOW_CANCEL, Order::ORDER_FLOW_SEND]])->one(); if (!$order) { return [ 'code' => 1, 'msg' => '订单不存在' ]; } // 已支付订单需要后台先审核 if ($order->is_pay == 1 && !$this->delete_pass) { $order->trade_status = Order::ORDER_FLOW_CANCEL; if ($order->save()) { return [ 'code' => 0, 'msg' => '订单取消申请已提交,请等候管理员审核' ]; } else { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } } $other_msg = " "; $order->is_delete = Order::IS_DELETE_TRUE; $order->trade_status = Order::ORDER_FLOW_CANCEL; $order_detail_list = OrderDetail::find()->where(['order_id' => $order->id, 'is_delete' => Order::IS_DELETE_FALSE])->all(); $t = \Yii::$app->db->beginTransaction(); // 库存恢复 foreach ($order_detail_list as $order_detail) { $goods = Goods::findOne($order_detail->goods_id); $attr_id_list = []; foreach (json_decode($order_detail->attr) as $item) { array_push($attr_id_list, $item->attr_id); } // TODO: 规格 $goods->numAdd($attr_id_list, $order_detail->num); if (!$goods->numAdd($attr_id_list, $order_detail->num)) { // $t->rollBack(); // return [ // 'code' => 1, // 'msg' => '订单取消失败,库存操作失败', // ]; $other_msg .= " 库存操作失败"; } } // 用户积分恢复 $integral = json_decode($order->integral)->forehead_integral; $user = User::findOne(['id' => $order->user_id]); if ($integral > 0) { $user->integral += $integral; } //余额支付 退换余额 if ($order->is_pay == Order::IS_PAY_TRUE && $order->pay_type == Order::PAY_TYPE_BALANCE_PAID) { $before = $user->money; $user->money += floatval($order->pay_price); $log = new AccountLog(); $log->store_id = get_store_id(); $log->user_id = $user->id; $log->type = AccountLog::TYPE_BALANCE; $log->log_type = AccountLog::LOG_TYPE_INCOME; $log->amount = $order->pay_price; $log->desc = "商城订单退款,订单号:{$order->order_no}"; $log->before = $before; $log->after = $user->money; $log->operator = 'system'; $log->operator_id = 0; $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL; $log->created_at = time(); $log->order_id = $order->id; $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER; $log->save(); } if (!$user->save()) { $t->rollBack(); return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } // 已付款就退款 if ($order->is_pay == 1 && $order->pay_type == 1) { if ($order->pay_price > 0) { $refund_res = Refund::refund($order, $order->order_union_id ? OrderNo::ORDER_UNION : '',$order->order_no, $order->pay_price); if ($refund_res !== true) { $t->rollBack(); return $refund_res; } } } if ($order->save()) { if ($order->is_pay == 0) { UserCoupon::updateAll(['is_use' => 0], ['id' => $order->user_coupon_id]); } $t->commit(); return [ 'code' => 0, 'msg' => '订单已取消' . $other_msg ]; } else { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单取消失败' ]; } } }