db->beginTransaction(); $order->trade_status = Order::ORDER_FLOW_CANCEL; // $order->is_delete = Order::IS_DELETE_TRUE; if ($order->save()) { //查看是否存在转单数据 $orderTransitInfo = OrderTransit::find()->where(['order_id'=>$order->attributes['id'],"is_delete"=>0])->all(); if($orderTransitInfo){ $cloudInfo = StoreCloud::find()->where(['store_id'=>$order->store_id,"is_delete"=>0])->one(); if($cloudInfo) { foreach ($orderTransitInfo as $value) { $mch_order_cancel_url = "/cloud/mch/mchOrderCancel"; $mch_order_cancel_data = []; $mch_order_cancel_data['access_token'] = $cloudInfo->attributes['access_token']; $mch_order_cancel_data['order_id'] = $value->attributes['cloud_order_id']; $domain = (new OptionSetting)->getCloudDomainName(); cloud_post($domain . $mch_order_cancel_url, $mch_order_cancel_data); $value->status = -1; $value->save(); } } } $orderRevoke = new OrderRevoke(); $orderRevoke->order = $order; $orderRevoke->type = 0; // 恢复商品库存 $numRes = $orderRevoke->backGoodsNum(); // 返回优惠券 if ($order->is_pay == 0) { $couponRes = $orderRevoke->backUserCoupon(); }else{ //积分兑换订单不使用优惠券 if($order->order_type ==7){ $couponRes = true; } } // 订单退款 if ($order->is_pay == 1) { //新积分商品返还积分 $new_integralRes = $orderRevoke->backNewUserIntegral(); // 返还积分 $integralRes = $orderRevoke->backUserIntegral(); if ($order->pay_type == 3) { if (!$orderRevoke->OrderRefund()) { $t->rollBack(); return [ 'code' => 0, 'msg' => '退款失败,取消失败' ]; } } if ($order->pay_type == 1) { $refundFee = $order->pay_price; $res = $orderRevoke->orderWxRefund($refundFee); if ($res !== true) { $t->rollBack(); return $res; } } if ($order->pay_type == Order::PAY_TYPE_MONTH) { $refundFee = $order->pay_price; $res = UserPayMonth::refund($order->user_id, $order, $refundFee); if ($res !== true) { $t->rollBack(); return $res; } } // 预约商品增加库存 BookOrderNum::bookNumAdd($order); // 取消下单时送的核销卡 VerifyCardSale::cancelCard($order); } else { $t->commit(); return [ 'code' => 0, 'msg' => '订单已取消' ]; } if (!$numRes || !$couponRes || !$integralRes || !$new_integralRes) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单取消失败' ]; } // 订单打印 if ((int)$order->md_id === -1 || (int)$order->md_id === 0 || !isset($order->md_id)) { $order->md_id = 0; } $printer_order = new PrintOrder($order->store_id, $order->id, 'pay', 0, $order->md_id, 0, $order['mch_id']); $printer_order->is_refund = true; $printer_order->print_order(); $t->commit(); $check = SaaSLeaguePriceLog::findOne(['order_id' => $order->id,'type' => 4]); if($order->take_price > 0 && $check){ $user = User::findOne($order->user_id); $saas_user = SaasUser::findOne(['mobile' => $user->binding]); if($saas_user){ $take_price = $order->take_price; $before = $saas_user->league_price; $saas_user->updateCounters(['league_price' => floatval($take_price)]); \app\models\SaaSLeaguePriceLog::setLeaguePriceLog( $order->store_id, $saas_user->id, $take_price, $before, \app\models\SaaSLeaguePriceLog::TYPE_CANCEL, \app\models\SaaSLeaguePriceLog::SEND_TYPE, \app\models\SaaSLeaguePriceLog::ROLE_USER, $order->id ); } } return [ 'code' => 0, 'msg' => '订单已取消' ]; } else { $t->commit(); return [ 'code' => 1, 'msg' => '订单取消失败' . array_shift($order->getFirstErrors()), ]; } } /** * 同意订单取消操作 */ public static function allianceOrderRevoke($order) { $t = Yii::$app->db->beginTransaction(); $order->trade_status = Order::ORDER_FLOW_CANCEL; // $order->is_delete = Order::IS_DELETE_TRUE; if ($order->save()) { $orderRevoke = new OrderRevoke(); $orderRevoke->order = $order; $orderRevoke->type = 0; // 恢复商品库存 $numRes = $orderRevoke->backGoodsNum(); $couponRes = true; // 返回优惠券 if ($order->is_pay == 0) { $couponRes = $orderRevoke->backSaasCoupon(); } // // 返还积分 //$integralRes = $orderRevoke->backUserIntegral(); // 订单退款 if ($order->is_pay == 1) { if ($order->pay_type == 3) { if (!$orderRevoke->OrderRefund()) { $t->rollBack(); return [ 'code' => 0, 'msg' => '退款失败,取消失败' ]; } } if ($order->pay_type == 1) { $refundFee = $order->pay_price; $refund_res = Refund::refund($order, $order->order_union_id ? OrderNo::ORDER_UNION : '',$order->order_no, $order->pay_price); // $res = $orderRevoke->orderWxRefund($refundFee); if ($refund_res !== true) { $t->rollBack(); return $refund_res; } } // 预约商品增加库存 BookOrderNum::bookNumAdd($order); } if (!$numRes || !$couponRes) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单取消失败' ]; } // 订单打印 if ((int)$order->md_id === -1 || (int)$order->md_id === 0 || !isset($order->md_id)) { $order->md_id = 0; } $printer_order = new PrintOrder($order->store_id, $order->id, 'pay', 0, $order->md_id, 0, $order['mch_id']); $printer_order->print_order(); $t->commit(); return [ 'code' => 0, 'msg' => '订单已取消' ]; } else { $t->commit(); return [ 'code' => 1, 'msg' => '订单取消失败' ]; } } /** * 恢复商品库存 */ public function backGoodsNum($order_goods_cancel_id = 0) { $order = $this->order; $orderGoodsCancel = null; $order_detail_list = []; if ($order_goods_cancel_id) { $orderGoodsCancel = OrderGoodsCancel::findOne($order_goods_cancel_id); } if ($this->type == 0) { $query = OrderDetail::find()->where(['order_id' => $order->id, 'is_delete' => 0]); if ($orderGoodsCancel) { $query->andWhere(['id' => $orderGoodsCancel->order_detail_id]); } $order_detail_list = $query->all(); } //库存恢复 foreach ($order_detail_list as $order_detail) { if ($orderGoodsCancel) { $order_detail->num = $orderGoodsCancel->num; } if($this->type == 0) { $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($order->seckill_order_id > 0){ $seckillActivityOrderLog = SeckillActivityOrderLog::find()->where(['id' => $order->seckill_order_id])->one(); $seckillActivityGoods = SeckillActivityGoods::find()->where(['id' =>$seckillActivityOrderLog->activity_goods_id ,'goods_id' => $seckillActivityOrderLog->goods_id,'store_id' => $order->store_id,'is_delete' => 0])->one(); // 这里循环的还是订单商品信息表 foreach($order_detail_list as $order_detail){ $attr_id_list = []; foreach (json_decode($order_detail->attr) as $item) { array_push($attr_id_list, $item->attr_id); } // 这里执行退库存的是秒杀商品的库存 $seckillActivityGoods->numAdd($attr_id_list,$order_detail->num); } // 减去销量 $seckillActivityGoods->sale_num -= array_sum(array_column($order_detail_list,'num')); $seckillActivityGoods->save(); // 恢复库存之后 将秒杀订单修改未删除状态 $seckillActivityOrderLog->is_delete = 1; $seckillActivityOrderLog->save(); } return true; } /** * 返还优惠券 */ public function backUserCoupon() { UserCoupon::updateAll(['is_use' => 0], ['id' => $this->order->user_coupon_id]); return true; } /** * 返还优惠券 */ public function backSaasCoupon() { SaasCoupon::updateAll(['is_use' => 0], ['id' => $this->order->user_coupon_id]); return true; } /** * 返还积分 */ public function backUserIntegral() { $order = $this->order; $integral = json_decode($order->integral)->forehead_integral; if ($integral <= 0) { return true; } $tt = Yii::$app->db->beginTransaction(); $log = AccountLog::saveLog($order->user_id, $integral, AccountLog::TYPE_INTEGRAL, AccountLog::LOG_TYPE_INCOME, AccountLog::TYPE_PLATFORM_REFUND_ORDER, $order->id, "商城订单退积分,订单号:{$order->order_no}"); if ($log) { $tt->commit(); return true; } else { $tt->rollBack(); return false; } } /** * 购买积分商品返还积分 */ public function backNewUserIntegral() { $order = $this->order; $integral = $order->integral_price; if ($integral <= 0) { return true; } $tt = Yii::$app->db->beginTransaction(); $log = AccountLog::saveLog($order->user_id, $integral, AccountLog::TYPE_INTEGRAL, AccountLog::LOG_TYPE_INCOME, AccountLog::TYPE_PLATFORM_REFUND_ORDER, $order->id, "商城订单退积分,订单号:{$order->order_no}"); if ($log) { $tt->commit(); return true; } else { $tt->rollBack(); return false; } } /** * 订单退款余额 */ public function OrderRefund($refundFee = 0) { $order = $this->order; $refundFee = $refundFee > 0 ? $refundFee : $order->pay_price; if ($order->is_pay == 1 && $order->pay_type == 3) { $tt = Yii::$app->db->beginTransaction(); $log = AccountLog::saveLog($order->user_id, $refundFee, AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_INCOME, AccountLog::TYPE_PLATFORM_REFUND_ORDER, $order->id, "商城订单退款,订单号:{$order->order_no}"); if ($log) { $tt->commit(); return true; }else { $tt->rollBack(); return false; } }else { return true; } } /** * @param $refundFee integer 退款金额 * @return array|bool */ public function orderWxRefund($refundFee, $refund_account = null) { $order = $this->order; if (isset($order->pay_price)) { $payPrice = $order->pay_price; } else { // 联合订单支付的总额 $payPrice = $order->price; } $data = [ 'out_trade_no' => $order->order_no, 'out_refund_no' => $order->order_no, 'total_fee' => $payPrice * 100, 'refund_fee' => $refundFee * 100, ]; if (isset($order->order_union_id) && $order->order_union_id != 0) { // 多商户合并订单退款 $orderUnion = OrderUnion::findOne($order->order_union_id); if (!$orderUnion) { return [ 'code' => 1, 'msg' => '订单操作失败,合并支付订单不存在。', ]; } $data['out_trade_no'] = $orderUnion->order_no; $data['total_fee'] = $orderUnion->price * 100; } $config = []; if ($refund_account) { $config['refund_account'] = $refund_account; } $wechatPay = \Yii::$app->controller->wechatPay; $jssdk = $wechatPay->refund; $res = $jssdk ->byOutTradeNumber($data['out_trade_no'], $data['out_refund_no'], $data['total_fee'], $data['refund_fee'],$config); if (!$res) { return [ 'code' => 1, 'msg' => '订单取消失败,退款失败,服务端配置出错', ]; } if ($res['return_code'] != 'SUCCESS') { return [ 'code' => 1, 'msg' => '订单取消失败,退款失败,' . $res['return_msg'], 'res' => $res, ]; } if (isset($res['err_code']) && $res['err_code'] == 'NOTENOUGH' && !$refund_account) { // 交易未结算资金不足,请使用可用余额退款 return $this->orderWxRefund($refundFee, 'REFUND_SOURCE_RECHARGE_FUNDS'); } if ($res['result_code'] != 'SUCCESS') { /** * 检测退款失败原因 */ $refundQuery = $jssdk->queryByOutTradeNumber($order->order_no); if ($refundQuery['return_code'] != 'SUCCESS') { return [ 'code' => 1, 'msg' => '订单取消失败,退款失败,' . $refundQuery['return_msg'], 'res' => $refundQuery, ]; } if ($refundQuery['result_code'] == 'FAIL') { return [ 'code' => 1, 'msg' => '订单取消失败,退款失败,' . $res['err_code_des'], 'res' => $res, ]; } if ($refundQuery['result_code'] != 'SUCCESS') { return [ 'code' => 1, 'msg' => '订单取消失败,退款失败,' . $refundQuery['err_code_des'], 'res' => $refundQuery, ]; } if ($refundQuery['refund_status_0'] != 'SUCCESS') { return [ 'code' => 1, 'msg' => '订单取消失败,退款失败,' . $refundQuery['err_code_des'], 'res' => $refundQuery, ]; } } return true; } /** * 返还佣金 */ public function backUserShare() { } }