ReportKlService.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <?php
  2. /**
  3. * Created by: PhpStorm
  4. * User: lytian
  5. * Date: 2020/3/17
  6. * Time: 10:38
  7. */
  8. namespace app\main\service;
  9. use app\admin\model\Postbackklreferral;
  10. use app\common\library\Redis;
  11. use app\common\model\Postbackrules;
  12. use app\main\constants\PostbackConstants;
  13. use app\main\model\object\ReturnObject;
  14. use think\Config;
  15. use think\db\Query;
  16. class ReportKlService extends BaseService
  17. {
  18. /**
  19. * 定义属性
  20. *
  21. * @var ReportKlService
  22. */
  23. protected static $self = null;
  24. /**
  25. * 返回实例
  26. *
  27. * @return ReportKlService
  28. */
  29. public static function instance()
  30. {
  31. if (self::$self == null) {
  32. self::$self = new self();
  33. }
  34. return self::$self;
  35. }
  36. /**
  37. * 获取配置
  38. * @param $rule_id
  39. * @param $type
  40. * @param $field
  41. * @return ReturnObject
  42. */
  43. public function getValue($rule_id, $type, $field = 'money')
  44. {
  45. $where = [
  46. 'id' => $rule_id,
  47. 'state' => PostbackConstants::STATE_SHOW
  48. ];
  49. $mPostRule = new PostbackRules();
  50. $data = $mPostRule->where($where)->find();
  51. if ($data) {
  52. if ($field == 'money') {
  53. $return = Config::get('site.' . $type . '_report_money');
  54. } else {
  55. $config = Config::get('site.' . $type . '_report_kl');
  56. if ($config) {
  57. $config = json_decode($config, true);
  58. $return = $config[$field] ?? '-1';
  59. }
  60. }
  61. if ($data[$field] != -1) {
  62. $return = $data[$field];
  63. }
  64. } else {
  65. $return = '-1';
  66. }
  67. return $this->setData($return)->getReturn();
  68. }
  69. /**
  70. * 渠道获取规则id
  71. * @param $channel_id
  72. * @param $type
  73. * @return ReturnObject
  74. */
  75. public function getKlRuleId($channel_id, $type = PostbackConstants::TYPE_TOUTIAO)
  76. {
  77. $mPostBackRule = new PostbackRules();
  78. $data = $mPostBackRule->where(function (Query $query) use ($channel_id) {
  79. $query->where('find_in_set(' . $channel_id . ', channel_ids)')
  80. ->whereOr('channel_ids', '*');
  81. })
  82. ->where('type', $type)
  83. ->where('state', PostbackConstants::STATE_SHOW)
  84. ->order('weight', 'desc')
  85. ->value('id');
  86. return $this->setData($data)->getReturn();
  87. }
  88. /**
  89. * 获取KL配置
  90. * @param $channel_id
  91. * @param string $type
  92. * @param string $referral_id
  93. * @return ReturnObject
  94. */
  95. public function getKlConfig($channel_id, $type = PostbackConstants::TYPE_TOUTIAO, $referral_id = '')
  96. {
  97. $ruleId = $this->getKlRuleId($channel_id, $type)->data;
  98. if ($ruleId) {
  99. $config = [
  100. 'type' => $type,
  101. 'money' => $this->getValue($ruleId, $type, 'money')->data,
  102. 'man_val' => $this->getValue($ruleId, $type, 'man_val')->data,
  103. 'kou_val' => $this->getValue($ruleId, $type, 'kou_val')->data,
  104. 'is_referral' => 0,
  105. ];
  106. if ($referral_id) {
  107. $where = [
  108. 'rule_id' => $ruleId,
  109. 'type' => $type,
  110. 'referral_id' => $referral_id,
  111. 'state' => 'show'
  112. ];
  113. $mPostReferral = new Postbackklreferral();
  114. $referral = $mPostReferral->where($where)->find();
  115. if ($referral) {
  116. if ($referral['money'] != '-1') {
  117. $config['money'] = $referral['money'];
  118. }
  119. if ($referral['man_val'] != '-1') {
  120. $config['man_val'] = $referral['man_val'];
  121. }
  122. if ($referral['kou_val'] != '-1') {
  123. $config['kou_val'] = $referral['kou_val'];
  124. }
  125. $config['is_referral'] = 1;
  126. }
  127. }
  128. } else {
  129. $config = [
  130. 'type' => $type,
  131. 'money' => '-1',
  132. 'man_val' => '-1',
  133. 'kou_val' => '-1',
  134. 'is_referral' => 0
  135. ];
  136. }
  137. return $this->setData($config)->getReturn();
  138. }
  139. /**
  140. * 检测是否非KL
  141. * @param $money
  142. * @param $kl
  143. * @param $order_money
  144. * @return ReturnObject
  145. */
  146. public function checkNotKl($channel_id, $klConfig, $referral_id, $order_money)
  147. {
  148. $money = $klConfig['money'];
  149. $man_val = $klConfig['man_val'];
  150. $kou_val = $klConfig['kou_val'];
  151. if ($money == '-1' || $man_val == '-1' || $kou_val == '-1') {
  152. LogService::info('klresult:!k');
  153. return $this->setData(true)->getReturn();
  154. }
  155. $isKou = true;
  156. if ($order_money >= $money) {
  157. //判断订单笔数
  158. if ($klConfig['is_referral']) {
  159. LogService::info('klinfo:referral:' . $referral_id . "符合推广链接条件");
  160. } else {
  161. LogService::info('klinfo:referral:' . $referral_id . "不符合推广链接条件");
  162. $referral_id = 0;
  163. }
  164. $isKou = $this->setOrderCount($channel_id, $referral_id, $man_val, $kou_val, $klConfig['type']);
  165. if ($isKou) {
  166. LogService::info('klresult:k');
  167. } else {
  168. LogService::info('klresult:!k');
  169. }
  170. } else {
  171. LogService::info('klinfo:money:' . $order_money . '<' . $money);
  172. LogService::info('klresult:k');
  173. }
  174. return $this->setData(!$isKou)->getReturn();
  175. }
  176. /**
  177. * 订单计数
  178. * @param $channel_id
  179. * @param $referral_id
  180. * @param $man_val
  181. * @param $kou_val
  182. * @return bool
  183. */
  184. public function setOrderCount($channel_id, $referral_id, $man_val, $kou_val, $type)
  185. {
  186. $kouState = false;
  187. $key = 'REPORTKLIF:' . $channel_id . ':' .$type . ':' . $referral_id;
  188. $data = Redis::instance()->hGetAll($key);
  189. if ($data) {
  190. if ($data['man_val'] >= $man_val) {
  191. if ($data['kou_val'] < $kou_val) {
  192. $data['kou_val'] = $data['kou_val'] + 1;
  193. $kouState = true;
  194. LogService::info('klinfo:orders:当前扣到第' . $data['kou_val'] . '笔 配置扣' . $kou_val . "笔 符合订单数条件");
  195. } else {
  196. //重置
  197. $data = [
  198. 'man_val' => 1,
  199. 'kou_val' => 0,
  200. ];
  201. LogService::info('klinfo:orders:当前第' . $data['man_val'] . '笔 配置满' . $man_val . "笔 不符合订单数条件");
  202. }
  203. } else {
  204. $data['man_val'] = $data['man_val'] + 1;
  205. LogService::info('klinfo:orders: 当前第' . $data['man_val'] . '笔 配置满' . $man_val . "笔 不符合订单数条件");
  206. }
  207. } else {
  208. //计数从1开始
  209. $data = [
  210. 'man_val' => 1,
  211. 'kou_val' => 0,
  212. ];
  213. LogService::info('klinfo:orders: 当前第' . $data['man_val'] . '笔 配置满' . $man_val . "笔 不符合订单数条件");
  214. }
  215. Redis::instance()->hMSet($key, $data);
  216. Redis::instance()->expire($key, 86400*7);
  217. return $kouState;
  218. }
  219. }