OrderRefundForm.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  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\utils\OrderNo;
  11. use app\utils\Refund;
  12. use yii\base\Model;
  13. use app\models\Order;
  14. use app\models\OrderDetail;
  15. use app\models\OrderRefund;
  16. use app\models\User;
  17. use app\models\Register;
  18. use app\utils\Notice\NoticeSend;
  19. /**
  20. * 售后订单结果处理
  21. */
  22. class OrderRefundForm extends Model
  23. {
  24. public $store_id;
  25. public $order_refund_id;
  26. public $type;
  27. public $action;
  28. public $address_id;
  29. public $refund_price;
  30. public $refund;//是否退款
  31. public $orderType; //退款订单类型
  32. public $remark;
  33. public function rules()
  34. {
  35. return [
  36. [['order_refund_id', 'type', 'action'], 'required'],
  37. [['refund'], 'safe'],
  38. [['refund_price',], 'number', 'min' => 0.01,],
  39. [['address_id'], 'integer'],
  40. [['remark'], 'string'],
  41. ];
  42. }
  43. public function attributeLabels()
  44. {
  45. return [
  46. 'refund_price' => '退款金额',
  47. 'orderType' => '订单类型',
  48. ];
  49. }
  50. public function save()
  51. {
  52. if (!$this->validate()) {
  53. return [
  54. 'code' => 1,
  55. 'msg' => $this->getErrorSummary(false)[0],
  56. ];
  57. }
  58. $query = OrderRefund::find()->with('goods');
  59. $order_refund = $query->where([
  60. 'id' => $this->order_refund_id,
  61. 'store_id' => $this->store_id,
  62. 'is_delete' => Order::IS_DELETE_FALSE,
  63. ])->one();
  64. if (!$order_refund) {
  65. return [
  66. 'code' => 1,
  67. 'msg' => '售后订单不存在,请刷新页面'
  68. ];
  69. }
  70. if ($order_refund->status != 0) {
  71. return [
  72. 'code' => 1,
  73. 'msg' => '售后订单已经处理过了,请刷新页面',
  74. 'id' => $order_refund->id,
  75. ];
  76. }
  77. if ($this->type == 1) {
  78. return $this->submit1($order_refund);
  79. }
  80. if ($this->type == 2) {
  81. return $this->submit2($order_refund);
  82. }
  83. }
  84. /**
  85. * 平台订单退货退款
  86. * @param $order_refund
  87. * @return \app\cyy\ValidationErrorResponse|array
  88. */
  89. private function submit1($order_refund)
  90. {
  91. $order = Order::findOne($order_refund->order_id);
  92. if ($this->action == 1) {//同意
  93. if ($this->refund != 1) {
  94. //仅同意,还未退款
  95. if ($this->refund_price) {
  96. if ($this->refund_price > $order_refund->refund_price) {
  97. return [
  98. 'code' => 1,
  99. 'msg' => '退款金额不能大于' . $order_refund->refund_price,
  100. ];
  101. }
  102. $order_refund->refund_price = $this->refund_price;
  103. }
  104. if (!$this->address_id) {
  105. return [
  106. 'code' => 1,
  107. 'msg' => '退货地址不能为空',
  108. ];
  109. };
  110. $order_refund->address_id = $this->address_id;
  111. $order_refund->is_agree = 1;
  112. $order_refund->save();
  113. if ($order_refund->save()) {
  114. return [
  115. 'code' => 0,
  116. 'msg' => '已同意退货。',
  117. ];
  118. }
  119. return [
  120. 'code' => 1,
  121. 'msg' => $this->getErrorSummary(false)[0],
  122. ];
  123. } else {
  124. //已同意,退款操作
  125. $order_refund->status = 1;
  126. $order_refund->response_time = time();
  127. if ($order_refund->refund_price > 0 && $order->pay_type == 1) {
  128. $res = Refund::refund($order, OrderNo::ORDER_MALL, $order_refund->order_refund_no, $order_refund->refund_price);
  129. if ($res !== true) {
  130. return $res;
  131. }
  132. }
  133. // 商城商品总库存恢复
  134. $order_detail_list = OrderDetail::find()->where(['order_id' => $order->id, 'is_delete' => 0])->all();
  135. foreach ($order_detail_list as $order_detail) {
  136. $goods = Goods::findOne($order_detail->goods_id);
  137. $attr_id_list = [];
  138. foreach (json_decode($order_detail->attr) as $item) {
  139. array_push($attr_id_list, $item->attr_id);
  140. }
  141. $goods->numAdd($attr_id_list, $order_detail->num);
  142. }
  143. $user = User::findOne(['id' => $order->user_id]);
  144. $integral = isset($order->integral) ? json_decode($order->integral)->forehead_integral : 0;
  145. if ($integral > 0) {
  146. $user->integral += $integral;
  147. $register = new Register();
  148. $register->store_id = $this->store_id;
  149. $register->user_id = $user->id;
  150. $register->register_time = '..';
  151. $register->created_at = time();
  152. $register->continuation = 0;
  153. $register->integral = $integral;
  154. $register->order_id = $order->id;
  155. $register->type = 9;
  156. $register->save();
  157. }
  158. if ($order_refund->refund_price > 0 && $order->pay_type == 3) {
  159. $before = $user->money;
  160. $user->money += floatval($order_refund->refund_price);
  161. $log = new AccountLog();
  162. $log->store_id = get_store_id();
  163. $log->user_id = $user->id;
  164. $log->type = AccountLog::TYPE_BALANCE;
  165. $log->amount = $order->pay_price;
  166. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  167. $log->desc = "商城售后订单退款:退款订单号:{$order_refund->order_refund_no}";
  168. $log->before = $before;
  169. $log->after = $user->money;
  170. $log->operator = '';
  171. $log->operator_id = 0;
  172. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  173. $log->created_at = time();
  174. $log->order_id = $order->id;
  175. $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER;
  176. $log->save();
  177. if (!$user->save()) {
  178. return [
  179. 'code' => 1,
  180. 'msg' => $this->getErrorSummary(false)[0],
  181. ];
  182. }
  183. }
  184. if ($order_refund->save()) {
  185. // TODO: 退款成功消息
  186. $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id);
  187. NoticeSend::OrderRefund($order->user_id, $order->mobile, $order->order_no, $order_refund->refund_price, $goods->name);
  188. return [
  189. 'code' => 0,
  190. 'msg' => '处理成功,已完成退款退货。',
  191. ];
  192. }
  193. return [
  194. 'code' => 1,
  195. 'msg' => $this->getErrorSummary(false)[0],
  196. ];
  197. }
  198. }
  199. if ($this->action == 2) {//拒绝
  200. $order_refund->status = 3;
  201. $order_refund->refuse_desc = $this->remark ? $this->remark : '卖家拒绝了您的退货请求';
  202. $order_refund->response_time = time();
  203. if ($order_refund->save()) {
  204. return [
  205. 'code' => 0,
  206. 'msg' => '处理成功,已拒绝该退货退款订单。',
  207. ];
  208. }
  209. return [
  210. 'code' => 1,
  211. 'msg' => $this->getErrorSummary(false)[0],
  212. ];
  213. }
  214. }
  215. /**
  216. * 统一处理换货
  217. * @param $order_refund
  218. * @return \app\cyy\ValidationErrorResponse|array
  219. */
  220. private function submit2($order_refund)
  221. {
  222. if ($this->action == 1) {//同意
  223. $order_refund->status = 2;
  224. if (!$this->address_id) {
  225. return [
  226. 'code' => 1,
  227. 'msg' => '退货地址不能为空',
  228. ];
  229. };
  230. $order_refund->address_id = $this->address_id;
  231. $order_refund->response_time = time();
  232. if ($order_refund->save()) {
  233. // TODO: 消息
  234. return [
  235. 'code' => 0,
  236. 'msg' => '处理成功,已同意换货。',
  237. ];
  238. }
  239. return [
  240. 'code' => 1,
  241. 'msg' => $this->getErrorSummary(false)[0],
  242. ];
  243. }
  244. if ($this->action == 2) {//拒绝
  245. $order_refund->status = 3;
  246. $order_refund->refuse_desc = $this->remark ? $this->remark : '卖家已拒绝您的换货请求';
  247. $order_refund->response_time = time();
  248. if ($order_refund->save()) {
  249. return [
  250. 'code' => 0,
  251. 'msg' => '处理成功,已拒绝换货请求。',
  252. ];
  253. }
  254. return [
  255. 'code' => 1,
  256. 'msg' => $this->getErrorSummary(false)[0],
  257. ];
  258. }
  259. }
  260. }