文件

718 行
28 KiB
PHP
可执行文件

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
namespace Retail\Business;
use Common\Business\Store;
use Common\Business\VipInfo;
use Common\Model\RetailVipModel;
use Common\Model\RetailVipWithLabelModel;
use Common\Model\RetailBillOrderModel;
use Common\Model\RetailRechargeOrderModel;
use Common\Model\RetailStoreModel;
use Common\User\Guide;
use think\Exception;
//[1.8.73]
/**
* 获取会员数据
* Class Vip
* @function getVipSumData 获取普通会员统计
* @function getVipList 获取普通会员列表
* @function handleVipMap 处理普通会员查询条件
* @package Retail\Business
*/
class Vip
{
/**
* 获取普通会员统计
* @param $param
* $param['merchant_id'] 商户id
* $param['store_id'] 筛选的门店ID
* $param['keyword'] 会员搜索的关键词
* $param['status'] 会员状态
* $param['section'] 高级筛选条件
* @return mixed
*/
public function getVipSumData($param)
{
//处理查询条件
$param['sum'] = true;
$param['plus_type'] = 3;
$mapResult = $this->handleVipMap($param);
$VipModel = new RetailVipModel();
//昨日新增会员
$yesterday_count = $VipModel->getCount($mapResult['yesterdayMap']);
//上周新增会员
$last_week_count = $VipModel->getCount($mapResult['lastWeekMap']);
$all_integral = $VipModel->getSum($mapResult['map'], 'integral');
$all_balance = $VipModel->getSum($mapResult['map'], 'balance');
return callBack(statusCode()['success'], '获取成功', [
'all_integral' => $all_integral,
'all_balance' => $all_balance,
'yesterday_count' => $yesterday_count,
'last_week_count' => $last_week_count,
]);
}
/**
* 获取普通会员列表
* @param $param
* $param['merchant_id'] 商户id
* $param['store_id'] 筛选的门店ID
* $param['keyword'] 会员搜索的关键词
* $param['status'] 会员状态
* $param['section'] 高级筛选条件
* $param['need_count'] 是否需要返回总条数
* $param['get_type'] 获取类型 1商户获取 2门店获取(门店获取时返回会员标签)
* $param['label_store_id'] 指定标签的门店ID(只有门店获取时生效)
* @return mixed
*/
public function getVipList($param)
{
$VipModel = new RetailVipModel();
//处理查询条件
$param['plus_type'] = 3;
$mapResult = $this->handleVipMap($param);
if (!$param['is_export']) {
$list = $VipModel->getSelect($mapResult['map'], '*', 'id desc', $param['page'] . ',' . $param['limit']);
} else {
$list = $VipModel->getSelect($mapResult['map'], '*', 'id desc');
}
$count = 0;
if ($list) {
$count = $param['need_count'] !== false ? $VipModel->getCount($mapResult['map']) : 0;
$store_list = [];
$guide_list = [];
$Store = new Store();
$Guide = new Guide();
$VipInfo = new VipInfo();
$VipWithLabelModel = new RetailVipWithLabelModel();
foreach ($list as $key => &$val) {
if ($param['need_index']) $val['index'] = $key + 1;
$val['add_time'] = date('Y-m-d H:i:s', $val['addtime']);
unset($val['addtime']);
$val['store_name'] = $Store->getStoreName($val['storeid'], $store_list);
if (empty($val['birthday'])) {
$val['birthday'] = '';
}
if (!empty($val['guideid'])) {
$val['guide_name'] = $Guide->getGuideName($val['guideid'], $guide_list, 1);
}
$grade = $VipInfo->singleVipGrade([
'merchant_id' => $param['merchant_id'],
'grade_integral' => $val['grade_integral'],
'get_default' => true,
]);
$val['grade_id'] = $grade['id'];
$val['grade_name'] = $grade['grade_name'];
$val['discount'] = $grade['id'] ? ($grade['discount'] * 10 . '折') : '-';
$val['balance'] = $val['balance'] ? $val['balance'] : "0.00";
$val['nickname'] = $val['nickname'] ? $val['nickname'] : '';
$val['name'] = $val['name'] ? $val['name'] : '';
switch ($val['status']) {
case 1:
$val['status_name'] = "正常";
break;
case 3:
$val['status_name'] = "冻结";
break;
case 4:
$val['status_name'] = "挂失";
break;
}
if (empty($val['card_key'])) {
$val['card_key'] = '';
}
// 获取会员标签
if ($param['get_type'] == 2 && $param['label_store_id']) {
$val['user_label'] = $VipWithLabelModel->getVipLabelName($val['id'], $param['label_store_id']);
}
}
}
return callBack(statusCode()['success'], empty($list) ? '暂无数据' : '获取成功', ['list' => $list, 'count' => $count]);
}
/**
* 处理普通会员查询条件
* @param $param
* $param['merchant_id'] 商户id
* $param['store_id'] 筛选的门店ID
* $param['keyword'] 会员搜索的关键词
* $param['status'] 会员状态
* $param['section'] 高级筛选条件
* $param['plus_type'] 类型 1普通vip 2Plus
* @return array
*/
public function handleVipMap($param)
{
$store_id = $param['store_id'];
$keyword = $param['keyword'];
$status = $param['status'];
$section = $param['section'];
try {
$section = json_decode($section, true);
} catch (Exception $e) {
}
$add_time = $section['time'];
$where = [
'merchantid' => $param['merchant_id'],
'plus_type' => $param['plus_type'],
'status' => ['neq', 2],
];
if (!empty($store_id) && $store_id != 0) {
$where['storeid'] = $store_id;
}
$result = [];
//如果是统计 则返回统计的条件
if ($param['sum']) {
// 昨天的数据
$start_time = mktime(0, 0, 0, date('m'), date('d') - 1, date('Y'));
$end_time = mktime(23, 59, 59, date('m'), date('d') - 1, date('Y'));
$where['addtime'] = ['between', [$start_time, $end_time]];
$result['yesterdayMap'] = $where;
// 上周的数据
$start_time = mktime(0, 0, 0, date('m'), date('d') - date("w") - 6, date('Y'));
$end_time = mktime(23, 59, 59, date('m'), date('d') - date("w"), date('Y'));
$where['addtime'] = array('between', array($start_time, $end_time));
$result['lastWeekMap'] = $where;
unset($where['addtime']);
}
//查询条件
if (!empty($keyword)) {
$where['name|nickname|mobile_phone|card_key'] = array('like', "%" . $keyword . "%");
}
//会员状态
switch ($status) {
case 1:
$where['status'] = 1;
break;
case 3:
$where['status'] = 3;
break;
case 4:
$where['status'] = 4;
break;
default:
$where['status'] = ['neq', 2];
}
//积分区间
if (!empty($section['integral'])) {
$str = strpos($section['integral'], "-");
if ($str) {
$integral = explode('-', $section['integral']);
$where['integral'] = ['between', [$integral[0], $integral[1]]];
} else {
$where['integral'] = ['egt', $section['integral']];
}
}
//余额区间
if (!empty($section['balance'])) {
$str = strpos($section['balance'], '-');
if ($str) {
$balance = explode('-', $section['balance']);
$where['balance'] = ['between', [$balance[0], $balance[1]]];
} else {
$where['balance'] = ['egt', $section['balance']];
}
}
$BillModel = new RetailBillOrderModel();
if (!empty($section['time'])) {
switch ($section['type']) {
case 1:
//激活时间
$start_time = strtotime($add_time[0]);
$end_time = strtotime($add_time[1]);
$where['addtime'] = ['between', [$start_time, $end_time]];
break;
case 2:
//生日时间
$where['birthday'] = ['between', [$add_time[0], $add_time[1]]];
break;
case 3:
//沉睡时间
$start_time = strtotime($add_time[0]);
$end_time = strtotime($add_time[1]);
$map = array(
'merchant_id' => $param['merchant_id'],
'vid' => ['gt', 0],
'add_time' => ['between', [$start_time, $end_time]]
);
if (!empty($store_id)) {
$map['store_id'] = $store_id;
}
$vidArr = $BillModel->getGroupFindField($map, 'vid', 'vid', true);
if (!empty($vidArr)) {
$where['id'] = ['not in', $vidArr];
}
break;
}
}
if ($section['type'] == 4 && !empty($section['purchase'])) {
//复购次数
$map = array(
'merchant_id' => $param['merchant_id'],
'vid' => array('gt', 0)
);
if (!empty($section['time'])) {
$start_time = strtotime($add_time[0]);
$end_time = strtotime($add_time[1]);
$map['add_time'] = array('between', array($start_time, $end_time));
}
if (!empty($store_id)) {
$map['store_id'] = $store_id;
}
$vidArr = $BillModel->getGroupHavingFindField($map, 'vid', $section['purchase'], 'vid', true);
if (!empty($vidArr)) {
$where['id'] = array('in', $vidArr);
} else {
$where['id'] = 0;
}
}
$result['map'] = $where;
return $result;
}
/**
* 充值记录-列表
* @param req_data 搜索条件 [
* keyword 搜索关键词
* mode 充值类型
* scene_type 场景
* store_id 搜索门店
* time 时间搜索
* search_type 搜索类型 1本店充值 2本店会员
* ]
* @param page 页码
* @param limit 页长
* @param merchant_id 商户id
*/
public function getRechargeList($param)
{
// 条件处理
$where = $this->handleRechargeMap($param);
$RechargeOrderModel = new RetailRechargeOrderModel();
$fields = [
'r.*',
'v.name',
'v.nickname',
'v.mobile_phone',
'v.card_key',
];
$recharge_order = $RechargeOrderModel->getVipRechargeList($where, $fields, $param['page'], $param['limit']);
if (!$recharge_order) {
return callBack(statusCode()['success'], '暂无数据', ['list' => [], 'count' => 0]);
}
$count = $RechargeOrderModel->getVipRechargeCount($where);
$StoreModel = new RetailStoreModel();
$storeIdArr = [];
$storeInfoArr = [];
foreach ($recharge_order as $key => &$val) {
$val['index'] = $key + 1;
$val['add_time'] = $val['add_time'] ? date('Y-m-d H:i:s', $val['add_time']) : '';
$val['name'] = $val['name'] ? $val['name'] : '未设置';
$val['nickname'] = $val['nickname'] ? $val['nickname'] : '未设置';
$val['mobile_phone'] = $val['mobile_phone'] ? $val['mobile_phone'] : '未设置';
$val['card_key'] = $val['card_key'] && ($val['card_key'] != 0 || $val['card_key'] != '0') ? $val['card_key'] : '未设置';
$val['all_money'] = floatval($val['all_money']);
$val['money'] = floatval($val['money']);
if ($val['store_id'] == 0) {
$val['store_name'] = '商户';
} else {
if (in_array($val['store_id'], $storeIdArr)) {
$val['store_name'] = $storeInfoArr[$val['store_id']]['name'];
} else {
$store_name = $StoreModel->getFindField(['id' => $val['store_id']], 'storetag');
$val['store_name'] = $store_name ? $store_name : '未知门店';
$storeIdArr[] = $val['store_id'];
$storeInfoArr[$val['store_id']]['name'] = $val['store_name'];
}
}
switch ($val['scene_type']) {
case 1:
$val['scene_name'] = '收银机';
break;
case 2:
$val['scene_name'] = '商户后台';
break;
case 3:
$val['scene_name'] = '门店后台';
break;
case 4:
$val['scene_name'] = '小程序';
break;
case 5:
$val['scene_name'] = '公众号';
break;
case 6:
$val['scene_name'] = '小助手';
break;
default:
$val['scene_name'] = '未知场景';
}
switch ($val['pay_type']) {
case 0:
$val['recharge_mode'] = '编辑增加';
break;
case 1:
$val['recharge_mode'] = '现金';
break;
case 2:
$val['recharge_mode'] = '微信';
break;
case 3:
$val['recharge_mode'] = '支付宝';
break;
default:
$val['recharge_mode'] = '未知类型';
}
switch ($val['repay_name']) {
case 0:
$val['aging_repay_name'] = '直接到账';
break;
case 1:
$val['aging_repay_name'] = '分期到账';
break;
default:
$val['aging_repay_name'] = '未知类型';
}
$val['give_money'] = floatval($val['give_money']);
$val['pay_coupon_fee'] = floatval($val['pay_coupon_fee']);
}
return callBack(statusCode()['success'], '获取成功', ['list' => $recharge_order, 'count' => (int)$count]);
}
/**
* 充值记录-统计
* @param req_data 搜索条件 [
* keyword 搜索关键词
* mode 充值类型
* scene_type 场景
* store_id 搜索门店
* time 时间搜索
* search_type 搜索类型 1本店充值 2本店会员
* ]
*/
public function getRechargeTotal($param)
{
$where = $this->handleRechargeMap($param);
$RechargeOrderModel = new RetailRechargeOrderModel();
$money = $RechargeOrderModel->getLinkVipSum($where, 'money');
$all_money = $RechargeOrderModel->getLinkVipSum($where, 'all_money');
$pay_coupon_money = $RechargeOrderModel->getLinkVipSum($where, 'pay_coupon_fee');
return callBack(statusCode()['success'], '获取成功', [
'money' => $money,
'all_money' => $all_money,
'give_money' => bcsub($all_money, $money),
'pay_coupon_money' => floatval($pay_coupon_money),
]);
}
/**
* 充值记录条件处理
*/
public function handleRechargeMap($param)
{
$req_data = $param['req_data'];
try {
$req_data = json_decode($req_data, true);
} catch (Exception $e) {
}
$where = [
'r.state' => 1,
'r.status' => 1,
'r.type' => ['in', '1,3'],
'r.merchant_id' => $param['merchant_id'],
];
// 昵称、姓名、手机号、实体卡
if (trim($req_data['keyword'])) {
$where['v.nickname|v.name|v.mobile_phone|v.card_key'] = ['like', ['%' . $req_data['keyword'] . '%']];
}
// 充值类型
if (!empty($req_data['mode']) && in_array($req_data['mode'], ['1', '2', '3', '4'])) {
$where['r.pay_type'] = $req_data['mode'] == 4 ? 0 : $req_data['mode'];
}
// 场景
if (!empty($req_data['scene_type']) && in_array($req_data['scene_type'], ['1', '2', '3', '4', '5', '6'])) {
$where['r.scene_type'] = $req_data['scene_type'];
}
// 时间搜索
if (!empty($req_data['time'])) {
$where['r.add_time'] = ['between', [strtotime($req_data['time'][0]), strtotime($req_data['time'][1])]];
} else if ($param['is_export']) {
//默认导出当日记录
$where['r.add_time'] = ['between', [strtotime(date('Y-m-d 00:00:00')), time()]];
}
// 门店
if ($req_data['search_type'] && $param['store_id']) {
switch ($req_data['search_type']) {
case 1:
$where['r.store_id'] = $param['store_id'];
break;
case 2:
$where['v.storeid'] = $param['store_id'];
break;
default:
$where[] = [
'v.storeid' => $param['store_id'],
'r.store_id' => $param['store_id'],
'_logic' => 'OR',
];
break;
}
} else if ($param['store_id']) {
$where[] = [
'v.storeid' => $param['store_id'],
'r.store_id' => $param['store_id'],
'_logic' => 'OR',
];
} else if ($req_data['store_id']) {
$where['r.store_id'] = $req_data['store_id'];
}
return $where;
}
/**
* 余额记录-列表
* @param seek_data [
* keyword
* type
* scene_type
* ]
* @param merchant_id 商户id
* @param page 页码
* @param limit 页长
*/
public function getBalanceList($param)
{
$where = $this->handleBalanceMap($param);
$fields = [
'r.*',
'v.name',
'v.nickname',
'v.mobile_phone',
'v.card_key',
];
$RechargeOrderModel = new RetailRechargeOrderModel();
if ($param['page'] && $param['limit']) {
$recharge_order = $RechargeOrderModel->getVipRechargeList($where, $fields, $param['page'], $param['limit']);
} else {
$recharge_order = $RechargeOrderModel->getVipRechargeList($where, $fields, '', '');
}
if (!$recharge_order) {
return callBack(statusCode()['success'], '暂无数据', [
'list' => [],
'count' => 0,
]);
}
$count = $RechargeOrderModel->getVipRechargeCount($where);
$StoreModel = new RetailStoreModel();
$storeIdArr = [];
$storeInfoArr = [];
foreach ($recharge_order as $key => &$val) {
$val['add_time'] = $val['add_time'] ? date('Y-m-d H:i:s', $val['add_time']) : '';
$val['name'] = $val['name'] ? $val['name'] : '未设置';
$val['nickname'] = $val['nickname'] ? $val['nickname'] : '未设置';
$val['mobile_phone'] = $val['mobile_phone'] ? $val['mobile_phone'] : '未设置';
$val['card_key'] = $val['card_key'] && ($val['card_key'] != 0 || $val['card_key'] != '0') ? $val['card_key'] : '未设置';
$val['all_money'] = floatval($val['all_money']);
$val['money'] = floatval($val['money']);
if ($val['store_id'] == 0) {
$val['store_name'] = '商户';
} else {
if (in_array($val['store_id'], $storeIdArr)) {
$val['store_name'] = $storeInfoArr[$val['store_id']]['name'];
} else {
$store_name = $StoreModel->getFindField(['id' => $val['store_id']], 'storetag');
$val['store_name'] = $store_name ? $store_name : '未知门店';
$storeIdArr[] = $val['store_id'];
$storeInfoArr[$val['store_id']]['name'] = $val['store_name'];
}
}
switch ($val['scene_type']) {
case 1:
$val['scene_name'] = '收银机';
break;
case 2:
$val['scene_name'] = '商户后台';
break;
case 3:
$val['scene_name'] = '门店后台';
break;
case 4:
$val['scene_name'] = '小程序';
break;
case 5:
$val['scene_name'] = '公众号';
break;
case 6:
$val['scene_name'] = '小助手';
break;
default:
$val['scene_name'] = '未知场景';
}
switch ($val['type']) {
case 1:
$val['type_name'] = '充值';
break;
case 2:
$val['type_name'] = '消费';
break;
case 3:
$val['type_name'] = '编辑增加';
break;
case 4:
$val['type_name'] = '编辑减少';
break;
case 5:
$val['type_name'] = '退款增加';
break;
case 6:
$val['type_name'] = '红包充值';
break;
case 7:
$val['type_name'] = '大转盘充值';
break;
case 8:
$val['type_name'] = '礼品卡充值';
break;
case 9:
$val['type_name'] = '充值退款';
break;
default:
$val['type_name'] = '未知类型';
}
switch ($val['pay_type']) {
case '1':
$val['recharge_mode'] = '现金';
break;
case '2':
$val['recharge_mode'] = '微信';
break;
case '3':
$val['recharge_mode'] = '支付宝';
break;
default:
$val['recharge_mode'] = '余额';
break;
}
$val['index'] = intval($key + 1);
$val['give_money'] = round($val['all_money'] - $val['money'], 2);
}
return callBack(statusCode()['success'], '获取成功', [
'list' => $recharge_order,
'count' => (int)$count,
]);
}
/**
* 余额记录-统计
* [
* merchant_id 商户id
* store_id 门店id
* ]
* @param $param
* @return mixed
*/
public function getBalanceTotal($param)
{
//处理查询条件
$where = $this->handleBalanceMap($param);
$RechargeOrderModel = new RetailRechargeOrderModel();
//总消费金额
$where['type'] = 2;
$result['consumption'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money');
//总扣除金额
$where['type'] = 4;
$result['deduct'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money');
//消费退款总金额
$where['type'] = 5;
$result['refund'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money');
//充值退款总金额
$where['type'] = 9;
$result['recharge_refund'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money');
//总充值获得金额
$where['type'] = 1;
$result['recharge'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money');
//总活动增加金额
$where['type'] = ['in', '6,7'];
$result['activity'] = $RechargeOrderModel->getLinkVipSum($where, 'all_money');
return callBack(statusCode()['success'], '获取成功', $result);
}
/**
* 余额记录条件处理
* @param $param
* @return array
*/
public function handleBalanceMap($param)
{
$where = [
'r.state' => 1,
'r.status' => 1,
'r.merchant_id' => $param['merchant_id'],
];
try {
$req_data = json_decode($param['req_data'], true);
} catch (Exception $e) {
$req_data = [];
}
// 类型查询
if (trim($req_data['keyword'])) {
$where['v.nickname|v.name|v.mobile_phone|v.card_key'] = ['like', ['%' . $req_data['keyword'] . '%']];
}
// 类型
if (!empty($req_data['type'])) {
$where['r.type'] = $req_data['type'];
}
// 场景
if (!empty($req_data['scene_type'])) {
$where['r.scene_type'] = $req_data['scene_type'];
}
// 处理门店
if ($req_data['store_id'] != '') {
$where['r.store_id'] = $req_data['store_id'];
} else if ($param['store_id']) {
$where[] = [
'v.storeid' => $param['store_id'],
'r.store_id' => $param['store_id'],
'_logic' => 'OR',
];
}
// 时间搜索
if (!empty($req_data['time'])) {
$where['r.add_time'] = ['between', [strtotime($req_data['time'][0]), strtotime($req_data['time'][1])]];
} else if ($param['is_export']) {
//默认导出当日记录
$where['r.add_time'] = ['between', [strtotime(date('Y-m-d 00:00:00')), time()]];
}
return $where;
}
}