瀏覽代碼

add bonus

stanley-king 9 年之前
父節點
當前提交
a37bcf5da6

+ 1 - 1
admin/templates/default/bonus.bonus_type_add_random_form.php

@@ -28,7 +28,7 @@
             <tbody>
 
             <tr class="noborder">
-                <td class="required" colspan="2"><label class="validation" for="sender">发送者名称</label></td>
+                <td class="required" colspan="2"><label class="validation" for="sender">红包名称</label></td>
             </tr>
             <tr class="noborder">
                 <td class="vatop rowform"><input type="text" id="sender" name="sender" class="txt"

+ 1 - 10
admin/templates/default/bonus.bonus_type_form.php

@@ -23,7 +23,7 @@
             <tbody>
 
             <tr class="noborder">
-                <td class="required" colspan="2"><label class="validation" for="sender">发送者名称</label></td>
+                <td class="required" colspan="2"><label class="validation" for="sender">红包名称</label></td>
             </tr>
             <tr class="noborder">
                 <td class="vatop rowform"><input type="text" id="sender" name="sender" class="txt" value="<?php echo  isset($output['data'])? $output['data']['sender'] : '';?>"></td>
@@ -57,15 +57,6 @@
             </tr>
 
             <tr class="noborder">
-                <td class="required" colspan="2"><label class="validation" for="send_type">发放方式</label></td>
-            </tr>
-            <tr class="noborder">
-                <td class="vatop rowform">
-                    <input type="radio" id="send_type" name="send_type" value="1" checked><label>发放给特定用户</label>
-                </td>
-                <td class="vatop tips"></td>
-            </tr>
-            <tr class="noborder">
                 <td class="required" colspan="2"><label>上传CSV文件</label></td>
             </tr>
 

+ 5 - 0
core/framework/db/mysql.php

@@ -633,4 +633,9 @@ class Db
     		if (!$result) throw_exception("Db Error: ".mysql_error(self::$link[$host]));
     	}
     }
+
+	public static function affected_rows($host = 'master') {
+		self::connect($host);
+		return mysql_affected_rows($host);
+	}
 }

+ 5 - 0
core/framework/db/mysqli.php

@@ -595,4 +595,9 @@ class Db
     		if (!$result) throw_exception("Db Error: ".mysqli_error(self::$link[$host]));
     	}
     }
+
+	public static function affected_rows($host = 'master') {
+		self::connect($host);
+		return self::$link[$host]->mysqli_affected_rows();
+	}
 }

+ 3 - 0
core/framework/libraries/model.php

@@ -1191,5 +1191,8 @@ class ModelDb
     public function checkActive($host) {
     	Db::ping($host);
     }
+    public function affected_rows($host = 'master') {
+        return Db::affected_rows($host);
+    }
 }
 ?>

+ 0 - 1
data/logic/payment.logic.php

@@ -51,7 +51,6 @@ class paymentLogic
                 $data_order = array();
                 $change_type = '';
                 // 计算运费+订单总额
-                //$total_amount = floatval($order_info['order_amount']) + floatval($order_info['shipping_fee']);
                 $total_amount = floatval($order_info['order_amount']);
                 $increment_amount = 0.0;    // 预存款使用
                 if ((floatval($pd_amount) + floatval($order_info['pd_amount'])) > floatval($total_amount))  {

+ 0 - 63
data/model/bonus.model.php

@@ -1,63 +0,0 @@
-<?php
-/**
- * Created by PhpStorm.
- * User: stanley-king
- * Date: 16/2/16
- * Time: 下午4:42
- */
-
-defined('InShopNC') or exit('Access Invalid!');
-
-class bonus_Model extends Model
-{
-    const send_bonus = 1;
-    const grab_bonus = 2;
-
-    public function __construct()
-    {
-        parent::__construct('user_bonus');
-    }
-
-    public function get_bouns($userid,$type = 0)
-    {
-//        $condition['user_id'] = $userid;
-//        if($type != 0) {
-//            $condition['bonus_type_id'] = $type;
-//        }
-//
-//        $bonus_list = $this->where($condition)->select();
-//
-//        $ret_value = 0;
-//        if (!empty($bonus_list))
-//        {
-//            foreach ($bonus_list as $value)
-//            {
-//                $bonus_value = doubleval($value['bonus_value']);  // 红包金额
-//
-//                // 支付金额大于红包金额-需要继续选择红包
-//                if (($pay_amount - $bonus_value) > 0.0000001) {
-//
-//                    $data['bonus_value'] = 0;  // 更新为0
-//                    $ret = Model()->table('user_bonus')->where(array('bonus_id' => $value['bonus_id']))->update($data);
-//
-//                    if($ret){
-//                        $pay_amount -= $bonus_value;
-//                    }
-//                } else {
-//
-//                    $data['bonus_value'] = $bonus_value - $pay_amount;
-//                    $ret = Model()->table('user_bonus')->where(array('bonus_id' => $value['bonus_id']))->update($data);
-//
-//                    if($ret) {
-//                        $pay_amount = 0;
-//                    }
-//                    break;
-//                }
-//            }
-//        }
-//
-//        return $pay_amount;
-
-    }
-
-}

+ 14 - 2
data/model/bonus_type.model.php

@@ -19,9 +19,13 @@ class bonus_typeModel extends Model
         return $this->select();
     }
 
-    public function get($id)
+    public function get_one($condition,$field='*')
     {
-        return $this->where(array('type_id' => $id))->select();
+        return $this->where($condition)->field($field)->find();
+    }
+    public function get($condition,$field='*')
+    {
+        return $this->where($condition)->field($field)->select();
     }
 
     public function save($data, &$id)
@@ -32,4 +36,12 @@ class bonus_typeModel extends Model
             $id = $this->insert($data);
         }
     }
+
+    public function add($data) {
+        return $this->insert($data);
+    }
+    public function edit($condition,$data) {
+        $this->where($condition)->update($data);
+    }
+
 }

+ 5 - 3
data/model/member.model.php

@@ -606,8 +606,10 @@ class memberModel extends Model
         }
         $available_predeposit=floatval($member_info['available_predeposit']);
         $freeze_predeposit=floatval($member_info['freeze_predeposit']);
