OrderRevokeForm.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\admin\models;
  8. use app\models\AccountLog;
  9. use app\models\Goods;
  10. use app\models\Order;
  11. use app\models\OrderDetail;
  12. use app\models\OrderGoodsCancel;
  13. use app\models\OrderRefund;
  14. use app\models\Register;
  15. use app\models\SaasUser;
  16. use app\models\SeckillActivityGoods;
  17. use app\models\SeckillActivityOrderLog;
  18. use app\models\User;
  19. use app\models\UserCoupon;
  20. use app\models\OrderRefundMoney;
  21. use app\plugins\adopt\models\AdoptCostOrder;
  22. use app\utils\OrderNo;
  23. use app\utils\Refund;
  24. use yii\base\BaseObject;
  25. use yii\base\Model;
  26. use app\utils\Notice\NoticeSend;
  27. class OrderRevokeForm extends Model
  28. {
  29. public $store_id;
  30. public $user_id;
  31. public $order_id;
  32. public $delete_pass = false;
  33. public $form_id = '';
  34. public function rules()
  35. {
  36. return [
  37. [['order_id'], 'required'],
  38. ];
  39. }
  40. public function refundMoney($order, $desc = '', $refund_price = 0.01) {
  41. if($order->is_pay != 1){
  42. return [
  43. 'code' => 1,
  44. 'msg' => '操作失败,订单还未支付。',
  45. ];
  46. }
  47. if($refund_price <= 0){
  48. return [
  49. 'code' => 1,
  50. 'msg' => '操作失败,退款金额不能为0。',
  51. ];
  52. }
  53. $rmSum = \app\models\OrderRefundMoney::find()->where(['is_delete' => 0, 'status' => 1, 'order_id' => $order['id']])->sum('refund_price');
  54. if($refund_price + $rmSum > $order['pay_price']){
  55. return [
  56. 'code' => 1,
  57. 'msg' => '操作失败,退款金额超出订单金额。',
  58. ];
  59. }
  60. // $t = \Yii::$app->db->beginTransaction();
  61. $refund = new OrderRefundMoney();
  62. $refund->status = 1;
  63. $refund->desc = $desc;
  64. $refund->refund_price = $refund_price;
  65. $refund->store_id = $order->store_id;
  66. $refund->user_id = $order->user_id;
  67. $refund->order_id = $order->id;
  68. $refund->order_refund_no = $this->getOrderRefundNo();
  69. if ($refund->save()) {
  70. // 已付款就退款
  71. if (in_array($order->pay_type, [1, 4, Order::PAY_TYPE_WX_B2B, Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY, Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX])) {
  72. $refund_res = Refund::refund($order, OrderNo::ORDER_MALL, $refund->order_refund_no, $refund->refund_price);
  73. if ($refund_res !== true) {
  74. $refund->status = 0;
  75. $refund->status_desc = json_encode($refund_res, JSON_UNESCAPED_UNICODE);
  76. $refund->save();
  77. return [
  78. 'code' => 1,
  79. 'msg' => '操作失败.' . $refund_res['msg'],
  80. 'r' => $refund_res,
  81. ];
  82. }
  83. }
  84. // 商城商品总库存恢复
  85. $order_detail_list = OrderDetail::find()->where(['order_id' => $order->id, 'is_delete' => 0])->all();
  86. foreach ($order_detail_list as $order_detail) {
  87. $goods = Goods::findOne($order_detail->goods_id);
  88. $attr_id_list = [];
  89. foreach (json_decode($order_detail->attr) as $item) {
  90. array_push($attr_id_list, $item->attr_id);
  91. }
  92. $goods->numAdd($attr_id_list, $order_detail->num);
  93. }
  94. $user = User::findOne(['id' => $order->user_id]);
  95. if($order['giving_gifts_received_user_id']){
  96. $user = User::findOne($order['giving_gifts_received_user_id']);
  97. }
  98. $integral = isset($order->integral) ? json_decode($order->integral)->forehead_integral : 0;
  99. if ($integral > 0) {
  100. $user->integral += $integral;
  101. }
  102. $balance = isset($order->balance) ? $order->balance : 0;
  103. if ($balance > 0) {
  104. $before = $user->money;
  105. $user->money += $balance;
  106. $log = new AccountLog();
  107. $log->store_id = $user->store_id;
  108. $log->user_id = $user->id;
  109. $log->type = AccountLog::TYPE_GOODS_BALANCE;
  110. $log->amount = $balance;
  111. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  112. $log->desc = "商城售后订单退款,商品余额抵扣:退款订单号:{$refund->order_refund_no}";
  113. $log->before = $before;
  114. $log->after = $user->money;
  115. $log->operator = '';
  116. $log->operator_id = 0;
  117. $log->operator_type = AccountLog::TYPE_OPERATOR_BACK;
  118. $log->created_at = time();
  119. $log->order_id = $order->id;
  120. $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER;
  121. $log->save();
  122. if (!$user->save()) {
  123. return [
  124. 'code' => 1,
  125. 'msg' => $this->getErrorSummary(false)[0],
  126. ];
  127. }
  128. }
  129. if ($order->pay_type == 3) {
  130. $before = $user->money;
  131. $user->money += floatval($refund->refund_price);
  132. $log = new AccountLog();
  133. $log->store_id = $user->store_id;
  134. $log->user_id = $user->id;
  135. $log->type = AccountLog::TYPE_BALANCE;
  136. $log->amount = floatval($refund->refund_price);
  137. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  138. $log->desc = "商城售后订单退款:退款订单号:{$refund->order_refund_no}";
  139. $log->before = $before;
  140. $log->after = $user->money;
  141. $log->operator = '';
  142. $log->operator_id = 0;
  143. $log->operator_type = AccountLog::TYPE_OPERATOR_BACK;
  144. $log->created_at = time();
  145. $log->order_id = $order->id;
  146. $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER;
  147. $log->save();
  148. if (!$user->save()) {
  149. return [
  150. 'code' => 1,
  151. 'msg' => $this->getErrorSummary(false)[0],
  152. ];
  153. }
  154. }
  155. // todo 因为只是售后订单这里有退款 判断一下退款的金额==支付金额时候 将售后订单状态修改为完成状态
  156. $rmAllSum = \app\models\OrderRefundMoney::find()->where(['is_delete' => 0, 'status' => 1, 'order_id' => $order['id']])->sum('refund_price');
  157. if($rmAllSum == $order['pay_price']){
  158. OrderRefund::updateAll(['status'=>1,'is_user_send' => 1,'is_agree'=>1], ['order_id' => $order['id']]);
  159. }
  160. if ($refund->save()) {
  161. $goods = Goods::findOne(OrderDetail::findOne(['order_id' => $order->id])->goods_id);
  162. NoticeSend::OrderRefund($order->user_id, $order->mobile, $order->order_no, $refund->refund_price, $goods->name);
  163. return [
  164. 'code' => 0,
  165. 'msg' => '处理成功,已完成退款退货。',
  166. ];
  167. }
  168. return [
  169. 'code' => 1,
  170. 'msg' => $this->getErrorSummary(false)[0],
  171. ];
  172. return [
  173. 'code' => 0,
  174. 'msg' => '操作成功',
  175. ];
  176. }
  177. return [
  178. 'code' => 1,
  179. 'msg' => '操作失败',
  180. ];
  181. }
  182. private function getOrderRefundNo()
  183. {
  184. $order_refund_no = null;
  185. while (true) {
  186. $order_refund_no = 'RM'.date('YmdHis') . mt_rand(100000, 999999);
  187. $exist_order_refund_no = OrderRefundMoney::find()->where(['order_refund_no' => $order_refund_no])->exists();
  188. if (!$exist_order_refund_no) {
  189. break;
  190. }
  191. }
  192. return $order_refund_no;
  193. }
  194. public function save()
  195. {
  196. if (!$this->validate()) {
  197. return [
  198. 'code' => 1,
  199. 'msg' => $this->getErrorSummary(false)[0],
  200. ];
  201. }
  202. /**
  203. * @var Order $order
  204. */
  205. $store_id = $this->store_id;
  206. if ($store_id <= 0) {
  207. $store_id = [0, -1];
  208. }
  209. //TODO 取消订单需要退积分,这里剩余如果检测到是平台操作,就使用saas_user添加积分信息
  210. $order = Order::find()->where([
  211. 'store_id' => $store_id,
  212. 'id' => $this->order_id,
  213. 'is_delete' => Order::IS_DELETE_FALSE,
  214. ])->one();
  215. if (!$order) {
  216. return [
  217. 'code' => 1,
  218. 'msg' => '订单不存在'
  219. ];
  220. }
  221. $t = \Yii::$app->db->beginTransaction();
  222. // 已支付订单需要后台先审核
  223. if ($order->is_pay == 1 && !$this->delete_pass) {
  224. $order->apply_delete = Order::ORDER_APPLY_DELETE;
  225. if ($order->save()) {
  226. return [
  227. 'code' => 0,
  228. 'msg' => '订单取消申请已提交,请等候管理员审核'
  229. ];
  230. } else {
  231. return [
  232. 'code' => 1,
  233. 'msg' => $this->getErrorSummary(false)[0],
  234. ];
  235. }
  236. }
  237. $other_msg = ' ';
  238. // $order->is_delete = Order::IS_DELETE_TRUE;
  239. $order->trade_status = Order::ORDER_FLOW_CANCEL;
  240. $order_detail_list = OrderDetail::find()->where(['order_id' => $order->id,
  241. 'is_delete' => Order::IS_DELETE_FALSE])->asArray()->all();
  242. // 库存恢复
  243. if (!$order->save()) {
  244. return [
  245. 'code' => 1,
  246. 'msg' => implode(';', array_values($order->firstErrors)),
  247. ];
  248. };
  249. $order_pay_price = $order->pay_price;
  250. $order_detail_list_array = [];
  251. foreach ($order_detail_list as $order_detail) {
  252. //获取到已经取消或者在申请中的取消商品订单
  253. $orderGoodsCancel = OrderGoodsCancel::getCancelGoodsOrderQuery(
  254. $order->id,
  255. 'status, SUM(num) as num, SUM(refund_price) as refund_price',
  256. 'status',
  257. $order_detail['id']
  258. )->asArray()->all();
  259. foreach ($orderGoodsCancel as $goodsCancelItem) {
  260. //如果在申请中的就给取消
  261. if ($goodsCancelItem['status'] == OrderGoodsCancel::STATUS_APPLY) {
  262. OrderGoodsCancel::updateAll(
  263. ['status' => OrderGoodsCancel::STATUS_CANCEL],
  264. ['order_detail_id' => $order_detail['id'], 'status' => OrderGoodsCancel::STATUS_APPLY]);
  265. } else {
  266. $order_detail['num'] = $order_detail['num'] - $goodsCancelItem['num'];
  267. $total_price = $order_detail['total_price'] - $goodsCancelItem['refund_price'];
  268. $order_detail['total_price'] = $total_price > 0 ? $total_price : 0;
  269. $order_pay_price -= $goodsCancelItem['refund_price'];
  270. }
  271. }
  272. if ($order_detail['num'] <= 0) {
  273. continue;
  274. }
  275. $order_detail_list_array[] = $order_detail;
  276. if($order->order_type == 1){
  277. continue;
  278. }
  279. $goods = Goods::findOne($order_detail['goods_id']);
  280. $attr_id_list = [];
  281. foreach (json_decode($order_detail['attr']) as $item) {
  282. array_push($attr_id_list, $item->attr_id);
  283. }
  284. // $goods->numAdd($attr_id_list, $order_detail->num);
  285. if (!in_array($order->order_type, [1, 2])) {
  286. if (!$goods->numAdd($attr_id_list, $order_detail['num'])) {
  287. // $t->rollBack();
  288. // return [
  289. // 'code' => 1,
  290. // 'msg' => '订单取消失败,库存操作失败',
  291. // ];
  292. $other_msg .= " 库存操作失败";
  293. }
  294. }
  295. }
  296. $order_detail_list = $order_detail_list_array;
  297. // todo 秒杀订单退秒杀库存 和 秒杀销量
  298. if($order->seckill_order_id > 0){
  299. $seckillActivityOrderLog = SeckillActivityOrderLog::find()->where(['id' => $order->seckill_order_id])->one();
  300. $seckillActivityGoods = SeckillActivityGoods::findOne([
  301. 'id' =>$seckillActivityOrderLog->activity_goods_id,
  302. 'goods_id' => $seckillActivityOrderLog->goods_id,
  303. 'store_id' => $order->store_id,'is_delete' => 0
  304. ]);
  305. // 这里循环的还是订单商品信息表
  306. foreach($order_detail_list as $order_detail){
  307. $attr_id_list = [];
  308. foreach (json_decode($order_detail['attr'], true) as $item) {
  309. array_push($attr_id_list, $item['attr_id']);
  310. }
  311. // 这里执行退库存的是秒杀商品的库存
  312. if ($seckillActivityGoods) {
  313. $seckillActivityGoods->numAdd($attr_id_list,$order_detail['num']);
  314. }
  315. }
  316. if ($seckillActivityGoods) {
  317. // 减去销量
  318. $seckillActivityGoods->sale_num -= array_sum(array_column($order_detail_list, 'num'));
  319. $seckillActivityGoods->save();
  320. }
  321. // 恢复库存之后 将秒杀订单修改未删除状态
  322. $seckillActivityOrderLog->is_delete = 1;
  323. $seckillActivityOrderLog->save();
  324. }
  325. // TODO 用户商品抵扣余额恢复
  326. $balance = $order->balance;
  327. $user = User::findOne(['id' => $order->user_id]);
  328. if($order['giving_gifts_received_user_id']){
  329. $user = User::findOne($order['giving_gifts_received_user_id']);
  330. }
  331. $type_1 = 0;
  332. $store_id = $order->store_id;
  333. if ($order->store_id <= 0) {
  334. $store_id = 0;
  335. $user = SaasUser::findOne(['id' => $order->saas_id]);
  336. $type_1 = 1;
  337. }
  338. if (!$user) {
  339. return [
  340. 'code' => 1,
  341. 'msg' => '用户数据未找到',
  342. ];
  343. }
  344. if ($balance > 0) {
  345. $old_balance = $user->money;
  346. $user->money += $balance;
  347. $log = new AccountLog();
  348. $log->store_id = $store_id;
  349. if ($type_1) {
  350. $log->saas_id = $user->id;
  351. $log->user_id = 0;
  352. } else {
  353. $log->user_id = $user->id;
  354. }
  355. $log->type = AccountLog::TYPE_GOODS_BALANCE;
  356. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  357. $log->amount = $balance;
  358. $log->desc = "商品余额抵扣订单退款, 订单号:{$order->order_no}";
  359. $log->before = $old_balance;
  360. $log->after = $user->money;
  361. $log->operator = 'system';
  362. $log->operator_id = 0;
  363. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  364. $log->created_at = time();
  365. $log->order_id = $order->id;
  366. $log->order_type = AccountLog::TYPE_PLATFORM_ORDER;
  367. $log->save();
  368. $user->save();
  369. }
  370. // 用户积分恢复
  371. $integral = json_decode($order->integral)->forehead_integral;
  372. $user = User::findOne(['id' => $order->user_id]);
  373. if($order['giving_gifts_received_user_id']){
  374. $user = User::findOne($order['giving_gifts_received_user_id']);
  375. }
  376. $type = 0;
  377. $store_id = $order->store_id;
  378. if ($order->store_id <= 0) {
  379. $store_id = 0;
  380. $user = SaasUser::findOne(['id' => $order->saas_id]);
  381. $type = 1;
  382. }
  383. if (! $user) {
  384. return [
  385. 'code' => 1,
  386. 'msg' => '用户数据未找到',
  387. ];
  388. }
  389. //修改未支付但是取消订单的逻辑
  390. if (intval($order->is_pay) === 1 || (intval($order->pay_type) === Order::PAY_TYPE_COD && intval($order->is_pay) === 0)) {
  391. $addIntegral = 0;
  392. if (!$addIntegral && $integral > 0) {
  393. $addIntegral = 1;
  394. $old_integral = $user->integral;
  395. $user->integral += $integral;
  396. $log = new AccountLog();
  397. $log->store_id = $store_id;
  398. if ($type) {
  399. $log->saas_id = $user->id;
  400. $log->user_id = 0;
  401. } else {
  402. $log->user_id = $user->id;
  403. }
  404. $log->type = AccountLog::TYPE_INTEGRAL;
  405. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  406. $log->amount = $integral;
  407. $log->desc = "商城订单取消, 订单号:{$order->order_no}";
  408. $log->before = $old_integral;
  409. $log->after = $user->integral;
  410. $log->operator = 'system';
  411. $log->operator_id = 0;
  412. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  413. $log->created_at = time();
  414. $log->order_id = $order->id;
  415. $log->order_type = AccountLog::TYPE_PLATFORM_ORDER;
  416. $log->save();
  417. }
  418. //新积分兑换商品退还积分
  419. $new_integral = $order->integral_price;
  420. if(!$addIntegral && $new_integral > 0){
  421. $addIntegral = 1;
  422. $old_integral = $user->integral;
  423. $user->integral += $new_integral;
  424. $log = new AccountLog();
  425. $log->store_id = $store_id;
  426. if ($type) {
  427. $log->saas_id = $user->id;
  428. $log->user_id = 0;
  429. } else {
  430. $log->user_id = $user->id;
  431. }
  432. $log->type = AccountLog::TYPE_INTEGRAL;
  433. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  434. $log->amount = $new_integral;
  435. $log->desc = "商城订单取消, 订单号:{$order->order_no}";
  436. $log->before = $old_integral;
  437. $log->after = $user->integral;
  438. $log->operator = 'system';
  439. $log->operator_id = 0;
  440. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  441. $log->created_at = time();
  442. $log->order_id = $order->id;
  443. $log->order_type = AccountLog::TYPE_PLATFORM_ORDER;
  444. if (!$log->save()) {
  445. debug_log([
  446. 'error' => $log->errors
  447. ], 'orderDelete.log');
  448. };
  449. }
  450. }
  451. // 余额支付 退换余额
  452. if ($order->is_pay == Order::IS_PAY_TRUE && $order->pay_type == Order::PAY_TYPE_BALANCE_PAID && isset($user->money)) {
  453. $before = $user->money;
  454. $user->money += floatval($order_pay_price);
  455. $log = new AccountLog();
  456. $log->store_id = $store_id;
  457. if ($type) {
  458. $log->saas_id = $user->id;
  459. } else {
  460. $log->user_id = $user->id;
  461. }
  462. $log->type = AccountLog::TYPE_BALANCE;
  463. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  464. $log->amount = $order_pay_price;
  465. $log->desc = "商城订单退款,订单号:{$order->order_no}";
  466. $log->before = $before;
  467. $log->after = $user->money;
  468. $log->operator = 'system';
  469. $log->operator_id = 0;
  470. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  471. $log->created_at = time();
  472. $log->order_id = $order->id;
  473. $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER;
  474. $log->save();
  475. }
  476. if (!$user->save()) {
  477. $t->rollBack();
  478. return [
  479. 'code' => 1,
  480. 'msg' => $this->getErrorSummary(false)[0],
  481. ];
  482. }
  483. // 已付款就退款
  484. if ($order->is_pay == 1 && ($order->pay_type == 1 || $order->pay_type == 4 || in_array($order->pay_type, [Order::PAY_TYPE_WX_B2B, Order::PAY_TYPE_MONTH, Order::PAY_TYPE_ADAPAY_WX, Order::PAY_TYPE_ADAPAY_ALIPAY, Order::PAY_TYPE_ADAPAY_QUICKPAY_FRONTPAY, Order::PAY_TYPE_HUIFU_V2_JSPAY_WX]) || $order->pay_type === Order::PAY_TYPE_YUNST_WECHAT_PAY)) {
  485. if ($order_pay_price > 0) {
  486. $refund_res = Refund::refund($order, $order->order_union_id ? OrderNo::ORDER_UNION : '',$order->order_no, $order_pay_price);
  487. if ($refund_res !== true) {
  488. $t->rollBack();
  489. return $refund_res;
  490. }
  491. }
  492. }
  493. if ($order->save()) {
  494. if ($order->user_coupon_id) {
  495. UserCoupon::updateAll(['is_use' => 0], ['id' => $order->user_coupon_id]);
  496. (new \app\utils\OrderUtil())->couponTimeout($order->user_coupon_id);
  497. }
  498. $new_delivery = new \app\utils\Delivery\WechatNewDelivery();
  499. $result = $new_delivery->cancelOrder(['order_no' => $order->order_no, 'store_id' => $store_id]);
  500. debug_log($result, 'delivery_.log');
  501. // 删除股东分红记录
  502. \app\utils\Share\BonusPool::cancelOrderShareDetail($order->id);
  503. $t->commit();
  504. return [
  505. 'code' => 0,
  506. 'msg' => '订单已取消' . $other_msg
  507. ];
  508. } else {
  509. $t->rollBack();
  510. return [
  511. 'code' => 1,
  512. 'msg' => '订单取消失败'
  513. ];
  514. }
  515. }
  516. public function saveCost()
  517. {
  518. if (!$this->validate()) {
  519. return [
  520. 'code' => 1,
  521. 'msg' => $this->getErrorSummary(false)[0],
  522. ];
  523. }
  524. /**
  525. * @var Order $order
  526. */
  527. $order = AdoptCostOrder::find()->where([
  528. 'store_id' => $this->store_id,
  529. 'user_id' => $this->user_id,
  530. 'id' => $this->order_id,
  531. 'is_delete' => Order::IS_DELETE_FALSE,
  532. ])->andWhere(['in', 'trade_status', [Order::ORDER_FLOW_NO_SEND, Order::ORDER_FLOW_DEFAULT]])->one();
  533. if (!$order) {
  534. return [
  535. 'code' => 1,
  536. 'msg' => '订单不存在'
  537. ];
  538. }
  539. // 已支付订单需要后台先审核
  540. if ($order->is_pay == 1 && !$this->delete_pass) {
  541. $order->apply_delete = Order::ORDER_APPLY_DELETE;
  542. if ($order->save()) {
  543. return [
  544. 'code' => 0,
  545. 'msg' => '订单取消申请已提交,请等候管理员审核'
  546. ];
  547. } else {
  548. return [
  549. 'code' => 1,
  550. 'msg' => $this->getErrorSummary(false)[0],
  551. ];
  552. }
  553. }
  554. $order->is_delete = Order::IS_DELETE_TRUE;
  555. $order->trade_status = Order::ORDER_FLOW_CANCEL;
  556. $order_detail_list = OrderDetail::find()->where(['order_id' => $order->id,
  557. 'is_delete' => Order::IS_DELETE_FALSE])->all();
  558. $t = \Yii::$app->db->beginTransaction();
  559. $other_msg = " ";
  560. // 库存恢复
  561. foreach ($order_detail_list as $order_detail) {
  562. $goods = Goods::findOne($order_detail->goods_id);
  563. $attr_id_list = [];
  564. foreach (json_decode($order_detail->attr) as $item) {
  565. array_push($attr_id_list, $item->attr_id);
  566. }
  567. // $goods->numAdd($attr_id_list, $order_detail->num);
  568. if (!$goods->numAdd($attr_id_list, $order_detail->num)) {
  569. // $t->rollBack();
  570. // return [
  571. // 'code' => 1,
  572. // 'msg' => '订单取消失败,库存操作失败',
  573. // ];
  574. $other_msg .= " 库存操作失败";
  575. }
  576. }
  577. // 用户积分恢复
  578. $integral = json_decode($order->integral)->forehead_integral;
  579. $user = User::findOne(['id' => $order->user_id]);
  580. if (! $user) {
  581. return [
  582. 'code' => 1,
  583. 'msg' => '用户数据未找到',
  584. ];
  585. }
  586. if ($integral > 0) {
  587. $user->integral += $integral;
  588. }
  589. //余额支付 退换余额
  590. if ($order->is_pay == Order::IS_PAY_TRUE && $order->pay_type == Order::PAY_TYPE_BALANCE_PAID) {
  591. $before = $user->money;
  592. $user->money += floatval($order->pay_price);
  593. $log = new AccountLog();
  594. $log->store_id = get_store_id();
  595. $log->user_id = $user->id;
  596. $log->type = AccountLog::TYPE_BALANCE;
  597. $log->log_type = AccountLog::LOG_TYPE_INCOME;
  598. $log->amount = $order->pay_price;
  599. $log->desc = "商城订单退款,订单号({$order->order_no})";
  600. $log->before = $before;
  601. $log->after = $user->money;
  602. $log->operator = 'system';
  603. $log->operator_id = 0;
  604. $log->operator_type = AccountLog::TYPE_OPERATOR_NORMAL;
  605. $log->created_at = time();
  606. $log->order_id = $order->id;
  607. $log->order_type = AccountLog::TYPE_PLATFORM_REFUND_ORDER;
  608. $log->save();
  609. }
  610. if (!$user->save()) {
  611. $t->rollBack();
  612. return [
  613. 'code' => 1,
  614. 'msg' => $this->getErrorSummary(false)[0],
  615. ];
  616. }
  617. // 已付款就退款
  618. if ($order->is_pay == 1 && $order->pay_type == 1) {
  619. if ($order->pay_price > 0) {
  620. $refund_res = Refund::refund($order, $order->order_union_id ? OrderNo::ORDER_UNION : '',$order->order_no, $order->pay_price);
  621. if ($refund_res !== true) {
  622. $t->rollBack();
  623. return $refund_res;
  624. }
  625. }
  626. }
  627. if ($order->save()) {
  628. if ($order->is_pay == 0) {
  629. UserCoupon::updateAll(['is_use' => 0], ['id' => $order->user_coupon_id]);
  630. }
  631. $t->commit();
  632. return [
  633. 'code' => 0,
  634. 'msg' => '订单已取消' . $other_msg
  635. ];
  636. } else {
  637. $t->rollBack();
  638. return [
  639. 'code' => 1,
  640. 'msg' => '订单取消失败'
  641. ];
  642. }
  643. }
  644. }