root 3 лет назад
Родитель
Сommit
883e034ed2
2 измененных файлов с 190 добавлено и 241 удалено
  1. 113 0
      common/models/ReturnOrder.php
  2. 77 241
      common/models/forms/OrderDeleteForm.php

+ 113 - 0
common/models/ReturnOrder.php

@@ -0,0 +1,113 @@
+<?php
+
+namespace common\models;
+
+use Yii;
+
+/**
+ * This is the model class for table "{{%RETURN_ORDER}}".
+ *
+ * @property string $ID
+ * @property string $SN 订单号
+ * @property string $DEC_SN 报单编号
+ * @property string $USER_ID 用户ID
+ * @property string $USER_NAME 会员编号
+ * @property string $ORDER_TYPE 订货类型
+ * @property string $ORDER_AMOUNT 订单总价格
+ * @property string $PV 订货PV
+ * @property string $PAY_AMOUNT 支付价格
+ * @property string $PAY_PV 实付PV
+ * @property int $PAY_AT 支付时间
+ * @property string $PAY_TYPE 支付方式
+ * @property string $FREIGHT 运费
+ * @property string $PAY_FREIGHT 实付运费金额
+ * @property int $DELIVERY_STATUS 发货状态
+ * @property int $DELIVERY_PERIOD 发货期数
+ * @property int $DELIVERY_AT 发货时间
+ * @property string $EXPRESS_COMPANY 快递公司
+ * @property string $ORDER_TRACK_NO 快递单号
+ * @property int $EXPRESS_TYPE 发货方式
+ * @property string $FRONT_REMARK 前台备注
+ * @property string $REMARK 后台备注
+ * @property int $PERIOD_NUM 期数
+ * @property int $STATUS 订单状态
+ * @property string $CONSIGNEE 收货人
+ * @property string $MOBILE 收货人手机
+ * @property string $TEL 固定电话
+ * @property int $PROVINCE 省份名称
+ * @property int $CITY 城市名称
+ * @property int $COUNTY 县区
+ * @property string $ADDRESS 详细地址
+ * @property string $P_CALC_MONTH 分区日期
+ * @property int $CREATED_AT 订单创建时间
+ * @property string $CREATE_USER 订单创建人
+ * @property int $UPDATED_AT 修改时间
+ * @property string $UPDATER 修改人
+ * @property int $IS_DELETE 是否删除
+ * @property int $DELETED_AT 删除时间
+ * @property int $WAREHOUSE 发货仓
+ */
+class ReturnOrder extends \common\components\ActiveRecord
+{
+    /**
+     * {@inheritdoc}
+     */
+    public static function tableName()
+    {
+        return '{{%RETURN_ORDER}}';
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function rules()
+    {
+        return [
+            [['USER_ID', 'SN', 'ORDER_TYPE'], 'required'],
+            [['ORDER_AMOUNT', 'PV', 'PAY_AMOUNT', 'PAY_PV', 'CREATE_AT'], 'number'],
+            [['ORDER_PERIOD_NUM','PERIOD_NUM', 'PROVINCE', 'CITY', 'COUNTY'], 'integer'],
+            [['ID','SN', 'DEC_SN', 'USER_ID','PAY_TYPE'], 'string', 'max' => 32],
+            [['USER_NAME'], 'string', 'max' => 16],
+            [['ORDER_TYPE'], 'string', 'max' => 12],
+            [['REMARK'], 'string', 'max' => 4000],
+            [['ADDRESS'], 'string', 'max' => 255],
+            [['SN'], 'unique'],
+        ];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function attributeLabels()
+    {
+        return [
+            'ID' => 'ID',
+            'SN' => '订单号',
+            'DEC_SN' => '报单编号',
+            'USER_ID' => '用户ID',
+            'USER_NAME' => '会员编号',
+            'ORDER_TYPE' => '订货类型',
+            'ORDER_AMOUNT' => '订单总价格',
+            'PV' => '订货PV',
+            'PAY_AMOUNT' => '支付价格',
+            'PAY_PV' => '实付PV',
+            'PAY_TYPE' => '支付方式',
+            'ORDER_PERIOD_NUM' => '原订单期数',
+            'PERIOD_NUM' => '期数',
+            'UPGRADE_TYPE' => '升级报单类型',
+            'PROVINCE' => '省份名称',
+            'CITY' => '城市名称',
+            'COUNTY' => '县区',
+            'ADDRESS' => '详细地址',
+            'CREATE_AT' => '订单创建时间',
+            'ORI_CASH' => '删除订单退还前用户的余额',
+            'ADMIN_ID' => '删除订单人ID',
+            'ORI_BONUS' => '删除订单前用户奖金',
+            'ORI_EXCHANGE_POINTS' => '删前用户无业绩兑换点数',
+            'ORI_RECONSUME_POINTS' => '删除前用户复消积分',
+            'ORI_DEC_LV' => '删前级别',
+            'RETURN_DEC_LV' => '删后级别',
+            'IS_LOCKING' => '此单是否会锁定会员'
+        ];
+    }
+}

+ 77 - 241
common/models/forms/OrderDeleteForm.php

@@ -5,6 +5,7 @@ use common\helpers\Cache;
 use common\helpers\Date;
 use common\components\Model;
 use common\helpers\Form;
+use common\helpers\snowflake\SnowFake;
 use common\helpers\user\Balance;
 use common\helpers\user\Cash;
 use common\helpers\user\Info;
@@ -16,9 +17,12 @@ use common\models\OrderGoods;
 use common\models\Period;
 use common\models\ReceiveAddress;
 use common\models\Region;
+use common\models\ReturnOrder;
 use common\models\ShopGoods;
 use common\models\User;
+use common\models\UserBonus;
 use common\models\UserNetwork;
+use common\models\UserWallet;
 use yii\base\Exception;
 
 /**
@@ -83,7 +87,7 @@ class OrderDeleteForm extends Model
         $sn = $this->orderSn;
         // 获取订单详情
         $orderInfo = Order::findUseDbCalc()
-        ->select('ID,DEC_SN,USER_ID,ORDER_TYPE,IS_DELETE')
+        ->select('ID,DEC_SN,SN,USER_ID,ORDER_TYPE,IS_DELETE,PAY_AMOUNT')
         ->where("SN=:SN", [':SN' => $sn])
         ->asArray()
         ->one();
@@ -91,6 +95,7 @@ class OrderDeleteForm extends Model
         $db = \Yii::$app->db;
         $transaction = $db->beginTransaction();
         try {
+            $isLock = 0 ; // 是否锁定会员单
             // 如果是注册订单,则删除订单并退还金额,然后再冻结用户
             if ($orderInfo['ORDER_TYPE'] == 'ZC') {
                 // 删除报单
@@ -111,6 +116,7 @@ class OrderDeleteForm extends Model
                     $transaction->rollBack();
                     throw new Exception('锁定会员失败,删除订单失败');
                 }
+                $isLock = 1;
             } 
             // 公共的退钱,删除订单操作
             $delOrder = Order::updateAll(
@@ -122,8 +128,76 @@ class OrderDeleteForm extends Model
                 $transaction->rollBack();
                 throw new Exception('删除订单失败');
             }
+            $userId = $orderInfo['USER_ID'];
+            // 记录退还前的账户原资金
+            $cash = $point = $bonus = $exchange = 0;
+            $userBonus = UserBonus::findUseSlaves()
+            ->select('BONUS,RECONSUME_POINTS,EXCHANGE_POINTS')
+            ->where('USER_ID=:USER_ID', [':USER_ID' => $userId])
+            ->asArray()
+            ->one();
+            if ($userBonus) {
+                $point = $userBonus['RECONSUME_POINTS'];
+                $bonus = $userBonus['BONUS'];
+                $exchange = $userBonus['EXCHANGE_POINTS'];
+            }
+            $cashWallet = UserWallet::findOneAsArray('USER_ID=:USER_ID', [':USER_ID'=>$userId], 'CASH');
+            if ($cashWallet) {
+                $cash = $cashWallet['CASH'];
+            }
             // 开始退钱,退积分等
-            $payType = $orderInfo['PAY_TYPE'];
+            $payType = $orderInfo['PAY_TYPE']; // 支付方式
+            $payAmount = $orderInfo['PAY_AMOUNT']; // 支付的金额
+            //退还
+            $amountResult = false;
+            if($payType == 'cash') {
+                $amountResult = Cash::changeUserCash($userId, 'CASH', +abs($payAmount), ['REMARK' => '退货退还余额']);
+            } else if ($payType == 'exchange') {
+                $amountResult = Balance::changeUserBonus($userId,'exchange_points', +abs($payAmount),['DEAL_TYPE_ID' => DealType::EXCHANGE_POINTS_EXCHANGE,'REMARK' => '退货退还无业绩兑换点数']);
+            } else{
+                $amountResult = Balance::changeUserBonus($userId,'reconsume_points', +abs($payAmount),['DEAL_TYPE_ID' => DealType::RECONSUME_POINTS_EXCHANGE,'REMARK' => '退货退还复销积分']);
+            }
+            if ($amountResult !== true) {
+                $transaction->rollBack();
+                throw new Exception('退还订单金额失败,删除订单失败');
+            }
+            // 退款成功,记录数据信息
+            $periodObj = Period::instance();
+            $nowPeriodNum = $periodObj->getNowPeriodNum();
+            $baseInfo = Info::baseInfoZh($orderInfo['USER_ID']);
+            $returnOrderModel = new ReturnOrder();
+            $returnOrderModel->ID = SnowFake::instance()->generateId();
+            $returnOrderModel->SN = $sn;
+            $returnOrderModel->DEC_SN = $orderInfo['DEC_SN'];
+            $returnOrderModel->CREATE_AT = Date::nowTime();
+            $returnOrderModel->ORDER_TYPE = $orderInfo['ORDER_TYPE'];
+            $returnOrderModel->ORDER_AMOUNT = $orderInfo['ORDER_AMOUNT'];
+            $returnOrderModel->PV = $orderInfo['PV'];
+            $returnOrderModel->PAY_PV = $orderInfo['PAY_PV'];
+            $returnOrderModel->PAY_AMOUNT = $orderInfo['PAY_AMOUNT'];
+            $returnOrderModel->PAY_TYPE = $orderInfo['PAY_TYPE'];
+            $returnOrderModel->USER_ID = $orderInfo['USER_ID'];
+            $returnOrderModel->PERIOD_NUM = $nowPeriodNum;
+            $returnOrderModel->ORDER_PERIOD_NUM = $orderInfo['PERIOD_NUM'];
+            $returnOrderModel->UPGRADE_TYPE = 0;// 不能删除升级单,默认0即可
+            $returnOrderModel->USER_NAME = $orderInfo['USER_NAME'];
+            $returnOrderModel->PROVINCE = $orderInfo['PROVINCE'];
+            $returnOrderModel->CITY = $orderInfo['CITY'];
+            $returnOrderModel->COUNTY = $orderInfo['COUNTY'];
+            $returnOrderModel->ADDRESS = $orderInfo['ADDRESS'];
+            $returnOrderModel->ADMIN_ID = \Yii::$app->user->id;
+            $returnOrderModel->ORI_CASH = $cash;
+            $returnOrderModel->ORI_BONUS = $bonus;
+            $returnOrderModel->ORI_EXCHANGE_POINTS = $exchange;
+            $returnOrderModel->ORI_RECONSUME_POINTS = $point;
+            $returnOrderModel->ORI_DEC_LV = $baseInfo['DEC_LV'];
+            $returnOrderModel->RETURN_DEC_LV = $baseInfo['DEC_LV'];
+            $returnOrderModel->IS_LOCKING = $isLock;
+            if (!$returnOrderModel->save()) {
+                $transaction->rollBack();
+                $this->addErrors($returnOrderModel->getErrors());
+                return false;
+            }
             
             $transaction->commit();
         } catch(Exception $e) {
@@ -131,21 +205,8 @@ class OrderDeleteForm extends Model
             $this->addError('add', $e->getMessage());
             return null;
         }
-    }
 
-
-
-   
-
-    /**
-     * 判断支付方式
-     * @param $attribute
-     */
-    public function isPayType($attribute){
-        if(!array_key_exists($this->payType, ShopGoods::payTypes())){
-            $this->addError($attribute, '支付方式错误');
-            return;
-        }
+        return true;
     }
 
     // 判断订单类型
@@ -222,230 +283,5 @@ class OrderDeleteForm extends Model
             }   
         }
         return true; 
