AdminKlUpdateService.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: Bear
  5. * Date: 2019/9/11
  6. * Time: 下午3:51
  7. */
  8. namespace app\main\service;
  9. use app\api\library\OrderDeduction;
  10. use app\common\library\Ip;
  11. use app\common\library\Redis;
  12. use app\common\utility\WhiteList;
  13. use app\main\constants\CacheConstants;
  14. use app\main\constants\KlConstants;
  15. use app\main\constants\PayConstants;
  16. use app\main\constants\UserConstants;
  17. use app\main\model\object\OrderObject;
  18. use app\main\model\object\UserObject;
  19. use think\Config;
  20. /**
  21. * Class AdminKlUpdateService
  22. * @package app\main\service
  23. */
  24. class AdminKlUpdateService extends BaseService
  25. {
  26. const KL_YES = true;
  27. const KL_NO = false;
  28. const OP_AND = 'and';
  29. const OP_OR = 'or';
  30. const OP_BIGGER = '>';
  31. const OP_LESS = '<';
  32. /**
  33. * @var AdminKlUpdateService
  34. */
  35. private static $self;
  36. /**
  37. * @var OrderObject
  38. */
  39. private $order;
  40. /**
  41. * @var UserObject
  42. */
  43. private $user;
  44. /**
  45. * @return $this|AdminKlUpdateService
  46. */
  47. public static function instance()
  48. {
  49. if (!self::$self) {
  50. self::$self = new self();
  51. }
  52. return self::$self;
  53. }
  54. /**
  55. * 绑定订单
  56. * @param OrderObject $order
  57. * @return OrderObject
  58. */
  59. public function setOrder(OrderObject $order)
  60. {
  61. return $this->order = $order;
  62. }
  63. /**
  64. * @return UserObject
  65. */
  66. public function getUser()
  67. {
  68. return $this->user;
  69. }
  70. /**
  71. * 绑定用户
  72. * @param UserObject $user
  73. * @return UserObject
  74. */
  75. public function setUser(UserObject $user)
  76. {
  77. return $this->user = $user;
  78. }
  79. /**
  80. * 获取KL渠道
  81. * @param string $channelId
  82. * @param array $order_data
  83. * @param array $rule_config
  84. * @param string $business_line
  85. * @return \app\main\model\object\ReturnObject
  86. */
  87. public function getKlAdmin($channelId, $order_data, $rule_config, $business_line = PayConstants::BUSINESS_WECHAT)
  88. {
  89. LogService::debug(json_encode($rule_config, JSON_UNESCAPED_UNICODE));
  90. $oOrder = (new OrderObject())->bind($order_data);
  91. $this->setOrder($oOrder);
  92. $this->setUser(UserService::instance()->getUserInfo());
  93. if ($this->user->is_black != UserConstants::USER_BLACK_NO) {
  94. LogService::info('用户黑名单,K');
  95. return $this->getKlAdminInfo($business_line);
  96. }
  97. $adminConfig = model('AdminConfig')->getAdminInfoAll($channelId);
  98. $orderDeduct = new OrderDeduction();
  99. //检测是否到达扣量比例
  100. if (!$orderDeduct->checkIsDeductThreshold($channelId, $adminConfig, $this->user->id)) {
  101. LogService::info('KL渠道:扣量比例超过阈值,!K');
  102. return $this->setData(self::KL_NO)->getReturn();
  103. }
  104. //检查是否开启扣量
  105. if (!$adminConfig['is_blacklist']) {
  106. LogService::info('KL渠道:渠道未开启扣量,!K');
  107. return $this->setData(self::KL_NO)->getReturn();
  108. }
  109. //用户白名单
  110. if ($this->user->is_white) {
  111. LogService::info('KL渠道:用户白名单,!K');
  112. return $this->setData(self::KL_NO)->getReturn();
  113. }
  114. //IP检测
  115. if (WhiteList::checkedIpWhite(Ip::ip())) {
  116. WhiteList::addUserIdWhite($this->user->id);
  117. LogService::info('KL渠道:用户与渠道同IP,!K');
  118. return $this->setData(self::KL_NO)->getReturn();
  119. }
  120. if ($this->checkKl($rule_config)->data) {
  121. return $this->getKlAdminInfo($business_line);
  122. } else {
  123. LogService::info('KL渠道:扣量规则检测结果,!K');
  124. return $this->setData(self::KL_NO)->getReturn();
  125. }
  126. }
  127. /**
  128. * 获取渠道
  129. * @param $business_line
  130. * @return \app\main\model\object\ReturnObject
  131. */
  132. public function getKlAdminInfo($business_line)
  133. {
  134. $klAdmin = self::KL_NO;
  135. $suffix = '';
  136. if ($business_line != PayConstants::BUSINESS_WECHAT) {
  137. $suffix = '_app';
  138. }
  139. $channel_ids = Config::get('site.change_ids' . $suffix);
  140. if (!$channel_ids) {
  141. LogService::info('KL渠道:未查询到KL渠道配置,!K');
  142. } else {
  143. $channel_id_arr = explode(',', $channel_ids);
  144. shuffle($channel_id_arr);
  145. $admin_id = array_pop($channel_id_arr);
  146. if (!$klAdmin = model('admin_extend')->where('admin_id', $admin_id)->find()) {
  147. LogService::info('KL渠道:未查询到KL渠道,!K');
  148. } else {
  149. //用户正常情况才进行黑灰名单配置
  150. if ($this->user->is_black == UserConstants::USER_BLACK_NO) {
  151. $id = OrderService::instance()->getOrderModel()
  152. ->where('user_id', $this->user->id)
  153. ->value('id');
  154. //首单加黑
  155. if (!$id) {
  156. UserService::instance()->update(['is_black' => UserConstants::USER_BLACK_YES], ['id' => $this->user->id]);
  157. } else {
  158. UserService::instance()->update(['is_black' => UserConstants::USER_BLACK_HALF], ['id' => $this->user->id]);
  159. }
  160. }
  161. LogService::info('KL渠道:扣量规则检测结果,K:' . $klAdmin['admin_id']);
  162. }
  163. }
  164. return $this->setData($klAdmin)->getReturn();
  165. }
  166. /**
  167. * 检测是否需要KL
  168. * @param array $ruleConfig
  169. * @return \app\main\model\object\ReturnObject
  170. */
  171. public function checkKl(array $ruleConfig)
  172. {
  173. //户筛选规则
  174. if ($this->checkUserNew()->data) {
  175. $screen_field = KlConstants::KL_SELECTOR_NEW_USER;
  176. } else {
  177. $screen_field = KlConstants::KL_SELECTOR_OLD_USER;
  178. }
  179. if (array_key_exists($screen_field, $ruleConfig[KlConstants::KL_SELECTOR])) {
  180. list($city, $new, $pay, $op) = $this->getScreenConfig($ruleConfig[KlConstants::KL_SELECTOR][$screen_field])->data;
  181. $klStatus = $this->checkScreen($city, $new, $pay, $op)->data;
  182. if ($klStatus) {
  183. LogService::info('检测:用户筛选通过,!K');
  184. return $this->setData(self::KL_NO)->getReturn();
  185. } else {
  186. LogService::info('检测:用户筛选不通过,GO ON');
  187. }
  188. } else {
  189. LogService::info('检测:用户筛选条件不匹配,GO ON');
  190. }
  191. //过滤规则
  192. $kl = true;
  193. //注册时间与下单时间
  194. if (array_key_exists(KlConstants::KL_FILTER_REGISTER, $ruleConfig[KlConstants::KL_FILTER])) {
  195. $kl = $kl && $this->checkFilterOrderAndRegister($ruleConfig[KlConstants::KL_FILTER][KlConstants::KL_FILTER_REGISTER][KlConstants::KL_FILTER_REGISTER_SPACE]);
  196. } else {
  197. LogService::info('检测:无注册时间与下单时间规则,GO ON');
  198. }
  199. //用户行为
  200. if (array_key_exists(KlConstants::KL_FILTER_BEHAVOR, $ruleConfig[KlConstants::KL_FILTER])) {
  201. list($pay_time_span, $pay_type, $read_chapter_count, $shubi_left, $order_count, $op) = $this->getFilterConfig($ruleConfig[KlConstants::KL_FILTER][KlConstants::KL_FILTER_BEHAVOR])->data;
  202. $kl = $kl && $this->checkFilterUser($pay_time_span, $pay_type, $read_chapter_count, $shubi_left, $order_count, $op)->data;
  203. }
  204. if ($kl) {
  205. LogService::info('检测:用户行为通过,!K');
  206. return $this->setData(self::KL_NO)->getReturn();
  207. } else {
  208. LogService::info('检测:用户行为不通过,GO ON');
  209. }
  210. //vip订单
  211. if ($this->order->day) {
  212. LogService::info('检测:VIP订单');
  213. $field = KlConstants::KL_DEDUCT_VIP;
  214. //活动订单订单
  215. } else if ($this->order->activity_id) {
  216. LogService::info('检测:活动订单');
  217. $field = KlConstants::KL_DEDUCT_ACTIVITY;
  218. //普通订单
  219. } else {
  220. LogService::info('检测:普通订单');
  221. $field = KlConstants::KL_DEDUCT_NORMAL;
  222. }
  223. if (array_key_exists($field, $ruleConfig[KlConstants::KL_DEDUCT])) {
  224. list($double_pay, $new, $old) = $this->getKlOrderConfig($ruleConfig[KlConstants::KL_DEDUCT][$field])->data;
  225. $klStatus = $this->checkOrderKL($double_pay, $new, $old)->data;
  226. if ($klStatus) {
  227. return $this->setData(self::KL_YES)->getReturn();
  228. }
  229. } else {
  230. LogService::info('检测:订单扣减类型不匹配,!K');
  231. }
  232. return $this->setData(self::KL_NO)->getReturn();
  233. }
  234. /**
  235. * 获取筛选参数
  236. * @param array $screen
  237. * @return \app\main\model\object\ReturnObject
  238. */
  239. public function getScreenConfig(array $screen)
  240. {
  241. $city = false;
  242. $new = false;
  243. $pay = false;
  244. $op = self::OP_AND;
  245. if (array_key_exists(KlConstants::KL_SELECTOR_NEW_CITY, $screen)) {
  246. $city = $screen[KlConstants::KL_SELECTOR_NEW_CITY];
  247. }
  248. if (array_key_exists(KlConstants::KL_SELECTOR_NEW_ADD, $screen)) {
  249. $new = $screen[KlConstants::KL_SELECTOR_NEW_ADD];
  250. }
  251. if (array_key_exists(KlConstants::KL_SELECTOR_NEW_RECHARGE, $screen)) {
  252. $pay = $screen[KlConstants::KL_SELECTOR_NEW_RECHARGE];
  253. }
  254. if (array_key_exists(KlConstants::KL_SELECTOR_NEW_RELATION, $screen)) {
  255. $op = $screen[KlConstants::KL_SELECTOR_NEW_RELATION];
  256. }
  257. return $this->setData([$city, $new, $pay, $op])->getReturn();
  258. }
  259. /**
  260. * 获取过滤规则
  261. * @param array $filter
  262. * @return \app\main\model\object\ReturnObject
  263. */
  264. public function getFilterConfig(array $filter)
  265. {
  266. $pay_time_span = false;
  267. $pay_type = false;
  268. $read_chapter_count = false;
  269. $shubi_left = false;
  270. $order_count = false;
  271. $op = self::OP_AND;
  272. if (array_key_exists(KlConstants::KL_FILTER_BEHAVOR_SPACE, $filter)) {
  273. $pay_time_span = $filter[KlConstants::KL_FILTER_BEHAVOR_SPACE];
  274. }
  275. if (array_key_exists(KlConstants::KL_FILTER_BEHAVOR_RECHARGE, $filter)) {
  276. $pay_type = $filter[KlConstants::KL_FILTER_BEHAVOR_RECHARGE];
  277. }
  278. if (array_key_exists(KlConstants::KL_FILTER_BEHAVOR_READ, $filter)) {
  279. $read_chapter_count = $filter[KlConstants::KL_FILTER_BEHAVOR_READ];
  280. }
  281. if (array_key_exists(KlConstants::KL_FILTER_BEHAVOR_KANDIAN, $filter)) {
  282. $shubi_left = $filter[KlConstants::KL_FILTER_BEHAVOR_KANDIAN];
  283. }
  284. if (array_key_exists(KlConstants::KL_FILTER_BEHAVOR_ORDERS, $filter)) {
  285. $order_count = $filter[KlConstants::KL_FILTER_BEHAVOR_ORDERS];
  286. }
  287. if (array_key_exists(KlConstants::KL_FILTER_BEHAVOR_RELATION, $filter)) {
  288. $op = $filter[KlConstants::KL_FILTER_BEHAVOR_RELATION];
  289. }
  290. return $this->setData([$pay_time_span, $pay_type, $read_chapter_count, $shubi_left, $order_count, $op])->getReturn();
  291. }
  292. /**
  293. * 获取KL order配置
  294. * @param array $order
  295. * @return \app\main\model\object\ReturnObject
  296. */
  297. public function getKlOrderConfig(array $order)
  298. {
  299. $double_pay = false;
  300. $new = false;
  301. $old = false;
  302. if (array_key_exists(KlConstants::KL_DEDUCT_NORMAL_NEW, $order)) {
  303. $new = $order[KlConstants::KL_DEDUCT_NORMAL_NEW];
  304. }
  305. if (array_key_exists(KlConstants::KL_DEDUCT_NORMAL_OLD, $order)) {
  306. $old = $order[KlConstants::KL_DEDUCT_NORMAL_OLD];
  307. }
  308. if (array_key_exists(KlConstants::KL_DEDUCT_NORMAL_MANY, $order)) {
  309. $double_pay = $order[KlConstants::KL_DEDUCT_NORMAL_MANY];
  310. }
  311. return $this->setData([$double_pay, $new, $old])->getReturn();
  312. }
  313. /**
  314. * 筛选
  315. * @param bool $city
  316. * @param bool $new
  317. * @param bool $pay
  318. * @param string $op
  319. * @return \app\main\model\object\ReturnObject
  320. */
  321. public function checkScreen($city = false, $new = false, $pay = false, $op = self::OP_AND)
  322. {
  323. //默认满足条件,不扣
  324. $checkList = [];
  325. $channel_id = AdminService::instance()->getAdminExtendModel()->getChannelId($this->user->channel_id);
  326. if ($city) {
  327. $currentCity = Ip::citycode();
  328. $cities = explode(',', $city);
  329. //渠道城市
  330. $cacheCity = CacheConstants::getChannelWhiteCityCacheKey($channel_id);
  331. $channel_city = Redis::instance()->sMembers($cacheCity);
  332. if ($channel_city) {
  333. $cities = array_merge($cities, $channel_city);
  334. $cities = array_unique($cities);
  335. }
  336. $filterCity = in_array($currentCity, $cities);
  337. if ($filterCity) {
  338. LogService::info('筛选:城市白名单,满足:' . $currentCity . ':' . $city);
  339. } else {
  340. LogService::info('筛选:城市白名单,不满足' . $currentCity . ':' . $city);
  341. }
  342. $checkList[] = (int)$filterCity;
  343. }
  344. //当日新用户、活跃用户
  345. if ($new) {
  346. if ($this->checkUserNew()->data) {
  347. $key = CacheConstants::getNewUserCacheKey($channel_id);
  348. $currentValue = (int)Redis::instance()->get($key);
  349. $msg = '新增用户';
  350. }else{
  351. $key = CacheConstants::getOldUserActiveCacheKey($channel_id);
  352. $currentValue = (int)Redis::instance()->pfCount($key);
  353. $msg = '活跃用户';
  354. }
  355. list($first_letter, $value) = $this->getOpValue($new)->data;
  356. $filterNew = $this->checkRelation($currentValue, $first_letter, $value)->data;
  357. if ($filterNew) {
  358. LogService::info("筛选:${msg}满足判定:$currentValue$new");
  359. }else{
  360. LogService::info("筛选:${msg}不满足判定:$currentValue$new");
  361. }
  362. $checkList[] = (int)$filterNew;
  363. }
  364. //当日起充人数
  365. if ($pay) {
  366. $key = CacheConstants::getPayUserLimitCacheKey($channel_id);
  367. $currentValue = (int)Redis::instance()->pfCount($key);
  368. list($first_letter, $value) = $this->getOpValue($pay)->data;
  369. $filterPay = $this->checkRelation($currentValue, $first_letter, $value)->data;
  370. if ($filterPay) {
  371. LogService::info("筛选:起充用户满足判定:$currentValue$pay");
  372. }else{
  373. LogService::info("筛选:起充用户不满足判定:$currentValue$pay");
  374. }
  375. $checkList[] = (int)$filterPay;
  376. }
  377. if ($op == self::OP_AND) {
  378. $result = count($checkList) == array_sum($checkList);
  379. } else {
  380. $result = max($checkList);
  381. }
  382. if ($result) {
  383. LogService::info("筛选:满足条件,!K");
  384. }else{
  385. LogService::info("筛选:不满足条件,GO ON");
  386. }
  387. return $this->setData($result)->getReturn();
  388. }
  389. /**
  390. * 用户行为判定
  391. * @param bool $pay_time_span
  392. * @param bool $pay_type
  393. * @param bool $read_chapter_count
  394. * @param bool $shubi_left
  395. * @param bool $order_count
  396. * @param string $op
  397. * @return \app\main\model\object\ReturnObject
  398. */
  399. public function checkFilterUser($pay_time_span = false, $pay_type = false, $read_chapter_count = false, $shubi_left = false, $order_count = false, $op = self::OP_AND)
  400. {
  401. $checkList = [];
  402. //支付间隔
  403. if ($pay_time_span) {
  404. $cachePayTime = CacheConstants::getUserPayTimeCacheKey($this->user->id);
  405. $finish_time = (int)Redis::instance()->get($cachePayTime);
  406. if ($finish_time) {
  407. $current = round((time() - $finish_time) / 60, 2);
  408. $filterPayTimeSpan = $this->checkRelation($current, '<', $pay_time_span)->data;
  409. if ($filterPayTimeSpan) {
  410. LogService::info('用户行为:支付时间间隔检测通过:' . $current . '<' . $pay_time_span);
  411. } else {
  412. LogService::info('用户行为:支付时间间隔检测不通过:' . $current . '<' . $pay_time_span);
  413. }
  414. }else{
  415. $filterPayTimeSpan = 0;
  416. LogService::info('用户行为:支付时间间隔检测不通过:未找到上一单');
  417. }
  418. $checkList[] = (int)$filterPayTimeSpan;
  419. }
  420. //支付类型
  421. if ($pay_type) {
  422. $pay_types = explode(',', $pay_type);
  423. $compare_types = [];
  424. if ((bool)$this->order->activity_id) {
  425. $compare_types[] = 'H';
  426. LogService::info('用户行为:活动订单');
  427. }
  428. if (!$this->order->book_id && !$this->order->activity_id) {
  429. $compare_types[] = 'Z';
  430. LogService::info('用户行为:直充订单');
  431. }
  432. $compare_type = implode(',', $compare_types);
  433. if (array_intersect($pay_types, $compare_types)) {
  434. $filterPayType = 1;
  435. LogService::info('用户行为:订单类型通过.' . $compare_type . ':' . $pay_type);
  436. } else {
  437. $filterPayType = 0;
  438. LogService::info('用户行为:订单类型不通过.' . $compare_type . ':' . $pay_type);
  439. }
  440. $checkList[] = $filterPayType;
  441. }
  442. //阅读章节
  443. if ($read_chapter_count) {
  444. $cacheChapter = CacheConstants::getUserChapterCacheKey($this->user->id);
  445. $count = Redis::instance()->pfCount($cacheChapter);
  446. list($first_letter, $value) = $this->getOpValue($read_chapter_count)->data;
  447. $filterReadChapterCount = $this->checkRelation($count, $first_letter, $value)->data;
  448. if ($filterReadChapterCount) {
  449. LogService::info('用户行为:阅读章节检测通过:' . $count . $read_chapter_count);
  450. } else {
  451. LogService::info('用户行为:阅读章节检测不通过:' . $count . $read_chapter_count);
  452. }
  453. $checkList[] = (int)$filterReadChapterCount;
  454. }
  455. //剩余书币
  456. if ($shubi_left) {
  457. list($first_letter, $value) = $this->getOpValue($shubi_left)->data;
  458. $kandian = FinancialService::instance()->getTotalKandian($this->user->id)->data;
  459. $filterShubiLeft = $this->checkRelation($kandian, $first_letter, $value)->data;
  460. if ($filterShubiLeft) {
  461. LogService::info('用户行为:书币剩余检测通过:' . $kandian . $shubi_left);
  462. } else {
  463. LogService::info('用户行为:书币剩余检测不通过:' . $kandian . $shubi_left);
  464. }
  465. $checkList[] = (int)$filterShubiLeft;
  466. }
  467. //订单完成数
  468. if ($order_count) {
  469. $cacheOrderCount = CacheConstants::getUserOrderCompletedCountCacheKey($this->user->id);
  470. $count = (int)Redis::instance()->get($cacheOrderCount);
  471. list($first_letter, $value) = $this->getOpValue($order_count)->data;
  472. $filterOrderCount = $this->checkRelation($count, $first_letter, $value)->data;
  473. if ($filterOrderCount) {
  474. LogService::info('用户行为:订单数检测通过:' . $count . $order_count);
  475. } else {
  476. LogService::info('用户行为:订单数检测不通过:' . $count . $order_count);
  477. }
  478. $checkList[] = (int)$filterOrderCount;
  479. }
  480. if ($op == self::OP_AND) {
  481. $result = count($checkList) == array_sum($checkList);
  482. } else {
  483. $result = max($checkList);
  484. }
  485. if ($result) {
  486. LogService::info('用户行为:满足条件,!K');
  487. } else {
  488. LogService::info('用户行为:不满足条件,GO ON');
  489. }
  490. return $this->setData($result)->getReturn();
  491. }
  492. /**
  493. * 注册与下单时间之差
  494. * @param bool $time
  495. * @return \app\main\model\object\ReturnObject
  496. */
  497. public function checkFilterOrderAndRegister($time = false)
  498. {
  499. $filter = true;
  500. if ($time) {
  501. list($first_letter, $value) = $this->getOpValue($time)->data;
  502. $diff = round((time() - $this->user->createtime) / 60, 2);
  503. $filter = $this->checkRelation($diff, $first_letter, $value)->data;
  504. if ($filter) {
  505. LogService::info('注册与下单时间之差:满足条件,!K:' . $diff . $first_letter . $value);
  506. } else {
  507. LogService::info('注册与下单时间之差:不满足条件,GO ON:' . $diff . $first_letter . $value);
  508. }
  509. } else {
  510. LogService::info('注册与下单时间之差:无规则,GO ON');
  511. }
  512. return $this->setData($filter)->getReturn();
  513. }
  514. /**
  515. * 检查KL比例规则
  516. * @param bool $double_pay
  517. * @param bool $new
  518. * @param bool $old
  519. * @return \app\main\model\object\ReturnObject
  520. */
  521. public function checkOrderKL($double_pay = false, $new = false, $old = false)
  522. {
  523. $rate = rand(1, 100);
  524. if ($double_pay) {
  525. $cacheOrderCount = CacheConstants::getUserOrderCompletedCountCacheKey($this->user->id);
  526. $count = Redis::instance()->get($cacheOrderCount);
  527. if ($count > 2) {
  528. LogService::info('KL比例:订单扣量比例规则,满足二充:' . $count);
  529. if ($rate <= $double_pay) {
  530. LogService::info('KL比例:扣量生效,二充:' . $rate . ':' . $double_pay);
  531. return $this->setData(self::KL_YES)->getReturn();
  532. } else {
  533. LogService::info('KL比例:扣量未命中,二充:' . $rate . ':' . $double_pay);
  534. return $this->setData(self::KL_NO)->getReturn();
  535. }
  536. } else {
  537. LogService::info('KL比例:非二充用户,订单数:' . $count . ',GO ON');
  538. }
  539. }
  540. if ($new && $this->checkUserNew()->data) {
  541. LogService::info('KL比例:订单扣量比例规则,满足新用户');
  542. if ($rate <= $new) {
  543. LogService::info('KL比例:扣量生效,新用户:' . $rate . ':' . $new);
  544. return $this->setData(self::KL_YES)->getReturn();
  545. } else {
  546. LogService::info('KL比例:扣量未命中,新用户:' . $rate . ':' . $new);
  547. return $this->setData(self::KL_NO)->getReturn();
  548. }
  549. }
  550. if ($old && !$this->checkUserNew()->data) {
  551. LogService::info('KL比例:订单扣量比例规则,满足老用户');
  552. if ($rate <= $old) {
  553. LogService::info('KL比例:扣量生效,老用户:' . $rate . ':' . $old);
  554. return $this->setData(self::KL_YES)->getReturn();
  555. } else {
  556. LogService::info('KL比例:扣量未命中,老用户:' . $rate . ':' . $old);
  557. return $this->setData(self::KL_NO)->getReturn();
  558. }
  559. }
  560. LogService::info('KL比例:扣量未命中,END');
  561. return $this->setData(self::KL_NO)->getReturn();
  562. }
  563. /**
  564. * 获取操作符与值
  565. * @param $opValue
  566. * @return \app\main\model\object\ReturnObject
  567. */
  568. public function getOpValue($opValue)
  569. {
  570. $first_letter = substr($opValue, 0, 1);
  571. $value = (int)substr($opValue, 1);
  572. return $this->setData([$first_letter, $value])->getReturn();
  573. }
  574. /**
  575. * 获取比较结果
  576. * @param $v1
  577. * @param $op
  578. * @param $v2
  579. * @return \app\main\model\object\ReturnObject
  580. */
  581. public function checkRelation($v1, $op, $v2)
  582. {
  583. if ($op == self::OP_BIGGER) {
  584. return $this->setData($v1 > $v2)->getReturn();
  585. } else if ($op == self::OP_LESS) {
  586. return $this->setData($v1 < $v2)->getReturn();
  587. } else {
  588. return $this->setData($v1 == $v2)->getReturn();
  589. }
  590. }
  591. /**
  592. * 检测新用户
  593. * @return \app\main\model\object\ReturnObject
  594. */
  595. public function checkUserNew()
  596. {
  597. return $this->setData(date('Ymd') == date('Ymd', $this->user->createtime))->getReturn();
  598. }
  599. /**
  600. * 设置KL规则修改信息
  601. * @param $ruleId
  602. * @param $adminId
  603. * @param $msg
  604. * @return \app\main\model\object\ReturnObject
  605. */
  606. public function updateConfigUserCache($ruleId, $adminId, $msg)
  607. {
  608. $admin = AdminService::instance()->getAdminModel()->where('id', $adminId)->find();
  609. if ($admin) {
  610. $cache = CacheConstants::getKlRuleModifyInfo($ruleId);
  611. $data = [
  612. 'updatetime' => time(),
  613. 'opuser_name' => $admin['username'],
  614. 'msg' => $msg,
  615. ];
  616. Redis::instance()->hMset($cache, $data);
  617. LogService::info(json_encode($data, true));
  618. KlService::instance()->delKlRuleManageCache();
  619. }
  620. return $this->setData(true)->getReturn();
  621. }
  622. }