1185 lines
39 KiB
PHP
1185 lines
39 KiB
PHP
<?php
|
||
/**
|
||
|
||
|
||
|
||
|
||
|
||
|
||
*/
|
||
|
||
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
|
||
{
|
||
|
||
|
||
public function getBusinessPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
|
||
{
|
||
$list = model('business')->pageList($condition, $field, $order, $page, $page_size, '', '', '');
|
||
return $this->success($list);
|
||
}
|
||
|
||
|
||
/**
|
||
* 添加会员(注意等级名称)
|
||
* @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' ])) {
|
||
// TODO: 注意, 华为云上的最新代码,下面都注释掉了,
|
||
$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,mobile,member_code';
|
||
$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 $condition
|
||
* @param int $page
|
||
* @param int $page_size
|
||
* @param string $order
|
||
* @param string $field
|
||
* @return array
|
||
*/
|
||
public function getMemberInformationPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*',$alias,$join)
|
||
{
|
||
$list = model('information')->pageList($condition, $field, $order, $page, $page_size, $alias,$join);
|
||
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;
|
||
}
|
||
/**
|
||
* 获取会员日志
|
||
* @param array $condition
|
||
* @param int $page
|
||
* @param int $page_size
|
||
* @param string $order
|
||
* @param string $field
|
||
* @return array
|
||
*/
|
||
public function getMemberLogPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*',$alias='',$join='')
|
||
{
|
||
$list = model('member_journal')->pageList($condition, $field, $order, $page, $page_size, $alias,$join);
|
||
return $this->success($list);
|
||
}
|
||
//增加用户日志
|
||
//type 0商品1确认订单2支付订单
|
||
public function memberjournal($member_id,$site_id,$type,$follow,$remark="",$goodsid =0){
|
||
|
||
global $_W;
|
||
$totaljounal = model('member_journal')->getCount(['site_id'=>$site_id,'type'=>$type,'member_id'=>$member_id],'*');
|
||
if($type == 1){
|
||
$remark = '第'.($totaljounal+1).'次进入确认订单页';
|
||
}else if($type == 2){
|
||
$remark = '第'.($totaljounal+1).'次进入收银台';
|
||
}else if($type == 3){
|
||
if($totaljounal > 0){
|
||
$remark = '第'.($totaljounal+1).'次登录';
|
||
}
|
||
}
|
||
|
||
$insertdata = array(
|
||
'member_id'=>$member_id,
|
||
'site_id'=>$site_id,
|
||
'type'=>$type,
|
||
'follow'=>$follow,
|
||
'remark'=>$remark,
|
||
'goodsid'=>$goodsid,
|
||
'createtime'=>time()
|
||
);
|
||
model('member_journal')->add($insertdata);
|
||
|
||
}
|
||
} |