Ver código fonte

增加退款退货

stanley-king 8 anos atrás
pai
commit
8457f922a8

+ 240 - 5
helper/order_helper.php

@@ -8,6 +8,244 @@
  */
 require_once (BASE_ROOT_PATH . '/helper/goods_helper.php');
 
+class refund_helper
+{
+    private $member_id;
+    public function __construct($member_id)
+    {
+        $this->member_id = intval($member_id);
+    }
+
+    public function list_all()
+    {
+
+    }
+
+    public function refund($order_sn,&$err)
+    {
+        $order_info = Model('order')->getOrderInfo(array('order_sn' => $order_sn));
+        if (empty($order_info)) {
+            $err = array("code" => errcode::ErrOrderNotExist,'msg' => errcode::msg(errcode::ErrOrderNotExist));
+            return false;
+        }
+
+        $model_refund = Model('refund_return');
+        $order_id = intval($order_info['order_id']);
+        $order = $model_refund->getRightOrderList(array('buyer_id' => $this->member_id, 'order_id' => $order_id));
+
+        $order_amount = $order['order_amount'];//订单金额
+        $condition = array();
+        {
+            $condition['buyer_id'] = $order['buyer_id'];
+            $condition['order_id'] = $order['order_id'];
+            $condition['goods_id'] = '0';
+            $condition['seller_state'] = array('lt', '3'); //状态:1为待审核,2为同意,3为不同意
+        }
+
+        $refund_list = $model_refund->getRefundReturnList($condition);
+        $refund = array();
+        if (!empty($refund_list) && is_array($refund_list)) {
+            $refund = $refund_list[0];
+        }
+        $model_trade = Model('trade');
+        $order_paid = $model_trade->getOrderState('order_paid');
+        $payment_code = $order['payment_code'];
+        if ($refund['refund_id'] > 0 || $order['order_state'] != $order_paid || $payment_code == 'offline') {
+            $err = array("code" => errcode::ErrOrderNotExist,'msg' => "只有付完款尚未发货的时才能退款。");
+            return false;
+        }
+
+        $refund_array = array();
+        $refund_array['refund_type'] = '1'; //类型:1为退款,2为退货
+        $refund_array['seller_state'] = '1';//状态:1为待审核,2为同意,3为不同意
+        $refund_array['order_lock'] = '2';  //锁定类型:1为不用锁定,2为需要锁定
+        $refund_array['goods_id'] = '0';
+        $refund_array['order_goods_id'] = '0';
+        $refund_array['reason_id'] = '0';
+        $refund_array['reason_info'] = '取消订单,全部退款';
+        $refund_array['goods_name'] = '订单商品全部退款';
+        $refund_array['refund_amount'] = ncPriceFormat($order_amount);
+        $refund_array['buyer_message'] = remove_tags(urldecode($_POST['buyer_message']));
+        $refund_array['add_time'] = time();
+
+        $pic_array = array();
+        $pic_array['buyer'] = array();
+        $refund_array['pic_info'] = serialize($pic_array);
+        $refund_id = $model_refund->addRefundReturn($refund_array, $order);
+
+        return $refund_id;
+    }
+
+    private function reason_list($model_refund)
+    {
+        $condition = array();
+        $reason_data = $model_refund->getReasonList($condition, '', '', 'reason_id,reason_info');
+
+        $reason_list = [];
+        foreach ($reason_data as $data) {
+            $reason_list[] = $data;
+        }
+        $reason_list[] = array('reason_id' => 0, 'reason_info' => '其他');
+
+        return $reason_list;
+    }
+
+    private function reason_info($model_refund,$reason_id)
+    {
+        $reason_list = $model_refund->reason_list($model_refund);
+        if (array_key_exists($reason_id,$reason_list)) {
+            return $reason_list[$reason_id];
+        } else {
+            return '其他';
+        }
+    }
+
+    public function return_info($order_sn,$rec_id,&$err)
+    {
+        $order_info = Model('order')->getOrderInfo(array('order_sn' => $order_sn));
+        if (empty($order_info)) {
+            $err = array("code" => errcode::ErrOrderNotExist,'msg' => errcode::msg(errcode::ErrOrderNotExist));
+            return false;
+        }
+
+        $order_id = intval($order_info['order_id']);
+        if ($order_id < 1 || $rec_id < 1) {
+            $err = array("code" => errcode::ErrParamter,'msg' => errcode::msg(errcode::ErrParamter));
+            return false;
+        }
+
+        $model_refund = Model('refund_return');
+        $reason_list = $this->reason_list($model_refund);
+
+        $condition = array();
+        $condition['buyer_id'] = $this->member_id;
+        $condition['order_id'] = $order_id;
+        $order = $model_refund->getRightOrderList($condition, $rec_id);
+
+        $order_amount = $order['order_amount'];//订单金额
+        $order_refund_amount = $order['refund_amount'];//订单退款金额
+        $goods_list = $order['goods_list'];
+        $goods = $goods_list[0];
+        $goods_pay_price = $goods['goods_pay_price'];//商品实际成交价
+        if ($order_amount < ($goods_pay_price + $order_refund_amount)) {
+            $goods_pay_price = $order_amount - $order_refund_amount;
+            $goods['goods_pay_price'] = $goods_pay_price;
+        }
+
+        $condition = array();
+        $condition['buyer_id'] = $order['buyer_id'];
+        $condition['order_id'] = $order['order_id'];
+        $condition['order_goods_id'] = $rec_id;
+        $condition['seller_state'] = array('lt', '3');
+        $refund_list = $model_refund->getRefundReturnList($condition);
+        $refund = array();
+        if (!empty($refund_list) && is_array($refund_list)) {
+            $refund = $refund_list[0];
+        }
+        $refund_state = $model_refund->getRefundState($order);//根据订单状态判断是否可以退款退货 '申请状态:1为处理中,2为待管理员处理,3为已完成,默认为1',
+
+        if ($refund['refund_id'] > 0) {
+            $err = array("code" => errcode::ErrOrderRefundError,'msg' => "不能重复退货");
+            return false;
+        }
+
+        if ($refund_state != 1) {
+            $err = array("code" => errcode::ErrOrderState,'msg' => '请确认订单状态,在已经付款后才能退款,已经发货后才能退货.');
+            return false;
+        }
+
+        return array('reason_list' => (array)$reason_list, 'goods' => $goods);
+    }
+
+    public function return_goods($order_sn,$rec_id,$goods_num,$refund_amount,$reason_id,$buyer_msg,&$err)
+    {
+        $order_info = Model('order')->getOrderInfo(array('order_sn' => $order_sn));
+        if (empty($order_info) || intval($order_info['order_id'] < 1)) {
+            $err = array("code" => errcode::ErrOrderNotExist,'msg' => errcode::msg(errcode::ErrOrderNotExist));
+            return false;
+        }
+        $order_id = intval($order_info['order_id']);
+
+        $model_refund = Model('refund_return');
+        $reson_info = $this->reason_info($model_refund,$reason_id);
+        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+        $condition = array();
+        $condition['buyer_id'] = $this->member_id;
+        $condition['order_id'] = $order_id;
+        $order = $model_refund->getRightOrderList($condition, $rec_id);
+
+        $order_id = $order['order_id'];
+        $order_amount = $order['order_amount'];//订单金额
+        $order_refund_amount = $order['refund_amount'];//订单退款金额
+        $goods_list = $order['goods_list'];
+        $goods = $goods_list[0];
+        $goods_pay_price = $goods['goods_pay_price'];//商品实际成交价
+        if ($order_amount < ($goods_pay_price + $order_refund_amount)) {
+            $goods_pay_price = $order_amount - $order_refund_amount;
+            $goods['goods_pay_price'] = $goods_pay_price;
+        }
+
+        $goods_id = $goods['rec_id'];
+        $condition = array();
+        $condition['buyer_id'] = $order['buyer_id'];
+        $condition['order_id'] = $order['order_id'];
+        $condition['order_goods_id'] = $goods_id;
+        $condition['seller_state'] = array('lt', '3');
+        $refund_list = $model_refund->getRefundReturnList($condition);
+        $refund = array();
+        if (!empty($refund_list) && is_array($refund_list)) {
+            $refund = $refund_list[0];
+        }
+        $refund_state = $model_refund->getRefundState($order);
+        if ($refund['refund_id'] > 0 || $refund_state != 1) {
+            $err = array("code" => errcode::ErrOrderState,'msg' => errcode::msg(errcode::ErrOrderState));
+            return false;
+        }
+
+        $refund_array = array();
+        if (($refund_amount < 0) || ($refund_amount > $goods_pay_price)) {
+            $refund_amount = $goods_pay_price;
+        }
+        if (($goods_num < 0) || ($goods_num > $goods['goods_num'])) {
+            $goods_num = 1;
+        }
+
+        $refund_array['reason_info'] = $reson_info;
+        $refund_array['reason_id'] = $reason_id;
+        $refund_array['pic_info'] = serialize(array('buyer' => array()));
+
+        $model_trade = Model('trade');
+        $order_shipped = $model_trade->getOrderState('order_shipped');//订单状态30:已发货
+        if ($order['order_state'] == $order_shipped) {
+            $refund_array['order_lock'] = '2';//锁定类型:1为不用锁定,2为需要锁定
+        }
+        $refund_array['refund_type'] =  2;//类型:1为退款,2为退货
+        $refund_array['return_type'] = '2';//退货类型:1为不用退货,2为需要退货
+        if ($refund_array['refund_type'] != '2') {
+            $refund_array['refund_type'] = '1';
+            $refund_array['return_type'] = '1';
+        }
+        $refund_array['seller_state'] = '1';//状态:1为待审核,2为同意,3为不同意
+        $refund_array['refund_amount'] = ncPriceFormat($refund_amount);
+        $refund_array['goods_num'] = $goods_num;
+        $refund_array['buyer_message'] = $buyer_msg;
+        $refund_array['add_time'] = time();
+        $refund_id = $model_refund->addRefundReturn($refund_array, $order, $goods);
+
+        if ($refund_id)
+        {
+            if ($order['order_state'] == $order_shipped) {
+                $model_refund->editOrderLock($order_id);
+            }
+            return true;
+        }
+        else {
+            $err = array("code" => errcode::ErrOrderRefundError,'msg' => "退货失败");
+            return false;
+        }
+    }
+}
+
 class order_action
 {
     public function change_state($state_type,$order_id)
@@ -71,7 +309,6 @@ class order_helper
     private $mod_refund;
     private $mod_order;
 
-
     public function __construct($order_list)
     {
         $this->mod_order = Model('order');
@@ -89,7 +326,6 @@ class order_helper
                                 "if_evaluation" => "评价",
                                 "if_delete" => "删除订单",
                                 "if_lock" => "退款退货中");
-//                                "if_refund_return" => "退货");
         return $actions[$key];
     }
 
