order.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: stanley-king
  5. * Date: 2017/11/4
  6. * Time: 下午10:17
  7. */
  8. namespace async;
  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 IAsync
  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. $i = 0;
  95. foreach ($invitees as $invitee)
  96. {
  97. if($i < self::max_level_pushs) {
  98. push_helper::invitee_order_paied($invitee, $this->user_info->member_id(), $goods);
  99. }
  100. $i++;
  101. }
  102. }
  103. //发货
  104. public function onSended($logistics_no,$logistics_company)
  105. {
  106. $mobile = $this->user_info->mobile();
  107. sms_helper::send_nostore_message($mobile,Sms::order_sended,['company'=> $logistics_company,'logistics'=>$logistics_no,'time'=>'5']);
  108. }
  109. //取消订单
  110. public function onCancel()
  111. {
  112. $pd_amount = $this->simple_order->pd_amount();
  113. $bonus_rates = $this->simple_order->bonus_rates();
  114. if(empty($bonus_rates)) {
  115. $bonus_rates = [30 => $pd_amount];
  116. }
  117. else
  118. {
  119. $tmp = [];
  120. foreach ($bonus_rates as $val) {
  121. $rate = $val['rate'];
  122. $amount = $val['total'];
  123. $tmp[$rate] = $amount;
  124. }
  125. $bonus_rates = $tmp;
  126. }
  127. $params = bonus\parameters::order_cancel($bonus_rates);
  128. foreach ($params as $param)
  129. {
  130. $rate_money = $param['rate_money'];
  131. $ret = bonus_helper::make_bonus($param,$rate_money);
  132. $rate = $rate_money[0]['rate'];
  133. $amount = $rate_money[0]['amount'];
  134. $user = $this->user_info->member_id();
  135. $order_sn = $this->simple_order->order_sn();
  136. if($ret != false) {
  137. $type_sn = $ret['type_sn'];
  138. bonus_helper::send($ret['type_sn'],[$user]);
  139. push_helper::order_cancel_bonus($user,$amount,$rate,$order_sn,$type_sn);
  140. } else {
  141. Log::record("给用户{$user}:order_sn={$order_sn},退款rate={$rate} amount={$amount}失败.");
  142. }
  143. }
  144. Model()->table('order')->where(['order_sn' => $this->simple_order->order_sn()])->update(['pd_amount' => 0,'bonus_rate' => '']);
  145. }
  146. //确认收货
  147. public function onComplete()
  148. {
  149. $num = fcode\operator::unlock($this->paysn);
  150. if($num > 0) {
  151. push_helper::fcode_unlock($this->user_info->member_id(),$num);
  152. }
  153. sms_helper::send_nostore_message($this->user_info->mobile(),Sms::order_received,['time'=>'5']);
  154. $this->send_complete_bonus();
  155. $inviters = search\relation_client::instance()->fetch_inviters(['user_id' => $this->user_info->member_id()]);
  156. $this->notify_complete_inviter($inviters);
  157. }
  158. private function notify_complete_inviter($inviters)
  159. {
  160. if(empty($inviters)) return false;
  161. $level = 0;
  162. $ex_invitee = $this->user_info->member_id();
  163. foreach ($inviters as $inviter)
  164. {
  165. $this->reward_inviter($inviter,$level);
  166. $invitees = search\relation_client::instance()->fetch_invitees(['user_id' => $inviter]);
  167. $invitees = $this->ex_user($invitees,$ex_invitee);
  168. $this->reward_invitees($inviter,$invitees,$level);
  169. $ex_invitee = $inviter;
  170. $level += 1;
  171. }
  172. return true;
  173. }
  174. private function reward_inviter($inviter, $level)
  175. {
  176. $params = bonus\parameters::order_complete_inviter($this->user_info->nickname(),$level);
  177. foreach ($params as $param)
  178. {
  179. $type = bonus_helper::create_type_input($param);
  180. $money = $type->getTotal_amount();
  181. $rate = $type->bonus_rate();
  182. $ret = bonus_helper::make_bonus($param,$param['rate_money']);
  183. if($ret != false) {
  184. $type_sn = $ret['type_sn'];
  185. bonus_helper::send($type_sn,[$inviter]);
  186. push_helper::inviter_order_complete_bonus($inviter,$this->user_info->member_id(),$level + 1,$money,$rate,$type_sn);
  187. $this->add_reward($inviter,$money);
  188. } else {
  189. return false;
  190. }
  191. }
  192. return true;
  193. }
  194. private function reward_invitees($inviter, $invitees, $level)
  195. {
  196. if(empty($invitees)) return false;
  197. $num = count($invitees);
  198. $params = bonus\parameters::order_complete_invitee($this->user_info->nickname(),$level,$num);
  199. foreach ($params as $param)
  200. {
  201. $type = bonus_helper::create_type_input($param);
  202. $money = $type->getTotal_amount();
  203. $rate = $type->bonus_rate();
  204. $ret = bonus_helper::make_bonus($param,$param['rate_money']);
  205. if($ret != false)
  206. {
  207. $type_sn = $ret['type_sn'];
  208. bonus_helper::send($type_sn,$invitees);
  209. $i = 0;
  210. foreach ($invitees as $invitee)
  211. {
  212. $amount = $money / $num;
  213. $this->add_reward($invitee,$amount);
  214. if($i < self::max_level_pushs) {
  215. push_helper::invitee_order_complete_bonus($invitee,$this->user_info,$amount,$rate,$type_sn);
  216. }
  217. $i++;
  218. }
  219. }
  220. else {
  221. return false;
  222. }
  223. }
  224. return true;
  225. }
  226. private function send_complete_bonus()
  227. {
  228. $total_amount = $this->simple_order->total();
  229. $fixed_params = bonus\parameters::order_complete_fixed($total_amount);
  230. foreach ($fixed_params as $param)
  231. {
  232. $ret = bonus_helper::make_bonus($param,$param['rate_money']);
  233. if($ret != false) {
  234. $type_sn = $ret['type_sn'];
  235. $bonus = bonus_helper::send($type_sn, [$this->user_info->member_id()]);
  236. $bonus_value = $bonus[0]['bonus_value'];
  237. $bonus_rate = $bonus[0]['bonus_rate'];
  238. push_helper::user_order_complete_fixed($this->user_info->member_id(),$bonus_value,$bonus_rate,$type_sn);
  239. }
  240. }
  241. $random_params = bonus\parameters::order_complete_random($total_amount);
  242. foreach ($random_params as $param)
  243. {
  244. $ret = bonus_helper::make_bonus($param,$param['rate_money']);
  245. if($ret != false) {
  246. $type_sn = $ret['type_sn'];
  247. bonus_helper::send($type_sn, [$this->user_info->member_id()]);
  248. push_helper::user_order_complete_random($this->user_info->member_id(),$param['rate_money']['num'],$type_sn);
  249. }
  250. }
  251. }
  252. //评论
  253. public function onEvaluate()
  254. {
  255. $this->send_evaluate_bonus();
  256. $inviters = search\relation_client::instance()->fetch_inviters(['user_id' => $this->user_info->member_id()]);
  257. $this->notify_inviter_evaluate($inviters);
  258. }
  259. private function send_evaluate_bonus()
  260. {
  261. $fixed_params = bonus\parameters::order_evaluate_fixed();
  262. foreach ($fixed_params as $param)
  263. {
  264. $ret = bonus_helper::make_bonus($param,$param['rate_money']);
  265. if($ret != false) {
  266. $type_sn = $ret['type_sn'];
  267. $bonus = bonus_helper::send($type_sn, [$this->user_info->member_id()]);
  268. $bonus_value = $bonus[0]['bonus_value'];
  269. $bonus_rate = $bonus[0]['bonus_rate'];
  270. push_helper::order_evaluate_bonus($this->user_info->member_id(),$bonus_value,$bonus_rate,$type_sn);
  271. }
  272. }
  273. }
  274. private function notify_inviter_evaluate($inviters)
  275. {
  276. if(empty($inviters)) return false;
  277. $goods = $this->simple_order->recommend_goods();
  278. $level = 0;
  279. $ex_invitee = $this->user_info->member_id();
  280. foreach ($inviters as $inviter)
  281. {
  282. $this->nofity_evaluate_inviter($inviter,$level,$goods);
  283. $invitees = search\relation_client::instance()->fetch_invitees(['user_id' => $inviter]);
  284. $invitees = $this->ex_user($invitees,$ex_invitee);
  285. $this->nofity_evaluate_invitees($inviter,$invitees,$level,$goods);
  286. $ex_invitee = $inviter;
  287. $level += 1;
  288. }
  289. return true;
  290. }
  291. private function nofity_evaluate_inviter($inviter,$level,$goods)
  292. {
  293. push_helper::inviter_order_evaluated($inviter,$this->user_info->member_id(),$level + 1,$goods);
  294. }
  295. private function nofity_evaluate_invitees($inviter,$invitees,$level,$goods)
  296. {
  297. $i = 0;
  298. foreach ($invitees as $invitee)
  299. {
  300. if($i < self::max_level_pushs) {
  301. push_helper::invitee_order_evaluated($invitee,$this->user_info->member_id(),$goods);
  302. }
  303. $i++;
  304. }
  305. }
  306. private function order($condition)
  307. {
  308. $model_order = Model('order');
  309. $order_list = $model_order->getNormalOrderList($condition,0, '*', 'order_id desc', '', ['order_common','order_address', 'order_goods']);
  310. $order_helper = new order_helper($order_list);
  311. $orders = $order_helper->format();
  312. if(!empty($orders)) {
  313. return $orders[0];
  314. } else {
  315. return false;
  316. }
  317. }
  318. }