454 lines
18 KiB
PHP
454 lines
18 KiB
PHP
<?php
|
||
// +----------------------------------------------------------------------
|
||
// | likeshop开源商城系统
|
||
// +----------------------------------------------------------------------
|
||
// | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
|
||
// | gitee下载:https://gitee.com/likeshop_gitee
|
||
// | github下载:https://github.com/likeshop-github
|
||
// | 访问官网:https://www.likeshop.cn
|
||
// | 访问社区:https://home.likeshop.cn
|
||
// | 访问手册:http://doc.likeshop.cn
|
||
// | 微信公众号:likeshop技术社区
|
||
// | likeshop系列产品在gitee、github等公开渠道开源版本可免费商用,未经许可不能去除前后端官方版权标识
|
||
// | likeshop系列产品收费版本务必购买商业授权,购买去版权授权后,方可去除前后端官方版权标识
|
||
// | 禁止对系统程序代码以任何目的,任何形式的再发布
|
||
// | likeshop团队版权所有并拥有最终解释权
|
||
// +----------------------------------------------------------------------
|
||
// | author: likeshop.cn.team
|
||
// +----------------------------------------------------------------------
|
||
namespace app\shop\logic\coupon;
|
||
|
||
use app\common\model\user\User;
|
||
use app\common\server\UrlServer;
|
||
use app\common\basics\Logic;
|
||
use think\facade\Db;
|
||
use app\common\model\coupon\Coupon;
|
||
use app\common\model\coupon\CouponGoods;
|
||
use app\common\model\coupon\CouponList;
|
||
use app\common\model\user\UserLevel;
|
||
|
||
|
||
class CouponLogic extends Logic{
|
||
public static function lists($get){
|
||
// 下架本店过了发放时间的优惠券
|
||
$now = time();
|
||
$updateWhere = [
|
||
['send_time_start','<',$now],
|
||
['send_time_end','<',$now],
|
||
['status','=',1],
|
||
['shop_id', '=', $get['shop_id']]
|
||
];
|
||
Coupon::where($updateWhere)
|
||
->update(['status'=>0,'update_time'=>$now]);
|
||
|
||
$where = [
|
||
['del','=',0],
|
||
['shop_id','=', $get['shop_id']]
|
||
];
|
||
|
||
if(empty($get['type'])) {
|
||
// 已下架
|
||
$where[] = ['status', '=', '0'];
|
||
}else{
|
||
$where[] = ['status', '=', '1'];
|
||
}
|
||
|
||
// 名称
|
||
if(isset($get['name']) && !empty($get['name'])) {
|
||
$where[] = ['name', 'like', '%'.trim($get['name']).'%' ];
|
||
}
|
||
|
||
// 领取方式
|
||
if(isset($get['get_type']) && !empty($get['get_type'])) {
|
||
$where[] = ['get_type', '=', $get['get_type'] ];
|
||
}
|
||
|
||
// 创建时间
|
||
if(isset($get['start_time']) && !empty($get['start_time'])) {
|
||
$where[] = ['create_time', '>=', strtotime($get['start_time']) ];
|
||
}
|
||
|
||
if(isset($get['end_time']) && !empty($get['end_time'])) {
|
||
$where[] = ['create_time', '<=', strtotime($get['end_time']) ];
|
||
}
|
||
|
||
$coupon_count = Coupon::where($where)->count();
|
||
|
||
$coupon_list = Coupon::field('id,name,money,use_goods_type,use_goods_type as use_goods_type_desc,condition_type,condition_money,condition_type as condition_type_desc,send_total_type,send_total_type as send_total_type_desc,send_total,get_type,get_type as get_type_desc,status,status as statusDesc,send_time_start,send_time_end,send_time_start as send_time,use_time_type,use_time_start,use_time_end,use_time,use_time_type as use_time_desc,create_time')
|
||
->where($where)
|
||
->page($get['page'], $get['limit'])
|
||
->order('id desc')
|
||
->select()
|
||
->toArray();
|
||
|
||
return ['count' => $coupon_count, 'list' => $coupon_list];
|
||
|
||
}
|
||
|
||
//新增优惠券
|
||
public static function add($post){
|
||
$time = time();
|
||
//拼接数据
|
||
$add_data = [
|
||
'shop_id' => $post['shop_id'],
|
||
'name' => trim($post['name']),
|
||
'money' => $post['money'],
|
||
'send_time_start' => strtotime($post['send_time_start']),
|
||
'send_time_end' => strtotime($post['send_time_end']),
|
||
'send_total_type' => $post['send_total_type'],
|
||
'send_total' => $post['send_total_type'] == 2 ? $post['send_total'] : '',
|
||
'condition_type' => $post['condition_type'],
|
||
'condition_money' => $post['condition_type'] == 2 ? $post['condition_money'] : '',
|
||
'use_time_type' => $post['use_time_type'],
|
||
'use_time_start' => $post['use_time_type'] == 1 ? strtotime($post['use_time_start']) : '',
|
||
'use_time_end' => $post['use_time_type'] == 1 ? strtotime($post['use_time_end']) : '',
|
||
'use_time' => $post['use_time_type'] == 2 ? $post['use_time'] : '',
|
||
'get_type' => $post['get_type'],
|
||
'get_num_type' => $post['get_num_type'],
|
||
'get_num' => $post['get_num'],
|
||
'use_goods_type' => $post['use_goods_type'],
|
||
'status' => $post['status'],
|
||
'create_time' => $time,
|
||
'update_time' => $time,
|
||
];
|
||
//用券时间
|
||
if($post['use_time_type'] == 3){
|
||
$update_data['use_time'] = $post['tomorrow_use_time'];
|
||
}
|
||
//领取次数
|
||
if($post['get_num_type'] == 3){
|
||
$update_data['get_num'] = $post['day_get_num'];
|
||
}
|
||
|
||
//提交订单
|
||
Db::startTrans();
|
||
try {
|
||
$coupon = Coupon::create($add_data);
|
||
if($coupon && $coupon['use_goods_type'] != 1){
|
||
$goods_coupon = [];
|
||
$now = time();
|
||
foreach ($post['goods_ids'] as $item){
|
||
$goods_coupon[] = [
|
||
'coupon_id' => $coupon->id,
|
||
'goods_id' => $item,
|
||
'create_time' => $now,
|
||
];
|
||
}
|
||
$couponGoods = new CouponGoods();
|
||
$couponGoods->saveAll($goods_coupon);
|
||
}
|
||
Db::commit();
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
Db::rollback();
|
||
self::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
|
||
}
|
||
public static function edit($post){
|
||
//拼接数据
|
||
$update_data = [
|
||
'shop_id' => $post['shop_id'],
|
||
'name' => $post['name'],
|
||
'money' => $post['money'],
|
||
'send_time_start' => strtotime($post['send_time_start']),
|
||
'send_time_end' => strtotime($post['send_time_end']),
|
||
'send_total_type' => $post['send_total_type'],
|
||
'send_total' => $post['send_total_type'] == 2 ? $post['send_total'] : '',
|
||
'condition_type' => $post['condition_type'],
|
||
'condition_money' => $post['condition_type'] == 2 ? $post['condition_money'] : '',
|
||
'use_time_type' => $post['use_time_type'],
|
||
'use_time_start' => $post['use_time_type'] == 1 ? strtotime($post['use_time_start']) : '',
|
||
'use_time_end' => $post['use_time_type'] == 1 ? strtotime($post['use_time_end']) : '',
|
||
'use_time' => $post['use_time_type'] == 2 ? $post['use_time'] : '',
|
||
'get_type' => $post['get_type'],
|
||
'get_num_type' => $post['get_num_type'],
|
||
'get_num' => $post['get_num_type'] == 2 ? $post['get_num'] : '',
|
||
'use_goods_type' => $post['use_goods_type'],
|
||
'status' => $post['status'],
|
||
'update_time' => time()
|
||
];
|
||
//用券时间
|
||
if($post['use_time_type'] == 3){
|
||
$update_data['use_time'] = $post['tomorrow_use_time'];
|
||
}
|
||
//领取次数
|
||
if($post['get_num_type'] == 3){
|
||
$update_data['get_num'] = $post['day_get_num'];
|
||
}
|
||
|
||
Db::startTrans();
|
||
try {
|
||
$coupon = Coupon::update($update_data,['id'=>$post['id']]);
|
||
CouponGoods::where(['coupon_id'=>$post['id']])->delete();
|
||
|
||
if($coupon && $coupon['use_goods_type'] != 1){
|
||
$goods_coupon = [];
|
||
$now = time();
|
||
foreach ($post['goods_ids'] as $item){
|
||
$goods_coupon[] = [
|
||
'coupon_id' => $post['id'],
|
||
'goods_id' => $item,
|
||
'create_time' => $now,
|
||
];
|
||
}
|
||
$couponGoods = new CouponGoods();
|
||
$couponGoods->saveAll($goods_coupon);
|
||
}
|
||
Db::commit();
|
||
return true;
|
||
} catch (\Exception $e) {
|
||
Db::rollback();
|
||
self::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public static function getCoupon($id,$get_data = false){
|
||
$coupon = Coupon::findOrEmpty($id);
|
||
$coupon['goods_coupon'] = [];
|
||
if($get_data) {
|
||
$coupon = $coupon->getData();
|
||
$coupon['send_time_start'] = date('Y-m-d H:i:s',$coupon['send_time_start']);
|
||
$coupon['send_time_end'] = date('Y-m-d H:i:s',$coupon['send_time_end']);
|
||
if($coupon['use_goods_type'] != 1){ // 非全部商品
|
||
$goods_coupon= CouponGoods::alias('cg')
|
||
->join('goods g','cg.goods_id = g.id')
|
||
->where(['coupon_id'=>$id])
|
||
->field('g.id,name,max_price,min_price,stock')
|
||
->select();
|
||
foreach ($goods_coupon as &$item){
|
||
$item['price'] = '¥'.$item['min_price'].'~'.'¥'.$item['max_price'];
|
||
if($item['max_price'] == $item['min_price']){
|
||
$item['price'] = '¥'.$item['min_price'];
|
||
}
|
||
}
|
||
$coupon['goods_coupon'] = $goods_coupon;
|
||
}
|
||
if($coupon['use_time_start']){
|
||
$coupon['use_time_start'] = date('Y-m-d H:i:s',$coupon['use_time_start']);
|
||
$coupon['use_time_end'] = date('Y-m-d H:i:s',$coupon['use_time_end']);
|
||
}
|
||
}
|
||
|
||
return $coupon;
|
||
}
|
||
|
||
/*
|
||
* 发放记录
|
||
*/
|
||
public static function log($get){
|
||
$where[] = ['cl.del','=',0];
|
||
$where[] = ['cl.coupon_id','=',$get['id']];
|
||
|
||
if(isset($get['keyword']) && $get['keyword']){
|
||
switch($get['search_type']) {
|
||
case 'sn';
|
||
$where[] = ['u.sn', '=', $get['keyword']];
|
||
break;
|
||
case 'nickname';
|
||
$where[] = ['u.nickname', '=', $get['keyword']];
|
||
break;
|
||
case 'mobile';
|
||
$where[] = ['u.mobile', '=', $get['keyword']];
|
||
break;
|
||
}
|
||
}
|
||
|
||
if(isset($get['status']) && $get['status'] != '') {
|
||
$where[] = ['cl.status', '=', $get['status']];
|
||
}
|
||
|
||
$log_count = CouponList::alias('cl')
|
||
->join('user u','cl.user_id = u.id')
|
||
->where($where)
|
||
->count();
|
||
|
||
$log_list = CouponList::alias('cl')
|
||
->join('user u','cl.user_id = u.id')
|
||
->where($where)
|
||
->field('cl.coupon_id,cl.status as cl_status,coupon_code,cl.create_time as cl_create_time,cl.use_time,u.nickname,u.avatar,u.mobile,u.sn,u.level')
|
||
->page($get['page'], $get['limit'])
|
||
->select();
|
||
$coupon_list = Coupon::where(['del'=>0])->column('name','id');
|
||
$level_name = UserLevel::where(['del'=>0])->column('name','id');
|
||
foreach ($log_list as &$item)
|
||
{
|
||
$item['coupon_name'] = $coupon_list[$item['coupon_id']] ?? '';
|
||
$item['avatar'] = UrlServer::getFileUrl($item['avatar']);
|
||
$item['level_name'] = $level_name[$item['level']] ?? '';
|
||
$item['status_desc'] = $item['cl_status'] ? '已使用' : '未使用';
|
||
$item['cl_create_time'] = date('Y-m-d H:i:s',$item['cl_create_time']);
|
||
$item['use_time_desc'] = $item['use_time'] ? date('Y-m-d H:i:s',$item['use_time']) : '';
|
||
}
|
||
return ['count'=>$log_count , 'lists'=>$log_list];
|
||
}
|
||
|
||
public static function changeStatus($id)
|
||
{
|
||
try{
|
||
$coupon = Coupon::findOrEmpty($id);
|
||
if ($coupon['send_time_end'] <= time() && $coupon['status'] == 0) {
|
||
throw new \Exception('已过发放时间,无法上架');
|
||
}
|
||
$coupon->status = $coupon->status ? 0 : 1;
|
||
$coupon->update_time = time();
|
||
$coupon->save();
|
||
return true;
|
||
}catch(\Exception $e) {
|
||
self::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
|
||
}
|
||
|
||
/*
|
||
* 删除优惠券 删除已领取用户的优惠券
|
||
*/
|
||
public static function del($id){
|
||
Db::startTrans();
|
||
try{
|
||
$time = time();
|
||
// 优惠券主表
|
||
Coupon::update([
|
||
'id' => $id,
|
||
'del' => 1,
|
||
'update_time' => $time
|
||
]);
|
||
// 已发放的优惠券
|
||
CouponList::where(['coupon_id'=>$id])->update([
|
||
'del' => 1,
|
||
'update_time' => $time
|
||
]);
|
||
Db::commit();
|
||
return true;
|
||
}catch(\Exception $e) {
|
||
Db::rollback();
|
||
self::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 发放优惠券
|
||
*/
|
||
public static function sendCoupon($post){
|
||
$user_ids = $post['user_ids'];
|
||
$coupon_ids = $post['coupon_ids'];
|
||
$coupon_list = Coupon::where('id', 'in', $coupon_ids)->column('*', 'id');
|
||
$user_list = User::where('id', 'in', $user_ids)->column('id,nickname', 'id');
|
||
|
||
// 判断是否会超发
|
||
foreach($coupon_ids as $coupon_id) {
|
||
$coupon = $coupon_list[$coupon_id];
|
||
if($coupon['send_total_type'] == 2) { // 限制数量的券
|
||
$already_issue = CouponList::where([
|
||
['coupon_id','=',$coupon_id],
|
||
['del','=',0]
|
||
])->count(); // 已发放数量
|
||
$target_issue = count($user_ids) + $already_issue; // 目标发放总数(若能正常发放的话)
|
||
if($target_issue > $coupon['send_total']) {
|
||
self::$error = $coupon['name'].'的发放数量已达到限制';
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
|
||
// 判断用户是否超出领取数量
|
||
foreach($coupon_ids as $coupon_id) {
|
||
$coupon = $coupon_list[$coupon_id];
|
||
if($coupon['get_num_type'] == 2) { // 限制次数
|
||
foreach($user_ids as $user_id) {
|
||
$count = CouponList::where([
|
||
'user_id' => $user_id,
|
||
'coupon_id' => $coupon_id,
|
||
'del' => 0,
|
||
])->count();
|
||
if($count >= $coupon['get_num']) {
|
||
self::$error = $user_list[$user_id]['nickname'].'已超出领取的限制次数';
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
if($coupon['get_num_type'] == 3) { // 每天领取次数限制
|
||
$timeStr = date('Y-m-d', time());
|
||
$today = strtotime($timeStr.' 00:00:00');
|
||
foreach($user_ids as $user_id) {
|
||
$count = CouponList::where([
|
||
['user_id', '=', $user_id],
|
||
['coupon_id', '=', $coupon_id],
|
||
['del', '=', 0],
|
||
['create_time', '>', $today],
|
||
])->count();
|
||
if($count >= $coupon['get_num']) {
|
||
self::$error = $user_list[$user_id]['nickname'].'已超出每日领取的限制次数';
|
||
return false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
try{
|
||
$addData = [];
|
||
$time = time();
|
||
foreach ($coupon_ids as $coupon_id){
|
||
foreach ($user_ids as $user_id){
|
||
$addData[] = [
|
||
'user_id' => $user_id,
|
||
'coupon_id' => $coupon_id,
|
||
'status' => 0,
|
||
'coupon_code' => create_coupon_code(),
|
||
'create_time' => $time,
|
||
'update_time' => $time
|
||
];
|
||
}
|
||
}
|
||
// 批量添加
|
||
$couponList = new CouponList();
|
||
$couponList->saveAll($addData);
|
||
|
||
return true;
|
||
}catch(\Exception $e){
|
||
self::$error = $e->getMessage();
|
||
return false;
|
||
}
|
||
}
|
||
|
||
public static function getShopCouponList($get)
|
||
{
|
||
$where = [
|
||
['del', '=', 0], // 未删除
|
||
['status', '=', 1], // 上架中
|
||
['get_type', '=', 2], // 商家赠送
|
||
['send_time_start', '<=', time()], // 开始发放时间早于或等于当前时间
|
||
['send_time_end', '>', time()], // 结束发放时间大于当前时间
|
||
['shop_id', '=', $get['shop_id']]
|
||
];
|
||
|
||
if(isset($get['name']) && !empty($get['name'])) {
|
||
$where[] = ['name', 'like', '%'.trim($get['name']).'%'];
|
||
}
|
||
|
||
if(isset($get['use_goods_type']) && !empty($get['use_goods_type'])) {
|
||
$where[] = ['use_goods_type', '=', $get['use_goods_type']];
|
||
}
|
||
|
||
$lists = Coupon::field('id,name,send_time_start,send_time_end,send_time_start as send_time,money,get_type as get_type_desc,condition_type as condition_type_desc_two,condition_money,send_total_type as send_info,send_total,use_goods_type as use_goods_type_desc,use_time_type,use_time_start,use_time_end,use_time,use_time as use_time_desc,status as status_desc,create_time')
|
||
->where($where)
|
||
->page($get['page'], $get['limit'])
|
||
->order('id', 'desc')
|
||
->select()
|
||
->toArray();
|
||
|
||
$count = Coupon::field('id,name,send_time_start,send_time_end,money,get_type,condition_type,send_total_type')
|
||
->where($where)
|
||
->count();
|
||
|
||
return [
|
||
'count' => $count,
|
||
'lists' => $lists
|
||
];
|
||
}
|
||
} |