mem_relation.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 16/6/23
  6. * Time: 下午10:28
  7. */
  8. namespace relation;
  9. use \Exception;
  10. use \session_helper;
  11. use \algorithm_helper;
  12. use \errcode;
  13. use \Log;
  14. class mem_relation
  15. {
  16. //member_mobile VARCHAR(11) PRIMARY KEY NOT NULL COMMENT '用户手机号',
  17. //member_id INT(11) DEFAULT '0' COMMENT '已经注册用户id',
  18. //contact_name VARCHAR(50) DEFAULT '',
  19. //subscriber TEXT COMMENT '订阅我为好友的人。',
  20. //follower TEXT COMMENT '我订阅别人成为好友通过的人。',
  21. //build_mobiles TEXT COMMENT '已经与我建立好友关系的手机号',
  22. //unbuild_mobiles TEXT COMMENT '还未与我建立好友关系的手机号'
  23. private $member_id;
  24. private $member_mobile;
  25. private $contact_name;
  26. private $subscriber;
  27. private $new_subscriber;
  28. private $follower;
  29. private $build_mobiles;
  30. private $unbuild_mobiles;
  31. private $mod_relation;
  32. private $dirty;
  33. public function __construct($member_id,$mobile = null,$name = null)
  34. {
  35. Log::record("member_id = {$member_id}",Log::DEBUG);
  36. $this->mod_relation = Model('member_relation');
  37. $member_id = intval($member_id);
  38. if(isset($member_id) && intval($member_id) > 0)
  39. {
  40. $info = $this->mod_relation->findByID($member_id);
  41. if(!empty($info))
  42. {
  43. $this->init($info);
  44. if($this->member_id == 0 && $member_id > 0) {
  45. $this->member_id = $member_id;
  46. $this->dirty = true;
  47. }
  48. if(isset($name) && !empty($name)) {
  49. $this->contact_name = $name;
  50. $this->dirty = true;
  51. }
  52. return;
  53. }
  54. }
  55. if(isset($mobile) && !empty($mobile))
  56. {
  57. $info = $this->mod_relation->findByMobile($mobile);
  58. if(!empty($info))
  59. {
  60. $this->init($info);
  61. if($this->member_id == 0 && $member_id > 0) {
  62. $this->member_id = $member_id;
  63. $this->dirty = true;
  64. }
  65. if($member_id > 0 && isset($name) && !empty($name)) {
  66. $this->contact_name = $name;
  67. $this->dirty = true;
  68. }
  69. return;
  70. }
  71. }
  72. $mobile = session_helper::mobile_valid($mobile);
  73. if($mobile == false) {
  74. throw new Exception("member_relation __construct error",errcode::ErrParamter);
  75. } else {
  76. $this->member_mobile = $mobile;
  77. }
  78. $this->member_id = $member_id;
  79. if(isset($name) && !empty($name)) {
  80. $this->contact_name = $name;
  81. } else {
  82. $this->contact_name = '';
  83. }
  84. $this->dirty = true;
  85. $this->subscriber = array();
  86. $this->new_subscriber = array();
  87. $this->follower = array();
  88. $this->build_mobiles = array();
  89. $this->unbuild_mobiles = array();
  90. }
  91. private function subscribe_me($member_id)
  92. {
  93. $ret = algorithm_helper::bsearch($member_id,$this->subscriber);
  94. if($ret == -1) {
  95. array_push($this->subscriber,$member_id);
  96. sort($this->subscriber);
  97. $this->dirty = true;
  98. }
  99. $ret = algorithm_helper::bsearch($member_id,$this->new_subscriber);
  100. if($ret == -1) {
  101. array_push($this->new_subscriber,$member_id);
  102. sort($this->new_subscriber);
  103. $this->dirty = true;
  104. }
  105. }
  106. private function doSubscribe($member_id,$mobile, $name)
  107. {
  108. $someone = new mem_relation($member_id, $mobile, $name);
  109. $someone->subscribe_me($this->member_id);
  110. $someone->save();
  111. return $someone->member_id;
  112. }
  113. public function subscriber() {
  114. return $this->subscriber;
  115. }
  116. public function follower() {
  117. return $this->follower;
  118. }
  119. public function unfollower() {
  120. return $this->unbuild_mobiles;
  121. }
  122. public function subscribe($member_id,$mobile = null,$name = null)
  123. {
  124. if(!isset($member_id) || intval($member_id) == 0 || $this->member_id == $member_id) {
  125. return false;
  126. }
  127. $someone_id = $this->doSubscribe($member_id,$mobile, $name);
  128. if($someone_id > 0) {
  129. $this->add_fllower($someone_id);
  130. $this->remove_unbuild($mobile);
  131. $this->add_build($mobile);
  132. } else {
  133. $this->add_unbuild($mobile);
  134. }
  135. $this->save();
  136. return true;
  137. }
  138. public function pass_subscribe()
  139. {
  140. if(count($this->new_subscriber) >0) {
  141. $this->dirty = true;
  142. }
  143. else {
  144. return true;
  145. }
  146. foreach ($this->new_subscriber as $someone_id)
  147. {
  148. $someone = new mem_relation($someone_id, null, null);
  149. $someone->add_fllower($this->member_id);
  150. $someone->remove_unbuild($this->member_mobile);
  151. $someone->add_build($this->member_mobile);
  152. $someone->save();
  153. }
  154. $this->new_subscriber = array();
  155. $this->save();
  156. return true;
  157. }
  158. private function subscribed($mobile)
  159. {
  160. if(algorithm_helper::bsearch($mobile,$this->build_mobiles) != -1) {
  161. return true;
  162. }
  163. if(algorithm_helper::bsearch($mobile,$this->unbuild_mobiles) != -1) {
  164. return true;
  165. }
  166. return false;
  167. }
  168. private function add_fllower($someone_id)
  169. {
  170. if(algorithm_helper::bsearch($someone_id,$this->follower) == -1) {
  171. array_push($this->follower,$someone_id);
  172. sort($this->follower);
  173. $this->dirty = true;
  174. }
  175. }
  176. private function add_unbuild($mobile)
  177. {
  178. $pos = algorithm_helper::bsearch($mobile,$this->unbuild_mobiles);
  179. if($pos == -1) {
  180. array_push($this->unbuild_mobiles,$mobile);
  181. sort($this->unbuild_mobiles);
  182. $this->dirty = true;
  183. }
  184. }
  185. private function remove_unbuild($mobile)
  186. {
  187. $pos = algorithm_helper::bsearch($mobile,$this->unbuild_mobiles);
  188. if($pos != -1) {
  189. array_splice($this->unbuild_mobiles,$pos,1);
  190. $this->dirty = true;
  191. }
  192. }
  193. private function add_build($mobile)
  194. {
  195. $ret = algorithm_helper::bsearch($mobile,$this->build_mobiles);
  196. if($ret == -1) {
  197. array_push($this->build_mobiles,$mobile);
  198. sort($this->build_mobiles);
  199. $this->dirty = true;
  200. }
  201. }
  202. public function subscribe_contacts($contacts)
  203. {
  204. foreach ($contacts as $mobile)
  205. {
  206. if($this->member_mobile == $mobile) { //自己不能订阅自己
  207. continue;
  208. }
  209. if($this->subscribed($mobile)) {
  210. continue;
  211. }
  212. $someone_id = $this->doSubscribe(0,$mobile,null);
  213. if($someone_id > 0) {
  214. $this->add_fllower($someone_id);
  215. $this->remove_unbuild($mobile);
  216. $this->add_build($mobile);
  217. } else {
  218. $this->add_unbuild($mobile);
  219. }
  220. }
  221. $this->save();
  222. }
  223. private function save()
  224. {
  225. if($this->dirty) {
  226. $data = array();
  227. $data['member_mobile'] = $this->member_mobile;
  228. $data['member_id'] = $this->member_id;
  229. $data['contact_name'] = $this->contact_name;
  230. $data['subscriber'] = serialize($this->subscriber);
  231. $data['new_subscriber '] = serialize($this->new_subscriber);
  232. $data['follower'] = serialize($this->follower);
  233. $data['build_mobiles'] = serialize($this->build_mobiles);
  234. $data['unbuild_mobiles'] = serialize($this->unbuild_mobiles);
  235. $this->mod_relation->replace($data);
  236. }
  237. }
  238. private function init($info)
  239. {
  240. $this->member_id = intval($info['member_id']);
  241. $this->member_mobile = $info['member_mobile'];
  242. $this->contact_name = $info['contact_name'];
  243. $subscriber = $info['subscriber'];
  244. $new_subscriber = $info['new_subscriber'];
  245. $follower = $info['follower'];
  246. $build_mobiles = $info['build_mobiles'];
  247. $unbuild_mobiles = $info['unbuild_mobiles'];
  248. if(is_null($subscriber) || empty($subscriber)) {
  249. $this->subscriber = array();
  250. } else {
  251. $this->subscriber = unserialize($subscriber);
  252. }
  253. if(is_null($new_subscriber) || empty($new_subscriber)) {
  254. $this->new_subscriber = array();
  255. } else {
  256. $this->new_subscriber = unserialize($new_subscriber);
  257. }
  258. if(is_null($follower) || empty($follower)) {
  259. $this->follower = array();
  260. } else {
  261. $this->follower = unserialize($follower);
  262. }
  263. if(is_null($build_mobiles) || empty($build_mobiles)) {
  264. $this->build_mobiles = array();
  265. } else {
  266. $this->build_mobiles = unserialize($build_mobiles);
  267. }
  268. if(is_null($unbuild_mobiles) || empty($unbuild_mobiles)) {
  269. $this->unbuild_mobiles = array();
  270. } else {
  271. $this->unbuild_mobiles = unserialize($unbuild_mobiles);
  272. }
  273. sort($this->subscriber);
  274. sort($this->new_subscriber);
  275. sort($this->follower);
  276. sort($this->build_mobiles);
  277. sort($this->unbuild_mobiles);
  278. }
  279. }