order_helper.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 16/9/28
  6. * Time: 上午12:09
  7. */
  8. require_once (BASE_ROOT_PATH . '/helper/goods_helper.php');
  9. class refund_helper
  10. {
  11. private $member_id;
  12. public function __construct($member_id)
  13. {
  14. $this->member_id = intval($member_id);
  15. }
  16. public function list_all()
  17. {
  18. }
  19. public function refund($order_sn,&$err)
  20. {
  21. $order_info = Model('order')->getOrderInfo(array('order_sn' => $order_sn));
  22. if (empty($order_info)) {
  23. $err = array("code" => errcode::ErrOrderNotExist,'msg' => errcode::msg(errcode::ErrOrderNotExist));
  24. return false;
  25. }
  26. $model_refund = Model('refund_return');
  27. $order_id = intval($order_info['order_id']);
  28. $order = $model_refund->getRightOrderList(array('buyer_id' => $this->member_id, 'order_id' => $order_id));
  29. $order_amount = $order['order_amount'];//订单金额
  30. $condition = array();
  31. {
  32. $condition['buyer_id'] = $order['buyer_id'];
  33. $condition['order_id'] = $order['order_id'];
  34. $condition['goods_id'] = '0';
  35. $condition['seller_state'] = array('lt', '3'); //状态:1为待审核,2为同意,3为不同意
  36. }
  37. $refund_list = $model_refund->getRefundReturnList($condition);
  38. $refund = array();
  39. if (!empty($refund_list) && is_array($refund_list)) {
  40. $refund = $refund_list[0];
  41. }
  42. $model_trade = Model('trade');
  43. $order_paid = $model_trade->getOrderState('order_paid');
  44. $payment_code = $order['payment_code'];
  45. if ($refund['refund_id'] > 0 || $order['order_state'] != $order_paid || $payment_code == 'offline') {
  46. $err = array("code" => errcode::ErrOrderNotExist,'msg' => "只有付完款尚未发货的时才能退款。");
  47. return false;
  48. }
  49. $refund_array = array();
  50. $refund_array['refund_type'] = '1'; //类型:1为退款,2为退货
  51. $refund_array['seller_state'] = '1';//状态:1为待审核,2为同意,3为不同意
  52. $refund_array['order_lock'] = '2'; //锁定类型:1为不用锁定,2为需要锁定
  53. $refund_array['goods_id'] = '0';
  54. $refund_array['order_goods_id'] = '0';
  55. $refund_array['reason_id'] = '0';
  56. $refund_array['reason_info'] = '取消订单,全部退款';
  57. $refund_array['goods_name'] = '订单商品全部退款';
  58. $refund_array['refund_amount'] = ncPriceFormat($order_amount);
  59. $refund_array['buyer_message'] = remove_tags(urldecode($_POST['buyer_message']));
  60. $refund_array['add_time'] = time();
  61. $pic_array = array();
  62. $pic_array['buyer'] = array();
  63. $refund_array['pic_info'] = serialize($pic_array);
  64. $refund_id = $model_refund->addRefundReturn($refund_array, $order);
  65. return $refund_id;
  66. }
  67. private function reason_list($model_refund)
  68. {
  69. $condition = array();
  70. $reason_data = $model_refund->getReasonList($condition, '', '', 'reason_id,reason_info');
  71. $reason_list = [];
  72. foreach ($reason_data as $data) {
  73. $reason_list[] = $data;
  74. }
  75. $reason_list[] = array('reason_id' => 0, 'reason_info' => '其他');
  76. return $reason_list;
  77. }
  78. private function reason_info($model_refund,$reason_id)
  79. {
  80. $reason_list = $model_refund->reason_list($model_refund);
  81. if (array_key_exists($reason_id,$reason_list)) {
  82. return $reason_list[$reason_id];
  83. } else {
  84. return '其他';
  85. }
  86. }
  87. public function return_info($order_sn,$rec_id,&$err)
  88. {
  89. $order_info = Model('order')->getOrderInfo(array('order_sn' => $order_sn));
  90. if (empty($order_info)) {
  91. $err = array("code" => errcode::ErrOrderNotExist,'msg' => errcode::msg(errcode::ErrOrderNotExist));
  92. return false;
  93. }
  94. $order_id = intval($order_info['order_id']);
  95. if ($order_id < 1 || $rec_id < 1) {
  96. $err = array("code" => errcode::ErrParamter,'msg' => errcode::msg(errcode::ErrParamter));
  97. return false;
  98. }
  99. $model_refund = Model('refund_return');
  100. $reason_list = $this->reason_list($model_refund);
  101. $condition = array();
  102. $condition['buyer_id'] = $this->member_id;
  103. $condition['order_id'] = $order_id;
  104. $order = $model_refund->getRightOrderList($condition, $rec_id);
  105. $order_amount = $order['order_amount'];//订单金额
  106. $order_refund_amount = $order['refund_amount'];//订单退款金额
  107. $goods_list = $order['goods_list'];
  108. $goods = $goods_list[0];
  109. $goods_pay_price = $goods['goods_pay_price'];//商品实际成交价
  110. if ($order_amount < ($goods_pay_price + $order_refund_amount)) {
  111. $goods_pay_price = $order_amount - $order_refund_amount;
  112. $goods['goods_pay_price'] = $goods_pay_price;
  113. }
  114. $condition = array();
  115. $condition['buyer_id'] = $order['buyer_id'];
  116. $condition['order_id'] = $order['order_id'];
  117. $condition['order_goods_id'] = $rec_id;
  118. $condition['seller_state'] = array('lt', '3');
  119. $refund_list = $model_refund->getRefundReturnList($condition);
  120. $refund = array();
  121. if (!empty($refund_list) && is_array($refund_list)) {
  122. $refund = $refund_list[0];
  123. }
  124. $refund_state = $model_refund->getRefundState($order);//根据订单状态判断是否可以退款退货 '申请状态:1为处理中,2为待管理员处理,3为已完成,默认为1',
  125. if ($refund['refund_id'] > 0) {
  126. $err = array("code" => errcode::ErrOrderRefundError,'msg' => "不能重复退货");
  127. return false;
  128. }
  129. if ($refund_state != 1) {
  130. $err = array("code" => errcode::ErrOrderState,'msg' => '请确认订单状态,在已经付款后才能退款,已经发货后才能退货.');
  131. return false;
  132. }
  133. return array('reason_list' => (array)$reason_list, 'goods' => $goods);
  134. }
  135. public function return_goods($order_sn,$rec_id,$goods_num,$refund_amount,$reason_id,$buyer_msg,&$err)
  136. {
  137. $order_info = Model('order')->getOrderInfo(array('order_sn' => $order_sn));
  138. if (empty($order_info) || intval($order_info['order_id'] < 1)) {
  139. $err = array("code" => errcode::ErrOrderNotExist,'msg' => errcode::msg(errcode::ErrOrderNotExist));
  140. return false;
  141. }
  142. $order_id = intval($order_info['order_id']);
  143. $model_refund = Model('refund_return');
  144. $reson_info = $this->reason_info($model_refund,$reason_id);
  145. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  146. $condition = array();
  147. $condition['buyer_id'] = $this->member_id;
  148. $condition['order_id'] = $order_id;
  149. $order = $model_refund->getRightOrderList($condition, $rec_id);
  150. $order_id = $order['order_id'];
  151. $order_amount = $order['order_amount'];//订单金额
  152. $order_refund_amount = $order['refund_amount'];//订单退款金额
  153. $goods_list = $order['goods_list'];
  154. $goods = $goods_list[0];
  155. $goods_pay_price = $goods['goods_pay_price'];//商品实际成交价
  156. if ($order_amount < ($goods_pay_price + $order_refund_amount)) {
  157. $goods_pay_price = $order_amount - $order_refund_amount;
  158. $goods['goods_pay_price'] = $goods_pay_price;
  159. }
  160. $goods_id = $goods['rec_id'];
  161. $condition = array();
  162. $condition['buyer_id'] = $order['buyer_id'];
  163. $condition['order_id'] = $order['order_id'];
  164. $condition['order_goods_id'] = $goods_id;
  165. $condition['seller_state'] = array('lt', '3');
  166. $refund_list = $model_refund->getRefundReturnList($condition);
  167. $refund = array();
  168. if (!empty($refund_list) && is_array($refund_list)) {
  169. $refund = $refund_list[0];
  170. }
  171. $refund_state = $model_refund->getRefundState($order);
  172. if ($refund['refund_id'] > 0 || $refund_state != 1) {
  173. $err = array("code" => errcode::ErrOrderState,'msg' => errcode::msg(errcode::ErrOrderState));
  174. return false;
  175. }
  176. $refund_array = array();
  177. if (($refund_amount < 0) || ($refund_amount > $goods_pay_price)) {
  178. $refund_amount = $goods_pay_price;
  179. }
  180. if (($goods_num < 0) || ($goods_num > $goods['goods_num'])) {
  181. $goods_num = 1;
  182. }
  183. $refund_array['reason_info'] = $reson_info;
  184. $refund_array['reason_id'] = $reason_id;
  185. $refund_array['pic_info'] = serialize(array('buyer' => array()));
  186. $model_trade = Model('trade');
  187. $order_shipped = $model_trade->getOrderState('order_shipped');//订单状态30:已发货
  188. if ($order['order_state'] == $order_shipped) {
  189. $refund_array['order_lock'] = '2';//锁定类型:1为不用锁定,2为需要锁定
  190. }
  191. $refund_array['refund_type'] = 2;//类型:1为退款,2为退货
  192. $refund_array['return_type'] = '2';//退货类型:1为不用退货,2为需要退货
  193. if ($refund_array['refund_type'] != '2') {
  194. $refund_array['refund_type'] = '1';
  195. $refund_array['return_type'] = '1';
  196. }
  197. $refund_array['seller_state'] = '1';//状态:1为待审核,2为同意,3为不同意
  198. $refund_array['refund_amount'] = ncPriceFormat($refund_amount);
  199. $refund_array['goods_num'] = $goods_num;
  200. $refund_array['buyer_message'] = $buyer_msg;
  201. $refund_array['add_time'] = time();
  202. $refund_id = $model_refund->addRefundReturn($refund_array, $order, $goods);
  203. if ($refund_id)
  204. {
  205. if ($order['order_state'] == $order_shipped) {
  206. $model_refund->editOrderLock($order_id);
  207. }
  208. return true;
  209. }
  210. else {
  211. $err = array("code" => errcode::ErrOrderRefundError,'msg' => "退货失败");
  212. return false;
  213. }
  214. }
  215. }
  216. class order_action
  217. {
  218. public function change_state($state_type,$order_id)
  219. {
  220. $model_order = Model('order');
  221. $condition = array();
  222. $condition['order_id'] = $order_id;
  223. $condition['buyer_id'] = $_SESSION['member_id'];
  224. $order_info = $model_order->getOrderInfo($condition);
  225. if($state_type == 'order_cancel') {
  226. $result = $this->order_cancel($order_info);
  227. } else if ($state_type == 'order_receive') {
  228. $result = $this->order_receive($order_info);
  229. } else if (in_array($state_type,array('order_delete','order_drop','order_restore'))){
  230. $result = $this->order_recycle($order_info, $state_type);
  231. } else {
  232. return false;
  233. }
  234. return $result['state'];
  235. }
  236. private function order_cancel($order_info)
  237. {
  238. $model_order = Model('order');
  239. $logic_order = Logic('order');
  240. $if_allow = $model_order->getOrderOperateState('buyer_cancel',$order_info);
  241. if (!$if_allow) {
  242. return callback(false,'无权操作');
  243. }
  244. return $logic_order->changeOrderStateCancel($order_info,'buyer', $_SESSION['member_name']);
  245. }
  246. private function order_receive($order_info)
  247. {
  248. $model_order = Model('order');
  249. $logic_order = Logic('order');
  250. $if_allow = $model_order->getOrderOperateState('receive',$order_info);
  251. if (!$if_allow) {
  252. return callback(false,'无权操作');
  253. }
  254. return $logic_order->changeOrderStateReceive($order_info,'buyer',$_SESSION['member_name']);
  255. }
  256. private function order_recycle($order_info, $state_type) {
  257. $model_order = Model('order');
  258. $logic_order = Logic('order');
  259. $state_type = str_replace(array('order_delete','order_drop','order_restore'), array('delete','drop','restore'), $state_type);
  260. $if_allow = $model_order->getOrderOperateState($state_type,$order_info);
  261. if (!$if_allow) {
  262. return callback(false,'无权操作');
  263. }
  264. return $logic_order->changeOrderStateRecycle($order_info,'buyer',$state_type);
  265. }
  266. }
  267. class order_helper
  268. {
  269. private $mOrders;
  270. private $mod_refund;
  271. private $mod_order;
  272. public function __construct($order_list)
  273. {
  274. $this->mod_order = Model('order');
  275. $this->mod_refund = Model('refund_return');
  276. $this->mOrders = $this->mod_refund->getGoodsRefundList($order_list);
  277. }
  278. private function action_title($key)
  279. {
  280. static $actions = array("if_cancel" => "取消订单",
  281. "if_refund_cancel" => "退款",
  282. "if_payment" => "立即支付",
  283. "if_receive" => "确认收货",
  284. "if_deliver" => "查看物流",
  285. "if_evaluation" => "评价",
  286. "if_delete" => "删除订单",
  287. "if_lock" => "退款退货中");
  288. return $actions[$key];
  289. }
  290. private function actions($order)
  291. {
  292. $state['if_payment'] = $this->mod_order->getOrderOperateState('payment',$order);
  293. //显示取消订单
  294. $state['if_cancel'] = $this->mod_order->getOrderOperateState('buyer_cancel', $order);
  295. //显示退款取消订单
  296. $state['if_refund_cancel'] = $this->mod_order->getOrderOperateState('refund_cancel', $order);
  297. //显示收货
  298. $state['if_receive'] = $this->mod_order->getOrderOperateState('receive', $order);
  299. //显示物流跟踪
  300. $state['if_deliver'] = $this->mod_order->getOrderOperateState('deliver', $order);
  301. //显示评价
  302. $state['if_evaluation'] = $this->mod_order->getOrderOperateState('evaluation', $order);
  303. //显示删除
  304. $state['if_delete'] = $this->mod_order->getOrderOperateState('delete', $order);
  305. $state['if_lock'] = $this->mod_order->getOrderOperateState('lock', $order);
  306. $actions = [];
  307. foreach ($state as $key => $value) {
  308. if ($value == true) {
  309. $item['action'] = $key;
  310. $item['title'] = $this->action_title($key);
  311. $actions[] = $item;
  312. }
  313. }
  314. return $actions;
  315. }
  316. private function order_info($order)
  317. {
  318. $result["order_id"] = intval($order["order_id"]);
  319. $result["order_sn"] = $order["order_sn"];
  320. $result["pay_sn"] = $order["pay_sn"];
  321. $result["add_time"] = intval($order["add_time"]);
  322. $result["payment_code"] = $order["payment_code"];
  323. $result["payment_time"] = intval($order["payment_time"]);
  324. $result["finnshed_time"] = intval($order["finnshed_time"]);
  325. $result["goods_amount"] = doubleval($order["goods_amount"]);
  326. $result["order_amount"] = doubleval($order["order_amount"]);
  327. $result["rcb_amount"] = doubleval($order["rcb_amount"]);
  328. $result["pd_amount"] = doubleval($order["pd_amount"]);
  329. $result["shipping_fee"] = doubleval($order["shipping_fee"]);
  330. $result["evaluation_state"] = intval($order["evaluation_state"]);
  331. $result["order_state"] = intval($order["order_state"]);
  332. $result["refund_state"] = intval($order["refund_state"]);
  333. $result["refund_amount"] = doubleval($order["refund_amount"]);
  334. $result["delay_time"] = intval($order["delay_time"]);
  335. $result["shipping_code"] = $order["shipping_code"];
  336. $result["trade_no"] = $order["trade_no"];
  337. $result["state_desc"] = $order["state_desc"];
  338. $refund_state = 0;
  339. $order['refund_id'] = intval($this->mod_refund->getRefundId($order,$refund_state));
  340. $result["refund_state"] = intval($refund_state);
  341. return $result;
  342. }
  343. private function order_goods($order)
  344. {
  345. $result = [];
  346. $order_goods = $order['extend_order_goods'];
  347. foreach ($order_goods as $val)
  348. {
  349. $goods["rec_id"] = intval($val["rec_id"]);
  350. $goods["order_id"] = intval($val["order_id"]);
  351. $goods["goods_id"] = intval($val["goods_id"]);
  352. $goods["goods_commonid"] = goods_helper::common_id($goods["goods_id"]);
  353. $goods["goods_name"] = $val["goods_name"];
  354. $goods["goods_price"] = doubleval($val["goods_price"]);
  355. $goods["goods_num"] = intval($val["goods_num"]);
  356. $goods["goods_image"] = cthumb($val['goods_image'], 480, $val['store_id']);
  357. $goods["goods_pay_price"] = doubleval($val["goods_pay_price"]);
  358. $goods["store_id"] = intval($val["store_id"]);
  359. $goods["buyer_id"] = intval($val["buyer_id"]);
  360. $goods["goods_type"] = intval($val["goods_type"]);
  361. $goods["promotions_id"] = intval($val["promotions_id"]);
  362. $goods["gc_id"] = intval($val["gc_id"]);
  363. $goods["goods_spec"] = $val["goods_spec"] == null ? "" : $val["goods_spec"];
  364. $goods["refund"] = isset($val["refund"]) ? intval($val["refund"]) : 0;
  365. $refund_state = 0;
  366. $goods['refund_id'] = intval($this->mod_refund->getRefundIdForGood($val,$refund_state));
  367. $goods['refund_state'] = intval($refund_state);
  368. $result[] = $goods;
  369. }
  370. return $result;
  371. }
  372. private function reciver_info($order)
  373. {
  374. $info = $order['reciver_info'];
  375. $info['reciver_name'] = $order['reciver_name'];
  376. return $info;
  377. }
  378. public function format()
  379. {
  380. $result = [];
  381. foreach ($this->mOrders as $order) {
  382. $item['order_info'] = $this->order_info($order);
  383. $actions = $this->actions($order);
  384. $item['actions'] = $actions;
  385. $item['order_goods'] = $this->order_goods($order);
  386. $item['reciver_info'] = $this->reciver_info($order);
  387. $result[] = $item;
  388. }
  389. return $result;
  390. }
  391. }