1085 行
38 KiB
PHP
可执行文件
1085 行
38 KiB
PHP
可执行文件
<?php
|
||
|
||
namespace CashierApi\Controller;
|
||
|
||
use Common\Model\MemberAnalyzeModel;
|
||
use Common\Model\RetailGoodsClassModel;
|
||
use Common\Model\RetailSellModel;
|
||
use Think\Controller;
|
||
|
||
//[1.8.96]
|
||
|
||
/**
|
||
* 收银端-会员分析
|
||
* Class MemberAnalyzeController
|
||
* @package CashierApi\Controller
|
||
*/
|
||
class MemberAnalyzeController extends Controller
|
||
{
|
||
static $merchant_id;
|
||
static $store_id;
|
||
|
||
public function _initialize()
|
||
{
|
||
$user_type = I('post.user_type');
|
||
if ($user_type != 2) {
|
||
$Base = new BaseController();
|
||
$Base->_initialize();
|
||
}
|
||
|
||
self::$merchant_id = I('post.merchant_id');
|
||
self::$store_id = I('post.store_id');
|
||
}
|
||
|
||
public function analysis()
|
||
{
|
||
$this->display();
|
||
}
|
||
|
||
public function vip_acount()
|
||
{
|
||
$this->display();
|
||
}
|
||
|
||
public function vip_label()
|
||
{
|
||
$this->display();
|
||
}
|
||
|
||
// 获取商品类目-- 所有的
|
||
public function getGoodsClass()
|
||
{
|
||
$merchant_id = self::$merchant_id;
|
||
$id = I('post.id');
|
||
$type = I('post.type');
|
||
if ($type == 1) {
|
||
$class = M('retail_goods_class')
|
||
->where(['merchantid' => $merchant_id, 'type' => 1, 'status' => 0])
|
||
->field('id,class_name')
|
||
->select();
|
||
} else if ($type == 2) {
|
||
$class = M('retail_goods_class as c1')
|
||
->join('ls_retail_goods_class as c2 on c1.id=c2.pid')
|
||
->where(['c1.id' => $id, 'c2.status' => 0])
|
||
->field('c2.id,c2.class_name')
|
||
->order('c2.code asc')
|
||
->select();
|
||
} else {
|
||
$class = M('retail_goods_class as c2')
|
||
->join('ls_retail_goods_class as c3 on c2.id=c3.pid')
|
||
->where(['c2.id' => $id, 'c3.status' => 0])
|
||
->field('c3.id,c3.class_name')
|
||
->order('c3.code asc')
|
||
->select();
|
||
}
|
||
if (!empty($class)) {
|
||
$result['status'] = 1;
|
||
$result['data'] = $class;
|
||
$result['msg'] = '查询成功';
|
||
} else {
|
||
$result['status'] = 2;
|
||
$result['msg'] = '暂无分类';
|
||
}
|
||
$this->ajaxReturn($result);
|
||
}
|
||
|
||
// 获取商品类目--售出
|
||
public function getGoodsClassSell()
|
||
{
|
||
$page = I('post.page') ? I('post.page') : 1;
|
||
$pageSize = I('post.pageSize') ? I('post.pageSize') : 7;
|
||
//type 1为分页 2为全部 默认全部
|
||
$type = I('post.type') ? I('post.type') : 2;
|
||
|
||
$merchantid = self::$merchant_id;;
|
||
if ($type == 1) {
|
||
$class['list'] = M('retail_sell as rs')
|
||
->field(['rgc.id', 'rgc.class_name'])
|
||
->join('ls_retail_goods_class as rgc on rgc.id=rs.goods_class_id', 'LEFT')
|
||
->where(['rgc.status' => 0, 'rgc.merchantid' => $merchantid])
|
||
->group('rs.goods_class_id')
|
||
->page($page, $pageSize)
|
||
->select();
|
||
} else {
|
||
$class['list'] = M('retail_sell as rs')
|
||
->field(['rgc.id', 'rgc.class_name'])
|
||
->join('ls_retail_goods_class as rgc on rgc.id=rs.goods_class_id', 'LEFT')
|
||
->where(['rgc.status' => 0, 'rgc.merchantid' => $merchantid])
|
||
->group('rs.goods_class_id')
|
||
// ->page($page, $pageSize)
|
||
->select();
|
||
}
|
||
|
||
if ($class) {
|
||
$res['status'] = 1;
|
||
$res['data'] = $class;
|
||
$res['msg'] = '数据获取成功!';
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
}
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
// 获取用户数据列表
|
||
public function getUserList()
|
||
{
|
||
$merchant_id = self::$merchant_id;
|
||
if (!$merchant_id) {
|
||
$this->error("无权访问");
|
||
}
|
||
$where['merchantid'] = $merchant_id;
|
||
|
||
$page = I('post.page') ? I('post.page') : 1;
|
||
$pageSize = I('post.pageSize') ? I('post.pageSize') : 10;
|
||
|
||
$start_time = I('post.start_time'); // 开始时间
|
||
$end_time = I('post.end_time'); // 结束时间
|
||
if ($start_time) {
|
||
$start_time = strtotime($start_time);
|
||
}
|
||
if ($end_time) {
|
||
$end_time = strtotime($end_time);
|
||
}
|
||
|
||
$expense_num = I('post.expense_num'); // 最近购买次数
|
||
|
||
$min_amount = I('post.min_amount'); // 最小消费金额
|
||
$max_amount = I('post.max_amount'); // 最大金额
|
||
|
||
$search = I('post.search'); // 搜索条件
|
||
$member_type = I('post.member_type'); // 会员类型
|
||
|
||
$vip_label = I('post.vip_label'); // 会员标签
|
||
|
||
$goods_class = I('post.goods_class'); // 商品;类目
|
||
|
||
if ($search) {
|
||
$where['nickname|mobile_phone'] = ['like', "%{$search}%"];
|
||
}
|
||
|
||
if ($member_type) {
|
||
$where['plus_type'] = $member_type;
|
||
}
|
||
$userArr = [];
|
||
if ($vip_label) {
|
||
$userArr = $this->getUserByLabel($vip_label);
|
||
}
|
||
|
||
if ($goods_class) {
|
||
$userArr = $this->getUserByGoodsClass($goods_class, $userArr);
|
||
}
|
||
|
||
$MemberAnalyzeModel = new MemberAnalyzeModel();
|
||
// 根据最近消费次数/购买次数/消费金额 获取会员
|
||
$userExpense = $this->getUserByExpense($start_time, $end_time, $expense_num, $min_amount, $max_amount, $userArr, $goods_class);
|
||
if ($userExpense) {
|
||
$where['id'] = ['in', $userExpense];
|
||
}
|
||
|
||
$field = [
|
||
'id',
|
||
'name',
|
||
'nickname',
|
||
'mobile_phone',
|
||
'headimgurl',
|
||
'plus_type',
|
||
'grade_integral',
|
||
];
|
||
|
||
$store_id = self::$store_id;
|
||
$store_show_vip_info = M('retail_store_jurisdiction')->where(array('storeid' => $store_id))->getField("store_show_vip_info");
|
||
$store_show_vip_info = $store_show_vip_info ? $store_show_vip_info : 1;
|
||
if ($store_show_vip_info == 2) { //关闭显示所有会员
|
||
$where['storeid'] = $store_id;
|
||
}
|
||
|
||
$list['list'] = $MemberAnalyzeModel->getSelect($where, $field, $page, $pageSize, 'id desc');
|
||
$list['total'] = $MemberAnalyzeModel->getCount($where);
|
||
|
||
$merchant_id = self::$merchant_id;
|
||
|
||
if ($list['list']) {
|
||
foreach ($list['list'] as &$value) {
|
||
$value['vip_type'] = $value['plus_type'] == 2 ? 'Plus 会员' : '常规会员';
|
||
$value['headimgurl'] = $value['headimgurl'] ? $value['headimgurl'] : '-';
|
||
if ($value['plus_type'] == 2) {
|
||
$value['vip_lv'] = '-';
|
||
} else {
|
||
$gradeName = M('retail_vip_integral')
|
||
->where(array('min_integral' => array('ELT', $value['grade_integral']), 'merchantid' => $merchant_id))
|
||
->order('min_integral desc')
|
||
->getField("cardname");
|
||
$value['vip_lv'] = $gradeName ? $gradeName : '无等级';
|
||
}
|
||
|
||
if ($expense_num == 0) {
|
||
$value['expense_num'] = 0;
|
||
$value['expense_amount'] = 0;
|
||
$value['expense_last'] = 0;
|
||
} else {
|
||
|
||
$expense_info = $this->getUserExpenseAmount($value['id'], $start_time, $end_time, $goods_class);
|
||
$value['expense_num'] = $expense_info['expense_num'];
|
||
$value['expense_amount'] = $expense_info['expense_amount'];
|
||
$value['expense_last'] = $expense_info['expense_last'];
|
||
|
||
if ($expense_num == -1) {
|
||
$value['expense_num'] = $expense_info['expense_num'];
|
||
} else {
|
||
$value['expense_num'] = $expense_num;
|
||
}
|
||
}
|
||
}
|
||
$res['status'] = 1;
|
||
$res['msg'] = '数据获取成功!';
|
||
$res['data'] = $list;
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
}
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
// 筛选出符合条件的用户
|
||
public function getUserByExpense($start_time = '', $end_time = '', $expense_num = '', $min_amount = '', $max_amount = '', $userArr = '', $goods_class = '')
|
||
{
|
||
$merchant_id = self::$merchant_id;
|
||
if (!$merchant_id) {
|
||
$this->error("无权访问");
|
||
}
|
||
$where['rpo.merchant_id'] = $merchant_id;
|
||
|
||
$store_id = self::$store_id;
|
||
if ($store_id) {
|
||
// $where['rpo.store_id'] = $store_id;
|
||
}
|
||
|
||
$where['rpo.order_type'] = ['NEQ', 3];
|
||
$where['rpo.vid'] = ['gt', 0];
|
||
$where['rpo.vid'] = ['EXP', 'IS NOT NULL'];
|
||
|
||
$vipArr = $userArr;
|
||
if ($userArr) {
|
||
$where['rpo.vid'] = ['in', $vipArr];
|
||
}
|
||
|
||
if ($expense_num != -1) {
|
||
if ($goods_class) {
|
||
$where['rgc.goods_class_id'] = $goods_class;
|
||
$arr_first = M('retail_pay_order rpo')
|
||
->field('rpo.vid')
|
||
->join('ls_retail_sell as rgc on rgc.bill_id = rpo.bill_id', 'LEFT')
|
||
->where($where)
|
||
->group('rpo.vid')
|
||
->having('count(rpo.id) =' . $expense_num)
|
||
->select();
|
||
|
||
if ($arr_first) {
|
||
foreach ($arr_first as $key => $value) {
|
||
$arr_first[$key] = $value['vid'];
|
||
}
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
$this->ajaxReturn($res);
|
||
}
|
||
unset($where['rgc.goods_class_id']);
|
||
} else {
|
||
|
||
if ($expense_num == 0) {
|
||
$where0['rpo.vid'] = ['exp', ' is NULL'];
|
||
$arr_first = M('retail_vip rv')
|
||
->field('rv.id')
|
||
->join('ls_retail_pay_order as rpo on rpo.vid = rv.id', 'LEFT')
|
||
->where($where0)
|
||
->select();
|
||
|
||
if ($arr_first) {
|
||
foreach ($arr_first as $key => $value) {
|
||
$arr_first[$key] = $value['id'];
|
||
}
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
$this->ajaxReturn($res);
|
||
}
|
||
} else {
|
||
$arr_first = M('retail_pay_order rpo')
|
||
->where($where)
|
||
->group('rpo.vid')
|
||
->having('count(rpo.id) =' . $expense_num)
|
||
->getField("vid", true);
|
||
}
|
||
}
|
||
if ($arr_first) {
|
||
$vipArr = $arr_first;
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
$this->ajaxReturn($res);
|
||
}
|
||
}
|
||
|
||
if ($start_time && $end_time) {
|
||
$where['rpo.add_time'] = ['between', [$start_time, $end_time]];
|
||
if ($vipArr) {
|
||
$where['rpo.vid'] = ['in', $vipArr];
|
||
}
|
||
if ($goods_class) {
|
||
$where['rgc.goods_class_id'] = $goods_class;
|
||
$arr_second = M('retail_pay_order rpo')
|
||
->field('rpo.vid')
|
||
->join('ls_retail_sell as rgc on rgc.bill_id = rpo.bill_id', 'LEFT')
|
||
->where($where)
|
||
->group('vid')
|
||
->select();
|
||
|
||
if ($arr_second) {
|
||
foreach ($arr_second as $key => $value) {
|
||
$arr_second[$key] = $value['vid'];
|
||
}
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
$this->ajaxReturn($res);
|
||
}
|
||
unset($where['rgc.goods_class_id']);
|
||
} else {
|
||
$arr_second = M('retail_pay_order rpo')->where($where)->group('vid')->getField("vid", true);
|
||
}
|
||
|
||
|
||
if ($arr_second) {
|
||
$vipArr = $arr_second;
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
$this->ajaxReturn($res);
|
||
}
|
||
}
|
||
|
||
if ($min_amount > -1 && $max_amount) {
|
||
if ($vipArr) {
|
||
$where['rpo.vid'] = ['in', $vipArr];
|
||
}
|
||
|
||
if ($goods_class) {
|
||
$where['rgc.goods_class_id'] = $goods_class;
|
||
$arr_third_min = M('retail_pay_order rpo')
|
||
->field('rpo.vid')
|
||
->join('ls_retail_sell as rgc on rgc.bill_id = rpo.bill_id', 'LEFT')
|
||
->where($where)
|
||
->group('rpo.vid')
|
||
->having('sum(rpo.trade_amount) >=' . $min_amount)
|
||
->select();
|
||
|
||
if ($arr_third_min) {
|
||
foreach ($arr_third_min as $key => $value) {
|
||
$arr_third_min[$key] = $value['vid'];
|
||
}
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
if ($arr_third_min) {
|
||
$vipArr = $arr_third_min;
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
if ($vipArr) {
|
||
$where['rpo.vid'] = ['in', $vipArr];
|
||
}
|
||
|
||
$arr_third_max = M('retail_pay_order rpo')
|
||
->field('rpo.vid')
|
||
->join('ls_retail_sell as rgc on rgc.bill_id = rpo.bill_id', 'LEFT')
|
||
->where($where)
|
||
->group('rpo.vid')
|
||
->having('sum(rpo.trade_amount) <=' . $max_amount)
|
||
->select();
|
||
// echo M('retail_pay_order rpo')->_sql();
|
||
|
||
if ($arr_third_max) {
|
||
if ($arr_third_max) {
|
||
foreach ($arr_third_max as $key => $value) {
|
||
$arr_third_max[$key] = $value['vid'];
|
||
}
|
||
|
||
$vipArr = $arr_third_max;
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
$this->ajaxReturn($res);
|
||
}
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
$this->ajaxReturn($res);
|
||
}
|
||
} else {
|
||
$arr_third_min = M('retail_pay_order rpo')
|
||
->where($where)
|
||
->group('rpo.vid')
|
||
->having('sum(trade_amount) >=' . $min_amount)
|
||
->getField("vid", true);
|
||
|
||
if ($arr_third_min) {
|
||
$vipArr = $arr_third_min;
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
if ($vipArr) {
|
||
$where['rpo.vid'] = ['in', $vipArr];
|
||
}
|
||
|
||
$arr_third_max = M('retail_pay_order rpo')
|
||
->where($where)
|
||
->group('rpo.vid')
|
||
->having('sum(rpo.trade_amount) <= ' . $max_amount)
|
||
->getField("vid", true);
|
||
if ($arr_third_max) {
|
||
$vipArr = $arr_third_max;
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
$this->ajaxReturn($res);
|
||
}
|
||
}
|
||
}
|
||
return $vipArr;
|
||
}
|
||
|
||
// 根据标签获取会员数
|
||
public function getUserByLabel($vip_label_id = '')
|
||
{
|
||
$where = [
|
||
'is_del' => 1,
|
||
'vip_label_id' => $vip_label_id,
|
||
];
|
||
|
||
$arr_first = M('retail_vip_with_label')->where($where)->group('vid')->getField("vid", true);
|
||
if ($arr_first) {
|
||
return $arr_first;
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
}
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
// 根据商品类目回去会员
|
||
public function getUserByGoodsClass($goods_class_id = '', $userArr = '')
|
||
{
|
||
$store_id = self::$store_id;
|
||
$merchant_id = self::$merchant_id;
|
||
$where = [
|
||
'vid' => ['gt', 0],
|
||
'pay_state' => 1,
|
||
'merchant_id' => $merchant_id
|
||
];
|
||
|
||
if ($goods_class_id) {
|
||
$where['goods_class_id'] = $goods_class_id;
|
||
}
|
||
if ($userArr) {
|
||
$where['vid'] = ['in', $userArr];
|
||
}
|
||
|
||
$arr_first = M('retail_sell')->where($where)->group('vid')->getField("vid", true);
|
||
if ($arr_first) {
|
||
return $arr_first;
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
}
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
// 根据条件获取会员的累计消费金额
|
||
public function getUserExpenseAmount($vid, $start_time = '', $end_time = '', $goods_class = '')
|
||
{
|
||
|
||
// $store_id = self::$store_id;
|
||
// $where['rpo.store_id'] = $store_id;
|
||
$where['rpo.order_type'] = ['NEQ', 3];
|
||
$where['rpo.vid'] = $vid;
|
||
$where['rpo.order_state'] = 'SUCCESS';
|
||
|
||
if ($start_time && $end_time) {
|
||
$where['rpo.add_time'] = ['between', [$start_time, $end_time]];
|
||
}
|
||
if ($goods_class) {
|
||
$where['rs.goods_class_id'] = $goods_class;
|
||
$arr_first = M('retail_pay_order rpo')
|
||
->field("rpo.trade_amount, rpo.add_time")
|
||
->join('ls_retail_sell as rs on rs.bill_id = rpo.bill_id', 'LEFT')
|
||
->where($where)
|
||
->order('rpo.add_time desc')
|
||
->select();
|
||
} else {
|
||
$arr_first = M('retail_pay_order rpo')
|
||
->field("rpo.trade_amount, rpo.add_time")
|
||
->where($where)
|
||
->order('rpo.add_time desc')
|
||
->select();
|
||
}
|
||
|
||
if ($arr_first) {
|
||
$res['expense_num'] = count($arr_first);
|
||
$res['expense_amount'] = array_sum(array_map(function ($val) {
|
||
return $val['trade_amount'];
|
||
}, $arr_first));
|
||
if ($arr_first[0]['add_time']) {
|
||
$res['expense_last'] = date('Y-m-d H:i:s', $arr_first[0]['add_time']);
|
||
} else {
|
||
$res['expense_last'] = '-';
|
||
}
|
||
} else {
|
||
$res['expense_num'] = 0;
|
||
$res['expense_amount'] = 0;
|
||
$res['expense_last'] = '-';
|
||
}
|
||
return $res;
|
||
}
|
||
|
||
// 根据最后筛选条件查询类目
|
||
public function getGoodsClassByConditions()
|
||
{
|
||
$vid = I('post.vid');
|
||
$page = I('post.page') ? I('post.page') : 1;
|
||
$pageSize = I('post.pageSize') ? I('post.pageSize') : 10;
|
||
|
||
$merchant_id = self::$merchant_id;
|
||
if (!$merchant_id) {
|
||
$this->error("无权访问");
|
||
}
|
||
|
||
if (!$vid) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '必要参数缺失!';
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
$start_time = I('post.start_time'); // 开始时间
|
||
$end_time = I('post.end_time'); // 结束时间
|
||
if ($start_time) {
|
||
$start_time = strtotime($start_time);
|
||
}
|
||
if ($end_time) {
|
||
$end_time = strtotime($end_time);
|
||
}
|
||
|
||
$where['vid'] = $vid;
|
||
$where['merchant_id'] = $merchant_id;
|
||
$where['goods_class_id'] = ['NEQ', 0];
|
||
if ($start_time && $end_time) {
|
||
$where['add_time'] = ['between', [$start_time, $end_time]];
|
||
}
|
||
|
||
$RetailSellModel = new RetailSellModel();
|
||
$result['list'] = $RetailSellModel->getGroupSelect($where, 'goods_class_id', 'goods_class_id', $page, $pageSize);
|
||
$res['total'] = $RetailSellModel->getGroupCount($where, 'goods_class_id');
|
||
|
||
|
||
if ($result['list']) {
|
||
$result['total'] = count($result['list']);
|
||
foreach ($result['list'] as &$value) {
|
||
$value['name'] = $this->getAllGoodsClassByID($value['goods_class_id']);
|
||
}
|
||
|
||
$res['status'] = 1;
|
||
$res['msg'] = '数据获取成功!';
|
||
$res['data'] = $result;
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
}
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
// 根据商品类目ID 获取详细类目
|
||
public function getAllGoodsClassByID($goods_id)
|
||
{
|
||
$GoodClassModel = new RetailGoodsClassModel();
|
||
$goods_class = $GoodClassModel->getFind(['id' => $goods_id], 'id, class_name, pid, type');
|
||
|
||
if ($goods_class) {
|
||
if ($goods_class['type'] == 3) {
|
||
$second = M('retail_goods_class')
|
||
->field('id, class_name, pid, type')
|
||
->where(['id' => $goods_class['pid']])
|
||
->find();
|
||
|
||
$third = M('retail_goods_class')
|
||
->field('id, class_name, pid, type')
|
||
->where(['id' => $second['pid']])
|
||
->find();
|
||
return $third['class_name'] . '-' . $second['class_name'] . '-' . $goods_class['class_name'];
|
||
} else if ($goods_class['type'] == 2) {
|
||
$second = M('retail_goods_class')
|
||
->field('id, class_name, pid, type')
|
||
->where(['id' => $goods_class['pid']])
|
||
->find();
|
||
return $second['class_name'] . '-' . $goods_class['class_name'];
|
||
} else {
|
||
return $goods_class['class_name'];
|
||
}
|
||
} else {
|
||
return '未知类目';
|
||
}
|
||
}
|
||
|
||
/* ************************************** 会员统计Start ************************************** */
|
||
// 获取会员信息 -- 饼状图
|
||
public function getActiveUserBread()
|
||
{
|
||
$type = I('post.type');
|
||
|
||
$store_id = self::$store_id;
|
||
$merchant_id = self::$merchant_id;
|
||
if (!$merchant_id) {
|
||
$this->error("无权访问");
|
||
}
|
||
|
||
$MemberAnalyzeModel = new MemberAnalyzeModel();
|
||
$result = $MemberAnalyzeModel->getActiveUserBread($type, $store_id, $merchant_id);
|
||
$this->ajaxReturn($result);
|
||
}
|
||
|
||
// 根据月份获取用户数据
|
||
public function getActiveUserByMonth()
|
||
{
|
||
$timestamp = I('post.timestamp'); // 查询月份
|
||
$page = I('post.page') ? I('post.page') : 0;
|
||
$pageSize = I('post.pageSize') ? I('post.pageSize') : 10;
|
||
|
||
$type = I('post.type'); // 沉睡会员/活跃会员
|
||
|
||
$store_id = self::$store_id;
|
||
$merchant_id = self::$merchant_id;
|
||
|
||
$MemberAnalyzeModel = new MemberAnalyzeModel();
|
||
$result = $MemberAnalyzeModel->getActiveUserByMonth($timestamp, $type, $page, $pageSize, $store_id, $merchant_id);
|
||
$this->ajaxReturn($result);
|
||
}
|
||
|
||
// 会员生日统计 -- 饼状图
|
||
public function getBirthUserBread()
|
||
{
|
||
$merchant_id = self::$merchant_id;
|
||
$MemberAnalyzeModel = new MemberAnalyzeModel();
|
||
$result = $MemberAnalyzeModel->getBirthUserBread($merchant_id);
|
||
$this->ajaxReturn($result);
|
||
}
|
||
|
||
// 获取会员生日信息
|
||
public function getActiveUserByBirth()
|
||
{
|
||
$type = I('post.type');
|
||
$page = I('post.page') ? I('post.page') : 0;
|
||
$pageSize = I('post.pageSize') ? I('post.pageSize') : 10;
|
||
|
||
$merchant_id = self::$merchant_id;
|
||
|
||
$MemberAnalyzeModel = new MemberAnalyzeModel();
|
||
$result = $MemberAnalyzeModel->getActiveUserByBirth($type, $page, $pageSize, $merchant_id);
|
||
$this->ajaxReturn($result);
|
||
}
|
||
|
||
/* ************************************** 会员详细信息 Start ************************************** */
|
||
public function detail()
|
||
{
|
||
$vid = I("get.id");
|
||
$this->assign('vid', $vid);
|
||
$this->display();
|
||
}
|
||
|
||
// 获取会员详细信息
|
||
public function getUserDetails()
|
||
{
|
||
$vid = I('post.vid');
|
||
if (!$vid) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '必要参数缺失!';
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
$map = [
|
||
'ro.id' => $vid
|
||
];
|
||
|
||
$field = [
|
||
'ro.id',
|
||
'ro.name',
|
||
'ro.nickname',
|
||
'ro.mobile_phone',
|
||
'ro.birthday',
|
||
'ro.headimgurl',
|
||
'ro.addtime',
|
||
'ro.plus_type',
|
||
'ro.integral',
|
||
'ro.grade_integral',
|
||
'ro.balance'
|
||
];
|
||
|
||
$MemberAnalyzeModel = new MemberAnalyzeModel;
|
||
$UserInfo = $MemberAnalyzeModel->getUserDetails($map, $field);
|
||
|
||
$merchant_id = self::$merchant_id;
|
||
if ($UserInfo) {
|
||
$UserInfo['vip_type'] = $UserInfo['plus_type'] == 2 ? 'Plus 会员' : '常规会员';
|
||
if ($UserInfo['plus_type'] == 2) {
|
||
$UserInfo['vip_lv'] = '-';
|
||
// 获取Plus 开始/结束时间
|
||
$plusInfo = $MemberAnalyzeModel->getPlusTime(['vip_id' => $vid]);
|
||
$UserInfo['plus_start'] = date('Y-m-d H:i:s', $plusInfo['start_time']);
|
||
$UserInfo['plus_end'] = date('Y-m-d H:i:s', $plusInfo['end_time']);
|
||
} else {
|
||
$gradeName = M('retail_vip_integral')
|
||
->where(array('min_integral' => array('ELT', $UserInfo['grade_integral']), 'merchantid' => $merchant_id))
|
||
->order('min_integral desc')
|
||
->getField("cardname");
|
||
$UserInfo['vip_lv'] = $gradeName ? $gradeName : '无等级';
|
||
}
|
||
$UserInfo['addtime'] = date('Y-m-d H:i:s', $UserInfo['addtime']);
|
||
|
||
|
||
$res['status'] = 1;
|
||
$res['data'] = $UserInfo;
|
||
$res['msg'] = '数据获取成功!';
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
}
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
// 获取会员余额
|
||
public function getUserRecharge()
|
||
{
|
||
$vid = I('post.vid');
|
||
$page = I('post.page') ? I('post.page') : 1;
|
||
$pageSize = I('post.pageSize') ? I('post.pageSize') : 10;
|
||
$plus_type = I('post.plus_type') ? I('post.plus_type') : 2; // 2plus会员 3常规会员
|
||
if (!$vid) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '必要参数缺失!';
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
$map = [
|
||
'ro.vid' => $vid,
|
||
'ro.status' => 1,
|
||
];
|
||
|
||
$field = [
|
||
'ro.id',
|
||
'ro.add_time',
|
||
'ro.type',
|
||
'ro.money',
|
||
'ro.all_money',
|
||
'ro.remark'
|
||
];
|
||
|
||
$MemberAnalyzeModel = new MemberAnalyzeModel;
|
||
$recharge = $MemberAnalyzeModel->getUserRecharge($map, $field, $page, $pageSize);
|
||
|
||
if ($recharge['list']) {
|
||
foreach ($recharge['list'] as $key => &$value) {
|
||
$value['add_time'] = date('Y-m-d H:i:s', $value['add_time']);
|
||
switch ($value['type']) {
|
||
case 1:
|
||
$value['type_text'] = '充值';
|
||
if ($value['money'] == $value['all_money']) {
|
||
$value['money_text'] = '充值¥' . $value['money'];
|
||
} else {
|
||
$newMoney = ($value['all_money'] * 10000 - $value['money'] * 10000) / 10000;
|
||
$value['money_text'] = '充值¥' . $value['money'] . '赠¥' . $newMoney;
|
||
}
|
||
break;
|
||
case 2:
|
||
$value['type_text'] = '消费';
|
||
$value['money_text'] = '¥' . $value['all_money'];
|
||
break;
|
||
default:
|
||
$value['type_text'] = '其他';
|
||
$value['money_text'] = '¥' . $value['all_money'];
|
||
}
|
||
}
|
||
|
||
$res['status'] = 1;
|
||
$res['data'] = $recharge;
|
||
$res['msg'] = '数据获取成功!';
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
}
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
// 获取会员积分
|
||
public function getUserIntegral()
|
||
{
|
||
$vid = I('post.vid');
|
||
$page = I('post.page') ? I('post.page') : 1;
|
||
$pageSize = I('post.pageSize') ? I('post.pageSize') : 10;
|
||
if (!$vid) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '必要参数缺失!';
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
$map = [
|
||
'rio.vid' => $vid
|
||
];
|
||
|
||
$field = [
|
||
'rio.id',
|
||
'rio.addtime',
|
||
'rio.remark',
|
||
'rio.integral',
|
||
'rio.type'
|
||
];
|
||
|
||
$MemberAnalyzeModel = new MemberAnalyzeModel;
|
||
$integral = $MemberAnalyzeModel->getUserIntegral($map, $field, $page, $pageSize);
|
||
|
||
if ($integral['list']) {
|
||
foreach ($integral['list'] as $key => &$value) {
|
||
// 积分类型: 1签到获取 2消费获取 3使用积分 4后台充值 5后台扣除 6完善资料获取 7分享朋友赠送积分 8收银机充值 9积分抵现买单 10充值退款
|
||
if ($value['type'] == 3 || $value['type'] == 5 || $value['type'] == 9 || $value['type'] == 10) {
|
||
$value['integral'] = '- ' . $value['integral'];
|
||
} else {
|
||
$value['integral'] = '+ ' . $value['integral'];
|
||
}
|
||
$value['add_time'] = date('Y-m-d H:i:s', $value['addtime']);
|
||
}
|
||
|
||
$res['status'] = 1;
|
||
$res['data'] = $integral;
|
||
$res['msg'] = '数据获取成功!';
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
}
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
// 获取会员订单
|
||
public function getUserBillOrder()
|
||
{
|
||
$vid = I('post.vid');
|
||
$page = I('post.page') ? I('post.page') : 1;
|
||
$pageSize = I('post.pageSize') ? I('post.pageSize') : 10;
|
||
if (!$vid) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '必要参数缺失!';
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
$map = [
|
||
'rbo.vid' => $vid,
|
||
'rbo.pay_state' => 1,
|
||
];
|
||
|
||
$field = [
|
||
'rbo.id',
|
||
'rbo.order_no',
|
||
'rbo.type',
|
||
'rbo.add_time',
|
||
'rbo.all_money as amount_received',
|
||
'lrbo.order_genre'
|
||
];
|
||
|
||
$MemberAnalyzeModel = new MemberAnalyzeModel;
|
||
$billOrder = $MemberAnalyzeModel->getUserBillOrder($map, $field, $page, $pageSize);
|
||
|
||
if ($billOrder['list']) {
|
||
|
||
foreach ($billOrder['list'] as $key => &$value) {
|
||
$value['add_time'] = date('Y-m-d H:i:s', $value['add_time']);
|
||
$value['type'] = $value['type'] == 1 ? '线上消费' : '线下消费';
|
||
switch ($value['order_genre']) {
|
||
// 订单类型 1.普通订单 2.拼团订单 3.秒杀订单 4预售订单
|
||
case 1:
|
||
$value['order_type'] = '普通订单';
|
||
break;
|
||
case 2:
|
||
$value['order_type'] = '拼团订单';
|
||
break;
|
||
case 3:
|
||
$value['order_type'] = '秒杀订单';
|
||
break;
|
||
case 4:
|
||
$value['order_type'] = '预售订单';
|
||
break;
|
||
default:
|
||
$value['order_type'] = '-';
|
||
}
|
||
}
|
||
|
||
$res['status'] = 1;
|
||
$res['data'] = $billOrder;
|
||
$res['msg'] = '数据获取成功!';
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
}
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
// 查看订单商品信息
|
||
public function getBillOrderInfo()
|
||
{
|
||
$id = I('post.id');
|
||
$sell_goods_info = M('retail_bill_order as b')
|
||
->join('ls_retail_bill_online as o on b.id=o.bill_id', 'LEFT')
|
||
->join('ls_retail_bill_discount as d on b.id=d.bill_id', 'LEFT')
|
||
->where(array('id' => $id))
|
||
->find();
|
||
if ($sell_goods_info['type'] == 1) {
|
||
$name = $sell_goods_info['user_name'];
|
||
$phone = $sell_goods_info['user_phone'];
|
||
if ($sell_goods_info['pickup_type'] == 1) {
|
||
$address = '到店自提';
|
||
} else {
|
||
$address = $sell_goods_info['user_address'];
|
||
}
|
||
}
|
||
//出售表id
|
||
$sellOrder = D('RetailSell')->getSelect(array('bill_id' => $sell_goods_info['id']));
|
||
foreach ($sellOrder as $key => &$sell) {
|
||
$sell['company'] = D("RetailGoods")->getFindField(array('id' => $sell['goods_id']), "company");
|
||
$sell['discount_price'] = round(($sell['original_price'] - $sell['price']) * $sell['num'], 2);
|
||
if ($sell['pricing_method'] == 2) {
|
||
$sell['num'] = $sell['num'] . "(称重)";
|
||
}
|
||
if (intval($sell['num']) == $sell['num']) {
|
||
$sell['num'] = intval($sell['num']);
|
||
}
|
||
if (($sell['goods_type'] == 2 || $sell['goods_id'] == 0) && empty($sell['goods_name'])) {
|
||
$sell['goods_name'] = '无码商品';
|
||
}
|
||
if ($sell['sku_json_info']) {
|
||
$sell['goods_name'] .= '(' . json_decode($sell['sku_json_info'], true)['name'] . ')';
|
||
}
|
||
$sell['image'] = getImage($sell['goods_img_id']);
|
||
$sell_goods_info2[] = $sell;
|
||
}
|
||
if (!$id) {
|
||
$rt['code'] = 1;
|
||
$rt['msg'] = '';
|
||
$rt['data'] = array();
|
||
$this->ajaxReturn($rt);
|
||
}
|
||
$rt['id'] = $id;
|
||
$rt['code'] = 0;
|
||
$rt['msg'] = '';
|
||
$rt['data'] = $sell_goods_info2;
|
||
$rt['all_money'] = $sell_goods_info['all_money']; //总计
|
||
$rt['type'] = $sell_goods_info['type']; //订单类型
|
||
$rt['delivery_fee'] = $sell_goods_info['delivery_fee']; //配送费
|
||
if ($sell_goods_info['type'] == 1) {
|
||
$rt['name'] = $name;
|
||
$rt['phone'] = $phone;
|
||
$rt['address'] = $address;
|
||
$rt['remark'] = $sell_goods_info['remark'];
|
||
}
|
||
$this->ajaxReturn($rt);
|
||
}
|
||
|
||
// 获取Plus会员信息
|
||
public function getPlusUserRecord()
|
||
{
|
||
$vid = I('post.vid');
|
||
$page = I('post.page') ? I('post.page') : 1;
|
||
$pageSize = I('post.pageSize') ? I('post.pageSize') : 10;
|
||
if (!$vid) {
|
||
$res['status'] = 0;
|
||
$res['msg'] = '必要参数缺失!';
|
||
$this->ajaxReturn($res);
|
||
}
|
||
|
||
$map = [
|
||
'rpc.vip_id' => $vid,
|
||
'rpc.pay_state' => 1
|
||
];
|
||
|
||
$field = [
|
||
'rpc.id',
|
||
'rpc.addtime',
|
||
'rpc.pay_type',
|
||
'rpc.money',
|
||
'rpc.type',
|
||
'rpc.time'
|
||
];
|
||
|
||
$MemberAnalyzeModel = new MemberAnalyzeModel;
|
||
$plus = $MemberAnalyzeModel->getPlusUserRecord($map, $field, $page, $pageSize);
|
||
|
||
if ($plus['list']) {
|
||
// 支付状态 0 未支付 1.微信 2.会员 3.支付宝 4.现金 5.其他
|
||
$payArr = [
|
||
'1' => '微信',
|
||
'2' => '会员',
|
||
'3' => '支付宝',
|
||
'4' => '现金',
|
||
'5' => '其他'
|
||
];
|
||
|
||
// 1.购买套餐 2.套餐续费 3.充值 4.充值续费 5.购买商品 6.购买商品套餐
|
||
$plusArr = [
|
||
'1' => '购买套餐',
|
||
'2' => '套餐续费',
|
||
'3' => '充值',
|
||
'4' => '充值续费',
|
||
'5' => '购买商品',
|
||
'5' => '购买商品套餐'
|
||
];
|
||
|
||
foreach ($plus['list'] as $key => &$value) {
|
||
$value['add_time'] = date('Y-m-d H:i:s', $value['addtime']);
|
||
$value['pay_type'] = $payArr[$value['pay_type']];
|
||
$value['type'] = $plusArr[$value['type']];
|
||
}
|
||
|
||
$res['status'] = 1;
|
||
$res['data'] = $plus;
|
||
$res['msg'] = '数据获取成功!';
|
||
} else {
|
||
$res['status'] = 1;
|
||
$res['msg'] = '暂无数据,请稍后重试!';
|
||
$res['data'] = [];
|
||
}
|
||
$this->ajaxReturn($res);
|
||
}
|
||
}
|