418 lines
18 KiB
C#
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=¶m={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=¶m={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 活动产品
|
|
}
|
|
} |