## 主体流程

- 解析请求数据
- 检查设备信息，忽略特定uid的广告请求
- 检查敏感词，忽略存在敏感词的请求
- 同时执行任务：
    - 获取 dsp 广告
    - 获取 rta 推荐
    - 预测 转化率
- 广告筛选：
    - 对广告位排序
    - 按新的广告位顺序进行 广告匹配
- 对 smartswitch 做特殊处理
- 广告预测callback
- 缓存设备id信息
- dsp win loss 通知
- 匹配日志落盘
- 生成返回内容
- 返回广告给媒体

## 广告筛选

### 广告匹配-三方预测时

- 广告定向-三方预测时
- 投放 游戏类
- 投放 关联关键词的活动
- 投放 定向筛选

### 广告匹配-鹏泰预测时

- 广告定向-鹏泰预测时
- 投放 游戏类
- 投放 showType为15时，(appname 或 pkg)==keyword
- 投放 关联关键词的活动
- 投放 定向筛选-关键字完全匹配的活动
- 投放 定向筛选-关键字模糊匹配的活动
- 投放 定向筛选-剩余活动

### 定向筛选-鹏泰预测时
- 时段
- 地域
- 广告位
- 否定词
- 根据关键词进行分组
 - 关键词 精确匹配
 - 关键词 模糊匹配
 - 剩余活动

### 定向筛选-三方预测时
- 时段
- 地域
- 广告位
- 否定词
- show type 7 和 8，都要求关键词完全匹配

### 投放
- 对showtype 1和2 的广告位，最大投放数做特殊设置
- 计算活动价格
- 计算活动的 ecpm （注意：实际上是单次而不是千次，因为使用 下载价格 x 转化率）
- 筛选活动
 - 随机排序 资源级别(100)
 - 按 ecpm 排序 资源级别(5)
 - 按 ecpm 排序 资源级别(4)
 - 按 ecpm 排序 资源级别(3)
 - 按 ecpm 排序 资源级别(2)
 - 按 ecpm 排序 资源级别(1)
 - 随机排序 资源级别(-1)
 - 排序后，需要做 详细筛选

### 计算活动价格
- 按活动配置和关键词设置价格
 - 保底：用广告位资源级别价格，无资源级别价格时，用活动本身价格。
 - show type 1 和 2
  - 活动未设置售卖词价格，按广告位资源级别价格。成功则退出
  - 请求没有关键字时，随机选一个活动的售卖词价格。成功则退出
  - 请求里的关键词，和活动的售卖词匹配时，选一个匹配到的最大价格。成功则退出
  - 请求里的关键词，模糊匹配到活动售卖词时，用那个模糊匹配大关键词价格。成功则退出
  - 用广告位资源级别价格。成功则退出
  - 随机选一个活动的售卖词价格。成功则退出
 - show type 7 和 8
  - 活动未设置品牌词价格，按广告位资源级别价格。成功则退出
  - 请求没有关键字时，随机选一个活动的品牌词价格。成功则退出
  - 请求里的关键词，和活动的售卖词匹配时，选一个匹配到的最大价格。成功则退出
  - 用广告位资源级别价格。成功则退出
 - show type 其他
  - 用广告位资源级别价格。成功则退出
- 按 LLM 来优化出价
- DSP 的 CPM 类广告价格转化为 CPD

### 计算 ecpm (排序用)
- 走鹏泰预测时
 - 获取鹏泰ctr
  - 以共享内存里的数据作为保底
  - 优先使用redis里的数据
 - 关键词优化(优化ctr)
  - 加载redis里的关键字对应的appid
  - 若广告appid存在于上面的列表中，则 ctr 增加 1
 - 计算 ecpm ( ctr x cpd价格)
 - 额外的 ecpm 提升(一般 乘以 5)
 - llm 配置的 ecpm 提升 
- 走三方预测时
 - 获取三方预测ctr
 - 计算 ecpm
 - 额外的 ecpm 提升(一般 乘以 5)
 - llm 配置的 ecpm 提升
 - 对351做优化
  - appname匹配搜索关键词时，ecpm x 100

### 随机排序
- 逻辑较简单，不列出

### 按 ecpm 排序
- CPT 类广告为摇骰子，ecpm 大的活动，更容易被选中。
- CPD 类广告为绝对排序，ecpm 大的一定排前面。
- 同一个应用，我们的活动最优，其次 cpa 活动
 - cpa 有时会根据配置，一定几率让 dsp 活动先投。

### 详细筛选
- 匀速消耗
- LLM 活动匹配
- OCPD 检查
- 价格优化
- OAID 长度判断，某些广告对 OAID 有要求
- UID 为 NoUserAgreement时的相关判定
- showtype 14时，关键词和包名，应用名匹配才投放
- 创意类型匹配
- 避免本次重复推送
- 行业分类
- dsp 本次最大投放检查
- dsp 价格优化
- 下载次数限制
- rta 检查
- 已安装 app 检查
- 已安装 app 检查: 星钻 
- 关键词黑名单
- 关键词白名单
- 操作系统位数

## 转化率预测
- 鹏泰预测
 - 比较简单，从redis加载数据即可
- 三方预测
 - 构造请求数据，http post 请求预测接口
  - 注意，不同合作者，接口数据可能有细微差别，这里不具体给出。
 - 获取返回并解析数据
 - 若上述步骤失败，则使用鹏泰预测数据

### ocpd 预测
- 只有走zzy预测时，才会做ocpd预测

## dsp
- 判断当前请求是否满足请求dsp的要求。
- 计算底价
- 摇骰子确定是否请求dsp
- 构造请求数据，发送 http 请求，获取返回
- 解析返回数据，得到广告数组，初步判断是否投放
 - 当dsp返回的广告不在我们库中时，需要登记
 - 按价格排序，同名广告，选价高的
- 待广告筛选完成后
 - 价格加密
 - 缓存投放广告的tracking url
 - 发送 win loss 通知
 - 记录匹配日志
- 记录 dsp 广告返回计数，用于统计和监控

## smartswitch 做特殊处理
- 按包名去重
- 将前5个广告的category设为'0'
- 按分类分组广告
- 根据请求里指定的分类，选广告
 - 分类的广告数不满5个时，该分类会被过滤
- 当分类数不足4个时，将未被选中的且满5个的分类，进行补充
 - 关于 4个分类: '0' 分类必推，所以 '0' 分类 + 另外3个分类。

## 辅助流程

- 更新广告素材
- 记录程序日志