-        return array('available_predeposit' => $available_predeposit,
-            'freeze_predeposit' => $freeze_predeposit);
+        $available_relay_balance=floatval($member_info['available_relay_balance']);
+        $freeze_relay_balance=floatval($member_info['freeze_relay_balance']);
+        return array('available_predeposit' => $available_predeposit,'freeze_predeposit' => $freeze_predeposit,
+            'available_relay_balance' => $available_relay_balance,'freeze_relay_balance' => $freeze_relay_balance);
     }
 
     /**
@@ -631,7 +633,7 @@ class memberModel extends Model
         }
 
         // 预存款订单查询条件(支付, 红包列表)
-        $condition = 'lg_type in(\'order_pay\', \'bonus_add_money\', \'sys_add_money\') and lg_member_id=\'' . $member_info['member_id'] . '\'';
+        $condition = 'lg_type in(\'order_pay\', \'bonus_add_money\', \'hand_out_bonus\', \'sys_add_money\') and lg_member_id=\'' . $member_info['member_id'] . '\'';
         $model_pd = Model('predeposit');
         $pd_log_list = $model_pd->getPdLogList($condition,'','*','lg_id desc');
         if(empty($pd_log_list) || count($pd_log_list) == 0) {

+ 11 - 2
data/model/predeposit.model.php

@@ -312,7 +312,6 @@ class predepositModel extends Model {
                 $data_msg['freeze_amount'] = 0;
                 $data_msg['desc'] = $data_log['lg_desc'];
                 break;
-
             case 'refund':
                 $data_log['lg_av_amount'] = $data['amount'];
                 $data_log['lg_desc'] = '确认退款,订单号: '.$data['order_sn'];
@@ -366,7 +365,7 @@ class predepositModel extends Model {
                 break;
             case 'bonus_add_money':
                 $data_log['lg_av_amount'] = $data['amount'];
-                $data_log['lg_desc'] = '红包系统调节预存款【增加】,充值单号: '.$data['pdr_sn'];
+                $data_log['lg_desc'] = '红包系统调节预存款【增加】,红包单号: '.$data['pdr_sn'];
                 $data_log['lg_admin_name'] = $data['admin_name'];
                 $data_pd['available_predeposit'] = array('exp','available_predeposit+'.$data['amount']);
 
@@ -374,6 +373,16 @@ class predepositModel extends Model {
                 $data_msg['freeze_amount'] = 0;
                 $data_msg['desc'] = $data_log['lg_desc'];
                 break;
+            case 'hand_out_bonus' :
+                $data_log['lg_av_amount'] = -$data['amount'];
+                $data_log['lg_desc'] = '发送红包系统调节预存款【减少】,红包单号: '.$data['pdr_sn'];
+                $data_log['lg_admin_name'] = $data['admin_name'];
+                $data_pd['available_predeposit'] = array('exp','available_predeposit-'.$data['amount']);
+
+                $data_msg['av_amount'] = -$data['amount'];
+                $data_msg['freeze_amount'] = 0;
+                $data_msg['desc'] = $data_log['lg_desc'];
+                break;
 				////////////////////zmr>v20////////////////////////////////////
             case 'sys_add_money':
                 $data_log['lg_av_amount'] = $data['amount'];

+ 89 - 55
data/model/user_bonus.model.php

@@ -1,56 +1,90 @@
-<?php
-/**
- * ����
- *
-
- */
-defined('InShopNC') or exit('Access Invalid!');
-class user_bonusModel extends Model
-{
-    public function __construct() {
-        parent::__construct('user_bonus');
-    }
-
-    public function loadFile($content) {
-        $lines = explode("\n", $content);
-        foreach($lines as $line){
-            $bonus = explode(',', trim($line));
-            $this->createBonus($bonus);
-        }
-    }
-
-    public function getBonus($user_id, $user_mobile){
-        $bonus = $this->where(array('user_mobile' => $user_mobile))->select();
-        if(intval($bonus[0]['user_id']) === 0){
-            $update_data = array(
-                'user_id' => $user_id,
-                'get_time' => time()
-            );
-            $this->where(array('user_mobile' => $user_mobile))->update($update_data);
-        }
-        $bonus_data = array(
-            'bonus_sn' => $bonus[0]['bonus_sn'],
-            'bonus_value' => $bonus[0]['bonus_value']
-        );
-        return $bonus_data;
-    }
-
-    private function createBonus($bonus){
-        $bouns_sn = $this->generateSn();
-        $bonus_value = array(
-            'bonus_sn' => $bouns_sn,
-            'bonus_type_id' => 1,
-            'user_mobile' => $bonus[0],
-            'bonus_value' => $bonus[1]
-        );
-        $this->insert($bonus_value);
-    }
-
-    private function generateSn(){
-        $max_sn_rec = $this->field('MAX(bonus_sn) as max_sn')->select();
-        $max_sn = $max_sn_rec[0]['max_sn']? floor($max_sn_rec[0]['max_sn'] / 10000): 100000;
-
-        $bonus_sn = ($max_sn + 1) . str_pad(mt_rand(0, 9999), 4, '0', STR_PAD_LEFT);
-        return $bonus_sn;
-    }
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 16/2/16
+ * Time: 下午4:42
+ */
+
+defined('InShopNC') or exit('Access Invalid!');
+
+class user_bonusModel extends Model
+{
+    const send_bonus = 1;
+    const grab_bonus = 2;
+
+
+    public function __construct()
+    {
+        parent::__construct('user_bonus');
+    }
+    public function add($datas) {
+        return $this->insert($datas);
+    }
+
+    public function getAllBind($mobile,$fields = '*') {
+        return  $this->where(array('user_mobile' => $mobile, 'status' => 2))->field($fields)->order('bonus_type_id')->select();
+    }
+
+    public function getStatus($bonus_sn) {
+        $ret = $this->where(array('bonus_sn' => $bonus_sn))->field('status')->find();
+        if(empty($ret)) {
+            return 0;
+        } else {
+            return intval($ret['status']);
+        }
+    }
+
+    private function getBind($mobile,$type_id,$fields = '*') {
+        return  $this->where(array('user_mobile' => $mobile, 'bonus_type_id' => $type_id,'status' => 2))->field($fields)->find();
+    }
+
+    public function topuped($bonus_id)
+    {
+        return $this->where(array('bonus_id' => $bonus_id))->update(array('status' => 3));
+    }
+
+    public function grab($type_id,$time_out,$mobile,$sess_id)
+    {
+        try
+        {
+            $fields = '*';//"bonus_id,bonus_sn,bonus_value,status";
+            if(!empty($mobile))
+            {
+                $ret = $this->getBind($mobile,$type_id,$fields);
+                if(!empty($ret)) {
+                    return $ret;
+                }
+            }
+
+            $this->beginTransaction();
+            $ret = $this->where(array( 'bonus_type_id' => $type_id,'session_id' => $sess_id))->field($fields)->order('status,bonus_id')->limit(1)->find();
+            if(empty($ret))
+            {
+                $condition = array( 'bonus_type_id' => $type_id,
+                                    'status' => array('in', array(0,1)),
+                                    'grab_time' => array('lt',time() - $time_out));
+                $ret = $this->where($condition)->field($fields)->order('status,bonus_id')->limit(1)->find();
+                if(!empty($ret)) {
+                    $datas = array('status' => 1,
+                        'grab_time' => time(),
+                        'session_id' => $sess_id);
+                    $this->where(array('bonus_type_id' => $type_id,'bonus_id' => $ret['bonus_id']))->update($datas);
+                }
+            }
+
+            $this->commit();
+
+            return $ret;
+        } catch (Exception $ex) {
+            $this->rollback();
+            return array();
+        }
+    }
+
+    public function bind($bonus_sn,$session_id,$mobile)
+    {
+        $ret = $this->where(array('bonus_sn' => $bonus_sn,'session_id' => $session_id,'status' => 1))->update(array('status' => 2,'user_mobile' => $mobile));
+        return $ret;
+    }
 }

+ 11 - 0
helper/bonus/bind.php

@@ -0,0 +1,11 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 16/4/10
+ * Time: 下午9:53
+ */
+
+namespace bonus;
+
+?>

+ 61 - 0
helper/bonus/factory.php

@@ -0,0 +1,61 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 16/4/12
+ * Time: 上午12:06
+ */
+namespace bonus;
+
+use \predeposit_helper;
+use \Exception;
+
+class factory
+{
+    static public function make_bonus($paramer) //数组类型的参数
+    {
+        try
+        {
+            $type = type::crate_by_paramer($paramer);
+            $iGen = create_generator($type);
+            $iGen->make_type();
+            if(!$ret = $iGen->make_bonus()) {
+                return false;
+            }
+            $money = $type->getTotal_amount();
+
+            $type_paramer = $type->get_param();
+            $pre_helper = new predeposit_helper();
+            $pre_helper->hand_out_bonus($money,$type->getType_sn(),$type_paramer['type_name'],"发送了{$money}元的红包.");
+            return $type->getType_sn();
+        }
+        catch (Exception $ex) {
+            return false;
+        }
+    }
+
+    static public function grab_bonus($paramer) //数组类型的参数
+    {
+        try
+        {
+            $type = type::create_by_sn($paramer['type_sn']);
+            $iGrab = create_grab($type);
+            $bonus = $iGrab->get_bonus($paramer);
+            if(empty($bonus)) {
+                return false;
+            } else {
+                return array('type_info' => $type->get_param(),'bonus_info' => $bonus);
+            }
+        } catch (Exception $ex) {
+            return false;
+        }
+
+    }
+
+    static public function add_fixed_bonus()
+    {
+
+    }
+}
+
+?>

+ 158 - 0
helper/bonus/generator.php

@@ -0,0 +1,158 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 16/4/10
+ * Time: 下午9:42
+ */
+
+namespace bonus;
+
+use \Exception;
+use \errcode;
+use \Model;
+use \Log;
+
+abstract class IGenerator
+{
+    protected $mType;
+    public function __construct($type) {
+        $this->mType = $type;
+    }
+
+    abstract public function make_bonus();
+    public function make_type()
+    {
+        $this->mType->setType_sn(make_sn());
+        $param = $this->mType->get_param();
+        $id = Model('bonus_type')->add($param);
+        if($id > 0) {
+            $this->mType->setType_id($id);
+        } else {
+            throw new Exception("生成红包类型失败",errcode::ErrBonusMake);
+        }
+    }
+    public function type_sn() {
+        return $this->mType->getType_sn();
+    }
+}
+//发给指定人群的红包
+class DirectGenerator extends IGenerator
+{
+    public function __construct($type) {
+        parent::__construct($type);
+    }
+
+    public function make_bonus()
+    {
+
+    }
+}
+
+//发个任意人群的红包
+class GeneralGenerator extends IGenerator
+{
+    public function __construct($type) {
+        parent::__construct($type);
+    }
+
+    public function make_bonus()
+    {
+        $mod_bonus = Model('user_bonus');
+        $paramer = $this->mType->get_param();
+        $type_id = $this->mType->getType_id();
+        $total_num = $this->mType->getTotal_num();
+
+        if($this->mType->isRandomAmount())
+        {
+            $moneys = $this->separate_money($paramer);
+            foreach($moneys as $val)
+            {
+                $datas['bonus_sn'] = make_sn();
+                $datas['bonus_value'] = $val;
+                $datas['bonus_type_id'] = $type_id;
+                $datas['status'] = 0;
+                $ret = $mod_bonus->add($datas);
+                if($ret <= 0) {
+                    Log::record("insert user_bonus err: {$type_id}.");
+                    return false;
+                }
+            }
+        }
+        else
+        {
+            $val =  $paramer['fixed_money'];
+            for($i = 0; $i < $total_num; $i++) {
+                $datas['bonus_sn'] = make_sn();
+                $datas['bonus_value'] = $val;
+                $datas['bonus_type_id'] = $type_id;
+                $datas['status'] = 0;
+                $ret = $mod_bonus->add($datas);
+                if($ret <= 0) {
+                    Log::record("insert user_bonus err: {$type_id}.");
+                    return false;
+                }
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * @param $paramer
+     */
+    private function separate_money($paramer)
+    {
+        $min_amount = floatval($paramer['min_amount']) * 100;
+        $max_amount = floatval($paramer['max_amount']) * 100;
+        $base_amount = $min_amount;
+
+        $num = intval($paramer['total_num']);
+        $total_amount = floatval($paramer['total_amount']) * 100 - $num * $base_amount;
+        $max_amount = $max_amount - $min_amount;
+
+        $ret = array();
+        for ($i = 0; $i < $num; $i++) {
+            array_push($ret,$base_amount / 100);
+        }
+        for ($i = 0; $i < $num && $total_amount > 0;)
+        {
+            if ($total_amount > 0) {
+                $amount = mt_rand(0, $max_amount);
+            } else {
+                $amount = 0;
+            }
+            if($total_amount < $amount) {
+                $amount = $total_amount;
+            }
+
+            if($ret[$i] * 100 +  $amount <= $base_amount + $max_amount) {
+                $ret[$i] += $amount / 100;
+                $total_amount -= $amount;
+            }
+
+            if($i == $num -1) {
+                $i = 0;
+            } else {
+                $i++;
+            }
+        }
+
+        //$y = array_sum($ret); //验证制造的数据是否可以正好相等
+        return $ret;
+    }
+}
+
+
+function create_generator($type)
+{
+    if($type->isDirectType()) {
+        return new DirectGenerator($type);
+    }
+    else if($type->isGeneralType()) {
+        return new GeneralGenerator($type);
+    }
+    else {
+        throw new Exception("错误的红包类型",errcode::ErrBonusType);
+    }
+}

+ 85 - 0
helper/bonus/grab.php

@@ -0,0 +1,85 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 16/4/10
+ * Time: 下午9:52
+ */
+
+namespace bonus;
+
+use \Model;
+use \Exception;
+use \errcode;
+
+
+abstract class IGrab
+{
+    protected $mType;
+    public function __construct($type) {
+        $this->mType = $type;
+    }
+
+    abstract public function get_bonus($paramer);
+}
+
+class DirectGrab extends IGrab
+{
+    public function __construct($type) {
+        parent::__construct($type);
+    }
+
+    public function get_bonus($type)
+    {
+        throw new Exception("指定人群的红包不用抢,直接领就好",errcode::ErrBonusType);
+    }
+}
+
+class general_grab extends IGrab
+{
+    public function __construct($paramer) {
+        parent::__construct($paramer);
+    }
+
+    public function get_bonus($paramer) //($type_sn,$time_out,$sess_id)
+    {
+        $time_out = $paramer['time_out'];
+        $session_id = $paramer['session_id'];
+        $mobile = $paramer['mobile'];
+        $type_id = $this->mType->getType_id();
+
+        $user_bonus = Model('user_bonus');
+        $bonus = $user_bonus->grab($type_id,$time_out,$mobile,$session_id);
+        if(!empty($bonus))
+        {
+            if($bonus['status'] == 0) {
+                Model('bonus_type')->edit(array('type_id' => $type_id), array('grabed_num' => array('exp', 'grabed_num+1')));
+            }
+            return $bonus;
+        } else {
+            return array();
+        }
+    }
+}
+
+function create_grab($type)
+{
+    if(!$type->isStart()) {
+        throw new Exception("红包还没开始抢",errcode::ErrBonusType);
+    }
+    if($type->isEnd()) {
+        throw new Exception("抢红包已经结束",errcode::ErrBonusType);
+    }
+
+    if($type->isDirectType()) {
+        return new DirectGenerator($type);
+    }
+    else if($type->isGeneralType()) {
+        return new general_grab($type);
+    }
+    else {
+        throw new Exception("错误的红包类型",errcode::ErrBonusType);
+    }
+}
+
+?>

+ 179 - 0
helper/bonus/type.php

@@ -0,0 +1,179 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 16/4/11
+ * Time: 上午10:04
+ */
+
+namespace bonus;
+
+use \Exception;
+use \errcode;
+use \Validate;
+
+class type
+{
+    const create_type = 0;
+    const load_type = 1;
+
+    const direct_type = 1;
+    const general_type =2;
+
+    const random_amount = 1;
+    const fixed_amount = 2;
+
+    //const file_amount = 3;  //红包金额指定但不皆相同
+
+    const def_minamount = 5.00;
+    const def_maxamount = 200.00;
+    const def_minnum = 1;
+
+    const def_period_day = 10;
+//    private $type_id;      // '表ID\n',
+//    private $type_sn;      // '对应的唯一识别号码',
+//    private $type_name;      // '红包名称',
+//    private $type_bless;       // '红包祝福语',
+//    private $user_type;      // '红包用户类型,1:指定的人群,2:面向大众',
+//    private $use_type;       //只能转发红包
+//    private $send_type;      // '红包类型,1为随机红包,2为固定额度红包'//,3,金额指定但不皆相同,
+//    private $sender_id;      // '发送者用户ID',
+//    private $sender_name;      //'发送者姓名',
+//    private $sender_mobile;      //'发送者手机号',
+//    private $total_amount;       //'红包总金额',
+//    private $total_num;      // '待发送红包总个数',
+//    private $remain_amount;      // '没抢的红包金额',
+//    private $drawed_num;       // '已经被抢的红包总个数',
+//    private $fixed_mondey;       // '固定红包的固定金额,只在固定红包时有效',
+//    private $min_amount;       // '随机红包最小额度',
+//    private $max_amount;       // '随机红包最大额度',
+//    private $send_start_date;      // '发送红包时间',
+//    private $send_end_date;      // '发送红包结束时间',
+
+//    private $use_start_date;       // '使用红包最早时间',
+//    private $use_end_date;       // '红包使用截止时间'
+
+    private $mParam;
+    private function __construct($param,$crete_type)
+    {
+        $this->mParam = $param;
+        if($crete_type == self::load_type) {
+            return;
+        }
+        $this->mParam['type_name'] = sprintf("%s发的红包.",$this->mParam['sender_name']);
+        $this->mParam['send_start_date'] = time();
+        $this->mParam['send_end_date'] = time() + self::def_period_day * 60 * 60 * 24;
+
+        if($this->isFixedAmount()) {
+            $this->mParam['min_amount'] = 0;
+            $this->mParam['max_amount'] = 0;
+        }
+        else if($this->isRandomAmount()) {
+            $this->mParam['fixed_money'] = 0;
+            $this->mParam['min_amount'] = 0.01;
+            $max_def = self::def_maxamount * 100;
+
+            $avg = ($this->mParam['total_amount'] * 100 - $this->mParam['total_num']) / $this->mParam['total_num'];
+            $max_val = $avg * 2;
+            $max = $max_def > $max_val ?  $max_val : $max_def;
+            $this->mParam['max_amount'] = floatval($max) / 100;
+        }
+    }
+
+    public function user_type() {
+        return intval($this->mParam['user_type']);
+    }
+    public function isDirectType() {
+        return (intval($this->mParam['user_type']) == self::direct_type);
+    }
+    public function isGeneralType() {
+        return (intval($this->mParam['user_type']) == self::general_type);
+    }
+    public function isFixedAmount() {
+        return (intval($this->mParam['send_type']) == self::fixed_amount);
+    }
+    public function isRandomAmount() {
+        return (intval($this->mParam['send_type']) == self::random_amount);
+    }
+    public function getType_id() {
+        return intval($this->mParam['type_id']);
+    }
+    public function setType_id($type_id) {
+        $this->mParam['type_id'] = $type_id;
+    }
+    public function setType_sn($type_sn) {
+        $this->mParam['type_sn'] = $type_sn;
+    }
+    public function getType_sn() {
+        return $this->mParam['type_sn'];
+    }
+    public function getTotal_num() {
+        return $this->mParam['total_num'];
+    }
+    public function getTotal_amount() {
+        return $this->mParam['total_amount'];
+    }
+    public function get_param() {
+        return $this->mParam;
+    }
+    public function isStart() {
+        $start_time = intval($this->mParam['send_start_date']);
+        if($start_time === 0) {
+            return true;
+        }
+        else {
+            return time() > $start_time;
+        }
+    }
+    public function isEnd() {
+        $end_time = intval($this->mParam['send_end_date']);
+        if($end_time === 0) {
+            return false;
+        }
+        else {
+            return time() > $end_time;
+        }
+    }
+
+    static public function crate_by_paramer($paramer)
+    {
+        return new type($paramer,self::create_type);
+    }
+
+    static public function create_by_sn($type_sn)
+    {
+        $bonus_type = Model('bonus_type');
+        $type_info = $bonus_type->get_one(array('type_sn' => $type_sn));
+        if(empty($type_info)) {
+            throw new Exception("错误的红包序列号.",errcode::ErrBonusType);
+        }
+        return new type($type_info,self::load_type);
+    }
+    static public function create_by_id($type_id)
+    {
+        $bonus_type = Model('bonus_type');
+        $type_info = $bonus_type->get_one(array('type_id' => $type_id));
+        if(empty($type_info)) {
+            throw new Exception("错误的红包ID号.",errcode::ErrBonusType);
+        }
+        return new type($type_info,self::load_type);
+    }
+
+    static public function create_by_ids($type_ids)
+    {
+        $bonus_type = Model('bonus_type');
+        $type_infos = $bonus_type->get(array('type_id' => array('in',$type_ids)));
+        if(empty($type_infos)) {
+            throw new Exception("错误的红包ID号.",errcode::ErrBonusType);
+        }
+
+        $ret = array();
+        foreach($type_infos as $val) {
+            $ret[$val['type_id']] = new type($val,self::load_type);
+        }
+        return $ret;
+    }
+
+}
+
+?>

+ 24 - 0
helper/bonus/util.php

@@ -0,0 +1,24 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 16/4/10
+ * Time: 下午11:17
+ */
+
+namespace bonus;
+
+function make_sn()
+{
+    if(isset($_SESSION['member_id']) && !empty((int) $_SESSION['member_id'])) {
+        return mt_rand(10,99)
+        . sprintf('%010d',time() - 946656000)
+        . sprintf('%03d', (float) microtime() * 1000)
+        . sprintf('%03d', (int) $_SESSION['member_id'] % 1000);
+    } else {
+        return mt_rand(10,99)
+        . sprintf('%010d',time() - 946656000)
+        . sprintf('%03d', (float) microtime() * 1000)
+        . sprintf('%03d', mt_rand(100,999));
+    }
+}

+ 153 - 0
helper/bonus_helper.php

@@ -0,0 +1,153 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 16/4/11
+ * Time: 上午12:51
+ */
+
+require_once (BASE_ROOT_PATH . '/helper/bonus/util.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus/type.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus/generator.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus/grab.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus/bind.php');
+require_once (BASE_ROOT_PATH . '/helper/bonus/factory.php');
+require_once (BASE_ROOT_PATH . '/helper/field_helper.php');
+require_once (BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+
+class bonus_helper
+{
+    //红包抢到不绑定手机的过期时间
+    const grab_period_timeout = 10 * 60;
+
+    //红包的四种状态
+    const bonus_state_ungrab = 0; //未抢
+    const bonus_state_grabed = 1; //已抢到
+    const bonus_state_binded = 2; //已绑定手机
+    const bonus_state_topuped= 3; //已经充值
+
+    static public function check_make_paramer($param)
+    {
+        try
+        {
+            $type = \bonus\type::crate_by_paramer($param);
+        } catch (Exception $ex) {
+
+        }
+    }
+    static public function isFixed($send_type) {
+        return ($send_type == \bonus\type::fixed_amount);
+    }
+    static public function isRandom($send_type) {
+        return ($send_type == \bonus\type::random_amount);
+    }
+
+    static public function make_bonus($param)
+    {
+        $ret = \bonus\factory::make_bonus($param);
+
+        return $ret;
+    }
+
+    static public function grab_bonus($param)
+    {
+        $ret =\bonus\factory::grab_bonus($param);
+        return $ret;
+    }
+
+    static public function bind_bonus($bonus_sn,$session_id,$mobile) {
+        return Model('user_bonus')->bind($bonus_sn,$session_id,$mobile);
+    }
+
+    static public function topup_bonus($mobile)
+    {
+        $mod_bonus = Model('user_bonus');
+        $ret = $mod_bonus->getAllBind($mobile);
+        if(empty($ret)) {
+            return false;
+        }
+
+        $type_ids = array();
+        foreach($ret as $val) {
+            array_push($type_ids,intval($val['bonus_type_id']));
+        }
+
+        array_unique($type_ids);
+        $types = \bonus\type::create_by_ids($type_ids);
+
+        $pd_helper = new predeposit_helper();
+        $bonusex = array();
+        foreach($ret as $val)
+        {
+            $type_id = $val['bonus_type_id'];
+            $bonus = array();
+            field_helper::copy_column($bonus,$types[$type_id]->get_param(),'type_sn,type_name,type_bless,sender_name,total_amount,total_num,grabed_num,binded_num,send_end_date');
+            field_helper::copy_column($bonus,$val,'bonus_sn,bonus_value,grab_time,get_time,status');
+            $info = sprintf("来自%s的红包.",$bonus['sender_name']);
+
+            try
+            {
+                Db::beginTransaction();
+                $pd_helper->bonus_add_money($bonus['bonus_value'],$bonus['bonus_sn'],$bonus['type_name'],$info);
+                if($mod_bonus->topuped() === false) {
+                    throw new Exception();
+                }
+                Db::commit();
+
+                array_push($bonusex,$bonus);
+            } catch (Exception $ex) {
+                Db::rollback();
+            }
+        }
+
+        if(empty($bonusex)) {
+            return false;
+        } else {
+            return $bonusex;
+        }
+    }
+
+    static public function check_insession($type_sn)
+    {
+        if(isset($_SESSION['bonus'][$type_sn]))
+        {
+            $cur_bonus = &$_SESSION['bonus'][$type_sn];
+            $status = intval($cur_bonus['status']);
+            if ($status == self::bonus_state_binded) {
+                return $cur_bonus;
+            }
+            else if ($status == self::bonus_state_grabed) {
+                $grab_time = $cur_bonus['grab_time'];
+                if ($grab_time > time() - self::grab_period_timeout) {
+                    return $cur_bonus;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    static public function add_session($type_info,$bonus_info)
+    {
+        if(!isset($_SESSION['bonus'])) {
+            $_SESSION['bonus'] = array();
+        }
+
+        $type_sn = $type_info['type_sn'];
+        $_SESSION['bonus'][$type_sn] = array();
+
+        $bonus = &$_SESSION['bonus'][$type_sn];
+
+        field_helper::copy_column($bonus,$type_info,'type_sn,type_name,type_bless,sender_name,total_amount,total_num,grabed_num,binded_num,send_end_date');
+        field_helper::copy_column($bonus,$bonus_info,'bonus_sn,bonus_value,grab_time,get_time,status');
+
+        return $bonus;
+    }
+
+    static public function clear_session()
+    {
+        if(!isset($_SESSION['bonus']))  {
+            unset($_SESSION['bonus']);
+        }
+    }
+}

+ 1 - 0
helper/fcgi_server.php

@@ -67,6 +67,7 @@ class fcgi_server
                 init_request();
                 init_cookie($_SERVER['HTTP_COOKIE']);
                 session::instance()->start();
+                $_SESSION['PHPSESSID'] = session_id();
 
                 $file = request_helper::script_file();
                 if(file_exists($file))

+ 11 - 0
helper/field_helper.php

@@ -46,4 +46,15 @@ class field_helper
             }
         }
     }
+    public static function copy_column(&$arDst,$arSrc,$columns)
+    {
+        $keys = explode(',',$columns);
+        foreach($arSrc as $key => $val)
+        {
+            if(in_array($key,$keys))
+            {
+                $arDst[$key] = $val;
+            }
+        }
+    }
 }

+ 53 - 0
helper/predeposit_helper.php

@@ -0,0 +1,53 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 16/4/12
+ * Time: 下午4:57
+ */
+
+
+class predeposit_helper
+{
+    private $model_pd;
+    public function __construct() {
+        $this->model_pd = Model('predeposit');
+    }
+
+    private function get_relay_total()
+    {
+        $member = Model('member');
+        $relay_array = $member->getMemberPdInfo($_SESSION['member_id']);
+        $total = floatval($relay_array['available_predeposit']);// + floatval($relay_array['available_relay_balance']);
+        return $total;
+    }
+
+    public function is_enough($money) {
+        return intval(self::get_relay_total() * 100) >= intval($money * 100);
+    }
+
+    public function bonus_add_money($amount,$bonus_sn,$bonus_name,$info)
+    {
+        $data = array();
+        $data['member_id'] = $_SESSION['member_id'];
+        $data['member_name'] = $_SESSION['member_name'];
+        $data['amount'] = $amount;
+        $data['order_sn'] = $bonus_sn;
+        $data['admin_name'] = $bonus_name;
+        $data['pdr_sn'] = $bonus_sn;
+        $data['lg_desc'] = $info;
+        $this->model_pd->changePd("bonus_add_money", $data);
+    }
+
+    public function hand_out_bonus($amount,$bonus_sn,$bonus_name,$info) {
+        $data = array();
+        $data['member_id'] = $_SESSION['member_id'];
+        $data['member_name'] = $_SESSION['member_name'];
+        $data['amount'] = $amount;
+        $data['order_sn'] = $bonus_sn;
+        $data['admin_name'] = $bonus_name;
+        $data['pdr_sn'] = $bonus_sn;
+        $data['lg_desc'] = $info;
+        $this->model_pd->changePd("hand_out_bonus", $data);
+    }
+}

+ 0 - 7
helper/refund_helper.php

@@ -1,7 +0,0 @@
-<?php
-/**
- * Created by PhpStorm.
- * User: stanley-king
- * Date: 16/4/7
- * Time: 下午11:03
- */

+ 2 - 0
mobile/control/bonus.php

@@ -14,6 +14,8 @@ class bonusControl extends mobileHomeControl
         parent::__construct();
     }
 
+
+
     /**
      * 首页-获取红包
      */

+ 163 - 0
mobile/control/bonusex.php

@@ -0,0 +1,163 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: stanley-king
+ * Date: 16/4/11
+ * Time: 上午12:49
+ */
+
+defined('InShopNC') or exit('Access Invalid!');
+
+require_once (BASE_ROOT_PATH . '/helper/bonus_helper.php');
+require_once (BASE_ROOT_PATH . '/helper/predeposit_helper.php');
+
+
+class bonusexControl extends mobileControl
+{
+    const def_bless = '恭喜发财大吉大利';
+
+    public function __construct() {
+        parent::__construct();
+    }
+
+    public function makeOp()
+    {
+        if($_SESSION['is_login'] != 1) {
+            return self::outerr(errcode::ErrUnLogin);
+        }
+
+        $param = array();
+        $send_type = intval($_GET['send_type']);
+        if(!in_array($send_type,array(1,2))) {
+            return self::outerr(errcode::ErrParamter,"请输入正确的红包类型.");
+        }
+        $param['send_type'] = $send_type; // '红包类型,1为随机红包,2为固定额度红包'
+        $param['type_bless'] = isset($_GET['type_bless']) && !empty($_GET['type_bless']) ? $_GET['type_bless'] : self::def_bless;
+
+        $param['total_num'] = intval($_GET['total_num']);
+        if($param['total_num'] <= 0) {
+            return self::outerr(errcode::ErrParamter,"红包个数不能小于1.");
+        }
+
+        if(bonus_helper::isFixed($send_type))
+        {
+            $fixed_mondey = floatval($_GET['fixed_money']);
+            if ($fixed_mondey * 100 < 1) {
+                return self::outerr(errcode::ErrParamter, "红包额度不能小于一分钱.");
+            }
+            $param['total_amount'] = $fixed_mondey * $param['total_num'];
+            $param['fixed_money'] = $fixed_mondey;
+        }
+        else if (bonus_helper::isRandom($send_type))
+        {
+            $total_amount = floatval($_GET['total_amount']);
+            if($total_amount * 100 < $param['total_num']) {
+                return self::outerr(errcode::ErrParamter,"金额不够.");
+            }
+            $param['total_amount'] = $total_amount;
+        }
+        $param['use_type'] = 1;
+        $param['user_type'] = 2;
+        $pre_helper = new predeposit_helper();
+        if(!$pre_helper->is_enough($param['total_amount'])) {
+            return self::outerr(errcode::ErrBonusNotEnough,"余额不够发送红包.");
+        }
+
+        $param['sender_id'] = $_SESSION['member_id'];
+        $param['sender_mobile'] = $_SESSION['member_mobile'];
+        $param['sender_name'] = $_SESSION['member_name'];
+
+        $ret = bonus_helper::make_bonus($param);
+        if($ret === false) {
+            return self::outerr(errcode::ErrBonus,"生成红包失败.");
+        } else {
+            return self::outsuccess(array('type_sn' => $ret,'url' => ""));
+        }
+    }
+
+    public function grabOp()
+    {
+        if(!isset($_GET['type_sn']) || empty($_GET['type_sn'])) {
+            return self::outerr(errcode::ErrParamter,"需要红包 type_sn 参数.");
+        }
+
+        $type_sn = $_GET['type_sn'];
+        $bonus = bonus_helper::check_insession($type_sn);
+        if($bonus === false)
+        {
+            $time_out = bonus_helper::grab_period_timeout;
+            $param = array( 'type_sn' => $type_sn,
+                'session_id' => $_SESSION['PHPSESSID'],
+                'time_out' => $time_out,
+                'member_mobile' => $_SESSION['member_mobile']);
+
+            $bonus_info = bonus_helper::grab_bonus($param);
+            if(empty($bonus_info)) {
+                return self::outerr(errcode::ErrBonusGrabNull,"红包已经被抢光了!"); //被领光
+            } else {
+                $bonus = bonus_helper::add_session($bonus_info['type_info'],$bonus_info['bonus_info']);
+            }
+        }
+
+        return self::outsuccess($bonus);
+    }
+
+    public function bindOp()
+    {
+        if(!isset($_GET['bonus_sn']) || empty($_GET['bonus_sn'])) {
+            return self::outerr(errcode::ErrParamter,"请输入红包序列号.");
+        }
+
+        $bonus_sn = $_GET['bonus_sn'];
+        if($_SESSION['is_login'] == 1) {
+            $mobile = $_SESSION['member_mobile'];
+        }
+        else {
+            if (!isset($_GET['mobile']) || empty($_GET['mobile'])) {
+                return self::outerr(errcode::ErrParamter,"请输入手机号码.");
+            } else {
+                $mobile = $_GET['mobile'];
+            }
+        }
+
+        if($_SESSION['is_login'] != 1)
+        {
+            if(!isset($_GET['code']) || empty($_GET['code'])) {
+                return self::outerr(errcode::ErrParamter, "请输入验证码.");
+            }
+            $code = $_GET['code'];
+            $ret = sms_helper::check_code(Sms::register_code,$code);
+            if(is_array($ret)) {
+                return self::outerr($ret['code'], $ret['msg']);
+            }
+        }
+
+        $ret = bonus_helper::bind_bonus($bonus_sn,$_SESSION['PHPSESSID'],$mobile);
+        if($ret) {
+            bonus_helper::clear_session();
+            return self::outsuccess(NULL);
+        } else {
+            return self::outerr(errcode::ErrBonus,"红包绑定失败.");
+        }
+    }
+
+    public function topupOp()
+    {
+        if($_SESSION['is_login'] != 1) {
+            return self::outerr(errcode::ErrUnLogin);
+        }
+
+        $bonus = bonus_helper::topup_bonus($_SESSION['member_mobile']);
+        if($bonus === false) {
+            bonus_helper::clear_session();
+            return self::outsuccess(array());
+        } else {
+            return self::outsuccess($bonus);
+        }
+    }
+
+    public function send_listOp()
+    {
+
+    }
+}

+ 7 - 6
mobile/control/config.php

@@ -14,7 +14,6 @@ class configControl extends mobileHomeControl
 
     /**
      * 获取配置文件
-     *
      * 参数: platform 1:android 2:ios
      */
     public function getconfigOp()
@@ -22,21 +21,23 @@ class configControl extends mobileHomeControl
         $platform = trim($_GET['platform']);
         $ver_code = trim($_GET['ver_code']);
         if (!isset($platform) || empty($platform)) {
-            return joutput_error(errcode::ErrInputParam);
+            return self::outerr(errcode::ErrInputParam);
         }
         if (!isset($ver_code) || empty($ver_code)) {
-            return joutput_error(errcode::ErrInputParam);
+            return self::outerr(errcode::ErrInputParam);
         }
 
         $result = Model()->table('config')->select();
         if (empty($result)) {
-            return joutput_error(errcode::ErrGetConfig);
-        } else {
+            return self::outerr(errcode::ErrGetConfig);
+        }
+        else
+        {
             $ret = array();
             foreach ($result as $value) {
                 $ret[$value['name']] = array('value'=>$value['value']);
             }
         }
-        return joutput_data($ret);
+        return self::outsucdess($ret);
     }
 }

+ 0 - 32
mobile/control/member_bonus.php

@@ -1,32 +0,0 @@
-<?php
-/**
- * 红包
- *
- *
- *
- *
-
- */
-
-defined('InShopNC') or exit('Access Invalid!');
-
-class member_bonusControl extends mbMemberControl
-{
-    public function __construct()
-    {
-        parent::__construct();
-    }
-
-    public function get_bonusOp()
-    {
-        $bonus_type = $_POST['type'];
-        $bonus = Model($bonus_type);
-
-        if($bonus_type === 'user_bonus') {
-            $user_id = $_SESSION['member_id'];
-            $user_mobile = $_POST['mobile'];
-            $bonus_data = $bonus->getBonus($user_id, $user_mobile);
-        }
-        joutput_data($bonus_data);
-    }
-}

+ 1 - 8
mobile/control/member_order.php

@@ -156,10 +156,6 @@ class member_orderControl extends mbMemberControl
         Log::record("buyer_id = {$condition['buyer_id']}", Log::DEBUG);
 
         $order_info = $model_order->getOrderInfo($condition);
-//        $if_allow = $model_order->getOrderOperateState('buyer_cancel', $order_info);
-//        if (!$if_allow) {
-//            return self::outerr(errcode::ErrOrder, '无权操作');
-//        }
         if ($order_info['order_state'] != ORDER_STATE_NEW) {
             Log::record("order_state = {$order_info['order_state']}.", Log::ERR);
             return self::outerr(errcode::ErrOrder, "已支付和已发货订单不能取消.");
@@ -297,10 +293,7 @@ class member_orderControl extends mbMemberControl
      */
     public function orderCountStateOp()
     {
-        $condition = array();
-        $condition['buyer_id'] = $_SESSION['member_id'];
-        $result = Model()->table('order')->field('order_state, count(*) as count')->where($condition)->group('order_state')->select();
-
+        $result = Model()->table('order')->field('order_state, count(*) as count')->where(array('buyer_id' => $_SESSION['member_id']))->group('order_state')->select();
         self::outsuccess(array('order_count' => $result));
     }
 }

+ 165 - 55
mobile/control/member_refund.php

@@ -4,72 +4,188 @@
  *
  *
  *
+ * 全部退款,单个商品退货
  *
-
  */
 
 //use Shopnc\Tpl;
 
 defined('InShopNC') or exit('Access Invalid!');
 
+
+
 class member_refundControl extends mbMemberControl
 {
-
+    static private $refund_type = array('1','2');
     public function __construct()
     {
         parent::__construct();
     }
 
     /**
-     * 退款接口(全退, 商品,全款全退, 不能指定)
+     * 向商家添加全部退款请求,即付完款后取消订单
      */
+    public function add_refund_allOp()
+    {
+        $order_info = Model('order')->getOrderInfo(array('order_sn' => $_GET['order_sn']));
+        if (empty($order_info)) {
+            return self::outerr(errcode::ErrOrderNotExist);
+        }
+
+        $model_refund = Model('refund_return');
+        $order_id = intval($order_info['order_id']);
+        $order = $model_refund->getRightOrderList(array('buyer_id' => $_SESSION['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');//订单状态20:已付款
+        $payment_code = $order['payment_code'];//支付方式
+        if ($refund['refund_id'] > 0 || $order['order_state'] != $order_paid || $payment_code == 'offline') {//检查订单状态,防止页面刷新不及时造成数据错误
+            return self::outerr(errcode::ErrOrderState,"只有付完款尚未发货的时才能退款。");
+        }
 
-    public function refundOp()
+        $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'] = $_POST['buyer_message'];
+        $refund_array['add_time'] = time();
+
+        $pic_array = array();
+        $pic_array['buyer'] = array();
+        $refund_array['pic_info'] = serialize($pic_array);
+        $state = $model_refund->addRefundReturn($refund_array,$order);
+
+        if ($state) {
+            $model_refund->editOrderLock($order_id);
+            return self::outsuccess(array("ret" => 1));
+        } else {
+            return self::outerr(errcode::ErrOrderRefundError,"退款失败.");
+        }
+    }
+
+    public function refund_one_infoOp()
     {
         $order_info = Model('order')->getOrderInfo(array('order_sn' => $_GET['order_sn']));
         if (empty($order_info)) {
-            joutput_error(array("errorMessage" => "订单为空"));
-            return;
+            return self::outerr(errcode::ErrOrderNotExist);
+        }
+        $order_id = intval($order_info['order_id']);
+        $order_goods_id = intval($_GET['order_goods_id']);//订单商品表编号
+        if ($order_id < 1 || $order_goods_id < 1) {       //参数验证
+            return self::outerr(errcode::ErrParamter,"商品参数错误.");
         }
 
         $model_refund = Model('refund_return');
         $condition = array();
         $reason_list = $model_refund->getReasonList($condition);//退款退货原因
-        $order_id = intval($order_info['order_id']);
-        $goods_id = intval($_GET['goods_id']);//订单商品表编号(不传参数为全退, 传的话,为退 为指定退商品)
-        if (strstr($_GET['goods_id'], ',')) {
-            $goods_id = explode(',', $_GET['goods_id']);
+
+        $condition = array();
+        $condition['buyer_id'] = $_SESSION['member_id'];
+        $condition['order_id'] = $order_id;
+        $order = $model_refund->getRightOrderList($condition, $order_goods_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) {
+            return self::outerr(errcode::ErrOrderRefundError,"不能重复退货.");
+        }
+        if($refund_state != 1) {
+            return self::outerr(errcode::ErrOrderState,'请确认订单状态,在已经付款后才能退款,已经发货后才能退货.');
         }
+
+        $goods['goods_image'] = cthumb($goods['goods_image'], 360, $order_info['store_id']);
+        $goods['order_goods_id'] = $order_goods_id;
+
+        return self::outsuccess(array('ret' => 1, 'reason_list' => $reason_list,'goods' => $goods));
+    }
+
+    public function add_refund_oneOp()
+    {
+        if(!isset($_GET['refund_type']) || empty($_GET['refund_type'])
+            || !in_array($_GET['refund_type'],self::$refund_type))
+        {
+            return self::outerr(errcode::ErrParamter,"请使用正确的退款类型,1:退款,2:退货.");
+        }
+        $refund_type = $_GET['refund_type'];
+
+        $order_info = Model('order')->getOrderInfo(array('order_sn' => $_GET['order_sn']));
+        if (empty($order_info)) {
+            return self::outerr(errcode::ErrOrderNotExist);
+        }
+        $order_id = $order_info['order_id'];
+        $order_goods_id = intval($_GET['order_goods_id']);//订单商品表编号
+        if ($order_id < 1 || $order_goods_id < 1) {       //参数验证
+            return self::outerr(errcode::ErrParamter,"商品参数错误.");
+        }
+        $buyer_msg = isset($_GET['buyer_msg']) ? $_GET['buyer_msg'] : '';
+
+        $model_refund = Model('refund_return');
+
+        $reason_list = $model_refund->getReasonList();//退款退货原因
+        $reason_id = intval($_POST['reason_id']);//退货退款原因
+        $reson_info = '其他';
+        if (!empty($reason_list[$reason_id])) {
+            $reason_array = $reason_list[$reason_id];
+            $reson_info = $reason_array['reason_info'];
+        }
+        $goods_num = intval($_POST['goods_num']);//退货数量
+        $refund_amount = floatval($_POST['refund_amount']);//退款金额
+
+        ////////////////////////////////////////////////////////////////
         $condition = array();
-        $condition['buyer_id'] = $order_info['buyer_id'];
-        $condition['order_id'] = $order_info['order_id'];
-        $order = $model_refund->getRightOrderList($condition, 0);
+        $condition['buyer_id'] = $_SESSION['member_id'];
+        $condition['order_id'] = $order_id;
+        $order = $model_refund->getRightOrderList($condition, $order_goods_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'];//商品实际成交价
-        $goods_pay_price = $order_amount;   // 默认全退款
-        $goods_num = 1; // 数量,  默认为1
-        if (is_array($goods_id))
-        {// 计算物品数量
-            $goods_pay_price = 0.0;
-            $goods_num = count($goods_id);
-            foreach ($goods_list as $value)
-            {
-                $tmp_goods_id = $value['goods_id'];
-                foreach ($goods_id as $goods_id_value)
-                {
-                    if (intval($goods_id_value) == intval($tmp_goods_id)) {
-                        $goods_pay_price += floatval($value['goods_pay_price']);
-                    }
-                }
-            }
+        $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;
         }
-            
-        $refund_amount = $goods_pay_price;
+
         $goods_id = $goods['rec_id'];
         $condition = array();
         $condition['buyer_id'] = $order['buyer_id'];
@@ -83,43 +199,37 @@ class member_refundControl extends mbMemberControl
         }
         $refund_state = $model_refund->getRefundState($order);//根据订单状态判断是否可以退款退货
         if ($refund['refund_id'] > 0 || $refund_state != 1) {//检查订单状态,防止页面刷新不及时造成数据错误
-            joutput_error(array("errorMessage" => "订单状态不正确"));
+            return self::outerr(errcode::ErrOrderState);
         }
-        
+
         $refund_array = array();
-        $refund_array['reason_info'] = '';
-        $reason_id = intval($_GET['reason_id']);//退货退款原因
-        $refund_array['reason_id'] = $reason_id;
-        $reason_array = array();
-        $reason_array['reason_info'] = '其他';
-        $reason_list[0] = $reason_array;
-        if (!empty($reason_list[$reason_id])) {
-            $reason_array = $reason_list[$reason_id];
-            $refund_array['reason_info'] = $reason_array['reason_info'];
+
+        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;
         }
 
-        $pic_array = array();
-        $pic_array['buyer'] = '';//$this->upload_pic();//上传凭证
-        $info = serialize($pic_array);
-        $refund_array['pic_info'] = $info;
+        $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'] = $_GET['refund_type'];//类型:1为退款,2为退货
-        $show_url = 'index.php?act=member_return&op=index';
-        $refund_array['return_type'] = $_GET['return_type'];//退货类型:1为不用退货,2为需要退货
+        $refund_array['refund_type'] = $refund_type;//类型: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';
-            $show_url = 'index.php?act=member_refund&op=index';
         }
         $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'] = $_GET['buyer_message'];
+        $refund_array['buyer_message'] = $buyer_msg;
         $refund_array['add_time'] = time();
         $state = $model_refund->addRefundReturn($refund_array,$order,$goods);
 
@@ -128,9 +238,9 @@ class member_refundControl extends mbMemberControl
             if ($order['order_state'] == $order_shipped) {
                 $model_refund->editOrderLock($order_id);
             }
-            joutput_data(array("errorMessage" => ""));
+            return self::outsuccess(array('ret' => 1));
         } else {
-            joutput_error(array("errorMessage" => "更新退款退货记录失败"));
+            return self::outerr(errcode::ErrOrderRefundError,"退货失败.");
         }
     }
 }

+ 10 - 3
mobile/util/errcode.php

@@ -41,16 +41,24 @@ class errcode extends SplEnum
     // 订单错误内容
     const ErrOrder = 10300;
     const ErrOrderCanNotCancel = 10301;
-    const ErrOrderNotExist = 10301;
+    const ErrOrderNotExist = 10302;
+    const ErrOrderState = 10303;
+    const ErrOrderRefundError = 10304;
+
     const ErrAddress = 10400;
     const ErrInvoice = 10500;
     const ErrPayment = 10600;
 
+
     // 快递内容
     const ErrExpress = 10700;
     const ErrExpressNotExist = 10701;
 
-    //goods 10800
+    const ErrBonus = 10800;
+    const ErrBonusType = 10801;
+    const ErrBonusMake = 10802;
+    const ErrBonusGrabNull = 10803;
+    const ErrBonusNotEnough = 10804;
 
     //套装
     const ErrBLUnExist = 10900;
@@ -145,7 +153,6 @@ class errcode extends SplEnum
             case errcode::ErrGetConfig:
                 return '获取配置文件出错';
 
-
             case errcode::ErrBLUnExist:
                 return '该优惠套装已不存在,建议您单独购买';