is_pay != 1){ return [ 'code' => 1, 'msg' => '操作失败,订单还未支付。', ]; } if($refund_price <= 0){ return [ 'code' => 1, 'msg' => '操作失败,退款金额不能为0。', ]; } $rmSum = \app\models\OrderRefundMoney::find()->where(['is_delete' => 0, 'status' => 1, 'order_id' => $order['id']])->sum('refund_price'); if($refund_price + $rmSum > $order['pay_price']){ return [ 'code' => 1, 'msg' => '操作失败,退款金额超出订单金额。', ]; } // $t = \Yii::$app->db->beginTransaction(); $refund = new OrderRefundMoney(); $refund->status = 1; $refund->desc = $desc; $refund->refund_price = $refund_price; $refund->store_id = $order->store_id; $refund->user_id = $order->user_id; $refund->order_id = $order->id; $refund->order_refund_no = $this->getOrderRefundNo(); if ($refund->save()) { // 已付款就退款 if (in_array($order->pay_type, [1, 4, Order::PAY_TYPE_WX_B2B, Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY, Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX])) { $refund_res = Refund::refund($order, OrderNo::ORDER_MALL, $refund->order_refund_no, $refund->refund_price); if ($refund_res !== true) { $refund->status = 0; $refund->status_desc = json_encode($refund_res, JSON_UNESCAPED_UNICODE); $refund->save(); return [ 'code' => 1, 'msg' => '操作失败.' . $refund_res['msg'], 'r' => $refund_res, ]; } } // 商城商品总库存恢复 $order_detail_list = OrderDetail::find()->where(['order_id' => $order->id, 'is_delete' => 0])->all(); 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); } $goods->numAdd($attr_id_list, $order_detail->num); } $user = User::findOne(['id' => $order->user_id]); if($order['giving_gifts_received_user_id']){ $user = User::findOne($order['giving_gifts_received_user_id']); } $integral = isset($order->integral) ? json_decode($order->integral)->forehead_integral : 0; if ($integral > 0) { $user->integral += $integral; } $balance = isset($order->balance) ? $order->balance : 0; if ($balance > 0) { $before = $user->money; $user->money += $balance; $log = new AccountLog(); $log->store_id = $user->store_id; $log->user_id = $user->id; $log->type = AccountLog::TYPE_GOODS_BALANCE; $log->amount = $balance; $log->log_type = AccountLog::LOG_TYPE_INCOME; $log->desc = "商城售后订单退款,商品余额抵扣:退款订单号:{$refund->order_refund_no}"; $log->before = $before; $log->after = $user->money; $log->operator = ''; $log->operator_id = 0; $log->operator_type = AccountLog::TYPE_OPERATOR_BACK; $log->created_at = time(); $log->order_id = $order->id; $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER; $log->save(); if (!$user->save()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } } if ($order->pay_type == 3) { $before = $user->money; $user->money += floatval($refund->refund_price); $log = new AccountLog(); $log->store_id = $user->store_id; $log->user_id = $user->id; $log->type = AccountLog::TYPE_BALANCE; $log->amount = floatval($refund->refund_price); $log->log_type = AccountLog::LOG_TYPE_INCOME; $log->desc = "商城售后订单退款:退款订单号:{$refund->order_refund_no}"; $log->before = $before; $log->after = $user->money; $log->operator = ''; $log->operator_id = 0; $log->operator_type = AccountLog::TYPE_OPERATOR_BACK; $log->created_at = time(); $log->order_id = $order->id; $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER; $log->save(); if (!$user->save()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } } // todo 因为只是售后订单这里有退款 判断一下退款的金额==支付金额时候 将售后订单状态修改为完成状态 $rmAllSum = \app\models\OrderRefundMoney::find()->where(['is_delete' => 0, 'status' => 1, 'order_id' => $order['id']])->sum('refund_price'); if($rmAllSum == $order['pay_price']){ OrderRefund::updateAll(['status'=>1,'is_user_send' => 1,'is_agree'=>1], ['order_id' => $order['id']]); } if ($refund->save()) { $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id); NoticeSend::OrderRefund($order->user_id, $order->mobile, $order->order_no, $refund->refund_price, $goods->name); return [ 'code' => 0, 'msg' => '处理成功,已完成退款退货。', ]; } return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; return [ 'code' => 0, 'msg' => '操作成功', ]; } return [ 'code' => 1, 'msg' => '操作失败', ]; } private function getOrderRefundNo() { $order_refund_no = null; while (true) { $order_refund_no = 'RM'.date('YmdHis') . mt_rand(100000, 999999); $exist_order_refund_no = OrderRefundMoney::find()->where(['order_refund_no' => $order_refund_no])->exists(); if (!$exist_order_refund_no) { break; } } return $order_refund_no; } public function save() { if (!$this->validate()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } /** * @var Order $order */ $store_id = $this->store_id; if ($store_id <= 0) { $store_id = [0, -1]; } //TODO 取消订单需要退积分,这里剩余如果检测到是平台操作,就使用saas_user添加积分信息 $order = Order::find()->where([ 'store_id' => $store_id, 'id' => $this->order_id, 'is_delete' => Order::IS_DELETE_FALSE, ])->one(); if (!$order) { return [ 'code' => 1, 'msg' => '订单不存在' ]; } $t = \Yii::$app->db->beginTransaction(); // 已支付订单需要后台先审核 if ($order->is_pay == 1 && !$this->delete_pass) { $order->apply_delete = Order::ORDER_APPLY_DELETE; 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])->asArray()->all(); // 库存恢复 if (!$order->save()) { return [ 'code' => 1, 'msg' => implode(';', array_values($order->firstErrors)), ]; }; $order_pay_price = $order->pay_price; $order_detail_list_array = []; foreach ($order_detail_list as $order_detail) { //获取到已经取消或者在申请中的取消商品订单 $orderGoodsCancel = OrderGoodsCancel::getCancelGoodsOrderQuery( $order->id, 'status, SUM(num) as num, SUM(refund_price) as refund_price', 'status', $order_detail['id'] )->asArray()->all(); foreach ($orderGoodsCancel as $goodsCancelItem) { //如果在申请中的就给取消 if ($goodsCancelItem['status'] == OrderGoodsCancel::STATUS_APPLY) { OrderGoodsCancel::updateAll( ['status' => OrderGoodsCancel::STATUS_CANCEL], ['order_detail_id' => $order_detail['id'], 'status' => OrderGoodsCancel::STATUS_APPLY]); } else { $order_detail['num'] = $order_detail['num'] - $goodsCancelItem['num']; $total_price = $order_detail['total_price'] - $goodsCancelItem['refund_price']; $order_detail['total_price'] = $total_price > 0 ? $total_price : 0; $order_pay_price -= $goodsCancelItem['refund_price']; } } if ($order_detail['num'] <= 0) { continue; } $order_detail_list_array[] = $order_detail; if($order->order_type == 1){ continue; } $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); } // $goods->numAdd($attr_id_list, $order_detail->num); if (!in_array($order->order_type, [1, 2])) { if (!$goods->numAdd($attr_id_list, $order_detail['num'])) { // $t->rollBack(); // return [ // 'code' => 1, // 'msg' => '订单取消失败,库存操作失败', // ]; $other_msg .= " 库存操作失败"; } } } $order_detail_list = $order_detail_list_array; // todo 秒杀订单退秒杀库存 和 秒杀销量 if($order->seckill_order_id > 0){ $seckillActivityOrderLog = SeckillActivityOrderLog::find()->where(['id' => $order->seckill_order_id])->one(); $seckillActivityGoods = SeckillActivityGoods::findOne([ 'id' =>$seckillActivityOrderLog->activity_goods_id, 'goods_id' => $seckillActivityOrderLog->goods_id, 'store_id' => $order->store_id,'is_delete' => 0 ]); // 这里循环的还是订单商品信息表 foreach($order_detail_list as $order_detail){ $attr_id_list = []; foreach (json_decode($order_detail['attr'], true) as $item) { array_push($attr_id_list, $item['attr_id']); } // 这里执行退库存的是秒杀商品的库存 if ($seckillActivityGoods) { $seckillActivityGoods->numAdd($attr_id_list,$order_detail['num']); } } if ($seckillActivityGoods) { // 减去销量 $seckillActivityGoods->sale_num -= array_sum(array_column($order_detail_list, 'num')); $seckillActivityGoods->save(); } // 恢复库存之后 将秒杀订单修改未删除状态 $seckillActivityOrderLog->is_delete = 1; $seckillActivityOrderLog->save(); } // TODO 用户商品抵扣余额恢复 $balance = $order->balance; $user = User::findOne(['id' => $order->user_id]); if($order['giving_gifts_received_user_id']){ $user = User::findOne($order['giving_gifts_received_user_id']); } $type_1 = 0; $store_id = $order->store_id; if ($order->store_id <= 0) { $store_id = 0; $user = SaasUser::findOne(['id' => $order->saas_id]); $type_1 = 1; } if (!$user) { return [ 'code' => 1, 'msg' => '用户数据未找到', ]; } if ($balance > 0) { $old_balance = $user->money; $user->money += $balance; $log = new AccountLog(); $log->store_id = $store_id; if ($type_1) { $log->saas_id = $user->id; $log->user_id = 0; } else { $log->user_id = $user->id; } $log->type = AccountLog::TYPE_GOODS_BALANCE; $log->log_type = AccountLog::LOG_TYPE_INCOME; $log->amount = $balance; $log->desc = "商品余额抵扣订单退款, 订单号:{$order->order_no}"; $log->before = $old_balance; $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_ORDER; $log->save(); $user->save(); } // 用户积分恢复 $integral = json_decode($order->integral)->forehead_integral; $user = User::findOne(['id' => $order->user_id]); if($order['giving_gifts_received_user_id']){ $user = User::findOne($order['giving_gifts_received_user_id']); } $type = 0; $store_id = $order->store_id; if ($order->store_id <= 0) { $store_id = 0; $user = SaasUser::findOne(['id' => $order->saas_id]); $type = 1; } if (! $user) { return [ 'code' => 1, 'msg' => '用户数据未找到', ]; } //修改未支付但是取消订单的逻辑 if (intval($order->is_pay) === 1 || (intval($order->pay_type) === Order::PAY_TYPE_COD && intval($order->is_pay) === 0)) { $addIntegral = 0; if (!$addIntegral && $integral > 0) { $addIntegral = 1; $old_integral = $user->integral; $user->integral += $integral; $log = new AccountLog(); $log->store_id = $store_id; if ($type) { $log->saas_id = $user->id; $log->user_id = 0; } else { $log->user_id = $user->id; } $log->type = AccountLog::TYPE_INTEGRAL; $log->log_type = AccountLog::LOG_TYPE_INCOME; $log->amount = $integral; $log->desc = "商城订单取消, 订单号:{$order->order_no}"; $log->before = $old_integral; $log->after = $user->integral; $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_ORDER; $log->save(); } //新积分兑换商品退还积分 $new_integral = $order->integral_price; if(!$addIntegral && $new_integral > 0){ $addIntegral = 1; $old_integral = $user->integral; $user->integral += $new_integral; $log = new AccountLog(); $log->store_id = $store_id; if ($type) { $log->saas_id = $user->id; $log->user_id = 0; } else { $log->user_id = $user->id; } $log->type = AccountLog::TYPE_INTEGRAL; $log->log_type = AccountLog::LOG_TYPE_INCOME; $log->amount = $new_integral; $log->desc = "商城订单取消, 订单号:{$order->order_no}"; $log->before = $old_integral; $log->after = $user->integral; $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_ORDER; if (!$log->save()) { debug_log([ 'error' => $log->errors ], 'orderDelete.log'); }; } } // 余额支付 退换余额 if ($order->is_pay == Order::IS_PAY_TRUE && $order->pay_type == Order::PAY_TYPE_BALANCE_PAID && isset($user->money)) { $before = $user->money; $user->money += floatval($order_pay_price); $log = new AccountLog(); $log->store_id = $store_id; if ($type) { $log->saas_id = $user->id; } else { $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 || $order->pay_type == 4 || in_array($order->pay_type, [Order::PAY_TYPE_WX_B2B, Order::PAY_TYPE_MONTH, Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY, Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX]) || $order->pay_type === Order::PAY_TYPE_YUNST_WECHAT_PAY)) { 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->user_coupon_id) { UserCoupon::updateAll(['is_use' => 0], ['id' => $order->user_coupon_id]); (new \app\utils\OrderUtil())->couponTimeout($order->user_coupon_id); } $new_delivery = new \app\utils\Delivery\WechatNewDelivery(); $result = $new_delivery->cancelOrder(['order_no' => $order->order_no, 'store_id' => $store_id]); debug_log($result, 'delivery_.log'); // 删除股东分红记录 \app\utils\Share\BonusPool::cancelOrderShareDetail($order->id); $t->commit(); return [ 'code' => 0, 'msg' => '订单已取消' . $other_msg ]; } else { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单取消失败' ]; } } public function saveCost() { if (!$this->validate()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } /** * @var Order $order */ $order = AdoptCostOrder::find()->where([ 'store_id' => $this->store_id, 'user_id' => $this->user_id, 'id' => $this->order_id, 'is_delete' => Order::IS_DELETE_FALSE, ])->andWhere(['in', 'trade_status', [Order::ORDER_FLOW_NO_SEND, Order::ORDER_FLOW_DEFAULT]])->one(); if (!$order) { return [ 'code' => 1, 'msg' => '订单不存在' ]; } // 已支付订单需要后台先审核 if ($order->is_pay == 1 && !$this->delete_pass) { $order->apply_delete = Order::ORDER_APPLY_DELETE; if ($order->save()) { return [ 'code' => 0, 'msg' => '订单取消申请已提交,请等候管理员审核' ]; } else { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } } $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(); $other_msg = " "; // 库存恢复 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); } // $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 (! $user) { return [ 'code' => 1, 'msg' => '用户数据未找到', ]; } 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' => '订单取消失败' ]; } } }