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; } } }