|
|
@@ -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;
|
|
|
}
|
|
|
}
|