AgentUserController.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. <?php
  2. namespace addons\CloudStockTwo\api\modules\v1\controllers;
  3. use addons\CloudStockTwo\common\enums\CloudStockTwoEnum;
  4. use addons\CloudStockTwo\common\models\CloudStockTwoAgent;
  5. use addons\CloudStockTwo\common\models\CloudStockTwoAgentGoods;
  6. use addons\CloudStockTwo\common\models\CloudStockTwoAgentQuota;
  7. use addons\CloudStockTwo\common\models\CloudStockTwoDeductionDetail;
  8. use addons\CloudStockTwo\common\models\CloudStockTwoGoodsStockLog;
  9. use addons\CloudStockTwo\common\models\CloudStockTwoIncreaseDetail;
  10. use addons\CloudStockTwo\common\models\CloudStockTwoLevel;
  11. use addons\CloudStockTwo\common\models\CloudStockTwoSetAgentLog;
  12. use common\enums\AddonsEnum;
  13. use common\enums\StatusEnum;
  14. use common\helpers\ArrayHelper;
  15. use common\helpers\DateHelper;
  16. use common\models\common\CommissionLog;
  17. use common\models\user\User;
  18. use common\models\user\UserPartitionRelationship;
  19. class AgentUserController extends BaseController
  20. {
  21. public $modelClass = '';
  22. /**
  23. * 不用进行登录验证的方法
  24. *
  25. * 例如: ['index', 'update', 'create', 'view', 'delete']
  26. * 默认全部需要验证
  27. *
  28. * @var array
  29. */
  30. protected $authOptional = [];
  31. /**
  32. * @name:
  33. * @msg: 我的供应商
  34. * @param {*}
  35. * @return {*}
  36. */
  37. public function actionMySupplier()
  38. {
  39. if (!\Yii::$app->request->isGet) {
  40. return $this->error('请求方式错误');
  41. }
  42. $parent_agent = CloudStockTwoAgent::getUserParentAgent($this->user_id, $this->stock_agent->level);
  43. if (!empty($parent_agent)) {
  44. $parent_user = User::find()
  45. ->select('id,nickname,mobile,avatar_url,inviter_at')
  46. ->where(['mall_id' => $this->mall_id, 'id' => $parent_agent->user_id, 'status' => StatusEnum::ENABLED])
  47. ->one();
  48. $parent_agent_info = [
  49. 'id' => $parent_agent->id,
  50. 'user_id' => $parent_agent->user_id,
  51. 'level' => $parent_agent->level,
  52. 'level_name' => $parent_agent->stockLevel->name,
  53. 'nickname' => $parent_user->nickname ?? '平台',
  54. 'avatar_url' => $parent_user->avatar_url ?? \Yii::$app->request->hostInfo . '/resources/img/default_avatar_url.png',
  55. 'mobile' => $parent_user->mobile ?? '',
  56. ];
  57. } else {
  58. $parent_agent_info = [
  59. 'id' => 0,
  60. 'user_id' => 0,
  61. 'level' => 0,
  62. 'level_name' => '默认等级',
  63. 'nickname' => '平台',
  64. 'avatar_url' => \Yii::$app->request->hostInfo . '/resources/img/default_avatar_url.png',
  65. 'mobile' => '',
  66. ];
  67. }
  68. return $this->success('success', $parent_agent_info);
  69. }
  70. /**
  71. * @name:
  72. * @msg: 我的批发商列表
  73. * @param {*}
  74. * @return {*}
  75. */
  76. public function actionWholesalerList()
  77. {
  78. if (!\Yii::$app->request->isGet) {
  79. return $this->error('请求方式错误');
  80. }
  81. $page = \Yii::$app->request->get('page', 1);
  82. $limit = \Yii::$app->request->get('limit', $this->pageSize);
  83. $user_keyword = \Yii::$app->request->get('user_keyword');
  84. $level = \Yii::$app->request->get('level');
  85. // 批发商列表
  86. if (!empty($user_keyword)) {
  87. $users = User::find()
  88. ->select('id,nickname,mobile,avatar_url,inviter_at')
  89. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
  90. ->andWhere(['or', ['like', 'id', $user_keyword], ['like', 'nickname', $user_keyword]])
  91. ->asArray()
  92. ->indexBy('id')
  93. ->all();
  94. $child_id_arr = array_column($users, 'id');
  95. } else {
  96. $child_id_arr = UserPartitionRelationship::getChildIdArr($this->user_id);
  97. $child_id_arr = array_reverse($child_id_arr);
  98. }
  99. $wheres[] = [
  100. 'mall_id' => $this->mall_id,
  101. 'status' => StatusEnum::ENABLED,
  102. 'user_id' => $child_id_arr,
  103. ];
  104. // 批发商等级比自己小的下级
  105. $wheres[] = ['<', 'level', $this->stock_agent->level];
  106. if (!empty($level)) {
  107. $wheres[] = ['level' => $level];
  108. }
  109. // 统计 query 对象
  110. $stat_query = CloudStockTwoAgent::find();
  111. foreach ($wheres as $where) {
  112. $stat_query->andWhere($where);
  113. }
  114. $params = [
  115. 'select' => 'id,mall_id,user_id,level,created_at',
  116. 'where' => $wheres,
  117. 'order' => 'created_at desc',
  118. 'page' => $page,
  119. 'limit' => $limit,
  120. ];
  121. $child_agent_list = CloudStockTwoAgent::listPage($params);
  122. if (empty($child_agent_list['list'])) {
  123. if (!is_array($child_agent_list['list'])) {
  124. return $this->error(CloudStockTwoAgent::getStaticError());
  125. }
  126. }
  127. if (!empty($users)) {
  128. $child_users = $users;
  129. $user_ids = array_column($child_users, 'user_id');
  130. } else {
  131. $user_ids = array_column($child_agent_list['list'], 'user_id');
  132. $child_users = User::find()
  133. ->select('id,nickname,mobile,avatar_url,inviter_at')
  134. ->where(['mall_id' => $this->mall_id, 'id' => $user_ids, 'status' => StatusEnum::ENABLED])
  135. ->asArray()
  136. ->indexBy('id')
  137. ->all();
  138. }
  139. $child_good_numbers = CloudStockTwoAgentGoods::find()
  140. ->select('user_id,sum(num) as stock_good_counts')
  141. ->where(['mall_id' => $this->mall_id, 'user_id' => $user_ids, 'status' => StatusEnum::ENABLED])
  142. ->groupBy('user_id')
  143. ->asArray()
  144. ->indexBy('user_id')
  145. ->all();
  146. $stock_levels = CloudStockTwoLevel::find()
  147. ->select('id,level,name as level_name')
  148. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED])
  149. ->asArray()
  150. ->indexBy('level')
  151. ->all();
  152. foreach ($child_agent_list['list'] as &$list) {
  153. $user = $child_users[$list['user_id']] ?? [];
  154. $good_number = $child_good_numbers[$list['user_id']] ?? [];
  155. $list['level_name'] = $stock_levels[$list['level']]['level_name'] ?? '默认等级';
  156. $list['nickname'] = $user['nickname'] ?? '';
  157. $list['avatar_url'] = $user['avatar_url'] ?? \Yii::$app->request->hostInfo . '/resources/img/common/default-avatar.png';
  158. $list['mobiel'] = $user['mobile'] ?? '';
  159. $list['inviter_at'] = $user['inviter_at'] ?? 0;
  160. $list['stock_good_counts'] = $good_number['stock_good_counts'] ?? 0;
  161. }
  162. $this_month = DateHelper::thisMonth();
  163. $this_week = DateHelper::thisWeek();
  164. $all_child_agent = $month_number = $week_number = 0;
  165. foreach ($stat_query->each(100) as $agent) {
  166. if ($agent['created_at'] >= $this_week['start'] && $agent['created_at'] <= $this_week['end']) {
  167. $week_number += 1;
  168. }
  169. if ($agent['created_at'] >= $this_month['start'] && $agent['created_at'] <= $this_month['end']) {
  170. $month_number += 1;
  171. }
  172. $all_child_agent += 1;
  173. }
  174. $child_agent_list['all_child_agent'] = $all_child_agent;
  175. $child_agent_list['week_number'] = $week_number;
  176. $child_agent_list['month_number'] = $month_number;
  177. $child_agent_list['level_list'] = array_values($stock_levels);
  178. return $this->success('success', $child_agent_list);
  179. }
  180. /**
  181. * @name:
  182. * @msg: 设置代理商,获取等级和设置名额数据
  183. * @param {*}
  184. * @return {*}
  185. */
  186. public function actionSetWholesalerInfo()
  187. {
  188. if (!\Yii::$app->request->isGet) {
  189. return $this->error('请求方式错误');
  190. }
  191. $levels = CloudStockTwoLevel::getLevelList($this->mall_id);
  192. if ($this->stock_agent->level < 2) {
  193. $give_quotas = [];
  194. } else {
  195. $give_quotas = CloudStockTwoAgentQuota::find()
  196. ->select('id,mall_id,user_id,level,num,status as is_use')
  197. ->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id, 'status' => StatusEnum::ENABLED])
  198. ->asArray()
  199. ->all();
  200. if (!empty($give_quotas)) {
  201. foreach ($give_quotas as &$give_quota) {
  202. $give_quota['name'] = $levels[$give_quota['level']]['level_name'] ?? '默认等级';
  203. }
  204. }
  205. }
  206. return $this->success('success', ['level_list' => array_values($levels), 'give_quota' => $give_quotas]);
  207. }
  208. /**
  209. * @name:
  210. * @msg: 根据 id 获取会员基本信息
  211. * @param {*}
  212. * @return {*}
  213. */
  214. public function actionUserInfo()
  215. {
  216. if (!\Yii::$app->request->isGet) {
  217. return $this->error('请求方式错误');
  218. }
  219. $user_keyword = \Yii::$app->request->get('user_keyword');
  220. if (empty($user_keyword)) return $this->error('参数错误');
  221. $user = User::find()
  222. ->select('id,nickname,avatar_url,mobile')
  223. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $user_keyword])
  224. ->asArray()
  225. ->one();
  226. return $this->success('success', $user);
  227. }
  228. /**
  229. * @name:
  230. * @msg: 设定代理商
  231. * @param {integer} $user_id
  232. * @param {integer} $level
  233. * @return {*}
  234. */
  235. public function actionSetWholesaler()
  236. {
  237. if (!\Yii::$app->request->isPost) {
  238. return $this->error('请求方式错误');
  239. }
  240. $user_id = \Yii::$app->request->post('user_id');
  241. $level = \Yii::$app->request->post('level');
  242. if (empty($user_id) || empty($level)) return $this->error('参数错误');
  243. if ($this->stock_agent->level < 2) return $this->error('您当前等级不能设置代理商');
  244. $is_give_quota = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK_TWO, 'basic.is_give_quota');
  245. if ($is_give_quota != 1) return $this->error('系统未开启设置代理商功能');
  246. $user = User::findOne(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $user_id]);
  247. if (empty($user)) return $this->error('目标会员不存在');
  248. $agent = CloudStockTwoAgent::findOne(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'user_id' => $user_id]);
  249. if (!empty($agent)) return $this->error('目标会员已经是代理商');
  250. $parent_id_arr = UserPartitionRelationship::getParentIdArr($user_id);
  251. // dd($parent_id_arr);
  252. if (!in_array($this->user_id, $parent_id_arr)) return $this->error('目标会员不是您的下级会员');
  253. $level_info = CloudStockTwoLevel::getLevelList($this->mall_id, $level);
  254. $give_quota = CloudStockTwoLevel::getGiveQuota($this->mall_id, $level, $this->user_id);
  255. if ($give_quota <= 0) {
  256. return $this->error('设定代理[等级:' . $level_info['level_name'] . ']的名额已经用完');
  257. }
  258. $params = [
  259. 'user_id' => $this->user_id,
  260. 'agent_id' => $this->stock_agent->id,
  261. 'child_id' => $user_id,
  262. 'set_level' => $level,
  263. 'upgrade_status' => CloudStockTwoEnum::UPGRADE_STATUS_BY_PARENT,
  264. ];
  265. $res = CloudStockTwoAgent::setWholesaler($this->mall_id, $params);
  266. if (false === $res) return $this->error(CloudStockTwoAgent::getStaticError());
  267. return $this->success('操作成功');
  268. }
  269. /**
  270. * @name:
  271. * @msg: 我的报表数据
  272. * @param {*}
  273. * @return {*}
  274. */
  275. public function actionReportForm()
  276. {
  277. if (!\Yii::$app->request->isGet) {
  278. return $this->error('请求方式错误');
  279. }
  280. $date = date('Y-m');
  281. $start_time = strtotime($date . '-01 00:00:00');
  282. $end_time = strtotime($date . '-' . date('t', $start_time) . ' 23:59:59');
  283. // 本月收入/支出数据
  284. $in_income = $out_income = 0;
  285. $asset_logs = CommissionLog::find()
  286. ->select('id,mall_id,user_id,change_type,change_num,current_num,desc,from_type,capital_type,created_at')
  287. ->where(['mall_id' => $this->mall_id, 'user_id' => $this->user_id,'from_type'=>AddonsEnum::ADDONS_NAME_CLOUD_STOCK_TWO])
  288. ->andWhere(['and', ['>=', 'created_at', $start_time], ['<=', 'created_at', $end_time]])
  289. ->orderBy('created_at desc')
  290. ->all();
  291. if (!empty($asset_logs)) {
  292. foreach ($asset_logs as $log) {
  293. if ('sub' == $log->change_type) $out_income += $log->change_num;
  294. if ('add' == $log->change_type) $in_income += $log->change_num;
  295. }
  296. }
  297. // 本月出库/入库数据
  298. $out_stock = $in_stock = 0;
  299. $dedution_log_ids = CloudStockTwoDeductionDetail::find()
  300. ->select('stock_log_id')
  301. ->where(['user_id' => $this->user_id, 'status' => StatusEnum::ENABLED])
  302. ->asArray()
  303. ->column();
  304. $increase_log_ids = CloudStockTwoIncreaseDetail::find()
  305. ->select('stock_log_id')
  306. ->where(['user_id' => $this->user_id, 'status' => StatusEnum::ENABLED])
  307. ->asArray()
  308. ->column();
  309. $log_ids = array_merge($dedution_log_ids, $increase_log_ids);
  310. $stock_logs = CloudStockTwoGoodsStockLog::find()
  311. ->where(['mall_id' => $this->mall_id, 'status' => StatusEnum::ENABLED, 'id' => $log_ids])
  312. ->andWhere(['and', ['>=', 'created_at', $start_time], ['<=', 'created_at', $end_time]])
  313. ->orderBy('created_at desc')
  314. ->all();
  315. if (!empty($stock_logs)) {
  316. foreach ($stock_logs as $log) {
  317. if (CloudStockTwoEnum::STOCK_CHANGE_SUB == $log->changes_dir) $out_stock += $log->num;
  318. if (CloudStockTwoEnum::STOCK_CHANGE_ADD == $log->changes_dir) $in_stock += $log->num;
  319. }
  320. }
  321. return $this->success('success', compact('in_income', 'out_income', 'out_stock', 'in_stock'));
  322. }
  323. }