365 行
12 KiB
PHP
可执行文件
365 行
12 KiB
PHP
可执行文件
<?php
|
|
|
|
namespace PayApi\Controller;
|
|
|
|
use Common\Model\RetailVipCardModel;
|
|
use Common\Model\SubCardModel;
|
|
use Think\Controller;
|
|
|
|
//[1.8.20]
|
|
|
|
/**
|
|
* 充值送次卡
|
|
* Class VipCardController
|
|
* @package Api\Controller
|
|
*/
|
|
class VipCardController extends Controller
|
|
{
|
|
/**
|
|
* 充值、消费送次卡
|
|
* @param int $merchant_id 商户id
|
|
* @param int $vip_id 会员id
|
|
* @param float $money 充值消费金额
|
|
* @param int $type 发放类型
|
|
* @param int $source 来源 1.线下 2.线上
|
|
* @param int $ro_id 充值对应id
|
|
* @param int $bill_id 充值对应id
|
|
* @return
|
|
*/
|
|
public function rechargeGiveCard($merchant_id, $vip_id, $money, $type, $source, $ro_id = 0, $bill_id = 0)
|
|
{
|
|
// 查询会员
|
|
$Vip = D('RetailVip');
|
|
$vip_info = $Vip->getFind(array($Vip::ID => $vip_id, $Vip::MERCHANT_ID => $merchant_id));
|
|
if (!$vip_info) {
|
|
$res = array('status' => 0, 'msg' => '会员信息查询失败');
|
|
return $res;
|
|
}
|
|
// 查询等级
|
|
$Integral = D('VipIntegral');
|
|
$grade_info = $Integral->getFindGrade(array('merchantid' => $merchant_id, 'min_integral' => array('elt', $vip_info[$Vip::GRADE_INTEGRAL])));
|
|
$vip_grade = !empty($grade_info) ? $grade_info['id'] : 0; // 0 为无等级
|
|
// 次卡发放
|
|
$this->giveSubCard($merchant_id, $vip_info, $money, $vip_grade, $type, $source, $ro_id, $bill_id);
|
|
// 卡包发放
|
|
$this->giveCardBag($merchant_id, $vip_info, $money, $vip_grade, $type, $source, $ro_id, $bill_id);
|
|
// 返回值
|
|
$res = array('status' => 1, 'msg' => '发放成功');
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* 次卡发放
|
|
* @param int $merchantid 商户id
|
|
* @param array $vip 会员
|
|
* @param float $money 充值金额
|
|
* @param int $vip_grad 等级
|
|
* @return bool
|
|
*/
|
|
protected function giveSubCard($merchant_id, $vip_info, $money, $vip_grade, $type, $source, $ro_id, $bill_id)
|
|
{
|
|
$time = time();
|
|
// 查询次卡
|
|
$map = array(
|
|
'merchantid' => $merchant_id,
|
|
'type' => $type,
|
|
'card_type' => 1,
|
|
'money' => array('elt', $money),
|
|
'_string' => "end_time > {$time} AND surplus > 0 AND status = 0",
|
|
);
|
|
// 判断来源
|
|
if ($source == 1) {
|
|
$map['line_state'] = 1;
|
|
} else {
|
|
$map['online_state'] = 1;
|
|
}
|
|
$SubCard = D('SubCard');
|
|
$sub_card = $SubCard->toSelect($map, '', '', '*', 'money desc,addtime desc');
|
|
// 判断
|
|
if (empty($sub_card)) {
|
|
$res = array('status' => 0, 'msg' => '暂无次卡赠送');
|
|
return $res;
|
|
}
|
|
$res = $this->vipGetSubCard($merchant_id, $vip_info, $sub_card, $vip_grade, $ro_id, 0, $bill_id);
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* 会员添加次卡
|
|
* @param array $merchant_id
|
|
* @param int $vip_info
|
|
* @param int $sub_card
|
|
* @param int $vip_grade
|
|
* @param int $ro_id
|
|
* @param int $po_id
|
|
* @return array $res
|
|
*/
|
|
public function vipGetSubCard($merchant_id, $vip_info, $sub_card, $vip_grade = 0, $ro_id = 0, $po_id = 0, $bill_id = 0)
|
|
{
|
|
// 定义
|
|
$record = array(
|
|
'vip_id' => $vip_info['id'],
|
|
'merchantid' => $merchant_id,
|
|
'type' => 1,
|
|
'use_num' => 0,
|
|
'addtime' => time(),
|
|
'status' => 0,
|
|
'recharge_order_id' => $ro_id,
|
|
'pay_order_id' => $po_id,
|
|
'bill_id' => $bill_id,
|
|
);
|
|
$start_time = strtotime(date('Y-m-d'));
|
|
$VipCardModel = new RetailVipCardModel();
|
|
$SubCardModel = new SubCardModel();
|
|
// 处理次卡
|
|
$num = 0;
|
|
foreach ($sub_card as $val) {
|
|
// 判断类型
|
|
if ($val['type'] == 1 || $val['type'] == 2 || $val['type'] == 3) {
|
|
// 判断等级
|
|
if ($val['gradeids'] && $val['gradeids'] != 0) {
|
|
$gradeids = explode(',', $val['gradeids']);
|
|
if (!in_array($vip_grade, $gradeids)) {
|
|
continue;
|
|
}
|
|
}
|
|
// 判断门店
|
|
if ($val['storeids'] && $val['storeids'] != 0) {
|
|
$storeids = explode(',', $val['storeids']);
|
|
if (!in_array($vip_info['storeid'], $storeids)) {
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
// 判断类型
|
|
if ($val['type'] != 1) {
|
|
// 判断赠送次数
|
|
$count = $VipCardModel->getCount(['vip_id' => $vip_info['id'], 'sub_card_id' => $val['id'], 'status' => 0]);
|
|
// 会员以领取过该张次卡
|
|
if ($count && intval($count) > 0) {
|
|
if (intval($count) >= intval($val['give_num'])) {
|
|
// 该张次卡不可重复领取
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
//判断使用时间限制
|
|
switch ($val['effective_time_type']) {
|
|
case '1':
|
|
//固定时间使用
|
|
$record['start_time'] = $start_time;
|
|
$record['end_time'] = $val['effective_end'];
|
|
break;
|
|
case '2':
|
|
//领卡当日生效
|
|
$record['start_time'] = $start_time;
|
|
$record['end_time'] = $start_time + $val['effective_day'] * 86400 - 1;
|
|
break;
|
|
case '3':
|
|
//领卡次日生效
|
|
$record['start_time'] = $start_time + 86400;
|
|
$record['end_time'] = $start_time + $val['effective_day'] * 86400 - 1;
|
|
break;
|
|
}
|
|
$record['sub_card_id'] = $val['id'];
|
|
// 赠送次卡
|
|
$vc_add = $VipCardModel->addOrder($record);
|
|
// 赠送成功 减数量
|
|
if (!$vc_add) {
|
|
// 该张次卡发放失败
|
|
continue;
|
|
} else {
|
|
// 减库存
|
|
$SubCardModel->toSetDec(array('id' => $val['id']), 'surplus');
|
|
++$num;
|
|
break;
|
|
}
|
|
}
|
|
if ($num > 0) {
|
|
$res = array('status' => 1, 'msg' => '发放成功');
|
|
} else {
|
|
$res = array('status' => 0, 'msg' => '发放失败');
|
|
}
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* 卡包发放
|
|
* @param array $merchant_id
|
|
* @param int $vip_info
|
|
* @param int $vip_grade
|
|
* @param int $sub_card
|
|
* @param int $ro_id
|
|
* @return array $res
|
|
*/
|
|
protected function giveCardBag($merchant_id, $vip_info, $money, $vip_grade, $type, $source, $ro_id, $bill_id)
|
|
{
|
|
$CardBag = D('CardBag');
|
|
$time = time();
|
|
// 条件
|
|
$map = array(
|
|
'merchantid' => $merchant_id,
|
|
'type' => $type,
|
|
'money' => array('elt', $money),
|
|
'_string' => "end_time > {$time} AND surplus > 0 AND status = 0",
|
|
);
|
|
// 判断来源
|
|
if ($source == 1) {
|
|
$map['line_state'] = 1;
|
|
} else {
|
|
$map['online_state'] = 1;
|
|
}
|
|
// 查询
|
|
$card_bag = $CardBag->toSelect($map, '', '', '*', 'money desc,addtime desc');
|
|
if (empty($card_bag)) {
|
|
$res = array('status' => 0, 'msg' => '暂无卡包赠送');
|
|
return $res;
|
|
}
|
|
$res = $this->vipGetCardBag($merchant_id, $vip_info, $card_bag, $vip_grade, $ro_id, 0, $bill_id);
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* 会员添加卡包次卡
|
|
* @param array $merchant_id
|
|
* @param int $vip_info
|
|
* @param int $sub_card
|
|
* @param int $vip_grade
|
|
* @param int $ro_id
|
|
* @return array $res
|
|
*/
|
|
public function vipGetCardBag($merchant_id, $vip_info, $card_bag, $vip_grade = 0, $ro_id = 0, $po_id = 0, $bill_id = 0)
|
|
{
|
|
// 定义
|
|
$Vip = D('RetailVip');
|
|
$cr = array(
|
|
'vip_id' => $vip_info[$Vip::ID],
|
|
'merchantid' => $merchant_id,
|
|
'type' => 1,
|
|
'use_num' => 0,
|
|
'addtime' => time(),
|
|
'status' => 0,
|
|
'recharge_order_id' => $ro_id,
|
|
'pay_order_id' => $po_id,
|
|
'bill_id' => $bill_id,
|
|
);
|
|
// 定义次卡查询条件
|
|
$map = array(
|
|
'merchantid' => $merchant_id,
|
|
'card_type' => 2,
|
|
'status' => 0,
|
|
);
|
|
// 处理数据
|
|
$SubCard = D('SubCard');
|
|
$CardBag = D('CardBag');
|
|
$num = 0;
|
|
foreach ($card_bag as &$val) {
|
|
$cr['card_bag_id'] = $val['id'];
|
|
// 判断类型
|
|
if ($val['type'] == 1 || $val['type'] == 2 || $val['type'] == 3) {
|
|
// 判断门店
|
|
if ($val['storeids'] && $val['storeids'] != 0) {
|
|
$storeids = explode(',', $val['storeids']);
|
|
if (!in_array($vip_info['storeid'], $storeids)) {
|
|
continue;
|
|
}
|
|
}
|
|
// 判断等级
|
|
if ($val['gradeids'] && $val['gradeids'] != 0) {
|
|
$gradeids = explode(',', $val['gradeids']);
|
|
if (!in_array($vip_grade, $gradeids)) {
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
// 查询次卡
|
|
$b_map = $map;
|
|
$b_map['bag_id'] = $val['id'];
|
|
$sub_card = $SubCard->toSelect($b_map);
|
|
// 判断卡包次卡
|
|
if (empty($sub_card)) {
|
|
// 暂无次卡发放
|
|
continue;
|
|
}
|
|
// 发放次卡
|
|
$s_num = $this->giveBagCard($sub_card, $cr, $val['give_num'], $val['type']);
|
|
// 判断是否赠送成功
|
|
if ($s_num && intval($s_num) > 0) {
|
|
// 减库存
|
|
$CardBag->toSetDec(array('id' => $val['id']), 'surplus');
|
|
++$num;
|
|
break;
|
|
} else {
|
|
// 卡包次卡发放失败
|
|
continue;
|
|
}
|
|
}
|
|
if ($num > 0) {
|
|
$res = array('status' => 1, 'msg' => '发放成功');
|
|
} else {
|
|
$res = array('status' => 0, 'msg' => '发放失败');
|
|
}
|
|
return $res;
|
|
}
|
|
|
|
/**
|
|
* 添加卡包次卡
|
|
*
|
|
*/
|
|
protected function giveBagCard($sub_card, $record, $give_num, $type)
|
|
{
|
|
// 定义
|
|
$map = array(
|
|
'vip_id' => $record['vip_id'],
|
|
'merchantid' => $record['merchantid'],
|
|
'card_bag_id' => $record['card_bag_id'],
|
|
'status' => 0
|
|
);
|
|
$VipCardModel = new RetailVipCardModel();
|
|
$num = 0;
|
|
$start_time = strtotime(date('Y-m-d'));
|
|
foreach ($sub_card as $val) {
|
|
// 判断类型
|
|
if ($type == 1 || $type == 2 || $type == 3) {
|
|
// 判断赠送次数
|
|
$c_map = $map;
|
|
$c_map['sub_card_id'] = $val['id'];
|
|
$count = $VipCardModel->getCount($c_map);
|
|
// 判断领取
|
|
if ($count && intval($count) > 0) {
|
|
if (intval($count) >= intval($give_num)) {
|
|
// 该卡包不可重复领取
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
switch ($val['effective_time_type']) {
|
|
case '1':
|
|
//固定时间使用
|
|
$record['start_time'] = $start_time;
|
|
$record['end_time'] = $val['effective_end'];
|
|
break;
|
|
case '2':
|
|
//领卡当日生效
|
|
$record['start_time'] = $start_time;
|
|
$record['end_time'] = $start_time + $val['effective_day'] * 86400 - 1;
|
|
break;
|
|
case '3':
|
|
//领卡次日生效
|
|
$record['start_time'] = $start_time + 86400;
|
|
$record['end_time'] = $start_time + $val['effective_day'] * 86400 - 1;
|
|
break;
|
|
}
|
|
$record['type'] = 2;
|
|
$record['sub_card_id'] = $val['id'];
|
|
// 赠送次卡
|
|
$vc_add = $VipCardModel->addOrder($record);
|
|
if ($vc_add) {
|
|
++$num;
|
|
}
|
|
}
|
|
return $num;
|
|
}
|
|
|
|
|
|
} |