Current Path : /www/wwwroot/jsnz.xshop.geekdanceshop.com/app/model/member/
Upload File :
Current File : /www/wwwroot/jsnz.xshop.geekdanceshop.com/app/model/member/Member.php

<?php
/**
 * Niushop商城系统 - 团队十年电商经验汇集巨献!
 * =========================================================
 * Copy right 2019-2029 杭州牛之云科技有限公司, 保留所有权利。
 * ----------------------------------------------
 * 官方网址: https://www.niushop.com
 * =========================================================
 */

namespace app\model\member;

use addon\memberregister\model\Register as RegisterModel;
use app\model\BaseModel;
use app\model\message\Sms;
use app\model\system\Stat;
use app\model\upload\Upload;
use app\model\system\Address;
use think\facade\Cache;
use think\facade\Db;
use addon\wechat\model\Fans;
use think\facade\Config;

/**
 * 会员管理
 */
class Member extends BaseModel
{

    /**
     * 添加会员(注意等级名称)
     * @param $data
     * @return array
     */
    public function addMember($data)
    {
        if ($data[ 'username' ]) {
            $count = model('member')->getCount([
                [ 'username', '=', $data[ 'username' ] ],
                [ 'site_id', '=', $data[ 'site_id' ] ],
                [ 'is_delete', '=', 0 ]
            ]);
            if ($count > 0) {
                return $this->error('', 'USERNAME_EXISTED');
            }
        }

        if ($data[ 'mobile' ]) {
            $count = model('member')->getCount([
                [ 'mobile', '=', $data[ 'mobile' ] ],
                [ 'site_id', '=', $data[ 'site_id' ] ],
                [ 'is_delete', '=', 0 ]
            ]);
            if ($count > 0) {
                return $this->error('', 'MOBILE_EXISTED');
            }
        }

        if ($data[ 'email' ]) {
            $count = model('member')->getCount([
                [ 'email', '=', $data[ 'email' ] ],
                [ 'site_id', '=', $data[ 'site_id' ] ],
                [ 'is_delete', '=', 0 ]
            ]);
            if ($count > 0) {
                return $this->error('', 'EMAIL_EXISTED');
            }
        }

        $register_model = new RegisterModel();

        $register_config = $register_model->getConfig($data[ 'site_id' ])[ 'data' ];
        if ($register_config[ 'is_use' ]) {
            $data[ 'can_receive_registergift' ] = 1;
        }
        if ($data[ 'member_level' ]) {
            $data[ 'is_member' ] = 1;
            $data[ 'member_time' ] = time();
            $level_info = model('member_level')->getInfo([['level_id', '=', $data[ 'member_level' ]]], 'growth');
            if(!empty($level_info)) $data['growth'] = $level_info['growth'];
        }

        $res = model('member')->add($data);
        if ($res === false) {
            return $this->error('', 'RESULT_ERROR');
        }
        //添加统计
        $stat = new Stat();
        $stat->switchStat([ 'type' => 'add_member', 'data' => [ 'member_count' => 1, 'site_id' => $data[ 'site_id' ] ] ]);
//        $stat->addShopStat([ 'member_count' => 1, 'site_id' => $data['site_id'] ]);
        return $this->success($res);
    }

    /**
     * 修改会员(注意标签与等级名称)
     * @param $data
     * @param $condition
     * @return array
     */
    public function editMember($data, $condition)
    {
        if (isset($data[ 'mobile' ]) && $data[ 'mobile' ] != '') {
            $check_condition = array_column($condition, 2, 0);
            $site_id = $check_condition['site_id'] ?? 0;
            $member_id = $check_condition['member_id'] ?? 0;
            $mobile_is_exist = model('member')->getCount([ [ 'mobile', '=', $data[ 'mobile' ] ], [ 'member_id', '<>', $member_id ], [ 'site_id', '=', $site_id ], [ 'is_delete', '=', 0 ] ]);
            if ($mobile_is_exist > 0) return $this->error('', 'MOBILE_EXISTED');
        }
        $res = model('member')->update($data, $condition);
        if ($res === false) {
            return $this->error('', 'SAVE_FAIL');
        }

        return $this->success($res);
    }

