www.lightcourse.com/app/common/model/Voucher.php

741 lines
26 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\common\model;
use think\facade\Db;
/**
* ============================================================================
* 联课教育商城系统
* ============================================================================
* 版权所有 2022 刻羽互动科技有限公司,并保留所有权利。
* 网站地址: http://www.o1h.cn
* ----------------------------------------------------------------------------
* 这不是一个自由软件!您只能在不用于商业目的的前提下对程序代码进行修改和使用 .
* 不允许对程序代码以任何形式任何目的的再发布。
* ============================================================================
* 数据层模型
*/
class Voucher extends BaseModel
{
const VOUCHER_STATE_UNUSED = 1;
const VOUCHER_STATE_USED = 2;
const VOUCHER_STATE_EXPIRE = 3;
public $page_info;
private $voucher_state_array = array(
self::VOUCHER_STATE_UNUSED => '未使用', self::VOUCHER_STATE_USED => '已使用', self::VOUCHER_STATE_EXPIRE => '已过期',
);
const VOUCHER_GETTYPE_DEFAULT = 'points'; //默认领取方式
private $voucher_gettype_array = array(
'points' => array('sign' => 1, 'name' => '积分兑换'),
'pwd' => array('sign' => 2, 'name' => '卡密兑换'),
'free' => array('sign' => 3, 'name' => '免费领取')
);
private $templatestate_arr;
/**
* 构造函数
* @access public
* @author o1h.cn
*/
public function __construct()
{
parent::__construct();
//代金券模板状态
$this->templatestate_arr = array('usable' => array(1, '有效'), 'disabled' => array(2, '失效'));
}
/**
* 获取代金券模板状态
* @access public
* @author o1h.cn
* @return type
*/
public function getTemplateState()
{
return $this->templatestate_arr;
}
/**
* 领取的代金券状态
* @access public
* @author o1h.cn
* @return type
*/
public function getVoucherState()
{
return array(
'unused' => array(1, lang('voucher_voucher_state_unused')),
'used' => array(2, lang('voucher_voucher_state_used')),
'expire' => array(3, lang('voucher_voucher_state_expire'))
);
}
/**
* 返回当前可用的代金券列表,每种类型(模板)的代金券里取出一个代金券码(同一个模板所有码面额和到期时间都一样)
* @access public
* @author o1h.cn
* @param array $condition 条件
* @param int $goods_total 商品总金额
* @return string
*/
public function getCurrentAvailableVoucher($condition = array(), $goods_total = 0)
{
$condition[]=array('voucher_enddate','>', TIMESTAMP);
$condition[]=array('voucher_state','=',1);
$voucher_list = Db::name('voucher')->where($condition)->select()->toArray();
if(!empty($voucher_list)){
$voucher_list = ds_change_arraykey($voucher_list,'vouchertemplate_id');
}
foreach ($voucher_list as $key => $voucher) {
if ($goods_total < $voucher['voucher_limit']) {
unset($voucher_list[$key]);
}
else {
$voucher_list[$key]['desc'] = sprintf('面额%s元 有效期至 %s ', $voucher['voucher_price'], date('Y-m-d', $voucher['voucher_enddate']));
if ($voucher['voucher_limit'] > 0) {
$voucher_list[$key]['desc'] .= sprintf(' 消费满%s可用', $voucher['voucher_limit']);
}
}
}
return $voucher_list;
}
/**
* 取得当前有效代金券数量
* @access public
* @author o1h.cn
* @param type $member_id 会员ID
* @return type
*/
public function getCurrentAvailableVoucherCount($member_id)
{
$info = rcache($member_id, 'm_voucher');
if (empty($info)) {
$condition[]=array('voucher_owner_id','=',$member_id);
$condition[]=array('voucher_enddate','>', TIMESTAMP);
$condition[]=array('voucher_state','=',1);
$voucher_count = Db::name('voucher')->where($condition)->count();
$voucher_count = intval($voucher_count);
wcache($member_id, array('voucher_count' => $voucher_count), 'm_voucher');
}
else {
$voucher_count = intval($info['voucher_count']);
}
return $voucher_count;
}
/**
* 获得代金券列表
* @access public
* @author o1h.cn
* @param type $where 条件
* @param type $field 字段
* @return type
*/
public function getVoucherList($where, $field = '*')
{
$voucher_list = Db::name('voucher')->field($field)->where($where)->select()->toArray();
return $voucher_list;
}
/**
* 获取失效代金卷列表
* @access public
* @author o1h.cn
* @param array $where 条件
* @param type $field 字段
* @return type
*/
public function getVoucherUnusedList($where, $field = '*')
{
$where[]=array('voucher_state','=',1);
return $this->getVoucherList($where, $field);
}
/**
* 查询可兑换代金券模板详细信息,包括店铺信息
* @access public
* @author o1h.cn
* @param type $vid
* @param type $member_id 会员id
* @return type
*/
public function getCanChangeTemplateInfo($vid, $member_id,$no_point=false)
{
if ($vid <= 0 || $member_id <= 0) {
return array('state' => false, 'msg' => '参数错误');
}
//查询可用代金券模板
$where = array();
$where[]=array('vouchertemplate_id','=',$vid);
$where[]=array('vouchertemplate_state','=',$this->templatestate_arr['usable'][0]);
$where[]=array('vouchertemplate_enddate','>', TIMESTAMP);
$template_info = $this->getVouchertemplateInfo($where);
if (empty($template_info) || $template_info['vouchertemplate_total'] <= $template_info['vouchertemplate_giveout']) {//代金券不存在或者已兑换完
return array('state' => false, 'msg' => '代金券已兑换完');
}
$member_model = model('member');
$member_info = $member_model->getMemberInfoByID($member_id);
if (empty($member_info)) {
return array('state' => false, 'msg' => '参数错误');
}
if(!$no_point){
//验证会员积分是否足够
if ($template_info['vouchertemplate_gettype'] == $this->voucher_gettype_array['points']['sign'] && $template_info['vouchertemplate_points'] > 0) {
if (intval($member_info['member_points']) < intval($template_info['vouchertemplate_points'])) {
return array('state' => false, 'msg' => '您的积分不足,暂时不能兑换该代金券');
}
}
}
//验证会员级别
/*
$member_currgrade = $member_model->getOneMemberGrade(intval($member_info['member_exppoints']));
$member_info['member_currgrade'] = $member_currgrade ? $member_currgrade['level'] : 0;
if ($member_info['member_currgrade'] < intval($template_info['vouchertemplate_mgradelimit'])) {
return array('state' => false, 'msg' => '您的会员级别不够,暂时不能兑换该代金券');
}
*/
//查询代金券列表
$where = array();
$where[] = array('voucher_owner_id','=',$member_id);
$voucher_list = $this->getVoucherList($where);
if (!empty($voucher_list)) {
if(!$no_point){
$voucher_count = 0; //在该店铺兑换的代金券数量
$voucherone_count = 0; //该张代金券兑换的数量
foreach ($voucher_list as $k => $v) {
//如果代金券未用且未过期
if ($v['voucher_state'] == 1 && $v['voucher_enddate'] > TIMESTAMP) {
$voucher_count += 1;
}
if ($v['vouchertemplate_id'] == $template_info['vouchertemplate_id']) {
$voucherone_count += 1;
}
}
//同一张代金券最多能兑换的次数
if (!empty($template_info['vouchertemplate_eachlimit']) && $voucherone_count >= $template_info['vouchertemplate_eachlimit']) {
$message = sprintf('该代金券您已兑换%s次不可再兑换了', $template_info['vouchertemplate_eachlimit']);
return array('state' => false, 'msg' => $message);
}
}
}
return array('state' => true, 'info' => $template_info);
}
/**
* 获取代金券编码
* @access public
* @author o1h.cn
* @staticvar int $num
* @param type $member_id 会员id
* @return type
*/
public function getVoucherCode($member_id = 0)
{
static $num = 1;
$sign_arr = array();
$sign_arr[] = sprintf('%02d', mt_rand(10, 99));
$sign_arr[] = sprintf('%03d', (float)microtime() * 1000);
$sign_arr[] = sprintf('%010d', TIMESTAMP - 946656000);
if ($member_id) {
$sign_arr[] = sprintf('%03d', (int)$member_id % 1000);
}
else {
//自增变量
$tmpnum = 0;
if ($num > 99) {
$tmpnum = substr($num, -1, 2);
}
else {
$tmpnum = $num;
}
$sign_arr[] = sprintf('%02d', $tmpnum);
$sign_arr[] = mt_rand(1, 9);
}
$code = implode('', $sign_arr);
$num += 1;
return $code;
}
/**
* 生成代金券卡密
* @staticvar int $num
* @param type $vouchertemplate_id 卡密ID编号
* @return boolean|array
*/
public function createVoucherPwd($vouchertemplate_id)
{
if ($vouchertemplate_id <= 0) {
return false;
}
static $num = 1;
$sign_arr = array();
//时间戳
$time_tmp = uniqid('', true);
$time_tmp = explode('.', $time_tmp);
$sign_arr[] = substr($time_tmp[0], -1, 4) . $time_tmp[1];
//自增变量
$tmpnum = 0;
if ($num > 999) {
$tmpnum = substr($num, -1, 3);
}
else {
$tmpnum = $num;
}
$sign_arr[] = sprintf('%03d', $tmpnum);
//代金券模板ID
if ($vouchertemplate_id > 9999) {
$vouchertemplate_id = substr($num, -1, 4);
}
$sign_arr[] = sprintf('%04d', $vouchertemplate_id);
//随机数
$sign_arr[] = sprintf('%04d', rand(1, 9999));
$pwd = implode('', $sign_arr);
$num += 1;
return array(md5($pwd), ds_encrypt($pwd));
}
/**
* 生成代金券卡密
* @access public
* @author o1h.cn
* @param type $pwd 卡密
* @return string
*/
public function getVoucherPwd($pwd)
{
if (!$pwd) {
return '';
}
$pwd = ds_decrypt($pwd);
$pattern = "/^([0-9]{20})$/i";
if (preg_match($pattern, $pwd)) {
return $pwd;
}
else {
return '';
}
}
/**
* 更新代金券信息
* @param type $data 数据
* @param type $condition 条件
* @param type $member_id 会员id
* @return type
*/
public function editVoucher($data, $condition, $member_id = 0)
{
$result = Db::name('voucher')->where($condition)->update($data);
if ($result && $member_id > 0) {
wcache($member_id, array('voucher_count' => null), 'm_voucher');
}
return $result;
}
/**
* 返回代金券状态数组
* @access public
* @author o1h.cn
* @return array
*/
public function getVoucherStateArray()
{
return $this->voucher_state_array;
}
/**
* 返回代金券领取方式数组
* @access public
* @author o1h.cn
* @return array
*/
public function getVoucherGettypeArray()
{
return $this->voucher_gettype_array;
}
/**
* 获取买家代金券列表
* @access public
* @author o1h.cn
* @param int $member_id 用户编号
* @param int $voucher_state 代金券状态
* @param int $pagesize 分页数
* @return array
*/
public function getMemberVoucherList($member_id, $voucher_state, $pagesize = null)
{
if (empty($member_id)) {
return false;
}
//更新过期代金券状态
$this->_checkVoucherExpire($member_id);
$where = array();
$where[] = array('voucher_owner_id','=',$member_id);
$voucher_state = intval($voucher_state);
if (intval($voucher_state) > 0 && array_key_exists($voucher_state, $this->voucher_state_array)) {
$where[] = array('voucher_state','=',$voucher_state);
}
if($pagesize){
$list = Db::name('voucher')->alias('v')->join('vouchertemplate t','v.vouchertemplate_id=t.vouchertemplate_id')->where($where)->order('voucher_id desc')->paginate(['list_rows'=>$pagesize,'query' => request()->param()],false);
$this->page_info=$list;
$list=$list->items();
}else{
$list=Db::name('voucher')->alias('v')->join('vouchertemplate t','v.vouchertemplate_id=t.vouchertemplate_id')->where($where)->order('voucher_id desc')->select()->toArray();
}
if (!empty($list) && is_array($list)) {
foreach ($list as $key => $val) {
//代金券图片
if (empty($val['vouchertemplate_customimg'])) {
$list[$key]['vouchertemplate_customimg'] = ds_get_pic(ATTACH_COMMON,config('ds_config.default_goods_image'));
}
else {
$list[$key]['vouchertemplate_customimg'] = ds_get_pic( ATTACH_VOUCHER ,$val['vouchertemplate_customimg']);
}
//代金券状态文字
$list[$key]['voucher_state_text'] = $this->voucher_state_array[$val['voucher_state']];
$list[$key]['voucher_end_date_text'] = $val['voucher_enddate'] ? @date('Y.m.d', $val['voucher_enddate']) : '';
}
}
return $list;
}
/**
* 更新过期代金券状态
* @access public
* @author o1h.cn
* @param type $member_id 会员ID
* @return type
*/
private function _checkVoucherExpire($member_id)
{
$condition = array();
$condition[]=array('voucher_owner_id','=',$member_id);
$condition[]=array('voucher_state','=',self::VOUCHER_STATE_UNUSED);
$condition[]=array('voucher_enddate','<', TIMESTAMP);
Db::name('voucher')->where($condition)->update(array('voucher_state' => self::VOUCHER_STATE_EXPIRE));
}
/**
* 查询代金券模板列表
* @access public
* @author o1h.cn
* @param type $where 条件
* @param type $field 字段
* @param type $limit 限制
* @param type $pagesize 分页
* @param type $order 排序
* @return type
*/
public function getVouchertemplateList($where, $field = '*', $limit = 0, $pagesize = 0, $order = '')
{
$voucher_list = array();
if ($pagesize) {
$result = Db::name('vouchertemplate')->field($field)->where($where)->order($order)->paginate(['list_rows'=>10,'query' => request()->param()],false);
$voucher_list = $result->items();
$this->page_info = $result;
} else {
$voucher_list = Db::name('vouchertemplate')->field($field)->where($where)->limit($limit)->order($order)->select()->toArray();
}
if (!empty($voucher_list) && is_array($voucher_list)) {
foreach ($voucher_list as $k => $v) {
if (!empty($v['vouchertemplate_customimg'])) {
$v['vouchertemplate_customimg'] = ds_get_pic( ATTACH_VOUCHER , $v['vouchertemplate_customimg']);
}
else {
$v['vouchertemplate_customimg'] = ds_get_pic(ATTACH_COMMON,config('ds_config.default_goods_image'));
}
//领取方式
if ($v['vouchertemplate_gettype']) {
foreach ($this->voucher_gettype_array as $gtype_k => $gtype_v) {
if ($v['vouchertemplate_gettype'] == $gtype_v['sign']) {
$v['vouchertemplate_gettype_key'] = $gtype_k;
$v['vouchertemplate_gettype_text'] = $gtype_v['name'];
}
}
}
//状态
if ($v['vouchertemplate_state']) {
foreach ($this->templatestate_arr as $tstate_k => $tstate_v) {
if ($v['vouchertemplate_state'] == $tstate_v[0]) {
$v['vouchertemplate_state_text'] = $tstate_v[1];
}
}
}
//会员级别
/*
$member_grade = model('member')->getMemberGradeArr();
$v['vouchertemplate_mgradelimittext'] = isset($v['vouchertemplate_mgradelimit']) ? $member_grade[$v['vouchertemplate_mgradelimit']]['level_name'] : '';
*/
$voucher_list[$k] = $v;
}
}
return $voucher_list;
}
/**
* 更新代金券模板信息
* @access public
* @author o1h.cn
* @param type $where 条件
* @param type $data 数据
* @return type
*/
public function editVouchertemplate($where, $data)
{
return Db::name('vouchertemplate')->where($where)->update($data);
}
/**
* 获得推荐的热门代金券列表
* @access public
* @author o1h.cn
* @param int $num 查询条数
* @return array
*/
public function getRecommendTemplate($num)
{
//查询推荐的热门代金券列表
$where = array();
$where[] = array('vouchertemplate_recommend','=',1);
$where[]=array('vouchertemplate_state','=',$this->templatestate_arr['usable'][0]);
//领取方式为积分兑换
$where[]=array('vouchertemplate_gettype','=',$this->voucher_gettype_array['points']['sign']);
$where[]=array('vouchertemplate_enddate','>', TIMESTAMP);
$recommend_voucher = $this->getVouchertemplateList($where, $field = '*', $num, 0, 'vouchertemplate_recommend desc,vouchertemplate_id desc');
return $recommend_voucher;
}
/**
* 积分兑换代金券
* @access public
* @author o1h.cn
* @param type $template_info 信息模板
* @param type $member_id 会员ID
* @param type $member_name 会员名
* @return type
*/
public function exchangeVoucher($template_info, $member_id, $member_name = '',$no_point=false)
{
if (intval($member_id) <= 0 || empty($template_info)) {
return array('state' => false, 'msg' => '参数错误');
}
//查询会员信息
if (!$member_name) {
$member_info = model('member')->getMemberInfoByID($member_id);
if (empty($template_info)) {
return array('state' => false, 'msg' => '参数错误');
}
$member_name = $member_info['member_name'];
}
//添加代金券信息
$insert_arr = array();
$insert_arr['voucher_code'] = $this->getVoucherCode($member_id);
$insert_arr['vouchertemplate_id'] = $template_info['vouchertemplate_id'];
$insert_arr['voucher_title'] = $template_info['vouchertemplate_title'];
$insert_arr['voucher_desc'] = $template_info['vouchertemplate_desc'];
$insert_arr['voucher_startdate'] = TIMESTAMP;
$insert_arr['voucher_enddate'] = $template_info['vouchertemplate_enddate'];
$insert_arr['voucher_price'] = $template_info['vouchertemplate_price'];
$insert_arr['voucher_limit'] = $template_info['vouchertemplate_limit'];
$insert_arr['voucher_state'] = 1;
$insert_arr['voucher_activedate'] = TIMESTAMP;
$insert_arr['voucher_owner_id'] = $member_id;
$insert_arr['voucher_owner_name'] = $member_name;
$result = Db::name('voucher')->insertGetId($insert_arr);
if (!$result) {
return array('state' => false, 'msg' => '兑换失败');
}
if(!$no_point){
//扣除会员积分
if ($template_info['vouchertemplate_points'] > 0 && $template_info['vouchertemplate_gettype'] == $this->voucher_gettype_array['points']['sign']) {
$points_arr['pl_memberid'] = $member_id;
$points_arr['pl_membername'] = $member_name;
$points_arr['pl_points'] = -$template_info['vouchertemplate_points'];
$points_arr['point_ordersn'] = $insert_arr['voucher_code'];
$points_arr['pl_desc'] = lang('home_voucher') . $insert_arr['voucher_code'] . '消耗积分';
$result = model('points')->savePointslog('app', $points_arr, true);
if (!$result) {
return array('state' => false, 'msg' => '兑换失败');
}
}
}
if ($result) {
//代金券模板的兑换数增加
$result = $this->editVouchertemplate(array('vouchertemplate_id' => $template_info['vouchertemplate_id']), array(
'vouchertemplate_giveout' => Db::raw('vouchertemplate_giveout+1')
));
if (!$result) {
return array('state' => false, 'msg' => '兑换失败');
}
wcache($member_id, array('voucher_count' => Db::raw('voucher_count+1')), 'm_voucher');
return array('state' => true, 'msg' => '兑换成功');
}
else {
return array('state' => false, 'msg' => '兑换失败');
}
}
/**
* 批量增加代金券
* @access public
* @author o1h.cn
* @param type $insert_arr 参数数据
* @return type
*/
public function addVoucherBatch($insert_arr)
{
return Db::name('voucher')->insertAll($insert_arr);
}
/**
* 获得代金券模板总数量
* @access public
* @author o1h.cn
* @param type $where 条件
* @return int
*/
public function getVouchertemplateCount($where)
{
return Db::name('vouchertemplate')->where($where)->count();
}
/**
* 获得代金券总数量
* @access public
* @author o1h.cn
* @param type $where 条件
* @return int
*/
public function getVoucherCount($where)
{
return Db::name('voucher')->where($where)->count();
}
/**
* 获得代金券模板详情
* @access public
* @author o1h.cn
* @param type $where 条件
* @param type $field 字段
* @param type $order 排序
* @return array
*/
public function getVouchertemplateInfo($where = array(), $field = '*', $order = '')
{
$info = Db::name('vouchertemplate')->where($where)->field($field)->order($order)->find();
if (!$info) {
return array();
}
if ($info['vouchertemplate_gettype']) {
foreach ($this->voucher_gettype_array as $k => $v) {
if ($info['vouchertemplate_gettype'] == $v['sign']) {
$info['vouchertemplate_gettype_key'] = $k;
$info['vouchertemplate_gettype_text'] = $v['name'];
}
}
}
if ($info['vouchertemplate_state']) {
foreach ($this->templatestate_arr as $k => $v) {
if ($info['vouchertemplate_state'] == $v[0]) {
$info['vouchertemplate_state_text'] = $v[1];
}
}
}
if (!empty($info['vouchertemplate_customimg'])) {
$info['vouchertemplate_customimg'] = ds_get_pic( ATTACH_VOUCHER , $info['vouchertemplate_customimg']);
}
else {
$info['vouchertemplate_customimg'] = ds_get_pic(ATTACH_COMMON,config('ds_config.default_goods_image'));
}
//会员等级
/*
$member_grade = model('member')->getMemberGradeArr();
$info['vouchertemplate_mgradelimittext'] = isset($info['vouchertemplate_mgradelimit'])?$member_grade[$info['vouchertemplate_mgradelimit']]['level_name']:'';
*/
return $info;
}
/**
* 获得代金券详情
* @access public
* @author o1h.cn
* @param type $where 条件
* @param type $field 字段
* @param type $order 排序
* @return type
*/
public function getVoucherInfo($where = array(), $field = '*', $order = '')
{
$info = Db::name('voucher')->where($where)->field($field)->order($order)->find();
if ($info['voucher_state']) {
$info['voucher_state_text'] = $this->voucher_state_array[$info['voucher_state']];
}
return $info;
}
/**
* 更新使用的代金券状态
* @param $input_voucher_list
* @throws Exception
*/
public function editVoucherState($voucher_list)
{
$send = new \sendmsg\sendMemberMsg();
$update = $this->editVoucher(array('voucher_state' => 2), array('voucher_id' => $voucher_list['voucher_id']), $voucher_list['voucher_owner_id']);
if ($update) {
// 发送用户店铺消息
$send->set('member_id', $voucher_list['voucher_owner_id']);
$send->set('code', 'voucher_use');
$ali_param = array();
$ali_param['voucher_code'] = $voucher_list['voucher_code'];
$ten_param=array($voucher_list['voucher_code']);
$param=$ali_param;
$param['voucher_url'] = HOME_SITE_URL .'/Membervoucher/index';
$weixin_param = array(
'url' => config('ds_config.h5_site_url').'/member/voucher_list',
'data'=>array(
"keyword1" => array(
"value" => $voucher_list['voucher_code'],
"color" => "#333"
),
"keyword2" => array(
"value" => date('Y-m-d H:i'),
"color" => "#333"
)
),
);
$send->send($param,$weixin_param,$ten_param);
}
else {
return ds_callback(false, '更新代金券状态失败vcode:' . $voucher_list['voucher_code']);
}
return ds_callback(true);
}
}
?>