OrderRevokeForm.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models\v1\admin;
  8. use app\models\AccountLog;
  9. use app\models\Goods;
  10. use app\models\Order;
  11. use app\models\OrderDetail;
  12. use app\models\Register;
  13. use app\models\User;
  14. use app\models\UserCoupon;
  15. use app\utils\OrderNo;
  16. use app\utils\Refund;
  17. use yii\base\Model;
  18. class OrderRevokeForm extends Model
  19. {
  20. public $store_id;
  21. public $user_id;
  22. public $order_id;
  23. public $delete_pass = false;
  24. public $form_id = '';
  25. public function rules()
  26. {
  27. return [
  28. [['order_id'], 'required'],
  29. ];
  30. }
  31. public function save()
  32. {
  33. if (!$this->validate()) {
  34. return [
  35. 'code' => 1,
  36. 'msg' => $this->getErrorSummary(false)[0],
  37. ];
  38. }
  39. /**
  40. * @var Order $order
  41. */
  42. $order = Order::find()->andWhere([
  43. 'store_id' => $this->store_id,
  44. 'user_id' => $this->user_id,
  45. 'id' => $this->order_id,
  46. 'is_delete' => Order::IS_DELETE_FALSE,
  47. ])->andWhere(['NOT IN', 'trade_status', [Order::ORDER_FLOW_CANCEL, Order::ORDER_FLOW_SEND]])->one();
  48. if (!$order) {
  49. return [
  50. 'code' => 1,
  51. 'msg' => '订单不存在'
  52. ];
  53. }
  54. // 已支付订单需要后台先审核
  55. if ($order->is_pay == 1 && !$this->delete_pass) {
  56. $order->trade_status = Order::ORDER_FLOW_CANCEL;
  57. if ($order->save()) {
  58. return [
  59. 'code' => 0,
  60. 'msg' => '订单取消申请已提交,请等候管理员审核'
  61. ];
  62. } else {
  63. return [
  64. 'code' => 1,
  65. 'msg' => $this->getErrorSummary(false)[0],
  66. ];
  67. }
  68. }
  69. $other_msg = " ";
  70. $order->is_delete = Order::IS_DELETE_TRUE;
  71. $order->trade_status = Order::ORDER_FLOW_CANCEL;
  72. $order_detail_list = OrderDetail::find()->where(['order_id' => $order->id,
  73. 'is_delete' => Order::IS_DELETE_FALSE])->all();
  74. $t = \Yii::$app->db->beginTransaction();
  75. // 库存恢复
  76. foreach ($order_detail_list as $order_detail) {
  77. $goods = Goods::findOne($order_detail->goods_id);
  78. $attr_id_list = [];
  79. foreach (json_decode($order_detail->attr) as $item) {
  80. array_push($attr_id_list, $item->attr_id);
  81. }
  82. // TODO: 规格
  83. $goods->numAdd($attr_id_list, $order_detail->num);
  84. if (!$goods->numAdd($attr_id_list, $order_detail->num)) {
  85. // $t->rollBack();
  86. // return [
  87. // 'code' => 1,
  88. // 'msg' => '订单取消失败,库存操作失败',
  89. // ];
  90. $other_msg .= " 库存操作失败";
  91. }
  92. }
  93. // 用户积分恢复
  94. $integral = json_decode($order->integral)->forehead_integral;
  95. $user = User::findOne(['id' => $order->user_id]);
  96. if ($integral > 0) {
  97. $user->integral += $integral;
  98. }
  99. //余额支付 退换余额
  100. if ($order->is_pay == Order::IS_PAY_TRUE && $order->pay_type == Order::PAY_TYPE_BALANCE_PAID) {
  101. $before = $user->money;
  102. $user->money += floatval($order->pay_price);
  103. $log = new AccountLog();
  104. $log->store_id = get_store_id();
  105. $log->user_id = $user->id;
  106. $log->type = AccountLog::TYPE_BALANCE;
  107. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  108. $log->amount = $order->pay_price;
  109. $log->desc = "商城订单退款,订单号:{$order->order_no}";
  110. $log->before = $before;
  111. $log->after = $user->money;
  112. $log->operator = 'system';
  113. $log->operator_id = 0;
  114. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  115. $log->created_at = time();
  116. $log->order_id = $order->id;
  117. $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER;
  118. $log->save();
  119. }
  120. if (!$user->save()) {
  121. $t->rollBack();
  122. return [
  123. 'code' => 1,
  124. 'msg' => $this->getErrorSummary(false)[0],
  125. ];
  126. }
  127. // 已付款就退款
  128. if ($order->is_pay == 1 && $order->pay_type == 1) {
  129. if ($order->pay_price > 0) {
  130. $refund_res = Refund::refund($order, $order->order_union_id ? OrderNo::ORDER_UNION : '',$order->order_no, $order->pay_price);
  131. if ($refund_res !== true) {
  132. $t->rollBack();
  133. return $refund_res;
  134. }
  135. }
  136. }
  137. if ($order->save()) {
  138. if ($order->is_pay == 0) {
  139. UserCoupon::updateAll(['is_use' => 0], ['id' => $order->user_coupon_id]);
  140. }
  141. $t->commit();
  142. return [
  143. 'code' => 0,
  144. 'msg' => '订单已取消' . $other_msg
  145. ];
  146. } else {
  147. $t->rollBack();
  148. return [
  149. 'code' => 1,
  150. 'msg' => '订单取消失败'
  151. ];
  152. }
  153. }
  154. }