| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <?php
- /**
- * 重庆赤晓店信息科技有限公司
- * https://www.chixiaodian.com
- * Copyright (c) 2023 赤店商城 All rights reserved.
- */
- namespace app\modules\client\models\v1;
- use app\constants\OptionSetting;
- use app\models\CloudGoodsBind;
- use app\models\OrderDetail;
- use app\models\OrderGoodsCancel;
- use app\models\OrderTransit;
- use app\models\OrderUnion;
- use app\models\Order;
- use app\models\SaaSLeaguePriceLog;
- use app\models\SaasUser;
- use app\models\StoreCloud;
- use app\models\User;
- use app\models\UserCoupon;
- use app\models\UserPayMonth;
- use app\models\VerifyCardSale;
- use app\modules\admin\models\MerchantForm;
- use app\utils\BookOrderNum;
- use app\utils\Notice\NoticeSend;
- use app\utils\OrderNo;
- use app\utils\OrderRevoke;
- use app\utils\PrintOrder;
- use Yii;
- use yii\base\Model;
- use yii\helpers\Json;
- class OrderRevokeForm extends Model
- {
- public $store_id;
- public $user_id;
- public $order_id;
- public $delete_pass = false;
- public $form_id='';
- public $order_detail_id;
- public $num;
- public function rules()
- {
- return [
- [['order_id'], 'required'],
- [['store_id', 'user_id', 'order_id', 'order_detail_id'], 'integer'],
- [['num'], 'number']
- ];
- }
- public function save()
- {
- if (!$this->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(),
- ];
- }
- }
- }
|