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 } }