文件
mashangyoujiu/Application/PayApi/Controller/VipCardController.class.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;
}
}