562 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			562 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php
							 | 
						|||
| 
								 | 
							
								// +----------------------------------------------------------------------
							 | 
						|||
| 
								 | 
							
								// | likeshop开源商城系统
							 | 
						|||
| 
								 | 
							
								// +----------------------------------------------------------------------
							 | 
						|||
| 
								 | 
							
								// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
							 | 
						|||
| 
								 | 
							
								// | gitee下载:https://gitee.com/likeshop_gitee
							 | 
						|||
| 
								 | 
							
								// | github下载:https://github.com/likeshop-github
							 | 
						|||
| 
								 | 
							
								// | 访问官网:https://www.likeshop.cn
							 | 
						|||
| 
								 | 
							
								// | 访问社区:https://home.likeshop.cn
							 | 
						|||
| 
								 | 
							
								// | 访问手册:http://doc.likeshop.cn
							 | 
						|||
| 
								 | 
							
								// | 微信公众号:likeshop技术社区
							 | 
						|||
| 
								 | 
							
								// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
							 | 
						|||
| 
								 | 
							
								// |  likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
							 | 
						|||
| 
								 | 
							
								// | 禁止对系统程序代码以任何目的,任何形式的再发布
							 | 
						|||
| 
								 | 
							
								// | likeshop团队版权所有并拥有最终解释权
							 | 
						|||
| 
								 | 
							
								// +----------------------------------------------------------------------
							 | 
						|||
| 
								 | 
							
								// | author: likeshop.cn.team
							 | 
						|||
| 
								 | 
							
								// +----------------------------------------------------------------------
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace app\api\logic;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								use app\common\enum\DistributionOrderGoodsEnum;
							 | 
						|||
| 
								 | 
							
								use app\common\enum\NoticeEnum;
							 | 
						|||
| 
								 | 
							
								use app\common\model\distribution\Distribution;
							 | 
						|||
| 
								 | 
							
								use app\common\model\distribution\DistributionLevel;
							 | 
						|||
| 
								 | 
							
								use app\common\server\ConfigServer;
							 | 
						|||
| 
								 | 
							
								use app\common\model\user\UserDistribution;
							 | 
						|||
| 
								 | 
							
								use app\common\model\user\User;
							 | 
						|||
| 
								 | 
							
								use app\common\model\distribution\DistributionMemberApply;
							 | 
						|||
| 
								 | 
							
								use app\common\model\distribution\DistributionOrderGoods;
							 | 
						|||
| 
								 | 
							
								use app\common\server\AreaServer;
							 | 
						|||
| 
								 | 
							
								use app\common\server\JsonServer;
							 | 
						|||
| 
								 | 
							
								use app\common\server\UrlServer;
							 | 
						|||
| 
								 | 
							
								use app\common\basics\Logic;
							 | 
						|||
| 
								 | 
							
								use app\common\logic\AccountLogLogic;
							 | 
						|||
| 
								 | 
							
								use app\common\model\AccountLog;
							 | 
						|||
| 
								 | 
							
								use think\Exception;
							 | 
						|||
| 
								 | 
							
								use think\facade\Db;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								class DistributionLogic extends Logic
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * Notes: 根据后台设置返回当前生成用户的分销会员状态(设置了全员分销,新生成的用户即为分销会员)
							 | 
						|||
| 
								 | 
							
								     * @author 段誉(2021/4/7 14:48)
							 | 
						|||
| 
								 | 
							
								     * @return int
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function isDistributionMember()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $is_distribution = 0;
							 | 
						|||
| 
								 | 
							
								        //分销会员申请--1,申请分销; 2-全员分销;
							 | 
						|||
| 
								 | 
							
								        $distribution = ConfigServer::get('distribution', 'member_apply', 1);
							 | 
						|||
