Zxd.Core/code/Zxd.Crm.Domain/QwOnlinePayDomain.cs

418 lines
18 KiB
C#

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<ZxdDbContext> _zxdRepository;
private readonly IMapper _mapper;
private readonly IRedisManager _redisManager;
public QwOnlinePayDomain(IBaseRepository<ZxdDbContext> zxdRepository,
IMapper mapper,
IRedisManager redisManager)
{
_zxdRepository = zxdRepository;
_mapper = mapper;
_redisManager = redisManager;
}
#region
public async Task<bool> 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<QiWeiActivity>();
if (dto.Id.HasValue)
{
var updateItem = await _zxdRepository.GetRepository<QiWeiActivity>().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<QiWeiActivityDept>().Query().Where(n => n.ActId == dto.Id).ToListAsync();
await _zxdRepository.GetRepository<QiWeiActivityDept>().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<QiWeiActivityDept> deptMap = new List<QiWeiActivityDept>();
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<QiWeiActivityDept>().BatchInsertAsync(deptMap);
await transaction.CommitAsync();
return true;
}
public async Task<PageResult<ActivityModel>> 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<QiWeiActivity>().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<ActivityModel>(dto.PageIndex, dto.PageSize, total, data);
}
private async Task SetDeptInfo(List<ActivityModel> 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<string> deptName = new List<string>();
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<List<RedisDeptmentDto>> GetDeptMentDto()
{
var key = "deptment_list_new";
var deptInfo = new List<RedisDeptmentDto>();
if (await _redisManager.ExistsAsync(key))
{
deptInfo = await _redisManager.GetListAsync<RedisDeptmentDto>(key);
}
return deptInfo;
}
public async Task<ActivityEidtModel> GetEditActivityModel(int Id)
{
ActivityEidtModel res = new ActivityEidtModel();
var model = await _zxdRepository.GetRepository<QiWeiActivity>().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<bool> CreateActProduct(ActProductCreateDto dto)
{
var actRepository = _zxdRepository.GetRepository<QiWeiActivity>();
var activity = await actRepository.FirstOrDefaultAsync(n => n.Id == dto.ActId && n.Status == 1);
if (activity == null)
{
throw new Exception("找不到相关的活动");
}
var actProRepository = _zxdRepository.GetRepository<QWActivityProduct>();
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<PageResult<ActProductModel>> GetActProductList(ActProductQueryDto dto)
{
List<int> deptIds = new List<int>();
if (!string.IsNullOrWhiteSpace(dto.DeptIds))
{
deptIds = dto.DeptIds.Split(',').Select(n => Convert.ToInt32(n)).ToList();
}
var actProRepository = _zxdRepository.GetRepository<QWActivityProduct>();
var proQuery = _zxdRepository.GetRepository<QWActivityProduct>().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<WxSzzySubproduct>().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<BAS_PARAMETER>().Query().FirstOrDefaultAsync(n => n.PARAKEY == "PayRedirectSetting");
var set = JsonConvert.DeserializeObject<PayRedirectSetting>(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=&param={3}&isWeb=true", set.ThreeUrl, string.IsNullOrEmpty(item.buylink) ? "" : item.buylink.Replace("unifiedpay/", ""), dto.Ch, param);
}
var result = _mapper.Map<ActProductQueryModel, ActProductModel>(data);
return new PageResult<ActProductModel>(dto.PageIndex, dto.PageSize, total, result);
}
public async Task<ProductEditModel> GetProductEditModel(ProductEditQueryDto dto)
{
if (string.IsNullOrWhiteSpace(dto.CompanyCode))
{
throw new Exception("事业线必填");
}
ProductEditModel res = new ProductEditModel();
if (dto.Id > 0)
{
var pro = await _zxdRepository.GetRepository<QWActivityProduct>().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<WxSzzySubproductCh>().Query()
.Where(n => n.companycode == dto.CompanyCode && n.isValid == 1)
join b in _zxdRepository.GetRepository<WxSzzySubproduct>().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<QiWeiActivity>();
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;
}
/// <summary>
/// 获取产品价格期限 在线支付链接
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public async Task<ProductInfo> GetProductInfo(ProductInfoQueryDto dto)
{
var pro = await _zxdRepository.GetRepository<WxSzzySubproduct>().Query().FirstOrDefaultAsync(n => n.productcode == dto.Code);
if (pro == null)
{
throw new Exception("找不到对应的产品");
}
var paySetting = await _zxdRepository.GetRepository<BAS_PARAMETER>().Query().FirstOrDefaultAsync(n => n.PARAKEY == "PayRedirectSetting");
var set = JsonConvert.DeserializeObject<PayRedirectSetting>(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=&param={3}&isWeb=true", set.ThreeUrl, string.IsNullOrEmpty(pro.buylink) ? "" : pro.buylink.Replace("unifiedpay/", ""), dto.Ch, param);
}
return res;
}
public async Task<bool> 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<QWActivityProduct>().Query().Where(n => ids.Contains(n.Id)).ToListAsync();
await _zxdRepository.GetRepository<QWActivityProduct>().BatchDeleteAsync(proList);
return true;
}
#endregion
}
}