attributes = get_params(); $form->store_id = get_store_id(); $form->user = get_user(); return $this->asJson($form->getList()); } //积分转赠 public function actionGiveAssets() { $form = new IntegralForm(); $form->attributes = post_params(); $form->store_id = get_store_id(); $form->user = get_user(); return $this->asJson($form->giveAssets()); } //积分信息 public function actionGetUserIntegral() { $form = new IntegralForm(); $form->attributes = post_params(); $form->store_id = get_store_id(); $form->user = get_user(); return $this->asJson($form->getUserIntegral()); } /** * 增值积分和余额互转 */ public function actionTransfer() { $type = input_params('type', '1'); //1:积分转余额 2:余额转积分 $amount = input_params('amount', '0'); //数量 $store_id = get_store_id(); //获取增值积分配置信息 $integral_appreciation_setting = Option::get('integral_appreciation_setting', $store_id, 'integral_appreciation')['value']; $integral_appreciation_setting = json_decode($integral_appreciation_setting ?? '', true); $is_open_integral_to_balance = $integral_appreciation_setting['is_open_integral_to_balance'] ?? 0; //是否开启积分转余额 $is_open_balance_to_integral = $integral_appreciation_setting['is_open_balance_to_integral'] ?? 0; //是否开启余额转积分 $integral_to_balance_min = $integral_appreciation_setting['integral_to_balance_min'] ?? 0; //积分转余额最小金额 $balance_to_integral_min = $integral_appreciation_setting['balance_to_integral_min'] ?? 0; //余额转积分最小金额 $integral_to_balance_max = $integral_appreciation_setting['integral_to_balance_max'] ?? 0;//积分转余额最大金额 $balance_to_integral_max = $integral_appreciation_setting['balance_to_integral_max'] ?? 0; //余额转积分最大金额 $integral_to_balance_fee = $integral_appreciation_setting['integral_to_balance_fee'] ?? 0; //积分转余额手续费比利 $balance_to_integral_fee = $integral_appreciation_setting['balance_to_integral_fee'] ?? 0; //余额转积分手续费比利 if(!$amount){ return $this->asJson(['code'=>1, 'msg'=>'兑换数量不正确']); } $uid = get_user_id(); if($type==1){ if($is_open_integral_to_balance==0){ return $this->asJson(['code'=>1, 'msg'=>'未开启积分转余额功能']); } if($integral_to_balance_min && $amount<$integral_to_balance_min){ return $this->asJson(['code'=>1, 'msg'=>'积分转余额最小金额不能低于'.$integral_to_balance_min]); } if($integral_to_balance_max && $amount>$integral_to_balance_max){ return $this->asJson(['code'=>1, 'msg'=>'积分转余额最大金额不能高于'.$integral_to_balance_max]); } $t = \Yii::$app->db->beginTransaction(); try{ //查看用户的增值积分 $integral = 0; $integralAppreciationUser = IntegralAppreciationUser::findOne(['user_id' => $uid]); if($integralAppreciationUser){ $integral = $integralAppreciationUser->integral; }else{ $integralAppreciationUser = new IntegralAppreciationUser(); $integralAppreciationUser->user_id = $uid; $integralAppreciationUser->store_id = $store_id; if (!$integralAppreciationUser->save()) { throw new \Exception(json_encode($integralAppreciationUser->errors, JSON_UNESCAPED_UNICODE)); } } if($amount > $integral){ throw new \Exception('用户积分不足'); } //获取当前奖金池中的积分价格 $integral_price = 0; $total_amount = 0; //加锁 $poolLock = \Yii::$app->db->createCommand("SELECT * FROM cyy_integral_appreciation_pool WHERE store_id = :store_id FOR UPDATE", [':store_id' => $store_id])->queryOne(); if($poolLock){ $pool = IntegralAppreciationPool::findOne($poolLock['id']); $integral_price = $poolLock['integral_price']; $total_amount = $poolLock['amount']; }else{ $pool = new IntegralAppreciationPool(); $pool->store_id = $store_id; } //如果没有获取到积分价格 就使用设置项中的积分初始价格 if ($integral_price <= 0) { $integral_price = $integral_appreciation_setting['integral_init_price'] ?: 0; } //积分转换成余额 $transfer_amount = bcmul($amount, $integral_price, 2); //减去手续费 $integral_premium=0; if($integral_to_balance_fee){ $integral_premium = bcdiv(bcmul($transfer_amount, $integral_to_balance_fee, 2), 100, 2); $transfer_amount = bcsub($transfer_amount, $integral_premium, 2); } if($transfer_amount > $total_amount){ throw new \Exception('池子余额不足'); } //增加用户余额 if($transfer_amount){ $user = User::findOne(['id'=>$uid,'is_delete' => 0]); $user->money = bcadd($user->money, $transfer_amount, 2); $user->save(); } //扣除用户增值积分 $integralAppreciationUser->integral = bcsub($integralAppreciationUser->integral, $amount, 2); $integralAppreciationUser->save(); $user_total_integral = IntegralAppreciationUser::find()->where(['store_id' => $store_id])->sum('integral') ?: 0; //更新池子积分价格 $amountPool = $pool->amount ?: 0; $pool->amount = bcsub($amountPool, $transfer_amount, 2); $pool->total_integral = bcadd($pool->total_integral, $amount, 2); $pool->total_user_integral = $user_total_integral; $pool->integral_price = $pool->total_integral > 0 ? round($pool->amount / $pool->total_integral, 2) : 0; $pool->save(); //积分池变更记录 $poolSub = new IntegralAppreciationPoolSub(); $poolSub->user_id = $uid; $poolSub->store_id = $store_id; $poolSub->amount = -$transfer_amount; $poolSub->integral_price = $integral_price; $poolSub->integral = $amount; $poolSub->reflux_type=4; $poolSub->after_integral_price=$pool->integral_price; $poolSub->save(); //添加转换记录 $result = IntegralAppreciationTransferIntegralLog::saveIntegralLog($uid, $store_id,$amount, $transfer_amount,$integral_price, $integral_premium, 1); if ($result['code']) { throw new \Exception($result['msg']); } $t->commit(); return $this->asJson(['code'=>0, 'msg'=>'操作成功']); }catch (\Exception $e){ $t->rollBack(); return $this->asJson(['code'=>1, 'msg'=>$e->getMessage()]); } }else{ if($is_open_balance_to_integral==0){ return $this->asJson(['code'=>1, 'msg'=>'未开启余额转积分功能']); } if($balance_to_integral_min && $amount<$balance_to_integral_min){ return $this->asJson(['code'=>1, 'msg'=>'余额转积分最小金额不能低于'.$balance_to_integral_min]); } if($balance_to_integral_max && $amount>$balance_to_integral_max){ return $this->asJson(['code'=>1, 'msg'=>'余额转积分最大金额不能高于'.$balance_to_integral_max]); } $t = \Yii::$app->db->beginTransaction(); try{ $user = User::findOne(['id'=>$uid,'is_delete' => 0]); if($user->money < $amount){ throw new \Exception('用户余额不足'); } //获取当前奖金池中的积分价格 $integral_price = 0; $total_integral = 0; //加锁 $poolLock = \Yii::$app->db->createCommand("SELECT * FROM cyy_integral_appreciation_pool WHERE store_id = :store_id FOR UPDATE", [':store_id' => $store_id])->queryOne(); if($poolLock){ $pool = IntegralAppreciationPool::findOne($poolLock['id']); $integral_price = $poolLock['integral_price']; $total_integral = $poolLock['total_integral']; }else{ $pool = new IntegralAppreciationPool(); $pool->store_id = $store_id; } //如果没有获取到积分价格 就使用设置项中的积分初始价格 if ($integral_price <= 0) { $integral_price = $integral_appreciation_setting['integral_init_price'] ?: 0; } //余额转换成积分 $transfer_amount = bcdiv($amount, $integral_price, 2); //减去手续费 $integral_premium = 0; if($balance_to_integral_fee){ $integral_premium = bcdiv(bcmul($transfer_amount, $balance_to_integral_fee, 2), 100, 2); $transfer_amount = bcsub($transfer_amount, $integral_premium, 2); } if($transfer_amount > $total_integral){ throw new \Exception('池子积分不足'); } //减去用户余额 $user->money = bcsub($user->money, $amount, 2); $user->save(); //增加增值积分 if($transfer_amount){ $integralAppreciationUser = IntegralAppreciationUser::findOne(['user_id' => $uid]); if (!$integralAppreciationUser) { $integralAppreciationUser = new IntegralAppreciationUser(); $integralAppreciationUser->user_id = $uid; $integralAppreciationUser->store_id = $store_id; if (!$integralAppreciationUser->save()) { throw new \Exception(json_encode($integralAppreciationUser->errors, JSON_UNESCAPED_UNICODE)); } } $integralAppreciationUser->total_integral = bcadd($integralAppreciationUser->total_integral, $transfer_amount, 2); $integralAppreciationUser->integral = bcadd($integralAppreciationUser->integral, $transfer_amount, 2); if (!$integralAppreciationUser->save()) { throw new \Exception(json_encode($integralAppreciationUser->errors, JSON_UNESCAPED_UNICODE)); } $user_total_integral = IntegralAppreciationUser::find()->where(['store_id' => $store_id])->sum('integral') ?: 0; //更新池子积分价格 $amountPool = $pool->amount ?: 0; $pool->amount = bcadd($amountPool, $amount, 2); $pool->total_integral = bcsub($pool->total_integral, $transfer_amount, 2); $pool->total_user_integral = $user_total_integral; $pool->integral_price = $pool->total_integral > 0 ? round($pool->amount / $pool->total_integral, 2) : 0; $pool->save(); //积分池变更记录 $poolSub = new IntegralAppreciationPoolSub(); $poolSub->store_id = $store_id; $poolSub->user_id = $uid; $poolSub->amount = $amount; $poolSub->integral_price = $integral_price; $poolSub->integral = -$transfer_amount; $poolSub->reflux_type=4; $poolSub->after_integral_price=$pool->integral_price; $poolSub->save(); //添加转化记录 $result = IntegralAppreciationTransferIntegralLog::saveIntegralLog($uid,$store_id, $amount, $transfer_amount,$integral_price, $integral_premium, 2); if ($result['code']) { throw new \Exception('添加转换记录失败'.$result['msg']); } } $t->commit(); return $this->asJson(['code'=>0, 'msg'=>'操作成功']); }catch (\Exception $e){ $t->rollBack(); return $this->asJson(['code'=>1, 'msg'=>$e->getMessage()]); } } } /** * 积分余额互换记录 */ public function actionTransferList() { $type = input_params('type', 0); //1:积分转余额 2:余额转积分 $time = input_params('time', ''); //年月 $uid = get_user_id(); $query = IntegralAppreciationTransferIntegralLog::find()->where(['user_id' => $uid]); if($type){ $query->andWhere(['type' => $type]); } if ($time) { $start_time = strtotime($time); if (strpos($time, '-') !== false) { $end_time = strtotime('+1 month', strtotime($time)); } else { $start_time = strtotime($time . '-01-01'); $end_time = strtotime('+1 year', strtotime($time . '-01-01')); } $query->andWhere(['AND', ['>=', 'created_at', $start_time], ['<=', 'created_at', $end_time]]); } $query->orderBy('id DESC'); $pagination = pagination_make($query); foreach ($pagination['list'] as &$item) { $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']); } return $this->asJson(['code'=>0, 'msg'=>'操作成功', 'data'=>$pagination]); } }