OrderRevokeForm.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models\v1;
  8. use app\constants\OptionSetting;
  9. use app\models\CloudGoodsBind;
  10. use app\models\OrderDetail;
  11. use app\models\OrderGoodsCancel;
  12. use app\models\OrderTransit;
  13. use app\models\OrderUnion;
  14. use app\models\Order;
  15. use app\models\SaaSLeaguePriceLog;
  16. use app\models\SaasUser;
  17. use app\models\StoreCloud;
  18. use app\models\User;
  19. use app\models\UserCoupon;
  20. use app\models\UserPayMonth;
  21. use app\models\VerifyCardSale;
  22. use app\modules\admin\models\MerchantForm;
  23. use app\utils\BookOrderNum;
  24. use app\utils\Notice\NoticeSend;
  25. use app\utils\OrderNo;
  26. use app\utils\OrderRevoke;
  27. use app\utils\PrintOrder;
  28. use Yii;
  29. use yii\base\Model;
  30. use yii\helpers\Json;
  31. class OrderRevokeForm extends Model
  32. {
  33. public $store_id;
  34. public $user_id;
  35. public $order_id;
  36. public $delete_pass = false;
  37. public $form_id='';
  38. public $order_detail_id;
  39. public $num;
  40. public function rules()
  41. {
  42. return [
  43. [['order_id'], 'required'],
  44. [['store_id', 'user_id', 'order_id', 'order_detail_id'], 'integer'],
  45. [['num'], 'number']
  46. ];
  47. }
  48. public function save()
  49. {
  50. if (!$this->validate()) {
  51. return $this->getErrorSummary(false)[0];
  52. }
  53. checkReplay([$this->order_id]);
  54. /**
  55. * @var Order $order
  56. */
  57. $order = Order::find()->andWhere([
  58. 'store_id' => $this->store_id,
  59. 'id' => $this->order_id,
  60. 'is_delete' => 0,
  61. ])->one();
  62. $notAllow = !in_array($this->user_id, [$order->user_id, $order->giving_gifts_received_user_id]);
  63. if (!$order || $notAllow) {
  64. return [
  65. 'code' => 1,
  66. 'msg' => '订单不存在'
  67. ];
  68. }
  69. if ((int)$order->apply_delete === Order::ORDER_APPLY_DELETE && (int)$order->trade_status === 1) {
  70. return [
  71. 'code' => 1,
  72. 'msg' => '订单已取消'
  73. ];
  74. }
  75. if ((int)$order->apply_delete === Order::ORDER_APPLY_DELETE) {
  76. return [
  77. 'code' => 1,
  78. 'msg' => '订单取消申请中'
  79. ];
  80. }
  81. if ($order->is_delivery != 1 && !in_array($order->trade_status, [Order::ORDER_FLOW_DEFAULT, Order::ORDER_FLOW_NO_SEND])) {
  82. return [
  83. 'code' => 1,
  84. 'msg' => '订单不存在'
  85. ];
  86. }
  87. if($order->share_hold_pay_up == 1){
  88. return [
  89. 'code' => 1,
  90. 'msg' => '股东升级订单不能取消',
  91. ];
  92. }
  93. // 已支付订单需要后台先审核
  94. if ($order->is_pay == 1 && !$this->delete_pass ) {
  95. //如果是积分支付商品,只使用了积分抵扣就直接退款
  96. if($order->order_type == 7 && $order->pay_price == 0){
  97. return OrderRevoke::orderRevoke($order);
  98. }
  99. $order->apply_delete = Order::ORDER_APPLY_DELETE;
  100. if (Order::stbzGoodsHas($order) && !Order::stbzOrder($order->id)) {
  101. return [
  102. 'code' => 1,
  103. 'msg' => 'no transfer order,try again in 1 minute'
  104. ];
  105. }
  106. if ($order->save()) {
  107. NoticeSend::MchCancel($order->order_no, $order->mch_id);
  108. $merchant = new MerchantForm();
  109. $merchant->order_id = $order->id;
  110. $merchant->syncMchOrderRefundStatus(1);
  111. return [
  112. 'code' => 0,
  113. 'msg' => '订单取消申请已提交,请等候管理员审核'
  114. ];
  115. } else {
  116. return ['code' => 1, 'msg' => implode(';', array_values($order->firstErrors))];
  117. }
  118. }
  119. return OrderRevoke::orderRevoke($order);
  120. }
  121. //单个订单商品选择数量退款
  122. public function orderGoodsCancel() {
  123. try {
  124. $user_id = $this->user_id;
  125. $order_id = $this->order_id;
  126. $order_detail_id = $this->order_detail_id;
  127. $num = $this->num;
  128. $store_id = $this->store_id;
  129. $order = \app\models\Order::findOne(['store_id' => $store_id, 'user_id' => $user_id, 'id' => $order_id]);
  130. if (!$order) {
  131. //订单不存在
  132. throw new \Exception('订单不存在');
  133. }
  134. // if (intval($order->is_pay) !== \app\models\Order::IS_PAY_TRUE) {
  135. // //订单已支付
  136. // throw new \Exception('订单已发货');
  137. // }
  138. if (intval($order->trade_status) !== \app\models\Order::ORDER_FLOW_NO_SEND) {
  139. //订单已发货
  140. throw new \Exception('订单状态错误:已发货/已取消');
  141. }
  142. if (intval($order->apply_delete) !== 0) {
  143. //订单已发货
  144. throw new \Exception('订单已申请整单取消');
  145. }
  146. $order_detail = \app\models\OrderDetail::findOne(['order_id' => $order_id, 'id' => $order_detail_id]);
  147. if (!$order_detail) {
  148. //订单详情不存在
  149. throw new \Exception('订单详情不存在');
  150. }
  151. if (!OrderGoodsCancel::is_activity_goods($order->id, $order_detail->id)) {
  152. throw new \Exception('营销活动产品不能取消');
  153. }
  154. if ($num <= 0) {
  155. //申请数量错误
  156. throw new \Exception('申请退款商品数量错误');
  157. }
  158. $goods_info = OrderGoodsCancel::getCancelGoodsOrderQuery(
  159. $order->id,
  160. 'num, refund_price',
  161. false,
  162. $order_detail_id
  163. )->asArray()->all();
  164. $goods_price = array_sum(array_column($goods_info, 'refund_price')) ?: 0;
  165. $goods_num = array_sum(array_column($goods_info, 'num')) ?: 0;
  166. if ($order_detail->num < ($num + $goods_num)) {
  167. //申请数量超过下单数量
  168. throw new \Exception('申请退款数量超过下单数量');
  169. }
  170. $refund_price = 0;
  171. //计算退款金额 如果带上这次已经全部退款 那么就将剩余的金额全退了
  172. if ($order_detail->num - $goods_num == $num) {
  173. $refund_price = bcsub($order_detail->total_price, $goods_price, 2);
  174. }
  175. //如果没有全部退款 那么计算单个的商品金额 然后再乘以当前的退款商品数量
  176. if ($order_detail['num'] - $goods_num > $num) {
  177. $once_goods_price = bcdiv($order_detail->total_price, $order_detail->num, 2);//计算单个的商品金额
  178. $refund_price = bcmul($once_goods_price, $num, 2);
  179. }
  180. //开始入表
  181. $order_goods_cancel = new OrderGoodsCancel();
  182. $order_goods_cancel->order_id = $order_id;
  183. $order_goods_cancel->order_detail_id = $order_detail_id;
  184. $order_goods_cancel->num = $num;
  185. $order_goods_cancel->user_id = $user_id;
  186. $order_goods_cancel->store_id = $store_id;
  187. $order_goods_cancel->refund_price = $refund_price;
  188. $order_goods_cancel->status = \app\models\OrderGoodsCancel::STATUS_APPLY;
  189. $order_goods_cancel->refund_order_no = \app\models\OrderGoodsCancel::getOrderNo();
  190. if (!$order_goods_cancel->save()) {
  191. //保存失败
  192. throw new \Exception(implode(';', array_values($order_goods_cancel->firstErrors)));
  193. }
  194. return [
  195. 'code' => 0,
  196. 'msg' => '申请成功',
  197. 'data' => [
  198. 'order_goods_cancel_id' => $order_goods_cancel->id,
  199. 'refund_price' => $refund_price,
  200. ]
  201. ];
  202. } catch (\Exception $e) {
  203. return [
  204. 'code' => 1,
  205. 'msg' => $e->getMessage(),
  206. ];
  207. }
  208. }
  209. }