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
{
orderSN = orderSN + "_1";//只重复一次
ret = _buyTrackingNumber(orderSN, agentOrderId, shopAppkey, sourceTrackingNumber, w_order, productItem, false);
}
}
if (ret.Success == false)
{
_logger.Error($"购买同步单错误:{ret.Msg}");
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);
}
}