getKlRuleId($channel_id); if(empty($ruleId)){ return $result; } $result = $this->getRuleConfig($ruleId); return $result; } /** * 找出渠道匹配的KL规则ID,按权重倒序排列,取一条 * @param $channel_id * @return string */ public function getKlRuleId($channel_id) { $cacheKey = CacheConstants::getChannelKlRuleManageCacheList(); if ($id = Redis::instance()->hGet($cacheKey, $channel_id)) { $id = $id > 0 ? $id : 0; } else { $id = $this->getRuleManageModel() ->where('status', 'eq', '1') ->where( function (Query $query) use ($channel_id) { $query->where('channel_ids', '*') ->whereOr("FIND_IN_SET($channel_id, channel_ids)"); } ) ->order('weight', 'desc') ->value('id'); if (!$id) { $id = -1; } Redis::instance()->hSet($cacheKey, $channel_id, $id); } return $id; } /** * 清除缓存 */ public function delKlRuleManageCache() { $cacheListKey = CacheConstants::getChannelKlRuleManageCacheList(); Redis::instance()->del($cacheListKey); } /** * 拉取改规则的扣量设置 * @param $rule_id * @return array */ public function getRuleConfig($rule_id) { $redisKey = KlConstants::REDIS_KEY_PREFIX.$rule_id; if (Redis::instance()->exists($redisKey)) { $result = json_decode(Redis::instance()->get($redisKey), true); } else { //拉取数据 $rule = $this->getRuleConfigModel()->where("rule_id", "EQ", $rule_id)->find(); //筛选器 $result[KlConstants::KL_SELECTOR] = []; if ($rule['s_new_user_status'] == '1') { $result[KlConstants::KL_SELECTOR][KlConstants::KL_SELECTOR_NEW_USER] = []; if ( $rule['s_new_user_city_status'] == '1' && $rule['s_new_user_city'] ) { $result[KlConstants::KL_SELECTOR][KlConstants::KL_SELECTOR_NEW_USER][KlConstants::KL_SELECTOR_NEW_CITY] = $rule['s_new_user_city']; } if ($rule['s_new_user_add_status'] == '1') { $result[KlConstants::KL_SELECTOR][KlConstants::KL_SELECTOR_NEW_USER][KlConstants::KL_SELECTOR_NEW_ADD] = $this->parseData($rule['s_new_user_add_op'], $rule['s_new_user_add']); } if ($rule['s_new_user_recharge_status'] == '1') { $result[KlConstants::KL_SELECTOR][KlConstants::KL_SELECTOR_NEW_USER][KlConstants::KL_SELECTOR_NEW_RECHARGE] = $this->parseData($rule['s_new_user_recharge_op'], $rule['s_new_recharge_add']); } $result[KlConstants::KL_SELECTOR][KlConstants::KL_SELECTOR_NEW_USER][KlConstants::KL_SELECTOR_NEW_RELATION] = $this->transferRelation($rule['s_new_relation']); } if ($rule['s_old_user_status'] == '1') { $result[KlConstants::KL_SELECTOR][KlConstants::KL_SELECTOR_OLD_USER] = []; if ( $rule['s_old_user_city_status'] == '1' && $rule['s_old_user_city'] ) { $result[KlConstants::KL_SELECTOR][KlConstants::KL_SELECTOR_OLD_USER][KlConstants::KL_SELECTOR_OLD_CITY] = $rule['s_old_user_city']; } if ($rule['s_old_user_active_status'] == '1') { $result[KlConstants::KL_SELECTOR][KlConstants::KL_SELECTOR_OLD_USER][KlConstants::KL_SELECTOR_OLD_ACTIVE] = $this->parseData($rule['s_old_user_active_op'], $rule['s_old_active']); } if ($rule['s_old_user_recharge_status'] == '1') { $result[KlConstants::KL_SELECTOR][KlConstants::KL_SELECTOR_OLD_USER][KlConstants::KL_SELECTOR_OLD_RECHARGE] = $this->parseData($rule['s_old_user_recharge_op'], $rule['s_old_recharge_add']); } $result[KlConstants::KL_SELECTOR][KlConstants::KL_SELECTOR_OLD_USER][KlConstants::KL_SELECTOR_OLD_RELATION] = $this->transferRelation($rule['s_old_relation']); } //过滤器 $result[KlConstants::KL_FILTER] = []; if ($rule['f_behavior_status'] == '1') { $result[KlConstants::KL_FILTER][KlConstants::KL_FILTER_BEHAVOR] = []; if ($rule['f_one_recharge_status'] == '1') { $result[KlConstants::KL_FILTER][KlConstants::KL_FILTER_BEHAVOR][KlConstants::KL_FILTER_BEHAVOR_SPACE] = $rule['f_one_recharge']; } if ($rule['f_recharge_status'] == '1' && $rule['f_recharge']) { $result[KlConstants::KL_FILTER][KlConstants::KL_FILTER_BEHAVOR][KlConstants::KL_FILTER_BEHAVOR_RECHARGE] = $rule['f_recharge']; } if ($rule['f_read_status'] == '1') { $result[KlConstants::KL_FILTER][KlConstants::KL_FILTER_BEHAVOR][KlConstants::KL_FILTER_BEHAVOR_READ] = $this->parseData($rule['f_read_op'], $rule['f_read']); } if ($rule['f_kandian_status'] == '1') { $result[KlConstants::KL_FILTER][KlConstants::KL_FILTER_BEHAVOR][KlConstants::KL_FILTER_BEHAVOR_KANDIAN] = $this->parseData($rule['f_kandian_op'], $rule['f_kandian']); } if ($rule['f_orders_status'] == '1') { $result[KlConstants::KL_FILTER][KlConstants::KL_FILTER_BEHAVOR][KlConstants::KL_FILTER_BEHAVOR_ORDERS] = $this->parseData($rule['f_orders_op'], $rule['f_orders']); } $result[KlConstants::KL_FILTER][KlConstants::KL_FILTER_BEHAVOR][KlConstants::KL_FILTER_BEHAVOR_RELATION] = $this->transferRelation($rule['f_behavior_relation']); } if ($rule['f_register_status'] == '1') { $result[KlConstants::KL_FILTER][KlConstants::KL_FILTER_REGISTER] = []; $result[KlConstants::KL_FILTER][KlConstants::KL_FILTER_REGISTER][KlConstants::KL_FILTER_REGISTER_SPACE] = $this->parseData($rule['f_register_op'], $rule['f_register']); $result[KlConstants::KL_FILTER][KlConstants::KL_FILTER_REGISTER][KlConstants::KL_FILTER_REGISTER_RELATION] = $this->transferRelation($rule['f_register_relation']); } //扣量规则 $result[KlConstants::KL_DEDUCT] = []; if ($rule['o_general_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_NORMAL] = []; if ($rule['o_general_new_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_NORMAL][KlConstants::KL_DEDUCT_NORMAL_NEW] = $rule['o_general_new']; } if ($rule['o_general_old_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_NORMAL][KlConstants::KL_DEDUCT_NORMAL_OLD] = $rule['o_general_old']; } if ($rule['o_general_many_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_NORMAL][KlConstants::KL_DEDUCT_NORMAL_MANY] = $rule['o_general_many']; } } if ($rule['o_vip_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_VIP] = []; if ($rule['o_vip_new_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_VIP][KlConstants::KL_DEDUCT_VIP_NEW] = $rule['o_vip_new']; } if ($rule['o_vip_old_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_VIP][KlConstants::KL_DEDUCT_VIP_OLD] = $rule['o_vip_old']; } if ($rule['o_vip_many_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_VIP][KlConstants::KL_DEDUCT_VIP_MANY] = $rule['o_vip_many']; } } if ($rule['o_activity_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_ACTIVITY] = []; if ($rule['o_activity_new_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_ACTIVITY][KlConstants::KL_DEDUCT_ACTIVITY_NEW] = $rule['o_activity_new']; } if ($rule['o_activity_old_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_ACTIVITY][KlConstants::KL_DEDUCT_ACTIVITY_OLD] = $rule['o_activity_old']; } if ($rule['o_activity_many_status'] == '1') { $result[KlConstants::KL_DEDUCT][KlConstants::KL_DEDUCT_ACTIVITY][KlConstants::KL_DEDUCT_ACTIVITY_MANY] = $rule['o_activity_many']; } } Redis::instance()->set($redisKey, json_encode($result)); /*$result = [ 'KLS' => [ 'X' => [ 'C' => '1,2,3', 'N' => '>0', 'R' => '>0', 'RE' => 'and', ], 'L' => [ 'C' => '1,2,3', 'N' => '<10', 'R' => '<10', 'RE' => 'or', ], ], 'KLG' => [ 'Y' => [ 'D' => 10, 'C' => 'H,Z', 'Y' => '>1', 'S' => '>100', 'O' => '>10', 'RE' => 'and', ], 'Z' => [ 'T' => '>1', 'RE' => 'and', ], ], 'KLD' => [ 'P' => [ 'X' => 30, 'L' => 30, 'M' => 30, ], 'V' => [ 'X' => 20, 'L' => 20, 'M' => 20, ], 'H' => [ 'X' => 10, 'L' => 10, 'M' => 10, ] ], ];*/ } return $result; } private function parseData($op, $val) { $relation = [ '0' => '>', '1' => '<', '2' => '=', ]; $opStr = $relation[$op] ?? '='; return $opStr.$val; } private function transferRelation($relation) { return $relation == 0 ? 'and' : 'or'; } }