member_refund.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473
  1. <?php
  2. /**
  3. * 会员退款退货
  4. *
  5. *
  6. *
  7. * 全部退款,单个商品退货
  8. *
  9. */
  10. //use Shopnc\Tpl;
  11. defined('InShopNC') or exit('Access Invalid!');
  12. require_once(BASE_ROOT_PATH . '/helper/order_helper.php');
  13. require_once (BASE_ROOT_PATH . '/helper/fcode/operator.php');
  14. require_once (BASE_ROOT_PATH . '/helper/fcode/send_manager.php');
  15. require_once (BASE_ROOT_PATH . '/helper/user_session/fcode.php');
  16. class member_refundControl extends mbMemberControl
  17. {
  18. public function __construct()
  19. {
  20. parent::__construct();
  21. }
  22. public function listOp()
  23. {
  24. $helper = new refund_helper($_SESSION['member_id']);
  25. $refund_list = $helper->list_all($this->page_size(),$total_page);
  26. return self::outsuccess(array('refunds' => $refund_list,'mobile_page' => mobile_page($total_page)));
  27. }
  28. public function viewOp()
  29. {
  30. $refund_id = $_GET['refund_id'];
  31. if (!isset($refund_id)) {
  32. return self::outerr(errcode::ErrParamter);
  33. }
  34. $helper = new refund_helper($_SESSION['member_id']);
  35. $refund = $helper->view($refund_id,$err);
  36. if($refund == false) {
  37. return self::outerr($err['code'],$err['msg']);
  38. }
  39. else
  40. {
  41. $order = $this->get_order(array('order_id' => $refund['order_id'],'buyer_id' => $_SESSION['member_id']));
  42. if($order == false) {
  43. return self::outerr(errcode::ErrParamter,"查不到该订单");
  44. } else {
  45. global $config;
  46. return self::outsuccess(array('refund' => $refund,'order' => $order,'return_address' => $config['return_address']));
  47. }
  48. }
  49. }
  50. public function order_refundOp()
  51. {
  52. $order_sn = $_GET['order_sn'];
  53. if(!isset($order_sn) || empty($order_sn)) {
  54. return self::outerr(errcode::ErrParamter);
  55. }
  56. $helper = new refund_helper($_SESSION['member_id']);
  57. $refund_id = $helper->refund($order_sn,$err);
  58. if($refund_id == false) {
  59. return self::outerr($err['code'],$err['msg']);
  60. }
  61. else
  62. {
  63. $fcode = new user_session\fcode(true);
  64. $order = $this->get_order(array('order_sn' =>$order_sn,'buyer_id' => $_SESSION['member_id']));
  65. if($order == false) {
  66. return self::outerr(errcode::ErrParamter,"查不到该订单");
  67. } else {
  68. Logic('delivery')->cancel_oms($order_sn);
  69. return self::outsuccess(array('order' => $order));
  70. }
  71. }
  72. }
  73. public function return_infoOp()
  74. {
  75. $order_sn = $_GET['order_sn'];
  76. $rec_id = intval($_GET['rec_id']);
  77. if(empty($order_sn) || $rec_id <= 0) {
  78. return self::outerr(errcode::ErrParamter);
  79. }
  80. $helper = new refund_helper($_SESSION['member_id']);
  81. $ret = $helper->return_info($order_sn,$rec_id,$err);
  82. if($ret == false) {
  83. return self::outerr($err['code'],$err['msg']);
  84. }
  85. else
  86. {
  87. $reason_list = $ret['reason_list'];
  88. $goods_pay_price = doubleval($ret['goods']['goods_pay_price']);
  89. $order = $this->get_order(array('order_sn' =>$order_sn,'buyer_id' => $_SESSION['member_id']));
  90. if ($order != false)
  91. {
  92. $order_goods = &$order['order_goods'];
  93. foreach ($order_goods as &$item)
  94. {
  95. if($item['rec_id'] == $rec_id) {
  96. $item['goods_pay_price'] = $goods_pay_price;
  97. break;
  98. }
  99. }
  100. return self::outsuccess(array("reason_list" => $reason_list,'rec_id' => $rec_id,'order' => $order));
  101. }
  102. else
  103. {
  104. return self::outerr(errcode::ErrParamter,"查不到该订单");
  105. }
  106. }
  107. }
  108. public function goods_returnOp()
  109. {
  110. $order_sn = $_GET['order_sn'];
  111. $rec_id = intval($_GET['rec_id']);
  112. $buyer_msg = isset($_GET['buyer_message']) ? remove_tags(urldecode($_GET['buyer_message'])) : '';
  113. $goods_num = intval($_GET['goods_num']);
  114. $refund_amount = doubleval($_GET['refund_amount']);
  115. $reason_id = intval($_GET['reason_id']);//退货退款原因
  116. if(empty($order_sn) || $rec_id <= 0) {
  117. return self::outerr(errcode::ErrParamter);
  118. }
  119. $helper = new refund_helper($_SESSION['member_id']);
  120. $ret = $helper->return_goods($order_sn,$rec_id,$goods_num,$refund_amount,$reason_id,$buyer_msg,$err);
  121. if($ret == false) {
  122. return self::outerr($err['code'],$err['msg']);
  123. }
  124. else
  125. {
  126. $fcode = new user_session\fcode(true);
  127. $order = $this->get_order(array('order_sn' =>$order_sn,'buyer_id' => $_SESSION['member_id']));
  128. if($order == false) {
  129. return self::outerr(errcode::ErrParamter,"查不到该订单");
  130. } else {
  131. return self::outsuccess(array('order' => $order));
  132. }
  133. }
  134. }
  135. public function shipOp()
  136. {
  137. $refund_id = intval($_GET['refund_id']);
  138. $ship_code = remove_tags(urldecode($_GET['shipping_code']));
  139. $express_id = intval($_GET['express_id']);
  140. if($refund_id <= 0 || empty($ship_code)) {
  141. return self::outerr(errcode::ErrParamter);
  142. }
  143. $helper = new refund_helper($_SESSION['member_id']);
  144. $ret = $helper->ship($refund_id,$express_id,$ship_code,$err);
  145. if($ret == true) {
  146. return self::outsuccess(NULL);
  147. } else {
  148. return self::outerr($err['code'],$err['msg']);
  149. }
  150. }
  151. private function get_order($condition)
  152. {
  153. $model_order = Model('order');
  154. $order_list = $model_order->getNormalOrderList($condition, $this->page_size, '*', 'order_id desc', '', array('order_common','order_address', 'order_goods'));
  155. $order_helper = new order_helper($order_list);
  156. $orders = $order_helper->format();
  157. $model_order->cls();
  158. if(!empty($orders)) {
  159. return $orders[0];
  160. } else {
  161. return false;
  162. }
  163. }
  164. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  165. /**
  166. * 向商家添加全部退款请求,即付完款后取消订单
  167. */
  168. public function add_refund_allOp()
  169. {
  170. $order_info = Model('order')->getOrderInfo(array('order_sn' => $_GET['order_sn']));
  171. if (empty($order_info)) {
  172. return self::outerr(errcode::ErrOrderNotExist);
  173. }
  174. $model_refund = Model('refund_return');
  175. $order_id = intval($order_info['order_id']);
  176. $order = $model_refund->getRightOrderList(array('buyer_id' => $_SESSION['member_id'], 'order_id' => $order_id));
  177. $order_amount = $order['order_amount'];//订单金额
  178. $condition = array();
  179. {
  180. $condition['buyer_id'] = $order['buyer
  181. _id'];
  182. $condition['order_id'] = $order['order_id'];
  183. $condition['goods_id'] = '0';
  184. $condition['seller_state'] = array('lt', '3'); //状态:1为待审核,2为同意,3为不同意
  185. }
  186. $refund_list = $model_refund->getRefundReturnList($condition);
  187. $refund = array();
  188. if (!empty($refund_list) && is_array($refund_list)) {
  189. $refund = $refund_list[0];
  190. }
  191. $model_trade = Model('trade');
  192. $order_paid = $model_trade->getOrderState('order_paid');//订单状态20:已付款
  193. $payment_code = $order['payment_code'];//支付方式
  194. if ($refund['refund_id'] > 0 || $order['order_state'] != $order_paid || $payment_code == 'offline') {//检查订单状态,防止页面刷新不及时造成数据错误
  195. return self::outerr(errcode::ErrOrderState, "只有付完款尚未发货的时才能退款。");
  196. }
  197. $refund_array = array();
  198. $refund_array['refund_type'] = '1'; //类型:1为退款,2为退货
  199. $refund_array['seller_state'] = '1';//状态:1为待审核,2为同意,3为不同意
  200. $refund_array['order_lock'] = '2'; //锁定类型:1为不用锁定,2为需要锁定
  201. $refund_array['goods_id'] = '0';
  202. $refund_array['order_goods_id'] = '0';
  203. $refund_array['reason_id'] = '0';
  204. $refund_array['reason_info'] = '取消订单,全部退款';
  205. $refund_array['goods_name'] = '订单商品全部退款';
  206. $refund_array['refund_amount'] = ncPriceFormat($order_amount);
  207. $refund_array['buyer_message'] = remove_tags(urldecode($_POST['buyer_message']));
  208. $refund_array['add_time'] = time();
  209. $pic_array = array();
  210. $pic_array['buyer'] = array();
  211. $refund_array['pic_info'] = serialize($pic_array);
  212. $refund_id = $model_refund->addRefundReturn($refund_array, $order);
  213. if ($refund_id) {
  214. $model_refund->editOrderLock($order_id);
  215. return self::outsuccess(array("ret" => 1, "refund_id" => $refund_id, "order_sn" => $_GET['order_sn']));
  216. } else {
  217. return self::outerr(errcode::ErrOrderRefundError, "退款失败.");
  218. }
  219. }
  220. //该函数用来返回退款具体信息。已经付款,未发货时退款,退货。
  221. public function refund_one_infoOp()
  222. {
  223. $order_info = Model('order')->getOrderInfo(array('order_sn' => $_GET['order_sn']));
  224. if (empty($order_info)) {
  225. return self::outerr(errcode::ErrOrderNotExist);
  226. }
  227. $order_id = intval($order_info['order_id']);
  228. $order_goods_id = intval($_GET['order_goods_id']);//订单商品表编号
  229. if ($order_id < 1 || $order_goods_id < 1) { //参数验证
  230. return self::outerr(errcode::ErrParamter, "商品参数错误.");
  231. }
  232. $model_refund = Model('refund_return');
  233. $condition = array();
  234. $reason_data = $model_refund->getReasonList($condition, '', '', 'reason_id,reason_info');//退款退货原因
  235. foreach ($reason_data as $data) {
  236. $reason_list[] = $data;
  237. }
  238. array_push($reason_list, array('reason_id' => 0, 'reason_info' => '其他'));
  239. $condition = array();
  240. $condition['buyer_id'] = $_SESSION['member_id'];
  241. $condition['order_id'] = $order_id;
  242. $order = $model_refund->getRightOrderList($condition, $order_goods_id);
  243. $order_amount = $order['order_amount'];//订单金额
  244. $order_refund_amount = $order['refund_amount'];//订单退款金额
  245. $goods_list = $order['goods_list'];
  246. $goods = $goods_list[0];
  247. $goods_pay_price = $goods['goods_pay_price'];//商品实际成交价
  248. if ($order_amount < ($goods_pay_price + $order_refund_amount)) {
  249. $goods_pay_price = $order_amount - $order_refund_amount;
  250. $goods['goods_pay_price'] = $goods_pay_price;
  251. }
  252. $goods_id = $goods['rec_id'];
  253. $condition = array();
  254. $condition['buyer_id'] = $order['buyer_id'];
  255. $condition['order_id'] = $order['order_id'];
  256. $condition['order_goods_id'] = $goods_id;
  257. $condition['seller_state'] = array('lt', '3');
  258. $refund_list = $model_refund->getRefundReturnList($condition);
  259. $refund = array();
  260. if (!empty($refund_list) && is_array($refund_list)) {
  261. $refund = $refund_list[0];
  262. }
  263. $refund_state = $model_refund->getRefundState($order);//根据订单状态判断是否可以退款退货
  264. if ($refund['refund_id'] > 0) {
  265. return self::outerr(errcode::ErrOrderRefundError, "不能重复退货.");
  266. }
  267. if ($refund_state != 1) {
  268. return self::outerr(errcode::ErrOrderState, '请确认订单状态,在已经付款后才能退款,已经发货后才能退货.');
  269. }
  270. $goods['goods_image'] = cthumb($goods['goods_image'], 360, $order_info['store_id']);
  271. $goods['order_goods_id'] = $order_goods_id;
  272. return self::outsuccess(array('ret' => 1, 'reason_list' => (array)$reason_list, 'goods' => $goods));
  273. }
  274. //已经付款,未发货时退款。只能单品退款
  275. public function add_refund_oneOp()
  276. {
  277. // if(!isset($_GET['refund_type']) || empty($_GET['refund_type'])
  278. // || !in_array($_GET['refund_type'],self::$refund_type))
  279. // {
  280. // return self::outerr(errcode::ErrParamter,"请使用正确的退款类型,1:退款,2:退货.");
  281. //}
  282. //$refund_type = $_GET['refund_type'];
  283. $order_info = Model('order')->getOrderInfo(array('order_sn' => $_GET['order_sn']));
  284. if (empty($order_info)) {
  285. return self::outerr(errcode::ErrOrderNotExist);
  286. }
  287. $order_id = $order_info['order_id'];
  288. $order_goods_id = intval($_GET['order_goods_id']);//订单商品表编号
  289. if ($order_id < 1 || $order_goods_id < 1) { //参数验证
  290. return self::outerr(errcode::ErrParamter, "商品参数错误.");
  291. }
  292. $buyer_msg = isset($_GET['buyer_message']) ? remove_tags(urldecode($_GET['buyer_message'])) : '';
  293. $model_refund = Model('refund_return');
  294. $reason_list = $model_refund->getReasonList();//退款退货原因
  295. $reason_id = intval($_POST['reason_id']);//退货退款原因
  296. $reson_info = '其他';
  297. if (!empty($reason_list[$reason_id])) {
  298. $reason_array = $reason_list[$reason_id];
  299. $reson_info = $reason_array['reason_info'];
  300. }
  301. $goods_num = intval($_POST['goods_num']);//退货数量
  302. $refund_amount = doubleval($_POST['refund_amount']);//退款金额
  303. ////////////////////////////////////////////////////////////////
  304. $condition = array();
  305. $condition['buyer_id'] = $_SESSION['member_id'];
  306. $condition['order_id'] = $order_id;
  307. $order = $model_refund->getRightOrderList($condition, $order_goods_id);
  308. $order_id = $order['order_id'];
  309. $order_amount = $order['order_amount'];//订单金额
  310. $order_refund_amount = $order['refund_amount'];//订单退款金额
  311. $goods_list = $order['goods_list'];
  312. $goods = $goods_list[0];
  313. $goods_pay_price = $goods['goods_pay_price'];//商品实际成交价
  314. if ($order_amount < ($goods_pay_price + $order_refund_amount)) {
  315. $goods_pay_price = $order_amount - $order_refund_amount;
  316. $goods['goods_pay_price'] = $goods_pay_price;
  317. }
  318. $goods_id = $goods['rec_id'];
  319. $condition = array();
  320. $condition['buyer_id'] = $order['buyer_id'];
  321. $condition['order_id'] = $order['order_id'];
  322. $condition['order_goods_id'] = $goods_id;
  323. $condition['seller_state'] = array('lt', '3');
  324. $refund_list = $model_refund->getRefundReturnList($condition);
  325. $refund = array();
  326. if (!empty($refund_list) && is_array($refund_list)) {
  327. $refund = $refund_list[0];
  328. }
  329. $refund_state = $model_refund->getRefundState($order);//根据订单状态判断是否可以退款退货
  330. if ($refund['refund_id'] > 0 || $refund_state != 1) {//检查订单状态,防止页面刷新不及时造成数据错误
  331. return self::outerr(errcode::ErrOrderState);
  332. }
  333. $refund_array = array();
  334. if (($refund_amount < 0) || ($refund_amount > $goods_pay_price)) {
  335. $refund_amount = $goods_pay_price;
  336. }
  337. if (($goods_num < 0) || ($goods_num > $goods['goods_num'])) {
  338. $goods_num = 1;
  339. }
  340. $refund_array['reason_info'] = $reson_info;
  341. $refund_array['reason_id'] = $reason_id;
  342. $refund_array['pic_info'] = serialize(array('buyer' => array()));
  343. $model_trade = Model('trade');
  344. $order_shipped = $model_trade->getOrderState('order_shipped');//订单状态30:已发货
  345. if ($order['order_state'] == $order_shipped) {
  346. $refund_array['order_lock'] = '2';//锁定类型:1为不用锁定,2为需要锁定
  347. }
  348. $refund_array['refund_type'] = 2;//类型:1为退款,2为退货
  349. $refund_array['return_type'] = '2';//退货类型:1为不用退货,2为需要退货
  350. if ($refund_array['refund_type'] != '2') {
  351. $refund_array['refund_type'] = '1';
  352. $refund_array['return_type'] = '1';
  353. }
  354. $refund_array['seller_state'] = '1';//状态:1为待审核,2为同意,3为不同意
  355. $refund_array['refund_amount'] = ncPriceFormat($refund_amount);
  356. $refund_array['goods_num'] = $goods_num;
  357. $refund_array['buyer_message'] = $buyer_msg;
  358. $refund_array['add_time'] = time();
  359. $refund_id = $model_refund->addRefundReturn($refund_array, $order, $goods);
  360. if ($refund_id) {
  361. if ($order['order_state'] == $order_shipped) {
  362. $model_refund->editOrderLock($order_id);
  363. }
  364. return self::outsuccess(array('ret' => 1, "refund_id" => $refund_id, "order_sn" => $_GET['order_sn'], "order_goods_id" => $_GET['order_goods_id']));
  365. } else {
  366. return self::outerr(errcode::ErrOrderRefundError, "退货失败.");
  367. }
  368. }
  369. /**
  370. * 退款或退货退款记录详情
  371. */
  372. public function refund_viewOp()
  373. {
  374. if (!isset($_GET['refund_id']) || empty($_GET['refund_id'])) {
  375. return self::outerr(errcode::ErrParamter, "记录参数有误");
  376. }
  377. $model_refund = Model('refund_return');
  378. $condition = array();
  379. $condition['buyer_id'] = $_SESSION['member_id'];
  380. $condition['refund_id'] = intval($_GET['refund_id']);
  381. $condition['seller_state'] = array('lt', '3'); //状态:1为待审核,2为同意,3为不同意
  382. $refund_fields = 'refund_id,order_id,order_sn,order_goods_id,add_time,refund_type,return_type,seller_time,ship_time,admin_time';
  383. $refund_list = $model_refund->getRefundReturnList($condition, '', $refund_fields);
  384. if (empty($refund_list)) {
  385. return self::outerr(errcode::ErrOrderState);
  386. }
  387. $refund = $refund_list[0];
  388. $refund['refund_state'] = $model_refund->getRefundStatueApp($refund);
  389. unset($refund['seller_time']);
  390. unset($refund['ship_time']);
  391. unset($refund['admin_time']);
  392. $model_order = Model('order');
  393. $condition = array();
  394. $condition['order_id'] = $refund['order_id'];
  395. $condition['rec_id'] = $refund['order_goods_id'];
  396. $good_fields = 'goods_id,goods_name,goods_price,goods_num,goods_image,goods_pay_price,goods_type,commis_rate,gc_id,goods_spec';
  397. $refund['good_list'] = $model_order->getOrderGoodsList($condition, $good_fields);
  398. return self::outsuccess(array('refund' => $refund));
  399. }
  400. /**
  401. * 用户发货
  402. */
  403. public function refund_shipOp()
  404. {
  405. $model_refund = Model('refund_return');
  406. $condition = array();
  407. $condition['buyer_id'] = $_SESSION['member_id'];
  408. $condition['refund_id'] = intval($_GET['refund_id']);
  409. $return_list = $model_refund->getReturnList($condition);
  410. $return = $return_list[0];
  411. if ($return['seller_state'] != '2' || $return['goods_state'] != '1') {//检查状态,防止页面刷新不及时造成数据错误
  412. return self::outerr(errcode::ErrFrequentlyRequest, "该申请已发货");
  413. }
  414. $refund_array = array();
  415. $refund_array['ship_time'] = time();
  416. $refund_array['delay_time'] = time();
  417. // $refund_array['express_id'] = $_POST['express_id'];
  418. $refund_array['invoice_no'] = remove_tags(urldecode($_POST['invoice_no']));
  419. $refund_array['goods_state'] = '2';
  420. $state = $model_refund->editRefundReturn($condition, $refund_array);
  421. if ($state) {
  422. return self::outsuccess(array('ret' => 1));
  423. } else {
  424. return self::outerr(errcode::ErrOrderRefundError, "发货失败.");
  425. }
  426. }
  427. }