using MySqlConnector; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; using System.Text; using System.Threading.Tasks; using Zxd.Crm.Domain.Dto.QWOnlinePay; using Zxd.Crm.Domain.Impl.QwOnlinePay; using Zxd.Entity.Zxd; using Zxd.Entity.Zxd.QiweiOnlePay; namespace Zxd.Crm.Domain { public class QwOnlinePayDomain : IQwOnlinePayDomain { private readonly IBaseRepository _zxdRepository; private readonly IMapper _mapper; private readonly IRedisManager _redisManager; public QwOnlinePayDomain(IBaseRepository zxdRepository, IMapper mapper, IRedisManager redisManager) { _zxdRepository = zxdRepository; _mapper = mapper; _redisManager = redisManager; } #region 企微侧边栏活动 public async Task CreateActivity(ActivityCreateDto dto) { if (dto.StartTime.HasValue && dto.EndTime.HasValue && dto.StartTime > dto.EndTime) { throw new Exception("活动开始时间不能大于结束时间"); } using var transaction = await _zxdRepository.BeginTransactionAsync(); var actRepository = _zxdRepository.GetRepository(); if (dto.Id.HasValue) { var updateItem = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.Id == dto.Id); if (updateItem == null) { throw new Exception("找不到对应的活动"); } updateItem.Name = dto.Name; updateItem.StartTime = dto.StartTime; updateItem.Eid = dto.Eid; updateItem.EName = dto.EName; updateItem.Order = dto.Order; updateItem.EndTime = dto.EndTime; updateItem.Status = dto.Status; updateItem.Num = dto.Num; updateItem.Remark = dto.Remark; updateItem.Utime = DateTime.Now; await actRepository.UpdateAsync(updateItem); var delMap = await _zxdRepository.GetRepository().Query().Where(n => n.ActId == dto.Id).ToListAsync(); await _zxdRepository.GetRepository().BatchDeleteAsync(delMap); } else { if (string.IsNullOrWhiteSpace(dto.DeptIdList)) { throw new Exception("事业部不能为空"); } QiWeiActivity qiWeiActivity = new QiWeiActivity() { Name = dto.Name, StartTime = dto.StartTime, Eid = dto.Eid, EName = dto.EName, EndTime = dto.EndTime, Status = dto.Status, Num = dto.Num, Remark = dto.Remark, Ctime = DateTime.Now, CompanyCode = dto.CompanyCode, Order = dto.Order }; await actRepository.InsertAsync(qiWeiActivity); dto.Id = qiWeiActivity.Id; } List deptMap = new List(); var deptList = dto.DeptIdList.Split(',').Select(n => Convert.ToInt32(n)).ToList(); foreach (var deptid in deptList) { QiWeiActivityDept qiWeiActivityDept = new QiWeiActivityDept() { ActId = dto.Id.Value, DeptId = deptid, Ctime = DateTime.Now }; deptMap.Add(qiWeiActivityDept); } await _zxdRepository.GetRepository().BatchInsertAsync(deptMap); await transaction.CommitAsync(); return true; } public async Task> GetActivityList(ActivityQueryDto dto) { if (string.IsNullOrWhiteSpace(dto.DeptIds)) { throw new Exception("事业线必填"); } var deptIds = dto.DeptIds.Split(',').Select(n => Convert.ToInt32(n)).ToList(); var query = from a in _zxdRepository.GetRepository().Query().Include(x => x.QiWeiActivityDept) .Where(n => true) .If(dto.Status.HasValue, x => x.Where(m => m.Status == dto.Status)) .If(!dto.IsCrm.HasValue, x => x.Where(m => m.EndTime == null || m.EndTime >= DateTime.Now)) .Where(n => n.QiWeiActivityDept.Any(x => deptIds.Contains(x.DeptId))) .OrderBy(n => n.Order) select new ActivityModel { Id = a.Id, Name = a.Name, StartTime = a.StartTime, EndTime = a.EndTime, Num = a.Num, Remark = a.Remark, Status = a.Status, EName = a.EName, Eid = a.Eid, DeptName = string.Join(",", a.QiWeiActivityDept.Select(n => n.DeptId)) }; var total = await query.CountAsync(); var data = await query.Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); await SetDeptInfo(data); return new PageResult(dto.PageIndex, dto.PageSize, total, data); } private async Task SetDeptInfo(List model) { var deptInfo = await GetDeptMentDto(); if (deptInfo != null && deptInfo.Count > 0) { foreach (var item in model) { var deptids = item.DeptName.Split(",").Select(n => Convert.ToInt32(n)).ToList(); List deptName = new List(); foreach (var deptid in deptids) { var dept = deptInfo.FirstOrDefault(n => n.Id == deptid); deptName.Add(dept?.Title); } item.DeptName = string.Join(",", deptName.Where(n => !string.IsNullOrWhiteSpace(n)).ToList()); } } } private async Task> GetDeptMentDto() { var key = "deptment_list_new"; var deptInfo = new List(); if (await _redisManager.ExistsAsync(key)) { deptInfo = await _redisManager.GetListAsync(key); } return deptInfo; } public async Task GetEditActivityModel(int Id) { ActivityEidtModel res = new ActivityEidtModel(); var model = await _zxdRepository.GetRepository().Query().Include(x => x.QiWeiActivityDept).FirstOrDefaultAsync(n => n.Id == Id); if (model != null) { res = new ActivityEidtModel() { Id = Id, Name = model.Name, StartTime = model.StartTime.HasValue ? model.StartTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", EndTime = model.EndTime.HasValue ? model.EndTime.Value.ToString("yyyy-MM-dd HH:mm:ss") : "", Num = model.Num, Remark = model.Remark, Status = model.Status, EName = model.EName, Eid = model.Eid, Order = model.Order, DeptIds = string.Join(",", model.QiWeiActivityDept.Select(n => n.DeptId).ToList()) }; } return res; } #endregion 企微侧边栏活动 #region 活动产品 public async Task CreateActProduct(ActProductCreateDto dto) { var actRepository = _zxdRepository.GetRepository(); var activity = await actRepository.FirstOrDefaultAsync(n => n.Id == dto.ActId && n.Status == 1); if (activity == null) { throw new Exception("找不到相关的活动"); } var actProRepository = _zxdRepository.GetRepository(); if (dto.Id.HasValue && dto.Id > 0) { var product = await actProRepository.FirstOrDefaultAsync(n => n.Id == dto.Id); product.ProductCode = dto.ProductCode; product.ActId = dto.ActId; product.IsFirst = dto.IsFirst; product.Utime = DateTime.Now; product.Eid = dto.Eid; product.EName = dto.Ename; product.Status = dto.Status; product.Order = dto.Order; await actProRepository.UpdateAsync(product); } else { var existModel = await actProRepository.FirstOrDefaultAsync(n => n.ProductCode == dto.ProductCode && n.ActId == dto.ActId); if (existModel != null) { throw new Exception("活动已经存在该产品,请进行编辑!"); } QWActivityProduct product = new QWActivityProduct { ProductCode = dto.ProductCode, ActId = dto.ActId, IsFirst = dto.IsFirst, Ctime = DateTime.Now, Eid = dto.Eid, EName = dto.Ename, Status = dto.Status, Order = dto.Order, }; await actProRepository.InsertAsync(product); } return true; } public async Task> GetActProductList(ActProductQueryDto dto) { List deptIds = new List(); if (!string.IsNullOrWhiteSpace(dto.DeptIds)) { deptIds = dto.DeptIds.Split(',').Select(n => Convert.ToInt32(n)).ToList(); } var actProRepository = _zxdRepository.GetRepository(); var proQuery = _zxdRepository.GetRepository().Query(); var query = from a in actProRepository.Query().Include(x => x.QiWeiActivity).ThenInclude(s => s.QiWeiActivityDept) .Where(n => true) .If(dto.ActId.HasValue, x => x.Where(m => m.ActId == dto.ActId)) .If(dto.Status.HasValue, x => x.Where(m => m.Status == dto.Status)) .If(deptIds.Count > 0, x => x.Where(m => m.QiWeiActivity.QiWeiActivityDept.Any(s => deptIds.Contains(s.DeptId)))) .If(!string.IsNullOrWhiteSpace(dto.ProductCode), x => x.Where(m => m.ProductCode == dto.ProductCode)) join b in _zxdRepository.GetRepository().Query() on a.ProductCode equals b.productcode select new ActProductQueryModel { Id = a.Id, ActId = a.QiWeiActivity.Id, ActName = a.QiWeiActivity.Name, Price = b.price, ProductCode = a.ProductCode, ProductName = b.subproductname, IsFirst = a.IsFirst, Eid = a.Eid, Ename = a.EName, Day = b.rightperiod, Status = a.Status, Order = a.Order, callbacklink = b.callbacklink, buylink = b.buylink }; if (!string.IsNullOrWhiteSpace(dto.ProductName)) { query = query.Where(n => n.ProductName.Contains(dto.ProductName)); } query = query.OrderByDescending(n => n.Id).OrderBy(n => n.Order); var total = await query.CountAsync(); var data = await query.Skip((dto.PageIndex - 1) * dto.PageSize) .Take(dto.PageSize) .ToListAsync(); var paySetting = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.PARAKEY == "PayRedirectSetting"); var set = JsonConvert.DeserializeObject(paySetting.PARAVALUE); if (!dto.Ch.HasValue) { var deptList = await GetDeptMentDto(); var dept = deptList.FirstOrDefault(n => n.Id == dto.DeptId); if (dept != null) { dto.Ch = dept?.DeptmentCampains?.FirstOrDefault()?.StartCampainId; } } foreach (var item in data) { var paramObject = new { ch = dto.Ch, callback = item.callbacklink, ext = new { eid = dto.Eid } }; var param = JsonConvert.SerializeObject(paramObject); param = SecurityHelper.EncyptData(param, "upchina3"); item.PayLink = string.Format("{0}/{1}?ch={2}&uname=¶m={3}&isWeb=true", set.ThreeUrl, string.IsNullOrEmpty(item.buylink) ? "" : item.buylink.Replace("unifiedpay/", ""), dto.Ch, param); } var result = _mapper.Map(data); return new PageResult(dto.PageIndex, dto.PageSize, total, result); } public async Task GetProductEditModel(ProductEditQueryDto dto) { if (string.IsNullOrWhiteSpace(dto.CompanyCode)) { throw new Exception("事业线必填"); } ProductEditModel res = new ProductEditModel(); if (dto.Id > 0) { var pro = await _zxdRepository.GetRepository().FirstOrDefaultAsync(n => n.Id == dto.Id); res.QWActivityProduct = new ActProductModel { Id = pro.Id, ActId = pro.ActId, ProductCode = pro.ProductCode, IsFirst = pro.IsFirst, Status = pro.Status, Order = pro.Order, }; } var query = from a in _zxdRepository.GetRepository().Query() .Where(n => n.companycode == dto.CompanyCode && n.isValid == 1) join b in _zxdRepository.GetRepository().Query().Where(n => n.isonlinebuy != null) on a.subproductid equals b.subproductid select new ActProductModel { Price = b.price, ProductCode = b.productcode, ProductName = b.subproductname, Day = b.rightperiod, }; res.ActProducts = query.Distinct().ToList(); var actRepository = _zxdRepository.GetRepository(); var actList = await actRepository.Query().Where(n => n.Status == 1 && n.CompanyCode == dto.CompanyCode && (n.EndTime == null || n.EndTime >= DateTime.Now)) .Select(n => new ActivityModel { Id = n.Id, Name = n.Name }) .ToListAsync(); res.ActList = actList; return res; } /// /// 获取产品价格期限 在线支付链接 /// /// /// public async Task GetProductInfo(ProductInfoQueryDto dto) { var pro = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.productcode == dto.Code); if (pro == null) { throw new Exception("找不到对应的产品"); } var paySetting = await _zxdRepository.GetRepository().Query().FirstOrDefaultAsync(n => n.PARAKEY == "PayRedirectSetting"); var set = JsonConvert.DeserializeObject(paySetting.PARAVALUE); ProductInfo res = new ProductInfo() { ProductCode = pro.productcode, ProductName = pro.subproductname, Day = pro.rightperiod, Price = pro.price, }; if (!dto.Ch.HasValue) { var deptList = await GetDeptMentDto(); var dept = deptList.FirstOrDefault(n => n.Id == dto.DeptId); if (dept != null) { dto.Ch = dept?.DeptmentCampains?.FirstOrDefault()?.StartCampainId; } } if (dto.Ch.HasValue) { var paramObject = new { ch = dto.Ch, callback = pro.callbacklink, ext = new { eid = dto.Eid } }; var param = JsonConvert.SerializeObject(paramObject); param = SecurityHelper.EncyptData(param, "upchina3"); res.PayLink = string.Format("{0}/{1}?ch={2}&uname=¶m={3}&isWeb=true", set.ThreeUrl, string.IsNullOrEmpty(pro.buylink) ? "" : pro.buylink.Replace("unifiedpay/", ""), dto.Ch, param); } return res; } public async Task DelActProduct(DelActProductModel dto) { if (string.IsNullOrWhiteSpace(dto.Ids)) { throw new Exception("找不到对应的活动产品"); } var ids = dto.Ids.Split(',').Select(n => Convert.ToInt32(n)).ToList(); var proList = await _zxdRepository.GetRepository().Query().Where(n => ids.Contains(n.Id)).ToListAsync(); await _zxdRepository.GetRepository().BatchDeleteAsync(proList); return true; } #endregion 活动产品 } }