using KJD_Web.Utils; using MAX.Core.Commons; using MAX.Core.DependencyInjection; using MAX.Core.Logger; using Store.Contracts.Order.Entitys; using Store.Contracts.Shops; using Store.Contracts.User.Entitys; using Store.Contracts.User.Interfaces; using Store.VirtualLogistics.Apis; using Store.VirtualLogistics.Entitys; using Store.VirtualLogistics.Models; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Store.VirtualLogistics.Services; public class VirtualLogisticsService : ITransientDependency { /// /// 固定费用1.7元->1.9元(260927涨价啦) /// const decimal FIXEDFEES = 1.9m; private IFreeSql _freeSql; private readonly ILoggerFacade _logger; private readonly IUserService _userService; private readonly VirtualLogisticsApi _api; public VirtualLogisticsService(VirtualLogisticsApi api, IFreeSql freeSql, ILoggerFacade logger, IUserService userService) { _freeSql = freeSql ?? throw new ArgumentNullException(nameof(freeSql)); _logger = logger; _userService = userService; _api = api; } /// /// 获取账户余额 /// public decimal GetUserMoney() { var user = _api.GetUserMoney(); return user.Money; } /// /// 获取快递列表 /// public List GetExpressList() { return _api.GetExpressList(); } /// /// 获取仓库列表及价格 /// public List GetCangList() { return _api.GetCangList(); } /// /// 获取礼品列表及价格 /// /// 快递ID,可选 public List GetGoodsList(string kuaidiId = null) { return _api.GetGoodsList(kuaidiId); } /// /// 购买快递 /// public List Buy(string userName, string orderId, string agentOrderId) { if (string.IsNullOrEmpty(orderId) || string.IsNullOrWhiteSpace(agentOrderId)) { throw new ArgumentNullException(nameof(orderId)); } var user = _userService.GetUserByUserName(userName); if (user == null) throw new Exception("错误的账号"); if (_userService.CanAfford(userName, Contracts.User.Enums.UserPaymentTypes.同步单号, FIXEDFEES) == false) { throw new Exception("余额不足"); } //中间订单 var middleOrder = _freeSql.Select() .Where(a => a.OrderSn == orderId) .First(); if (middleOrder == null) throw new Exception("错误的订单号"); //middleOrder.TrackingNumber = "YT0709726946568"; var w_order = _freeSql.Select() .Where(a => a.OrderId == middleOrder.WxOrderId) .First(); if (w_order == null) throw new Exception("错误的订单号"); var productItem = _freeSql.Select() .Where(a => a.OrderId == w_order.OrderId) .First(); if (productItem == null) throw new Exception("错误的订单详情号"); var shop = _freeSql.Select() .Where(a => a.Id == productItem.ShopId) .First(); if (shop == null) throw new Exception("错误的店铺"); //BuyRequest request = new BuyRequest() //{ // KuaidiId = "874", // GoodsId = "8473", // CangId = "914", // Platform = 6, // Auth = 1, // SendName = RandomNameHelper.GetRandomName(), // SendMobile = "13024622251", // SendProvince = "上海市", // SendCity = "上海市", // SendDistrict = "普陀区", // SendAddress = "真如镇街道真北路2653弄F区808号楼", // RecList = [ // new RecItem // { // OrderSn = orderId, // ShopOrder =w_order.OrderId, // RecName = w_order.UserName, // RecMobile = w_order.TelNumber, // RecProvince = w_order.ProvinceName, // RecCity = w_order.CityName, // RecDistrict = w_order.CountyName, // RecAddress = w_order.DetailInfo, // EwaybillOrderCode="wx7809625286c28f2f", // EncryptDatas=new EncryptDatas // { // DsOrderId=agentOrderId, // SkuId = productItem.SkuId, // ProductId = productItem.ProductId, // SkuCnt = productItem.SkuCnt, // FromShopCode = shop.AppKey, // }, // ExtendParams=new ExtendParams{ // Token="", // Api="", // DsOrderId =agentOrderId // }, // OtherKuaidiSn= middleOrder.TrackingNumber, // } // ] //}; Result> ret = _buyTrackingNumber(orderId, agentOrderId, shop.AppKey, middleOrder.TrackingNumber, w_order, productItem, true); if (ret.Success == false) { _logger.Error($"购买同步单错误:{ret.Msg}"); throw new Exception("购买同步单失败"); } List yhSyncs = new List(); foreach (var sync in ret.Data) { if (string.IsNullOrEmpty(sync.KuaidiSn)) { throw new Exception($"获取快递单号为空,Status:{sync.Status}"); } yhSyncs.Add(new YhSyncLogisticsEntity { OrderId = orderId, OrderSN = sync.OrderSn, TrackingNumber = sync.KuaidiSn, SourceTrackingNumber = sync.OtherKuaidiSn }); } var count = _freeSql.Insert(yhSyncs).ExecuteAffrows(); if (count != yhSyncs.Count) { _logger.Error("购买同步单提交到数据库错误"); throw new Exception("记录同步单失败"); } //todo 更新UserBlance _userService.UserPayment(user.UserName, orderId, type: Contracts.User.Enums.UserPaymentTypes.同步单号); return yhSyncs; } /// /// 购买同步物流 /// /// /// /// /// /// /// /// 是否二次校验OrderSN是否重复 true 更换OrderSN, fals直接返回内容 /// /// private Result> _buyTrackingNumber(string orderSN, string agentOrderId, string shopAppkey, string sourceTrackingNumber, WeiOrderEntity w_order, WeiOrderItemEntity productItem, bool isTestingRepeat = false) { BuyRequest request = new BuyRequest() { KuaidiId = "874", GoodsId = "8473", CangId = "914", Platform = 6, Auth = 1, SendName = RandomNameHelper.GetRandomName(), SendMobile = "13024622251", SendProvince = "上海市", SendCity = "上海市", SendDistrict = "普陀区", SendAddress = "真如镇街道真北路2653弄F区808号楼", RecList = [ new RecItem { OrderSn = orderSN, ShopOrder =w_order.OrderId, RecName = w_order.UserName, RecMobile = w_order.TelNumber, RecProvince = w_order.ProvinceName, RecCity = w_order.CityName, RecDistrict = w_order.CountyName, RecAddress = w_order.DetailInfo, EwaybillOrderCode="wx7809625286c28f2f", EncryptDatas=new EncryptDatas { DsOrderId=agentOrderId, SkuId = productItem.SkuId, ProductId = productItem.ProductId, SkuCnt = productItem.SkuCnt, FromShopCode = shopAppkey, }, ExtendParams=new ExtendParams{ Token="", Api="", DsOrderId =agentOrderId }, OtherKuaidiSn= sourceTrackingNumber, } ] }; Result> ret = _api.Buy(request); if (ret.Success == false) { if (ret.Msg.Contains("order_sn重复") && isTestingRepeat) //检测重复 替换orderSN { string temporderSN = $"{orderSN}_{RandomUtils.GetNumber(5)}"; ret = _buyTrackingNumber(temporderSN, agentOrderId, shopAppkey, sourceTrackingNumber, w_order, productItem, false); } } if (ret.Success == false) { _logger.Error($"购买同步单错误:{ret.Msg} {orderSN}"); throw new Exception("购买同步单失败"); } return ret; } /// /// 上传取件码 /// public bool UploadPickup(string userName, string orderId, string pickupCode) { var user = _userService.GetUserByUserName(userName); if (user == null) throw new Exception("错误的账号"); var syncLogistics = _freeSql.Select() .Where(a => a.OrderId == orderId) .First(); if (syncLogistics == null) throw new Exception("错误的订单号"); var ret = _api.UploadPickup(new List { new PickupItem { BufaSn = syncLogistics.SourceTrackingNumber, PickupCode = pickupCode } }); syncLogistics.pickup_code = pickupCode; syncLogistics.upload_pickup_Time = DateTime.Now; syncLogistics.upload_pickup_status = ret.Success; if (ret.Success == false) { string msg = $"推送取件码失败:{ret.Msg}"; syncLogistics.Remark = msg; _logger.Error(msg); throw new Exception("推送取件码失败"); } var affrows = _freeSql.Update() .Set(a => a.pickup_code, syncLogistics.pickup_code) .Set(a => a.upload_pickup_Time, syncLogistics.upload_pickup_Time) .Set(a => a.upload_pickup_status, syncLogistics.upload_pickup_status) .Set(a => a.Remark, syncLogistics.Remark) .Where(a => a.Id == syncLogistics.Id) .ExecuteAffrows(); if (affrows != 1) { _logger.Error("取件码保存错误"); throw new Exception("取件码保存错误"); } return true; } public YhSyncLogisticsEntity GetSyncLogistics(string orderId) { var item = _freeSql.Select() .Where(a => a.OrderId == orderId).First(); return item; } public List GetOrderStatus(string[] orders) { var ret = _api.GetOrderStatus(orders); if (ret.Success) { return ret.Data; } throw new Exception(ret.Msg); } }