@@ -108,8 +344,6 @@ class order_helper
         $state['if_evaluation'] = $this->mod_order->getOrderOperateState('evaluation', $order);
         //显示删除
         $state['if_delete'] = $this->mod_order->getOrderOperateState('delete', $order);
-//        //订单是否能退货
-//        $state['if_refund_return'] = $this->mod_refund->getRefundState($order) == '0' ? false : true;
 
         $state['if_lock'] = $this->mod_order->getOrderOperateState('lock', $order);
 
@@ -124,6 +358,7 @@ class order_helper
 
         return $actions;
     }
+
     private function order_info($order)
     {
         $result["order_id"] = intval($order["order_id"]);
@@ -209,4 +444,4 @@ class order_helper
 
         return $result;
     }
-}
+}

+ 1 - 1
mobile/control/member_order.php

@@ -59,7 +59,7 @@ class member_orderControl extends mbMemberControl
         $page_count = $model_order->gettotalpage();
         $model_order->cls();
 
-        self::outsuccess(array('orders' => $result,'mobile_page' =>mobile_page($page_count)));
+        self::outsuccess(array('order' => $result[0],'mobile_page' =>mobile_page($page_count)));
     }
 
     public function change_stateOp()

+ 105 - 3
mobile/control/member_refund.php

@@ -12,16 +12,117 @@
 
 defined('InShopNC') or exit('Access Invalid!');
 
