/***********************************************************************
* Project: baifenBinfa
* ProjectName: 百分兵法管理系统
* Web: http://chuanyin.com
* Author:
* Email:
* CreateTime: 202403/02
* Description: 暂无
***********************************************************************/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using CoreCms.Net.Configuration;
using CoreCms.Net.IRepository;
using CoreCms.Net.IRepository.UnitOfWork;
using CoreCms.Net.IServices;
using CoreCms.Net.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.UI;
using Microsoft.Extensions.DependencyInjection;
using SqlSugar;
namespace CoreCms.Net.Services
{
///
/// 优惠券表 接口实现
///
public class CoreCmsCouponServices : BaseServices, ICoreCmsCouponServices
{
private readonly ICoreCmsCouponRepository _dal;
private readonly IUnitOfWork _unitOfWork;
private readonly IServiceProvider _serviceProvider;
public CoreCmsCouponServices(IUnitOfWork unitOfWork, ICoreCmsCouponRepository dal, IServiceProvider serviceProvider)
{
this._dal = dal;
_serviceProvider = serviceProvider;
base.BaseDal = dal;
_unitOfWork = unitOfWork;
}
///
/// 根据优惠券编码取优惠券的信息,并判断是否可用
///
///
///
public async Task CodeToInfo(string[] code, bool check = false)
{
return await _dal.ToInfo(code, check);
}
///
/// 删除核销多个优惠券
///
/// 优惠券码
/// 使用序列
///
public async Task UsedMultipleCoupon(string[] couponCode, string orderId)
{
var res = new WebApiCallBack() { methodDescription = "删除核销多个优惠券" };
//判断优惠券码能否有效
var resCodeToInfo = await CodeToInfo(couponCode, true);
if (resCodeToInfo.status == false)
{
return resCodeToInfo;
}
var dt = DateTime.Now;
var doHasChange = await _dal.UpdateAsync(p => new CoreCmsCoupon() { isUsed = true, usedId = orderId, updateTime = dt },
p => p.isUsed == false && couponCode.Contains(p.couponCode));
if (doHasChange)
{
res.status = true;
res.msg = "核销使用优惠券成功";
res.data = couponCode;
}
else
{
res.status = false;
res.msg = "核销使用优惠券失败";
res.data = couponCode;
}
return res;
}
///
/// 获取 我的优惠券
///
/// 用户序列
/// 促销序列
/// 优惠券状态编码
/// 页码
/// 数量
public async Task GetMyCoupon(int userId, int promotionId = 0, string display = "all", int page = 1, int limit = 10)
{
return await _dal.GetMyCoupon(userId, promotionId, display, page, limit);
}
///
/// 用户领取优惠券 插入数据
///
///
///
///
/// 数量
/// 说明
///
public async Task AddData(int userId, int promotionId, CoreCmsPromotion promotion, int number = 1, string remark = "接口领取")
{
var jm = new WebApiCallBack();
var dtTime = DateTime.Now;
var eTime = DateTime.Now;
if (promotion.effectiveDays > 0)
{
eTime = eTime.AddDays(promotion.effectiveDays);
}
if (promotion.effectiveHours > 0)
{
eTime = eTime.AddHours(promotion.effectiveHours);
}
bool bl;
if (number > 1)
{
var list = new List();
for (var i = 0; i < number; i++)
{
list.Add(new CoreCmsCoupon
{
couponCode = GeneratePromotionCode()[0],
promotionId = promotion.id,
isUsed = false,
userId = userId,
createTime = dtTime,
startTime = dtTime,
endTime = eTime,
remark = remark
});
}
bl = await _dal.InsertAsync(list) > 0;
}
else
{
var coupon = new CoreCmsCoupon
{
couponCode = GeneratePromotionCode()[0],
promotionId = promotion.id,
isUsed = false,
userId = userId,
createTime = dtTime,
startTime = dtTime,
endTime = eTime,
remark = remark
};
bl = await _dal.InsertAsync(coupon) > 0;
}
jm.status = bl;
jm.msg = bl ? "领取成功" : "领取失败";
return jm;
}
///
/// 通过优惠券号领取优惠券
///
///
///
///
public async Task ReceiveCoupon(int userId, string couponCode)
{
using var container = _serviceProvider.CreateScope();
var promotionServices = container.ServiceProvider.GetService();
var jm = new WebApiCallBack();
var coupon = await _dal.QueryByClauseAsync(p => p.couponCode == couponCode);
if (coupon == null)
{
jm.msg = "该优惠券不存在";
return jm;
}
if (!string.IsNullOrEmpty(coupon.usedId))
{
jm.msg = "该优惠券已被使用";
return jm;
}
if (coupon.userId > 0)
{
jm.msg = "该优惠券已被其他人领取";
return jm;
}
coupon.userId = userId;
var bl = await _dal.UpdateAsync(p => new CoreCmsCoupon() { userId = userId }, p => p.id == coupon.id);
if (bl)
{
var promotion = await promotionServices.QueryByIdAsync(coupon.promotionId);
if (promotion != null)
{
coupon.couponName = promotion.name;
}
}
jm.status = bl;
jm.msg = bl ? "领取成功" : "领取失败";
jm.data = coupon;
return jm;
}
///
/// 生成优惠券code 方法
///
/// 定义一个int类型的参数 用来确定生成多少个优惠码
/// 定义一个exclude_codes_array类型的数组
/// 定义一个code_length的参数来确定优惠码的长度
///
public List GeneratePromotionCode(int noOfCodes = 1, List excludeCodesArray = null, int codeLength = 10)
{
char[] constant =
{
'0','1','2','3','4','5','6','7','8','9',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
};
var promotionCodes = new List(); //这个数组用来接收生成的优惠码
Random rd = new Random();
for (int i = 0; i < noOfCodes; i++)
{
var code = "";
for (int j = 0; j < codeLength; j++)
{
code += constant[rd.Next(62)];
}
//如果生成的6位随机数不再我们定义的$promotion_codes函数里面
if (!promotionCodes.Contains(code))
{
if (excludeCodesArray != null && excludeCodesArray.Any())
{
if (!excludeCodesArray.Contains(code))
{
promotionCodes.Add(code);//将优惠码赋值给数组
}
else
{
i--;
}
}
else
{
promotionCodes.Add(code);//将优惠码赋值给数组
}
}
else
{
i--;
}
}
return promotionCodes;
}
///
/// 根据条件查询分页数据及导航数据
///
/// 判断集合
/// 排序方式
/// 是否分页
/// 当前页面索引
/// 分布大小
///
///
public async Task> QueryPageMapperAsync(Expression> predicate,
Expression> orderByExpression, OrderByType orderByType, bool isToPage = false, int pageIndex = 1,
int pageSize = 20)
{
return await _dal.QueryPageMapperAsync(predicate, orderByExpression, orderByType, isToPage, pageIndex, pageSize);
}
///
/// 重写数据并获取相关
///
/// 判断集合
///
public async Task> QueryWithAboutAsync(Expression> predicate)
{
return await _dal.QueryWithAboutAsync(predicate);
}
///
/// 重写根据条件查询分页数据
///
/// 判断集合
/// 排序方式
/// 当前页面索引
/// 分布大小
///
/// 是否使用WITH(NOLOCK)
///
public async Task> QueryPageAsync(Expression> predicate,
Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
return await _dal.QueryPageAsync(predicate, orderByExpression, orderByType, pageIndex, pageSize, blUseNoLock);
}
///
/// 获取 我的优惠券可用数量
///
/// 用户序列
public async Task GetMyCouponCount(int userId)
{
return await _dal.GetMyCouponCount(userId);
}
///
/// 优惠券返还
///
/// 优惠券数组
public async Task CancelReturnCoupon(string couponCodes)
{
var jm = new WebApiCallBack();
jm.code = 0;
var bl = false;
var ids = couponCodes.Split(",");
var list = await _dal.QueryListByClauseAsync(p => ids.Contains(p.couponCode));
if (list != null && list.Any())
{
var newList = new List();
list.ForEach(p =>
{
var eTime = p.endTime.AddMinutes(1);
newList.Add(new CoreCmsCoupon()
{
couponCode = GeneratePromotionCode()[0],
promotionId = p.promotionId,
isUsed = false,
userId = p.userId,
createTime = DateTime.Now,
remark = "优惠券返还",
startTime = p.startTime,
endTime = eTime
});
});
bl = await _dal.InsertAsync(newList) > 0;
jm.status = bl;
jm.msg = bl ? "返还成功" : "返还失败";
}
return jm;
}
}
}