| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- <?php
- namespace addons\Recommen\common\logic;
- use addons\Coupon\common\enums\AddonsCouponEnum;
- use addons\Coupon\common\models\AddonsCouponUserRelate;
- use addons\Recommen\common\enums\RecommenEnum;
- use addons\Recommen\common\models\Recommen;
- use addons\Recommen\common\models\RecommenLog;
- use addons\Recommen\common\models\RecommenReward;
- use common\enums\AddonsEnum;
- use common\enums\OrderStatusEnum;
- use common\enums\StatusEnum;
- use common\enums\UserWalletEnum;
- use common\helpers\FormatHelper;
- use common\models\mall\MallAddons;
- use common\models\order\Order;
- use common\models\statistics\UserStatisticsTotal;
- use common\models\user\User;
- use services\common\UserWalletService;
- use Yii;
- use yii\helpers\Json;
- class RewardLogic
- {
- /**
- * @param array $params
- * @param int $type
- * @return bool
- */
- public static function execute(array $params, int $type)
- {
- Yii::$app->db->close();
- $trans = Yii::$app->db->beginTransaction();
- try {
- $user = User::find()->select('id,mall_id,parent_id')->where(['id' => $params['user_id']])->one();
- if (empty($user)) throw new \Exception('用户查询失败');
- $mall_id = $user['mall_id'];
- $user_id = $user['id'];
- $parent_id = $user['parent_id'];
- // 没有推荐人的情况下不做处理
- if (empty($parent_id)) {
- return true;
- }
- //查询现在正在进行的活动
- $time = time();
- $where[] = ['<', 'start_time', $time];
- $where[] = ['>', 'end_time', $time];
- $where[] = ['=', 'status', StatusEnum::ENABLED];
- $where[] = ['=', 'mall_id', $mall_id];
- $where[] = ['=', 'settle_type', $type];
- $order = 'id desc';
- $params = array('where' => $where, 'order'=>$order);
- $list = Recommen::lists($params);
- $parent_child_user_ids = User::find()
- ->where(['parent_id' => $parent_id])
- ->andWhere(['status' => StatusEnum::ENABLED])
- ->select('id')->column();
- $parent_child_pay_amounts = [];
- foreach ($parent_child_user_ids as $child_user_id) {
- $amount = Order::find()->where(['user_id' => $child_user_id])
- ->andWhere(['order_status' => OrderStatusEnum::ACCOMPLISH])
- ->sum('pay_money');
- $parent_child_pay_amounts[$child_user_id] = bcmul(empty($amount) ? 0 : $amount, 100);
- }
- if($list){
- foreach($list as $k=>$v){ //遍历活动
- $add['mall_id'] = $mall_id;
- $add['user_id'] = $user_id;
- $add['parent_id'] = $parent_id;
- $add['active_id'] = $v['id'];
- $addrecommen = RecommenLog::setData($add, $type, $v['settle_type'] == $type);
- // 如果存在了那肯定不能再领取了 || 如果类型不一致,那么也不能获得奖励 - 如果一个人连续下两单,那么就会被拒绝奖励
- if (!$addrecommen) continue;
- $is_be_status = true;
- if (is_array($addrecommen) && !empty($addrecommen[0]) && $addrecommen[0] instanceof RecommenLog) {
- $addrecommen = $addrecommen[0];
- $is_be_status = false;
- }
- //达到添加则赠送奖励
- $recommen_reward = Json::decode($v['recommen_reward']);
- // $recommen_reward = array_reverse($recommen_reward);
- //阶梯奖励
- $arrive_nums = array_column($recommen_reward,'arrive_num');
- $consumption_amounts = array_column($recommen_reward,'consumption_amount');
- // var_dump('$consumption_amounts ->', $arrive_nums, $consumption_amounts );
- if($arrive_nums){
- // 已经领取奖励次数
- $reward_list = RecommenReward::find()->where(['mall_id' => $mall_id])
- ->andWhere(['user_id' => $parent_id, 'be_reward' => 2])->andWhere(['active_id' => $v['id']])
- ->andWhere(['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])->select('id, index, active_id')->indexBy('index')->asArray()->all();
- $reward_total = count($reward_list);
- //推荐者奖励
- $index = null;
- foreach($arrive_nums as $key => $value){
- //如果阶梯奖励已领取奖励,则跳过此条规则
- if (!empty($reward_list[$key]) && $v['type'] == 2 ) {
- echo "{$v['id']} 1 \n";
- continue;
- }
- // 判断数量是否已经达标? 推荐数量/单次推荐多少人可以领奖
- $can_reward_num = floor(count($parent_child_user_ids) / $value);
- // $v['type'] == 1 每推荐1人 每人消费满 N 元进行奖励 - 条件奖励
- // $v['type'] == 2 推荐N人 每人消费满 N 元进行奖励 - 找到最大的一个值 - 满足第一个 -> 满足第二个 -> 满足第三个 - 阶梯奖励
- //检查是否符合当前规则推荐人数
- if ($can_reward_num < 1) {
- echo "{$v['id']} 1 \n";
- continue;
- }
- if ($v['type'] == 1 && $can_reward_num <= $reward_total) {
- echo "{$v['id']} 1 \n";
- continue;
- }
- $consumption_amount = $consumption_amounts[$key] ?? 0; // 默认是0元,也就是说默认没有消费门槛
- // 判断消费是否满足
- if ($consumption_amount > 0 && $v['settle_type'] == RecommenEnum::RECOMMEND_TYPE_ORDER_FINISH) {
- $tmp_parent_child_pay_amounts = array_values(array_filter($parent_child_pay_amounts, function ($val) use ($consumption_amount) {
- return $val >= bcmul($consumption_amount, 100);
- }));
- // 如果支付人数达不到要求,那么就不做奖励
- $order_cnt = count($tmp_parent_child_pay_amounts);
- if (empty($order_cnt) || $order_cnt%$value != 0) {
- continue;
- }
- // 每推荐1人 每人消费满 N 元进行奖励 - 条件奖励
- if (floor($order_cnt / $value) <= $reward_total && $v['type'] == 1) {
- continue;
- }
- // 推荐N人 每人消费满 N 元进行奖励 - 找到最大的一个值 - 满足第一个 -> 满足第二个 -> 满足第三个 - 阶梯奖励
- if ($v['type'] == 2) {
- $index_cnt = RecommenReward::find()->where(['user_id' => $parent_id, 'be_reward' => 2])
- ->andWhere(['active_id' => $v['id']])->andWhere(['index' => $key])->count();
- if ($index_cnt > 0 && floor($order_cnt / $value) <= $index_cnt) {
- continue;
- }
- }
- }
- $index = $key;
- }
- if ($index !== null) self::reward($v, $mall_id, $add, $recommen_reward, $parent_id, $index, $v['type']);
- }
- //被推荐者奖励
- $be_recommen_reward = json_decode($v['be_recommen_reward'],true);
- if($v['be_status'] == 2 && $is_be_status){
- $reward_data = [];
- $reward_data['active_id'] = $v['id'];
- $reward_data['mall_id'] = $mall_id;
- $reward_data['user_id'] = $user_id;
- $reward_data['is_frozen'] = false;
- $reward_data['be_reward'] = 1;
- $balance = 0;
- $sorce = 0;
- $reward_list = RecommenReward::find()->where(['mall_id' => $mall_id])
- ->andWhere(['user_id' => $user_id, 'be_reward' => 1])->andWhere(['active_id' => $v['id']])
- ->andWhere(['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])->select('id, index, active_id')->one();
- if (!empty($reward_list)) continue;
- //var_dump($v['id'],$be_recommen_reward);die;
- if($be_recommen_reward){//推荐者奖励
- foreach($be_recommen_reward as $kp => $vp){ //奖励的上一层
- foreach($vp['data'] as $k_reward => $v_reward){
- $reward_data['num'] = $v_reward['data'];
- switch ($v_reward['type']) {
- case RecommenEnum::REWARD_BALANCE:// 奖励余额
- $balance += $v_reward['data'];
- $res_reward = self::rewardBalance($reward_data);
- break;
- case RecommenEnum::REWARD_SCORE:// 奖励积分
- $sorce += $v_reward['data'];
- $res_reward = self::rewardScore($reward_data);
- break;
- case RecommenEnum::REWARD_COUPON:// 奖励优惠券
- $coupon_data['data'] = $v_reward['data'];
- //var_dump($v_reward['data'],$v['id'],999);
- $coupon_data['mall_id'] = $mall_id;
- $coupon_data['user_id'] = $user_id;
- $res_data = self::rewardCoupon($coupon_data);
- if($res_data){
- $reward_data['reward'][]= $res_data;
- }
- break;
- }
- }
- }
- if($balance>0) $reward_data['reward'][] = "奖励余额".$balance."元";
- if($sorce>0) $reward_data['reward'][] = "奖励积分".$sorce;
- //发放奖励
- $reward = RecommenReward::setData($reward_data);
- }
- }
- }
- }
- $trans->commit();
- } catch (\Exception $e) {
- $trans->rollBack();
- $exception = FormatHelper::exception($e, "用户注册异步事件");
- echo $exception;
- Yii::error($exception);
- return false;
- }
- return true;
- }
- protected static function reward($v, $mall_id, $add, $recommen_reward, $parent_id, $index, $type)
- {
- $reward_data = [];
- $reward_data['active_id'] = $v['id'];
- $reward_data['mall_id'] = $mall_id;
- $reward_data['user_id'] = $add['parent_id'];
- $reward_data['be_reward'] = 2;
- $reward_data['index'] = $index;
- if($recommen_reward){//推荐者奖励
- $reward_data['reward'] = [];
- $balance = 0;
- $sorce = 0;
- foreach($recommen_reward as $kp => $vp){ //奖励的上一层
- if ($type == 2 && $index != $kp) continue;
- foreach($vp['data'] as $k_reward => $v_reward){
- $reward_data['num'] = $v_reward['data'];
- switch ($v_reward['type']) {
- case RecommenEnum::REWARD_BALANCE:// 奖励余额
- $balance += $v_reward['data'];
- self::rewardBalance($reward_data);
- break;
- case RecommenEnum::REWARD_SCORE:// 奖励积分
- $sorce += $v_reward['data'];
- self::rewardScore($reward_data);
- break;
- case RecommenEnum::REWARD_COUPON:// 奖励优惠券
- $coupon_data['data'] = $v_reward['data'];
- //var_dump($v_reward['data'],$v['id'],88);
- $coupon_data['mall_id'] = $mall_id;
- $coupon_data['user_id'] = $parent_id;
- $res_data = self::rewardCoupon($coupon_data);
- if($res_data){
- $reward_data['reward'][]= $res_data;
- }
- break;
- }
- }
- }
- if($balance>0) $reward_data['reward'][] = "奖励余额".$balance."元";
- if($sorce>0) $reward_data['reward'][] = "奖励积分".$sorce;
- //发放奖励
- $reward = RecommenReward::setData($reward_data);
- }
- }
- /**
- * 奖励余额
- * @Author: ltm
- * @DateTime: 2022/5/17 19:03
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $data
- * @throws \Exception
- */
- protected static function rewardBalance($data){
- //转到用户账号
- $insert_wallet [] = ['mall_id' => $data['mall_id'], 'user_id' => $data['user_id'],
- 'is_frozen' => false,
- 'wallet_type' => UserWalletService::WALLET_TYPE_BALANCE,
- 'money' => $data['num'],
- 'desc' => "推荐有礼奖励",
- 'source_table' => RecommenReward::tableName(),
- 'source_table_id' => $data['user_id'],
- 'from_type' => UserWalletEnum::REWARD,
- 'capital_type' => UserWalletEnum::RECOMMEND,
- ];
- $res = UserWalletService::batchHandleByQueue($insert_wallet);
- }
- /**
- * 奖励积分
- * @Author: ltm
- * @DateTime: 2022/5/17 19:03
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $data
- * @throws \Exception
- */
- protected static function rewardScore($data){
- //转到用户账号
- $insert_wallet [] = ['mall_id' => $data['mall_id'], 'user_id' => $data['user_id'],
- 'is_frozen' => false,
- 'wallet_type' => UserWalletService::WALLET_TYPE_SCORE,
- 'money' => $data['num'],
- 'desc' => "推荐有礼奖励",
- 'source_table' => RecommenReward::tableName(),
- 'source_table_id' => $data['user_id'],
- 'from_type' => UserWalletEnum::REWARD,
- 'capital_type' => UserWalletEnum::RECOMMEND,
- ];
- //var_dump($insert_wallet);die;
- $res = UserWalletService::batchHandleByQueue($insert_wallet);
- }
- /**
- * 奖励积分
- * @Author: ltm
- * @DateTime: 2022/5/17 19:03
- * @Copyright: copyright (c) 2021 广东七件事集团
- * @param $data
- * @return string
- */
- protected static function rewardCoupon($data){
- $is_install = MallAddons::isInstall($data['mall_id'], AddonsEnum::ADDONS_NAME_COUPON);
- $reward_text = '';
- if($is_install){
- // 赠送优惠券
- if($data['data']){
- $give_coupon_arr = [];
- foreach ($data['data'] as $coupon) {
- $give_coupon_arr[$coupon['relevant_id']] = $coupon['num'];
- }
- $coupon_arr = AddonsCouponUserRelate::giveCoupon($data['mall_id'], $data['user_id'], $give_coupon_arr, AddonsCouponEnum::SEND_FROM15);
- if ($coupon_arr) {
- $coupon_text = [];
- foreach ($coupon_arr as $info) {
- $coupon_text[] = $info['name'].$info['num'].'张';
- }
- $reward_text.= "优惠券:[" . implode(',', $coupon_text) .']';
- }
- }
- }
- return $reward_text;
- }
- }
|