bonus_helper.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 16/4/11
  6. * Time: 上午12:51
  7. */
  8. require_once (BASE_ROOT_PATH . '/helper/field_helper.php');
  9. require_once (BASE_ROOT_PATH . '/helper/ranklist_helper.php');
  10. require_once (BASE_ROOT_PATH . '/helper/text_filter.php');
  11. require_once (BASE_ROOT_PATH . '/helper/bonus/util.php');
  12. require_once (BASE_ROOT_PATH . '/helper/bonus/type.php');
  13. require_once (BASE_ROOT_PATH . '/helper/bonus/parameters.php');
  14. require_once (BASE_ROOT_PATH . '/helper/bonus/user_bonus.php');
  15. require_once (BASE_ROOT_PATH . '/helper/bonus/generator.php');
  16. require_once (BASE_ROOT_PATH . '/helper/bonus/grab.php');
  17. require_once (BASE_ROOT_PATH . '/helper/bonus/factory.php');
  18. require_once (BASE_ROOT_PATH . '/helper/bonus/manager.php');
  19. require_once (BASE_ROOT_PATH . '/helper/bonus/shaker.php');
  20. require_once (BASE_ROOT_PATH . '/helper/bonus/allocator.php');
  21. require_once (BASE_ROOT_PATH . '/helper/bonus/witholder.php');
  22. require_once (BASE_ROOT_PATH . '/helper/bonus/norate_holder.php');
  23. require_once (BASE_ROOT_PATH . '/helper/bonus/norate_holder.php');
  24. require_once (BASE_ROOT_PATH . '/helper/bonus/open_sharer.php');
  25. require_once (BASE_ROOT_PATH . '/helper/bonus/scaler.php');
  26. require_once (BASE_ROOT_PATH . '/helper/bonus/thief_vilator.php');
  27. require_once (BASE_ROOT_PATH . '/helper/bonus/IMoneyCalc.php');
  28. require_once (BASE_ROOT_PATH . '/helper/bonus/RateMoney.php');
  29. require_once (BASE_ROOT_PATH . '/helper/bonus/BonusAmount.php');
  30. require_once (BASE_ROOT_PATH . '/helper/bonus/account.php');
  31. require_once (BASE_ROOT_PATH . '/helper/bonus/recorder.php');
  32. class bonus_helper
  33. {
  34. const def_bless = '熊猫美妆与你分享美丽的秘密~';
  35. const send_bonus_withold = 1;
  36. const pay_order_withold = 2;
  37. static public function filter_type($type_info)
  38. {
  39. $type = bonus\type::create_by_paramer($type_info);
  40. $ret = $type->get_param();
  41. $ret['time_out'] = bonus\manager::grab_period_timeout;
  42. if($type->binded_over()) {
  43. $ret['binded_over'] = 1;
  44. } else {
  45. $ret['binded_over'] = 0;
  46. }
  47. if($type->isEnd()) {
  48. $ret['is_end'] = 1;
  49. } else {
  50. $ret['is_end'] = 0;
  51. }
  52. $type_sn = $type->getType_sn();
  53. $url = BASE_SITE_URL . "/mobile/index.php?act=bonusex&op=open&client_type=wap&type_sn={$type_sn}";
  54. $ret['url'] = $url;
  55. $detail_url = BASE_SITE_URL . "/mobile/index.php?act=bonusex&op=detail&client_type=wap&type_sn={$type_sn}";
  56. $ret['detail_url'] = $detail_url;
  57. return $ret;
  58. }
  59. static public function filter_bonus($bonus_info)
  60. {
  61. if(empty($bonus_info['user_name'])) {
  62. $bonus_info['user_name'] = substr_replace($bonus_info['user_mobile'], '****', 3, 4);
  63. }
  64. return $bonus_info;
  65. }
  66. static public function isFixed($send_type) {
  67. return ($send_type == bonus\type::SendType_Fixed);
  68. }
  69. static public function isRandom($send_type) {
  70. return ($send_type == bonus\type::SendType_Random);
  71. }
  72. static public function create_type_input($param) {
  73. return bonus\type::create_by_input($param);
  74. }
  75. static public function create_by_paramer($param) {
  76. return bonus\type::create_by_paramer($param);
  77. }
  78. static public function create_type_sn($type_sn) {
  79. return bonus\type::create_by_sn($type_sn);
  80. }
  81. static public function make_bonus($param, $rate_moneys) {
  82. $ret = bonus\factory::make_bonus($param,$rate_moneys);
  83. return $ret;
  84. }
  85. static public function make_vote_type($param, $rate_moneys) {
  86. $ret = bonus\factory::make_vote_type($param,$rate_moneys);
  87. return $ret;
  88. }
  89. static public function last_invite_type($member_id)
  90. {
  91. $mod = Model('bonus_type');
  92. $items = $mod->get(['relayer_id' => $member_id, 'make_type' => bonus\type::MakeInviteType]);
  93. if(empty($items)) {
  94. return null;
  95. } else {
  96. return $items[0];
  97. }
  98. }
  99. static public function get_typeinfo($type_sn)
  100. {
  101. $manager = new bonus\manager();
  102. return $manager->get_typeinfo($type_sn);
  103. }
  104. static public function get_mine_by_typesn($type_sn) {
  105. $manager = new bonus\manager();
  106. return $manager->get_mine_by_typesn($type_sn);
  107. }
  108. static public function get_mine_by_bonussn($bonus_sn) {
  109. $manager = new bonus\manager();
  110. return $manager->get_mine_by_bonussn($bonus_sn);
  111. }
  112. static public function grab_bonus($type_sn)
  113. {
  114. $manager = new bonus\manager();
  115. return $manager->grab_bonus($type_sn);
  116. }
  117. static public function onBinded($bonus_sn,$mobile,$userid)
  118. {
  119. try
  120. {
  121. $bonus = bonus\user_bonus::create_by_sn($bonus_sn);
  122. $type_sn = $bonus->type_sn();
  123. $type = bonus\type::create_by_sn($type_sn);
  124. if($type->grab_type() != bonus\type::GrabType_Invite) return true;
  125. if($userid > 0) {
  126. $member_id = $userid;
  127. }
  128. elseif(!empty($mobile)) {
  129. $loginner = new login\mobile_log($mobile);
  130. if($loginner->ismember() == false) return false;
  131. $member_id = $loginner->memberid();
  132. }
  133. else {
  134. $member_id = 0;
  135. }
  136. if($member_id > 0) {
  137. $mod_member = Model('member');
  138. $mod_member->editMember(['member_id' => $member_id],['invited_bonus' => 1]);
  139. }
  140. return true;
  141. }
  142. catch (Exception $ex) {
  143. Log::record(__METHOD__ . " " . $ex->getMessage(),Log::ERR);
  144. }
  145. }
  146. static public function bind_bonus($bonus_sn,$session_id,$mobile,$userid,&$new_bonus_sn)
  147. {
  148. try
  149. {
  150. $manager = new bonus\manager();
  151. $ret = $manager->bind_bonus($bonus_sn,$session_id,$mobile,$userid,$new_bonus_sn);
  152. if($ret) self::onBinded($bonus_sn,$mobile,$userid);
  153. return $ret;
  154. } catch (Exception $ex) {
  155. return array($ex->getCode(),$ex->getMessage());
  156. }
  157. }
  158. static public function shake($bonus_sn,$strength,$direction)
  159. {
  160. $manager = new bonus\manager();
  161. return $manager->shake($bonus_sn,$strength,$direction);
  162. }
  163. static public function comment($bonus_sn,$comment)
  164. {
  165. try
  166. {
  167. $manager = new bonus\manager();
  168. return $manager->comment($bonus_sn,$comment);
  169. } catch (Exception $ex) {
  170. return false;
  171. }
  172. }
  173. static public function direct_asc() {
  174. return bonus\shaker::direct_asc;
  175. }
  176. static public function direct_dec() {
  177. return bonus\shaker::direct_dec;
  178. }
  179. static public function get_direction($first)
  180. {
  181. if($first) {
  182. return self::direct_asc();
  183. }
  184. else
  185. {
  186. $direct = mt_rand(1,100);
  187. if($direct % 2 == 0) {
  188. return self::direct_asc();
  189. } else {
  190. return self::direct_dec();
  191. }
  192. }
  193. }
  194. static public function check_shake($bonus_sn,&$first)
  195. {
  196. static $shake_expire = 5;
  197. static $shake_maxcount = 5;
  198. if(!isset($_SESSION['bonus_shake'])) {
  199. $_SESSION['bonus_shake'] = [];
  200. }
  201. if(isset($_SESSION['bonus_shake'][$bonus_sn]))
  202. {
  203. $first = false;
  204. $bonus_shake = &$_SESSION['bonus_shake'][$bonus_sn];
  205. $tmout = time() - $bonus_shake['time'];
  206. if($tmout <= $shake_expire) {
  207. return array('code' => errcode::ErrBonus, 'msg' => '请不要摇得太快~');
  208. } elseif($bonus_shake['count'] > $shake_maxcount) {
  209. ++$bonus_shake['count'];
  210. return array('code' => errcode::ErrBonus, 'msg' => '该红包只允许被摇' . $shake_maxcount .'次~');
  211. } else {
  212. return true;
  213. }
  214. }
  215. else
  216. {
  217. $_SESSION['bonus_shake'][$bonus_sn] = [];
  218. $bonus_shake = &$_SESSION['bonus_shake'][$bonus_sn];
  219. $bonus_shake['count'] = 1;
  220. $bonus_shake['time'] = time();
  221. $first = true;
  222. return true;
  223. }
  224. }
  225. static public function withold($member_id,$rates,$used_type)
  226. {
  227. $fsuccess = true;
  228. $total = 0.00;
  229. $holder = self::create_holder($member_id,$used_type);
  230. foreach ($rates as $rate => $money)
  231. {
  232. if($holder->withold($rate,$money) == true) {
  233. $total += $money;
  234. } else {
  235. $fsuccess = false;
  236. }
  237. }
  238. if($fsuccess) {
  239. return true;
  240. }
  241. else {
  242. return $total;
  243. }
  244. }
  245. static public function withold_money($member_id,$rate,$money,$used_type)
  246. {
  247. $holder = self::create_holder($member_id,$used_type);
  248. if($holder->withold($rate,$money) == false) {
  249. Log::record("withold user member_id={$member_id} money={$money}.",Log::ERR);
  250. }
  251. return true;
  252. }
  253. static public function withold_bonus($member_id,$bonus_sn,$rate,$money,$used_type)
  254. {
  255. $holder = self::create_holder($member_id,$used_type);
  256. return $holder->withold_bonus($rate,$bonus_sn,$money);
  257. }
  258. static public function send($type_sn,$member_ids)
  259. {
  260. try
  261. {
  262. $manager = new bonus\manager();
  263. return $manager->send($type_sn,$member_ids);
  264. } catch (Exception $ex) {
  265. return false;
  266. }
  267. }
  268. static public function send_mobile($type_sn, $mobiles,$status)
  269. {
  270. try
  271. {
  272. $manager = new bonus\manager();
  273. return $manager->send_mobile($type_sn,$mobiles,$status);
  274. } catch (Exception $ex) {
  275. return false;
  276. }
  277. }
  278. static public function get_share($share_id = 0) {
  279. return bonus\open_sharer::instance()->get($share_id);
  280. }
  281. static public function can_grab(bonus\type $type,$member_id,$mobile)
  282. {
  283. $grab_type = $type->grab_type();
  284. if($grab_type == bonus\type::GrabType_All) {
  285. return true;
  286. }
  287. elseif($grab_type == bonus\type::GrabType_ExSender)
  288. {
  289. if($type->sender_id() == $member_id) {
  290. return false;
  291. }
  292. if($type->sender_mobile() == $mobile) {
  293. return false;
  294. }
  295. return true;
  296. }
  297. elseif($grab_type == bonus\type::GrabType_Invite)
  298. {
  299. $member_id = intval($member_id);
  300. if($member_id <= 0 && empty($mobile)) return true;
  301. if($member_id > 0)
  302. {
  303. $loginner = new login\memberid_log($member_id);
  304. if(!$loginner->ismember()) return true;
  305. $mInfo = $loginner->member_info();
  306. }
  307. else
  308. {
  309. $loginner = new login\mobile_log($mobile);
  310. if(!$loginner->ismember()) return true;
  311. $mInfo = $loginner->member_info();
  312. }
  313. return ($mInfo->invited_bonus() == false);
  314. }
  315. elseif ($grab_type == bonus\type::GrabType_ExMember)
  316. {
  317. $member_id = intval($member_id);
  318. if($member_id > 0 && !empty($mobile)) {
  319. $cond['member_id|member_mobile'] = ['_multi'=>true,$member_id,$mobile];
  320. }
  321. elseif($member_id > 0) {
  322. $cond['member_id'] = $member_id;
  323. }
  324. elseif(!empty($mobile)) {
  325. $cond['member_mobile'] = $mobile;
  326. }
  327. else {
  328. return true;
  329. }
  330. $items = Model('member')->getMemberInfo($cond);
  331. return (empty($items) == true);
  332. }
  333. else {
  334. return false;
  335. }
  336. }
  337. static public function match_price($rate_moneys)
  338. {
  339. if(empty($rate_moneys)) return false;
  340. $scaler = new bonus\scaler($rate_moneys);
  341. return $scaler->calc();
  342. }
  343. static private function create_holder($member_id,$used_type)
  344. {
  345. if(usedBonusRate()) {
  346. return new bonus\witholder($member_id,$used_type);
  347. } else {
  348. return new bonus\norate_holder($member_id,$used_type);
  349. }
  350. }
  351. static public function bonus_refund($bonus_type)
  352. {
  353. $types = bonus\type::create_by_paramer($bonus_type);
  354. QueueClient::push('onBonusChange', ['change_type' => 'bonus_refund', 'buyer_id' => $types->sender_id(), 'order_sn' => $types->getType_sn()]);
  355. }
  356. }