Zxd.Core/code/Zxd.Core.Domain/OrderBindDomain.cs

443 lines
18 KiB
C#

using Dapper;
using Microsoft.Extensions.DependencyInjection;
using MySqlConnector;
using System.Data;
using Zxd.Core.Domain.Dto.Zxd.Callback;
using Zxd.Core.Domain.Dto.Zxd.Order;
using Zxd.Core.Domain.Dto.Zxd.QwWeiSide;
using Zxd.Entity.UserCenter;
using Zxd.Entity.Zxd.Order;
namespace Zxd.Core.Domain
{
public class OrderBindDomain : IOrderDomain
{
private readonly IBaseRepository<ZxdDbContext> _zxdRepository;
private readonly IBaseRepository<DncmsbaseDbContext> _cmsRepository;
private readonly IBaseRepository<UserCenterDbContext> _userCenterRepository;
private readonly IRedisManager _redisManager;
private readonly ICacheDomain _cacheDomain;
private readonly IMapper _mapper;
private readonly IHttpClient _httpClient;
private readonly SystemConfig _systemConfig;
private readonly IDbConnection _dbConnection;
private readonly PayCallbackConfig _payCallbackConfig;
private readonly IUserInfoDomain _userInfoDomain;
public OrderBindDomain(
IBaseRepository<ZxdDbContext> zxdRepository,
IBaseRepository<DncmsbaseDbContext> cmsRepository,
IBaseRepository<UserCenterDbContext> userCenterRepository,
IRedisManager redisManager,
ICacheDomain cacheDomain,
IHttpClient httpClient,
IConfiguration configuration,
IUserInfoDomain userInfoDomain,
IDbConnection dbConnection, IMapper mapper)
{
_zxdRepository = zxdRepository;
_cmsRepository = cmsRepository;
_userCenterRepository = userCenterRepository;
_redisManager = redisManager;
_cacheDomain = cacheDomain;
_httpClient = httpClient;
_userInfoDomain = userInfoDomain;
_mapper = mapper;
_systemConfig = configuration.GetSection("SystemConfig").Get<SystemConfig>();
_dbConnection = dbConnection;
_payCallbackConfig = configuration.GetSection("PayCallbackConfig").Get<PayCallbackConfig>();
}
public async Task<PageResult<BindListDto>> GetBindListPageAsync(SearchBindListDto dto)
{
var channel = new List<int?>();
if (!string.IsNullOrEmpty(dto.Channel))
{
var parts = dto.Channel.Split(',');
foreach (var part in parts)
{
if (int.TryParse(part, out var ch))
{
channel.Add(ch);
}
}
}
if (channel.Count == 0)
{
return new PageResult<BindListDto>(dto.PageIndex, dto.PageSize, 0, new List<BindListDto>());
}
if (!string.IsNullOrEmpty(dto.ResId))
{
dto.ResId = await _zxdRepository.GetRepository<RES_CUSTOMER>().Query().Where(x => x.UMID == dto.ResId)
.Select(x => x.RESID).FirstOrDefaultAsync();
}
var query = _zxdRepository.GetRepository<WX_SZZYORDER_BIND>().Query()
.Where(x => channel.Contains(x.Channel))
.If(dto.BindType.HasValue, x => x.Where(x => x.BindType == dto.BindType))
.If(dto.EId.HasValue, x => x.Where(x => x.EId == dto.EId))
.If(!string.IsNullOrEmpty(dto.txt_userId), x => x.Where(x => x.EId.GetValueOrDefault().ToString() == dto.txt_userId))
.If(!string.IsNullOrEmpty(dto.PayType), x => x.Where(x => x.PayType == dto.PayType))
.If(!string.IsNullOrEmpty(dto.ResId), x => x.Where(x => x.ResId == dto.ResId))
.If(!string.IsNullOrEmpty(dto.UnionId), x => x.Where(x => x.UnionId == dto.UnionId))
.If(!string.IsNullOrEmpty(dto.PayNo), x => x.Where(x => x.TradeNo == dto.PayNo));
var total = await query.CountAsync();
var data = await query
.OrderByDescending(x => x.CreateTime)
.Select(x => new BindListDto
{
Id = x.Id,
BindType = x.BindType,
PayType = x.PayType,
UnionId = x.UnionId,
PayNo = x.TradeNo,
Amount = x.TotalAmount,
ResId = x.ResId,
Remark = x.Remark,
EId = x.EId,
PayTime = x.CreateTime
})
.Skip((dto.PageIndex - 1) * dto.PageSize)
.Take(dto.PageSize)
.ToListAsync();
var resids = data.Select(x => x.ResId).ToList();
var customers = await _zxdRepository.GetRepository<RES_CUSTOMER>().Query().Where(x => resids.Contains(x.RESID)).ToListAsync();
foreach (var item in data)
{
item.ResId = customers.FirstOrDefault(x => x.RESID == item.ResId)?.UMID ?? "";
}
return new PageResult<BindListDto>(dto.PageIndex, dto.PageSize, total, data);
}
public async Task<BindListDto> GetBindDetailAsync(int? id)
{
var query = _zxdRepository.GetRepository<WX_SZZYORDER_BIND>().Query()
.Where(w => w.Id == id);
var data = await query
.Select(x => new BindListDto
{
BindType = x.BindType,
PayType = x.PayType,
UnionId = x.UnionId,
PayNo = x.TradeNo,
Amount = x.TotalAmount,
ResId = x.ResId,
Remark = x.Remark,
EId = x.EId,
PayTime = x.CreateTime
}).ToListAsync();
return data.FirstOrDefault();
}
public async Task<string> EditBindAsync(SearchBindListDto dto)
{
var one = await _zxdRepository.GetRepository<WX_SZZYORDER_BIND>().Query()
.Where(w => w.Id == dto.Id)
.FirstOrDefaultAsync();
if (one == null)
{
throw new ApiException("无效的id:" + dto.Id, 1);
}
//if (!string.IsNullOrEmpty(one.ResId))
//{
// throw new ApiException("已绑定过,不能再次绑定", 1);
//}
var orderCount = await _zxdRepository.GetRepository<WX_SZZYORDERDEPOSIT>().Query()
.Where(w => w.tradeno == one.TradeNo && w.auditstatus == 1 && w.isdelete == 0)
.CountAsync();
if (orderCount > 0)
{
throw new ApiException("已绑定过,不能再次绑定", 1);
}
one.ResId = dto.ResId;
one.Remark = dto.Remark;
one.BindType = 2;
await _zxdRepository.GetRepository<WX_SZZYORDER_BIND>().UpdateAsync(one);
await SyncOrderAsync(one, dto.ResId);
return "修改成功";
}
public async Task<string> BindAsync(BindOrderDto dto)
{
var channel = default(int?);
if (int.TryParse(dto.channel, out var channelTemp))
{
channel = channelTemp;
}
var payTime = default(DateTime?);
if (!string.IsNullOrEmpty(dto.payTime) && DateTime.TryParse(dto.payTime, out var payTimeTemp))
{
payTime = payTimeTemp;
}
var one = await _zxdRepository.GetRepository<WX_SZZYORDER_BIND>().Query()
.Where(w => w.TradeNo == dto.tradeNo)
.FirstOrDefaultAsync();
if (one != null)
{
//重复推送的只修改订单状态
one.TradeStatus = dto.tradeStatus;
await _zxdRepository.GetRepository<WX_SZZYORDER_BIND>().UpdateAsync(one);
}
else
{
//只处理交易成功的
if (dto.tradeStatus == 1 && payTime.HasValue)
{
var bindType = 0;
var resId = default(string);
var users = await GetUserSelectAsync(dto.unionId);
if (users.Count == 1)
{
bindType = 1;
resId = users.FirstOrDefault();
}
one = new WX_SZZYORDER_BIND();
one.PayType = dto.payType;
one.TradeNo = dto.tradeNo;
one.OutTradeNo = dto.outTradeNo;
one.UserTradeNo = dto.userTradeNo;
one.TotalAmount = 0.01m * dto.totalAmount.GetValueOrDefault();
one.TradeStatus = dto.tradeStatus;
one.UnionId = dto.unionId;
one.EId = dto.eId;
one.BindType = bindType;
one.ResId = resId ?? "";
one.CreateTime = payTime;
one.Channel = channel;
one.Remark = "";
one.IdentityKey = dto.identityKey;
await _zxdRepository.GetRepository<WX_SZZYORDER_BIND>().InsertAsync(one);
if (!string.IsNullOrEmpty(resId))
{
await SyncOrderAsync(one, resId);
}
}
}
return "绑定成功";
}
private async Task SyncOrderAsync(WX_SZZYORDER_BIND dto, string resId)
{
var url = await _cacheDomain.GetValueParameter("Core_ZxdService_OrderDeposit");
if (string.IsNullOrEmpty(url))
{
url = _payCallbackConfig.PushUrl;
}
var clientid = "UPWEBSITE";
var paytypename = "";
var paytype = 0;
switch (dto.PayType)
{
case "alipay":
{
paytypename = "支付宝";
paytype = 1;
break;
}
case "wechat":
{
paytypename = "微信支付";
paytype = 5;
break;
}
}
var param = new OrderDepositDto
{
source = "zxd",
channel = dto.Channel,
companycode = null,
creator = null,
creatorname = null,
deptcode = null,
id = 0,
isuse = 0,
orderid = null,
paydate = dto.CreateTime,
payname = "在线支付",
payno = dto.TradeNo,
payprice = dto.TotalAmount.GetValueOrDefault(),
paytype = paytype,
paytypename = paytypename,
remark = $"{dto.PayType},付款流水号:{dto.TradeNo}",
resid = resId,
tradeno = dto.TradeNo,
identityKey = dto.IdentityKey
};
var response = await _httpClient.PostSecurityAsync<retMsg>(url, param, new { }, clientid, _systemConfig.GetAccessKey(clientid));
if (!response.result)
{
throw new ApiException(JsonSerializer.Serialize(response), 3);
}
}
public async Task<List<string?>> GetUserSelectAsync(string unionId)
{
var data = new List<string?>();
if (string.IsNullOrEmpty(unionId))
{
return data;
}
var sql = "select Customerid from userinfo where unionId=@unionId limit 1";
var customerid = await _dbConnection.ExecuteScalarAsync<int?>(sql, new { unionId });
if (customerid.HasValue)
{
sql = "select Distinct(Resid) from userinfo where Customerid=@customerid";
var resIds = await _dbConnection.QueryAsync<string>(sql, new { customerid });
if (resIds != null && resIds.Any())
{
data.AddRange(resIds.Where(w => !string.IsNullOrEmpty(w)));
}
}
return data;
}
public async Task<string> GetUserItemAsync(string? resId)
{
if (string.IsNullOrEmpty(resId))
{
throw new ApiException("resId必填", 1);
}
var sql = "select count(1) from userinfo where Resid=@resId";
var count = await _dbConnection.ExecuteScalarAsync<long?>(sql, new { resId });
if (count.GetValueOrDefault() == 0)
{
throw new ApiException("无效的resId:" + resId, 1);
}
return "获取成功";
}
public async Task<bool> OrderChange(OrderChangeDto dto)
{
try
{
Log.Information($"接收【OrderChange】到数据{dto.ToJson()}");
var orderLog = _mapper.Map<OrderChangeDto, Wx_Szzyorder_log>(dto);
await _cmsRepository.GetRepository<Wx_Szzyorder_log>().InsertAsync(orderLog);
var obj = new ResPassTimeDto
{
ResId = dto.RESID
};
return await initResPassTime(obj);
}
catch (Exception ex)
{
Log.Error($"插入【OrderChange】日志失败{ex.Message}");
return false;
}
}
public async Task<bool> initResPassTime(ResPassTimeDto dto)
{
var consumers = KafkaClient.GetConsumers();
Log.Information($"consumers: {consumers.ToJson()}");
var obj = new ResPassTimeDto
{
ResId = dto.ResId
};
await KafkaClient.SendMessage(consumers.FirstOrDefault(n => n.Topic == "ResPassTime"), obj);
return true;
}
public async Task<List<SideOrderModel>> GetOrderListByEid(SearchSideOrderDto dto)
{
var userInfoList = await _userInfoDomain.GetUserInfos(null, dto.AppId, dto.AppUserId, "", "");
var resids = userInfoList.Where(n => !string.IsNullOrWhiteSpace(n.Resid)).Select(n => n.Resid).Distinct().ToList();
var dataList = await _zxdRepository.GetRepository<WX_SZZYORDER>().Query().Where(n => resids.Contains(n.RESID) && n.eid == dto.Eid).OrderByDescending(n => n.CTIME).ToListAsync();
List<SideOrderModel> res = new List<SideOrderModel>();
foreach (var item in dataList)
{
SideOrderModel side = new SideOrderModel
{
OrderId = item.ORDERID,
SzzyOrderId = item.SZZYORDERID.ToString(),
ProductName = item.SUBPRODUCTNAME,
ProductCode = item.PRODUCTCODE,
Opendays = item.OPENDAYS,
Giftdays = item.giftdays.HasValue ? item.giftdays.Value : item.giftdays2.HasValue ? (item.giftdays.Value + item.giftdays2.Value) : 0,
Ctime = item.CTIME,
Otime = item.OTIME,
OrderStatus = item.ORDERSTATUS,
OrderStatusName = item.ORDERSTATUSNAME,
};
res.Add(side);
}
return res;
}
/// <summary>
/// 导入赠送订单预览
/// </summary>
/// <param name="dto"></param>
/// <returns></returns>
public async Task<List<ImportGiftOrderViewModel>> ImportHandGiftPreview(List<ImportGiftOrderDto> dto)
{
List<ImportGiftOrderViewModel> res = new List<ImportGiftOrderViewModel>();
var orderids = dto.Select(n => Convert.ToDecimal(n.OrderId)).ToList();
var dataList = await _zxdRepository.GetRepository<WX_SZZYORDER>().Query().Where(n => orderids.Contains(n.ORDERID)).ToListAsync();
var productCode = dto.Select(n => n.ProductCode).Distinct().ToList();
var proList = await _zxdRepository.GetRepository<WxSzzySubproduct>().Query().Where(n => productCode.Contains(n.productcode)).ToListAsync();
foreach (var item in dto)
{
ImportGiftOrderViewModel model = new ImportGiftOrderViewModel
{
OrderId = item.OrderId,
Day = Convert.ToInt32(item.Day),
ProductCode = item.ProductCode
};
var orderid = Convert.ToDecimal(item.OrderId);
var order = dataList.FirstOrDefault(n => n.ORDERID == orderid);
if (order == null)
{
model.Msg += "找不到订单;";
}
else
{
model.Channel = order.CHANNEL;
model.Umid = order.UMID;
model.Name = order.CNAME;
model.UserName = order.SOFTUSERNAME;
}
if (model.Day <= 0)
{
model.Msg += "赠送天数不能小于0;";
}
var product = proList.FirstOrDefault(n => n.productcode == model.ProductCode);
if (product == null)
{
model.Msg += "找不到对应的产品;";
}
else
{
model.ProductName = product.subproductname;
}
if (!model.ProductCode.Contains("_MFTY"))
{
model.Msg += "只能赠送免费产品;";
}
res.Add(model);
}
return res;
}
}
}