order.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 2017/11/4
  6. * Time: 下午10:17
  7. */
  8. namespace async_push;
  9. use push_helper;
  10. use order_helper;
  11. use member_info;
  12. use Exception;
  13. use search;
  14. use bonus;
  15. use bonus_helper;
  16. use sms_helper;
  17. use Sms;
  18. use fcode;
  19. use Log;
  20. class simple_order
  21. {
  22. private $info;
  23. public function __construct($order_info) {
  24. $this->info = $order_info;
  25. }
  26. public function user() {
  27. return $this->info['order_info']['buyer_id'];
  28. }
  29. public function discount() {
  30. return $this->info['order_info']['pd_amount'];
  31. }
  32. public function recommend_goods() {
  33. return $this->info['order_goods'][0];
  34. }
  35. public function total() {
  36. return $this->info['order_info']['order_amount'];
  37. }
  38. public function bonus_rates() {
  39. return $this->info['order_info']['bonus_rates'];
  40. }
  41. public function pd_amount() {
  42. return $this->info['order_info']['pd_amount'];
  43. }
  44. public function order_sn() {
  45. return $this->info['order_info']['order_sn'];
  46. }
  47. }
  48. class order extends IPusher
  49. {
  50. private $simple_order;
  51. private $user_info;
  52. private $paysn;
  53. public function __construct($paysn)
  54. {
  55. $this->paysn = $paysn;
  56. $order = $this->order(['pay_sn' => $paysn]);
  57. if(empty($order)) throw new Exception("错误的订单");
  58. $this->simple_order = new simple_order($order);
  59. $user = $this->simple_order->user();
  60. $this->user_info = new member_info($user);
  61. }
  62. public function run() {
  63. }
  64. //支付成功
  65. public function onPaied()
  66. {
  67. push_helper::user_order_paied($this->user_info->member_id(),$this->paysn);
  68. $inviters = search\relation_client::instance()->fetch_inviters(['user_id' => $this->user_info->member_id()]);
  69. $this->notify_paided_goods($inviters);
  70. }
  71. private function notify_paided_goods($inviters)
  72. {
  73. if(empty($inviters)) return false;
  74. $goods = $this->simple_order->recommend_goods();
  75. $level = 0;
  76. $ex_invitee = $this->user_info->member_id();
  77. foreach ($inviters as $inviter)
  78. {
  79. $this->nofity_paied_inviter($inviter,$level,$goods);
  80. $invitees = search\relation_client::instance()->fetch_invitees(['user_id' => $inviter]);
  81. $invitees = $this->ex_user($invitees,$ex_invitee);
  82. $this->nofity_paied_invitees($inviter,$invitees,$level,$goods);
  83. $ex_invitee = $inviter;
  84. $level += 1;
  85. }
  86. return true;
  87. }
  88. private function nofity_paied_inviter($inviter,$level,$goods)
  89. {
  90. push_helper::inviter_order_paied($inviter,$this->user_info->member_id(),$level + 1,$goods);
  91. }
  92. private function nofity_paied_invitees($inviter,$invitees,$level,$goods)
  93. {
  94. foreach ($invitees as $invitee) {
  95. push_helper::invitee_order_paied($invitee,$this->user_info->member_id(),$goods);
  96. }
  97. }
  98. //发货
  99. public function onSended($logistics_no,$logistics_company)
  100. {
  101. $mobile = $this->user_info->mobile();
  102. sms_helper::send_nostore_message($mobile,Sms::order_sended,['company'=> $logistics_company,'logistics'=>$logistics_no,'time'=>'5']);
  103. }
  104. //取消订单
  105. public function onCancel()
  106. {
  107. $pd_amount = $this->simple_order->pd_amount();
  108. $bonus_rates = $this->simple_order->bonus_rates();
  109. if(empty($bonus_rate)) {
  110. $bonus_rates = [30 => $pd_amount];
  111. } else {
  112. $bonus_rates = unserialize($bonus_rates);
  113. }
  114. $params = bonus\parameters::order_cancel($bonus_rates);
  115. foreach ($params as $param)
  116. {
  117. $rate_money = $param['rate_money'];
  118. $ret = bonus_helper::make_bonus($param,$rate_money);
  119. $rate = $rate_money[0]['rate'];
  120. $amount = $rate_money[0]['amount'];
  121. $user = $this->user_info->member_id();
  122. $order_sn = $this->simple_order->order_sn();
  123. if($ret != false) {
  124. $type_sn = $ret['type_sn'];
  125. bonus_helper::send($ret['type_sn'],[$user]);
  126. push_helper::order_cancel_bonus($user,$amount,$rate,$order_sn,$type_sn);
  127. } else {
  128. Log::record("给用户{$user}:order_sn={$order_sn},退款rate={$rate} amount={$amount}失败.");
  129. }
  130. }
  131. Model()->table('order')->where(['order_sn' => $this->simple_order->order_sn()])->update(['pd_amount' => 0,'bonus_rate' => '']);
  132. }
  133. //确认收货
  134. public function onComplete()
  135. {
  136. $num = fcode\operator::unlock($this->paysn);
  137. if($num > 0) {
  138. push_helper::fcode_unlock($this->user_info->member_id(),$num);
  139. }
  140. sms_helper::send_nostore_message($this->user_info->mobile(),Sms::order_received,['time'=>'5']);
  141. $this->send_complete_bonus();
  142. $inviters = search\relation_client::instance()->fetch_inviters(['user_id' => $this->user_info->member_id()]);
  143. $this->notify_complete_inviter($inviters);
  144. }
  145. private function notify_complete_inviter($inviters)
  146. {
  147. if(empty($inviters)) return false;
  148. $level = 0;
  149. $ex_invitee = $this->user_info->member_id();
  150. foreach ($inviters as $inviter)
  151. {
  152. $this->reward_inviter($inviter,$level);
  153. $invitees = search\relation_client::instance()->fetch_invitees(['user_id' => $inviter]);
  154. $invitees = $this->ex_user($invitees,$ex_invitee);
  155. $this->reward_invitees($inviter,$invitees,$level);
  156. $ex_invitee = $inviter;
  157. $level += 1;
  158. }
  159. return true;
  160. }
  161. private function reward_inviter($inviter, $level)
  162. {
  163. $params = bonus\parameters::order_complete_inviter($this->user_info->nickname(),$level);
  164. foreach ($params as $param)
  165. {
  166. $type = bonus_helper::create_type_input($param);
  167. $money = $type->getTotal_amount();
  168. $rate = $type->bonus_rate();
  169. $ret = bonus_helper::make_bonus($param,$param['rate_money']);
  170. if($ret != false) {
  171. $type_sn = $ret['type_sn'];
  172. bonus_helper::send($type_sn,[$inviter]);
  173. push_helper::inviter_order_complete_bonus($inviter,$this->user_info->member_id(),$level + 1,$money,$rate,$type_sn);
  174. } else {
  175. return false;
  176. }
  177. }
  178. return true;
  179. }
  180. private function reward_invitees($inviter, $invitees, $level)
  181. {
  182. if(empty($invitees)) return false;
  183. $num = count($invitees);
  184. $params = bonus\parameters::order_complete_invitee($this->user_info->nickname(),$level,$num);
  185. foreach ($params as $param)
  186. {
  187. $type = bonus_helper::create_type_input($param);
  188. $money = $type->getTotal_amount();
  189. $rate = $type->bonus_rate();
  190. $ret = bonus_helper::make_bonus($param,$param['rate_money']);
  191. if($ret != false) {
  192. $type_sn = $ret['type_sn'];
  193. bonus_helper::send($type_sn,$invitees);
  194. foreach ($invitees as $invitee) {
  195. push_helper::invitee_order_complete_bonus($invitee,$this->user_info,$money / $num,$rate,$type_sn);
  196. }
  197. } else {
  198. return false;
  199. }
  200. }
  201. return true;
  202. }
  203. private function send_complete_bonus()
  204. {
  205. $total_amount = $this->simple_order->total();
  206. $fixed_params = bonus\parameters::order_complete_fixed($total_amount);
  207. foreach ($fixed_params as $param)
  208. {
  209. $ret = bonus_helper::make_bonus($param,$param['rate_money']);
  210. if($ret != false) {
  211. $type_sn = $ret['type_sn'];
  212. $bonus = bonus_helper::send($type_sn, [$this->user_info->member_id()]);
  213. $bonus_value = $bonus[0]['bonus_value'];
  214. $bonus_rate = $bonus[0]['bonus_rate'];
  215. push_helper::user_order_complete_fixed($this->user_info->member_id(),$bonus_value,$bonus_rate,$type_sn);
  216. }
  217. }
  218. $random_params = bonus\parameters::order_complete_random($total_amount);
  219. foreach ($random_params as $param)
  220. {
  221. $ret = bonus_helper::make_bonus($param,$param['rate_money']);
  222. if($ret != false) {
  223. $type_sn = $ret['type_sn'];
  224. bonus_helper::send($type_sn, [$this->user_info->member_id()]);
  225. push_helper::user_order_complete_random($this->user_info->member_id(),$param['rate_money']['num'],$type_sn);
  226. }
  227. }
  228. }
  229. //评论
  230. public function onEvaluate()
  231. {
  232. $this->send_evaluate_bonus();
  233. $inviters = search\relation_client::instance()->fetch_inviters(['user_id' => $this->user_info->member_id()]);
  234. $this->notify_inviter_evaluate($inviters);
  235. }
  236. private function send_evaluate_bonus()
  237. {
  238. $fixed_params = bonus\parameters::order_evaluate_fixed();
  239. foreach ($fixed_params as $param)
  240. {
  241. $ret = bonus_helper::make_bonus($param,$param['rate_money']);
  242. if($ret != false) {
  243. $type_sn = $ret['type_sn'];
  244. $bonus = bonus_helper::send($type_sn, [$this->user_info->member_id()]);
  245. $bonus_value = $bonus[0]['bonus_value'];
  246. $bonus_rate = $bonus[0]['bonus_rate'];
  247. push_helper::order_evaluate_bonus($this->user_info->member_id(),$bonus_value,$bonus_rate,$type_sn);
  248. }
  249. }
  250. }
  251. private function notify_inviter_evaluate($inviters)
  252. {
  253. if(empty($inviters)) return false;
  254. $goods = $this->simple_order->recommend_goods();
  255. $level = 0;
  256. $ex_invitee = $this->user_info->member_id();
  257. foreach ($inviters as $inviter)
  258. {
  259. $this->nofity_evaluate_inviter($inviter,$level,$goods);
  260. $invitees = search\relation_client::instance()->fetch_invitees(['user_id' => $inviter]);
  261. $invitees = $this->ex_user($invitees,$ex_invitee);
  262. $this->nofity_evaluate_invitees($inviter,$invitees,$level,$goods);
  263. $ex_invitee = $inviter;
  264. $level += 1;
  265. }
  266. return true;
  267. }
  268. private function nofity_evaluate_inviter($inviter,$level,$goods)
  269. {
  270. push_helper::inviter_order_evaluated($inviter,$this->user_info->member_id(),$level + 1,$goods);
  271. }
  272. private function nofity_evaluate_invitees($inviter,$invitees,$level,$goods)
  273. {
  274. foreach ($invitees as $invitee) {
  275. push_helper::invitee_order_evaluated($invitee,$this->user_info->member_id(),$goods);
  276. }
  277. }
  278. private function order($condition)
  279. {
  280. $model_order = Model('order');
  281. $order_list = $model_order->getNormalOrderList($condition,0, '*', 'order_id desc', '', ['order_common','order_address', 'order_goods']);
  282. $order_helper = new order_helper($order_list);
  283. $orders = $order_helper->format();
  284. if(!empty($orders)) {
  285. return $orders[0];
  286. } else {
  287. return false;
  288. }
  289. }
  290. }