    /**
     * 修改用户名
     * @param $member_id
     * @param $site_id
     * @param $username
     * @return array
     */
    public function editUsername($member_id, $site_id, $username)
    {
        $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ] ], 'username,is_edit_username');

        if (empty($member_info)) return $this->error('', '未查找到该用户');
        if ($member_info[ 'username' ] == $username) return $this->error('', '与原用户名一致,无需修改');
        if (!$member_info[ 'is_edit_username' ]) return $this->error('', '用户名不可进行修改');

        $count = model('member')->getCount([ [ 'username', '=', $username ], [ 'site_id', '=', $site_id ] ], 'member_id');
        if ($count != 0) return $this->error('', '该用户名已存在');

        model('member')->update([ 'username' => $username, 'is_edit_username' => 0 ], [ [ 'member_id', '=', $member_id ] ]);
        return $this->success();
    }

    /**
     * 修改会员状态
     * @param $status
     * @param $condition
     * @return array
     */
    public function modifyMemberStatus($status, $condition)
    {
        $res = model('member')->update([
            'status' => $status
        ], $condition);
        if ($res === false) {
            return $this->error('', 'RESULT_ERROR');
        }

        $check_condition = array_column($condition, 2, 0);
        $site_id = $check_condition['site_id'] ?? 0;
        Cache::set('member_blacklist_' . $site_id, null);
        return $this->success($res);
    }

    /**
     * 修改会员标签
     * @param $label_ids
     * @param $condition
     * @return array
     */
    public function modifyMemberLabel($label_ids, $condition)
    {
        //查询会员标签
        $label_list = model("member_label")->getList([ [ 'label_id', 'in', $label_ids ] ], 'label_id,label_name');

        $label_ids = '';
        $label_names = '';
        if (!empty($label_list)) {
            foreach ($label_list as $k => $v) {
                $label_ids = $label_ids . $v[ 'label_id' ] . ',';
                $label_names = $label_names . $v[ 'label_name' ] . ',';
            }
        }
        $res = model('member')->update([
            'member_label' => $label_ids,
            'member_label_name' => $label_names
        ], $condition);
        if ($res === false) {
            return $this->error('', 'RESULT_ERROR');
        }
        return $this->success($res);
    }

    /**
     * 重置密码
     * @param string $password
     * @param $condition
     * @return array
     */
    public function resetMemberPassword($password, $condition)
    {
        $res = model('member')->update([
            'password' => data_md5($password)
        ], $condition);

        if ($res === false) {
            return $this->error('', 'RESULT_ERROR');
        }
        return $this->success($res);
    }

    /**
     * 修改密码
     * @param $member_id
     * @param $old_password
     * @param $new_password
     * @return array
     */
    public function modifyMemberPassword($member_id, $old_password, $new_password)
    {
        $res = model('member')->getCount([
            [ 'password', '=', data_md5($old_password) ],
            [ 'member_id', '=', $member_id ],
        ]);
        if ($res > 0) {
            $res = model('member')->update([
                'password' => data_md5($new_password)
            ], [ [ 'member_id', '=', $member_id ] ]);
            if ($res === false) {
                return $this->error('', 'RESULT_ERROR');
            }
            return $this->success($res);
        } else {
            return $this->error('', 'PASSWORD_ERROR');
        }
    }

    /**
     * 删除会员(应用后台)
     * @param $condition
     * @return array
     */
    public function deleteMember($condition)
    {
        $res = model('member')->delete($condition);
        if ($res === false) {
            return $this->error('', 'RESULT_ERROR');
        }
        return $this->success($res);
    }

    /**
     * 获取会员信息
     * @param array $condition
     * @param string $field
     * @return array
     */
    public function getMemberInfo($condition = [], $field = '*')
    {
        $condition[] = [ 'is_delete', '=', 0 ];
        $member_info = model('member')->setIsCache(0)->getInfo($condition, $field);

        if (!empty($member_info) && empty($member_info[ 'wx_openid' ]) && !empty($member_info[ 'wx_unionid' ])) {
            $fans_model = new Fans();
            $fans_condition[] = [ "unionid", "=", $member_info[ 'wx_unionid' ] ];
            $fans_info = $fans_model->getFansInfo($fans_condition);
            if (!empty($fans_info[ 'data' ])) {
                $member_info[ 'wx_openid' ] = $fans_info[ 'data' ][ 'openid' ];
            }
        }

        return $this->success($member_info);
    }

    /**
     * 获取会员信息
     * @param int $member_id
     * @return array
     */
    public function getMemberDetail($member_id, $site_id)
    {
        $field = 'member_id,source_member,username,nickname,mobile,email,status,headimg,member_level,member_level_name,member_label,member_label_name,qq,realname,sex,location,birthday,reg_time,point,balance,growth,balance_money,account5,pay_password,member_level_type';
        $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ], [ 'site_id', '=', $site_id ] ], $field);
        if (!empty($member_info)) {
            $member_info[ 'balance_total' ] = $member_info[ 'balance' ] + $member_info[ 'balance_money' ];
            return $this->success($member_info);
        }
        return $this->error();
    }

    /**
     * 获取会员数量
     * @param array $condition
     * @return array
     */
    public function getMemberCount($condition = [])
    {
        $condition[] = [ 'is_delete', '=', 0 ];
        $member_info = model('member')->getCount($condition);
        return $this->success($member_info);
    }

    /**
     * 获取会员字段总和
     * @param array $condition
     * @return array
     */
    public function getMemberSum($condition, $field)
    {
        $member_info = model('member')->getSum($condition, $field);
        return $this->success($member_info);
    }

    /**
     * 获取会员分页列表
     * @param array $condition
     * @param int $page
     * @param int $page_size
     * @param string $order
     * @param string $field
     * @return array
     */
    public function getMemberPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
    {
        $condition[] = [ 'is_delete', '=', 0 ];
        $list = model('member')->pageList($condition, $field, $order, $page, $page_size, '', '', '');
        return $this->success($list);
    }

    /**
     * 获取会员列表
     * @param array $where
     * @param bool $field
     * @param string $order
     * @param string $alias
     * @param array $join
     * @param string $group
     * @param null $limit
     * @return array
     */
    public function getMemberList($where = [], $field = true, $order = '', $alias = 'a', $join = [], $group = '', $limit = null)
    {
        $where[] = [ 'is_delete', '=', 0 ];
        $res = model('member')->getList($where, $field, $order, $alias, $join, $group, $limit);
        return $this->success($res);
    }

    /**
     * 客户设置成会员
     * @param $member_id
     * @return int
     */
    public function makeMember($member_id)
    {
        $res = model('member')->update([ 'is_member' => 1, 'member_time' => time() ], [ [ 'member_id', '=', $member_id ] ]);
        return $res;
    }

    /**
     * 检测成为会员条件
     * @param $member_id
     * @return bool
     */
    public function checkMember($member_id)
    {

        $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ] ], 'member_level');
        if (empty($member_info)) {
            return false;
        }
        if ($member_info[ 'member_level' ] == 0) {
            return false;
        }
        return true;
    }

    /**
     * 检测当前的memberid是否是有效会员
     * @param $member_id
     * @param $site_id
     * @return bool
     */
    public function checkMemberByMemberId($member_id, $site_id)
    {
        //检测会员是否以被删除
        $member_info = model('member')->getInfo([ [ 'member_id', '=', $member_id ], [ 'is_delete', '=', 0 ], [ 'status', '<>', 0 ], [ 'site_id', '=', $site_id ] ], 'member_id');
        $check_member_id = $member_info[ 'member_id' ] ?? 0;
        if (empty($check_member_id)) {
            return false;
        }
        return true;

    }

    /**
     * 绑定发送验证码
     * @param $data
     * @return array|mixed|void
     */
    public function bindCode($data)
    {
        //发送短信
        $sms_model = new Sms();
        $var_parse = array (
            "code" => $data[ "code" ],//验证码
        );
        $data[ "sms_account" ] = $data[ "mobile" ] ?? '';//手机号
        $data[ "var_parse" ] = $var_parse;
        $sms_result = $sms_model->sendMessage($data);
        if ($sms_result[ "code" ] < 0)
            return $sms_result;

        return $this->success();
    }

    /**
     * 找回密码发送验证码
     * @param $data
     * @return array|mixed|void
     */
    public function findCode($data)
    {
        //发送短信
        $sms_model = new Sms();
        $var_parse = array (
            "code" => $data[ "code" ],//验证码
        );
        $data[ "sms_account" ] = $data[ "mobile" ] ?? '';//手机号
        $data[ "var_parse" ] = $var_parse;
        $sms_result = $sms_model->sendMessage($data);
        if ($sms_result[ "code" ] < 0)
            return $sms_result;

        return $this->success();
    }

    /**
     * 设置会员交易密码
     * @param unknown $member_id
     * @param $password
     * @return array
     */
    public function modifyMemberPayPassword($member_id, $password)
    {
        $res = model('member')->update([
            'pay_password' => data_md5($password)
        ], [ [ 'member_id', '=', $member_id ] ]);
        if ($res === false) {
            return $this->error('', 'RESULT_ERROR');
        }
        return $this->success($res);
    }

    /**
     * 会员是否已设置支付密码
     * @param int $member_id
     */
    public function memberIsSetPayPassword($member_id)
    {
        $info = model('member')->getInfo([ [ 'member_id', '=', $member_id ] ], 'pay_password');
        if (empty($info[ 'pay_password' ])) return $this->success(0);
        else return $this->success(1);
    }

    /**
     * 检测会员支付密码是否正确
     * @param $member_id
     * @param $pay_password
     * @return array
     */
    public function checkPayPassword($member_id, $pay_password)
    {
        $res = model('member')->getCount([
            [ 'pay_password', '=', data_md5($pay_password) ],
            [ 'member_id', '=', $member_id ]
        ]);
        if ($res > 0) {
            return $this->success($res);
        } else {
            return $this->error('', 'PAY_PASSWORD_ERROR');
        }
    }

    /**
     * 找回密码发送验证码
     * @param $data
     * @return array|mixed|void
     */
    public function paypasswordCode($data)
    {
        //发送短信
        $sms_model = new Sms();
        $var_parse = array (
            "code" => $data[ "code" ],//验证码
        );
        $member_info_result = $this->getMemberInfo([ [ "member_id", "=", $data[ "member_id" ] ] ], "mobile");
        $member_info = $member_info_result[ "data" ];
        $data[ "sms_account" ] = $member_info[ "mobile" ] ?? '';//通过member_id获得手机号
        $data[ "var_parse" ] = $var_parse;
        $sms_result = $sms_model->sendMessage($data);
        if ($sms_result[ "code" ] < 0)
            return $sms_result;

        return $this->success();
    }

    /**
     * 拉取用户头像到本地
     * @param unknown $token
     */
    public function pullHeadimg($member_id)
    {
        $member_info = model("member")->getInfo([ [ 'member_id', '=', $member_id ] ], 'headimg');
        if (!empty($member_info[ 'headimg' ]) && is_url($member_info[ 'headimg' ])) {
            $upload = new Upload();
            $res = $upload->setPath("headimg/" . date("Ymd") . '/')->remotePull($member_info[ 'headimg' ]);
            if ($res[ 'code' ] >= 0) {
                model("member")->update([ 'headimg' => $res[ 'data' ][ 'pic_path' ] ], [ [ 'member_id', '=', $member_id ] ]);
            }
        }
    }

    /**
     * 获取店铺会员数量
     * @param array $condition
     * @param string $alias
     * @param unknown $join
     */
    public function getMemberAreaCount($condition, $alias = 'a', $join = [], $group = null)
    {
        $db = Db::name('member')->where($condition);
        if (!empty($join)) {
            $db = $this->parseJoin($db->alias($alias), $join);
        }
        if (!empty($group)) {
            $db = $db->group($group);
        }
        $count = $db->count();
        return $this->success($count);
    }

    /**
     * 按地域分布查询会员数量
     * @param unknown $site_id
     * @param string $handle
     */
    public function getMemberCountByArea($site_id, $handle = false)
    {
        $total_count = $this->getMemberAreaCount([ [ 'site_id', '=', $site_id ], [ 'is_delete', '=', 0 ] ]);

        $address = new Address();
        $list = $address->getAreaList([ [ 'pid', '=', 0 ] ], 'id,shortname', 'sort asc');

        $data = [];
        $member_array = [];

        $member_list = model('member')->getList([], "province_id, count(*) as count", '', '', '', 'province_id');

        if(!empty($member_list)) {
            $key = array_column($member_list, 'province_id');
            $member_array = array_combine($key, $member_list);
        }

        if ($total_count[ 'data' ]) {
            foreach ($list[ 'data' ] as $item) {
                $count = $member_array[$item['id']]['count'] ?? 0;
                array_push($data, [
                    'name' => $item[ 'shortname' ],
                    'value' => $count,
                    'ratio' => $count > 0 ? sprintf("%.2f", $count / $total_count[ 'data' ] * 100) : 0
                ]);
            }
        }
        $data_key = array_column($data, 'value');
        array_multisort($data_key, SORT_DESC, $data);

        return $this->success([
            'page_count' => 1,
            'count' => $total_count[ 'data' ],
            'list' => $data
        ]);
    }

    /**
     * 处理表连接
     * @param unknown $db_obj
     * @param unknown $join
     */
    protected function parseJoin($db_obj, $join)
    {
        foreach ($join as $item) {
            list($table, $on, $type) = $item;
            $type = strtolower($type);
            switch ( $type ) {
                case "left":
                    $db_obj = $db_obj->leftJoin($table, $on);
                    break;
                case "inner":
                    $db_obj = $db_obj->join($table, $on);
                    break;
                case "right":
                    $db_obj = $db_obj->rightjoin($table, $on);
                    break;
                case "full":
                    $db_obj = $db_obj->fulljoin($table, $on);
                    break;
                default:
                    break;
            }
        }
        return $db_obj;
    }

    /**
     *
     */
    public function getMemberImportLogList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
    {

        $list = model('member_import_log')->pageList($condition, $field, $order, $page, $page_size, '', '', '');

        if (!empty($list[ 'list' ])) {
            foreach ($list[ 'list' ] as $key => $val) {
                $list[ 'list' ][ $key ][ "create_time" ] = date('Y-m-d H:i:s', $val[ 'create_time' ]);
            }
        }

        return $this->success($list);
    }

    /**
     * @param $param
     * @param $site_id
     * @return array
     * @throws \PHPExcel_Exception
     * @throws \PHPExcel_Reader_Exception
     * @throws \think\exception\PDOException
     */
    public function importMember($param, $site_id)
    {

        $PHPReader = \PhpOffice\PhpSpreadsheet\IOFactory::createReader('Xlsx');

        //载入文件
        $PHPExcel = $PHPReader->load($param[ 'path' ]);

        //获取表中的第一个工作表,如果要获取第二个,把0改为1,依次类推
        $currentSheet = $PHPExcel->getSheet(0);

        //获取总行数
        $allRow = $currentSheet->getHighestRow();

        if ($allRow < 2) {
            return $this->error('', '导入了一个空文件');
        }

        $index = $param[ 'index' ];

        //每次导入100条
        $length = $index * 100;
        if ($index == 1) {
            $num = 2;
            $success_num = 0;
            $error_num = 0;

            $data_record = [
                "member_num" => ( $allRow - 1 ),
                "success_num" => 0,
                "error_num" => 0,
                "create_time" => time(),
                "status_name" => "等待导入"
            ];
            $record = model('member_import_record')->add($data_record);

        } else {
            $num = ( ( $index - 1 ) * 100 ) + 1;
            $success_num = $param[ 'success_num' ];
            $error_num = $param[ 'error_num' ];
            $record = $param[ 'record' ];
        }
        $type_num = 0;
        model('member')->startTrans();
        try {

            for ($i = $num; $i <= $length; $i++) {

                if ($i > $allRow) {
                    break;
                }
                $type_num = $i;
                //用户名
                $username = $PHPExcel->getActiveSheet()->getCell('A' . $i)->getValue();
                $username = trim($username, ' ');

                //手机号
                $mobile = $PHPExcel->getActiveSheet()->getCell('B' . $i)->getValue();
                $mobile = trim($mobile, ' ');

                //昵称
                $nickname = $PHPExcel->getActiveSheet()->getCell('C' . $i)->getValue();
                $nickname = trim($nickname, ' ');

                //密码(明文)
                $password = $PHPExcel->getActiveSheet()->getCell('D' . $i)->getValue();
                $password = trim($password, ' ');

                //微信公众号openid
                $wx_openid = $PHPExcel->getActiveSheet()->getCell('E' . $i)->getValue();
                $wx_openid = trim($wx_openid, ' ');

                //微信小程序openid
                $weapp_openid = $PHPExcel->getActiveSheet()->getCell('F' . $i)->getValue();
                $weapp_openid = trim($weapp_openid, ' ');

                //真实姓名
                $realname = $PHPExcel->getActiveSheet()->getCell('G' . $i)->getValue();
                $realname = trim($realname, ' ');

                //积分
                $point = $PHPExcel->getActiveSheet()->getCell('H' . $i)->getValue();
                $point = trim($point, ' ');

                //成长值
                $growth = $PHPExcel->getActiveSheet()->getCell('I' . $i)->getValue();
                $growth = trim($growth, ' ');

                //余额(可提现)
                $balance_money = $PHPExcel->getActiveSheet()->getCell('J' . $i)->getValue();
                $balance_money = trim($balance_money, ' ');

                //余额(不可提现)
                $balance = $PHPExcel->getActiveSheet()->getCell('K' . $i)->getValue();
                $balance = trim($balance, ' ');

                //会员等级(id)
                $membeer_level_id = $PHPExcel->getActiveSheet()->getCell('L' . $i)->getValue();
                $membeer_level_id = trim($membeer_level_id, ' ');

                $not_data = [
                    "username" => $username,
                    "mobile" => $mobile,
                    "nickname" => $nickname,
                    "password" => $password,
                    "wx_openid" => $wx_openid,
                    "weapp_openid" => $weapp_openid,
                    "realname" => $realname,
                    "create_time" => time(),
                    "record_id" => $record
                ];

                if ($username == "" && $mobile == "") {
                    $not_data[ 'content' ] = "失败,用户名或手机号必须存在一个";
                    model('member_import_log')->add($not_data);
                    $error_num++;
                    continue;
                }

                if (!empty($mobile) && !preg_match('/^\d{11}$/ims', $mobile)) {
                    $not_data[ 'content' ] = "失败,手机号格式错误";
                    model('member_import_log')->add($not_data);
                    $error_num++;
                    continue;
                }

                if ($nickname == "") {
                    $not_data[ 'content' ] = "失败,用户昵称不能为空";
                    model('member_import_log')->add($not_data);
                    $error_num++;
                    continue;
                }

                if ($password == "") {
                    $not_data[ 'content' ] = "失败,用户密码不能为空";
                    model('member_import_log')->add($not_data);
                    $error_num++;
                    continue;
                }
                if ($username) {
                    $username_res = model("member")->getInfo([ 'username' => $username ]);//根据用户名查找
                    if ($username_res) {
                        $not_data[ 'content' ] = "失败,已存在相同的用户名";
                        model('member_import_log')->add($not_data);
                        $error_num++;
                        continue;
                    }
                }

                if ($mobile) {
                    $mobile_res = model("member")->getInfo([ 'mobile' => $mobile ]);//根据手机号查找
                    if ($mobile_res) {
                        $not_data[ 'content' ] = "失败,已存在相同的手机号";
                        model('member_import_log')->add($not_data);
                        $error_num++;
                        continue;
                    }
                }

                if ($wx_openid) {
                    $wx_openid_res = model("member")->getInfo([ 'wx_openid' => $wx_openid ]);//根据微信公众号ID查找
                    if ($wx_openid_res) {
                        $not_data[ 'content' ] = "失败,已存在相同的公众号openid";
                        model('member_import_log')->add($not_data);
                        $error_num++;
                        continue;
                    }
                }

                if ($weapp_openid) {
                    $weapp_openid_res = model("member")->getInfo([ 'weapp_openid' => $weapp_openid ]);//根据小程序ID查找
                    if ($weapp_openid_res) {
                        $not_data[ 'content' ] = "失败,已存在相同的小程序openid";
                        model('member_import_log')->add($not_data);
                        $error_num++;
                        continue;
                    }
                }

                if ($membeer_level_id == "") {
                    $is_member = 0;
                } else {
                    $is_member = 1;
                    $member_level_info = model('member_level')->getInfo([ 'level_name' => $membeer_level_id ]);
                    if (empty($member_level_info)) {
                        $not_data[ 'content' ] = "失败,未查到该会员等级";
                        model('member_import_log')->add($not_data);
                        $error_num++;
                        break;
                    }
                }

                $data = [
                    "username" => $username ?? '',
                    "mobile" => $mobile ?? '',
                    "nickname" => $nickname,
                    "password" => data_md5($password),
                    "member_level" => $member_level_info[ 'level_id' ] ?? "",
                    "wx_openid" => $wx_openid ?? '',
                    "weapp_openid" => $weapp_openid ?? '',
                    "realname" => $realname ?? '',
                    'member_level_name' => $member_level_info[ 'level_name' ] ?? "",
                    'point' => $point ?? 0,
                    'growth' => $growth ?? 0,
                    'balance_money' => $balance_money ?? 0.00,
                    'balance' => $balance ?? 0.00,
                    'reg_time' => time(),
                    'login_time' => time(),
                    'last_login_time' => time(),
                    'site_id' => 1,
                    'is_member' => $is_member,
                    'member_code' => $mobile ?? ''
                ];

                model('member')->add($data);
                $not_data[ 'content' ] = "成功";
                model('member_import_log')->add($not_data);
                $success_num++;
            }
            model('member')->commit();
            if ($success_num + $error_num == ( $allRow - 1 )) {
                $data_record = [
                    "member_num" => ( $allRow - 1 ),
                    "success_num" => $success_num,
                    "error_num" => $error_num,
                    "create_time" => time()
                ];
                if ($success_num == ( $allRow - 1 )) {
                    $data_record[ 'status_name' ] = '导入成功';
                } elseif ($error_num == ( $allRow - 1 )) {
                    $data_record[ 'status_name' ] = '导入失败';
                }

                model('member_import_record')->update($data_record, [ 'id' => $record ]);
            }
            return $this->success([
                "allRow" => $allRow,
                "num" => $type_num,
                "path" => $param[ 'path' ],
                "name" => $param[ 'filename' ],
                "success_num" => $success_num,
                "error_num" => $error_num,
                "record" => $record
            ]);
        } catch (\Exception $e) {
            model('member')->rollback();
            return $this->error('', $e->getMessage());
        }
    }

    /**
     * 获取用户黑名单
     * @return array
     */
    public function getMemberBlacklist($site_id)
    {
        $cache = Cache::get('member_blacklist_' . $site_id);
        if (!empty($cache)) return $this->success($cache);

        $blacklist = model('member')->getColumn([ [ 'status', '=', 0 ] ], 'member_id');
        Cache::set('member_blacklist_' . $site_id, $blacklist);

        return $this->success($blacklist);
    }

    /**
     *  获取会员导入记录列表
     */
    public function getMemberImportRecordList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = 'create_time desc', $field = '*')
    {

        $list = model('member_import_record')->pageList($condition, $field, $order, $page, $page_size, '', '', '');

        if (!empty($list[ 'list' ])) {
            foreach ($list[ 'list' ] as $key => $val) {
                $list[ 'list' ][ $key ][ "create_time" ] = date('Y-m-d H:i:s', $val[ 'create_time' ]);
            }
        }

        return $this->success($list);
    }

    /**
     * 获取导入记录单条数据
     */
    public function getMemberImportRecordInfo($id)
    {

        $info = model('member_import_record')->getInfo([ 'id' => $id ]);

        return $this->success($info);
    }

    //更改
    public function alterShareRelation($member_id, $share_member, $site_id)
    {
        $member_info = model('member')->getInfo([
            [ 'member_id', '=', $member_id ],
            [ 'site_id', '=', $site_id ],
        ]);
        if (empty($member_info)) {
            return $this->error(null, '会员数据有误');
        }

        //只有普通会员 并且没有绑定上级才修改关系
        if ($member_info[ 'is_fenxiao' ] == 0 && $member_info[ 'fenxiao_id' ] == 0) {
            model('member')->update([
                'share_member' => $share_member,
            ], [
                [ 'member_id', '=', $member_id ],
                [ 'site_id', '=', $site_id ],
            ]);
            event('AlterShareRelation', [ 'site_id' => $site_id, 'member_id' => $member_id ]);
        }

        return $this->success();
    }

    /**
     * 更新会员最后访问时间
     * @param $member_id
     * @return int
     */
    public static function modifyLastVisitTime($member_id)
    {
        $res = model("member")->update([ 'last_visit_time' => time() ], [ 'member_id' => $member_id ]);
        return $res;

    }

    /**
     * 更新会员最后消费时间
     * @param $member_id
     * @return int
     */
    public static function modifyLastConsumTime($member_id)
    {
        $res = model("member")->update([ 'last_consum_time' => time() ], [ 'member_id' => $member_id ]);
        return $res;

    }

    /**
     * 获取用户可用余额
     * @param $site_id
     * @param $member_id
     * @return array
     */
    public function getMemberUsableBalance($site_id, $member_id)
    {
        $member_info = model('member')->getInfo([
            [ 'site_id', '=', $site_id ], [ 'member_id', '=', $member_id ], [ 'is_delete', '=', 0 ]
        ], 'balance - balance_lock as balance,balance_money - balance_money_lock as balance_money');
        if (empty($member_info)) {
            return $this->error('', '未获取到用户信息');
        }

        $member_info[ 'balance' ] = max($member_info['balance'], 0);
        $member_info[ 'balance_money' ] = max($member_info['balance_money'], 0);
        $member_info[ 'usable_balance' ] = round($member_info[ 'balance' ] + $member_info[ 'balance_money' ], 2);

        return $this->success($member_info);
    }


    /**
     * 生成随机数
     * @param int $length
     * @return string
     */
    public function memberCode($length)
    {
        $pattern = array ( '1', '2', '3', '4', '5', '6', '7', '8', '9', '0');
        $key = '';
        for ($i = 0; $i < $length; $i++) {
            $key .= array_rand($pattern); // 生成php随机数
        }
        return $key;
    }

    /**
     * 办理会员
     * @param $data
     * @return array
     */
    public function handleMember($data)
    {
        model('member')->startTrans();
        try {
            $member_info = model('member')->getInfo([ [ 'member_id', '=', $data[ 'member_id' ] ], [ 'site_id', '=', $data[ 'site_id' ] ] ]);
            if ($member_info[ 'is_member' ] == 1) {
                return $this->success();
            }

            $level_info = model('member_level')->getInfo([ [ 'site_id', '=', $data[ 'site_id' ] ], [ 'level_id', '=', $data[ 'level_id' ] ] ], 'level_id, sort, growth, level_name, level_type');
            $growth = $level_info[ 'growth' ] - $member_info[ 'growth' ];

                $save_data = [ 'is_member' => 1 ];
                $save_data['member_level_type'] = $level_info[ 'level_type' ];

                if($level_info['level_type'] == 0){
                $save_data['growth'] = $level_info[ 'growth' ];
            }

            $member_code = $data[ 'member_code' ] ?? '';

            if ($member_code) {
                $member_count = model('member')->getInfo([ [ 'site_id', '=', $data[ 'site_id' ] ], [ 'member_code', '=', $member_code ], [ 'member_id', '<>', $data[ 'member_id' ] ] ]);
                if ($member_count) return $this->error('', '当前会员编码已存在,请重新设置');

                $save_data[ 'member_code' ] = $member_code;
            } else {
                $member_code = $member_info[ 'mobile' ] ?: $this->memberCode(11);
                $save_data[ 'member_code' ] = $member_code;
            }

            model('member')->update($save_data, [
                [ 'member_id', '=', $data[ 'member_id' ] ],
                [ 'site_id', '=', $data[ 'site_id' ] ],
            ]);

            if ($growth > 0) {
                $account = new MemberAccount();
                $res = $account->addMemberAccount($data[ 'site_id' ], $data[ 'member_id' ], 'growth', $growth, 'adjust', '等级调整', '管理员调整客户等级', 0);
                if ($res[ 'code' ] < 0) return $res;
            }

            model('member')->commit();
            return $this->success();
        } catch (\Exception $e) {
            model('member')->rollback();
            return $this->error($e->getMessage() . $e->getFile() . $e->getLine());
        }

    }

    /**
     * 来源方式统计会员
     * @return array
     */
    public function memberRegisterStat()
    {
        $app_type = Config::get("app_type");
        $data = [];
        $member_array = [];

        $member_list = model('member')->getList([[ 'is_delete', '=', 0 ]], 'login_type, count(*) as count', '', '', '', 'login_type');
        if(!empty($member_list)){
            $key = array_column($member_list, 'login_type');
            $member_array = array_combine($key, $member_list);
        }

        foreach ($app_type as $k => $v) {
            array_push($data, [
                'name' => $v[ 'name' ],
                'member_num' => $member_array[$k]['count'] ?? 0
            ]);
        }
        return $data;
    }

    /**
     * 会员等级统计会员
     * @return array
     */
    public function memberLevelStat()
    {
        $level_list = model('member_level')->getList([[ 'level_type', '=', 0 ]], 'level_id, level_name');
        $data = [];
        $member_array = [];
        $member_list = model('member')->getList([[ 'is_delete', '=', 0 ]], 'member_level, count(*) as count', '', '', '', 'member_level');
        if(!empty($member_list)){
            $key = array_column($member_list, 'member_level');
            $member_array = array_combine($key, $member_list);
        }

        foreach ($level_list as $k => $v) {
            array_push($data, [
                'level_name' => $v[ 'level_name' ],
                'member_num' => $member_array[$v['level_id']]['count'] ?? 0
            ]);
        }
        return $data;
    }
}
金穗农资
captcha