| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327 |
- <?php
- namespace app\modules\client\controllers\v1\integralAppreciation;
- use app\models\IntegralAppreciationPool;
- use app\models\IntegralAppreciationPoolSub;
- use app\models\IntegralAppreciationTransferIntegralLog;
- use app\models\IntegralAppreciationUser;
- use app\models\Option;
- use app\models\User;
- use app\modules\client\controllers\BaseController;
- use app\modules\client\models\v1\integralAppreciation\IntegralForm;
- class IntegralController extends BaseController
- {
- /**
- * 积分记录
- */
- public function actionList() {
- $form = new IntegralForm();
- $form->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]);
- }
- }
|