Fenxiao.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <?php
  2. /**
  3. * Niushop商城系统 - 团队十年电商经验汇集巨献!
  4. * =========================================================
  5. * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
  6. * ----------------------------------------------
  7. * 官方网址: https://www.niushop.com
  8. * =========================================================
  9. */
  10. namespace addon\fenxiao\api\controller;
  11. use addon\fenxiao\model\Config;
  12. use addon\fenxiao\model\Fenxiao as FenxiaoModel;
  13. use addon\fenxiao\model\FenxiaoLevel;
  14. use addon\fenxiao\model\FenxiaoOrder as FenxiaoOrderModel;
  15. use addon\fenxiao\model\Poster;
  16. use addon\fenxiao\model\PosterTemplate as PosterTemplateModel;
  17. use app\api\controller\BaseApi;
  18. use app\model\member\Member;
  19. use Carbon\Carbon;
  20. use think\facade\Db;
  21. /**
  22. * 分销相关信息
  23. */
  24. class Fenxiao extends BaseApi
  25. {
  26. /**
  27. * 获取分销商信息
  28. */
  29. public function detail()
  30. {
  31. $token = $this->checkToken();
  32. if ($token[ 'code' ] < 0) return $this->response($token);
  33. $condition = [
  34. [ 'f.member_id', '=', $this->member_id ]
  35. ];
  36. $model = new FenxiaoModel();
  37. $info = $model->getFenxiaoDetailInfo($condition);
  38. if (empty($info[ 'data' ])) {
  39. $res = $model->autoBecomeFenxiao($this->member_id, $this->site_id);
  40. if (isset($res[ 'code' ]) && $res[ 'code' ] >= 0) {
  41. $info = $model->getFenxiaoDetailInfo($condition);
  42. }
  43. } else {
  44. $member = new Member();
  45. $info[ 'data' ][ 'one_child_num' ] = $member->getMemberCount([ [ 'fenxiao_id', '=', $info[ 'data' ][ 'fenxiao_id' ] ], [ 'is_fenxiao', '=', 0 ] ])[ 'data' ];
  46. $condition_result = $model->geFenxiaoNextLevel($this->member_id, $this->site_id);
  47. $info[ 'data' ][ 'condition' ] = $condition_result[ 'data' ];
  48. }
  49. if (!empty($info[ 'data' ])) {
  50. $fenxiao_order_model = new FenxiaoOrderModel();
  51. // 今日收入
  52. $compare_today = Carbon::today()->timestamp;
  53. $compare_tomorrow = Carbon::tomorrow()->timestamp;
  54. $commission = 0;
  55. $one_commission = $fenxiao_order_model->getFenxiaoOrderInfo([ [ 'one_fenxiao_id', '=', $info[ 'data' ][ 'fenxiao_id' ] ], [ 'create_time', 'between', [ $compare_today, $compare_tomorrow ] ], [ 'is_settlement', '=', 1 ] ], 'sum(one_commission) as commission');
  56. $two_commission = $fenxiao_order_model->getFenxiaoOrderInfo([ [ 'two_fenxiao_id', '=', $info[ 'data' ][ 'fenxiao_id' ] ], [ 'create_time', 'between', [ $compare_today, $compare_tomorrow ] ], [ 'is_settlement', '=', 1 ] ], 'sum(two_commission) as commission');
  57. $three_commission = $fenxiao_order_model->getFenxiaoOrderInfo([ [ 'three_fenxiao_id', '=', $info[ 'data' ][ 'fenxiao_id' ] ], [ 'create_time', 'between', [ $compare_today, $compare_tomorrow ] ], [ 'is_settlement', '=', 1 ] ], 'sum(three_commission) as commission');
  58. if (!empty($one_commission[ 'data' ][ 'commission' ])) $commission += $one_commission[ 'data' ][ 'commission' ];
  59. if (!empty($two_commission[ 'data' ][ 'commission' ])) $commission += $two_commission[ 'data' ][ 'commission' ];
  60. if (!empty($three_commission[ 'data' ][ 'commission' ])) $commission += $three_commission[ 'data' ][ 'commission' ];
  61. $info[ 'data' ][ 'today_commission' ] = $commission;
  62. // 总销售额
  63. $fenxiao_order_info = $fenxiao_order_model->getFenxiaoOrderInfoNew([ [ 'fo.one_fenxiao_id|fo.two_fenxiao_id|fo.three_fenxiao_id', '=', $info[ 'data' ][ 'fenxiao_id' ] ], [ "", 'exp', Db::raw("fo.is_refund=0 or (o.order_status=10 and fo.is_refund=1) ") ] ], 'sum(fo.real_goods_money) as real_goods_money');
  64. $fenxiao_order_info = $fenxiao_order_info[ 'data' ];
  65. if (empty($fenxiao_order_info[ 'real_goods_money' ])) {
  66. $fenxiao_order_info[ 'real_goods_money' ] = 0;
  67. }
  68. $info[ 'data' ][ 'today_order_money' ] = $fenxiao_order_info[ 'real_goods_money' ];
  69. $info[ 'data' ][ 'in_progress_money' ] = 0;
  70. $one_in_progress_commission = $fenxiao_order_model->getFenxiaoOrderInfo([ [ 'one_fenxiao_id', '=', $info[ 'data' ][ 'fenxiao_id' ] ], [ 'is_settlement', '=', 0 ], [ 'is_refund', '=', 0 ] ], 'sum(one_commission) as commission');
  71. $two_in_progress_commission = $fenxiao_order_model->getFenxiaoOrderInfo([ [ 'two_fenxiao_id', '=', $info[ 'data' ][ 'fenxiao_id' ] ], [ 'is_settlement', '=', 0 ], [ 'is_refund', '=', 0 ] ], 'sum(two_commission) as commission');
  72. $three_in_progress_commission = $fenxiao_order_model->getFenxiaoOrderInfo([ [ 'three_fenxiao_id', '=', $info[ 'data' ][ 'fenxiao_id' ] ], [ 'is_settlement', '=', 0 ], [ 'is_refund', '=', 0 ] ], 'sum(three_commission) as commission');
  73. if (!empty($one_in_progress_commission[ 'data' ][ 'commission' ])) $info[ 'data' ][ 'in_progress_money' ] += $one_in_progress_commission[ 'data' ][ 'commission' ];
  74. if (!empty($two_in_progress_commission[ 'data' ][ 'commission' ])) $info[ 'data' ][ 'in_progress_money' ] += $two_in_progress_commission[ 'data' ][ 'commission' ];
  75. if (!empty($three_in_progress_commission[ 'data' ][ 'commission' ])) $info[ 'data' ][ 'in_progress_money' ] += $three_in_progress_commission[ 'data' ][ 'commission' ];
  76. }
  77. return $this->response($info);
  78. }
  79. /**
  80. * 获取推荐人分销商信息
  81. */
  82. public function sourceInfo()
  83. {
  84. $token = $this->checkToken();
  85. if ($token[ 'code' ] < 0) return $this->response($token);
  86. $member = new Member();
  87. $member_info = $member->getMemberInfo([ [ 'member_id', '=', $this->member_id ] ], 'fenxiao_id');
  88. $fenxiao_id = $member_info[ 'data' ][ 'fenxiao_id' ] ?? 0;
  89. if (empty($fenxiao_id)) {
  90. return $this->response($this->error('', 'REQUEST_SOURCE_MEMBER'));
  91. }
  92. $condition = [
  93. [ 'fenxiao_id', '=', $fenxiao_id ]
  94. ];
  95. $model = new FenxiaoModel();
  96. $info = $model->getFenxiaoInfo($condition, 'fenxiao_name');
  97. return $this->response($info);
  98. }
  99. /**
  100. * 获取模板id
  101. * @return false|string
  102. */
  103. public function posterTemplateIds()
  104. {
  105. $token = $this->checkToken();
  106. if ($token[ 'code' ] < 0) return $this->response($token);
  107. $condition = [
  108. [ 'site_id', '=', $this->site_id ],
  109. [ 'template_type', '=', 'fenxiao' ],
  110. [ 'template_status', '=', 1 ],
  111. ];
  112. $condition[] = [ 'template_type', '=', 'fenxiao' ];
  113. $poster_template_model = new PosterTemplateModel();
  114. $list = $poster_template_model->getPosterTemplateList($condition, 'template_id', 'template_id asc')[ 'data' ];
  115. $id_arr = array_column($list, 'template_id');
  116. if (empty($id_arr)) $id_arr = [ 'default' ];
  117. return $this->response($this->success($id_arr));
  118. }
  119. /**
  120. * 分销海报
  121. * @return \app\api\controller\false|string
  122. */
  123. public function poster()
  124. {
  125. $token = $this->checkToken();
  126. if ($token[ 'code' ] < 0) return $this->response($token);
  127. $qrcode_param = isset($this->params[ 'qrcode_param' ]) ? $this->params[ 'qrcode_param' ] : '';//二维码
  128. if (empty($qrcode_param)) {
  129. return $this->response($this->error('', 'REQUEST_QRCODE_PARAM'));
  130. }
  131. $qrcode_param = json_decode($qrcode_param, true);
  132. $qrcode_param[ 'source_member' ] = $this->member_id;
  133. $poster = new Poster();
  134. $param = $this->params;
  135. $param[ 'qrcode_param' ] = $qrcode_param;
  136. $res = $poster->getFenxiaoPoster($param);
  137. return $this->response($res);
  138. }
  139. /**
  140. * 分销商等级信息
  141. */
  142. public function level()
  143. {
  144. $token = $this->checkToken();
  145. if ($token[ 'code' ] < 0) return $this->response($token);
  146. $level = $this->params[ 'level' ] ?? 0;
  147. $condition = [
  148. [ 'level_id', '=', $level ]
  149. ];
  150. $model = new FenxiaoLevel();
  151. $info = $model->getLevelInfo($condition);
  152. return $this->response($info);
  153. }
  154. /**
  155. * 分销商我的团队
  156. */
  157. public function team()
  158. {
  159. $token = $this->checkToken();
  160. if ($token[ 'code' ] < 0) return $this->response($token);
  161. $page = $this->params[ 'page' ] ?? 1;
  162. $page_size = $this->params[ 'page_size' ] ?? PAGE_LIST_ROWS;
  163. $level = $this->params[ 'level' ] ?? 1;
  164. $is_pay = $this->params[ 'is_pay' ] ?? 0;
  165. $model = new FenxiaoModel();
  166. $fenxiao_info = $model->getFenxiaoInfo([ [ 'member_id', '=', $this->member_id ] ], 'fenxiao_id');
  167. if (empty($fenxiao_info[ 'data' ])) return $this->response($this->error('', 'MEMBER_NOT_IS_FENXIAO'));
  168. $list = $model->getFenxiaoTeam($level, $fenxiao_info[ 'data' ][ 'fenxiao_id' ], $page, $page_size, $is_pay);
  169. return $this->response($list);
  170. }
  171. /**
  172. * 查询我的团队的数量
  173. */
  174. public function teamNum()
  175. {
  176. $token = $this->checkToken();
  177. if ($token[ 'code' ] < 0) return $this->response($token);
  178. $model = new FenxiaoModel();
  179. $fenxiao_info = $model->getFenxiaoInfo([ [ 'member_id', '=', $this->member_id ] ], 'fenxiao_id');
  180. if (empty($fenxiao_info[ 'data' ])) return $this->response($this->error('', 'MEMBER_NOT_IS_FENXIAO'));
  181. $data = $model->getFenxiaoTeamNum($fenxiao_info[ 'data' ][ 'fenxiao_id' ], $this->site_id);
  182. return $this->response($data);
  183. }
  184. /**
  185. * 获取下级分销商订单
  186. * @return false|string
  187. */
  188. public function getOrder()
  189. {
  190. $token = $this->checkToken();
  191. if ($token[ 'code' ] < 0) return $this->response($token);
  192. $model = new FenxiaoModel();
  193. $fenxiao_info = $model->getFenxiaoInfo([ [ 'member_id', '=', $this->member_id ] ], 'fenxiao_id');
  194. if (empty($fenxiao_info[ 'data' ])) return $this->response($this->error('', 'MEMBER_NOT_IS_FENXIAO'));
  195. $fenxiao_info = $fenxiao_info[ 'data' ];
  196. $page = $this->params[ 'page' ] ?? 1;
  197. $page_size = $this->params[ 'page_size' ] ?? PAGE_LIST_ROWS;
  198. $fenxiao_id = $this->params[ 'fenxiao_id' ] ?? 0;
  199. $sub_member_id = $this->params[ 'sub_member_id' ] ?? 0;
  200. if (!empty($fenxiao_id)) {
  201. $sub_fenxiao_info = $model->getFenxiaoInfo([ [ 'fenxiao_id', '=', $fenxiao_id ] ], 'fenxiao_id,member_id')[ 'data' ];
  202. if (empty($sub_fenxiao_info)) return $this->response($this->error('', 'MEMBER_NOT_IS_FENXIAO'));
  203. $condition = [
  204. [ '', 'exp', Db::raw("( (fo.one_fenxiao_id = {$fenxiao_info['fenxiao_id']} AND fo.two_fenxiao_id = {$fenxiao_id}) OR (fo.two_fenxiao_id = {$fenxiao_info['fenxiao_id']} AND fo.three_fenxiao_id = {$fenxiao_id})) OR fo.member_id = {$sub_fenxiao_info['member_id']}") ]
  205. ];
  206. } elseif (!empty($sub_member_id)) {
  207. $is_sub_member = model('member')->getCount([ [ 'member_id', '=', $sub_member_id ], [ 'fenxiao_id', '=', $fenxiao_info[ 'fenxiao_id' ] ] ]);
  208. if (!$is_sub_member) return $this->response($this->error('', 'NOT_EXIST_FENXIAO_RELATION'));
  209. $condition = [
  210. [ 'fo.one_fenxiao_id', '=', $fenxiao_info[ 'fenxiao_id' ] ],
  211. [ 'fo.member_id', '=', $sub_member_id ]
  212. ];
  213. }
  214. $order_model = new FenxiaoOrderModel();
  215. $list = $order_model->getFenxiaoOrderPageList($condition, $page, $page_size, 'fo.fenxiao_order_id desc');
  216. if (!empty($list[ 'data' ][ 'list' ])) {
  217. foreach ($list[ 'data' ][ 'list' ] as $k => $item) {
  218. if ($item[ 'one_fenxiao_id' ] == $fenxiao_info[ 'fenxiao_id' ]) {
  219. $list[ 'data' ][ 'list' ][ $k ][ 'commission' ] = $item[ 'one_commission' ];
  220. $list[ 'data' ][ 'list' ][ $k ][ 'commission_level' ] = 1;
  221. } elseif ($item[ 'two_fenxiao_id' ] == $fenxiao_info[ 'fenxiao_id' ]) {
  222. $list[ 'data' ][ 'list' ][ $k ][ 'commission' ] = $item[ 'two_commission' ];
  223. $list[ 'data' ][ 'list' ][ $k ][ 'commission_level' ] = 2;
  224. } elseif ($item[ 'three_fenxiao_id' ] == $fenxiao_info[ 'fenxiao_id' ]) {
  225. $list[ 'data' ][ 'list' ][ $k ][ 'commission' ] = $item[ 'three_commission' ];
  226. $list[ 'data' ][ 'list' ][ $k ][ 'commission_level' ] = 3;
  227. }
  228. $list[ 'data' ][ 'list' ][ $k ] = array_diff_key($list[ 'data' ][ 'list' ][ $k ], [ 'one_fenxiao_id' => '', 'one_rate' => '', 'one_commission' => '', 'one_fenxiao_name' => '', 'two_fenxiao_id' => '', 'two_rate' => '', 'two_commission' => '', 'two_fenxiao_name' => '', 'three_fenxiao_id' => '', 'three_rate' => '', 'three_commission' => '', 'three_fenxiao_name' => '' ]);
  229. }
  230. }
  231. return $this->response($list);
  232. }
  233. /**
  234. * 排行榜
  235. */
  236. public function rankingList()
  237. {
  238. $token = $this->checkToken();
  239. if ($token[ 'code' ] < 0) return $this->response($token);
  240. $type = $this->params[ 'type' ] ?? 'profit'; // 排行榜 profit:按受益 invited_num:按邀请人数
  241. $page = $this->params[ 'page' ] ?? 1;
  242. $page_size = $this->params[ 'page_size' ] ?? PAGE_LIST_ROWS;
  243. $model = new FenxiaoModel();
  244. $condition = [
  245. [ 'f.site_id', '=', $this->site_id ],
  246. [ 'f.is_delete', '=', 0 ]
  247. ];
  248. $order = $type == 'profit' ? 'f.total_commission desc' : Db::raw('(f.one_child_num + f.one_child_fenxiao_num) desc');
  249. $field = 'f.total_commission, (f.one_child_num + f.one_child_fenxiao_num) as child_num, m.nickname,m.headimg';
  250. $data = $model->getFenxiaoPageLists($condition, $page, $page_size, $order, $field, 'f', [ [ 'member m', 'm.member_id = f.member_id', 'inner' ] ]);
  251. return $this->response($data);
  252. }
  253. /**
  254. * 获取排名
  255. * @return false|string
  256. */
  257. public function ranking()
  258. {
  259. $token = $this->checkToken();
  260. if ($token[ 'code' ] < 0) return $this->response($token);
  261. $type = $this->params[ 'type' ] ?? 'invited_num'; // 排行榜 profit:按受益 invited_num:按邀请人数
  262. $model = new FenxiaoModel();
  263. $fenxiao_info = $model->getFenxiaoInfo([ [ 'member_id', '=', $this->member_id ] ], 'fenxiao_id')[ 'data' ];
  264. if (empty($fenxiao_info)) return $this->response($this->error('', 'MEMBER_NOT_IS_FENXIAO'));
  265. $order = $type == 'profit' ? 'total_commission' : '(one_child_num + one_child_fenxiao_num)';
  266. $data = $model->getFenxiaoRanking($this->site_id, $fenxiao_info[ 'fenxiao_id' ], $order);
  267. return $this->response($data);
  268. }
  269. /**
  270. * 子级分销商
  271. */
  272. public function childFenxiao()
  273. {
  274. $token = $this->checkToken();
  275. if ($token[ 'code' ] < 0) return $this->response($token);
  276. $page = $this->params[ 'page' ] ?? 1;
  277. $page_size = $this->params[ 'page_size' ] ?? PAGE_LIST_ROWS;
  278. $model = new FenxiaoModel();
  279. $fenxiao_info = $model->getFenxiaoInfo([ [ 'member_id', '=', $this->member_id ] ], 'fenxiao_id')[ 'data' ];
  280. if (empty($fenxiao_info)) return $this->response($this->error('', 'MEMBER_NOT_IS_FENXIAO'));
  281. $parent_fenxiao_id = [ $fenxiao_info[ 'fenxiao_id' ] ]; // 上级分销商id集合
  282. // 查询分销基础配置
  283. $config_model = new Config();
  284. $fenxiao_basic_config = $config_model->getFenxiaoBasicsConfig($this->site_id)[ 'data' ][ 'value' ];
  285. $level = $fenxiao_basic_config[ 'level' ];
  286. if ($level == 2) {
  287. // 二级分销商id集合
  288. $one_level_fenxiao = model('fenxiao')->getColumn([ [ 'parent', '=', $fenxiao_info[ 'fenxiao_id' ] ] ], 'fenxiao_id');
  289. if (!empty($one_level_fenxiao)) {
  290. $parent_fenxiao_id = array_merge($parent_fenxiao_id, $one_level_fenxiao);
  291. }
  292. }
  293. $condition = [
  294. [ 'f.site_id', '=', $this->site_id ],
  295. [ 'f.parent', 'in', $parent_fenxiao_id ],
  296. [ 'm.is_delete', '=', 0 ]
  297. ];
  298. $field = 'm.nickname,m.headimg,m.member_id,m.order_num,m.order_money,f.fenxiao_id,f.audit_time,f.level_name,m.is_fenxiao,m.bind_fenxiao_time,f.one_child_num,f.one_child_fenxiao_num';
  299. $join = [ [ 'member m', 'm.member_id = f.member_id', 'inner' ] ];
  300. $res = $model->getFenxiaoPageLists($condition, $page, $page_size, 'f.audit_time desc', $field, 'f', $join);
  301. return $this->response($res);
  302. }
  303. }