JielongOrderRefund.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用。
  9. * 任何企业和个人不允许对程序代码以任何形式任何目的再发布。
  10. * =========================================================
  11. */
  12. namespace addon\jielong\model;
  13. use app\model\member\MemberAccount;
  14. use app\model\BaseModel;
  15. use addon\coupon\model\Coupon;
  16. use app\model\system\Pay;
  17. /**
  18. * 订单退款
  19. *
  20. * @author Administrator
  21. *
  22. */
  23. class JielongOrderRefund extends BaseModel
  24. {
  25. //已申请退款
  26. const REFUND_APPLY = 1;
  27. //已完成
  28. const REFUND_COMPLETE = 2;
  29. //已拒绝
  30. const REFUND_REFUSE = -1;
  31. /**
  32. * 订单退款状态
  33. * @var unknown
  34. */
  35. public $order_refund_status = [
  36. self::REFUND_APPLY => [
  37. 'status' => self::REFUND_APPLY,
  38. 'name' => '申请退款',
  39. ],
  40. self::REFUND_COMPLETE => [
  41. 'status' => self::REFUND_COMPLETE,
  42. 'name' => '退款成功',
  43. ],
  44. self::REFUND_REFUSE => [
  45. 'status' => self::REFUND_REFUSE,
  46. 'name' => '退款拒绝',
  47. ]
  48. ];
  49. /*************************************************************************** 用户申请退款操作(start)**********************************/
  50. /**
  51. * 用户申请退款
  52. * @param $data
  53. * @return array
  54. */
  55. public function applyRefund($data)
  56. {
  57. $order_info = model('promotion_presale_order')->getInfo(
  58. [
  59. ['id', '=', $data['id']],
  60. ['site_id', '=', $data['site_id']]
  61. ],
  62. 'pay_end_time,order_status,refund_status,member_id,balance_final_money,pay_final_money'
  63. );
  64. if (empty($order_info) || $order_info['member_id'] != $data['member_id']) {
  65. return $this->error('', '非法请求!');
  66. }
  67. //不能重复申请退款
  68. if ($order_info['refund_status'] == self::REFUND_APPLY) {
  69. return $this->error('', '请不要重复申请退款');
  70. }
  71. //支付尾款了不能申请退款
  72. if ($order_info['order_status'] != PresaleOrderCommon::WAIT_FINAL_PAY) {
  73. return $this->error();
  74. }
  75. $pay_model = new Pay();
  76. $refund_no = $pay_model->createRefundNo();
  77. if ($order_info['refund_status'] == self::REFUND_REFUSE) {
  78. $order_data = [
  79. 'refund_status' => self::REFUND_APPLY,
  80. 'refund_status_name' => $this->order_refund_status[self::REFUND_APPLY]['name'],
  81. ];
  82. } else {
  83. $order_data = [
  84. 'deposit_refund_no' => $refund_no,
  85. 'refund_status' => self::REFUND_APPLY,
  86. 'refund_status_name' => $this->order_refund_status[self::REFUND_APPLY]['name'],
  87. 'apply_refund_time' => time(),
  88. ];
  89. }
  90. $res = model('promotion_presale_order')->update($order_data, [['id', '=', $data['id']], ['site_id', '=', $data['site_id']]]);
  91. return $this->success($res);
  92. }
  93. /**
  94. * 用户取消申请退款
  95. * @param array $condition
  96. */
  97. public function cancelRefund($condition = [])
  98. {
  99. $order_info = model('promotion_presale_order')->getInfo(
  100. $condition,
  101. 'pay_end_time,order_status,refund_status,'
  102. );
  103. if (empty($order_info)) {
  104. return $this->error('', '非法请求!');
  105. }
  106. //不能重复申请退款
  107. if ($order_info['refund_status'] != self::REFUND_APPLY) {
  108. return $this->error('', '已退款或已取消');
  109. }
  110. $order_data = [
  111. 'deposit_refund_no' => '',
  112. 'refund_status' => '',
  113. 'refund_status_name' => '',
  114. 'apply_refund_time' => '',
  115. ];
  116. $res = model('promotion_presale_order')->update($order_data, $condition);
  117. return $this->success($res);
  118. }
  119. /**
  120. * 拒绝退款
  121. * @param $data
  122. * @return array
  123. */
  124. public function refuseRefund($data)
  125. {
  126. $order_info = model('promotion_presale_order')->getInfo(
  127. [
  128. ['id', '=', $data['id']], ['site_id', '=', $data['site_id']]
  129. ]
  130. , 'refund_status'
  131. );
  132. if ($order_info['refund_status'] == self::REFUND_REFUSE) {
  133. return $this->success();
  134. }
  135. $order_data = [
  136. 'refund_status' => self::REFUND_REFUSE,
  137. 'refund_status_name' => $this->order_refund_status[self::REFUND_REFUSE]['name'],
  138. 'refuse_reason' => $data['refuse_reason'],
  139. 'refund_time' => time()
  140. ];
  141. $res = model('promotion_presale_order')->update($order_data, [['id', '=', $data['id']], ['site_id', '=', $data['site_id']]]);
  142. return $this->success($res);
  143. }
  144. /**
  145. * 同意退款
  146. * @param $data
  147. * @return array
  148. */
  149. public function agreeRefund($data)
  150. {
  151. $order_info = model('promotion_presale_order')->getInfo(
  152. [
  153. ['id', '=', $data['id']], ['site_id', '=', $data['site_id']]
  154. ]
  155. );
  156. if ($order_info['refund_status'] == self::REFUND_COMPLETE) {
  157. return $this->success();
  158. }
  159. model('promotion_presale_order')->startTrans();
  160. try {
  161. //增加库存
  162. model('promotion_presale')->setInc([['presale_id', '=', $order_info['presale_id']]], 'presale_stock', $order_info['num']);
  163. //增加门店库存
  164. if ($order_info['delivery_store_id'] > 0) {
  165. $presale_order_common = new PresaleOrderCommon();
  166. $store_data = [
  167. 'delivery_store_id' => $order_info['delivery_store_id'],
  168. 'num' => $order_info['num'],
  169. 'sku_id' => $order_info['sku_id']
  170. ];
  171. $store_result = $presale_order_common->incStoreGoodsStock($store_data);
  172. if ($store_result['code'] < 0) {
  173. model('promotion_presale_order')->rollback();
  174. return $store_result;
  175. }
  176. }
  177. //返还店铺优惠券
  178. $coupon_id = $order_info["coupon_id"];
  179. if ($coupon_id > 0) {
  180. $coupon_model = new Coupon();
  181. $coupon_model->refundCoupon($coupon_id, $order_info["member_id"]);
  182. }
  183. //平台优惠券
  184. //平台余额 退还余额(定金余额)
  185. $balance_money = 0;
  186. if ($order_info["balance_deposit_money"] > 0) {
  187. $balance_money += $order_info["balance_deposit_money"];
  188. }
  189. if ($order_info["balance_final_money"] > 0) {
  190. $balance_money += $order_info["balance_final_money"];
  191. }
  192. if ($balance_money > 0) {
  193. $member_account_model = new MemberAccount();
  194. $member_account_model->addMemberAccount($order_info['site_id'], $order_info["member_id"], "balance", $balance_money, "refund", "余额返还", "订单关闭,返还余额:" . $balance_money);
  195. }
  196. //现金原路退还
  197. if ($order_info["pay_deposit_money"] > 0) {
  198. $pay_model = new Pay();
  199. $refund_result = $pay_model->refund($order_info["deposit_refund_no"], $order_info['pay_deposit_money'], $order_info["deposit_out_trade_no"], '', $order_info['pay_deposit_money'], $order_info["site_id"], 1);
  200. if ($refund_result["code"] < 0) {
  201. model('promotion_presale_order')->rollback();
  202. return $refund_result;
  203. }
  204. }
  205. $order_common = new PresaleOrderCommon();
  206. //修改订单退款状态
  207. $order_data = [
  208. 'order_status' => $order_common::ORDER_CLOSE,
  209. 'order_status_name' => $order_common->order_status[$order_common::ORDER_CLOSE]['name'],
  210. 'order_status_action' => json_encode($order_common->order_status[$order_common::ORDER_CLOSE], JSON_UNESCAPED_UNICODE),
  211. 'refund_status' => self::REFUND_COMPLETE,
  212. 'refund_status_name' => $this->order_refund_status[self::REFUND_COMPLETE]['name'],
  213. 'refund_money' => $balance_money + $order_info["pay_deposit_money"],
  214. 'refund_time' => time(),
  215. ];
  216. model('promotion_presale_order')->update($order_data, [['id', '=', $data['id']], ['site_id', '=', $data['site_id']]]);
  217. //减少预约数量
  218. model('promotion_presale')->setDec([['presale_id', '=', $order_info['presale_id']]],'sale_num',$order_info['num']);
  219. model('promotion_presale_order')->commit();
  220. return $this->success();
  221. } catch (\Exception $e) {
  222. model('promotion_presale_order')->rollback();
  223. return $this->error('', $e->getMessage());
  224. }
  225. }
  226. /*************************************************************************** 用户申请退款操作(end)**********************************/
  227. /*************************************************************************** 订单退款相关操作(start)**********************************/
  228. /**
  229. * 订单退款
  230. * @param $data
  231. * @return array|mixed|void
  232. */
  233. public function refundPresaleOrder($order_no,$is_deposit_back=1)
  234. {
  235. $order_info = model('promotion_presale_order')->getInfo(
  236. [
  237. ['order_no', '=', $order_no]
  238. ]
  239. );
  240. if (empty($order_info)) {
  241. return $this->success();
  242. }
  243. if ($order_info['refund_status'] == self::REFUND_COMPLETE) {
  244. return $this->success();
  245. }
  246. model('promotion_presale_order')->startTrans();
  247. try {
  248. //修改订单退款状态
  249. $pay_model = new Pay();
  250. $deposit_refund_no = $pay_model->createRefundNo();
  251. $final_refund_no = $pay_model->createRefundNo();
  252. //定金原路退还
  253. if ($order_info["pay_deposit_money"] > 0 && $is_deposit_back == 1) {
  254. $pay_model = new Pay();
  255. $refund_result = $pay_model->refund($deposit_refund_no, $order_info['pay_deposit_money'], $order_info["deposit_out_trade_no"], '', $order_info['pay_deposit_money'], $order_info["site_id"], 1);
  256. if ($refund_result["code"] < 0) {
  257. model('promotion_presale_order')->rollback();
  258. return $refund_result;
  259. }
  260. }
  261. //尾款原路退还
  262. if ($order_info["pay_final_money"] > 0) {
  263. $pay_model = new Pay();
  264. $refund_result = $pay_model->refund($final_refund_no, $order_info['pay_final_money'], $order_info["final_out_trade_no"], '', $order_info['pay_final_money'], $order_info["site_id"], 1);
  265. if ($refund_result["code"] < 0) {
  266. model('promotion_presale_order')->rollback();
  267. return $refund_result;
  268. }
  269. }
  270. //平台余额 退还余额(定金余额)
  271. $balance_money = 0;
  272. if ($order_info["balance_deposit_money"] > 0 && $is_deposit_back == 1) {
  273. $balance_money += $order_info["balance_deposit_money"];
  274. }
  275. if ($order_info["balance_final_money"] > 0) {
  276. $balance_money += $order_info["balance_final_money"];
  277. }
  278. if ($balance_money > 0) {
  279. $member_account_model = new MemberAccount();
  280. $member_account_model->addMemberAccount($order_info['site_id'], $order_info["member_id"], "balance", $balance_money, "refund", "余额返还", "订单关闭,返还余额:" . $balance_money);
  281. }
  282. $order_common = new PresaleOrderCommon();
  283. $order_data = [
  284. 'order_status' => $order_common::ORDER_CLOSE,
  285. 'order_status_name' => $order_common->order_status[$order_common::ORDER_CLOSE]['name'],
  286. 'order_status_action' => json_encode($order_common->order_status[$order_common::ORDER_CLOSE], JSON_UNESCAPED_UNICODE),
  287. 'deposit_refund_no' => $deposit_refund_no,
  288. 'final_refund_no' => $final_refund_no,
  289. 'refund_status' => self::REFUND_COMPLETE,
  290. 'refund_status_name' => $this->order_refund_status[self::REFUND_COMPLETE]['name'],
  291. 'refund_money' => $order_info["pay_deposit_money"] + $order_info["pay_final_money"] + $balance_money,
  292. 'refuse_time' => time(),
  293. ];
  294. model('promotion_presale_order')->update($order_data, [['order_no', '=', $order_no]]);
  295. model('promotion_presale_order')->commit();
  296. return $this->success();
  297. } catch (\Exception $e) {
  298. model('promotion_presale_order')->rollback();
  299. return $this->error('', $e->getMessage());
  300. }
  301. }
  302. /*************************************************************************** 订单退款相关操作(end)**********************************/
  303. }