+require_once(BASE_ROOT_PATH . '/helper/order_helper.php');
+
 
 class member_refundControl extends mbMemberControl
 {
-    //static private $refund_type = array('1', '2');
-
     public function __construct()
     {
         parent::__construct();
     }
 
+    public function listOp()
+    {
+        $model_refund = Model('refund_return');
+        $condition = array();
+        $condition['buyer_id'] = $_SESSION['member_id'];
+        $refund_list = $model_refund->getRefundList($condition,10);
+        $store_list = $model_refund->getRefundStoreList($refund_list);
+    }
+
+    public function order_refundOp()
+    {
+        $order_sn = $_GET['order_sn'];
+        if(!isset($order_sn) || empty($order_sn)) {
+            return self::outerr(errcode::ErrParamter);
+        }
+        $helper = new refund_helper($_SESSION['member_id']);
+        $refund_id = $helper->refund($order_sn,$err);
+        if($refund_id == false) {
+            return self::outerr($err['code'],$err['msg']);
+        }
+        else
+        {
+            $order = $this->get_order($order_sn,$_SESSION['member_id']);
+            self::outsuccess(array('order' => $order));
+        }
+    }
+
+    public function return_infoOp()
+    {
+        $order_sn = $_GET['order_sn'];
+        $rec_id = intval($_GET['rec_id']);
+        if(empty($order_sn) || $rec_id <= 0) {
+            return self::outerr(errcode::ErrParamter);
+        }
+
+        $helper = new refund_helper($_SESSION['member_id']);
+        $ret = $helper->return_info($order_sn,$rec_id,$err);
+        if($ret == false) {
+            return self::outerr($err['code'],$err['msg']);
+        }
+        else
+        {
+            $reason_list = $ret['reason_list'];
+            $goods_pay_price = doubleval($ret['goods']['goods_pay_price']);
+
+            $order = $this->get_order($order_sn,$_SESSION['member_id']);
+            $order_goods = &$order['order_goods'];
+            foreach ($order_goods as &$item)
+            {
+                if($item['rec_id'] == $rec_id) {
+                    $item['goods_pay_price'] = $goods_pay_price;
+                    break;
+                }
+            }
+
+            return self::outsuccess(array("reason_list" => $reason_list,'rec_id' => $rec_id,'order' => $order));
+        }
+    }
+
+    public function goods_returnOp()
+    {
+        $order_sn = $_GET['order_sn'];
+        $rec_id = intval($_GET['rec_id']);
+        $buyer_msg = isset($_GET['buyer_message']) ? remove_tags(urldecode($_GET['buyer_message'])) : '';
+        $goods_num = intval($_GET['goods_num']);
+        $refund_amount = floatval($_GET['refund_amount']);
+        $reason_id = intval($_GET['reason_id']);//退货退款原因
+
+        if(empty($order_sn) || $rec_id <= 0) {
+            return self::outerr(errcode::ErrParamter);
+        }
+        $helper = new refund_helper($_SESSION['member_id']);
+        $ret = $helper->return_goods($order_sn,$rec_id,$goods_num,$refund_amount,$reason_id,$buyer_msg,$err);
+
+        if($ret == false) {
+            return self::outerr($err['code'],$err['msg']);
+        } else {
+            $order = $this->get_order($order_sn,$_SESSION['member_id']);
+            return self::outsuccess(array('order' => $order));
+        }
+    }
+
+    private function get_order($order_sn,$member_id)
+    {
+        $model_order = Model('order');
+        $condition = array();
+        $condition['buyer_id'] = $member_id;
+        $condition['order_sn'] = $order_sn;
+        $order_list = $model_order->getNormalOrderList($condition, $this->page_size, '*', 'order_id desc', '', array('order_address', 'order_goods'));
+        $order_helper = new order_helper($order_list);
+        $orders = $order_helper->format();
+        $model_order->cls();
+        if(!empty($orders)) {
+            return $orders[0];
+        } else {
+            return false;
+        }
+    }
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
     /**
      * 向商家添加全部退款请求,即付完款后取消订单
      */
@@ -39,7 +140,8 @@ class member_refundControl extends mbMemberControl
         $order_amount = $order['order_amount'];//订单金额
         $condition = array();
         {
-            $condition['buyer_id'] = $order['buyer_id'];
+            $condition['buyer_id'] = $order['buyer
+            _id'];
             $condition['order_id'] = $order['order_id'];
             $condition['goods_id'] = '0';
             $condition['seller_state'] = array('lt', '3'); //状态:1为待审核,2为同意,3为不同意

+ 2 - 1
shop/control/member_refund.php

@@ -182,7 +182,8 @@ class member_refundControl extends BaseMemberControl {
 	 * 退款记录列表页
 	 *
 	 */
-	public function indexOp(){
+	public function indexOp()
+    {
 		$model_refund = Model('refund_return');
 		$condition = array();
 		$condition['buyer_id'] = $_SESSION['member_id'];

+ 34 - 0
test/TestRefund.php

@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 2016/10/11
+ * Time: 下午8:56
+ */
+
+define('BASE_ROOT_PATH',str_replace('/test','',dirname(__FILE__)));
+require_once(BASE_ROOT_PATH . '/fooder.php');
+require_once(BASE_ROOT_PATH . '/helper/order_helper.php');
+
+
+
+class TestRefund extends PHPUnit_Framework_TestCase
+{
+    public static function setUpBeforeClass()
+    {
+        Base::run_util();
+    }
+
+    public function testRefundOrder()
+    {
+        $helper = new refund_helper(36490);
+        $helper->refund('8000000000650801',$err);
+    }
+
+    public function testReturnInfo()
+    {
+        $helper = new refund_helper(36490);
+        $helper->return_info('8000000000651001',10100,$err);
+    }
+}