/*********************************************************************** * 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 } }