文件
mashangyoujiu/Application/Api/Controller/RewardDealApiController.class.php

479 行
21 KiB
PHP
可执行文件

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

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

<?php
namespace Api\Controller;
use Common\Model\RetailPlugModel;
use Common\Model\RetailRechargeOrderModel;
use Common\Model\RetailRewardRecordModel;
use Common\Model\RewardModel;
use Common\Model\VipModel;
use Think\Controller;
//[1.7.90]
/**
* 红包处理
* Class RewardDealApiController
* @package Api\Controller
*/
class RewardDealApiController extends Controller
{
/**
* 领取红包处理
* @param $item 用户登录的信息(vid uid merchant_id $store_id grade_integral order_id need_money)
* @param $type 活动类型 1公众号通知栏 2线下支付 3小程序商城首页 4商城线上支付
* @return mixed
*/
public function rewardDeal($item, $type)
{
$merchant_id = $item['merchant_id'];
$store_id = $item['store_id'];
$RewardModel = new RewardModel();
$res = $this->rewardCondition($item, $type);//查询是否有可用红包
if ($res['status'] == 1) {
if (empty($item['vid'])) {
return array(
'status' => 0,
'msg' => '请先注册会员'
);
}
$reward = $res['reward'];
$reward_data = array();//更新红包的信息
if (!empty($res['reward_money'])) {
$reward_money = $res['reward_money'];
} else {
$create = $this->randReward($res['randRewardItem'], $reward['reward_type']);//生成红包
if ($reward['reward_type'] == 3) {
//梯度金额
$reward_data['reward_list'] = json_encode($create['reward_list']);
}
$reward_money = $create['rand_money'];
}
// 红包数据表的更新
if ($reward['is_money'] == 1) {
$reward_data['less_money'] = $reward['less_money'] - $reward_money;
}
if ($reward['is_number'] == 1) {
$reward_data['less_number'] = $reward['less_number'] - 1;
}
if ($reward['reward_type'] == 1 || $reward['reward_type'] == 3) {
$reward_data['less_number'] = $reward['less_number'] - 1;
}
$rMap = array(
'id' => $reward['id'],
);
$RewardModel->updateOrder($rMap, $reward_data);
// 会员余额记录
if ($reward['type'] == 1) {
$scene_type = 5;
$remark = '公众号拆红包获得' . $reward_money . '元';
} else if ($reward['type'] == 2) {
$scene_type = 1;
$remark = '线下支付拆红包获得' . $reward_money . '元';
} else if ($reward['type'] == 3) {
$scene_type = 4;
$remark = '小程序拆红包获得' . $reward_money . '元';
} else if ($reward['type'] == 4) {
$scene_type = 4;
$remark = '线上支付拆红包获得' . $reward_money . '元';
}
$RechargeOrderModel = new RetailRechargeOrderModel();
$item1['vid'] = $item['vid'];
$item1['status'] = 1;
$item1['money'] = $reward_money;
$item1['all_money'] = $reward_money;
$item1['scene_type'] = $scene_type;//变动场景 1收银机 2商户后台 3门店后台 4小程序 5公众号 6线上支付
$item1['type'] = 6;//变动类型 1充值 2消费 3编辑增加 4编辑减少 5退款增加 6红包充值 7大转盘充值 8礼品卡充值
$item1['add_time'] = time();
$item1['remark'] = $remark;
$item1['state'] = 1;
$item1['store_id'] = $store_id;
$item1['merchant_id'] = $merchant_id;
$addId = $RechargeOrderModel->addOrder($item1);
if ($addId) {
$item2['money'] = $reward_money;
$item2['vid'] = $item['vid'];
$item2['merchantid'] = $merchant_id;
$item2['storeid'] = $store_id;
$item2['addtime'] = time();
$item2['reward_id'] = $reward['id'];
$item2['recharge_order_id'] = $addId;
$item2['bill_id'] = $item['order_id'];
$RetailRewardRecordModel = new RetailRewardRecordModel();
$RetailRewardRecordModel->addOrder($item2);//添加领取记录
$VipModel = new VipModel();
$VipModel->toSetInc(array('id' => $item['vid']), 'balance', $reward_money);//修改会员余额
$result['status'] = 1;
$result['msg'] = '领取成功';
$result['money'] = $reward_money;
return $result;
} else {
$result['status'] = 0;
$result['msg'] = '领取失败,再试一次';
return $result;
}
} else {
return $res;
}
}
/**
* 红包生成随机数
* @param $data 红包生成条件
* @param $reward_type 红包类型 2随机 3梯度
* @return array
*/
protected function randReward($data, $reward_type)
{
// 随机金额
if ($reward_type == 2) {
// 有金额限制
$less_money = $data['less_money'];
$min_money = $data['min_money'];
$max_money = $data['max_money'];
$money_num_limit = $data['money_num_limit'];
if ($money_num_limit == 1) {
if ($less_money < $max_money) {
for ($i = 0; $i < 10; $i++) {
$rand_num[$i] = rand($min_money * 100, $less_money * 100) / 100;
}
$index = rand(1, 9);
return array('rand_money' => $rand_num[$index]);
} else {
for ($i = 0; $i < 10; $i++) {
$rand_num[$i] = rand($min_money * 100, $max_money * 100) / 100;
}
$index = rand(1, 9);
return array('rand_money' => $rand_num[$index]);
}
// 无金额限制
} else {
for ($i = 0; $i < 10; $i++) {
$rand_num[$i] = rand($min_money * 100, $max_money * 100) / 100;
}
$index = rand(1, 9);
return array('rand_money' => $rand_num[$index]);
}
} else {
// 梯度金额
while (1) {
$reward_type_index = rand(0, count($data) - 1);//随机取一个梯度下标
$less_num = $data[$reward_type_index]['less_num'];
if (isset($data[$reward_type_index]['temp_less_num'])) {
$less_num = $data[$reward_type_index]['temp_less_num'];//优先使用临时数量
}
if ($less_num > 0) {
//还有剩余数量
for ($i = 0; $i < 10; $i++) {
if (!empty($data[$reward_type_index]['temp_max'])) {
//如果有每人每日剩余金额限制
$rand_num[$i] = rand($data[$reward_type_index]['min'] * 100, $data[$reward_type_index]['temp_max'] * 100) / 100;
} else {
$rand_num[$i] = rand($data[$reward_type_index]['min'] * 100, $data[$reward_type_index]['max'] * 100) / 100;
}
}
unset($data[$reward_type_index]['temp_max']);
unset($data[$reward_type_index]['temp_less_num']);
$data[$reward_type_index]['less_num'] = round($data[$reward_type_index]['less_num'] - 1);
$index = rand(1, 9);
$res['rand_money'] = $rand_num[$index];
$res['reward_list'] = $data;
return $res;
}
}
}
}
/**
* 判断是否有可领取的红包 并返回红包信息
* @param $item 用户登录的信息(id merchant_id grade_integral uid store_id order_id need_money)
* @param $type 活动类型 1公众号通知栏 2线下支付 3小程序商城首页 4商城线上支付
* @return array
*/
public function rewardCondition($item, $type)
{
$merchant_id = $item['merchant_id'];
$store_id = $item['store_id'];
$need_money = $item['need_money'];
$PlugModel = new RetailPlugModel();
$plug = $PlugModel->getRewardAccess($merchant_id);//验证红包插件是否可用
if ($plug) {
$RewardModel = new RewardModel();
$RecordModel = new RetailRewardRecordModel();
if (!empty($item['order_id'])) {
$old = $RecordModel->getFind(array('bill_id' => $item['order_id']));
if (!empty($old)) {
return array(
'status' => 0,
'msg' => '该红包已被领取',
);
}
}
$this_time = time();
$rMap = array(
'status' => 1,
'is_del' => 0,
'type' => $type,
'merchant_id' => $merchant_id,
'start_time' => array('elt', $this_time),
'end_time' => array('gt', $this_time),
);
if ($type == 2 || $type == 4) {
$rMap['need_money'] = array('elt', $need_money);//消费金额限制
}
if (!empty($item['uid']) && empty($item['vid'])) {
$rMap['is_vip'] = 0;//不是会员也可以获得机会
}
$reward = $RewardModel->getFind($rMap);//可用红包记录查询
if (empty($reward)) {
$result['status'] = 0;
$result['msg'] = '您来晚了,红包被领完了';
return $result;
}
if ($type != 1) {
// 活动门店限制
if ($reward['is_limit_store'] == 1) {
$arr = explode(',', $reward['limit_store_id']);
if (!in_array($store_id, $arr)) {
$result['status'] = 0;
$result['msg'] = '该门店未参加此活动';
return $result;
}
}
// 会员等级限制
if ($reward['is_class_limit'] == 1) {
$iMap = array(
'in' => array('in', $reward['class_type']),
'merchantid' => $merchant_id,
'min_integral' => array('egt', $item['grade_integral']),
);
$user_grade_id = D('RetailVipIntegral')->getOrderFindField($iMap, 'id', 'min_integral asc');
$arr = explode(',', $reward['class_type']);
if (!in_array($user_grade_id, $arr)) {
$result['status'] = 0;
$result['msg'] = '会员等级不在红包范围内';
return $result;
}
}
}
if (!empty($item['uid']) && empty($item['vid'])) {
return array(
'status' => 1,
'reward' => $reward,
);
}
// 是否有领取次数限制
$cMap = array(
'vid' => $item['vid'],
'reward_id' => $reward['id'],
);
$all_count = $RecordModel->getCount($cMap);//会员领取该红包的总次数
if ($reward['sum_max_time'] > 0 && $all_count >= $reward['sum_max_time']) {
$result['status'] = 0;
$result['msg'] = '您的领取次数已达到上限';
return $result;
}
$start_time = strtotime(date('Y-m-d'));
$end_time = time();
//每日限制
if ($reward['day_restrict_type'] == 1) {
// 限制数量
$cMap['addtime'] = array('between', "$start_time,$end_time");
$day_count = $RecordModel->getCount($cMap);//获取今日已领取数量
if ($day_count >= $reward['day_max_time']) {
$result['status'] = 0;
$result['msg'] = '今天红包领完啦,明天再来吧';
return $result;
}
} else if ($reward['day_restrict_type'] == 2) {
// 限制金额
$cMap['addtime'] = array('between', "$start_time,$end_time");
$day_money = $RecordModel->getSum($cMap, 'money');
if ($day_money >= $reward['day_max_money']) {
$result['status'] = 0;
$result['msg'] = '今天红包领完啦,明天再来吧';
return $result;
}
$temp_money = round($reward['day_max_money'] - $day_money, 2);
if ($reward['reward_type'] == 1) {
//固定金额
if ($temp_money < $reward['fixed_money']) {
$result['status'] = 0;
$result['msg'] = '今天红包领完啦,明天再来吧';
return $result;
}
} else if ($reward['reward_type'] == 2) {
//随机金额
if ($temp_money < $reward['min_money']) {
$result['status'] = 0;
$result['msg'] = '今天红包领完啦,明天再来吧';
return $result;
} else if ($temp_money < $reward['max_money']) {
//随机
$reward['max_money'] = $temp_money;
}
} else {
//梯度
$nub_json = json_decode($reward['reward_list'], true);
$flag = false;
foreach ($nub_json as &$v) {
// 最小金额
if ($v['less_num'] > 0) {
if ($v['min'] <= $temp_money && $v['max'] >= $temp_money) {
$flag = true;
$v['temp_max'] = $temp_money;
} else if ($temp_money > $v['max']) {
$flag = true;
} else {
$v['temp_less_num'] = 0;
}
}
}
if (!$flag) {
$result['status'] = 0;
$result['msg'] = '今天红包领完啦,明天再来吧';
return $result;
}
$reward['reward_list'] = json_encode($nub_json);
}
} else if ($reward['day_restrict_type'] == 0) {
// 不限制领取次数
}
//根据红包类型处理——随机金额
if ($reward['reward_type'] == 2) {
//随机金额
$randRewardItem = array(
'max_money' => $reward['max_money'],
'min_money' => $reward['min_money'],
'less_money' => $reward['less_money'],
);
if ($reward['is_money'] == 1 && $reward['is_number'] == 1) {
// 总金额总数量均有限制///////////////////
if ($reward['less_money'] < $reward['min_money']) {
// 金额用完
$RewardModel->updateOrder($rMap, ['status' => 0]);
$result['status'] = 0;
$result['msg'] = '这次的红包领完啦,下次再来吧';
return $result;
} else if ($reward['less_number'] < 1) {
// 数量用完
$RewardModel->updateOrder($rMap, ['status' => 0]);
$result['status'] = 0;
$result['msg'] = '这次的红包领完啦,下次再来吧';
return $result;
} else {
// 金额数量未用完
// 调用红包生成随机方法
$randRewardItem['money_num_limit'] = 1;
}
} else if ($reward['is_money'] == 1) {
// 总金额限制/////////////////////////
if ($reward['less_money'] < $reward['min_money']) {
$RewardModel->updateOrder($rMap, ['status' => 0]);
$result['status'] = 0;
$result['msg'] = '这次的红包领完啦,下次再来吧';
return $result;
} else {
// 调用红包生成随机方法
$randRewardItem['money_num_limit'] = 1;
}
} else if ($reward['is_number'] == 1) {
// 总数量限制///////////////////////////
// 数量用完
if ($reward['less_number'] < 1) {
$RewardModel->updateOrder($rMap, ['status' => 0]);
$result['status'] = 0;
$result['msg'] = '这次的红包领完啦,下次再来吧';
return $result;
} else {
// 调用红包生成随机方法
$randRewardItem['money_num_limit'] = 0;
}
} else {
// 总金额总数量无限制///////////////////////
// 调用红包生成随机方法
$randRewardItem['money_num_limit'] = 0;
}
return array(
'status' => 1,
'reward' => $reward,
'randRewardItem' => $randRewardItem,
);
} else if ($reward['reward_type'] == 3) {
//梯度金额
$nub_json = json_decode($reward['reward_list'], true);
if ($reward['is_money'] == 1) {
// 有总金额限制
// 找出最小值中的最小值;最大值中的最大值
$tempMin = array();
$tempMax = array();
foreach ($nub_json as $val) {
// 最小金额
$tempMin[] = $val['min'];
$tempMax[] = $val['temp_max'] ? $val['temp_max'] : $val['max'];
}
$smallMin = min($tempMin);
$bigMax = max($tempMax);
if ($reward['less_money'] < $smallMin || $reward['less_number'] < 1) {
$RewardModel->updateOrder($rMap, ['status' => 0]);
$result['status'] = 0;
$result['msg'] = '这次的红包领完啦,下次再来吧';
return $result;
} else if ($reward['less_money'] < $bigMax) {
// 红包金额
return array(
'status' => 1,
'reward' => $reward,
'reward_money' => $reward['less_money'],
);
} else {
// 调用红包生成随机方法——红包金额
return array(
'status' => 1,
'reward' => $reward,
'randRewardItem' => $nub_json,
);
}
} else {
// 无总金额限制
if ($reward['less_number'] < 1) {
$RewardModel->updateOrder($rMap, ['status' => 0]);
$result['status'] = 0;
$result['msg'] = '这次的红包领完啦,下次再来吧';
return $result;
}
return array(
'status' => 1,
'reward' => $reward,
'randRewardItem' => $nub_json,
);
}
} else {
// 固定金额
if ($reward['less_number'] < 1) {
$RewardModel->updateOrder($rMap, ['status' => 0]);
$result['status'] = 0;
$result['msg'] = '这次的红包领完啦,下次再来吧';
return $result;
} else {
// 红包金额
return array(
'status' => 1,
'reward' => $reward,
'reward_money' => $reward['fixed_money'],
);
}
}
} else {
$result['status'] = 0;
$result['msg'] = '红包不可用';
return $result;
}
}
}