using NCC.Common.Core.Manager;
using NCC.Common.Enum;
using NCC.Common.Extension;
using NCC.Common.Filter;
using NCC.Dependency;
using NCC.DynamicApiController;
using NCC.FriendlyException;
using NCC.Order.Interfaces.BaseOrder;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using NCC.Order.Entitys;
using NCC.Order.Entitys.Dto.BaseOrder;
using Yitter.IdGenerator;
using NCC.Common.Helper;
using NCC.JsonSerialization;
using NCC.Common.Model.NPOI;
using NCC.Common.Configuration;
using NCC.DataEncryption;
using NCC.ClayObject;
using NCC.System.Interfaces.System;
using Antis.Pay.Core.Interface;
using Antis.Pay.Core.Model;
using Microsoft.AspNetCore.Mvc;
using Serilog;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Authorization;
using NCC.System.Entitys.Permission;
using Microsoft.Extensions.Logging;
using NCC.Common.Extensions;
using NCC.EventBridge;
using NCC.Order.Interfaces.BaseProduct;
using NCC.Code.QrCode;
using NCC.Order.Entitys.Dto.BaseProduct;
using NCC.Order.Interfaces.BaseAmountHistory;
using NCC.Core.Pay.WeChatPay.V2.Request;
using NCC.Core.Pay.WeChatPay.V2;
using NCC.Core.Pay.WeChatPay;
using Microsoft.Extensions.Options;
using NCC.Core.Pay.WeChatPay.V2.Notify;
using NCC.Food.Entitys.Enum;
using NCC.Frends.Entitys;
using Spire.Presentation;
using NCC.System.Entitys.Model.Permission.User;
namespace NCC.Order.BaseOrder
{
///
/// 订单模块服务
///
[ApiDescriptionSettings(Tag = "订单模块", Name = "BaseOrder", Order = 200)]
[Route("api/Order/[controller]")]
public class BaseOrderService : IBaseOrderService, IDynamicApiController, ITransient
{
private readonly ISqlSugarRepository _baseOrderRepository;
private readonly IDbLinkService _dbLinkService;
private readonly IDataBaseService _dataBaseService;
private readonly SqlSugarScope _db;
private readonly IUserManager _userManager;
private readonly IWePay _wepay;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly ILogger _logger;
private readonly IBaseProductService _iProductService;
private readonly IWeChatPayNotifyClient _notifylient;
private readonly IWeChatPayClient _client;
private readonly IOptions _optionsAccessor;
///
/// 初始化一个类型的新实例
///
public BaseOrderService(
ISqlSugarRepository baseOrderRepository,
IDbLinkService dbLinkService,
IDataBaseService dataBaseService,
IUserManager userManager,
IWePay wePay,
IHttpContextAccessor httpContextAccessor,
ILogger logger
, IBaseProductService iProductService,
IWeChatPayNotifyClient notifylient,
IWeChatPayClient client,
IOptions optionsAccessor)
{
_baseOrderRepository = baseOrderRepository;
_db = _baseOrderRepository.Context;
_dbLinkService = dbLinkService;
_dataBaseService = dataBaseService;
_userManager = userManager;
_wepay = wePay;
_httpContextAccessor = httpContextAccessor;
_logger = logger;
_iProductService = iProductService;
_notifylient = notifylient;
_client = client;
_optionsAccessor = optionsAccessor;
}
///
/// 获取订单模块
///
/// 参数
///
[HttpGet("{id}")]
public async Task GetInfo(string id)
{
var dbLink = await _dbLinkService.GetInfo("218239598550058245");
_db.AddConnection(new ConnectionConfig()
{
ConfigId = dbLink.Id,
DbType = _dataBaseService.ToDbType(dbLink.DbType),
ConnectionString = _dataBaseService.ToConnectionString(dbLink),
InitKeyType = InitKeyType.Attribute,
IsAutoCloseConnection = true
});
_db.ChangeDatabase(dbLink.Id);
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
var output = entity.Adapt();
output.product = _iProductService.GetInfo(output.productId).GetAwaiter().GetResult();
//output.coupon = _db.Queryable().FirstAsync(o => o.OrderId == entity.Id).Adapt();
return output;
}
///
/// 检测订单是否支付
///
///
///
[HttpGet("CheckOrderPay")]
public async Task CheckOrderPay(string id)
{
var isOk = await _db.Queryable().AnyAsync(p => p.Id == id && p.PayStatus == Entitys.Enum.OrderStatus.Yes.GetHashCode());
if (isOk)
{
return await GetInfo(id);
}
return false;
}
///
/// 获取订单模块列表
///
/// 请求参数
///
[HttpGet("")]
public async Task GetList([FromQuery] BaseOrderListQueryInput input)
{
var dbLink = await _dbLinkService.GetInfo("218239598550058245");
_db.AddConnection(new ConnectionConfig()
{
ConfigId = dbLink.Id,
DbType = _dataBaseService.ToDbType(dbLink.DbType),
ConnectionString = _dataBaseService.ToConnectionString(dbLink),
InitKeyType = InitKeyType.Attribute,
IsAutoCloseConnection = true
});
_db.ChangeDatabase(dbLink.Id);
var user = await _userManager.GetUserInfo();
var sidx = input.sidx == null ? "orderTime" : input.sidx;
List queryOrderTime = input.orderTime != null ? input.orderTime.Split(',').ToObeject>() : null;
DateTime? startOrderTime = queryOrderTime != null ? Ext.GetDateTime(queryOrderTime.First()) : null;
DateTime? endOrderTime = queryOrderTime != null ? Ext.GetDateTime(queryOrderTime.Last()) : null;
var data = await _db.Queryable((p, u, pd) =>
p.ProductId == pd.Id && p.CreatorUserId == u.Id)
.WhereIF(!string.IsNullOrEmpty(input.title), p => p.Title.Contains(input.title))
.WhereIF(!string.IsNullOrEmpty(input.orderNumber), p => p.OrderNumber.Contains(input.orderNumber))
.WhereIF(queryOrderTime != null, p => p.OrderTime >= new DateTime(startOrderTime.ToDate().Year, startOrderTime.ToDate().Month, startOrderTime.ToDate().Day, 0, 0, 0))
.WhereIF(queryOrderTime != null, p => p.OrderTime <= new DateTime(endOrderTime.ToDate().Year, endOrderTime.ToDate().Month, endOrderTime.ToDate().Day, 23, 59, 59))
.WhereIF(!string.IsNullOrEmpty(input.money), p => p.Money.Equals(input.money))
.WhereIF(!input.status.IsNullOrEmpty(), p => p.Status.Equals(input.status))
.WhereIF(!string.IsNullOrEmpty(input.mark), p => p.Mark.Contains(input.mark))
.WhereIF(!string.IsNullOrEmpty(input.payType), p => p.PayType.Contains(input.payType))
.WhereIF(!string.IsNullOrEmpty(input.creatorUserId), p => p.CreatorUserId.Equals(input.creatorUserId))
//.WhereIF(!PubUserEx.AdminUsers.Contains(user.userAccount), p => p.CreatorUserId == user.userId)
.Select((p, u, pd) => new BaseOrderListOutput
{
id = p.Id,
title = p.Title,
orderNumber = p.OrderNumber,
orderTime = p.OrderTime,
money = p.Money,
productId = p.ProductId,
productName = pd.Title,
status = p.Status,
ip = p.Ip,
mark = p.Mark,
source = p.Source,
payType = p.PayType,
thirdPartyOrderNo = p.ThirdPartyOrderNo,
creatorTime = p.CreatorTime,
creatorUserId = p.CreatorUserId,
lastModifyUserId = p.LastModifyUserId,
lastModifyTime = p.LastModifyTime,
description = p.Description,
productTitle = pd.Title,
userFullName = u.RealName,
amount = p.Amount,
images = pd.Images,
phone = u.MobilePhone
}).MergeTable().OrderBy(sidx + " " + input.sort).ToPagedListAsync(input.currentPage, input.pageSize);
return PageResult.SqlSugarPageResult(data);
}
///
/// 新建订单模块V1
///
/// 参数
///
[HttpPost("")]
public async Task Create([FromBody] BaseOrderCrInput input)
{
var dbLink = await _dbLinkService.GetInfo("218239598550058245");
_db.AddConnection(new ConnectionConfig()
{
ConfigId = dbLink.Id,
DbType = _dataBaseService.ToDbType(dbLink.DbType),
ConnectionString = _dataBaseService.ToConnectionString(dbLink),
InitKeyType = InitKeyType.Attribute,
IsAutoCloseConnection = true
});
_db.ChangeDatabase(dbLink.Id);
var userInfo = await _userManager.GetUserInfo();
var entity = input.Adapt();
entity.Id = YitIdHelper.NextId().ToString();
entity.CreatorTime = DateTime.Now;
entity.CreatorUserId = _userManager.UserId;
var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1000);
}
///
/// 获取订单模块无分页列表
///
/// 请求参数
///
[NonAction]
public async Task GetNoPagingList([FromQuery] BaseOrderListQueryInput input)
{
var dbLink = await _dbLinkService.GetInfo("218239598550058245");
_db.AddConnection(new ConnectionConfig()
{
ConfigId = dbLink.Id,
DbType = _dataBaseService.ToDbType(dbLink.DbType),
ConnectionString = _dataBaseService.ToConnectionString(dbLink),
InitKeyType = InitKeyType.Attribute,
IsAutoCloseConnection = true
});
_db.ChangeDatabase(dbLink.Id);
var sidx = input.sidx == null ? "orderTime" : input.sidx;
List queryOrderTime = input.orderTime != null ? input.orderTime.Split(',').ToObeject>() : null;
DateTime? startOrderTime = queryOrderTime != null ? Ext.GetDateTime(queryOrderTime.First()) : null;
DateTime? endOrderTime = queryOrderTime != null ? Ext.GetDateTime(queryOrderTime.Last()) : null;
var data = await _db.Queryable()
.WhereIF(!string.IsNullOrEmpty(input.title), p => p.Title.Contains(input.title))
.WhereIF(!string.IsNullOrEmpty(input.orderNumber), p => p.OrderNumber.Contains(input.orderNumber))
.WhereIF(queryOrderTime != null, p => p.OrderTime >= new DateTime(startOrderTime.ToDate().Year, startOrderTime.ToDate().Month, startOrderTime.ToDate().Day, 0, 0, 0))
.WhereIF(queryOrderTime != null, p => p.OrderTime <= new DateTime(endOrderTime.ToDate().Year, endOrderTime.ToDate().Month, endOrderTime.ToDate().Day, 23, 59, 59))
.WhereIF(!string.IsNullOrEmpty(input.money), p => p.Money.Equals(input.money))
.WhereIF(!input.status.IsNullOrEmpty(), p => p.Status.Equals(input.status))
.WhereIF(!string.IsNullOrEmpty(input.mark), p => p.Mark.Contains(input.mark))
.WhereIF(!string.IsNullOrEmpty(input.payType), p => p.PayType.Contains(input.payType))
.WhereIF(!string.IsNullOrEmpty(input.creatorUserId), p => p.CreatorUserId.Equals(input.creatorUserId))
.Select(it => new BaseOrderListOutput
{
id = it.Id,
title = it.Title,
orderNumber = it.OrderNumber,
orderTime = it.OrderTime,
money = it.Money,
productId = it.ProductId,
status = it.Status,
ip = it.Ip,
mark = it.Mark,
source = it.Source,
payType = it.PayType,
thirdPartyOrderNo = it.ThirdPartyOrderNo,
creatorTime = it.CreatorTime,
creatorUserId = it.CreatorUserId,
lastModifyUserId = it.LastModifyUserId,
lastModifyTime = it.LastModifyTime,
description = it.Description,
}).MergeTable().OrderBy(sidx + " " + input.sort).ToListAsync();
return data;
}
///
/// 导出订单模块V1
///
/// 请求参数
///
[HttpGet("Actions/Export")]
public async Task Export([FromQuery] BaseOrderListQueryInput input)
{
var userInfo = await _userManager.GetUserInfo();
var exportData = new List();
if (input.dataType == 0)
{
var data = Clay.Object(await this.GetList(input));
exportData = data.Solidify>().list;
}
else
{
exportData = await this.GetNoPagingList(input);
}
List paramList = "[{\"value\":\"订单标题\",\"field\":\"title\"},{\"value\":\"系统订单编号\",\"field\":\"orderNumber\"},{\"value\":\"下单时间\",\"field\":\"orderTime\"},{\"value\":\"订单金额\",\"field\":\"money\"},{\"value\":\"产品ID\",\"field\":\"productId\"},{\"value\":\"订单状态\",\"field\":\"status\"},{\"value\":\"下单IP\",\"field\":\"ip\"},{\"value\":\"卖家备注\",\"field\":\"mark\"},{\"value\":\"订单来源\",\"field\":\"source\"},{\"value\":\"支付方式\",\"field\":\"payType\"},{\"value\":\"三方订单号\",\"field\":\"thirdPartyOrderNo\"},{\"value\":\"描述\",\"field\":\"description\"},{\"value\":\"创建用户\",\"field\":\"creatorUserId\"},{\"value\":\"创建时间\",\"field\":\"creatorTime\"},{\"value\":\"修改用户\",\"field\":\"lastModifyUserId\"},{\"value\":\"修改时间\",\"field\":\"lastModifyTime\"},]".ToList();
ExcelConfig excelconfig = new ExcelConfig();
excelconfig.FileName = "订单模块V1.xls";
excelconfig.HeadFont = "微软雅黑";
excelconfig.HeadPoint = 10;
excelconfig.IsAllSizeColumn = true;
excelconfig.ColumnModel = new List();
List selectKeyList = input.selectKey.Split(',').ToList();
foreach (var item in selectKeyList)
{
var isExist = paramList.Find(p => p.field == item);
if (isExist != null)
{
excelconfig.ColumnModel.Add(new ExcelColumnModel() { Column = isExist.field, ExcelColumn = isExist.value });
}
}
var addPath = FileVariable.TemporaryFilePath + excelconfig.FileName;
ExcelExportHelper.Export(exportData, excelconfig, addPath);
var fileName = _userManager.UserId + "|" + addPath + "|xls";
var output = new
{
name = excelconfig.FileName,
url = "/api/File/Download?encryption=" + DESCEncryption.Encrypt(fileName, "NCC")
};
return output;
}
///
/// 更新订单模块V1
///
/// 主键
/// 参数
///
[HttpPut("{id}")]
public async Task Update(string id, [FromBody] BaseOrderUpInput input)
{
var dbLink = await _dbLinkService.GetInfo("218239598550058245");
_db.AddConnection(new ConnectionConfig()
{
ConfigId = dbLink.Id,
DbType = _dataBaseService.ToDbType(dbLink.DbType),
ConnectionString = _dataBaseService.ToConnectionString(dbLink),
InitKeyType = InitKeyType.Attribute,
IsAutoCloseConnection = true
});
_db.ChangeDatabase(dbLink.Id);
var entity = input.Adapt();
entity.LastModifyUserId = _userManager.UserId;
entity.LastModifyTime = DateTime.Now;
var isOk = await _db.Updateable(entity).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1001);
}
///
/// 删除订单模块
///
///
[HttpDelete("{id}")]
public async Task Delete(string id)
{
var dbLink = await _dbLinkService.GetInfo("218239598550058245");
_db.AddConnection(new ConnectionConfig()
{
ConfigId = dbLink.Id,
DbType = _dataBaseService.ToDbType(dbLink.DbType),
ConnectionString = _dataBaseService.ToConnectionString(dbLink),
InitKeyType = InitKeyType.Attribute,
IsAutoCloseConnection = true
});
_db.ChangeDatabase(dbLink.Id);
var entity = await _db.Queryable().FirstAsync(p => p.Id == id);
_ = entity ?? throw NCCException.Oh(ErrorCode.COM1005);
var isOk = await _db.Deleteable().Where(d => d.Id == id).ExecuteCommandAsync();
if (!(isOk > 0)) throw NCCException.Oh(ErrorCode.COM1002);
}
#region 下单
///
/// 下单
///
/// 下单参数
///
[HttpPost("AddOrder")]
public async Task AddOrder([FromBody] BaseOrderCrInput input)
{
#region 下单前处理
var product = await _db.Queryable().FirstAsync(o => o.Id == input.productId);
if (product == null) throw NCCException.Oh($"产品信息未找到!");
//if (product.ValidEnd < DateTime.Now) throw NCCException.Oh($"产品有效期已过!");
BaseOrderUnOrderResult result = new BaseOrderUnOrderResult();
var httpContext = _httpContextAccessor.HttpContext;
var ip = httpContext.GetRemoteIpAddressToIPv4();
var userInfo = await _userManager.GetUserInfo();
var entity = input.Adapt();
entity.Id = entity.OrderNumber = YitIdHelper.NextId().ToString();
entity.Ip = ip;
entity.Title = product.Title;
entity.CreatorTime = DateTime.Now;
entity.CreatorUserId = _userManager.UserId;
entity.Status = Entitys.Enum.OrderStatus.No;
//entity.OpenId = userInfo.openId;
entity.OrderTime = DateTime.Now;
#endregion
#region 计算订单金额 单价* 数量
if (input.amount < 1) input.amount = 1;
entity.Amount = input.amount;
entity.Price = product.Price;
entity.Money = entity.Price * entity.Amount;
#endregion
//entity.Money = decimal.Parse("0.01");
#region 下单过程
if (entity.Money <= 0)
{
throw NCCException.Oh(ErrorCode.Order1000);
}
_db.ScopedContext.BeginTran();
//添加订单
try
{
var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
if (!(isOk > 0))
{
throw NCCException.Oh(ErrorCode.Order1000);
}
else
{
result = entity.Adapt();
//result.data = _wepay.BuildWePay(entity.OpenId, entity.OrderNumber, product.Title, _wepay.GetMoneyYuanToFen(entity.Money), ip, Antis.Pay.Core.Enum.EnumWePayTradeType.JSAPI).ToObject();
var request = new WeChatPayUnifiedOrderRequest
{
Body = product.Title,
OutTradeNo = entity.OrderNumber,
TotalFee = entity.Money.GetMoneyYuanToFen(),
SpBillCreateIp = ip,
NotifyUrl = _optionsAccessor.Value.NotifyUrl,
TradeType = "JSAPI",
OpenId = userInfo.openId
};
var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
{
//var req = new WeChatPayAppSdkRequest
//{
// PrepayId = response.PrepayId
//};
var req = new WeChatPayMiniProgramSdkRequest
{
Package = "prepay_id=" + response.PrepayId
};
var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
result.data = parameter;
}
}
_db.ScopedContext.CommitTran();
}
catch (Exception ex)
{
_logger.LogInformation($"下单异常:{ex.Message}");
_db.ScopedContext.RollbackTran();
}
return result;
#endregion
}
///
/// 充值
///
/// 金额
///
[HttpPost("recharge")]
public async Task Recharge(decimal money)
{
#region 下单前处理
if (money <= 0) throw NCCException.Oh($"金额不能小于等于0!");
BaseOrderUnOrderResult result = new BaseOrderUnOrderResult();
var httpContext = _httpContextAccessor.HttpContext;
var ip = httpContext.GetRemoteIpAddressToIPv4();
var userInfo = await _userManager.GetUserInfo();
var entity = new BaseOrderEntity();
entity.Id = entity.OrderNumber = YitIdHelper.NextId().ToString();
entity.Ip = ip;
entity.Title = "充值";
entity.CreatorTime = DateTime.Now;
entity.CreatorUserId = _userManager.UserId;
entity.Status = Entitys.Enum.OrderStatus.No;
//entity.OpenId = userInfo.openId;
entity.OrderTime = DateTime.Now;
#endregion
#region 计算订单金额 单价* 数量
entity.Amount = 1;
entity.Price = money;
entity.Money = money;
//entity.Money = decimal.Parse("0.01");
#endregion
//entity.Money = decimal.Parse("0.01");
#region 下单过程
//if (entity.OpenId.IsNullOrEmpty() || entity.Money <= 0)
//{
// throw NCCException.Oh(ErrorCode.Order1000);
//}
_db.ScopedContext.BeginTran();
//添加订单
try
{
var isOk = await _db.Insertable(entity).IgnoreColumns(ignoreNullColumn: true).ExecuteCommandAsync();
if (!(isOk > 0))
{
throw NCCException.Oh(ErrorCode.Order1000);
}
else
{
result = entity.Adapt();
var request = new WeChatPayUnifiedOrderRequest
{
Body = "充值",
OutTradeNo = entity.OrderNumber,
TotalFee = entity.Money.GetMoneyYuanToFen(),
SpBillCreateIp = ip,
NotifyUrl = _optionsAccessor.Value.NotifyUrl,
TradeType = "APP"
};
var response = await _client.ExecuteAsync(request, _optionsAccessor.Value);
if (response.ReturnCode == WeChatPayCode.Success && response.ResultCode == WeChatPayCode.Success)
{
var req = new WeChatPayAppSdkRequest
{
PrepayId = response.PrepayId
};
var parameter = await _client.ExecuteAsync(req, _optionsAccessor.Value);
result.data = parameter;
}
}
_db.ScopedContext.CommitTran();
}
catch (Exception ex)
{
_logger.LogInformation($"下单异常:{ex.Message}");
_db.ScopedContext.RollbackTran();
}
return result;
#endregion
}
#endregion
#region 支付回调
///
/// 支付后回调处理
///
///
[HttpGet("Unifiedorder"), HttpPost("Unifiedorder")]
[AllowAnonymous]
public async Task Unifiedorder()
{
_logger.LogInformation($"进入支付回调");
try
{
var notify = await _notifylient.ExecuteAsync(_httpContextAccessor.HttpContext.Request, _optionsAccessor.Value);
_logger.LogInformation("统一下单支付结果通知 => OutTradeNo: " + notify.OutTradeNo);
if (notify.ReturnCode == WeChatPayCode.Success)
{
_logger.LogInformation("统一下单支付成功: " + notify.OutTradeNo);
if (ChangeOrderStatus(notify.OutTradeNo, Entitys.Enum.OrderStatus.Yes).GetAwaiter().GetResult())
return WeChatPayNotifyResult.Success;
else return WeChatPayNotifyResult.Failure;
}
return WeChatPayNotifyResult.Failure;
}
catch (WeChatPayException ex)
{
_logger.LogWarning("出现异常: " + ex.Message);
return WeChatPayNotifyResult.Failure;
}
}
///
/// 获取当前用户所有剩余匹配次数
///
///
[HttpGet("GetMatchOverCount")]
public int GetMatchOverCount()
{
//return App.GetService().GetMatchOverCount();
string UserId = _userManager.UserId;
var matchCount = _db.Queryable().Where(o => o.Id == UserId).Select(o => o.ExtensionLong).First();
return decimal.ToInt32(matchCount);
}
///
/// 扣减用户匹配次数
///
///
[NonAction]
public async Task DeductionCount(string userId, int matchCount = 1)
{
try
{
var count = _db.Queryable().Where(o => o.Id == userId).Select(o => o.ExtensionLong).First();
if (count >= matchCount)
count -= count;
else
{
return false;
}
await _db.Updateable().SetColumns(o => o.ExtensionLong == count).Where(o => o.Id == userId).ExecuteCommandAsync();
return true;
}
catch (Exception ee)
{
Log.Information($" 增加用户匹配次数失败 {ee.Message}");
}
return false;
}
///
/// 扣减用户匹配次数
///
///
[NonAction]
public async Task DeductionCountHistory(string userId, int matchCount = 1)
{
try
{
var history = _db.Queryable()
.Where(u =>
u.UserId == userId
&& u.Status == PriceStatus.可用.GetHashCode()
&& u.Source == MoneyHistoryType.匹配次数.ToString()
)
.Select(o => o.Id)
.First();
if (history != null)
{
await _db.Updateable()
.SetColumns(o => o.Status == PriceStatus.使用.GetHashCode())
.Where(o => o.Id == history)
.ExecuteCommandAsync();
return true;
}
else
{
return false;
}
}
catch (Exception ee)
{
Log.Information($" 扣减匹配次数失败 {ee.Message}");
}
return false;
}
///
/// 清除过期的匹配次数
///
///
[HttpPost("ClearTimeOutMatchCount")]
public async Task ClearTimeOutMatchCount()
{
try
{
await _db.Updateable()
.SetColumns(o => o.Status == PriceStatus.无效.GetHashCode())
.Where(o => !SqlFunc.IsNullOrEmpty(o.ValidEnd) && SqlFunc.GetDate() > o.ValidEnd)
.ExecuteCommandAsync();
}
catch (Exception ee)
{
Log.Information($" 扣减匹配次数失败 {ee.Message}");
}
return false;
}
///
/// 支付后回调处理
///
///
[HttpGet("WePayNotify"), HttpPost("WePayNotify")]
[AllowAnonymous]
public string WePayNotify()
{
_logger.LogInformation($"进入支付回调");
WePayReturnModel payResult = new WePayReturnModel();
//支付成功
if (_wepay.VerifyNotify(out payResult))
{
_logger.LogInformation($"支付回调验证成功 payResult={payResult.ToJson()}");
if (ChangeOrderStatus(payResult.OutTradeNo, Entitys.Enum.OrderStatus.Yes).GetAwaiter().GetResult())
return _wepay.GetReturnXml("SUCCESS", "OK");
else return _wepay.GetReturnXml("FAIL", "ERROR");
}
else
{
_logger.LogInformation($"支付回调验证失败 payResult={payResult.ToJson()}");
return _wepay.GetReturnXml("FAIL", "ERROR");
}
}
///
/// 支付后回调处理
///
///
[HttpGet("WePayNavNotify"), HttpPost("WePayNavNotify")]
[AllowAnonymous]
public string WePayNavNotify()
{
_logger.LogInformation($"进入扫码支付回调");
WePayReturnModel payResult = new WePayReturnModel();
//支付成功
if (_wepay.VerifyNotify(out payResult))
{
_logger.LogInformation($"扫码支付回调验证成功 payResult={payResult.ToJson()}");
if (ChangeOrderStatus(payResult.OutTradeNo, Entitys.Enum.OrderStatus.Yes).GetAwaiter().GetResult())
return _wepay.GetReturnXml("SUCCESS", "OK");
else return _wepay.GetReturnXml("FAIL", "ERROR");
}
else
{
_logger.LogInformation($"支付回调验证失败 payResult={payResult.ToJson()}");
return _wepay.GetReturnXml("FAIL", "ERROR");
}
}
///
/// 修改订单状态
///
///
///
///
///
[HttpPost("ChangeOrderStatus")]
public async Task ChangeOrderStatus(string orderid, Entitys.Enum.OrderStatus status, string tag = "回调")
{
_logger.LogInformation($"Order ChangeOrderStatus orderid={orderid} status={status.GetHashCode()}");
var order = await _db.Queryable().FirstAsync(o => o.OrderNumber == orderid); // && o.Status == Entitys.Enum.OrderStatus.No
if (order != null)
{
if (tag == "回调" && order.Status != Entitys.Enum.OrderStatus.No)
{
return true;//已处理过 直接成功
}
//修改订单状态为 已支付
_logger.LogInformation($"开始事务处理");
_db.BeginTran();
try
{
if (!order.ProductId.IsNullOrEmpty())
{
//decimal zhuanshi = order.Money;
//try
//{
// if (order.Money == 100) zhuanshi = 110;
// if (order.Money == 200) zhuanshi = 230;
// if (order.Money == 400) zhuanshi = 450;
//}
//catch (Exception)
//{
//}
if (order.Source == "匹配")
{
_db.Updateable()
.SetColumns(x => x.OrderNo == order.Id)
.Where(x => x.Id == order.ProductId)
.ExecuteCommand();
}
else
{
//增加匹配次数 临时用
var product = _db.Queryable().Where(o => o.Id == order.ProductId).First();
if (product != null && product.Discount > 0)
{
try
{
var matchCount = _db.Queryable().Where(o => o.Id == order.CreatorUserId).Select(o => o.ExtensionLong).First();
matchCount += decimal.ToInt32(product.Discount);
await _db.Updateable().SetColumns(o => o.ExtensionLong == matchCount).Where(o => o.Id == order.CreatorUserId).ExecuteCommandAsync();
}
catch (Exception ee)
{
Log.Information($" 增加用户匹配次数失败 {ee.Message}");
}
App.GetService().UserMatchCountAccount(order.Id);
}
}
#region MyRegion
//#region 是充值的情况
////增加充值记录
//await _db.Insertable(new BaseAmountHistoryEntity()
//{
// CreatorTime = DateTime.Now,
// Id = YitIdHelper.NextId().ToString(),
// Money = order.Money,
// OrderId = orderid,
// ProductId = "",
// Source = MoneyHistoryType.充值.ToString(),
// Status = PriceStatus.可用.GetHashCode(),
// UserId = order.CreatorUserId,
//}).ExecuteCommandAsync();
////增加砖石
//await _db.Insertable(new BaseAmountHistoryEntity()
//{
// CreatorTime = DateTime.Now,
// Id = YitIdHelper.NextId().ToString(),
// Money = zhuanshi, //order.Money * 10
// OrderId = orderid,
// ProductId = "",
// Source = MoneyHistoryType.砖石.ToString(),
// Status = PriceStatus.可用.GetHashCode(),
// UserId = order.CreatorUserId,
//}).ExecuteCommandAsync();
//#endregion
#endregion
}
int update = _db.Updateable(
new BaseOrderEntity
{
Status = Entitys.Enum.OrderStatus.Yes,
PayStatus = Entitys.Enum.OrderStatus.Yes.GetHashCode()
})
.UpdateColumns(
it => new
{
it.Status,
it.PayStatus
}
)
.Where(o => o.Id == order.Id)
.ExecuteCommand();
_logger.LogInformation($"{tag} 订单 状态修改 为已支付{(update > 0 ? "成功" : "失败")}");
order.Status = Entitys.Enum.OrderStatus.Yes;
_db.CommitTran();
//if (product)
}
catch (Exception ex)
{
_logger.LogInformation($"{tag} 订单 状态修改失败 消息:{ex.Message}");
_db.RollbackTran();
}
return true;
}
else
{
_logger.LogInformation($" {tag} 订单 状态修改 信息失败 信息未找到 订单号={orderid}!");
return false;
}
}
#endregion
}
}