-    } 
-
-    /**
-     * 校验类型
-     * @param $attribute
-     */
-    public function isStatus($attribute){
-        if(!in_array($this->type, \Yii::$app->params['orderStatus'])){
-            $this->addError($attribute, '类型错误');
-            return ;
-        }
-        if ($this->scenario == 'adminStatus'){
-            if ($this->status == $this->_model['STATUS']) {
-                $this->addError($attribute, '订单状态没有改变');
-                return ;
-            }
-            if($this->status == \Yii::$app->params['orderStatus']['notPaid'] && $this->_model['STATUS'] >= \Yii::$app->params['orderStatus']['delivery']) {
-                $this->addError($attribute, '订单已经进入物流状态不能改为未支付');
-                return ;
-            }
-            elseif($this->status == \Yii::$app->params['orderStatus']['paid'] && $this->_model['STATUS'] >= \Yii::$app->params['orderStatus']['cancel']) {
-                $this->addError($attribute, '订单已失效不能处理');
-                return ;
-            }
-            elseif($this->status == \Yii::$app->params['orderStatus']['delivery']) {
-                $this->addError($attribute, '订单不能单独处理为物流状态');
-                return ;
-            }
-            elseif($this->status == \Yii::$app->params['orderStatus']['complete'] && $this->_model['STATUS'] > \Yii::$app->params['orderStatus']['cancel']) {
-                $this->addError($attribute, '订单已失效不能处理');
-                return ;
-            }
-            elseif($this->status == \Yii::$app->params['orderStatus']['cancel']) {
-                if($this->_model['STATUS'] == \Yii::$app->params['orderStatus']['complete']) {
-                    $this->addError($attribute, '订单已完成不能取消');
-                    return ;
-                }
-                if($this->_model['STATUS'] == \Yii::$app->params['orderStatus']['del']) {
-                    $this->addError($attribute, '订单已删除不能取消');
-                    return ;
-                }
-            }
-            elseif($this->status == \Yii::$app->params['orderStatus']['del']) {
-                if($this->_model['STATUS'] == \Yii::$app->params['orderStatus']['complete']) {
-                    $this->addError($attribute, '订单已完成不能删除');
-                    return ;
-                }
-            }
-        }
-    }
-
-    /**
-     * 帮会员复销
-     * @return bool|null
-     * @throws Exception
-     * @throws \yii\db\Exception
-     */
-    public function reconsumeAdd(){
-        if(!$this->validate()){
-            return null;
-        }
-        $ids = $this->goodsId;
-        $totalAmount = 0;
-        $totalPv = 0;
-        $goodsType = ShopGoods::GOODS_TYPE;
-        foreach ($this->goodsNum as $k => $v) {
-            if ($v) {
-                $goods = ShopGoods::findOneAsArray('ID=:ID AND STATUS=1',[':ID'=> $ids[$k]]);
-                if($goods['STORE_NUMS']>0){
-                    if ($goods['TYPE'] == 1 || $goods['TYPE'] == 2) {
-                        $discount = $goodsType[$goods['TYPE']]['discount'];
-                        $realPrice = $goods['SELL_PRICE'] * $discount/100;
-                        $realPv = $goods['PRICE_PV'] * $discount/100;
-                    } else {
-                        $discount = $goods['SELL_DISCOUNT'];
-                        $realPrice = $goods['SELL_PRICE'] * $discount;
-                        $realPv = $goods['PRICE_PV'] * $discount;
-                    }
-                    $totalAmount += $realPrice * intval($v);
-                    $totalPv += $realPv * intval($v);
-                    $this->_orderGoods[] = [
-                        'GOODS_ID' => $goods['ID'],
-                        'PRICE' => $goods['SELL_PRICE'],
-                        'PV' => $goods['PRICE_PV'],
-                        'REAL_PRICE' => $realPrice,
-                        'REAL_PV' => $realPv,
-                        'POINT' => $goods['POINT'],
-                        'BUY_NUMS' => intval($v),
-                        'SKU_CODE' => $goods['GOODS_NO'],
-                        'GOODS_TITLE' => $goods['GOODS_NAME']
-                    ];
-                }
-            }
-        }
-        $this->_decAmount = $totalAmount;
-        $this->_decPv = $totalPv;
-        $this->_freight = ($totalAmount>=300) ? 0 : 15;
-        $this->_payAmount = $this->_decAmount + $this->_freight;
-
-        $db = \Yii::$app->db;
-        $transaction = $db->beginTransaction();
-        try {
-            $loginUserId = \Yii::$app->user->id;
-
-            //是否开启伞下会员限制
-            $isResaleUmbrella = Cache::getSystemConfig()['isResaleUmbrella']['VALUE'];
-            if($isResaleUmbrella){
-                $userId = Info::getUserIdByUserName($this->userName);
-                $userNetwork = UserNetwork::find()->where("USER_ID=:USER_ID AND INSTR(PARENT_UIDS,'{$loginUserId}')>0", ['USER_ID'=>$userId])->count();
-                if(!$userNetwork){
-                    throw new Exception($this->userName.'不是您的伞下会员,不能为其复消!');
-                }
-            }
-            //判断用户余额是否充足
-            if($this->payType=='cash') {
-                if (Cash::getAvailableBalance($loginUserId) < $this->_payAmount) {
-                    throw new Exception('余额不足,无法购买商品');
-                }
-            }else{
-                if ($this->_payAmount > Balance::getBalanceReconsumePoints($loginUserId)) {
-                    throw new Exception('复消积分不足,无法购买商品');
-                }
-            }
-            //写入订单
-            if (!$orderResult = $this->addUserOrder()) {
-                throw new Exception(Form::formatErrorsForApi($orderResult->getErrors()));
-            }
-            $transaction->commit();
-        }catch (\Exception $e){
-            $transaction->rollBack();
-            $this->addError('add', $e->getMessage());
-            return null;
-        }
-        return true;
-    }
-
-    /**
-     * 帮会员复消的订单
-     */
-    public function addUserOrder(){
-        $periodObj = Period::instance();
-        $nowPeriodNum = $periodObj->getNowPeriodNum();
-        $nowCalcMonth = $periodObj->getYearMonth($nowPeriodNum);
-        //帮复消会员Id(登陆会员)
-        $loginUserId = \Yii::$app->user->id;
-        $loginUserName = Info::getUserNameByUserId($loginUserId);
-        //订单会员Id
-        $userId = Info::getUserIdByUserName($this->userName);
-
-        // 加入订单信息
-        $warehouse = Region::getWarehouseByCode($this->province);//仓库
-        if(!$warehouse){
-            throw new Exception('地区暂时不支持配送,具体联系客服');
-        }
-        $ordNo = $this->_generateSn();
-        $orderModel = new Order();
-        $orderModel->SN = 'OS'.$ordNo;
-        $orderModel->DEC_SN = 'DS'.$ordNo;
-        $orderModel->ORDER_TYPE = $this->type;
-        $orderModel->USER_ID = $userId;
-        $orderModel->USER_NAME = $this->userName;
-        $orderModel->ORDER_AMOUNT = $this->_decAmount;
-        $orderModel->PV = $this->_decPv;
-        $orderModel->PAY_AMOUNT = $this->_payAmount;
-        $orderModel->PAY_PV = $this->_decPv;
-        $orderModel->PAY_AT = Date::nowTime();
-        $orderModel->PAY_TYPE = $this->payType;
-        $orderModel->PERIOD_NUM = $nowPeriodNum;
-        $orderModel->P_CALC_MONTH = Date::ociToDate($nowCalcMonth, Date::OCI_TIME_FORMAT_SHORT_MONTH);
-        $orderModel->FREIGHT = $this->_freight;
-        $orderModel->PAY_FREIGHT = $this->_freight;
-        $orderModel->CONSIGNEE = $this->consignee;
-        $orderModel->MOBILE = $this->acceptMobile;
-        $orderModel->PROVINCE = $this->province;
-        $orderModel->CITY = $this->city;
-        $orderModel->COUNTY = $this->county;
-        $orderModel->ADDRESS = $this->detailaddress;
-        $orderModel->FRONT_REMARK = $this->remark;
-        $orderModel->WAREHOUSE = $warehouse;
-        $orderModel->STATUS = 1;
-        $orderModel->CREATED_AT = Date::nowTime();
-        $orderModel->CREATE_USER = $loginUserName;
-        if(!$orderModel->save()){
-            $this->addErrors($orderModel->getErrors());
-            return false;
-        }
-        // 加入商品到订单商品表
-        foreach($this->_orderGoods as $key=>$value){
-            $this->_orderGoods[$key]['ORDER_SN'] = $orderModel->SN;
-            $this->_orderGoods[$key]['P_CALC_MONTH'] = Date::ociToDate($nowCalcMonth, Date::OCI_TIME_FORMAT_SHORT_MONTH);
-        }
-        OrderGoods::batchInsert($this->_orderGoods);
-
-        //扣除会员余额/积分
-        if($this->payType=='cash') {
-            Cash::changeUserCash($loginUserId, 'CASH', -abs($this->_payAmount), ['REMARK' => '会员复销余额支付']);
-        }else{
-            Balance::changeUserBonus($loginUserId,'reconsume_points', -abs($this->_payAmount),['DEAL_TYPE_ID' => DealType::RECONSUME_POINTS_EXCHANGE, 'REMARK' => '会员复销积分兑换']);
-        }
-        return $orderModel;
-    }
-
-    /**
-     * 生成流水号
-     * @return string
-     */
-    private function _generateSn() {
-        return Date::today('Ymd') . $this->_random(10, 1);
-    }
-
-    /**
-     * 生成随机数
-     * @param $length
-     * @param int $numeric
-     * @return string
-     */
-    private function _random($length, $numeric = 0) {
-        $seed = base_convert(md5(microtime() . $_SERVER['DOCUMENT_ROOT']), 16, $numeric ? 10 : 35);
-        $seed = $numeric ? (str_replace('0', '', $seed) . '012340567890') : ($seed . 'zZ' . strtoupper($seed));
-        $hash = '';
-        $max = strlen($seed) - 1;
-        for ($i = 0; $i < $length; $i++) {
-            $hash .= $seed[mt_rand(0, $max)];
-        }
-        return $hash;
     }
 }