| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510 |
- <?php
- namespace addons\Redpack\api\modules\v1\controllers;
- use addons\Redpack\common\enums\RedpackEnum;
- use addons\Redpack\common\helper\RedpackHelper;
- use addons\Redpack\common\models\Redpack;
- use addons\Redpack\common\models\RedpackTask;
- use addons\Redpack\common\models\RedpackWallet;
- use addons\Sudoku\common\enums\SudokuEnum;
- use common\enums\AddonsEnum;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\models\common\PlatformSetting;
- use common\models\user\UserPartitionRelationship;
- use services\common\UserWalletService;
- use Yii;
- use api\controllers\OnAuthController;
- use yii\db\Exception;
- use yii\helpers\Json;
- /**
- * 红包控制器
- *
- * Class DefaultController
- * @package addons\Redpack\api\controllers
- */
- class TransactionController extends OnAuthController
- {
- public $modelClass = '';
- /**
- * 不用进行登录验证的方法
- *
- * 例如: ['index', 'update', 'create', 'view', 'delete']
- * 默认全部需要验证
- *
- * @var array
- */
- protected $authOptional = ['index'];
- /**
- * 转送给好友
- * @Author: ltm
- * @DateTime: 2022/3/23 0023 9:20
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $data
- * @return string
- */
- public function actionTransfer()
- {
- if (Yii::$app->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());
- }
- }
- }
- }
|