request->isPost) { $params = Yii::$app->request->post(); // 验证 $res = Yii::$app->services->validate->validate($params, [ [['user_id','money'], 'required'], [['money'], 'double'], [['type'], 'in', 'range' => [RedpackEnum::WALLET_REDPACK,RedpackEnum::WALLET_REDPACK_FROZEN]], ]); if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage()); if ($params['user_id'] == $this->user_id) return $this->error("自己不可以转给自己"); $config = Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_REDPACK, 'basic'); $redpack_name = $config['redpack_name'] ?? '红包'; if ($config['transfer_status'] == 2) return $this->error($redpack_name . "转送未开启"); $user_redpack = RedpackWallet::getOne([['mall_id' => $this->mall_id,'user_id' => $this->user_id,'status' => StatusEnum::ENABLED]],true); //将冻结红包的金额先减扣掉 if($params['type'] == RedpackEnum::WALLET_REDPACK_FROZEN){ //是冻结红包 if (!in_array(RedpackEnum::WALLET_REDPACK_FROZEN,json_decode($config['transfer_red_type']))) { return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK_FROZEN, $this->mall_id)."转送未开启"); } $is_frozen = true; //红包手续费 $service_money = $params['money'] * $config['transfer_percentage']/100; $transfer_money = $params['money'] + $service_money; if ($user_redpack['frozen_redpack'] < $transfer_money) { return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK_FROZEN, $this->mall_id)."余额不足"); } }else{ if (!in_array(RedpackEnum::WALLET_REDPACK,json_decode($config['transfer_red_type']))) { return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK, $this->mall_id)."转送未开启"); } //红包手续费 $service_money = $params['money'] * $config['transfer_percentage']/100; $transfer_money = $params['money']; $params['money'] = bcsub($params['money'], $service_money,2); $is_frozen = false; if ($user_redpack['redpack'] < $transfer_money) { return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK, $this->mall_id)."余额不足"); } } //转让权限判断 if ($config['auth_status'] == 2){ $parent = UserPartitionRelationship::getParentIdArr($params['user_id']);//获取上级 $children = UserPartitionRelationship::getChildIdArr($params['user_id']);//获取下级 $relation = array_merge($parent,$children); if (!in_array($this->user_id, $relation)) return $this->error('只能转给自己团队会员');; //判断绑定者和分享者是否在同一关系链中 } $trans = Yii::$app->db->beginTransaction(); try { $rest = true; //接收红包者 $wallet = RedpackWallet::setData([ 'mall_id' => $this->mall_id, 'user_id' => $params['user_id'], 'is_frozen' => $is_frozen, 'is_deduct' => true, 'money' => $params['money'], 'from_type' => RedpackEnum::FROM_TRASFTER, 'desc' => "接收方:{$redpack_name}转给好友", ]); if ($wallet == false) $rest = false; //转红包者 $wallet = RedpackWallet::setData([ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => $is_frozen, 'is_deduct' => true, 'money' => - $params['money'], 'from_type' => RedpackEnum::FROM_TRASFTER, 'desc' => "转{$redpack_name}方:{$redpack_name}转给好友", ]); if ($wallet == false) $rest = false; //手续费 if($service_money > 0){ $wallet = RedpackWallet::setData([ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => $is_frozen, 'is_deduct' => true, 'money' => - $service_money, 'from_type' => RedpackEnum::FROM_SERVICE_CHARGE, 'desc' => "转{$redpack_name}方:{$redpack_name}扣除手续费", ]); if ($wallet == false) $rest = false; } if ($rest == false) throw new Exception(RedpackWallet::getStaticError()); $trans->commit(); return $this->success('操作成功'); } catch (\Exception $e) { throw new Exception($e->getMessage()); $trans->rollBack(); return false; } } } /** * 转送配置 * @Author: ltm * @DateTime: 2022/3/23 0023 16:57 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $data * @return string */ public function actionTransferConfig(){ if (Yii::$app->request->isGet) { $config_data = Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_REDPACK, 'basic'); if ($config_data['transfer_status'] == 2) return $this->error(($config_data['redpack_name'] ?? '红包') . "转送未开启"); $redpack_type = \Qiniu\json_decode($config_data['transfer_red_type'],true); $redpack_type_text = []; foreach ($redpack_type as $k=>$v){ if($v == 'redpack' || $v == 'frozen_redpack'){ $redpack_type_text[$v] = RedpackEnum::getRedpackText($v, $this->mall_id); } } $config['redpack_type'] = $redpack_type_text; $config['redpack_name'] = $config_data['redpack_name'] ?? '红包'; // $config['redpack_type'] = RedpackEnum::getRedpackText(); $config['money_service'] = $config_data['transfer_percentage']; //手续费 return $this->success('操作成功',$config); } } /** * 转出配置 * @Author: ltm * @DateTime: 2022/3/23 0023 16:57 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $data * @return string */ public function actionTransferOutConfig(){ if (Yii::$app->request->isGet) { $config_data = Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_REDPACK, 'basic'); $config_data = RedpackHelper::initConfig($config_data); if ($config_data['transfer_out_status'] == 2) return $this->error(($config_data['redpack_name'] ?? '红包') . "转送未开启"); $redpack_type = \Qiniu\json_decode($config_data['transfer_out_type'],true); $redpack_type_text = []; $config = []; if (!empty($redpack_type)) { foreach ($redpack_type as $k => $v) { if ($v == 'redpack' || $v == 'frozen_redpack') { $redpack_type_text[$v] = RedpackEnum::getRedpackText($v, $this->mall_id); $config['redpack_types'][$v] = [ 'redpack_type' => $redpack_type_text[$v], 'redpack_name' => $config_data['redpack_name'] ?? '红包', 'money_service' => $config_data["{$v}_transfer_out_service"], 'service_type' => $config_data["{$v}_transfer_out_service_rate"], ]; $transfer_out_modes = !empty($config_data["{$v}_transfer_out_mode"]) ? Json::decode($config_data["{$v}_transfer_out_mode"]) : []; foreach ($transfer_out_modes as $mode) { if ($mode == 1) { $config['redpack_types'][$v]['to_money_service'] = $config_data["{$v}_transfer_out_balance"]; } if ($mode == 2) { $config['redpack_types'][$v]['to_score_service'] = $config_data["{$v}_transfer_out_score"]; } } } } } $config['redpack_type'] = $redpack_type_text; $config['redpack_name'] = $config_data['redpack_name'] ?? '红包'; // $config['redpack_type'] = RedpackEnum::getRedpackText(); $config['money_service'] = $config_data['transfer_out_service']; //手续费 $config['to_money_service'] = $config_data['transfer_out_balance']; //一元红包等于多少元 $config['to_score_service'] = $config_data['transfer_out_score']; //一元红包等于多少积分 return $this->success('操作成功',$config); } } /** * 红包转余额或积分 * @Author: ltm * @DateTime: 2022/3/23 0023 10:44 * @Copyright: copyright (c) 2021 广东七件事集团 * @param $data * @return string */ public function actionTransferBalanceOrScore(){ if (Yii::$app->request->isPost) { $params = Yii::$app->request->post(); // 验证 $res = Yii::$app->services->validate->validate($params, [ [['money'], 'required'], [['money'], 'double'], [['type'], 'in', 'range' => [RedpackEnum::WALLET_REDPACK,RedpackEnum::WALLET_REDPACK_FROZEN]], [['transfer_out_mode'], 'in', 'range' => [1,2]],//1是金额 2是积分 ]); if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage()); if ($params['user_id'] == $this->user_id) return $this->error("自己不可以转给自己"); $config = Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_REDPACK, 'basic'); $redpack_name = $config['redpack_name'] ?? '红包'; if ($config['transfer_out_status'] == 2) return $this->error($redpack_name . "转送未开启"); if ($params['money'] < 0.01) return $this->error($redpack_name . "金额必须大于或等于一分钱"); $user_redpack = RedpackWallet::getOne([['mall_id' => $this->mall_id,'user_id' => $this->user_id,'status' => StatusEnum::ENABLED]],true); //将冻结红包的金额先减扣掉 if($params['type'] == RedpackEnum::WALLET_REDPACK_FROZEN){ //是冻结红包 $is_frozen = true; if (!in_array(RedpackEnum::WALLET_REDPACK_FROZEN,json_decode($config['transfer_out_type']))) { return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK_FROZEN, $this->mall_id)."转送未开启"); } //红包手续费 if($config['transfer_out_service']){ $service_money = $params['money'] * $config['transfer_out_service']/100; //手续费限制:最少0.01 $service_money = $service_money > 0.01 ? $service_money : 0.01; }else{ $service_money = 0; } //$service_money = $params['money'] * $config['transfer_out_service']/100; $transfer_money = $params['money']; $params['money'] = bcsub($params['money'], $service_money,2); if ($user_redpack['frozen_redpack'] < ($transfer_money + $service_money)){ return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK_FROZEN, $this->mall_id)."余额不足"); } }else{ if (!in_array(RedpackEnum::WALLET_REDPACK,json_decode($config['transfer_out_type']))) { return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK, $this->mall_id)."转送未开启"); } //红包手续费 if($config['transfer_out_service']){ $service_money = $params['money'] * $config['transfer_out_service']/100; //手续费限制:最少0.01 $service_money = $service_money > 0.01 ? $service_money : 0.01; }else{ $service_money = 0; } //$service_money = $params['money'] * $config['transfer_out_service']/100; $transfer_money = $params['money']; $params['money'] = bcsub($params['money'], $service_money,2); $is_frozen = false; if ($user_redpack['redpack'] < ($transfer_money + $service_money)) return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK, $this->mall_id)."余额不足"); } //判断转出方式 if($params['transfer_out_mode'] == 1){ if (!in_array(1,json_decode($config['transfer_out_mode']))) return $this->error($redpack_name . "转余额未开启"); $pay_money = $params['money'] * $config['transfer_out_balance']; $transfer_type = UserWalletService::WALLET_TYPE_BALANCE; $type_redpack = RedpackEnum::FROM_TO_BALANCE; $desc = "{$redpack_name}转余额"; }else{ if (!in_array(2,json_decode($config['transfer_out_mode']))) return $this->error("{$redpack_name}转积分未开启"); $pay_money = $params['money'] * $config['transfer_out_score']; $transfer_type = UserWalletService::WALLET_TYPE_SCORE; $type_redpack = RedpackEnum::FROM_TO_SCORE; $desc = "{$redpack_name}转积分"; } $trans = Yii::$app->db->beginTransaction(); try { //转出红包者 $wallet = RedpackWallet::setData([ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => $is_frozen, 'is_deduct' => true, 'money' => - $params['money'], 'from_type' => $type_redpack, 'desc' => $desc, ]); if ($wallet === false) throw new Exception(RedpackWallet::getStaticError()); //手续费 if ($service_money >= 0.01) { $wallet = RedpackWallet::setData([ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => $is_frozen, 'is_deduct' => true, 'money' => - $service_money, 'from_type' => $type_redpack, 'desc' => $desc . "手续费", ]); if ($wallet === false) throw new Exception(RedpackWallet::getStaticError()); } //转到用户账号 $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => false, 'wallet_type' => $transfer_type, 'money' => $pay_money, 'desc' => $desc, 'source_table' => Redpack::briefTableName(), 'source_table_id' => $this->user_id, 'from_type' => UserWalletEnum::FROM_REDPACK, 'capital_type' => UserWalletEnum::REDPACK_TRANSFER, ]; $res = UserWalletService::batchHandleByQueue($insert_wallet); if ($res == false) throw new Exception(UserWalletService::getStaticError()); $trans->commit(); return $this->success('操作成功'); } catch (\Exception $e) { $trans->rollBack(); return $this->error($e->getMessage()); } } } public function actionOutTransferBalanceOrScore(){ if (Yii::$app->request->isPost) { $params = Yii::$app->request->post(); // 验证 $res = Yii::$app->services->validate->validate($params, [ [['money'], 'required'], [['money'], 'double'], [['type'], 'in', 'range' => [RedpackEnum::WALLET_REDPACK,RedpackEnum::WALLET_REDPACK_FROZEN]], [['transfer_out_mode'], 'in', 'range' => [1,2]],//1是金额 2是积分 ]); if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage()); if ($params['user_id'] == $this->user_id) return $this->error("自己不可以转给自己"); $config = Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_REDPACK, 'basic'); $config = RedpackHelper::initConfig($config); $redpack_name = $config['redpack_name'] ?? '红包'; if ($config['transfer_out_status'] == 2) return $this->error($redpack_name . "转送未开启"); // 有无勾选任意一个冻结红包类型,无就报错 if (empty($config["transfer_out_type"])) { return $this->error("冻结红包转送未开启"); } if ($params['money'] < 0.01) return $this->error($redpack_name . "金额必须大于或等于一分钱"); $user_redpack = RedpackWallet::getOne([['mall_id' => $this->mall_id,'user_id' => $this->user_id,'status' => StatusEnum::ENABLED]],true); $prefix_key = "{$params['type']}_"; //将冻结红包的金额先减扣掉 if($params['type'] == RedpackEnum::WALLET_REDPACK_FROZEN){ //是冻结红包 $is_frozen = true; if (!in_array(RedpackEnum::WALLET_REDPACK_FROZEN,json_decode($config["transfer_out_type"]))) { return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK_FROZEN, $this->mall_id)."转送未开启"); } //红包手续费 if($config["{$prefix_key}transfer_out_service"]){ $service_money = $config["{$prefix_key}transfer_out_service"]; // 默认固定金额 if (empty($config["{$prefix_key}transfer_out_service_rate"])) { // 如果是百分比 $service_money = $params['money'] * $config["{$prefix_key}transfer_out_service"]/100; } //手续费限制:最少0.01 $service_money = $service_money > 0.01 ? $service_money : 0.01; }else{ $service_money = 0; } $transfer_money = $params['money']; $params['money'] = bcsub($params['money'], $service_money,2); if ($user_redpack['frozen_redpack'] < ($transfer_money + $service_money)){ return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK_FROZEN, $this->mall_id)."余额不足"); } }else{ if (!in_array(RedpackEnum::WALLET_REDPACK,json_decode($config["transfer_out_type"]))) { return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK, $this->mall_id)."转送未开启"); } //红包手续费 if($config["{$prefix_key}transfer_out_service"]){ $service_money = $config["{$prefix_key}transfer_out_service"]; // 默认固定金额 if (empty($config["{$prefix_key}transfer_out_service_rate"])) { // 如果是百分比 $service_money = $params['money'] * $config["{$prefix_key}transfer_out_service"]/100; } //手续费限制:最少0.01 $service_money = $service_money > 0.01 ? $service_money : 0.01; }else{ $service_money = 0; } $transfer_money = $params['money']; $params['money'] = bcsub($params['money'], $service_money,2); $is_frozen = false; if ($user_redpack['redpack'] < ($transfer_money + $service_money)) return $this->error(RedpackEnum::getRedpackText(RedpackEnum::WALLET_REDPACK, $this->mall_id)."余额不足"); } //判断转出方式 if($params["transfer_out_mode"] == 1){ if (!in_array(1,json_decode($config["{$prefix_key}transfer_out_mode"]))) return $this->error($redpack_name . "转余额未开启"); $pay_money = $params['money'] * $config["{$prefix_key}transfer_out_balance"]; $transfer_type = UserWalletService::WALLET_TYPE_BALANCE; $type_redpack = RedpackEnum::FROM_TO_BALANCE; $desc = "{$redpack_name}转余额"; }else{ if (!in_array(2,json_decode($config["{$prefix_key}transfer_out_mode"]))) return $this->error("{$redpack_name}转积分未开启"); $pay_money = $params['money'] * $config["{$prefix_key}transfer_out_score"]; $transfer_type = UserWalletService::WALLET_TYPE_SCORE; $type_redpack = RedpackEnum::FROM_TO_SCORE; $desc = "{$redpack_name}转积分"; } $trans = Yii::$app->db->beginTransaction(); try { //转出红包者 $wallet = RedpackWallet::setData([ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => $is_frozen, 'is_deduct' => true, 'money' => - $params['money'], 'from_type' => $type_redpack, 'desc' => $desc, ]); if ($wallet === false) throw new Exception(RedpackWallet::getStaticError()); //手续费 if ($service_money >= 0.01) { $wallet = RedpackWallet::setData([ 'mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => $is_frozen, 'is_deduct' => true, 'money' => - $service_money, 'from_type' => $type_redpack, 'desc' => $desc . "手续费", ]); if ($wallet === false) throw new Exception(RedpackWallet::getStaticError()); } //转到用户账号 $insert_wallet [] = ['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'is_frozen' => false, 'wallet_type' => $transfer_type, 'money' => $pay_money, 'desc' => $desc, 'source_table' => Redpack::briefTableName(), 'source_table_id' => $this->user_id, 'from_type' => UserWalletEnum::FROM_REDPACK, 'capital_type' => UserWalletEnum::REDPACK_TRANSFER, ]; // $res = UserWalletService::batchHandleByQueue($insert_wallet); $res = UserWalletService::batchHandle($insert_wallet); if ($res == false) throw new Exception(UserWalletService::getStaticError()); $trans->commit(); return $this->success('操作成功'); } catch (\Exception $e) { $trans->rollBack(); return $this->error($e->getMessage()); } } } }