Sign.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. <?php
  2. namespace app\common\model;
  3. use app\api\library\ReplayTemplate;
  4. use app\common\library\Redis;
  5. use app\main\service\AdminService;
  6. use app\common\service\LogService;
  7. use app\common\service\WaterBookService;
  8. use app\main\helper\ArrayHelper;
  9. use app\main\service\UserService;
  10. use think\Model;
  11. use think\Cookie;
  12. use think\Config;
  13. class Sign extends Model
  14. {
  15. // 表名
  16. protected $table = 'sign';
  17. // 自动写入时间戳字段
  18. protected $autoWriteTimestamp = 'int';
  19. // 定义时间戳字段名
  20. protected $createTime = 'createtime';
  21. // 追加属性
  22. protected $append = [
  23. ];
  24. //当前链接的user_id分库
  25. protected $connectUserId = null;
  26. protected $userInfo = null;
  27. /**
  28. * 设置分库链接数据
  29. * @param $user_id
  30. * @return $this
  31. */
  32. public function setConnect($user_id)
  33. {
  34. if ($this->connectUserId != $user_id) {
  35. $database = get_db_connect($this->table, $user_id);
  36. $this->setTable($database['table']);
  37. $this->connect($database);
  38. $this->connectUserId = $user_id;
  39. }
  40. return $this;
  41. }
  42. /**
  43. * 返回用户今天的签到信息
  44. * @return array|false|\PDOStatement|string|Model
  45. */
  46. public function userSignToday()
  47. {
  48. //检查是否已签到
  49. $todayDate = Date('Ymd',time());
  50. $obj = $this->where(['uid'=>$this->connectUserId,'createdate'=>$todayDate])->find();
  51. return $obj;
  52. }
  53. /**
  54. * 用户签到(连续)
  55. * @return array [ture,message] 返回true时,message为推送内容 返回false时,message为错误信息
  56. */
  57. public function UserSignContinuous(){
  58. try{
  59. if(!$this->connectUserId){
  60. throw new \Exception('获取用户ID失败');
  61. }
  62. //检查是否已签到
  63. $todayDate = Date('Ymd',time());
  64. if($obj = $this->where(['uid'=>$this->connectUserId,'createdate'=>$todayDate])->find()){
  65. return [true, $this->getSignedRecommendBookTemplate(), $obj->kandian, $obj->days];
  66. }
  67. list($status,$message,$continue_days, $kandian) = $this->writeSignLogContinuous();
  68. if(!$status){
  69. throw new \Exception($message);
  70. }
  71. return [true,$this->getSignRecommendBookTemplateContinuous($continue_days, $kandian), $kandian,$continue_days];
  72. }catch (\Exception $e){
  73. LogService::exception($e);
  74. return [false,$e->getMessage()];
  75. }
  76. }
  77. /**
  78. * 写入用户签到信息到数据库
  79. * @return array [ture,message] 返回true时,message为推送内容 返回false时,message为错误信息
  80. */
  81. public function writeSignLogContinuous(){
  82. try{
  83. if (!$this->userInfo) {
  84. $this->userInfo = model('User')->getUserInfo($this->connectUserId);
  85. }
  86. $userInfo = $this->userInfo;
  87. $redis = Redis::instance();
  88. $signData = $this->getYesterdaySignData();
  89. if ($signData) {
  90. if ($signData->days > 7) {
  91. $mod = abs($signData->days % 7);
  92. if ($mod === 0) {
  93. $signData->days = 7;
  94. } else {
  95. $signData->days = $mod;
  96. }
  97. }
  98. if ($signData->days == 7) {
  99. $continue_days = 1;
  100. } else {
  101. $continue_days = $signData->days + 1;
  102. }
  103. } else {
  104. $continue_days = 1;
  105. }
  106. $kandian = $this->calMoneyByDays($continue_days);
  107. $sign_data = ['uid' => $this->connectUserId, 'kandian' => intval($kandian), 'days' => $continue_days, 'createdate' => Date('Ymd', time()), 'createtime' => time()];
  108. if(!$this->insert($sign_data)){
  109. throw new \Exception('签到失败,写入签到数据失败');
  110. }
  111. //写入Recharge表
  112. $recharge_data = [
  113. 'user_id'=>$this->connectUserId,
  114. 'type'=>5,
  115. 'free_kandian'=>$kandian,
  116. 'remain_free_kandian' => $kandian,
  117. 'free_endtime'=>intval(config('site.kandian_free_day'))*86400 + time(),
  118. 'createtime' => time(),
  119. 'updatetime' => time(),
  120. 'dd' => ArrayHelper::getValue($userInfo, 'is_black') == 0 ? 0 : 1,
  121. ];
  122. if(!$recharge_id = model('Recharge')->setConnect($this->connectUserId)->insertGetId($recharge_data)){
  123. $this->where(['createdate'=>Date('Ymd',time()),'uid'=>$this->connectUserId])->delete();
  124. throw new \Exception('签到失败,写入签到数据失败');
  125. }
  126. //签到赠送的免费书币存到redis
  127. $zkey = 'ZR:'.$this->connectUserId;
  128. $redis->del($zkey);
  129. return [true,'OK', $continue_days, $kandian];
  130. }catch (\Exception $e){
  131. return [false,$e->getMessage()];
  132. }
  133. }
  134. /**
  135. * 获取签到自动回复
  136. * @param $continue_days 连续签到天数
  137. * @param $kandian 签到赠送的看点数
  138. * @return string
  139. */
  140. public function getSignRecommendBookTemplateContinuous($continue_days, $kandian){
  141. //$kandian = Config::get('site.kandian_sign');
  142. $continue_days = ($continue_days % 7) == 0 ? 7 : ($continue_days % 7);
  143. if (!$this->userInfo) {
  144. $this->userInfo = model('User')->getUserInfo($this->connectUserId);
  145. }
  146. if($this->userInfo){
  147. $user = $this->userInfo;
  148. $adminConfig = model('AdminConfig')->getAdminInfoAll($user['channel_id']);
  149. //获取阅读历史 OR 推荐书籍
  150. $readlog = array();
  151. $recommandBook = array();
  152. $soruceReadLog = model('UserRecentlyRead')->setConnect($this->connectUserId)->getRecentlyRead(0, 5,
  153. $this->connectUserId, true);
  154. $soruceReadLog = $this->filterDelBook($soruceReadLog['data'],'state');
  155. if (count($soruceReadLog) > 0) {
  156. $readlog = array_slice( $soruceReadLog, 0,5);
  157. } else {
  158. $user['sex'] = ($user['sex'] == '0') ? 1 : $user['sex'];
  159. $channelId = AdminService::instance()->getAdminExtendModel()->getChannelId($adminConfig['admin_id']);
  160. $isWater = WaterBookService::instance()->showBook($channelId,$user['id']);
  161. $recommandBook = model('SignRecommand')->getBooksBySex($user['sex'],3,$isWater);
  162. $recommandBook = $this->filterDelBook($recommandBook);
  163. $recommandBook = array_slice($recommandBook,0,3);
  164. }
  165. //发送消息
  166. $replay = new ReplayTemplate($adminConfig['admin_id']);
  167. return $replay->getSignReplayTemplate("@{$user['nickname']},今日签到成功,已连续签到{$continue_days}天,获得{$kandian}书币,连续签到7天合计获得350书币~",$readlog,$recommandBook, $adminConfig['admin_id'], $this->userInfo);
  168. //return $replay->getSignReplayTemplate("@{$user['nickname']},今日签到成功,您已连续签到{$continue_days}天,赠送{$kandian}书币,连续签到每次多送5书币,多签多送,最高赠送65书币~",$readlog,$recommandBook, $adminConfig['admin_id']);
  169. //return $replay->getSignReplayTemplate("@{$user['nickname']},今日签到成功,赠送{$kandian}书币,请明天继续签到得书币哦~",$readlog,$recommandBook);
  170. }
  171. //return "今日签到成功,赠送{$kandian}书币,请明天继续签到得书币哦~";
  172. return "今日签到成功,您已连续签到{$continue_days}天,赠送{$kandian}书币,连续签到每次多送5书币,多签多送,最高赠送65书币~";
  173. }
  174. /**
  175. * 用户签到
  176. * @return array [ture,message] 返回true时,message为推送内容 返回false时,message为错误信息
  177. */
  178. public function UserSign(){
  179. try{
  180. if(!$this->connectUserId){
  181. throw new \Exception('获取用户ID失败');
  182. }
  183. if (!$this->userInfo) {
  184. $this->userInfo = UserService::instance()->getUserModel()->getUserInfo($this->connectUserId);
  185. }
  186. //检查是否已签到
  187. $todayDate = Date('Ymd',time());
  188. if($this->where(['uid'=>$this->connectUserId,'createdate'=>$todayDate])->find()){
  189. return [true,$this->getSignedRecommendBookTemplate()];
  190. }
  191. list($status,$message,$continue_days, $kandian) = $this->writeSignLogContinuous();
  192. if(!$status){
  193. throw new \Exception($message);
  194. }
  195. return [true,$this->getSignRecommendBookTemplateContinuous($continue_days, $kandian), $kandian,$continue_days];
  196. }catch (\Exception $e){
  197. LogService::exception($e);
  198. return [false,$e->getMessage()];
  199. }
  200. }
  201. /**
  202. * 写入用户签到信息到数据库
  203. * @return array [ture,message] 返回true时,message为推送内容 返回false时,message为错误信息
  204. */
  205. public function writeSignLog(){
  206. try{
  207. if (!$this->userInfo) {
  208. $this->userInfo = model('User')->getUserInfo($this->connectUserId);
  209. }
  210. $userInfo = $this->userInfo;
  211. $redis = Redis::instance();
  212. //写入签到数据
  213. $kandian = Config::get('site.kandian_sign');
  214. $sign_data = ['uid' => $this->connectUserId, 'kandian' => intval($kandian), 'createdate' => Date('Ymd', time()), 'createtime' => time()];
  215. if(!$this->insert($sign_data)){
  216. throw new \Exception('签到失败,写入签到数据失败');
  217. }
  218. //写入Recharge表
  219. $recharge_data = [
  220. 'user_id'=>$this->connectUserId,
  221. 'type'=>5,
  222. 'free_kandian'=>$kandian,
  223. 'remain_free_kandian' => $kandian,
  224. 'free_endtime'=>intval(config('site.kandian_free_day'))*86400 + time(),
  225. 'createtime' => time(),
  226. 'updatetime' => time(),
  227. 'dd' => ArrayHelper::getValue($userInfo, 'is_black') == 0 ? 0 : 1,
  228. ];
  229. if(!$recharge_id = model('Recharge')->setConnect($this->connectUserId)->insertGetId($recharge_data)){
  230. $this->where(['createdate'=>Date('Ymd',time()),'uid'=>$this->connectUserId])->delete();
  231. throw new \Exception('签到失败,写入签到数据失败');
  232. }
  233. //签到赠送的免费书币存到redis
  234. $zkey = 'ZR:'.$this->connectUserId;
  235. $redis->del($zkey);
  236. return [true, 'OK'];
  237. }catch (\Exception $e){
  238. return [false,$e->getMessage()];
  239. }
  240. }
  241. /**
  242. * 获取签到自动回复
  243. * @return string
  244. */
  245. public function getSignRecommendBookTemplate(){
  246. $kandian = Config::get('site.kandian_sign');
  247. $user = model('User')->getUserInfo($this->connectUserId);
  248. if($user){
  249. $adminConfig = model('AdminConfig')->getAdminInfoAll($user['channel_id']);
  250. //获取阅读历史 OR 推荐书籍
  251. $readlog = array();
  252. $recommandBook = array();
  253. $soruceReadLog = model('UserRecentlyRead')->setConnect($this->connectUserId)->getRecentlyRead(0, 10,
  254. $this->connectUserId, true);
  255. $soruceReadLog = $this->filterDelBook($soruceReadLog['data'],'state');
  256. if (count($soruceReadLog) > 0) {
  257. $readlog = array_slice( $soruceReadLog, 0,5);
  258. } else {
  259. $user['sex'] = ($user['sex'] == '0') ? 1 : $user['sex'];
  260. $channelId = AdminService::instance()->getAdminExtendModel()->getChannelId($adminConfig['admin_id']);
  261. $isWater = WaterBookService::instance()->showBook($channelId,$user['id']);
  262. $recommandBook = model('SignRecommand')->getBooksBySex($user['sex'],10,$isWater);
  263. $recommandBook = $this->filterDelBook($recommandBook);
  264. $recommandBook = array_slice($recommandBook,0,3);
  265. }
  266. //发送消息
  267. $replay = new ReplayTemplate($adminConfig['admin_id']);
  268. return $replay->getSignReplayTemplate("@{$user['nickname']},今日签到成功,赠送{$kandian}书币,请明天继续签到得书币哦~",$readlog,$recommandBook, $adminConfig['admin_id'], $user);
  269. }
  270. return "今日签到成功,赠送{$kandian}书币,请明天继续签到得书币哦~";
  271. }
  272. /**
  273. * 过滤下架的书籍
  274. * @param $books
  275. * @param string $state
  276. */
  277. public function filterDelBook( $books, $state='' )
  278. {
  279. try{
  280. LogService::info('filter书籍详情001'.json_encode($books));
  281. if (empty($books)){
  282. return [];
  283. }
  284. if (!$state){ //如果数组中没有下架状态
  285. $bookIds = array_column($books,'book_id');
  286. $booksInfo = model('Book')->getBooksInfo($bookIds);
  287. foreach ($books as $key=> $book){
  288. if ( !isset($booksInfo[$book['book_id']]) || (isset($booksInfo[$book['book_id']]['state']) && $booksInfo[$book['book_id']]['state'] != 1) ){
  289. unset($books[$key]);
  290. continue;
  291. }
  292. }
  293. }else{
  294. foreach ($books as $key=>$book){
  295. if ( isset($book['state']) && $book['state'] != 1){
  296. unset($books[$key]);
  297. continue;
  298. }
  299. }
  300. }
  301. return $books;
  302. }catch (\Throwable $throwable){
  303. LogService::error('过滤删除书籍'.$throwable->getMessage());
  304. }
  305. }
  306. /**
  307. * 获取已签到的自动回复
  308. * @return string
  309. */
  310. public function getSignedRecommendBookTemplate(){
  311. $user = model('User')->getUserInfo($this->connectUserId);
  312. $output = '';
  313. if($user){
  314. $adminConfig = model('AdminConfig')->getAdminInfoAll($user['channel_id']);
  315. $user['sex'] = ($user['sex'] == '0') ? 1 : $user['sex'];
  316. $channelId = AdminService::instance()->getAdminExtendModel()->getChannelId($adminConfig['admin_id']);
  317. $isWater = WaterBookService::instance()->showBook($channelId,$user['id']);
  318. $recommandBook = model('SignedRecommand')->getBooksBySex($user['sex'],10,$isWater);
  319. $recommandBook = $this->filterDelBook($recommandBook);
  320. $recommandBook = array_slice($recommandBook,0,3);
  321. LogService::info('已经签到的书籍'.json_encode($recommandBook));
  322. //发送消息
  323. $replay = new ReplayTemplate($adminConfig['admin_id']);
  324. $output .= $replay->getSignReplayTemplate("@{$user['nickname']},今天您已经签到过啦,请明天继续签到得书币哦~",null,$recommandBook, $adminConfig['admin_id'], $user);
  325. }else{
  326. $output .='今天您已经签到过啦,请明天继续签到得书币哦~';
  327. }
  328. return $output;
  329. }
  330. /**
  331. * 获取最后一条签到数据
  332. * @return array|false|\PDOStatement|string|Model
  333. */
  334. public function getLastSignData()
  335. {
  336. $data = $this->where('uid',$this->connectUserId)->order('id','desc')->find();
  337. return $data;
  338. }
  339. /**
  340. * 获取昨日签到数据
  341. *
  342. * @return array|false|\PDOStatement|string|Model
  343. */
  344. public function getYesterdaySignData()
  345. {
  346. $data = $this->where('uid', $this->connectUserId)->where('createdate', date('Ymd', time() - 86400))->find();
  347. return $data;
  348. }
  349. /**
  350. * 判断是否是连续的两天
  351. * @param $old_day 时间戳
  352. * @return bool
  353. */
  354. public function isContinueSign($old_day)
  355. {
  356. $oldtime = strtotime(date('Y-m-d', $old_day));
  357. $newtime = strtotime(date('Y-m-d', time()));
  358. if (($newtime - $oldtime) <= 24 * 60 * 60) {
  359. return true;
  360. }
  361. return false;
  362. }
  363. /**
  364. * @param $days 连续签到天数
  365. * @return int 返回应该增加多少书币
  366. */
  367. public function calMoneyByDays($days)
  368. {
  369. switch ($days){
  370. case 1:
  371. $money = 35;
  372. break;
  373. case 2:
  374. $money = 40;
  375. break;
  376. case 3:
  377. $money = 45;
  378. break;
  379. case 4:
  380. $money = 50;
  381. break;
  382. case 5:
  383. $money = 55;
  384. break;
  385. case 6:
  386. $money = 60;
  387. break;
  388. default:
  389. $money = 65;
  390. }
  391. return $money;
  392. }
  393. }