Sign.php 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <?php
  2. /**
  3. * Sign.php UTF-8
  4. * 签到
  5. *
  6. * @date : 2018/5/4 19:33
  7. *
  8. * @license 这不是一个自由软件,未经授权不许任何使用和传播。
  9. * @author : wuyonghong <wyh@huosdk.com>
  10. * @version : HUOSDK 8.0
  11. */
  12. namespace huo\controller\sign;
  13. use huo\controller\common\Base;
  14. use huo\controller\integral\MemIntegral;
  15. use huo\controller\member\MemCache;
  16. use huo\model\sign\MemSignModel;
  17. use huo\model\sign\SignRewordModel;
  18. use huolib\constant\IaConst;
  19. use huolib\constant\MemItgConst;
  20. use huolib\status\SignStatus;
  21. use huolib\tool\Time;
  22. use think\Cache;
  23. class Sign extends Base {
  24. /**
  25. * 玩家签到
  26. *
  27. * @param int $mem_id 玩家ID
  28. * @param int $app_id 应用ID
  29. *
  30. * @return array
  31. */
  32. public function sign($mem_id, $app_id = 0) {
  33. /* 判断是否已经签到 */
  34. $_mc_class = MemCache::ins();
  35. $_me_data = $_mc_class->getMeInfoById($mem_id);
  36. $_last_sign_time = $_me_data['last_sign_time'];
  37. $_rs = self::isSignToday($_last_sign_time);
  38. if (true == $_rs) {
  39. /* 玩家已签到 */
  40. $_code = SignStatus::SIGN_HAS_SIGN;
  41. return $this->huoError($_code, SignStatus::getMsg($_code));
  42. }
  43. list($_sign_days, $_last_sign_time) = self::getSignDaysAndTime(
  44. $_me_data['sign_days'], $_me_data['last_sign_time']
  45. );
  46. $_me_data['sign_days'] = $_sign_days + 1;
  47. $_me_data['last_sign_time'] = time();
  48. $_rs = $_mc_class->updateMeCache($mem_id, $_me_data);
  49. if (false == $_rs) {
  50. $_code = SignStatus::UNKNOWN_ERROR;
  51. return $this->huoError($_code, SignStatus::getMsg($_code));
  52. }
  53. /* 签到完后 更新签到表 */
  54. $_sign_days = $_me_data['sign_days'];
  55. $_integral = $this->getReword($_sign_days);
  56. $_sign_id = $this->insertSignLog($mem_id, $_sign_days, $_integral);
  57. if (false == $_sign_id) {
  58. $_code = SignStatus::INNER_ERROR;
  59. return $this->huoError($_code, SignStatus::getMsg($_code));
  60. }
  61. $_rs = (new MemIntegral())->addMemItg(
  62. $mem_id,
  63. $_integral,
  64. IaConst::IA_SIGN,
  65. $app_id,
  66. 'mem_sign',
  67. $_sign_id,
  68. '',
  69. $app_id
  70. );
  71. if (SignStatus::NO_ERROR != $_rs) {
  72. $_code = $_rs;
  73. return $this->huoError($_code, SignStatus::getMsg($_rs));
  74. }
  75. /* 更新签到时间 */
  76. $_code = SignStatus::NO_ERROR;
  77. $_rdata['my_integral'] = $_me_data['my_integral'] + $_integral;
  78. $_rdata['gain_integral'] = $_integral;
  79. $_rdata['sign_days'] = $_sign_days;
  80. return $this->huoSuccess($_code, SignStatus::getMsg($_code), $_rdata);
  81. }
  82. /**
  83. *
  84. * @param int $mem_id
  85. * @param int $sign_days
  86. * @param float $integral
  87. *
  88. * @return bool|int|string
  89. */
  90. public function insertSignLog($mem_id, $sign_days, $integral) {
  91. $_sign_log['mem_id'] = $mem_id;
  92. $_sign_log['sign_days'] = $sign_days;
  93. $_sign_log['integral'] = $integral;
  94. return (new MemSignModel())->insertLog($_sign_log, true);
  95. }
  96. /**
  97. * 获取积分数量
  98. *
  99. * @param int $sign_days
  100. *
  101. * @return int
  102. */
  103. public function getReword($sign_days = 0) {
  104. $_sc_data = $this->getSignConf();
  105. if (empty($sign_days)) {
  106. return 0;
  107. }
  108. return $_sc_data[$sign_days]['integral'];
  109. }
  110. /**
  111. * 获取签到周期开始时间与结束时间
  112. */
  113. public static function getStartEnd() {
  114. return Time::week();
  115. }
  116. /**
  117. * 获取签到天数与签到时间
  118. *
  119. * @param $sign_days
  120. * @param $last_sign_time
  121. *
  122. * @return array sign_day last_sign_time
  123. */
  124. public static function getSignDaysAndTime($sign_days, $last_sign_time) {
  125. $_sign_days = $sign_days;
  126. $_last_sign_time = $last_sign_time;
  127. $_rs = self::isSignToday($last_sign_time);
  128. if (false == $_rs) {
  129. /* 今日未签到 */
  130. list($_start_time, $_end_time) = self::getStartEnd();
  131. if ($last_sign_time < $_start_time) {
  132. $_sign_days = 0;
  133. $_last_sign_time = 0;
  134. } elseif ($last_sign_time > $_start_time && $last_sign_time < $_end_time) {
  135. /* 周期内 */
  136. if ($_sign_days > MemItgConst::SIGN_DAY_CIRCLE) {
  137. $_sign_days %= MemItgConst::SIGN_DAY_CIRCLE;
  138. }
  139. }
  140. }
  141. return [$_sign_days, $_last_sign_time];
  142. }
  143. /**
  144. * 今日是否已经签到
  145. *
  146. * @param int $last_sign_time 判断今日是否已经签到
  147. *
  148. * @return bool
  149. */
  150. public static function isSignToday($last_sign_time = 0) {
  151. list($_start_time, $_end_time) = Time::today();
  152. if ($last_sign_time >= $_start_time && $last_sign_time < $_end_time) {
  153. return true;
  154. }
  155. return false;
  156. }
  157. /**
  158. *获取签到配置KEY
  159. *
  160. * @return string
  161. */
  162. public function getSignConfKey() {
  163. return 'sign_conf';
  164. }
  165. /**
  166. * @return array|bool
  167. */
  168. public function getSignConf() {
  169. $_key = $this->getSignConfKey();
  170. $_sc_data_json = Cache::get($_key);
  171. $_sc_data = json_decode($_sc_data_json, true);
  172. if (!is_array($_sc_data)) {
  173. $_sc_data = $_sc_data_json;
  174. }
  175. if (!is_array($_sc_data) || empty($_sc_data)) {
  176. $_sc_data = (new SignRewordModel())->getConf();
  177. if (empty($_sc_data)) {
  178. return false;
  179. }
  180. $this->saveSignConf($_sc_data);
  181. }
  182. return $_sc_data;
  183. }
  184. /**
  185. * 保存玩家cache 数据
  186. *
  187. * @param $sc_data
  188. * @param int $ttl
  189. */
  190. public function saveSignConf($sc_data, $ttl = 3600) {
  191. $_key = $this->getSignConfKey();
  192. Cache::set($_key, json_encode($sc_data), $ttl);
  193. }
  194. /**
  195. * 更新帐号信息
  196. *
  197. * @param $sc_id
  198. * @param $sc_data
  199. *
  200. * @return bool
  201. */
  202. public function updateSignConf($sc_id, $sc_data) {
  203. $_key = $this->getSignConfKey();
  204. Cache::rm($_key);
  205. return (new SignRewordModel())->updateConf($sc_data, $sc_id);
  206. }
  207. }