/***********************************************************************
* 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.Loging;
using CoreCms.Net.Model.Entities;
using CoreCms.Net.Model.ViewModels.Basics;
using CoreCms.Net.Model.ViewModels.DTO;
using CoreCms.Net.Model.ViewModels.UI;
using CoreCms.Net.Utility.Helper;
using SqlSugar;
namespace CoreCms.Net.Repository
{
///
/// 优惠券码表 接口实现
///
public class CoreCmsCouponRepository : BaseRepository, ICoreCmsCouponRepository
{
public CoreCmsCouponRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
{
}
#region 根据优惠券编码取优惠券的信息,并判断是否可用
///
/// 根据优惠券编码取优惠券的信息,并判断是否可用
///
///
///
public async Task ToInfo(string[] code, bool check = false)
{
var jm = new WebApiCallBack();
var outData = new List();
foreach (var codeStr in code)
{
var model = await DbClient.Queryable((coupon, prommotion) => new object[]
{
JoinType.Inner, coupon.promotionId == prommotion.id
}).Where((coupon, prommotion) => coupon.couponCode == codeStr)
.Select((coupon, prommotion) => new
{
coupon,
prommotion
}).FirstAsync();
;
if (model != null)
{
if (check)
{
//判断规则是否开启
if (model.prommotion.isEnable == false)
{
jm.data = 15012;
jm.msg = GlobalErrorCodeVars.Code15012;
return jm;
}
//判断优惠券规则是否到达开始时间
var dt = DateTime.Now;
if (model.coupon.startTime > dt)
{
jm.data = 15010;
jm.msg = GlobalErrorCodeVars.Code15010;
return jm;
}
//判断优惠券规则是否已经到结束时间了,也就是是否过期了
if (model.coupon.endTime < dt)
{
jm.data = 15011;
jm.msg = GlobalErrorCodeVars.Code15011;
return jm;
}
//判断是否已经使用过了
if (model.coupon.isUsed)
{
jm.data = 15013;
jm.msg = GlobalErrorCodeVars.Code15013;
return jm;
}
//判断此类优惠券是否已经使用过,防止一类优惠券使用多张
if (outData.Exists(p => p.id == model.coupon.promotionId))
{
jm.data = 15015;
jm.msg = GlobalErrorCodeVars.Code15015;
return jm;
}
}
outData.Add(model.prommotion);
}
else
{
jm.data = 15009;
jm.msg = GlobalErrorCodeVars.Code15009;
return jm;
}
}
jm.status = true;
jm.data = outData;
return jm;
}
#endregion
#region 获取 我的优惠券
///
/// 获取 我的优惠券
///
/// 用户序列
/// 促销序列
/// 优惠券状态编码
/// 页码
/// 数量
public async Task GetMyCoupon(int userId, int promotionId = 0, string display = "", int page = 1, int limit = 10)
{
var jm = new WebApiCallBack();
jm.code = 0;
RefAsync totalCount = 0;
var dt = DateTime.Now;
var listData = await DbClient.Queryable((coupon, promotion) => new object[]
{
JoinType.Inner, coupon.promotionId == promotion.id
})
.Where((coupon, promotion) => coupon.userId == userId)
.Where((coupon, promotion) => promotion.isDel == false)
.Where((coupon, promotion) => promotion.type == (int)GlobalEnumVars.PromotionType.Coupon)
.WhereIF(display == GlobalEnumVars.CouponIsUsedStatusText.noUsed.ToString(), (coupon, promotion) => coupon.isUsed == false && coupon.endTime >= dt)
.WhereIF(display == GlobalEnumVars.CouponIsUsedStatusText.yesUsed.ToString(), (coupon, promotion) => coupon.isUsed == true)
.WhereIF(display == GlobalEnumVars.CouponIsUsedStatusText.invalid.ToString(), (coupon, promotion) => coupon.endTime < dt && coupon.isUsed == false)
.WhereIF(promotionId > 0, (coupon, promotion) => coupon.promotionId == promotionId)
.WhereIF(promotionId == 0, (coupon, promotion) => promotion.isEnable == true)
.Select((coupon, promotion) => new CoreCmsCoupon
{
couponCode = coupon.couponCode,
promotionId = coupon.promotionId,
isUsed = coupon.isUsed,
userId = coupon.userId,
usedId = coupon.usedId,
createTime = coupon.createTime,
updateTime = coupon.updateTime,
couponName = promotion.name,
startTime = coupon.startTime,
endTime = coupon.endTime,
})
.With(SqlWith.Null)
.MergeTable()
.Mapper(p => p.conditions, p => p.promotionId)
.Mapper(p => p.results, p => p.promotionId)
.OrderBy(p => p.createTime, OrderByType.Desc)
.ToPageListAsync(page, limit, totalCount);
var totalPages = totalCount.Value / limit;
if (totalPages == 0) { totalPages++; }
if (totalPages % limit > 0)
totalPages++;
var resutlList = new List();
if (listData != null && listData.Any())
{
foreach (var item in listData)
{
//var pcondition = await DbClient.Queryable().Where(p => p.promotionId == item.promotionId).ToListAsync();
//var presult = await DbClient.Queryable().Where(p => p.promotionId == item.promotionId).ToListAsync();
var expression1 = string.Empty;
var expression2 = string.Empty;
var dto = new GetMyCouponResultDto();
foreach (var condition in item.conditions)
{
var str = PromotionHelper.GetConditionMsg(condition.code, condition.parameters);
expression1 += str;
dto.conditions.Add(str);
}
foreach (var result in item.results)
{
var str = PromotionHelper.GetResultMsg(result.code, result.parameters);
expression2 += str;
dto.results.Add(str);
}
dto.couponCode = item.couponCode;
dto.promotionId = item.promotionId;
dto.isUsed = item.isUsed;
dto.userId = item.userId;
dto.usedId = item.usedId;
dto.createTime = item.createTime;
dto.updateTime = item.updateTime;
dto.couponName = item.couponName;
dto.expression1 = expression1;
dto.expression2 = expression2;
dto.isExpire = dt > item.endTime;
dto.startTime = item.startTime;
dto.endTime = item.endTime;
dto.stime = item.startTime.ToString("yyyy-MM-dd");
dto.etime = item.endTime.ToString("yyyy-MM-dd");
resutlList.Add(dto);
}
}
jm.status = true;
jm.msg = "获取成功";
jm.data = new
{
list = resutlList,
count = totalCount.Value,
display,
page = totalPages
};
jm.code = totalCount.Value;
return jm;
}
#endregion
#region 根据条件查询分页数据及导航数据
///
/// 根据条件查询分页数据及导航数据
///
/// 判断集合
/// 排序方式
/// 是否分页
/// 当前页面索引
/// 分布大小
///
///
public async Task> QueryPageMapperAsync(Expression> predicate,
Expression> orderByExpression, OrderByType orderByType, bool isToPage = false, int pageIndex = 1,
int pageSize = 20)
{
RefAsync totalCount = 0;
List page;
if (isToPage)
{
page = await DbClient.Queryable()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate).Select(p => new CoreCmsCoupon
{
id = p.id,
couponCode = p.couponCode,
promotionId = p.promotionId,
isUsed = p.isUsed,
userId = p.userId,
usedId = p.usedId,
createTime = p.createTime,
updateTime = p.updateTime,
startTime = p.startTime,
endTime = p.endTime,
})
.Mapper(p => p.promotion, p => p.promotionId)
.Mapper(p => p.conditions, p => p.conditions.First().promotionId)
.Mapper(p => p.results, p => p.results.First().promotionId)
.ToPageListAsync(pageIndex, pageSize, totalCount);
}
else
{
page = await DbClient.Queryable()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate)
.Take(pageSize)
.Select(p => new CoreCmsCoupon
{
id = p.id,
couponCode = p.couponCode,
promotionId = p.promotionId,
isUsed = p.isUsed,
userId = p.userId,
usedId = p.usedId,
createTime = p.createTime,
updateTime = p.updateTime,
startTime = p.startTime,
endTime = p.endTime,
})
.Mapper(p => p.promotion, p => p.promotionId)
.Mapper(p => p.conditions, p => p.conditions.First().promotionId)
.Mapper(p => p.results, p => p.results.First().promotionId)
.ToListAsync();
}
var list = new PageList(page, pageIndex, pageSize, totalCount);
return list;
}
#endregion
#region 重写数据并获取相关
///
/// 重写数据并获取相关
///
/// 判断集合
///
public async Task> QueryWithAboutAsync(Expression> predicate)
{
var page = await DbClient.Queryable((p, sUser, sPromotion) => new JoinQueryInfos(
JoinType.Left, p.userId == sUser.id,
JoinType.Left, p.promotionId == sPromotion.id))
.Select((p, sUser, sPromotion) => new CoreCmsCoupon
{
id = p.id,
couponCode = p.couponCode,
promotionId = p.promotionId,
isUsed = p.isUsed,
userId = p.userId,
usedId = p.usedId,
createTime = p.createTime,
updateTime = p.updateTime,
userNickName = sUser.nickName,
couponName = sPromotion.name,
startTime = p.startTime,
endTime = p.endTime,
})
.MergeTable()
.WhereIF(predicate != null, predicate)
.ToListAsync();
return page;
}
#endregion
#region 重写根据条件查询分页数据
///
/// 重写根据条件查询分页数据
///
/// 判断集合
/// 排序方式
/// 当前页面索引
/// 分布大小
///
/// 是否使用WITH(NOLOCK)
///
public async Task> QueryPageAsync(Expression> predicate,
Expression> orderByExpression, OrderByType orderByType, int pageIndex = 1,
int pageSize = 20, bool blUseNoLock = false)
{
RefAsync totalCount = 0;
var page = blUseNoLock
? await DbClient.Queryable((p, sUser, sPromotion) => new JoinQueryInfos(
JoinType.Left, p.userId == sUser.id,
JoinType.Left, p.promotionId == sPromotion.id))
.Select((p, sUser, sPromotion) => new CoreCmsCoupon
{
id = p.id,
couponCode = p.couponCode,
promotionId = p.promotionId,
isUsed = p.isUsed,
userId = p.userId,
usedId = p.usedId,
createTime = p.createTime,
updateTime = p.updateTime,
userNickName = sUser.nickName,
couponName = sPromotion.name,
startTime = p.startTime,
endTime = p.endTime,
})
.With(SqlWith.NoLock)
.MergeTable()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate)
.ToPageListAsync(pageIndex, pageSize, totalCount)
:
await DbClient.Queryable((p, sUser, sPromotion) => new JoinQueryInfos(
JoinType.Left, p.userId == sUser.id,
JoinType.Left, p.promotionId == sPromotion.id))
.Select((p, sUser, sPromotion) => new CoreCmsCoupon
{
id = p.id,
couponCode = p.couponCode,
promotionId = p.promotionId,
isUsed = p.isUsed,
userId = p.userId,
usedId = p.usedId,
createTime = p.createTime,
updateTime = p.updateTime,
userNickName = sUser.nickName,
couponName = sPromotion.name,
startTime = p.startTime,
endTime = p.endTime,
})
.MergeTable()
.OrderByIF(orderByExpression != null, orderByExpression, orderByType)
.WhereIF(predicate != null, predicate)
.ToPageListAsync(pageIndex, pageSize, totalCount);
var list = new PageList(page, pageIndex, pageSize, totalCount);
return list;
}
#endregion
#region 获取 我的优惠券可用数量
///
/// 获取 我的优惠券可用数量
///
/// 用户序列
public async Task GetMyCouponCount(int userId)
{
var jm = new WebApiCallBack();
jm.code = 0;
var dt = DateTime.Now;
var count = await DbClient.Queryable((coupon, promotion) => new object[]
{
JoinType.Inner, coupon.promotionId == promotion.id
})
.Where((coupon, promotion) => coupon.userId == userId)
.Where((coupon, promotion) => promotion.isDel == false)
.Where((coupon, promotion) => coupon.isUsed == false)
.Where((coupon, promotion) => promotion.type == (int)GlobalEnumVars.PromotionType.Coupon)
.Where((coupon, promotion) => coupon.endTime > dt)
.CountAsync();
return count;
}
#endregion
}
}