alias('sh')->leftJoin(['u' => User::tableName()], 'u.id=sh.user_id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding') ->where(['sh.store_id' => get_store_id(), 'sh.is_delete' => 0]); if ($name) { $query->andWhere(['or', ['like', 'su.name', $name], ['like', 'sh.name', $name], ['like', 'u.nickname', $name]]); } if ($mobile) { $query->andWhere(['sh.mobile' => $mobile]); } if (in_array($status, [0, 1, 2]) && !is_null($status)) { if ($status == 1) { $query->andWhere(['in', 'sh.status', [1, 2]]); } else { $query->andWhere(['sh.status' => $status]); } } $query->select('sh.*, u.nickname, u.avatar_url as avatar')->orderBy('sh.created_at desc, sh.audit_time asc'); $list = pagination_make($query); return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'] ] ]); } /** * 审核股东 * @return \yii\web\Response */ public function actionBatchAudit() { $id = post_params('id'); $status = post_params('status'); if (!in_array($status, [1, 2])) { return $this->asJson([ 'code' => 1, 'msg' => '参数错误' ]); } if (empty($id) || !is_array($id)) { return $this->asJson([ 'code' => 1, 'msg' => '参数错误' ]); } // 判断符合条件不 TODO: 申请股东的条件 $t = \Yii::$app->db->beginTransaction(); ShareHolder::updateAll(['status' => $status, 'audit_time' => time()], ['in', 'id', $id]); if ($status == 1) { foreach ($id as $value) { $share_holder = ShareHolder::findOne($value); $user = User::findOne($share_holder->user_id); if (!$user) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '用户不存在' ]); } $share_holder_level = ShareHolderLevel::findOne(['id' => $share_holder->level_id]); // 检查股东升级 // \app\utils\Share\BonusPool::checkLevel(get_store_id()); \app\utils\Share\BonusPool::ShareHolderLevelJob(get_store_id(), 0, $share_holder->user_id); // \app\utils\Share\BonusPool::checkChildHolderUpdateLevel($value, $share_holder->level_id); if ($share_holder_level->member_level > $user->level){ $user->level = $value->member_level; \Yii::warning(['------------ 等级更新成功自动更新等级对应会员等级 ------------', [ '之前等级' . $user->level, '之后等级' . $share_holder_level->member_level, ]]); } $user->is_holder = 1; if (!$user->save()) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '处理失败' ]); } } } $t->commit(); return $this->asJson([ 'code' => 0, 'msg' => '审核成功' ]); } /** * 等级 * @return \yii\web\Response */ public function actionLevelList() { $store_id = get_store_id(); $name = get_params('name'); $query = ShareHolderLevel::find()->where(['store_id' => $store_id, 'is_delete' => 0]); if ($name) { $query->andWhere(['like', 'name', $name]); } $query->orderBy(['level' => SORT_ASC]); $pagination = pagination_make($query); $list = $pagination['list']; foreach ($list as &$value) { $value['condition'] = Json::decode($value['condition']); } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list, 'pageNo' => $pagination['pageNo'], 'totalCount' => $pagination['totalCount'] ], ]); } /** * 会员等级启用/禁用 */ public function actionLevelStatus() { $data = post_params(); $store_id = get_store_id(); $level = ShareHolderLevel::find()->where(['id' => $data['id'], 'store_id' => $store_id])->one(); if (!$level) { return $this->asJson([ 'code' => 1, 'msg' => '等级不存在', ]); } $level->status = $data['status']; if ($data['status'] == 0) { $exit = ShareHolder::find()->where(['store_id' => $store_id, 'level_id' => $level->id])->exists(); if ($exit) { return $this->asJson([ 'code' => 1, 'msg' => '该等级下有会员,不可禁用', ]); } } if ($level->save()) { return $this->asJson([ 'code' => 0, 'msg' => '成功', ]); } else { return $this->asJson([ 'code' => 1, 'msg' => '网络异常', ]); } } public function actionUpdateLevel() { $store_id = get_store_id(); $level = post_params('level'); $timeout_days = post_params('timeout_days', 0); $id = post_params('id', 0); $name = post_params('name'); $member_level = post_params('member_level'); $team_reward_rate = post_params('team_reward_rate', 0); $range_rate = post_params('range_rate', 0); $holder_rate = post_params('holder_rate', 0); $equal_rate = post_params('equal_rate', 0); $detail = post_params('detail'); $condition = post_params('condition'); $share_rate_one = post_params('share_rate_one', 0); $share_rate_two = post_params('share_rate_two', 0); $share_rate_three = post_params('share_rate_three', 0); $old_team_reward_rate = post_params('old_team_reward_rate', 0); $old_range_rate = post_params('old_range_rate', 0); $old_repeat_range_rate = post_params('old_repeat_range_rate', 0); $old_holder_rate = post_params('old_holder_rate', 0); $old_equal_rate = post_params('old_equal_rate', 0); $old_share_rate_one = post_params('old_share_rate_one', 0); $old_share_rate_two = post_params('old_share_rate_two', 0); $old_share_rate_three = post_params('old_share_rate_three', 0); $range_rate_type = post_params('range_rate_type', 0); $is_user_level_range_rate = post_params('is_user_level_range_rate', 0); $pic_url = post_params('pic_url', 0); $status = post_params('status'); $is_default = post_params('is_default'); if (empty($level) || empty($name) || ($range_rate === '' || $range_rate === null) || ($holder_rate === '' || $holder_rate === null) || !in_array($is_default, [0, 1])) { return $this->asJson([ 'code' => 1, 'msg' => '参数有误' ]); } $t = \Yii::$app->db->beginTransaction(); if ($id) { $share_holder_level = ShareHolderLevel::findOne($id); \Yii::warning([$share_holder_level->level, $level]); if ($share_holder_level->level != $level) { $count = ShareHolder::find()->where(['is_delete' => 0, 'store_id' => $store_id, 'level_id' => $share_holder_level->id])->count(); if ($count > 0) { return $this->asJson([ 'code' => 1, 'msg' => '当前等级下有会员,禁止修改等级' ]); } $exist = ShareHolderLevel::find()->where(['level' => $level, 'store_id' => $store_id, 'is_delete' => 0])->exists(); if ($exist) { return $this->asJson([ 'code' => 1, 'msg' => '会员等级已存在' ]); } } if ($share_holder_level->name != $name) { $exist_0 = ShareHolderLevel::find()->where(['name' => $name, 'store_id' => $store_id, 'is_delete' => 0])->exists(); if ($exist_0) { return $this->asJson([ 'code' => 1, 'msg' => '等级名称重复' ]); } } } else { $share_holder_level = new ShareHolderLevel(); $exist = ShareHolderLevel::find()->where(['level' => $level, 'store_id' => $store_id, 'is_delete' => 0])->exists(); if ($exist) { return $this->asJson([ 'code' => 1, 'msg' => '会员等级已存在' ]); } $exist_0 = ShareHolderLevel::find()->where(['name' => $name, 'store_id' => $store_id, 'is_delete' => 0])->exists(); if ($exist_0) { return $this->asJson([ 'code' => 1, 'msg' => '等级名称重复' ]); } } if ($is_default == 1) { ShareHolderLevel::updateAll(['is_default' => 0], ['is_default' => 1, 'store_id' => get_store_id(), 'is_delete' => 0]); } else { $share_level = ShareHolderLevel::findOne(['is_default' => 1, 'store_id' => get_store_id(), 'is_delete' => 0]); if (!$share_level) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '请设置默认等级' ]); } } $share_level_list = ShareHolderLevel::find()->where([ 'store_id' => $store_id, 'is_delete' => 0])->all(); $is_exist_independent_team = 0; $is_exist_independent_team_id = 0; foreach ($share_level_list as $k => $v) { $share_level_list_condition = Json::decode($v->condition); if (!isset($share_level_list_condition['shareholder'])) { continue; } $shareholder = $share_level_list_condition['shareholder']; if ($shareholder['independent_team']) { $is_exist_independent_team = 1; $is_exist_independent_team_id = $v->id; break; } } $current_independent_team = $condition['shareholder']['independent_team']; if ($is_exist_independent_team == 1 && $current_independent_team == 1 && $is_exist_independent_team_id !== $id) { return $this->asJson([ 'code' => 1, 'msg' => '只能一个等级开启独立团队' ]); } if ($condition['self']['is_open'] == '1' && $condition['self']['value']['price'] == '0') { foreach ($share_level_list as $k => $v) { $share_level_list_condition = Json::decode($v->condition); if (!isset($share_level_list_condition['self'])) { continue; } $shareholder = $share_level_list_condition['self']; if ($shareholder['is_open'] && $shareholder['value']['price'] === '0' && $v->id != $id) { return $this->asJson([ 'code' => 1, 'msg' => '只能一个等级开启消费金额为0' ]); } } } if (intval($condition['amount_total']['is_open']) && $condition['amount_total']['value'] <= 0) { return $this->asJson([ 'code' => 1, 'msg' => '请填写佣金总额达标条件' ]); } $share_holder_level->is_default = $is_default; $share_holder_level->store_id = $store_id; $share_holder_level->level = $level; $share_holder_level->timeout_days = (int)$timeout_days; $share_holder_level->name = $name; $share_holder_level->member_level = $member_level; $share_holder_level->share_rate_one = $share_rate_one; $share_holder_level->share_rate_two = $share_rate_two; $share_holder_level->share_rate_three = $share_rate_three; $share_holder_level->team_reward_rate = $team_reward_rate; $share_holder_level->range_rate = $range_rate; $share_holder_level->holder_rate = $holder_rate; $share_holder_level->equal_rate = $equal_rate; $share_holder_level->detail = $detail; $share_holder_level->condition = Json::encode($condition); $share_holder_level->pic_url = $pic_url; $share_holder_level->old_team_reward_rate = $old_team_reward_rate; $share_holder_level->old_range_rate = $old_range_rate; $share_holder_level->old_repeat_range_rate = $old_repeat_range_rate; $share_holder_level->old_holder_rate = $old_holder_rate; $share_holder_level->old_equal_rate = $old_equal_rate; $share_holder_level->old_share_rate_one = $old_share_rate_one; $share_holder_level->old_share_rate_two = $old_share_rate_two; $share_holder_level->old_share_rate_three = $old_share_rate_three; $share_holder_level->is_user_level_range_rate = $is_user_level_range_rate; if (!is_null($range_rate_type)) { $share_holder_level->range_rate_type = $range_rate_type; } if (in_array($status, [0, 1]) && !is_null($status)) { $share_holder_level->status = $status; } if ($share_holder_level->save()) { $t->commit(); return $this->asJson([ 'code' => 0, 'msg' => '成功' ]); } else { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '创建失败' ]); } } /** * 会员等级删除 */ public function actionDeleteLevel() { $data = post_params(); $store_id = get_store_id(); $level = ShareHolderLevel::findOne(['id' => $data['id'], 'store_id' => $store_id, 'is_delete' => 0]); if (!$level) { return $this->asJson([ 'code' => 1, 'msg' => '等级不存在', ]); } $exist = ShareHolder::find()->where(['store_id' => $store_id, 'level_id' => $level->id, 'is_delete' => 0])->exists(); if ($exist) { return $this->asJson([ 'code' => 1, 'msg' => '该等级下有会员,不可删除' ]); } $level->is_delete = 1; if ($level->save()) { return $this->asJson([ 'code' => 0, 'msg' => '成功', ]); } return $this->asJson([ 'code' => 1, 'msg' => '网络异常', ]); } public function actionLevel() { $list = ShareHolderLevel::find()->where(['store_id' => get_store_id(), 'is_delete' => 0])->orderBy('created_at desc')->asArray()->all(); $out_level = 0; $out_num = 0; foreach ($list as $item) { $condition = json_decode($item['condition'], true); if ($condition['shareholder']['is_open'] == 1 && $condition['shareholder']['independent_team'] == 1 && $condition['shareholder']['num'] > 0) { $out_level = $item['id']; $out_num = $condition['shareholder']['num']; break; } } return $this->asJson([ 'code' => 0, 'data' => [ 'list' => $list, 'out_level' => (int)$out_level, 'out_num' => (int)$out_num, ], ]); } /** * 股东列表 * @return \yii\web\Response */ public function actionList() { $nickname = get_params('nickname'); $name = get_params('name'); $mobile = get_params('mobile'); $level_id = get_params('level_id'); $parent = get_params('parent'); $query = ShareHolder::find()->alias('sh')->where(['sh.store_id' => get_store_id(), 'sh.is_delete' => 0, 'sh.status' => 1, 'u.is_delete' => 0]) ->andWhere(['IS NOT', 'u.id', NULL]) ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id and shl.is_delete = 0') ->leftJoin(['u' => User::tableName()], 'u.id=sh.user_id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding'); if ($nickname) { $query->andWhere(['like', 'u.nickname', $nickname]); } if ($name) { $query->andWhere(['like', 'sh.name', $name]); } if ($mobile) { $query->andWhere(['sh.mobile' => $mobile]); } if ($level_id) { $query->andWhere(['sh.level_id' => $level_id]); } $query->select('sh.id, sh.name, sh.mobile, u.nickname, u.avatar_url as avatar, shl.name level_name, sh.audit_time, u.parent_id, u.old_parent_id, sh.user_id, sh.level_id, sh.province_id, sh.city_id, sh.district_id, sh.agent_type, sh.agent_rate, sh.is_out')->orderBy('sh.created_at desc, sh.audit_time desc'); if (!$parent) { $list = pagination_make($query); $data = $list['list']; $pageNo = $list['pageNo']; $count = $list['totalCount']; } else { $pageNo = get_params('pageNo', 1); $pageSize = get_params('pageSize', 20); $list = $query->asArray()->all(); $new_list = []; foreach ($list as $value) { $user = User::find()->alias('u')->where(['u.store_id' => get_store_id(), 'u.id' => $value['parent_id']]) ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')->select('su.name')->asArray()->one(); if (false !== strpos($user['name'], $parent)) { $new_list[] = $value; } } $count = count($new_list); $data = []; if (!empty($new_list)) { $data = array_slice($new_list, ($pageNo - 1) * $pageSize, $pageSize); } } $team_num = Option::get('team_num', get_store_id(), 'bonus_pool', 0)['value']; // 处理数据 foreach ($data as &$v) { $team_list = User::findOld()->alias('u')->childs($v['user_id'], true, $team_num)->andWhere(['u.store_id' => get_store_id()])->select('u.id')->column(); $team_order_price = Order::find() ->where(['store_id' => get_store_id(), 'user_id' => $team_list, 'is_delete' => 0, 'is_pay' => 1, 'trade_status' => [Order::ORDER_FLOW_NO_SEND, Order::ORDER_FLOW_SEND, Order::ORDER_FLOW_CONFIRM]]) ->select('pay_price') ->sum('pay_price'); $v['team_order_price'] = $team_order_price ?? 0; // parent_id $user = User::findOne($v['parent_id']); if ($user) { $v['parent_id'] = $user->id; } else { $v['parent_id'] = 0; } $v['level_id'] = $v['level_id'] == 0 ? null : $v['level_id']; $v['level_name'] = !isset($v['level_name']) || empty($v['level_name']) ? '普通会员' : $v['level_name']; $v['parent_name'] = '/'; if ($v['parent_id'] > 0) { $user = User::findOne($v['parent_id']); $parent_name = $user ? SaasUser::findOne(['mobile' => $user->binding]) : null; $v['parent_name'] = $parent_name ? $parent_name->name : '/'; } $oldUser = User::findOne($v['old_parent_id']); $v['old_parent_name'] = '/'; if ($oldUser) { $saas_user = SaasUser::findOne(['mobile' => $oldUser->binding]); if ($saas_user) { $v['old_parent_id'] = $oldUser->id; $v['old_parent_name'] = $saas_user->name; } } // $old_parent_name = SaasUser::findOne($v['old_parent_id']); // $v['old_parent_name'] = $old_parent_name ? $old_parent_name->name : '/'; // // 下级所有的人数 // $v['level_count'] = count(User::find()->childs($v['user_id'])->andWhere(['store_id' => get_store_id()])->asArray()->all()) ?: 0; // // 一级人数 // $level_one = User::find()->childs($v['user_id'], false, 1)->andWhere(['store_id' => get_store_id()])->select('binding, nickname, avatar_url')->asArray()->all(); // $v['level_one_count'] = count($level_one) ?: 0; // 极差佣金 $v['range_profit'] = ShareDetail::find()->where(['is_delete' => 0, 'store_id' => get_store_id(), 'user_id' => $v['user_id'], 'type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD], 'is_send' => 1])->sum('money'); // 股东分红 $v['holder_profit'] = ShareDetail::find()->where(['is_delete' => 0, 'store_id' => get_store_id(), 'user_id' => $v['user_id'], 'type' => ShareDetail::TYPE_HOLDER_PROFIT, 'is_send' => 1])->sum('money'); } foreach ($data as &$v) { $user = User::findOne($v['user_id']); $v['nickname'] = $user->nickname; $v['avatar'] = $user->avatar_url; if($user->binding){ $saas_user = SaasUser::findOne(['mobile' => $user->binding]); }else{ if($user->alipay_open_id){ $saas_user = SaasUser::findOne(['ali_user_id' => $user->alipay_open_id]); } } $profitGoods = null; //获取当前购买最大升级产品的记录 $profitGoodsLog = ShareHolderProfitGoodsLog::find()->alias('l')->where(['l.user_id' => $v['user_id'], 'l.is_switch' => 1]) ->leftJoin(['o' => Order::tableName()], 'l.order_id = o.id')->andWhere(['o.is_sale' => 1]) ->orderBy('l.goods_price desc')->select('l.goods_id')->asArray()->one(); if (!empty($profitGoodsLog['goods_id'])) { $profitGoods_ = Goods::findOne($profitGoodsLog['goods_id']); $profitGoods = [ 'name' => $profitGoods_->name, 'cover_pic' => $profitGoods_->cover_pic ]; } $v['profit_goods'] = $profitGoods; // if($saas_user){ // $v['nickname'] = $saas_user->name; // $v['avatar'] = $saas_user->avatar; // } //展示助力出局下级 $v['child_user'] = []; if ((int)$v['is_out'] === 1) { $v['child_user'] = ShareHolderOutLog::find()->alias('sh')->where(['sh.parent_user_id' => $v['user_id']]) ->leftJoin(['u' => User::tableName()], 'sh.child_user_id = u.id') ->leftJoin(['su' => SaasUser::tableName()], 'u.binding = su.mobile') ->select('su.name, su.avatar')->asArray()->all(); } } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $data, 'pageNo' => intval($pageNo), 'totalCount' => $count ] ]); } /** * 获取团队订单列表 */ public function actionTeamOrderList() { try { $user_id = get_params('user_id'); $order_no = get_params('order_no'); $name = get_params('name'); $team_num = Option::get('team_num', get_store_id(), 'bonus_pool', 0)['value']; $team_list = User::findOld()->alias('u')->childs($user_id, true, $team_num)->andWhere(['u.store_id' => get_store_id()])->select('u.id')->column(); $query = Order::find()->alias('o') ->leftJoin(['u' => User::tableName()], 'u.id=o.user_id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding') ->where(['o.store_id' => get_store_id(), 'o.user_id' => $team_list, 'o.is_delete' => 0, 'is_pay' => 1, 'o.trade_status' => [Order::ORDER_FLOW_NO_SEND, Order::ORDER_FLOW_SEND, Order::ORDER_FLOW_CONFIRM]]); if ($order_no) { $query->andWhere(['LIKE', 'o.order_no', $order_no]); } if ($name) { $query->andWhere(['LIKE', 'su.name', $name]); } $query->select('su.name nickname, o.id, o.pay_time, o.order_no, o.pay_price, o.express_price, o.total_price, o.is_pay, o.trade_status, o.created_at')->orderBy('o.created_at desc')->groupBy('o.id'); $data = pagination_make($query); foreach ($data['list'] as &$value) { $value['pay_time'] = $value['pay_time'] > 0 ? date("Y-m-d H:i:s", $value['pay_time']) : '-'; $value['created_at'] = $value['created_at'] > 0 ? date("Y-m-d H:i:s", $value['created_at']) : '-'; $value['is_pay'] = (int)$value['is_pay']; $value['trade_status'] = (int)$value['trade_status']; $value['goods_list'] = OrderDetail::find()->where(['order_id' => $value['id']])->select('goods_name, num, attr, pic, total_price')->asArray()->all(); } return $this->asJson([ 'code' => 0, 'msg' => '获取成功', 'data' => [ 'list' => $data['list'], 'pageNo' => $data['pageNo'], 'totalCount' => $data['totalCount'] ] ]); } catch (\Exception $e) { return [ 'code' => 0, 'msg' => $e->getMessage(), 'data' => [ 'data' => [], 'pageNo' => 0, 'totalCount' => 0 ] ]; } } /** * 原推荐关系列表 * @return void * @author Syan mzsongyan@gmail.com * @date 2022-07-12 */ public function actionOldShareList() { $store_id = get_store_id(); $id = get_params('id'); $name = get_params('nickname'); $mobile = get_params('mobile'); $query = ShareHolder::find()->alias('sh') ->leftJoin(['u' => User::tableName()], 'u.id = sh.user_id') ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id = sh.level_id and shl.is_delete = 0') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding') ->where([ 'u.is_delete' => 0, 'sh.is_delete' => 0, 'u.store_id' => $store_id, 'sh.store_id' => $store_id, 'sh.status' => 1, ]); if ($id) { $query->andWhere(['u.old_parent_id' => $id]); } if ($name) { $query->andWhere(['like', 'u.nickname', $name]); } if ($mobile) { $query->andWhere(['like', 'u.binding', $mobile]); } $query->select('u.nickname as user_name, u.avatar_url as user_avatar, sh.id, sh.name, u.binding as user_mobile, u.old_parent_id, u.id as user_id, shl.name as level_name'); $list = pagination_make($query); foreach ($list['list'] as &$item) { $old_parent = User::findOne($item['old_parent_id']); if ($old_parent) { $item['old_parent_name'] = $old_parent->nickname; // $old_parent_user = SaasUser::find()->where(['mobile' => $old_parent->binding])->select('name, avatar')->asArray()->one(); // if ($old_parent_user) { // $item['old_parent_name'] = $old_parent_user['name']; // } else { // $item['old_parent_name'] = ''; // } } else { $item['old_parent_name'] = ''; } $item['count'] = User::find()->alias('u') ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id = u.id') ->where(['sh.is_delete' => 0, 'sh.status' => 1]) ->andWhere([ 'u.old_parent_id' => $item['user_id'] ]) ->count(); } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'], ] ]); } /** * 链动推荐关系列表 * @return void * @author Syan mzsongyan@gmail.com * @date 2022-07-12 */ public function actionChainShareList() { $store_id = get_store_id(); $id = get_params('id'); $name = get_params('nickname'); $mobile = get_params('mobile'); $query = ShareHolder::find()->alias('sh') ->leftJoin(['u' => User::tableName()], 'u.id = sh.user_id') ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id = sh.level_id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding') ->where([ 'u.is_delete' => 0, 'sh.is_delete' => 0, 'u.store_id' => $store_id, 'sh.store_id' => $store_id, 'sh.status' => 1, ]); if ($id) { $query->andWhere(['u.parent_id' => $id]); } if ($name) { $query->andWhere(['like', 'su.name', $name]); } if ($mobile) { $query->andWhere(['like', 'u.binding', $mobile]); } $query->select('u.nickname as user_name, u.avatar_url as user_avatar, sh.id, sh.name, u.binding as user_mobile, u.parent_id, u.id as user_id, shl.name as level_name'); $list = pagination_make($query); foreach ($list['list'] as &$item) { $parent = User::findOne($item['parent_id']); if ($parent) { $parent_user = SaasUser::find()->where(['mobile' => $parent->binding])->select('name, avatar')->asArray()->one(); if ($parent_user) { $item['parent_name'] = $parent_user['name']; } else { $item['parent_name'] = ''; } } else { $item['parent_name'] = ''; } $item['count'] = User::find()->alias('u') ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id = u.id') ->where(['sh.is_delete' => 0, 'sh.status' => 1]) ->andWhere([ 'u.parent_id' => $item['user_id'] ]) ->count(); } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'], ] ]); } /** * 下一级列表 * @return \yii\web\Response */ public function actionLevelOneUser() { $name = get_params('name'); $user_id = get_params('user_id'); $level_id = get_params('level_id'); $pageNo = get_params('pageNo', 1); $pageSize = get_params('pageSize', 20); $list = User::find()->alias('u')->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')->where(['u.store_id' => get_store_id(), 'u.parent_id' => $user_id]) ->select('u.binding, u.nickname, u.avatar_url, u.id, su.name, su.avatar, u.is_holder')->orderBy('u.is_holder desc')->asArray()->all(); $new_list = []; foreach ($list as &$value) { $value['level_name'] = ''; $value['level_one_count'] = 0; $value['level_count'] = 0; $value['range_profit'] = 0; $value['holder_profit'] = 0; $share_holder = ShareHolder::findOne(['user_id' => $value['id'], 'is_delete' => 0, 'status' => 1]); $level = -1; if ($share_holder) { $level = $share_holder->level_id; $value['level_name'] = ShareHolderLevel::findOne($level)->name; // 下级所有的人数 $v['level_count'] = count(User::find()->childs($value['id'])->andWhere(['store_id' => get_store_id()])->asArray()->all()) ?: 0; // 一级人数 $level_one = User::find()->childs($value['id'], false, 1)->andWhere(['store_id' => get_store_id()])->select('binding, nickname, avatar_url')->asArray()->all(); $v['level_one_count'] = count($level_one) ?: 0; // 极差佣金 $v['range_profit'] = ShareDetail::find()->where(['is_delete' => 0, 'store_id' => get_store_id(), 'user_id' => $value['id'], 'type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD], 'is_send' => 1])->sum('money'); // 股东分红 $v['holder_profit'] = ShareDetail::find()->where(['is_delete' => 0, 'store_id' => get_store_id(), 'user_id' => $value['id'], 'type' => ShareDetail::TYPE_HOLDER_PROFIT, 'is_send' => 1])->sum('money'); } if ($name || $level_id) { if ($name && !$level_id) { if (false !== strpos($value['name'], $name) || false !== strpos($value['nickname'], $name)) { $new_list[] = $value; } } else if ($level_id && !$name) { if ($level == $level_id) { $new_list[] = $value; } } else { if ((false !== strpos($value['name'], $name) || false !== strpos($value['nickname'], $name)) && $level == $level_id) { $new_list[] = $value; } } } else { $new_list[] = $value; } } $count = count($new_list); $data = []; if (!empty($new_list)) { $data = array_slice($new_list, ($pageNo - 1) * $pageSize, $pageSize); } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $data, 'pageNo' => intval($pageNo), 'totalCount' => $count ] ]); } /** * 编辑 * @return \yii\web\Response */ public function actionEdit() { $id = post_params('id'); $type = post_params('type'); $value = post_params('value'); $saas_user_id = post_params('saas_user_id'); $old_saas_user_id = post_params('old_saas_user_id'); $province_id = post_params('province_id'); $city_id = post_params('city_id'); $district_id = post_params('district_id'); $agent_type = post_params('agent_type', 0); $agent_rate = post_params('agent_rate', 0); $is_out = post_params('is_out', 0); $out_users = post_params('out_users', []); // TODO: 申请股东的条件 $t = \Yii::$app->db->beginTransaction(); $share_holder = ShareHolder::findOne($id); if (!$share_holder) { return $this->asJson([ 'code' => 1, 'msg' => '数据不存在' ]); } // 删除 if ($type == 1) { $share_holder->is_delete = 1; if (!$share_holder->save()) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '删除异常' ]); } $user = User::findOne($share_holder->user_id); $user->is_holder = 0; if (!$user->save()) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '处理异常' ]); } $t->commit(); return $this->asJson([ 'code' => 0, 'msg' => '删除成功' ]); } // 编辑等级 $old_parent_id = 0; if ($type == 2) { $share_user = User::findOne($share_holder->user_id); $parent_user_old_parent_id = $share_user->parent_id; $oldParentChange = 0; $parentChange = 0; $beforeOldParentId = $share_user->old_parent_id; $beforeParentId = $share_user->parent_id; if ($old_saas_user_id) { $old_parent_id = $share_user->old_parent_id; try { // $old_saas_user = SaasUser::findOne($old_saas_user_id); // $old_user = User::findOne(['store_id' => get_store_id(), 'binding' => $old_saas_user->mobile]); $old_user = User::findOne(['store_id' => get_store_id(), 'id' => $old_saas_user_id]); if (!$old_user) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '未找到该用户' ]); } $share_user->old_parent_id != $old_user->id && $oldParentChange = 1; $share_user->old_parent_id = $old_user->id; } catch (LogicException $e) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => $e->getMessage() ]); } } if ($saas_user_id) { try { $user = User::findOne(['store_id' => get_store_id(), 'id' => $saas_user_id]); if (!$user) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '未找到该用户' ]); } $share_user->parent_id != $user->id && $parentChange = 1; $share_user->parent_id = $user->id; } catch (LogicException $e) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => $e->getMessage() ]); } } // 代理 if (in_array($agent_type, [1, 2, 3])) { if ($agent_type == 1 && empty($province_id)) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '请选择区域代理地区' ]); } if ($agent_type == 2 && (empty($province_id) || empty($city_id))) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '请选择区域代理地区' ]); } if ($agent_type == 3 && (empty($province_id) && empty($city_id) && empty($district_id))) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '请选择区域代理地区' ]); } $is_multi_agent = Option::get('is_multi_agent', $share_holder->store_id, 'bonus_pool_area_agent', 0)['value']; if ($agent_type == 1) { $province_share = ShareHolder::find()->where(['province_id' => $province_id, 'agent_type' => 1, 'is_delete' => 0, 'store_id' => get_store_id()]) ->andWhere(['!=', 'id', $share_holder->id])->one(); if ($province_share && !$is_multi_agent) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '已存在省代理' ]); } } if ($agent_type == 2) { $city_share = ShareHolder::find()->where(['city_id' => $city_id, 'agent_type' => 2, 'is_delete' => 0, 'store_id' => get_store_id()])->andWhere(['!=', 'id', $share_holder->id])->one(); if ($city_share && !$is_multi_agent) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '已存在市代理' ]); } } if ($agent_type == 3) { $district_share = ShareHolder::find()->where(['district_id' => $district_id, 'agent_type' => 3, 'is_delete' => 0, 'store_id' => get_store_id()])->andWhere(['!=', 'id', $share_holder->id])->one(); if ($district_share && !$is_multi_agent) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '已存在区域代理' ]); } } $share_holder->province_id = $province_id; $share_holder->city_id = $city_id; $share_holder->district_id = $district_id; $share_holder->agent_rate = $agent_rate; $share_holder->agent_type = $agent_type; } if ($agent_type == 0) { $share_holder->agent_type = 0; } $old_share_holder_level_id = $share_holder->level_id; $old_share_holder_level = ShareHolderLevel::findOne(['id' => $old_share_holder_level_id]); $share_holder->level_id = $value; if (!$share_holder->save()) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '处理异常' ]); } $share_holder_level = ShareHolderLevel::findOne(['id' => $value]); $open = true; $condition = Json::decode($share_holder_level->condition); if (isset($condition['shareholder'])) { $shareholder = $condition['shareholder']; if ($shareholder['independent_team']) { $open = false; $share_user->parent_id = 0; } } //todo 提交bug说是后台修改没有记录 增加修改记录 if (intval($old_share_holder_level_id) !== intval($value)) { $level_log = new ShareHolderLevelLog(); $level_log->before_level = $old_share_holder_level->level; $level_log->after_level = $share_holder_level->level; $level_log->user_id = $share_holder->user_id; $level_log->store_id = $share_holder->store_id; if ($is_out == 1 && count($out_users) == 0) { $level_log->desc = "后台修改等级, 没有助推下级"; } else { $level_log->desc = "后台修改等级"; } if (!$level_log->save()) { return $this->asJson([ 'code' => 1, 'msg' => '股东等级更新失败' ]); } } if ($share_holder_level->member_level > $share_user->level){ $share_user->level = $share_holder_level->member_level; \Yii::warning(['------------ 编辑等级对应会员等级 ------------', [ '之前等级' . $share_user->level, '之后等级' . $share_holder_level->member_level, ]]); } if (!$share_user->save()) { $t->rollBack(); \Yii::warning(['------------ 编辑等级对应会员等级更新失败 ------------', $share_user->errors]); return $this->asJson([ 'code' => 1, 'msg' => '处理异常' ]); } $oldParentChange && \app\utils\Share\BonusPool::addShareHolderParentOutLog($share_user, $beforeOldParentId, ShareHolderParentOutLog::getConditionName(11), 1); $parentChange && \app\utils\Share\BonusPool::addShareHolderParentOutLog($share_user, $beforeParentId, ShareHolderParentOutLog::getConditionName(11), 0); // if ($old_parent_id > 0 && $old_parent_id !== $share_user->old_parent_id) { // $addShareHolderParentOutLog = \app\utils\Share\BonusPool::addShareHolderParentOutLog($share_user, $old_parent_id, "后台修改数据更改上级", 1); // if ($addShareHolderParentOutLog['code'] != 0) { // $t->rollBack(); // \Yii::warning(['------------ 编辑股东旧上级记录更新失败 ------------', $addShareHolderParentOutLog['msg']]); // return $this->asJson([ // 'code' => 1, // 'msg' => '处理异常' // ]); // }; // } try { // 检查下级升级 // \app\utils\Share\BonusPool::checkLevel(get_store_id(), 1); \app\utils\Share\BonusPool::ShareHolderLevelJob(get_store_id(), 1, $share_holder->user_id); // \app\utils\Share\BonusPool::checkChildHolderUpdateLevel($share_holder->user_id, $share_holder->level_id); } catch (\Exception $e) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '处理异常' ]); } if ($is_out == 1) { $share_holder->is_out = 1; $share_holder->save(); if (count($out_users) > 0) { foreach ($out_users as $user_id) { $user_item = User::findOne($user_id); $child = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0]); if ($user_item) { $out_log = ShareHolderOutLog::findOne([ 'parent_user_id' => $share_holder->user_id, 'child_user_id' => $user_id ]); if (!$out_log) { $out_log = new ShareHolderOutLog(); $out_log->parent_user_id = $share_holder->user_id; $out_log->child_user_id = $user_id; } $out_log->status = $child->is_out; $out_log->save(); if ($child && intval($child->is_out)) { continue; } $beforeParentId = $user_item->parent_id; $user_item->parent_id = $parent_user_old_parent_id; if (!$user_item->save()) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '助力出局的股东改变关系失败' ]); } \app\utils\Share\BonusPool::addShareHolderParentOutLog($user_item, $beforeParentId, "后台修改数据使股东上级出局"); //记录出局关系 //判断滑落 $share_detail_arr = [ ShareDetail::TYPE_HOLDER_PROFIT, ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_PROFIT, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL ]; $share_detail = ShareDetail::find()->alias('sd') ->leftJoin(['o' => Order::tableName()], 'o.id = sd.type_id') ->where(['o.user_id' => $user_item->id, 'sd.type' => $share_detail_arr, 'sd.user_id' => $share_user->id]) ->asArray()->one(); if ($share_detail) { ShareDetail::handleChildData($share_detail['id']); } } // TODO 后台修改股东等级 下级不变动上级问题 } } } $t->commit(); return $this->asJson([ 'code' => 0, 'msg' => '修改成功' ]); } } public function actionAdd() { $store_id = get_store_id(); $name = post_params('name'); $user_id = post_params('user_id'); $mobile = post_params('mobile'); $province = post_params('province', 0); $city = post_params('city', 0); $district = post_params('district', 0); $town = post_params('town', 0); $address = post_params('address', ''); $is_area = post_params('is_area'); $agent_type = post_params('agent_type'); $agent_rate = (float)post_params('agent_rate'); $agent_rate_status = post_params('agent_rate_status'); //获取省市区 $province_name = District::findOne($province)->name ?: ''; $city_name = District::findOne($city)->name ?: ''; $district_name = District::findOne($district)->name ?: ''; $town_name = District::findOne($town)->name ?: ''; if (!$is_area) { if (empty($name) || empty($mobile) || empty($province) || empty($city) || empty($district) || empty($address) || empty($province_name) || empty($city_name) || empty($district_name)) { // return $this->asJson([ // 'code' => 1, // 'msg' => '参数错误' // ]); } } $t = \Yii::$app->db->beginTransaction(); $where = ['store_id' => $store_id, 'user_id' => $user_id, 'is_delete' => 0, 'status' => [1, 0]]; if ($is_area) { $where = array_merge($where, ['agent_type' => [1, 2, 3]]); } $admin = ShareHolder::find()->where($where)->one(); if ($admin) { return $this->asJson([ 'code' => 1, 'msg' => '当前已成为股东或存在待审核记录' ]); } $is_multi_agent = Option::get('is_multi_agent', $store_id, 'bonus_pool_area_agent', 0)['value']; if ($is_area) { $user_area_agent = ShareHolderAreaAgentApply::findOne( [ 'store_id' => $store_id, 'user_id' => $user_id, 'is_delete' => 0, 'status' => [0, 1] ] ); if ($user_area_agent) { return $this->asJson([ 'code' => 1, 'msg' => '当前已成为区域代理或存在待审核记录' ]); } $where = [ 'store_id' => $store_id, 'is_delete' => 0, 'status' => [0, 1], 'agent_type' => $agent_type, 'province_id' => $province ]; switch ($agent_type) { case 2: $where = array_merge($where, ['city_id' => $city]); break; case 3: $where = array_merge($where, ['city_id' => $city, 'district_id' => $district]); break; case 4: $where = array_merge($where, ['city_id' => $city, 'district_id' => $district, 'town_id' => $town]); break; } $other_area_agent = ShareHolderAreaAgentApply::findOne($where); if ($other_area_agent && !$is_multi_agent) { return $this->asJson([ 'code' => 1, 'msg' => '当前存在同区域待审核记录' ]); } $other_share_holder = ShareHolder::findOne($where); if ($other_share_holder && !$is_multi_agent) { return $this->asJson([ 'code' => 1, 'msg' => '当前存在同区域代理' ]); } } //获取手机号 $user = User::findOne($user_id); $binding = $user->binding; //保存信息 $share_level = ShareHolderLevel::findOne(['is_default' => 1, 'store_id' => get_store_id(), 'is_delete' => 0]); if (!$share_level) { return $this->asJson([ 'code' => 1, 'msg' => '需要添加等级' ]); } $share_holder = new ShareHolder(); if ($is_area) { $share_holder_ = ShareHolder::findOne(['store_id' => get_store_id(), 'user_id' => $user_id, 'is_delete' => 0]); if ($share_holder_) { $share_holder = $share_holder_; } else { $share_holder->audit_time = time(); $share_holder->level_id = $share_level->id; } if($share_holder->agent_type == 0){ $share_holder->agent_time = time(); } $share_holder->agent_type = $agent_type; $share_holder->agent_rate = $agent_rate; $share_holder->agent_rate_status = $agent_rate_status; } $share_holder->store_id = get_store_id(); $share_holder->user_id = $user_id; $share_holder->name = $name; $share_holder->address = $address; $share_holder->mobile = $binding; $share_holder->province_id = $share_holder->province = $province; $share_holder->city_id = $share_holder->city = $city; $share_holder->district_id = $share_holder->district = $district; $share_holder->town_id = $town; $share_holder->province_name = $province_name; $share_holder->city_name = $city_name; $share_holder->district_name = $district_name; $share_holder->town_name = $town_name; $share_holder->status = 1; if (!$share_holder->save()) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '股东处理失败' ]); } if ($share_level->member_level > $user->level){ $user->level = $share_level->member_level; \Yii::warning(['------------ 添加等级对应会员等级 ------------', [ '之前等级' . $user->level, '之后等级' . $share_level->member_level, ]]); } $user->is_holder = 1; if (!$user->save()) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '处理失败' ]); } $t->commit(); return $this->asJson([ 'code' => 0, 'msg' => '添加成功' ]); } /** * 极差分润订单 * @return \yii\web\Response */ public function actionShareOrder() { $order_no = get_params('order_no'); $name = get_params('name'); $type = get_params('type');// 区分链动 $is_area = get_params('is_area'); //只显示区域分红 $query = Order::find()->alias('o')->leftJoin(['sd' => ShareDetail::tableName()], 'sd.type_id = o.id') ->leftJoin(['u' => User::tableName()], 'u.id=o.user_id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding') ->where(['o.store_id' => get_store_id()]) ->andWhere(['<>', 'o.trade_status', 1]); if ($name) { $query->andWhere(['like', 'su.name', $name]); } $type_where = ['in', 'sd.type', [2, 5, 6, 7, 8, 9]]; if ($type) { $type_where = ['in', 'sd.type', [2, 5, 6, 9]]; } if ($is_area) { $type_where = ['AND', ['sd.type' => 3], ['>', 'sd.money', '0']]; } $type_where = ['OR', $type_where, ['OR', ['>', 'holder_first_price', 0], ['>', 'holder_second_price', 0], ['>', 'holder_third_price', 0], ['>', 'old_holder_first_price', 0], ['>', 'old_holder_second_price', 0], ['>', 'old_holder_third_price', 0]]]; $query->andWhere($type_where); if ($order_no) { $query->andWhere(['o.order_no' => $order_no]); } $query->select('o.id, o.pay_time created_at, sd.money, o.id type_id, su.name nickname, o.pay_time, o.order_no, o.id order_id, o.holder_first_price, o.holder_second_price, o.holder_third_price, o.old_holder_first_price, o.old_holder_second_price, o.old_holder_third_price,o.express_price') ->orderBy('o.id desc')->groupBy('o.id'); $list = pagination_make($query); foreach ($list['list'] as &$value) { $value['order_pay_price'] = 0; $order = Order::find()->select('pay_price')->where(['order_no' => $value['order_no']])->one(); if ($order) { $value['order_pay_price'] = $order->pay_price; } $value['goods_list'] = OrderDetail::find()->where(['order_id' => $value['type_id']])->select('goods_name, num, attr, pic, total_price')->asArray()->all(); if ($type) { $value['range_profit'] = ShareDetail::find()->where(['type' => ShareDetail::TYPE_RANGE_PROFIT, 'type_id' => $value['type_id']])->sum('money'); } else { $value['range_profit'] = ShareDetail::find()->where(['type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL], 'type_id' => $value['type_id']])->sum('money'); } $value['agent_profit'] = ShareDetail::find()->where(['type' => ShareDetail::TYPE_AREA_PROFIT, 'type_id' => $value['type_id']])->sum('money'); $share_holder_price = bcadd($value['old_holder_first_price'], bcadd($value['old_holder_second_price'], bcadd($value['old_holder_third_price'], bcadd($value['holder_first_price'], bcadd($value['holder_second_price'], $value['holder_third_price'], 2) , 2) , 2) , 2) , 2); $value['share_holder_price'] = '¥' . $share_holder_price; } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'] ] ]); } /** * 佣金列表 * @return \yii\web\Response */ public function actionProfitList() { $order_no = get_params('order_no'); $order_id = get_params('order_id', 0); $name = get_params('name'); $buyer = get_params('buyer'); $level_id = get_params('level_id'); $pay_start_time = get_params('pay_start_time'); $pay_end_time = get_params('pay_end_time'); $send_start_time = get_params('send_start_time'); $send_end_time = get_params('send_end_time'); $profit_type = get_params('profit_type'); $type = get_params('type', 0); $store_id = get_store_id(); $query = ShareDetail::find()->alias('sd')->leftJoin(['o' => Order::tableName()], 'o.id=sd.type_id AND sd.type <> 1') ->leftJoin(['u' => User::tableName()], 'u.id=o.user_id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding') ->leftJoin(['u1' => User::tableName()], 'u1.id=sd.user_id') ->leftJoin(['su1' => SaasUser::tableName()], 'su1.mobile=u1.binding') ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id=u1.id') ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id and shl.is_delete = 0') ->where([ 'sd.store_id' => $store_id, 'u.store_id' => $store_id, 'u1.store_id' => $store_id, 'sh.store_id' => $store_id, 'sd.is_delete' => 0, 'sh.is_delete' => 0 ]); $query->andWhere(['in', 'sd.type', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]); if ($type) { $query->andWhere(['in', 'sd.type', [2, 5, 6, 9]]); } else { if ($profit_type == ShareDetail::TYPE_AREA_PROFIT) { $query->andWhere(['sd.type' => ShareDetail::TYPE_AREA_PROFIT])->andWhere(['>', 'sd.money', 0]); } if ($profit_type == ShareDetail::TYPE_RANGE_PROFIT) { $query->andWhere(['sd.type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL]]); } if (!$profit_type) { $query->andWhere(['<>', 'sd.type', ShareDetail::TYPE_AREA_PROFIT]); } } if ($name) { $query->andWhere([ 'or', ['like', 'su1.name', $name], ['like', 'u1.nickname', $name], ]); } if ($level_id) { $query->andWhere(['sh.level_id' => $level_id]); } if ($order_id) { $query->andWhere(['sd.type_id' => $order_id]); } if ($order_no) { $query->andWhere(['o.order_no' => $order_no]); } if ($buyer) { $query->andWhere([ 'or', ['like', 'su.name', $buyer], ['like', 'u.nickname', $buyer], ]); } if ($pay_start_time) { $query->andWhere(['>=', 'o.pay_time', strtotime($pay_start_time)]); } if ($pay_end_time) { $query->andWhere(['<=', 'o.pay_time', strtotime($pay_end_time)]); } if ($send_start_time) { $query->andWhere(['>=', 'sd.send_time', strtotime($send_start_time)]); } if ($send_end_time) { $query->andWhere(['<=', 'sd.send_time', strtotime($send_end_time)]); } $query->select('sd.*, su.name buyer_name, u.nickname buyer_nickname, o.pay_time, o.order_no, u1.nickname holder_nickname, u1.avatar_url holder_avatar_url, shl.name level_name, o.order_no, o.pay_price, sh.agent_type')->orderBy('sd.created_at desc'); $query->groupBy('sd.id'); $range_name = Option::get('range_name', get_store_id(), 'bonus_pool', '')['value']; $holder_name = Option::get('holder_name', get_store_id(), 'bonus_pool', '')['value']; $area_name = Option::get('area_name', get_store_id(), 'bonus_pool', '')['value']; $old_range_name = Option::get('old_range_name', get_store_id(), 'bonus_pool', '')['value']; $direct_range_name = Option::get('direct_range_name', get_store_id(), 'bonus_pool', '')['value']; $old_add_holder_name = Option::get('old_add_holder_name', get_store_id(), 'bonus_pool', '')['value']; $list = pagination_make($query); foreach ($list['list'] as &$value) { $value['agent_type'] = (int)$value['agent_type']; $value['profit_name'] = '分红'; if ($value['type'] == ShareDetail::TYPE_HOLDER_PROFIT) { // $value['profit_name'] = $holder_name ?: '股东分红'; $value['profit_name'] = $holder_name ?: '股东分红'; $value['order_no'] = '奖金池ID:' . $value['type_id']; $value['buyer_name'] = ''; $value['buyer_nickname'] = ''; $value['pay_price'] = ''; } if ($value['type'] == ShareDetail::TYPE_RANGE_PROFIT) { // $value['profit_name'] = $range_name ?: '级差分红'; $value['profit_name'] = $range_name ?: '级差分红'; } if ($value['type'] == ShareDetail::TYPE_RANGE_PROFIT_OLD) { // $value['profit_name'] = $range_name ?: '级差分红(原关系)'; $value['profit_name'] = $old_range_name ?: '级差分红(原关系)'; } if ($value['type'] == ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD) { // $value['profit_name'] = $range_name ?: '直属团队收益分成(原关系)'; $value['profit_name'] = $old_add_holder_name ?: '直属团队收益分成(原关系)'; } if ($value['type'] == ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT) { // $value['profit_name'] = $range_name ?: '直属团队收益分成'; $value['profit_name'] = $direct_range_name ?: '直属团队收益分成'; } if ($value['type'] == ShareDetail::TYPE_AREA_PROFIT) { // $value['profit_name'] = $area_name ?: '区域分红'; $value['profit_name'] = $area_name ?: '区域分红'; } if ($value['type'] == ShareDetail::TYPE_FROST_PROFIT) { // $value['profit_name'] = $range_name ?: '冻结金额释放'; $value['profit_name'] = '冻结金额释放'; } if ($value['type'] == ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL) { // $value['profit_name'] = $range_name ?: '冻结金额释放'; $value['profit_name'] = '商城会员等级分红'; } } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'] ] ]); } /** * 分销佣金列表 * @return \yii\web\Response */ public function actionShareProfitList() { try { $order_no = get_params('order_no'); $name = get_params('name'); $buyer = get_params('buyer'); $pay_start_time = get_params('pay_start_time'); $pay_end_time = get_params('pay_end_time'); $query = UserShareMoney::find()->alias('usm')->leftJoin(['o' => Order::tableName()], 'o.id=usm.order_id') ->leftJoin(['u' => User::tableName()], 'u.id=o.user_id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding') ->leftJoin(['u1' => User::tableName()], 'u1.id=usm.user_id') ->leftJoin(['su1' => SaasUser::tableName()], 'su1.mobile=u1.binding') ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id=u1.id') ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id and shl.is_delete=0') ->where(['usm.store_id' => get_store_id(), 'usm.is_delete' => 0, 'usm.type' => 2, 'usm.source' => [1, 2, 3, 4], 'o.trade_status' => [ Order::ORDER_FLOW_NO_SEND, Order::ORDER_FLOW_SEND, Order::ORDER_FLOW_CONFIRM ]]) ->groupBy("usm.id"); if ($name) { $query->andWhere([ 'or', ['like', 'su1.name', $name], ['like', 'u1.nickname', $name], ]); } if ($order_no) { $query->andWhere(['o.order_no' => $order_no]); } if ($buyer) { $query->andWhere([ 'or', ['like', 'su.name', $buyer], ['like', 'u.nickname', $buyer], ]); } if ($pay_start_time) { $query->andWhere(['>=', 'o.pay_time', strtotime($pay_start_time)]); } if ($pay_end_time) { $query->andWhere(['<=', 'o.pay_time', strtotime($pay_end_time)]); } $query->select('usm.*, su.name buyer_name, u.nickname buyer_nickname, o.pay_time, o.order_no, u1.nickname holder_nickname, u1.avatar_url holder_avatar_url, shl.name level_name, o.order_no, o.pay_price')->orderBy('usm.created_at desc'); // $query->groupBy('usm.order_id'); $list = pagination_make($query); return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'] ] ]); } catch (\Exception $e) { return $this->asJson([ 'code' => 1, 'msg' => $e->getMessage() ]); } } //奖金池新增 public function actionPoolSave() { try { $store_id = get_store_id(); $start_time = input_params('start_time'); $end_time = input_params('end_time'); $money = input_params('money'); $level_id = input_params('level_id'); $pool = new BonusPool(); $pool->store_id = $store_id; $pool->start_time = strtotime($start_time); $pool->end_time = strtotime($end_time); if(!$pool->save()){ throw new \Exception(array_shift($pool->getFirstErrors())); } $poolLevel = new BonusPoolLevel(); $poolLevel->store_id = $store_id; $poolLevel->pool_id = $pool->id; $poolLevel->money = $money; $poolLevel->level_id = $level_id; $poolLevel->user_id = '[]'; $poolLevel->is_send = 0; $poolLevel->send_time = 0; if(!$poolLevel->save()){ throw new \Exception(array_shift($poolLevel->getFirstErrors())); } return $this->asJson([ 'code' => 0, 'msg' => '操作成功', ]); } catch (\Exception $e) { return $this->asJson([ 'code' => 1, 'msg' => $e->getMessage() ]); } } /** * 奖金池列表 * @return \yii\web\Response */ public function actionPool() { $send_start_time = get_params('send_start_time'); $send_end_time = get_params('send_end_time'); $pool_time = get_params('pool_time'); $level_id = get_params('level_id'); $store_id = get_store_id(); $query = BonusPoolLevel::find()->alias('bpl')->leftJoin(['bp' => BonusPool::tableName()], 'bp.id=bpl.pool_id') ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=bpl.level_id') ->where(['bpl.store_id' => $store_id]); if ($send_start_time) { $query->andWhere(['>=', 'bp.send_time', strtotime($send_start_time)]); } if ($send_end_time) { $query->andWhere(['<=', 'bp.send_time', strtotime($send_end_time)]); } if ($pool_time) { $query->andWhere(['and', ['>=', 'bp.start_time', strtotime($pool_time)], ['<=', 'bp.end_time', strtotime($pool_time)]]); } if ($level_id) { $query->andWhere(['bpl.level_id' => $level_id]); } $query->select('bp.start_time, bp.end_time, bpl.*, shl.name level_name')->orderBy('bpl.created_at desc'); $list = pagination_make($query); $high_level_join_average = intval(Option::get('high_level_join_average', $store_id, 'bonus_pool', 0)['value']); $dividends_method = intval(Option::get('dividends_method', $store_id, 'bonus_pool', 0)['value']); foreach ($list['list'] as &$value) { $value['time'] = date('Y年m月d日', $value['start_time']) . '-' . date('Y年m月d日', $value['end_time']); $value['user_list'] = []; if ($value['is_send']) { $user_ids = Json::decode($value['user_id']); } else { $share_holder_level = $value['level_id']; if ($high_level_join_average && !$dividends_method) { $shareHolderLevelOnce = ShareHolderLevel::findOne(['is_delete' => 0, 'id' => $value['level_id']]); $share_holder_level = ShareHolderLevel::find()->where(['store_id' => $shareHolderLevelOnce->store_id, 'is_delete' => 0]) ->andWhere(['>=', 'level', $shareHolderLevelOnce->level])->select('id')->column(); } $share_holder_arr = ShareHolder::find()->where([ 'store_id' => get_store_id(), 'is_delete' => 0, 'status' => 1, 'level_id' => $share_holder_level ])->select('user_id')->asArray()->all(); if (empty($share_holder_arr)) { $user_ids = []; } else { $user_ids = array_column($share_holder_arr, 'user_id'); if ($dividends_method) { $pool_level = BonusPoolLevel::findOne($value['id']); $poolUserMoney = \app\utils\Share\BonusPool::poolUserMoney($pool_level, $user_ids); if ($poolUserMoney) { $user_ids_ = []; foreach ($poolUserMoney as $poolUserIndex => $poolUserItem) { if ($poolUserItem > 0) { $user_ids_[] = $poolUserIndex; } } $user_ids = $user_ids_; } else { $user_ids = []; } } } } $value['user_list'] = $user_ids; // if (!empty($user_ids)) { // foreach ($user_ids as $v) { // $user = User::findOne($v); // $saas_user = SaasUser::findOne(['mobile' => $user->binding]); // $share_holder = ShareHolder::findOne(['user_id' => $v]); // $share_holder_level = ShareHolderLevel::findOne($share_holder->level_id); // $money = ShareDetail::find()->where(['type' => ShareDetail::TYPE_HOLDER_PROFIT, 'type_id' => $value['pool_id'], 'user_id' => $v])->sum('money'); // $value['user_list'][] = [ // 'name' => $saas_user->name ?: $user->nickname, // 'avatar' => $saas_user->avatar ?: $user->avatar_url, // 'level_name' => $share_holder_level->name, // 'money' => $money, // 'send_time' => $value['send_time'] // ]; // } // } } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'] ] ]); } /** * 帮扶基金 * @return \yii\web\Response */ public function actionShareFrostLogList() { try { $order_no = get_params('order_no'); $is_send = get_params('is_send', -1); $send_start_time = get_params('send_start_time'); $send_end_time = get_params('send_end_time'); $query = ShareHolderFrostLog::find()->alias('shf') ->leftJoin(['o' => Order::tableName()], 'shf.order_id = o.id') ->leftJoin(['u' => User::tableName()], 'u.id=shf.child_user_id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding') ->leftJoin(['u1' => User::tableName()], 'u1.id=shf.parent_user_id') ->leftJoin(['su1' => SaasUser::tableName()], 'su1.mobile=u1.binding') ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id=u1.id') ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id') ->where(['u.store_id' => get_store_id()]) ->andWhere(['<>', 'o.trade_status', 1]); // $query = ShareDetail::find()->alias('sd')->leftJoin(['o' => Order::tableName()], 'o.id=sd.type_id') // ->leftJoin(['u' => User::tableName()], 'u.id=o.user_id') // ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding') // ->leftJoin(['u1' => User::tableName()], 'u1.id=sd.user_id') // ->leftJoin(['su1' => SaasUser::tableName()], 'su1.mobile=u1.binding') // ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id=u1.id') // ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id') // ->where(['sd.store_id' => get_store_id(), 'sd.is_delete' => 0, 'sd.type' => [6, 8]]); if ($order_no) { $query->andWhere(['o.order_no' => $order_no]); } if ($is_send >= 0 && in_array($is_send, [0, 1])) { $query->andWhere(['shf.status' => $is_send]); } if ($send_start_time) { $query->andWhere(['>=', 'shf.created_at', strtotime($send_start_time)]); } if ($send_end_time) { $query->andWhere(['<=', 'shf.created_at', strtotime($send_end_time)]); } $query->select('shf.*, su.avatar buyer_avatar, su.name buyer_name, u.nickname buyer_nickname, u1.nickname holder_name, u1.avatar_url holder_avatar, u1.nickname holder_nickname, u1.avatar_url holder_avatar_url, shl.name level_name, o.order_no')->orderBy('shf.created_at desc')->groupBy('shf.id'); $list = pagination_make($query); foreach ($list['list'] as &$item) { $item['created_at'] = date("Y-m-d H:i:s", $item['created_at']); $item['send_time'] = $item['updated_at'] ? date("Y-m-d H:i:s", $item['updated_at']) : '-'; $item['order_no'] = $item['order_no'] ?: '-'; $item['money'] = $item['amount']; } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'] ] ]); } catch (\Exception $e) { return $this->asJson([ 'code' => 1, 'msg' => $e->getMessage() ]); } } /** * 复购冻结佣金列表 * @return \yii\web\Response */ public function actionFugouFrostLogList() { try { $order_no = get_params('order_no'); $is_send = get_params('is_send', -1); $send_start_time = get_params('send_start_time'); $send_end_time = get_params('send_end_time'); $query = \app\models\ShareHolderFugouFrostLog::find()->alias('shf') ->leftJoin(['o' => Order::tableName()], 'shf.order_id = o.id') ->leftJoin(['u' => User::tableName()], 'u.id=shf.user_id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding') ->where(['u.store_id' => get_store_id()]); if ($order_no) { $query->andWhere(['o.order_no' => $order_no]); } if ($is_send >= 0 && in_array($is_send, [0, 1])) { $query->andWhere(['shf.status' => $is_send]); } if ($send_start_time) { $query->andWhere(['>=', 'shf.created_at', strtotime($send_start_time)]); } if ($send_end_time) { $query->andWhere(['<=', 'shf.created_at', strtotime($send_end_time)]); } $query->select('shf.*, u.avatar_url avatar, u.nickname name, o.order_no')->orderBy('shf.created_at desc')->groupBy('shf.id'); $list = pagination_make($query); foreach ($list['list'] as &$item) { $item['created_at'] = date("Y-m-d H:i:s", $item['created_at']); $item['send_time'] = $item['updated_at'] ? date("Y-m-d H:i:s", $item['updated_at']) : '-'; $item['order_no'] = $item['order_no'] ?: '-'; $item['money'] = $item['amount']; } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'] ] ]); } catch (\Exception $e) { return $this->asJson([ 'code' => 1, 'msg' => $e->getMessage() ]); } } /** * 下一级列表 * @return \yii\web\Response */ public function actionPoolMan() { $name = get_params('name'); $id = get_params('id'); $level_id = get_params('level_id'); $store_id = get_store_id(); $bonus_pool_level = BonusPoolLevel::findOne($id); if (!$bonus_pool_level) { return $this->asJson([ 'code' => 1, 'msg' => '未找到该等级奖金池' ]); } $user_ids = []; if ($bonus_pool_level->is_send) { $user_ids = Json::decode($bonus_pool_level->user_id); } else { $share_holder_level = $bonus_pool_level->level_id; $high_level_join_average = intval(Option::get('high_level_join_average', $store_id, 'bonus_pool', 0)['value']); $dividends_method = intval(Option::get('dividends_method', $store_id, 'bonus_pool', 0)['value']); if ($high_level_join_average && !$dividends_method) { $shareHolderLevelOnce = ShareHolderLevel::findOne(['is_delete' => 0, 'id' => $bonus_pool_level->level_id]); $share_holder_level = ShareHolderLevel::find()->where(['store_id' => $shareHolderLevelOnce->store_id, 'is_delete' => 0]) ->andWhere(['>=', 'level', $shareHolderLevelOnce->level])->select('id')->column(); } $share_holder_arr = ShareHolder::find()->where([ 'store_id' => $store_id, 'is_delete' => 0, 'status' => 1, 'level_id' => $share_holder_level ])->select('user_id')->asArray()->all(); if (!empty($share_holder_arr)) { $user_ids = array_column($share_holder_arr, 'user_id'); if ($dividends_method) { $pool_level = BonusPoolLevel::findOne($bonus_pool_level->id); $poolUserMoney = \app\utils\Share\BonusPool::poolUserMoney($pool_level, $user_ids); if ($poolUserMoney) { $user_ids_ = []; foreach ($poolUserMoney as $poolUserIndex => $poolUserItem) { if ($poolUserItem > 0) { $user_ids_[] = $poolUserIndex; } } $user_ids = $user_ids_; } else { $user_ids = []; } } } } //获取期数时间内显示用户下单金额以及金额是否达标 //获取当前期数时间 $bonus_pool = BonusPool::findOne($bonus_pool_level->pool_id); $query = ShareHolder::find()->alias('sh') ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id') ->leftJoin(['u' => User::tableName()], 'u.id=sh.user_id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding') ->where(['sh.store_id' => get_store_id()])->andWhere(['in', 'sh.user_id', $user_ids]); if ($name) { $query->andWhere([ 'or', ['like', 'u.nickname', $name], ['like', 'su.name', $name] ]); } if ($level_id) { $query->andWhere(['sh.level_id' => $level_id]); } $query->select('u.nickname, u.avatar_url, su.name, su.avatar, shl.name level_name, sh.id, sh.user_id')->orderBy('sh.audit_time desc')->groupBy('sh.user_id'); $list = pagination_make($query); foreach ($list['list'] as &$value) { //根据当前期数时间,获取用户商城下单金额 $value['pay_price'] = BonusPoolDetail::find()->alias('b')->leftJoin(['o' => Order::tableName()], 'b.order_id = o.id') ->where(['o.user_id' => $value['user_id']]) ->andWhere(['and', ['>=', 'b.created_at', $bonus_pool->start_time], ['<', 'b.created_at', $bonus_pool->end_time]]) ->groupBy('o.id') ->select('o.pay_price')->column(); $value['pay_price'] = sprintf("%.2f", array_sum($value['pay_price'])); // $value['pay_price'] = Order::find()->where(['user_id' => $value['user_id'], 'is_sale' => 1]) // ->andWhere(['and', ['>=', 'updated_at', $bonus_pool->start_time], ['<', 'updated_at', $bonus_pool->end_time]]) // ->select('pay_price')->groupBy('user_id')->sum('pay_price') ?? 0; //判断是否达标 $dividends_condition = Option::get('dividends_condition', get_store_id(), 'bonus_pool', 0)['value']; $value['is_standard'] = 0; if ($dividends_condition <= $value['pay_price']) { $value['is_standard'] = 1; } $share_detail = ShareDetail::find()->where(['is_delete' => 0, 'store_id' => get_store_id(), 'user_id' => $value['user_id'], 'type' => ShareDetail::TYPE_HOLDER_PROFIT, 'type_id' => $bonus_pool_level->id])->one(); $value['profit'] = $share_detail->money && $value['is_standard'] === 1 ? $share_detail->money : '0.00'; $value['is_send'] = $share_detail->is_send ?? 0; $value['send_time'] = $share_detail->send_time; } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'] ] ]); } /** * 奖金池发放 * @return \yii\web\Response */ public function actionSendPool() { $pool_level_id = post_params('id'); $bonus_pool_level = BonusPoolLevel::findOne($pool_level_id); if (!$bonus_pool_level || $bonus_pool_level->is_send == 1) { return $this->asJson([ 'code' => 1, 'msg' => '未找到数据或已发放' ]); } $bonus_pool = BonusPool::findOne($bonus_pool_level->pool_id); // 判断是否到发放时间 if ($bonus_pool->end_time > time()) { return $this->asJson([ 'code' => 1, 'msg' => '未到奖金池结束时间,暂时不能发放' ]); } $res = \app\utils\Share\BonusPool::poolShare($pool_level_id); return $this->asJson($res); } public function actionPoolDetail() { $order_no = get_params('order_no'); $pay_start_time = get_params('pay_start_time'); $pay_end_time = get_params('pay_end_time'); $create_start_time = get_params('create_start_time'); $create_end_time = get_params('create_end_time'); $pool_level_id = get_params('pool_level_id'); $store_id = get_store_id(); $query = BonusPoolDetail::find()->alias('bpd')->leftJoin(['o' => Order::find()->select('id, order_no, pay_price, pay_time')->andWhere(['store_id' => $store_id])->union(\app\plugins\scanCodePay\models\Order::find()->select('id, order_no, (total_price+take_price) pay_price, created_at pay_time')->andWhere(['store_id' => $store_id]))], 'o.id=bpd.order_id'); $query->andWhere(['bpd.store_id' => $store_id]); if ($pay_start_time) { $query->andWhere(['>=', 'o.pay_time', strtotime($pay_start_time)]); } if ($pay_end_time) { $query->andWhere(['<=', 'o.pay_time', strtotime($pay_end_time)]); } if ($create_start_time) { $query->andWhere(['>=', 'bpd.created_at', strtotime($create_start_time)]); } if ($create_end_time) { $query->andWhere(['<=', 'bpd.created_at', strtotime($create_end_time)]); } if ($order_no) { $query->andWhere(['like', 'o.order_no', $order_no]); } if ($pool_level_id) { $query->andWhere(['bpd.pool_level_id' => $pool_level_id]); } $query->select('bpd.*, o.order_no, o.pay_price, o.pay_time')->orderBy('bpd.created_at desc, o.pay_time desc'); $list = pagination_make($query); return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list['list'], 'pageNo' => $list['pageNo'], 'totalCount' => $list['totalCount'] ] ]); } /** * 提现列表 * @return \yii\web\Response */ public function actionCashList() { $store_id = get_store_id(); $start_time = get_params('start_time'); $end_time = get_params('end_time'); $status = get_params('status'); $name = get_params('name'); $is_area = get_params('is_area'); $audit_start_time = get_params('audit_start_time'); $audit_end_time = get_params('audit_end_time'); $query = Cash::find()->alias('c') ->leftJoin(['u' => User::tableName()], 'u.id=c.user_id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding') ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id=c.user_id') ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id') ->where(['c.is_delete' => Cash::IS_DELETE_NO, 'c.store_id' => $store_id]); if ($start_time) { $query->andWhere(['>=', 'c.created_at', strtotime($start_time)]); } if ($end_time) { $query->andWhere(['<=', 'c.created_at', strtotime($end_time)]); } if ($name) { $query->andWhere([ 'or', ['like', 'su.name', $name], ['like', 'u.nickname', $name], ]); } if ($audit_start_time) { $query->andWhere(['>=', 'c.updated_at', strtotime($audit_start_time)]); } if ($audit_end_time) { $query->andWhere(['<=', 'c.updated_at', strtotime($audit_end_time)]); } if ($status == Cash::STATUS_APPLY) { //待审核 $query->andWhere(['c.status' => Cash::STATUS_APPLY]); } if ($status == Cash::STATUS_CONFIRM) { // 待打款 $query->andWhere(['c.status' => Cash::STATUS_CONFIRM]); } if ($status == Cash::STATUS_GIVEN) { // 已打款 $query->andWhere(['in', 'c.status', [Cash::STATUS_GIVEN, Cash::STATUS_RECHARGE]]); } if ($status == Cash::STATUS_REFUSE) { // 已拒绝 $query->andWhere(['c.status' => Cash::STATUS_REFUSE]); } if ($is_area) { $query->andWhere(['cash_type' => Cash::IS_CASH_TYPE_AREA_AGENT]); } else { $query->andWhere(['c.cash_type' => 3]); } $query->distinct()->orderBy('c.status ASC,c.created_at DESC')->select([ 'c.*', 'su.id saas_user_id', 'u.nickname', 'u.avatar_url', 'u.binding', 'shl.name level_name' ]); $pagination = pagination_make($query); $list = $pagination['list']; foreach($list as &$value){ $value['service_money'] = bcdiv(bcmul($value['service_charge'], $value['price'], 2), 100, 2); $value['money'] = Cash::getServiceMoney($value); $value['status_name'] = Cash::getCashStatusName($value); $saas_user = SaasUser::findOne($value['saas_user_id']); $value['card_no'] = ''; // if (intval($value['type']) === Cash::TYPE_BANK) { if ($saas_user->withdraw_method) { $withdraw_method = json_decode($saas_user->withdraw_method, true); if (!empty($withdraw_method)) { foreach ($withdraw_method as $method_item) { if ($method_item['type'] === 'bank_card') { $value['card_no'] = $method_item['card_no']; } } } } // } $cashExtArr = CashExt::find()->where(['cash_id' => $value['id']])->select('cash_price_type, real_price')->asArray()->all(); $value['cash_ext_text'] = null; if ($cashExtArr) { $value['cash_ext_text'] = '提现明细:'; foreach ($cashExtArr as $cashExtItem) { $value['cash_ext_text'] .= CashExt::$cashPriceTypeMap[$cashExtItem['cash_price_type']] . ':' . $cashExtItem['real_price'] . ';'; } } } if($this->export = input_params('export', 0)){ return $this->export($list); } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'data' => $list, 'pageNo' => $pagination['pageNo'], 'totalCount' => $pagination['totalCount'] ], ]); } private function export($list) { $rows = [[ 'ID', '会员信息', '会员等级', '手机号', '申请提现金额(元)', '手续费(元)', '实际打款(元)', '姓名', '提现到', '账户', '身份证号', '开户行', '支行', '状态', '申请时间', '审核时间', ]]; foreach($list as $item){ $r = [ $item['id'], $item['nickname'], $item['level_name'], $item['binding'], $item['price'], $item['service_money'], $item['money'], $item['name'], Cash::$type[$item['type']] ?? '--', $item['mobile'], $item['card_no'], $item['bank_name'], $item['bank_branch'], Cash::$status[$item['status']] ?? '', date('Y-m-d H:i:s', $item['created_at']), $item['updated_at'] <= 0 ? '' : date('Y-m-d H:i:s', $item['updated_at']), ]; $rows[] = $r; } $writer = \Spatie\SimpleExcel\SimpleExcelWriter::streamDownload(time() . '.xlsx')->noHeaderRow() ->addRows($rows)->toBrowser(); } /** * 提现申请审核 * @return \yii\web\Response */ public function actionCashApply() { $id = post_params('id'); $status = post_params('status'); $store_id = get_store_id(); if (empty($id) || !is_array($id)) { return $this->asJson([ 'code' => 1, 'msg' => '数据格式错误' ]); } $t = \Yii::$app->db->beginTransaction(); foreach ($id as $value) { $cash = Cash::findOne(['id' => $value, 'is_delete' => Cash::IS_DELETE_NO, 'store_id' => $store_id]); if (!$cash) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '提现记录不存在,请刷新重试' ]); } if (!$cash->order_no) { $order_no = null; while (true) { $order_no = date('YmdHis') . mt_rand(100000, 999999); $exist_order_no = Cash::find()->where(['order_no' => $order_no])->exists(); if (!$exist_order_no) { break; } } $cash->order_no = $order_no; $cash->save(); } \Yii::$app->cache->set('holder_cash_cache_' . $value, $cash->order_no); if (!in_array($status, [1, 3])) { \Yii::$app->cache->set('holder_cash_cache_' . $value, false); $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '提现记录ID: ' . $value . '已审核,请刷新重试' ]); } $cash->status = $status; if ($status == Cash::STATUS_REFUSE) { $user = User::findOne($cash->user_id); $user->price += $cash->price; if (!$user->save()) { return $this->asJson([ 'code' => 1, 'msg' => '网络异常' ]); } // NoticeSend::CashFail($cash->user_id, $user->binding, $cash->price, '提现被驳回', '提现被驳回'); } if (!$cash->save()) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '网络异常,请刷新重试' ]); } } $t->commit(); return $this->asJson([ 'code' => 0, 'msg' => '审核成功' ]); } /** * 打款 * @return \yii\web\Response */ public function actionCashConfirm() { $id = post_params('id'); $status = post_params('status'); $store_id = get_store_id(); $store = Store::findOne($store_id); $cash = Cash::findOne([ 'id' => $id, 'is_delete' => Cash::IS_DELETE_NO, 'store_id' => $store_id ]); if (!$cash) { return $this->asJson([ 'code' => 1, 'msg' => '提现记录不存在,请刷新重试' ]); } if ($status == Cash::STATUS_GIVEN) { if($store->is_platform_transfers == 1){ $store_wechat_cash = json_decode(Option::get('store_wechat_cash', $store_id, 'store')['value'], true); $val = 0; foreach ((array)$store_wechat_cash as $value) { if (!empty($value)) { $val = 1; break; } } if(!$val){ return $this->asJson([ 'code' => 1, 'msg' => '未配置平台微信提现设置' ]); } } } if (!$cash->order_no) { $order_no = null; while (true) { $order_no = date('YmdHis') . mt_rand(100000, 999999); $exist_order_no = Cash::find()->where(['order_no' => $order_no])->exists(); if (!$exist_order_no) { break; } } $cash->order_no = $order_no; $cash->save(); } if ($cash->status != 1) { return $this->asJson([ 'code' => 1, 'msg' => '操作错误,请刷新重试' ]); } $res = []; $cashExt = CashExt::findOne(['cash_id' => $cash['id'], 'cash_price_type' => CashExt::CASH_PRICE_TYPE_AMOUNT]); if ($cashExt) { $price = $cashExt->real_price; } else { $price = ($cash->price - ($cash->price * ($cash->service_charge / 100))); } $servePrice = ($cash->price * ($cash->service_charge / 100)); if ($store->store_balance < $price && $store->is_platform_transfers == 1) { return $this->asJson([ 'code' => 1, 'msg' => '店铺剩余提现余额不足' ]); } $wechat_type = 1; $wechat_cash = Option::get('wechat_cash', $store_id, 'store')['value']; if($store->is_platform_transfers == 1){ $wechat_cash = Option::get('store_wechat_cash', $store_id, 'store')['value']; $wechat_type = 0; } if ($status == Cash::STATUS_GIVEN) { //微信自动打款 if($price <= 0){ $cash->status = Cash::STATUS_GIVEN; if($cash->save()){ return $this->asJson([ 'code' => 0, 'msg' => '成功' ]); } } if ((int)$cash->type === 0) { $cash->status = Cash::STATUS_GIVEN; $cash->pay_time = time(); $cash->pay_type = Cash::PAY_TYPE_WX; $user = User::findOne($cash->user_id); $wechat_open_id = $user->wechat_open_id; $data = [ 'partner_trade_no' => $cash->order_no, 'openid' => $wechat_open_id, 'check_name' => 'NO_CHECK', 'amount' => $price * 100, 'desc' => '转账', 'user_name' => $cash->name ]; // TODO 扣除店铺提现金额 if ($wechat_type == 0) { $cashExt = CashExt::findOne(['cash_id' => $cash->id, 'cash_price_type' => CashExt::CASH_PRICE_TYPE_AMOUNT]); $before = $store->store_balance; $store->store_balance -= $cashExt ? $cashExt->real_price : $price; $store->price -= $cashExt ? $cashExt->real_price : $price; $store->store_withdrawn_cash += $cashExt ? $cashExt->real_price : $price; $after = $store->store_balance; $cashExtServePrice = $cashExt ? bcsub($cashExt->price, $cashExt->real_price, 2) : $servePrice; $cashExtPrice = $cashExt ? $cashExt->price : $cash->price; $cashExtRealPrice = $cashExt ? $cashExt->real_price : $price; if ($store->save()) { StoreMoneyLog::saveLog(get_store_id(), StoreMoneyLog::LOG_TYPE_EXPEND, StoreMoneyLog::TYPE_SHAREHOLDER, $cashExtRealPrice, " ID{$id}:用户提现{$cashExtPrice}元,扣除手续费{$cashExtServePrice}元,提现实际扣除{$cashExtRealPrice}元", $before, $after, $wechat_type); } } $wechat = \Yii::$app->controller->wechatPay; // $res = $wechat->transfer->toBalance($data); $res = (new \app\utils\WechatMerchant\WxV3($wechat))->transferBatches(get_store_id(), $data); //判断是否使用新版本转账 增加转账标识 $wechat_cash = json_decode($wechat_cash, true); if (intval($wechat_cash['is_open']) === 2) { if (!$res['code']) { $cash->is_platform_transfers = intval($store->is_platform_transfers); $cash->wx_cash_type = Cash::WX_CASH_TYPE_NEW; $cash->wx_cash_state = $res['data']['state']; $cash->wx_cash_result_info = json_encode($res['data'], JSON_UNESCAPED_UNICODE); $cash->save(); } } // NoticeSend::CashSuccess($cash->user_id, $user->binding, $price, '微信自动打款', ($cash->price - $price)); } elseif ((int)$cash->type === 1) { $order = (object)[ 'store_id' => $cash->store_id, 'order_no' => $cash->order_no, 'pay_price' => $price, 'name' => $cash->name ]; $result = Alipay::transfer($order, $cash->mobile); if (isset($result['code']) && $result['code'] == 1) { if (strpos($result['msg'], 'aop.invalid-app-auth-token-no-api')) { $result['msg'] = '接口未授权,请前往支付宝开放平台查询是否开通产品或授权支付宝转账产品'; } if (strpos($result['msg'], 'PAYEE_NOT_EXIST')) { $result['msg'] = '收款账号不存在或姓名有误,建议核实账号和姓名是否准确'; } if (strpos($result['msg'], 'BALANCE_IS_NOT_ENOUGH')) { $result['msg'] = '商户余额不足'; } return $this->asJson($result); } else { // TODO 扣除店铺提现金额 if ($wechat_type == 0) { $cashExt = CashExt::findOne(['cash_id' => $cash->id, 'cash_price_type' => CashExt::CASH_PRICE_TYPE_AMOUNT]); $before = $store->store_balance; $store->store_balance -= $cashExt ? $cashExt->real_price : $price; $store->price -= $cashExt ? $cashExt->real_price : $price; $store->store_withdrawn_cash += $cashExt ? $cashExt->real_price : $price; $after = $store->store_balance; $cashExtServePrice = $cashExt ? bcsub($cashExt->price, $cashExt->real_price, 2) : $servePrice; $cashExtPrice = $cashExt ? $cashExt->price : $cash->price; $cashExtRealPrice = $cashExt ? $cashExt->real_price : $price; if ($store->save()) { StoreMoneyLog::saveLog(get_store_id(), StoreMoneyLog::LOG_TYPE_EXPEND, StoreMoneyLog::TYPE_SHAREHOLDER, $cashExtRealPrice, " ID{$id}:用户提现{$cashExtPrice}元,扣除手续费{$cashExtServePrice}元,提现实际扣除{$cashExtRealPrice}元", $before, $after, $wechat_type); } } } $cash->status = Cash::STATUS_GIVEN; $cash->pay_time = time(); $cash->pay_type = Cash::TYPE_ALIPAY; $cash->save(); return $this->asJson([ 'code' => 0, 'msg' => '成功' ]); }elseif ((int)$cash->type === 4) { $user = User::findOne($cash->user_id); $saas = SaasUser::findOne(['mobile' => $user->binding]); $lg_info = Lg::find()->where(['user_id'=>$saas->id,'status'=>1,'is_delete'=>0])->one(); $lgApi = new LgApi($cash->store_id); //灵工提现 $post_data = [ 'store_id' => $cash->store_id, 'outTradeNo' => $cash->order_no,//唯一批次号 'accNo' => bcmul($price,100), 'amt' => bcmul($price,100), 'name' => $cash->name, 'certCard' => $lg_info->cert_card//身份证号 ]; $result = $lgApi->FlexiblePay($post_data); if (isset($result['status']) && $result['status'] == 999) { return $this->asJson($result); } $cash->status = 6;//灵工待打款 $cash->save(); //灵工提现接口调用后消息队列查询状态 \queue_push(new LgCashJob(['id'=>$cash->id,'store_id'=>$store_id,'type'=>3,'retry' => 5]), 60); return $this->asJson([ 'code' => 0, 'msg' => '成功' ]); } } elseif ($status == Cash::STATUS_HAND) { //手动打款 // TODO 扣除店铺提现金额 if ($wechat_type == 0) { $cashExt = CashExt::findOne(['cash_id' => $cash->id, 'cash_price_type' => CashExt::CASH_PRICE_TYPE_AMOUNT]); $before = $store->store_balance; $store->store_balance -= $cashExt ? $cashExt->real_price : $price; $store->price -= $cashExt ? $cashExt->real_price : $price; $store->store_withdrawn_cash += $cashExt ? $cashExt->real_price : $price; $after = $store->store_balance; $cashExtServePrice = $cashExt ? bcsub($cashExt->price, $cashExt->real_price, 2) : $servePrice; $cashExtPrice = $cashExt ? $cashExt->price : $cash->price; $cashExtRealPrice = $cashExt ? $cashExt->real_price : $price; if ($store->save()) { StoreMoneyLog::saveLog(get_store_id(), StoreMoneyLog::LOG_TYPE_EXPEND, StoreMoneyLog::TYPE_SHAREHOLDER, $cashExtRealPrice, " ID{$id}:用户提现{$cashExtPrice}元,扣除手续费{$cashExtServePrice}元,提现实际扣除{$cashExtRealPrice}元", $before, $after, $wechat_type); } } // if ((int)$cash->type === 3) { // AccountLog::saveLog($cash->user_id, $price, 2, 1, 0, 0, '股东提现打款'); // } $cash->status = Cash::STATUS_GIVEN; $cash->pay_time = time(); $cash->pay_type = Cash::PAY_TYPE_HAND; $res['result_code'] = "SUCCESS"; // NoticeSend::CashSuccess($cash->user_id, $user->binding, $price, '手动打款', ($cash->price - $price)); } if (isset($res['result_code']) && $res['result_code'] == 'SUCCESS') { $cash->save(); return $this->asJson([ 'code' => 0, 'msg' => '成功' ]); } else { return $this->asJson([ 'code' => 1, 'msg' => !empty($res['err_code_des']) ? $res['err_code_des'] : '请稍后重试', 'data' => $res ]); } } /** * 基础设置 * @return \yii\web\Response */ public function actionSettingInfo() { $bonus_setting = new BonusPoolSetting(); $bonus_setting->store_id = get_store_id(); return $this->asJson($bonus_setting->search()); } /** * 基础设置 * @return \yii\web\Response */ public function actionSetting() { $params = post_params(); $bonus_setting = new BonusPoolSetting(); $bonus_setting->attributes = $params; $bonus_setting->store_id = get_store_id(); return $this->asJson($bonus_setting->save()); } public function actionFugouInfo() { $bonus_setting = new BonusPoolSetting(); $bonus_setting->store_id = get_store_id(); return $this->asJson($bonus_setting->fugouInfo()); } public function actionFugouSave() { $params = post_params(); $bonus_setting = new BonusPoolSetting(); $bonus_setting->attributes = $params; $bonus_setting->store_id = get_store_id(); return $this->asJson($bonus_setting->fugouSave()); } public function actionLevelDetail() { $level_id = get_params('level_id'); $share_holder_level = ShareHolderLevel::findOne($level_id); if (!$share_holder_level) { return $this->asJson([ 'code' => 1, 'msg' => '数据不存在' ]); } $condition = Json::decode($share_holder_level->condition); if (!isset($condition['self']['value']['order_number'])) { $self_price = $condition['self']['value']; $condition['self']['value'] = []; $condition['self']['value']['order_number'] = '0'; $condition['self']['value']['price'] = $self_price; } if (!isset($condition['amount_total'])) { $condition['amount_total']['is_open'] = 0; $condition['amount_total']['value'] = '0.00'; } $goods_id = $condition['goods']['value']['id']; $condition['goods']['value']['id'] = Goods::find()->where(['id' => $goods_id, 'is_delete' => 0])->select('id')->column(); // 会员列表 $level = Level::find()->select('level, name')->where([ 'store_id' => get_store_id(), 'is_delete' => Level::NOT_DELETE, 'status' => Level::STATUS_TRUE ])->asArray()->all(); $level[] = ['level' => '-1', 'name' => '普通用户']; $data = [ 'id' => $share_holder_level->id, 'level' => $share_holder_level->level, 'timeout_days' => $share_holder_level->timeout_days, 'name' => $share_holder_level->name, 'member_level' => $share_holder_level->member_level, 'condition' => $condition, 'detail' => $share_holder_level->detail, 'range_rate' => $share_holder_level->range_rate, 'team_reward_rate' => $share_holder_level->team_reward_rate, 'holder_rate' => $share_holder_level->holder_rate, 'equal_rate' => $share_holder_level->equal_rate, 'status' => $share_holder_level->status, 'is_default' => $share_holder_level->is_default, 'share_rate_one' => $share_holder_level->share_rate_one, 'share_rate_two' => $share_holder_level->share_rate_two, 'share_rate_three' => $share_holder_level->share_rate_three, 'pic_url' => $share_holder_level->pic_url, 'old_team_reward_rate' => $share_holder_level->old_team_reward_rate, 'old_range_rate' => $share_holder_level->old_range_rate, 'old_holder_rate' => $share_holder_level->old_holder_rate, 'old_equal_rate' => $share_holder_level->old_equal_rate, 'old_share_rate_one' => $share_holder_level->old_share_rate_one, 'old_share_rate_two' => $share_holder_level->old_share_rate_two, 'old_share_rate_three' => $share_holder_level->old_share_rate_three, 'old_repeat_range_rate' => $share_holder_level->old_repeat_range_rate ?: '0.00', 'range_rate_type' => $share_holder_level->range_rate_type ?? 0, 'is_user_level_range_rate' => $share_holder_level->is_user_level_range_rate ?? 0, ]; return $this->asJson([ 'code' => 0, 'data' => $data, 'member_level_list' => $level, ]); } public function actionOtherInfo() { return $this->asJson([ 'code' => 0, 'data' => [ 'agreement' => Option::get('holder_agreement', get_store_id(), 'store', '')['value'] ?: '', 'banner' => Option::get('holder_banner', get_store_id(), 'store', '')['value'] ?: [], 'holder_audit' => (int)Option::get('holder_audit', get_store_id(), 'store', 0)['value'] ?: 0 ] ]); } public function actionSubmitOtherInfo() { $holder_agreement = post_params('holder_agreement', ''); $holder_banner = post_params('holder_banner', []); $holder_audit = post_params('holder_audit', 0); Option::set(['holder_agreement', 'holder_banner', 'holder_audit'], [$holder_agreement, $holder_banner, $holder_audit], get_store_id(), 'store'); return $this->asJson([ 'code' => 0, 'msg' => '更新成功' ]); } public function actionGetFilter() { $store_id = get_store_id(); $filterLevel = ShareHolderLevel::find()->where(['store_id' => $store_id, 'is_delete' => 0])->select('level')->column(); return $this->asJson([ 'code' => 0, 'msg' => '更新成功', 'data' => $filterLevel ]); } //获取等级变动记录 public function actionGetHolderLevelLog() { try { $nickname = get_params('nickname'); $start_time = get_params('start_time'); $end_time = get_params('end_time'); $query = ShareHolderLevelLog::find()->alias('s')->where(['s.store_id' => get_store_id()]) ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id = s.user_id') ->leftJoin(['u' => User::tableName()], 's.user_id = u.id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding') ->andWhere(['AND', ['IS NOT', 'sh.id', NULL], ['IS NOT', 'u.id', NULL], ['IS NOT', 'su.id', NULL]]); if ($nickname) { $query->andWhere(['LIKE', 'su.name', $nickname]); } if ($start_time) { $query->andWhere(['>=', 's.created_at', strtotime($start_time)]); } if ($end_time) { $query->andWhere(['<=', 's.created_at', strtotime($end_time)]); } $query->select('s.id, u.nickname name, s.after_level, s.before_level, s.created_at, s.desc, u.avatar_url avatar, s.order_id'); $query->orderBy('s.created_at desc')->groupBy('s.id'); $pagination = pagination_make($query); $list = $pagination['list']; foreach ($list as &$item) { $item['order'] = Order::find()->where(['id' => $item['order_id']])->select('order_no, pay_price') ->asArray()->one(); $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']); $item['after_level'] = ShareHolderLevel::find()->where([ 'store_id' => get_store_id(), 'is_delete' => 0, 'level' => $item['after_level'] ])->select('name')->asArray()->one()['name']; $item['before_level'] = ShareHolderLevel::find()->where([ 'store_id' => get_store_id(), 'is_delete' => 0, 'level' => $item['before_level'] ])->select('name')->asArray()->one()['name']; } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'list' => $list, 'pageNo' => $pagination['pageNo'], 'totalCount' => $pagination['totalCount'] ] ]); } catch (\Exception $e) { return $this->asJson([ 'code' => 1, 'msg' => $e->getMessage() ]); } } //股东上级变动记录 public function actionGetHolderOutLog() { try { $type = get_params('type', null); $nickname = get_params('nickname'); $start_time = get_params('start_time'); $end_time = get_params('end_time'); $query = ShareHolderParentOutLog::find()->alias('s')->where(['s.store_id' => get_store_id()]) ->leftJoin(['u' => User::tableName()], 's.user_id = u.id') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding'); if ($type === null) { $query->leftJoin(['sh' => ShareHolder::tableName()], 'u.id = sh.user_id') ->andWhere(['>', 'sh.id', 0]) ->andWhere(['sh.is_delete' => 0]); } else { $query->andWhere(['s.type' => $type]); } if ($nickname) { $query->andWhere(['LIKE', 'su.name', $nickname]); } if ($start_time) { $query->andWhere(['>=', 's.created_at', strtotime($start_time)]); } if ($end_time) { $query->andWhere(['<=', 's.created_at', strtotime($end_time)]); } $query->select('s.id, u.nickname name, u.avatar_url avatar, s.parent_user_id, s.old_parent_user_id, s.created_at, s.desc, s.type'); $query->orderBy('s.id desc'); $pagination = pagination_make($query); $list = $pagination['list']; foreach ($list as &$item) { $item['type'] = (int)$item['type']; $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']); $store = Store::findOne(get_store_id()); $item['old_parent_user'] = User::find()->alias('u') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding') ->where(['u.id' => $item['old_parent_user_id']])->select('u.nickname name, u.avatar_url avatar')->asArray()->one() ?: [ 'name' => '总店', 'avatar' => $store->logo ]; $item['parent_user'] = User::find()->alias('u') ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding') ->where(['u.id' => $item['parent_user_id']])->select('u.nickname name, u.avatar_url avatar')->asArray()->one() ?: [ 'name' => '总店', 'avatar' => $store->logo ]; } return $this->asJson([ 'code' => 0, 'msg' => 'success', 'data' => [ 'q' => $query->createCommand()->getRawSql(), 'list' => $list, 'pageNo' => $pagination['pageNo'], 'totalCount' => $pagination['totalCount'] ] ]); } catch (\Exception $e) { return $this->asJson([ 'code' => 1, 'msg' => $e->getMessage() ]); } } public function actionAddPrice() { $is_order = \post_params('is_order', true); $order = \post_params('order', []); $type = \post_params('type', 2); $user = \post_params('user', []); $price = \post_params('price', 0); $remark = \post_params('remark', ''); $actionType = \post_params('actionType', 1); $t = \Yii::$app->db->beginTransaction(); try { $send_user = User::findOne($user['id']); if (!$send_user) { return $this->asJson([ 'code' => 1, 'msg' => '佣金获取人不存在' ]); } if ($actionType == 2 && $send_user->price < $price) { return $this->asJson([ 'code' => 1, 'msg' => '佣金获取人可提现佣金不足' ]); } $share_detail = new ShareDetail(); $share_detail->store_id = get_store_id(); $share_detail->user_id = $user['id']; if ($actionType == 1) { $share_detail->money = $price; } else { $share_detail->money = -$price; } $share_detail->is_send = 1; $share_detail->desc = $remark; $share_detail->type = $type; $share_detail->send_time = time(); if ($is_order) { $share_detail->type_id = $order['id']; } $share_detail->save(); if ($actionType == 1) { $send_user->total_price += $price; $send_user->price += $price; } else { $send_user->price -= $price; } $send_user->save(); $t->commit(); return $this->asJson([ 'code' => 0, 'msg' => 'success' ]); } catch (\Throwable $e) { $t->rollBack(); return $this->asJson([ 'code' => 1, 'msg' => '操作失败!', ]); } } }