文件
mashangyoujiu/Application/PayApi/Controller/RechargeController.class.php

848 行
38 KiB
PHP
可执行文件

<?php
namespace PayApi\Controller;
use Common\Model\RetailMerchantModel;
use Common\Model\RetailMessageModel;
use Common\Model\RetailPayOrderModel;
use Common\Model\RetailRechargeOrderModel;
use Common\Model\RetailSmallProgramUserModel;
use Common\Model\RetailVipChangeModel;
use Common\Model\RetailVipConfigModel;
use Common\Model\RetailVipIntegralModel;
use Common\Model\RetailVipModel;
use Common\Model\RetailVipRechargeModel;
use Think\Controller;
//[1.8.68]
/**
* 充值
* Class RechargeController
* @package Api\Controller
*/
class RechargeController extends Controller
{
/**
* 判断会员类型
* @param int $vip_id 会员id
* @param array $vip_info 会员信息
* @return bool|int;
*/
public function getVipType($vip_id, $vip_info = array())
{
// 判断会员
$RVModel = D('RetailVip');
if (!$vip_info) {
// 查询会员信息
$vip_info = $RVModel->getFind(array($RVModel::ID => $vip_id, $RVModel::STATUS => 1));
if (!$vip_info) { // 会员查询失败
return false;
}
}
// 判断会员类型
if ($vip_info[$RVModel::PLUS_ID]) { // 充值过plus
// 查询plus会员
$RPVModel = D('RetailPlusVip');
$map2 = array(
$RPVModel::ID => $vip_info[$RVModel::PLUS_ID],
$RPVModel::VIP_ID => $vip_id,
);
$plus_info = $RPVModel->getFind($map2);
if ($plus_info) {
// 判断过期
if ($plus_info[$RPVModel::STATE] == 2 || $plus_info[$RPVModel::END_TIME] < time()) {
$vip_type = 2;
} else {
$vip_type = 3;
}
} else { // 未查询到plus
$vip_type = 1;
}
} else { // 未充值过plus会员
$vip_type = 1;
}
return $vip_type;
}
/**
* 更新充值订单(余额记录)
* @param $pay_order pay_order表数据
* @return array
*/
public function updateOrder($pay_order)
{
// 实例化模型
$RechargeOrderModel = new RetailRechargeOrderModel();
$VipIntegralModel = new RetailVipIntegralModel();
$VipRechargeModel = new RetailVipRechargeModel();
$VipChangeModel = new RetailVipChangeModel();
$VipConfigModel = new RetailVipConfigModel();
$PayOrderModel = new RetailPayOrderModel();
$VipModel = new RetailVipModel();
$time = time();
// 余额记录查询条件
$map = array(
$RechargeOrderModel::PAY_ORDER_ID => $pay_order[$PayOrderModel::ID],
$RechargeOrderModel::MERCHANT_ID => $pay_order[$PayOrderModel::MERCHANT_ID],
$RechargeOrderModel::STORE_ID => $pay_order[$PayOrderModel::STORE_ID],
$RechargeOrderModel::STATUS => 0,
$RechargeOrderModel::STATE => 1,
);
// 余额记录订单
$recharge_order = $RechargeOrderModel->getFind($map);
if (!$recharge_order) {
$res = array(
'status' => 0,
'msg' => '充值订单查询失败'
);
return $res;
}
$data = [
$RechargeOrderModel::STATUS => 1
];
if (!empty($pay_order['pay_coupon_id_str']) && !empty($pay_order['pay_coupon_fee'])) {
//使用了代金券
$data['pay_coupon_id_str'] = $pay_order['pay_coupon_id_str'];
$data['pay_coupon_fee'] = $pay_order['pay_coupon_fee'];
$data['money'] = round($recharge_order['money'] - $pay_order['pay_coupon_fee'], 2);
}
// 更新余额订单
$save = $RechargeOrderModel->updateOrder($map, $data);
if (!$save) {
$res = array(
'status' => 0,
'msg' => '充值订单更新失败'
);
return $res;
}
// 查询会员
$map2 = array(
$VipModel::ID => $recharge_order[$RechargeOrderModel::VID],
$VipModel::STATUS => 1
);
$vip_info = $VipModel->getFind($map2);
if (!$vip_info) {
$res = array(
'status' => 0,
'msg' => '会员查询失败'
);
return $res;
}
// 获取会员类型
$vip_type = $this->getVipType($recharge_order[$RechargeOrderModel::VID], $vip_info);
// 获取充值送积分设置
$vip_config = $VipConfigModel->getFind(array($VipConfigModel::MERCHANT_ID => $pay_order[$PayOrderModel::MERCHANT_ID]));
if ($vip_config) {
$parameter = array(
'vip_type' => $vip_type,
'vip_config' => $vip_config
);
$percent_state = $VipConfigModel->recharge_integral_config($parameter); //true验证成功
if ($percent_state) {
$parameter['vip_info'] = $vip_info;
$parameter['recharge_order'] = $recharge_order;
$integral = $VipConfigModel->recharge_get_integral($parameter);
$vip_info[$VipModel::INTEGRAL] = $vip_info[$VipModel::INTEGRAL] && $vip_info[$VipModel::INTEGRAL] > 0 ? $vip_info[$VipModel::INTEGRAL] : 0;
$vip_info[$VipModel::GRADE_INTEGRAL] = $vip_info[$VipModel::GRADE_INTEGRAL] && $vip_info[$VipModel::GRADE_INTEGRAL] > 0 ? $vip_info[$VipModel::GRADE_INTEGRAL] : 0;
// 修改积分 等级积分
$up2[$VipModel::INTEGRAL] = $vip_info[$VipModel::INTEGRAL] + $integral;
$up2[$VipModel::GRADE_INTEGRAL] = $vip_info[$VipModel::GRADE_INTEGRAL] + $integral;
}
}
// 增加会员余额 积分
if ($recharge_order['repay_name'] == 1) {
$up2[$VipModel::BALANCE] = $vip_info[$VipModel::BALANCE] + $recharge_order[$RechargeOrderModel::MONEY];
} else {
$up2[$VipModel::BALANCE] = $vip_info[$VipModel::BALANCE] + $recharge_order[$RechargeOrderModel::ALL_MONEY];
}
$save2 = $VipModel->updateOrder($map2, $up2);
if (!$save2) {
$res = array(
'status' => 0,
'msg' => '会员信息更新失败,请联系商家'
);
return $res;
}
// 判断积分是否修改
if ($integral && $integral > 0) {
// 添加积分记录
$IntegralOrderModel = D('RetailIntegralOrder');
$cr = array(
$IntegralOrderModel::VID => $vip_info[$VipModel::ID],
$IntegralOrderModel::TYPE => 8,
$IntegralOrderModel::INTEGRAL => $integral,
$IntegralOrderModel::ADD_TIME => $time,
$IntegralOrderModel::STORE_ID => $pay_order[$PayOrderModel::STORE_ID],
$IntegralOrderModel::BILL_ID => 0,
$IntegralOrderModel::REMARK => '充值获得' . $integral . '积分',
$IntegralOrderModel::MERCHANT_ID => $pay_order[$PayOrderModel::MERCHANT_ID],
$IntegralOrderModel::RECHARGE_ORDER_ID => $recharge_order[$RechargeOrderModel::ID],
);
$add_result = $IntegralOrderModel->addOrder($cr);
if (!$add_result) {
$res = array(
'status' => 0,
'msg' => '积分记录失败'
);
$this->ajaxReturn($res);
}
}
// 获取会员原等级
$grade = $VipIntegralModel->getOrderFind(array($VipIntegralModel::MIN_INTEGRAL => array('elt', $vip_info[$VipModel::GRADE_INTEGRAL])), array($VipIntegralModel::ID, $VipIntegralModel::CARD_NAME), $VipIntegralModel::MIN_INTEGRAL . ' desc');
$vip_info['grade_id'] = $grade[$VipIntegralModel::ID] ? $grade[$VipIntegralModel::ID] : 0;
$grade_name = $grade[$VipIntegralModel::CARD_NAME] ? $grade[$VipIntegralModel::CARD_NAME] : '无等级';
// 增加变更记录
$cr2 = array(
$VipChangeModel::AFTER_BALANCE => $up2[$VipModel::BALANCE],
$VipChangeModel::MERCHANT_ID => $pay_order[$PayOrderModel::MERCHANT_ID],
$VipChangeModel::STORE_ID => $pay_order[$PayOrderModel::STORE_ID],
$VipChangeModel::VIP_ID => $vip_info[$VipModel::ID],
$VipChangeModel::OPERATOR => $recharge_order[$RechargeOrderModel::USER_TYPE],
$VipChangeModel::OPERATOR_ID => $recharge_order[$RechargeOrderModel::CASHIER_ID],
$VipChangeModel::BEFORE_PHONE => $vip_info[$VipModel::MOBILE_PHONE],
$VipChangeModel::BEFORE_BALANCE => $vip_info[$VipModel::BALANCE],
$VipChangeModel::BEFORE_GRADE => $grade_name,
$VipChangeModel::ADD_TIME => $time
);
$add_result2 = $VipChangeModel->addOrder($cr2);
if (!$add_result2) {
$res = array(
'status' => 0,
'msg' => '余额变更记录添加失败'
);
return $res;
}
// 充值送优惠券(与充值活动没有绑定的优惠券)
$this->rechargeGiveCoupon($vip_info, $pay_order['trade_amount'], $pay_order['merchant_id'], $vip_type, $recharge_order['id'], $pay_order['store_id']);
// 充值送次卡
if ($recharge_order[$RechargeOrderModel::SCENE_TYPE] == 4 || $recharge_order[$RechargeOrderModel::SCENE_TYPE] == 5) {
$source = 2;
} else {
$source = 1;
}
A('PayApi/VipCard')->rechargeGiveCard($pay_order[$PayOrderModel::MERCHANT_ID], $vip_info[$VipModel::ID], $pay_order[$PayOrderModel::TRADE_AMOUNT], 2, $source, $recharge_order[$RechargeOrderModel::ID]);
// 判断充值活动
if ($recharge_order[$RechargeOrderModel::VIP_RECHARGE_ID]) {
// 查询充值活动
$map2 = array(
$VipRechargeModel::ID => $recharge_order[$RechargeOrderModel::VIP_RECHARGE_ID],
$VipRechargeModel::MERCHANT_ID => $pay_order[$PayOrderModel::MERCHANT_ID],
$VipRechargeModel::STORE_ID => $pay_order[$PayOrderModel::STORE_ID],
$VipRechargeModel::STATUS => 1,
$VipRechargeModel::STATE => 1,
$VipRechargeModel::SURPLUS => array(array('gt', 0), array('eq', -1), 'or'),
$VipRechargeModel::START_TIME => array(array('eq', ''), array('lt', $time), 'or'),
$VipRechargeModel::END_TIME => array(array('eq', ''), array('gt', $time), 'or')
);
$field = array(
$VipRechargeModel::ID,
$VipRechargeModel::SCENE_TYPE,
$VipRechargeModel::COUPON_ID,
$VipRechargeModel::COUPON_TYPE,
$VipRechargeModel::SURPLUS,
$VipRechargeModel::TIME,
);
$recharge_activity = $VipRechargeModel->getFind($map2, $field);
if (!$recharge_activity) {
$res = array(
'status' => 0,
'msg' => '未查询到该充值活动'
);
return $res;
}
// 判断类型
if ($recharge_activity[$VipRechargeModel::SCENE_TYPE] == 2) {
// 开通plus
$result = $this->openPlus($vip_info, $pay_order, $recharge_activity[$VipRechargeModel::TIME]);
} else if ($recharge_activity[$VipRechargeModel::SCENE_TYPE] == 3) {
// 续费plus
$result = $this->renewPlus($vip_info, $pay_order, $recharge_activity[$VipRechargeModel::TIME]);
} else {
$result = array(
'status' => 1,
'msg' => '常规充值活动'
);
}
if ($result['status'] == 0) {
return $result;
}
// 判断充值送优惠券
if ($recharge_activity[$VipRechargeModel::COUPON_ID]) {
if ($recharge_activity[$VipRechargeModel::COUPON_TYPE] == 1) {
// 优惠券
$this->rechargeActivityGiveCoupon($vip_info, $recharge_activity[$VipRechargeModel::COUPON_ID], $pay_order[$PayOrderModel::MERCHANT_ID], $vip_type, $recharge_order[$RechargeOrderModel::ID]);
} else {
// 券包
$this->rechargeActivityGiveCouponGroup($vip_info, $recharge_activity[$VipRechargeModel::COUPON_ID], $pay_order[$PayOrderModel::MERCHANT_ID], $vip_type, $recharge_order[$RechargeOrderModel::ID]);
}
}
// 限制数量则减少剩余数量
if (intval($recharge_activity[$VipRechargeModel::SURPLUS]) > 0) {
$actMap = array(
$VipRechargeModel::ID => $recharge_activity[$VipRechargeModel::ID]
);
$VipRechargeModel->toSetDec($actMap, $VipRechargeModel::SURPLUS, 1);
}
}
// 判断支付方式
switch ($pay_order[$PayOrderModel::PAY_TYPE]) {
case 1:
$pay_name = '微信支付';
break;
case 2:
$pay_name = '支付宝';
break;
case 3:
$pay_name = '现金支付';
break;
case 4:
$pay_name = '微信支付';
break;
default:
$pay_name = '现金支付';
}
// 公众号推送
A('Vip/Mark')->rechargesuccess($pay_order[$PayOrderModel::STORE_ID], $vip_info[$VipModel::ID], $recharge_order[$RechargeOrderModel::MONEY], $recharge_order[$RechargeOrderModel::ALL_MONEY], $pay_name);
$res = array(
'status' => 1,
'msg' => '充值成功'
);
return $res;
}
/**
* 充值送优惠券
* @param array $vip_info 会员信息
* @return array $res
*/
public function rechargeGiveCoupon($vip_info, $money, $merchant_id, $vip_type, $recharge_order_id, $store_id = 0)
{
// 实例化模型
$retailMCouponModel = D('RetailMCoupon');
$VipModel = D('RetailVip');
$time = time();
// 查询优惠券
$map = array(
$retailMCouponModel::MERCHANT_ID => $merchant_id,
$retailMCouponModel::STATUS => 1,
$retailMCouponModel::COUPON_NUM => array('gt', 0),
$retailMCouponModel::RECHARGE_STATE => 1,
$retailMCouponModel::MONEY => array('elt', $money),
$retailMCouponModel::TYPE => 1,
'_string' => "(" . $retailMCouponModel::COUPON_TYPE . " = 1 AND " . $retailMCouponModel::START_TIME . " < {$time} AND " . $retailMCouponModel::END_TIME . "> {$time}) OR (" . $retailMCouponModel::COUPON_TYPE . " = 2) OR (" . $retailMCouponModel::COUPON_TYPE . " = 3)"
);
$coupon = $retailMCouponModel->getSelect($map);
if (!$coupon) {
$res = array('status' => 0, 'msg' => '暂无发放的优惠券');
return $res;
}
$XcxUserModel = new RetailSmallProgramUserModel();
$uid = $XcxUserModel->getFindField(['vid' => $vip_info['id']], 'id');
$isVip = $uid ? true : false;
foreach ($coupon as &$val) {
// 判断门店
if ($val[$retailMCouponModel::STORE_IDS] != 0) {
if (!in_array($store_id, explode(',', $val[$retailMCouponModel::STORE_IDS]))) {
//不满足优惠券发放条件
continue;
}
}
// 判断等级
if ($val[$retailMCouponModel::COUPON_GRADE_ID] != 0) {
// plus专属优惠券
if ($val[$retailMCouponModel::COUPON_GRADE_ID] == -1 || $val[$retailMCouponModel::COUPON_GRADE_ID] == '-1') { // plus会员专属优惠券
if ($vip_type != 3) {
//不满足优惠券发放条件
continue;
}
} else { // 普通优惠券
if (!in_array($vip_info['grade_id'], explode(',', $val[$retailMCouponModel::COUPON_GRADE_ID]))) { // 普通优惠券
//不满足优惠券发放条件
continue;
}
}
}
// 优惠券发放
$result = $this->publicGiveCoupon($vip_info[$VipModel::ID], $val, $merchant_id, $recharge_order_id);
if ($result['status'] == 1) {
// 发放成功,减库存
$dec_result = $retailMCouponModel->toSetDec(array($retailMCouponModel::ID => $val[$retailMCouponModel::ID]), $retailMCouponModel::COUPON_NUM, 1);
unset($dec_result);
if ($isVip) {
$RetailMessageModel = new RetailMessageModel();
$RetailMessageModel->couponSkipAdd($uid, $val['id']);
}
}
unset($result);
}
return true;
}
/**
* 开通plus会员
* @param array $vip_info 会员信息
* @param array $pay_order 订单
* @param int $plus_time plus会员时长
* @return array
*/
public function openPlus($vip_info = array(), $pay_order = array(), $plus_time = 365)
{
// 实例化模型
$PlusRecordModel = D('RetailPlusRecord');
$PayOrderModel = D('RetailPayOrder');
$PlusVipModel = D('RetailPlusVip');
$VipModel = D('RetailVip');
$time = time();
$merchant_id = $pay_order[$PayOrderModel::MERCHANT_ID];
$store_id = $pay_order[$PayOrderModel::STORE_ID];
// 查询plus
$map = array(
$PlusVipModel::VIP_ID => $vip_info[$VipModel::ID],
$PlusVipModel::MERCHANT_ID => $merchant_id,
// $PlusVipModel::STORE_ID => $store_id,
);
$plus_info = $PlusVipModel->getFind($map);
if (!empty($plus_info)) {
$res = array(
'status' => 0,
'msg' => '该会员已开通plus会员,请选择续费活动'
);
return $res;
}
// 查询小程序用户
$RetailSmallProgramUser = D('RetailSmallProgramUser');
$s_map = array(
$RetailSmallProgramUser::MERCHANT_ID => $merchant_id,
$RetailSmallProgramUser::VID => $vip_info[$VipModel::ID],
);
if (!empty($pay_order[$PayOrderModel::UID])) {
$s_map[$RetailSmallProgramUser::ID] = $pay_order[$PayOrderModel::UID];
}
$s_user = $RetailSmallProgramUser->getFind($s_map);
unset($s_map[$RetailSmallProgramUser::ID]);
// 添加plus会员
$cr = array(
$PlusVipModel::VIP_ID => $vip_info[$VipModel::ID],
$PlusVipModel::XCX_VIP_ID => $s_user ? $s_user[$RetailSmallProgramUser::ID] : 0,
$PlusVipModel::MERCHANT_ID => $merchant_id,
// $PlusVipModel::STORE_ID => $store_id,
$PlusVipModel::STORE_ID => $vip_info['storeid'],
$PlusVipModel::ADD_TIME => $time,
$PlusVipModel::START_TIME => $time,
$PlusVipModel::END_TIME => $time + $plus_time * 86400,
$PlusVipModel::STATE => 1,
);
$add_plus_id = $PlusVipModel->addOrder($cr);
if (!$add_plus_id) {
$res = array(
'status' => 0,
'msg' => '开通失败'
);
return $res;
}
// 修改会员类型
$up = array(
$VipModel::PLUS_ID => $add_plus_id,
$VipModel::PLUS_TYPE => 2,
$VipModel::PLUS_STATE => 1,
);
$save_result = $VipModel->updateOrder(array($VipModel::ID => $vip_info[$VipModel::ID]), $up);
if (!$save_result) {
$res = array(
'status' => 0,
'msg' => 'plus会员添加失败'
);
return $res;
}
// 更新小程序用户
if (!empty($s_user)) {
$save = array(
$RetailSmallProgramUser::USER_TYPE => 2,
$RetailSmallProgramUser::PLUS_VIP_ID => $add_plus_id,
);
$RetailSmallProgramUser->updateOrder($s_map, $save);
}
// 添加plus会员开通记录
$cr2 = array(
$PlusRecordModel::PAY_ORDER_ID => $pay_order[$PayOrderModel::ID],
$PlusRecordModel::MERCHANT_ID => $merchant_id,
$PlusRecordModel::STORE_ID => $store_id,
$PlusRecordModel::VIP_ID => $vip_info[$VipModel::ID],
$PlusRecordModel::XCX_UID => $s_user ? $s_user[$RetailSmallProgramUser::ID] : 0,
$PlusRecordModel::MONEY => $pay_order[$PayOrderModel::TRADE_AMOUNT],
$PlusRecordModel::PAY_STATE => 1,
$PlusRecordModel::PAY_TYPE => $pay_order[$PayOrderModel::PAY_TYPE],
$PlusRecordModel::TYPE => 3,
$PlusRecordModel::ADD_TIME => time(),
$PlusRecordModel::TIME => $plus_time,
);
$add_result2 = $PlusRecordModel->addOrder($cr2);
if ($add_result2) {
$res = array(
'status' => 1,
'msg' => '开通成功'
);
} else {
$res = array(
'status' => 0,
'msg' => '开通记录添加失败'
);
}
return $res;
}
/**
* 续费plus会员
* @param array $vip_info 会员信息
* @param array $pay_order 订单
* @param int $plus_time plus会员时长
* @return array
*/
public function renewPlus($vip_info = array(), $pay_order = array(), $plus_time = 365)
{
// 实例化模型
$PlusRecordModel = D('RetailPlusRecord');
$PayOrderModel = D('RetailPayOrder');
$PlusVipModel = D('RetailPlusVip');
$VipModel = D('RetailVip');
$time = time();
$merchant_id = $pay_order[$PayOrderModel::MERCHANT_ID];
$store_id = $pay_order[$PayOrderModel::STORE_ID];
// 查询plus状态
$map = array(
$PlusVipModel::ID => $vip_info[$VipModel::PLUS_ID],
$PlusVipModel::VIP_ID => $vip_info[$VipModel::ID],
$PlusVipModel::MERCHANT_ID => $merchant_id,
);
$plus_info = $PlusVipModel->getFind($map);
if (empty($plus_info)) {
$res = array(
'status' => 0,
'msg' => 'plus会员查询失败'
);
return $res;
}
// 修改plus会员
$up = array();
if ($plus_info[$PlusVipModel::STATE] == 2 || $plus_info[$PlusVipModel::END_TIME] < $time) {
// 过期
if ($plus_info[$PlusVipModel::STATE] == 2) {
$up[$PlusVipModel::STATE] = 1;
}
$up[$PlusVipModel::START_TIME] = $time;
$up[$PlusVipModel::END_TIME] = $time + $plus_time * 86400;
} else {
// 正常
$up[$PlusVipModel::END_TIME] = $plus_info[$PlusVipModel::END_TIME] + $plus_time * 86400;
}
$pMap = array(
$PlusVipModel::ID => $plus_info[$PlusVipModel::ID]
);
// 查询小程序用户
$RetailSmallProgramUser = D('RetailSmallProgramUser');
$s_map = array(
$RetailSmallProgramUser::MERCHANT_ID => $merchant_id,
$RetailSmallProgramUser::VID => $vip_info[$VipModel::ID],
);
$s_user = $RetailSmallProgramUser->getFind($s_map);
$up[$PlusVipModel::XCX_VIP_ID] = $s_user ? $s_user[$RetailSmallProgramUser::ID] : 0;
$save_result = $PlusVipModel->updateOrder($pMap, $up);
if (!$save_result) {
$res = array(
'status' => 0,
'msg' => '续费失败'
);
return $res;
}
// 修改会员
$up2 = array();
// 会员plus_id
if ($vip_info[$VipModel::PLUS_ID] != $plus_info[$PlusVipModel::ID]) {
$up2[$VipModel::PLUS_ID] = $plus_info[$PlusVipModel::ID];
}
// 会员类型
if ($vip_info[$VipModel::PLUS_TYPE] != 2) {
$up2[$VipModel::PLUS_TYPE] = 2;
}
// 判断过期
if ($vip_info[$VipModel::PLUS_STATE] != 1) {
$up2[$VipModel::PLUS_STATE] = 1;
}
// 二次判断是否修改
if ($up2) {
// 修改会员状态
$save_result2 = $VipModel->updateOrder(array($VipModel::ID => $vip_info[$VipModel::ID]), $up2);
if (!$save_result2) {
$res = array(
'status' => 0,
'msg' => '会员类型变更失败'
);
return $res;
}
}
// 更新小程序用户
if (!empty($s_user)) {
$RetailSmallProgramUser->updateOrder($map, array($RetailSmallProgramUser::USER_TYPE => 2));
}
// 添加plus会员续费记录
$cr = array(
$PlusRecordModel::PAY_ORDER_ID => $pay_order[$PayOrderModel::ID],
$PlusRecordModel::MERCHANT_ID => $merchant_id,
$PlusRecordModel::STORE_ID => $store_id,
$PlusRecordModel::VIP_ID => $vip_info[$VipModel::ID],
$PlusRecordModel::XCX_UID => $s_user ? $s_user[$RetailSmallProgramUser::ID] : 0,
$PlusRecordModel::MONEY => $pay_order[$PayOrderModel::TRADE_AMOUNT],
$PlusRecordModel::PAY_STATE => 1,
$PlusRecordModel::PAY_TYPE => $pay_order[$PayOrderModel::PAY_TYPE],
$PlusRecordModel::TYPE => 4,
$PlusRecordModel::ADD_TIME => time(),
$PlusRecordModel::TIME => $plus_time,
);
$add_result = $PlusRecordModel->addOrder($cr);
if ($add_result) {
$res = array(
'status' => 1,
'msg' => '续费成功'
);
} else {
$res = array(
'status' => 0,
'msg' => '续费记录添加失败'
);
}
return $res;
}
/**
* 充值活动送优惠券(与充值活动绑定)
* @param array $vip_info 会员信息
* @param int $id 优惠券id
* @return array $res
*/
public function rechargeActivityGiveCoupon($vip_info, $id, $merchant_id, $vip_type, $recharge_order_id)
{
// 实例化模型
$retailMCouponModel = D('RetailMCoupon');
$VipModel = D('RetailVip');
$time = time();
// 查询优惠券
$map = array(
$retailMCouponModel::ID => $id,
$retailMCouponModel::MERCHANT_ID => $merchant_id,
$retailMCouponModel::STATUS => 1,
$retailMCouponModel::COUPON_NUM => array('gt', 0),
$retailMCouponModel::TYPE => 1,
'_string' => "(" . $retailMCouponModel::COUPON_TYPE . " = 1 AND " . $retailMCouponModel::START_TIME . " < {$time} AND " . $retailMCouponModel::END_TIME . " > {$time}) OR (" . $retailMCouponModel::COUPON_TYPE . " = 2) OR (" . $retailMCouponModel::COUPON_TYPE . " = 3)"
);
$coupon = $retailMCouponModel->getFind($map);
if (!$coupon) {
$res = array('status' => 0, 'msg' => '该优惠券不可发放');
return $res;
}
// 判断门店(目前门店限制仅限于自助发放与支付发放)
// if ($coupon[$retailMCouponModel::STORE_IDS] != 0) {
// if (!in_array($vip_info[$VipModel::STORE_ID], explode(',', $coupon[$retailMCouponModel::STORE_IDS]))) {
// $res = array('status' => 0, 'msg' => '不满足优惠券发放条件');
// return $res;
// }
// }
// 判断等级(目前充值不限制等级)
// if ($coupon[$retailMCouponModel::COUPON_GRADE_ID] != 0) {
// // plus专属优惠券
// if ($coupon[$retailMCouponModel::COUPON_GRADE_ID] == -1 || $coupon[$retailMCouponModel::COUPON_GRADE_ID] == '-1') { // plus会员专属优惠券
// if ($vip_type != 3) {
// $res = array('status' => 0, 'msg' => '不满足优惠券发放条件');
// return $res;
// }
// } else { // 普通优惠券
// if (!in_array($vip_info['grade_id'], explode(',', $coupon[$retailMCouponModel::COUPON_GRADE_ID]))) {
// $res = array('status' => 0, 'msg' => '不满足优惠券发放条件');
// return $res;
// }
// }
// }
// 优惠券发放
$result = $this->publicGiveCoupon($vip_info[$VipModel::ID], $coupon, $merchant_id, $recharge_order_id);
if ($result['status'] == 0) {
return $result;
}
$XcxUserModel = new RetailSmallProgramUserModel();
$uid = $XcxUserModel->getFindField(['vid' => $vip_info['id']], 'id');
$isVip = $uid ? true : false;
// 发放成功,减库存
$dec_result = $retailMCouponModel->toSetDec(array($retailMCouponModel::ID => $coupon[$retailMCouponModel::ID]), $retailMCouponModel::COUPON_NUM, 1);
if ($isVip) {
$RetailMessageModel = new RetailMessageModel();
$RetailMessageModel->couponSkipAdd($uid, $coupon['id']);
}
if ($dec_result) {
$res = array('status' => 1, 'msg' => '发放成功');
} else {
$res = array('status' => 1, 'msg' => '优惠券减少失败');
}
return $res;
}
/**
* 充值活动送券包优惠券(与充值活动绑定)
* @param array $vip_info 会员信息
* @param int $id 券包id
* @return array $res
*/
public function rechargeActivityGiveCouponGroup($vip_info, $id, $merchant_id, $vip_type, $recharge_order_id)
{
// 实例化模型
$retailMCouponGroupModel = D('RetailMCouponGroup');
$retailMCouponModel = D('RetailMCoupon');
$VipModel = D('RetailVip');
$time = time();
// 券包查询条件
$map = array(
$retailMCouponGroupModel::ID => $id,
$retailMCouponGroupModel::MERCHANT_ID => $merchant_id,
$retailMCouponGroupModel::COUPON_GROUP_NUM => array('gt', 0),
$retailMCouponGroupModel::STATUS => 1
);
// 查询券包
$coupon_group = $retailMCouponGroupModel->getFind($map);
if (!$coupon_group) {
$res = array('status' => 0, 'msg' => '该优惠券券包不可发放');
return $res;
}
// 判断门店(目前门店限制仅限于自助发放与支付发放)
// if ($coupon_group[$retailMCouponGroupModel::STORE_IDS] != 0) {
// if (!in_array($vip_info[$VipModel::STORE_ID], explode(',', $coupon_group[$retailMCouponModel::STORE_IDS]))) {
// $res = array('status' => 0, 'msg' => '不满足优惠券券包发放条件');
// return $res;
// }
// }
// 判断等级(目前充值不限制等级)
// if ($coupon_group[$retailMCouponGroupModel::GRADE_IDS] != 0) {
// if ($coupon_group[$retailMCouponGroupModel::GRADE_IDS] != -1 || $coupon_group[$retailMCouponGroupModel::GRADE_IDS] != '-1') {
// if ($vip_type != 3) {
// $res = array('status' => 0, 'msg' => '不满足优惠券发放条件');
// return $res;
// }
// } else {
// if (!in_array($vip_info['grade_id'], explode(',', $coupon_group[$retailMCouponModel::GRADE_IDS]))) {
// $res = array('status' => 0, 'msg' => '不满足优惠券券包发放条件');
// return $res;
// }
// }
// }
// 优惠券查询条件
$map2 = array(
$retailMCouponModel::MERCHANT_ID => $merchant_id,
$retailMCouponModel::TYPE => 2,
$retailMCouponModel::M_COUPON_GROUP_ID => $coupon_group[$retailMCouponModel::ID],
'_string' => "(" . $retailMCouponModel::COUPON_TYPE . " = 1 AND " . $retailMCouponModel::END_TIME . " > {$time}) OR (" . $retailMCouponModel::COUPON_TYPE . " = 2) OR (" . $retailMCouponModel::COUPON_TYPE . " = 3)"
);
// 查询优惠券
$coupon = $retailMCouponModel->getSelect($map2);
if (!$coupon) {
$res = array('status' => 0, 'msg' => '该券包暂无可发放的优惠券');
return $res;
}
// 小程序uid处理
$XcxUserModel = new RetailSmallProgramUserModel();
$uid = $XcxUserModel->getFindField(['vid' => $vip_info['id']], 'id');
$isVip = $uid ? true : false;
// 发放优惠券
$num = 0;
foreach ($coupon as &$val) {
$result = $this->publicGiveCoupon($vip_info[$VipModel::ID], $val, $merchant_id, $recharge_order_id);
if ($result['status'] == 1) {
$num++;
if ($isVip) {
$RetailMessageModel = new RetailMessageModel();
$RetailMessageModel->couponSkipAdd($uid, $val['id']);
}
}
unset($result);
}
// 判断券包是否有发放
if ($num <= 0) {
$res = array('status' => 0, 'msg' => '券包优惠券发放失败');
return $res;
}
// 券包减库存
$dec_result = $retailMCouponGroupModel->toSetDec(array($retailMCouponGroupModel::ID => $coupon_group[$retailMCouponGroupModel::ID]), $retailMCouponGroupModel::COUPON_GROUP_NUM, 1);
if ($dec_result) {
$res = array('status' => 1, 'msg' => '发放成功');
} else {
$res = array('status' => 1, 'msg' => '优惠券减少失败');
}
return $res;
}
/**
* 发放优惠券(公共方法)
* @param $vip_id 会员id
* @param $coupon 优惠券
* @param $merchant_id 商户ID
* @param int $recharge_order_id 充值记录ID
* @param int $bill_id 订单ID
* @return array
*/
public function publicGiveCoupon($vip_id, $coupon, $merchant_id, $recharge_order_id = 0, $bill_id = 0)
{
// 实例化模型
$retailMCouponModel = D('RetailMCoupon');
$retailVipMCouponModel = D('RetailVipMCoupon');
// 发放优惠券
$cr = array(
$retailVipMCouponModel::VID => $vip_id,
$retailVipMCouponModel::MCOUPON_ID => $coupon[$retailMCouponModel::ID],
$retailVipMCouponModel::MERCHANT_ID => $merchant_id,
$retailVipMCouponModel::NEED_MONEY => $coupon[$retailMCouponModel::NEED_MONEY],
$retailVipMCouponModel::REDUCE_MONEY => $coupon[$retailMCouponModel::REDUCE_MONEY],
$retailVipMCouponModel::CAN_USE_STORE_IDS => $coupon[$retailMCouponModel::STORE_IDS],
$retailVipMCouponModel::RECHARGE_ORDER_ID => $recharge_order_id,
$retailVipMCouponModel::BILL_ID => $bill_id ? $bill_id : 0,
$retailVipMCouponModel::ADD_TIME => time(),
);
// 判断时间类型
if ($coupon[$retailMCouponModel::COUPON_TYPE] == 1) {
$cr[$retailVipMCouponModel::START_TIME] = $coupon[$retailMCouponModel::START_TIME];
$cr[$retailVipMCouponModel::END_TIME] = $coupon[$retailMCouponModel::END_TIME];
} else if ($coupon[$retailMCouponModel::COUPON_TYPE] == 2) {
$cr[$retailVipMCouponModel::START_TIME] = time();
$cr[$retailVipMCouponModel::END_TIME] = strtotime(date('Y-m-d') . ' 23:59:59') + $coupon[$retailMCouponModel::DAY_NUM] * 86400;
} else if ($coupon[$retailMCouponModel::COUPON_TYPE] == 3) {
$cr[$retailVipMCouponModel::START_TIME] = strtotime(date('Y-m-d') . ' 23:59:59') + 1;
$cr[$retailVipMCouponModel::END_TIME] = strtotime(date('Y-m-d') . ' 23:59:59') + ($coupon[$retailMCouponModel::DAY_NUM] + 1) * 86400;
} else {
$res = array('status' => 0, 'mag' => '无效的优惠券,无法发放');
return $res;
}
// 判断是否为券包优惠券
if ($coupon[$retailMCouponModel::TYPE] == 2 && $coupon[$retailMCouponModel::M_COUPON_GROUP_ID]) {
$cr[$retailVipMCouponModel::MCOUPON_GROUP_ID] = $coupon[$retailMCouponModel::M_COUPON_GROUP_ID];
$cr['type'] = 2;
}
// 发放优惠券
$add_result = $retailVipMCouponModel->addOrder($cr);
if (!$add_result) {
$res = array('status' => 0, 'msg' => '优惠券发放失败');
} else {
$res = array('status' => 1, 'msg' => '发放成功');
}
// 查询商户
$retailMerchantModel = new RetailMerchantModel();
$merchant = $retailMerchantModel->getFind(array('id' => $merchant_id));
if ($merchant) {
// 公众号推送
$tips = "尊敬的用户,赠送您一张" . $coupon[$retailMCouponModel::COUPON_NAME];
$remark = $merchant['name'] . '提示:优惠券在' . date('Y-m-d', $cr[$retailVipMCouponModel::START_TIME]) . '到' . date('Y-m-d', $cr[$retailVipMCouponModel::END_TIME]) . '有效期内可以使用';
A('Vip/Mark')->launchcoupon($vip_id, $tips, $remark, $cr);
}
return $res;
}
}