479 行
21 KiB
PHP
可执行文件
479 行
21 KiB
PHP
可执行文件
<?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;
|
||
}
|
||
}
|
||
} |