| 
								 | 
							
								        if ($distribution == 2) {
							 | 
						|||
| 
								 | 
							
								            $is_distribution = 1;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        return $is_distribution;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * Desc: 生成用户扩展表
							 | 
						|||
| 
								 | 
							
								     * @param $user_id
							 | 
						|||
| 
								 | 
							
								     * @return bool
							 | 
						|||
| 
								 | 
							
								     * @throws \think\db\exception\DataNotFoundException
							 | 
						|||
| 
								 | 
							
								     * @throws \think\db\exception\ModelNotFoundException
							 | 
						|||
| 
								 | 
							
								     * @throws \think\exception\DbException
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function createUserDistribution($user_id)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $user_distribution = UserDistribution::where(['user_id' => $user_id])->find();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        if ($user_distribution) {
							 | 
						|||
| 
								 | 
							
								            return true;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $data = [
							 | 
						|||
| 
								 | 
							
								            'user_id' => $user_id,
							 | 
						|||
| 
								 | 
							
								            'distribution_order_num' => 0,
							 | 
						|||
| 
								 | 
							
								            'distribution_money' => 0,
							 | 
						|||
| 
								 | 
							
								            'fans' => 0,
							 | 
						|||
| 
								 | 
							
								            'create_time' => time(),
							 | 
						|||
| 
								 | 
							
								        ];
							 | 
						|||
| 
								 | 
							
								        UserDistribution::create($data);
							 | 
						|||
| 
								 | 
							
								        return true;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 申请分销会员
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function apply($post)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								            $time = time();
							 | 
						|||
| 
								 | 
							
								            $data = [
							 | 
						|||
| 
								 | 
							
								                'user_id'       => $post['user_id'],
							 | 
						|||
| 
								 | 
							
								                'real_name'     => $post['real_name'],
							 | 
						|||
| 
								 | 
							
								                'mobile'        => $post['mobile'],
							 | 
						|||
| 
								 | 
							
								                'province'      => $post['province'],
							 | 
						|||
| 
								 | 
							
								                'city'          => $post['city'],
							 | 
						|||
| 
								 | 
							
								                'district'      => $post['district'],
							 | 
						|||
| 
								 | 
							
								                'reason'        => $post['reason'],
							 | 
						|||
| 
								 | 
							
								                'status'        => 0, // 待审核
							 | 
						|||
| 
								 | 
							
								                'create_time'   => $time,
							 | 
						|||
| 
								 | 
							
								                'update_time'   => $time,
							 | 
						|||
| 
								 | 
							
								            ];
							 | 
						|||
| 
								 | 
							
								            return DistributionMemberApply::create($data);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 最新分销申请详情
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function applyDetail($userId)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $result = DistributionMemberApply::field(['real_name','mobile','province', 'city', 'district', 'reason', 'denial_reason', 'status'])
							 | 
						|||
| 
								 | 
							
								            ->where('user_id', $userId)
							 | 
						|||
| 
								 | 
							
								            ->order('id', 'desc')
							 | 
						|||
| 
								 | 
							
								            ->findOrEmpty();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        if ($result->isEmpty()) {
							 | 
						|||
| 
								 | 
							
								            return [];
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        $result = $result->toArray();
							 | 
						|||
| 
								 | 
							
								        $result['province'] = AreaServer::getAddress($result['province']);
							 | 
						|||
| 
								 | 
							
								        $result['city'] = AreaServer::getAddress($result['city']);
							 | 
						|||
| 
								 | 
							
								        $result['district'] = AreaServer::getAddress($result['district']);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        switch ($result['status']) {
							 | 
						|||
| 
								 | 
							
								            case 0:
							 | 
						|||
| 
								 | 
							
								                $result['status_str'] = '已提交,等待客服审核...';
							 | 
						|||
| 
								 | 
							
								                break;
							 | 
						|||
| 
								 | 
							
								            case 1:
							 | 
						|||
| 
								 | 
							
								                $result['status_str'] = '已审核通过';
							 | 
						|||
| 
								 | 
							
								                break;
							 | 
						|||
| 
								 | 
							
								            case 2:
							 | 
						|||
| 
								 | 
							
								                $result['status_str'] = '审核失败,请重新提交审核';
							 | 
						|||
| 
								 | 
							
								                break;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        return $result;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 分销主页
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function index($userId)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        // 自身及上级信息
							 | 
						|||
| 
								 | 
							
								        $user_info = self::myLeader($userId);
							 | 
						|||
| 
								 | 
							
								        // 粉丝数(一级/二级)
							 | 
						|||
| 
								 | 
							
								        $fans = User::where([
							 | 
						|||
| 
								 | 
							
								            ['first_leader|second_leader', '=', $userId],
							 | 
						|||
| 
								 | 
							
								            ['del', '=', 0]
							 | 
						|||
| 
								 | 
							
								        ])->count();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //今天的预估收益(待返佣)
							 | 
						|||
| 
								 | 
							
								        $today_earnings = DistributionOrderGoods::whereDay('create_time')
							 | 
						|||
| 
								 | 
							
								            ->where(['status' => 1, 'user_id' => $userId])
							 | 
						|||
| 
								 | 
							
								            ->sum('money');
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //本月预估收益(待返佣)
							 | 
						|||
| 
								 | 
							
								        $month_earnings = DistributionOrderGoods::whereMonth('create_time')
							 | 
						|||
| 
								 | 
							
								            ->where(['status' => 1, 'user_id' => $userId])
							 | 
						|||
| 
								 | 
							
								            ->sum('money');
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        //累计收益(已结算)
							 | 
						|||
| 
								 | 
							
								        $history_earnings = DistributionOrderGoods::where(['status' => 2, 'user_id' => $userId])
							 | 
						|||
| 
								 | 
							
								            ->sum('money');
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        // 用户分销会员等级
							 | 
						|||
| 
								 | 
							
								        $levelId = Distribution::where('user_id', $userId)->value('level_id');
							 | 
						|||
| 
								 | 
							
								        $levelName = DistributionLevel::getLevelNameTwo($levelId);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $data = [
							 | 
						|||
| 
								 | 
							
								            'user' => $user_info['user'],
							 | 
						|||
| 
								 | 
							
								            'leader' => $user_info['leader'],
							 | 
						|||
| 
								 | 
							
								            'fans' => $fans,
							 | 
						|||
| 
								 | 
							
								            'able_withdrawal' => $user_info['user']['earnings'],//可提现佣金
							 | 
						|||
| 
								 | 
							
								            'today_earnings' => round($today_earnings, 2),//今天预估收益
							 | 
						|||
| 
								 | 
							
								            'month_earnings' => round($month_earnings, 2),//本月预估收益
							 | 
						|||
| 
								 | 
							
								            'history_earnings' => round($history_earnings, 2),//累计收益
							 | 
						|||
| 
								 | 
							
								            'level_name' => $levelName
							 | 
						|||
| 
								 | 
							
								        ];
							 | 
						|||
| 
								 | 
							
								        return $data;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /***
							 | 
						|||
| 
								 | 
							
								     * 获取自身及上级信息
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function myLeader($userId)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $field = 'nickname,avatar,is_distribution,mobile,first_leader,distribution_code,earnings';
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $user = User::field($field)->where(['id' => $userId, 'del'=>0])->findOrEmpty();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $first_leader = User::field('nickname,mobile')
							 | 
						|||
| 
								 | 
							
								            ->where(['id' => $user['first_leader'], 'del'=>0])
							 | 
						|||
| 
								 | 
							
								            ->findOrEmpty();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $user['avatar'] = UrlServer::getFileUrl($user['avatar']);
							 | 
						|||
| 
								 | 
							
								        return [
							 | 
						|||
| 
								 | 
							
								            'user' => $user,
							 | 
						|||
| 
								 | 
							
								            'leader' => $first_leader,
							 | 
						|||
| 
								 | 
							
								        ];
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 填写邀请码
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function code($post)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        try {
							 | 
						|||
| 
								 | 
							
								            Db::startTrans();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            $firstLeader = User::field(['id', 'first_leader', 'second_leader', 'third_leader', 'ancestor_relation','user_integral'])
							 | 
						|||
| 
								 | 
							
								                ->where(['distribution_code' => $post['code']])
							 | 
						|||
| 
								 | 
							
								                ->findOrEmpty();
							 | 
						|||
| 
								 | 
							
								            if($firstLeader->isEmpty()) {
							 | 
						|||
| 
								 | 
							
								                throw new \think\Exception('无效的邀请码');
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            // 上级
							 | 
						|||
| 
								 | 
							
								            $first_leader_id = $firstLeader['id'];
							 | 
						|||
| 
								 | 
							
								            // 上上级
							 | 
						|||
| 
								 | 
							
								            $second_leader_id = $firstLeader['first_leader'];
							 | 
						|||
| 
								 | 
							
								            // 上上上级
							 | 
						|||
| 
								 | 
							
								            $third_leader_id = $firstLeader['second_leader'];
							 | 
						|||
| 
								 | 
							
								            // 拼接关系链
							 | 
						|||
| 
								 | 
							
								            $firstLeader['ancestor_relation'] = boolval($firstLeader['ancestor_relation']) ?? ''; // 清空null值及0
							 | 
						|||
| 
								 | 
							
								            $my_ancestor_relation = $first_leader_id. ',' . $firstLeader['ancestor_relation'];
							 | 
						|||
| 
								 | 
							
								            // 去除两端逗号
							 | 
						|||
| 
								 | 
							
								            $my_ancestor_relation = trim($my_ancestor_relation, ',');
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            $user = User::findOrEmpty($post['user_id']);
							 | 
						|||
| 
								 | 
							
								            // 旧关系链
							 | 
						|||
| 
								 | 
							
								            if (!empty($user->ancestor_relation)) {
							 | 
						|||
| 
								 | 
							
								                $old_ancestor_relation = $user->id . ',' .$user->ancestor_relation;
							 | 
						|||
| 
								 | 
							
								            } else {
							 | 
						|||
| 
								 | 
							
								                $old_ancestor_relation = $user->id;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            $data = [
							 | 
						|||
| 
								 | 
							
								                'first_leader' => $first_leader_id,
							 | 
						|||
| 
								 | 
							
								                'second_leader' => $second_leader_id,
							 | 
						|||
| 
								 | 
							
								                'third_leader' => $third_leader_id,
							 | 
						|||
| 
								 | 
							
								                'ancestor_relation' => $my_ancestor_relation,
							 | 
						|||
| 
								 | 
							
								                'update_time' => time()
							 | 
						|||
| 
								 | 
							
								            ];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            // 更新当前用户的分销关系
							 | 
						|||
| 
								 | 
							
								            User::where(['id' => $post['user_id']])->update($data);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //更新当前用户下级的分销关系
							 | 
						|||
| 
								 | 
							
								            $data = [
							 | 
						|||
| 
								 | 
							
								                'second_leader' => $first_leader_id,
							 | 
						|||
| 
								 | 
							
								                'third_leader' => $second_leader_id,
							 | 
						|||
| 
								 | 
							
								                'update_time'  => time()
							 | 
						|||
| 
								 | 
							
								            ];
							 | 
						|||
| 
								 | 
							
								            User::where(['first_leader' => $post['user_id']])->update($data);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //更新当前用户下下级的分销关系
							 | 
						|||
| 
								 | 
							
								            $data = [
							 | 
						|||
| 
								 | 
							
								                'third_leader' => $first_leader_id,
							 | 
						|||
| 
								 | 
							
								                'update_time'  => time()
							 | 
						|||
| 
								 | 
							
								            ];
							 | 
						|||
| 
								 | 
							
								            User::where(['second_leader' => $post['user_id']])->update($data);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //更新当前用户所有后代的关系链
							 | 
						|||
| 
								 | 
							
								            $posterityArr = User::field('id,ancestor_relation')
							 | 
						|||
| 
								 | 
							
								                ->whereFindInSet('ancestor_relation', $post['user_id'])
							 | 
						|||
| 
								 | 
							
								                ->select()
							 | 
						|||
| 
								 | 
							
								                ->toArray();
							 | 
						|||
| 
								 | 
							
								            $updateData = [];
							 | 
						|||
| 
								 | 
							
								            $replace_ancestor_relation = $post['user_id'] . ','. $my_ancestor_relation;
							 | 
						|||
| 
								 | 
							
								            foreach($posterityArr as $item) {
							 | 
						|||
| 
								 | 
							
								                $updateData[] = [
							 | 
						|||
| 
								 | 
							
								                    'id' => $item['id'],
							 | 
						|||
| 
								 | 
							
								                    'ancestor_relation' => trim(str_replace($old_ancestor_relation, $replace_ancestor_relation, $item['ancestor_relation']), ',')
							 | 
						|||
| 
								 | 
							
								                ];
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            // 批量更新
							 | 
						|||
| 
								 | 
							
								            (new User())->saveAll($updateData);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //邀请会员赠送积分
							 | 
						|||
| 
								 | 
							
								            $invited_award_integral = ConfigServer::get('marketing','invited_award_integral',0);
							 | 
						|||
| 
								 | 
							
								            if($invited_award_integral > 0){
							 | 
						|||
| 
								 | 
							
								                // 增加上级积分
							 | 
						|||
| 
								 | 
							
								                $firstLeader->user_integral += (int)$invited_award_integral;
							 | 
						|||
| 
								 | 
							
								                $firstLeader->save();
							 | 
						|||
| 
								 | 
							
								                // 增加上级积分变动记录
							 | 
						|||
| 
								 | 
							
								                AccountLogLogic::AccountRecord($firstLeader['id'],$invited_award_integral,1, AccountLog::invite_add_integral);
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            //通知用户
							 | 
						|||
| 
								 | 
							
								            event('Notice', [
							 | 
						|||
| 
								 | 
							
								                'scene' => NoticeEnum::INVITE_SUCCESS_NOTICE,
							 | 
						|||
| 
								 | 
							
								                'params' => [
							 | 
						|||
| 
								 | 
							
								                    'user_id' => $first_leader_id,
							 | 
						|||
| 
								 | 
							
								                    'lower_id' => $post['user_id'],
							 | 
						|||
| 
								 | 
							
								                    'join_time' => date('Y-m-d H:i:s', time())
							 | 
						|||
| 
								 | 
							
								                ]
							 | 
						|||
| 
								 | 
							
								            ]);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            Db::commit();
							 | 
						|||
| 
								 | 
							
								            return true;
							 | 
						|||
| 
								 | 
							
								        } catch (\Exception $e) {
							 | 
						|||
| 
								 | 
							
								            Db::rollback();
							 | 
						|||
| 
								 | 
							
								            self::$error = $e->getMessage();
							 | 
						|||
| 
								 | 
							
								            return false;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 分销订单
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function order($get)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $where[] = ['d.user_id', '=', $get['user_id']];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        if (isset($get['status']) && in_array($get['status'], [1,2,3])) {
							 | 
						|||
| 
								 | 
							
								            $where[] = ['d.status', '=', $get['status']];
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $field = 'd.create_time, d.money, d.goods_num, d.status, d.status as statusDesc, o.order_sn, og.total_pay_price as pay_price, g.image as goods_image, g.name as goods_name, gi.spec_value_str';
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $count = DistributionOrderGoods::alias('d')
							 | 
						|||
| 
								 | 
							
								            ->where($where)
							 | 
						|||
| 
								 | 
							
								            ->count();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $lists = DistributionOrderGoods::alias('d')
							 | 
						|||
| 
								 | 
							
								            ->field($field)
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('order_goods og', 'og.id = d.order_goods_id')
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('order o', 'o.id = og.order_id')
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('goods g', 'og.goods_id=g.id')
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('goods_item gi', 'og.item_id=gi.id')
							 | 
						|||
| 
								 | 
							
								            ->where($where)
							 | 
						|||
| 
								 | 
							
								            ->order('d.create_time desc')
							 | 
						|||
| 
								 | 
							
								            ->page($get['page_no'], $get['page_size'])
							 | 
						|||
| 
								 | 
							
								            ->select()
							 | 
						|||
| 
								 | 
							
								            ->toArray();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        foreach ($lists as &$item) {
							 | 
						|||
| 
								 | 
							
								            $item['goods_image'] = empty($item['goods_image']) ? '' : UrlServer::getFileUrl($item['goods_image']);
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $data = [
							 | 
						|||
| 
								 | 
							
								            'list' => $lists,
							 | 
						|||
| 
								 | 
							
								            'page' => $get['page_no'],
							 | 
						|||
| 
								 | 
							
								            'size' => $get['page_size'],
							 | 
						|||
| 
								 | 
							
								            'count' => $count,
							 | 
						|||
| 
								 | 
							
								            'more' => is_more($count, $get['page_no'], $get['page_size'])
							 | 
						|||
| 
								 | 
							
								        ];
							 | 
						|||
| 
								 | 
							
								        return $data;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 月度账单
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function monthBill($get)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $field = [
							 | 
						|||
| 
								 | 
							
								            "FROM_UNIXTIME(d.create_time,'%Y年%m月') as date",
							 | 
						|||
| 
								 | 
							
								            "FROM_UNIXTIME(d.create_time,'%Y') as year",
							 | 
						|||
| 
								 | 
							
								            "FROM_UNIXTIME(d.create_time,'%m') as month",
							 | 
						|||
| 
								 | 
							
								            'sum(d.money) as total_money',
							 | 
						|||
| 
								 | 
							
								            'count(d.id) as order_num'
							 | 
						|||
| 
								 | 
							
								        ];
							 | 
						|||
| 
								 | 
							
								        $count = DistributionOrderGoods::alias('d')
							 | 
						|||
| 
								 | 
							
								            ->field($field)
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('order_goods g', 'g.id = d.order_goods_id')
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('order o', 'o.id = g.order_id')
							 | 
						|||
| 
								 | 
							
								            ->where(['d.user_id' => $get['user_id']])
							 | 
						|||
| 
								 | 
							
								            ->where('d.status', 'in', [1, 2])
							 | 
						|||
| 
								 | 
							
								            ->group('date')
							 | 
						|||
| 
								 | 
							
								            ->count();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $lists = DistributionOrderGoods::alias('d')
							 | 
						|||
| 
								 | 
							
								            ->field($field)
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('order_goods g', 'g.id = d.order_goods_id')
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('order o', 'o.id = g.order_id')
							 | 
						|||
| 
								 | 
							
								            ->where(['d.user_id' => $get['user_id']])
							 | 
						|||
| 
								 | 
							
								            ->where('d.status', 'in', [1, 2])
							 | 
						|||
| 
								 | 
							
								            ->order('d.create_time desc')
							 | 
						|||
| 
								 | 
							
								            ->page($get['page_no'], $get['page_size'])
							 | 
						|||
| 
								 | 
							
								            ->group('date')
							 | 
						|||
| 
								 | 
							
								            ->select()
							 | 
						|||
| 
								 | 
							
								            ->toArray();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $data = [
							 | 
						|||
| 
								 | 
							
								            'list' => $lists,
							 | 
						|||
| 
								 | 
							
								            'page' => $get['page_no'],
							 | 
						|||
| 
								 | 
							
								            'size' => $get['page_size'],
							 | 
						|||
| 
								 | 
							
								            'count' => $count,
							 | 
						|||
| 
								 | 
							
								            'more' => is_more($count, $get['page_no'], $get['page_size'])
							 | 
						|||
| 
								 | 
							
								        ];
							 | 
						|||
| 
								 | 
							
								        return $data;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * 月度明细
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function monthDetail($get)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $where[] = ['d.user_id', '=', $get['user_id']];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $monthStr = $get['year'] . '-' . str_pad($get['month'], 2, '0', STR_PAD_LEFT);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $field = 'd.create_time, d.money, d.goods_num, d.status, d.status as statusDesc, o.order_sn, og.total_pay_price as pay_price, g.image as goods_image, g.name as goods_name, gi.spec_value_str';
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $count = DistributionOrderGoods::alias('d')
							 | 
						|||
| 
								 | 
							
								            ->where($where)
							 | 
						|||
| 
								 | 
							
								            ->whereMonth('d.create_time', $monthStr)
							 | 
						|||
| 
								 | 
							
								            ->count();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $lists = DistributionOrderGoods::alias('d')
							 | 
						|||
| 
								 | 
							
								            ->field($field)
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('order_goods og', 'og.id = d.order_goods_id')
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('order o', 'o.id = og.order_id')
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('goods g', 'og.goods_id=g.id')
							 | 
						|||
| 
								 | 
							
								            ->leftJoin('goods_item gi', 'og.item_id=gi.id')
							 | 
						|||
| 
								 | 
							
								            ->where($where)
							 | 
						|||
| 
								 | 
							
								            ->whereMonth('d.create_time', $monthStr)
							 | 
						|||
| 
								 | 
							
								            ->order('d.create_time desc')
							 | 
						|||
| 
								 | 
							
								            ->page($get['page_no'], $get['page_size'])
							 | 
						|||
| 
								 | 
							
								            ->select()
							 | 
						|||
| 
								 | 
							
								            ->toArray();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        $data = [
							 | 
						|||
| 
								 | 
							
								            'list' => $lists,
							 | 
						|||
| 
								 | 
							
								            'page' => $get['page_no'],
							 | 
						|||
| 
								 | 
							
								            'size' => $get['page_size'],
							 | 
						|||
| 
								 | 
							
								            'count' => $count,
							 | 
						|||
| 
								 | 
							
								            'more' => is_more($count, $get['page_no'], $get['page_size'])
							 | 
						|||
| 
								 | 
							
								        ];
							 | 
						|||
| 
								 | 
							
								        return $data;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * Desc: 取消订单后更新分销订单为已失效
							 | 
						|||
| 
								 | 
							
								     * @param $order_id
							 | 
						|||
| 
								 | 
							
								     * @throws Exception
							 | 
						|||
| 
								 | 
							
								     * @throws \think\exception\PDOException
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function setDistributionOrderFail($order_id)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        //订单取消后更新分销订单为已失效状态
							 | 
						|||
| 
								 | 
							
								        return Db::name('distribution_order_goods d')
							 | 
						|||
| 
								 | 
							
								            ->join('order_goods og', 'og.id = d.order_goods_id')
							 | 
						|||
| 
								 | 
							
								            ->join('order o', 'o.id = og.order_id')
							 | 
						|||
| 
								 | 
							
								            ->where('o.id', $order_id)
							 | 
						|||
| 
								 | 
							
								            ->update([
							 | 
						|||
| 
								 | 
							
								                'd.status' => DistributionOrderGoodsEnum::STATUS_ERROR,
							 | 
						|||
| 
								 | 
							
								                'd.update_time' => time(),
							 | 
						|||
| 
								 | 
							
								            ]);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * @Notes: 分销佣金列表
							 | 
						|||
| 
								 | 
							
								     * @Author: 张无忌
							 | 
						|||
| 
								 | 
							
								     * @param $get
							 | 
						|||
| 
								 | 
							
								     * @param $user_id
							 | 
						|||
| 
								 | 
							
								     * @return bool|array
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function commission($get, $user_id)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        try {
							 | 
						|||
| 
								 | 
							
								            $where = [
							 | 
						|||
| 
								 | 
							
								                ['user_id', '=', $user_id],
							 | 
						|||
| 
								 | 
							
								                ['source_type', 'in', AccountLog::earnings_change]
							 | 
						|||
| 
								 | 
							
								            ];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            $model = new AccountLog();
							 | 
						|||
| 
								 | 
							
								            $count = $model->where($where)->count();
							 | 
						|||
| 
								 | 
							
								            $lists = $model->field(['id,source_type,change_amount,change_type,create_time'])
							 | 
						|||
| 
								 | 
							
								                ->where($where)
							 | 
						|||
| 
								 | 
							
								                ->order('id', 'desc')
							 | 
						|||
| 
								 | 
							
								                ->page($get['page_no'] ?? 1, $get['page_size'] ?? 20)
							 | 
						|||
| 
								 | 
							
								                ->select();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            foreach ($lists as &$item) {
							 | 
						|||
| 
								 | 
							
								                $symbol = $item['change_type'] == 1 ? '+' : '-';
							 | 
						|||
| 
								 | 
							
								                $item['change_amount'] = $symbol.$item['change_amount'];
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return [
							 | 
						|||
| 
								 | 
							
								                'list'  => $lists,
							 | 
						|||
| 
								 | 
							
								                'page'  => $get['page_no']??1,
							 | 
						|||
| 
								 | 
							
								                'size'  => $get['page_size']??20,
							 | 
						|||
| 
								 | 
							
								                'count' => $count,
							 | 
						|||
| 
								 | 
							
								                'more'  => is_more($count, $get['page_no']??1, $get['page_size']??20)
							 | 
						|||
| 
								 | 
							
								            ];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        } catch (\Exception $e) {
							 | 
						|||
| 
								 | 
							
								            static::$error = $e->getMessage();
							 | 
						|||
| 
								 | 
							
								            return false;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public static function fixAncestorRelation()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        try {
							 | 
						|||
| 
								 | 
							
								            $userList = User::select()->toArray();
							 | 
						|||
| 
								 | 
							
								            if (empty($userList)) {
							 | 
						|||
| 
								 | 
							
								                throw new \Exception('没有用户,无需修复');
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            $updateEmptyData = [];
							 | 
						|||
| 
								 | 
							
								            $updateData = [];
							 | 
						|||
| 
								 | 
							
								            foreach($userList as $user) {
							 | 
						|||
| 
								 | 
							
								                $my_ancestor_relation = self::myAncestorRelation($user);
							 | 
						|||
| 
								 | 
							
								                $updateEmptyData[] = ['id' => $user['id'], 'ancestor_relation' => ''];
							 | 
						|||
| 
								 | 
							
								                $updateData[] = ['id' => $user['id'], 'ancestor_relation' => $my_ancestor_relation];
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            // 先清除所有关系链
							 | 
						|||
| 
								 | 
							
								            (new User())->saveAll($updateEmptyData);
							 | 
						|||
| 
								 | 
							
								            // 重新设置关系链
							 | 
						|||
| 
								 | 
							
								            (new User())->saveAll($updateData);
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            return true;
							 | 
						|||
| 
								 | 
							
								        } catch (\Exception $e) {
							 | 
						|||
| 
								 | 
							
								            self::$error = $e->getMessage();
							 | 
						|||
| 
								 | 
							
								            return false;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public static function myAncestorRelation($user)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        if (empty($user['first_leader'])) {
							 | 
						|||
| 
								 | 
							
								            return '';
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								        return trim(self::findAncestorRelation($user['first_leader']), ',');
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    public static function findAncestorRelation($id, $flag = true)
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        static $ancestor_relation = '';
							 | 
						|||
| 
								 | 
							
								        if ($flag) {
							 | 
						|||
| 
								 | 
							
								            $ancestor_relation = '';
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        $ancestor_relation .= $id . ',';
							 | 
						|||
| 
								 | 
							
								        $user = User::findOrEmpty($id);
							 | 
						|||
| 
								 | 
							
								        if (empty($user['first_leader'])) {
							 | 
						|||
| 
								 | 
							
								            return $ancestor_relation;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        return self::findAncestorRelation($user['first_leader'], false);
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    /**
							 | 
						|||
| 
								 | 
							
								     * @notes 获取背景海报
							 | 
						|||
| 
								 | 
							
								     * @return array|mixed|string|null
							 | 
						|||
| 
								 | 
							
								     * @author cjhao
							 | 
						|||
| 
								 | 
							
								     * @date 2021/11/29 11:35
							 | 
						|||
| 
								 | 
							
								     */
							 | 
						|||
| 
								 | 
							
								    public static function getPoster()
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        $poster = ConfigServer::get('invite', 'poster', '/images/share/share_user_bg.png');
							 | 
						|||
| 
								 | 
							
								        $poster = empty($poster) ? $poster : UrlServer::getFileUrl($poster);
							 | 
						|||
| 
								 | 
							
								        return ['poster'=>$poster];
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |