Browse Source

批量采购v2接口

AddValidOverTime
shanji 2 years ago
parent
commit
7d3027b14d
  1. 22
      BBWY.Server.API/Controllers/BatchPurchaseController.cs
  2. 351
      BBWY.Server.Business/PurchaseOrderV2/BatchPurchase/BatchPurchaseBusiness.cs
  3. 1
      BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchasePreviewOrderRequest.cs
  4. 90
      BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCargoParamRequestV2.cs
  5. 25
      BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCreateOrderRequestV2.cs
  6. 22
      BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchasePreviewOrderRequestV2.cs

22
BBWY.Server.API/Controllers/BatchPurchaseController.cs

@ -48,6 +48,28 @@ namespace BBWY.Server.API.Controllers
return batchPurchaseBusiness.BatchCreateOrder(request);
}
/// <summary>
/// 预览订单价格V2
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public PreviewOrderResponse PreviewOrderV2([FromBody] BatchPurchasePreviewOrderRequestV2 request)
{
return batchPurchaseBusiness.PreviewOrderV2(request);
}
/// <summary>
/// 批量创建采购单V2
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[HttpPost]
public BatchCreareOrderResponse BatchCreateOrderV2(BatchPurchaseCreateOrderRequestV2 request)
{
return batchPurchaseBusiness.BatchCreateOrderV2(request);
}
/// <summary>
/// 获取采购单列表
/// </summary>

351
BBWY.Server.Business/PurchaseOrderV2/BatchPurchase/BatchPurchaseBusiness.cs

@ -2,7 +2,7 @@
using BBWY.Common.Models;
using BBWY.Server.Model;
using BBWY.Server.Model.Db;
using BBWY.Server.Model.Db.QK;
using BBWY.Server.Model.Db.Mds;
using BBWY.Server.Model.Dto;
using FreeSql;
using Newtonsoft.Json;
@ -11,7 +11,6 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Mail;
using System.Text;
using System.Threading.Tasks;
using Yitter.IdGenerator;
@ -24,17 +23,20 @@ namespace BBWY.Server.Business
private IEnumerable<PlatformSDKBusiness> platformSDKBusinessList;
//private TaskSchedulerManager taskSchedulerManager;
private RestApiService restApiService;
private FreeSqlMultiDBManager freeSqlMultiDBManager;
public BatchPurchaseBusiness(IFreeSql fsql,
NLogManager nLogManager,
IIdGenerator idGenerator,
ProductBusiness productBusiness,
IEnumerable<PlatformSDKBusiness> platformSDKBusinessList,
RestApiService restApiService) : base(fsql, nLogManager, idGenerator)
RestApiService restApiService,
FreeSqlMultiDBManager freeSqlMultiDBManager) : base(fsql, nLogManager, idGenerator)
{
this.productBusiness = productBusiness;
this.platformSDKBusinessList = platformSDKBusinessList;
this.restApiService = restApiService;
this.freeSqlMultiDBManager = freeSqlMultiDBManager;
}
/// <summary>
@ -200,6 +202,85 @@ namespace BBWY.Server.Business
};
}
/// <summary>
/// 预览订单V2
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
/// <exception cref="BusinessException"></exception>
public PreviewOrderResponse PreviewOrderV2(BatchPurchasePreviewOrderRequestV2 request)
{
if (request.CargoParamGroupList == null || request.CargoParamGroupList.Count() == 0 ||
request.CargoParamGroupList.Any(g => g.CargoParamList == null || g.CargoParamList.Count() == 0 || string.IsNullOrEmpty(g.PurchaserId)))
throw new BusinessException("缺少商品参数");
if (request.Consignee == null ||
string.IsNullOrEmpty(request.Consignee.Address) ||
string.IsNullOrEmpty(request.Consignee.Mobile) ||
string.IsNullOrEmpty(request.Consignee.ContactName))
throw new BusinessException("缺少收货人信息");
if (request.PurchaseAccountList == null || request.PurchaseAccountList.Count() == 0)
throw new BusinessException("缺少采购账号");
var extJArray = new List<object>();
var errorBuilder = new StringBuilder();
var freightAmount = 0M;
var productAmount = 0M;
var totalAmount = 0M;
foreach (var purchaseGroup in request.CargoParamGroupList)
{
try
{
var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == purchaseGroup.PurchasePlatform);
if (purchaseAccount == null)
throw new BusinessException($"缺少{purchaseGroup.PurchasePlatform}采购平台账号,请在店铺配置中设置");
var platformSDKBusiness = platformSDKBusinessList.FirstOrDefault(p => p.Platform == purchaseGroup.PurchasePlatform);
var previewOrderResponse = platformSDKBusiness.PreviewOrder(new PreviewOrderReuqest()
{
AppKey = purchaseAccount.AppKey,
AppSecret = purchaseAccount.AppSecret,
AppToken = purchaseAccount.AppToken,
Consignee = request.Consignee,
Platform = purchaseGroup.PurchasePlatform,
PurchaseOrderMode = request.PurchaseOrderMode,
CargoParamList = purchaseGroup.CargoParamList.Select(p => new CargoParamRequest()
{
ProductId = p.ProductId,
SkuId = p.SkuId,
Quantity = p.Quantity,
SpecId = p.SpecId
}).ToList()
});
if (purchaseGroup.PurchasePlatform == Enums.Platform.)
extJArray.Add(new { purchaseGroup.PurchaserId, CardId = previewOrderResponse.Extensions });
else if (purchaseGroup.PurchasePlatform == Enums.Platform.)
extJArray.Add(new { purchaseGroup.PurchaserId, OrderTradeTypeCode = previewOrderResponse.OrderTradeType?.Code });
freightAmount += previewOrderResponse.FreightAmount;
productAmount += previewOrderResponse.ProductAmount;
totalAmount += previewOrderResponse.TotalAmount;
}
catch (Exception ex)
{
errorBuilder.AppendLine($"采购商:{purchaseGroup.PurchaserName}");
errorBuilder.AppendLine(ex.Message);
throw new BusinessException(errorBuilder.ToString());
}
}
return new PreviewOrderResponse()
{
Extensions = JsonConvert.SerializeObject(extJArray),
FreightAmount = freightAmount,
ProductAmount = productAmount,
TotalAmount = totalAmount
};
}
/// <summary>
/// 创建订单
/// </summary>
@ -455,6 +536,270 @@ namespace BBWY.Server.Business
};
}
/// <summary>
/// 创建订单
/// </summary>
/// <param name="request"></param>
public BatchCreareOrderResponse BatchCreateOrderV2(BatchPurchaseCreateOrderRequestV2 request)
{
/*
*/
var loggerName = $"批量采购-{request.ShopName}";
nLogManager.GetLogger(loggerName).Info(JsonConvert.SerializeObject(request));
if (request.CargoParamGroupList == null || request.CargoParamGroupList.Count() == 0 ||
request.CargoParamGroupList.Any(g => g.CargoParamList == null || g.CargoParamList.Count() == 0 || string.IsNullOrEmpty(g.PurchaserId)))
throw new BusinessException("缺少商品参数");
if (request.Consignee == null ||
string.IsNullOrEmpty(request.Consignee.Address) ||
string.IsNullOrEmpty(request.Consignee.Mobile) ||
string.IsNullOrEmpty(request.Consignee.ContactName))
throw new BusinessException("缺少收货人信息");
if (request.PurchaseAccountList == null || request.PurchaseAccountList.Count() == 0)
throw new BusinessException("缺少采购账号");
var shop = freeSqlMultiDBManager.MDSfsql.Select<Shops>().Where(s => s.ShopId == request.ShopId.ToString()).ToOne();
if (shop == null)
throw new BusinessException("无效的店铺Id");
var successSkuIdList = new List<string>();
var failSkuList = new List<BatchCreareOrderFailDetail>();
var qikuPackSkuConfigRequestList = new List<object>();
var extJArray = JsonConvert.DeserializeObject<JArray>(request.Extensions);
foreach (var purchaseGroup in request.CargoParamGroupList)
{
var belongSkuGroups = purchaseGroup.CargoParamList.GroupBy(p => p.BelongSkuId);
var belongSkuBasicInfoList = productBusiness.GetProductSkuList(new SearchProductSkuRequest()
{
AppKey = shop.AppKey,
AppSecret = shop.AppSecret,
AppToken = shop.AppToken,
Platform = (Enums.Platform)shop.PlatformId,
Sku = string.Join(",", belongSkuGroups.Select(x => x.Key)),
});
try
{
var purchaseAccount = request.PurchaseAccountList.FirstOrDefault(pa => pa.PurchasePlatformId == purchaseGroup.PurchasePlatform);
var platformSDKBusiness = platformSDKBusinessList.FirstOrDefault(p => p.Platform == purchaseGroup.PurchasePlatform);
string tradeMode = "", cardId = "";
var extJson = extJArray.FirstOrDefault(j => j.Value<string>("PurchaserId") == purchaseGroup.PurchaserId);
if (purchaseGroup.PurchasePlatform == Enums.Platform.)
cardId = extJson.Value<string>("CardId");
else if (purchaseGroup.PurchasePlatform == Enums.Platform.)
tradeMode = extJson.Value<string>("OrderTradeTypeCode");
#region 处理JD SKU和拳探SKU的对应关系
var belongSkus_mappingList = new List<JObject>();
if (purchaseGroup.PurchasePlatform == Enums.Platform.)
{
foreach (var belongSkuGroup in belongSkuGroups)
{
var firstProductParam = belongSkuGroup.FirstOrDefault();
if (!belongSkus_mappingList.Any(j => j.Value<string>("BelongSkuId") == firstProductParam.BelongSkuId))
{
belongSkus_mappingList.Add(JObject.FromObject(new { firstProductParam.BelongSkuId, firstProductParam.SkuId }));
}
}
if (belongSkus_mappingList.Count() == 0)
throw new BusinessException("缺少来源SKU信息");
}
#endregion
var createOrderResponse = platformSDKBusinessList.FirstOrDefault(p => p.Platform == purchaseGroup.PurchasePlatform)
.FastCreateOrder(new CreateOnlinePurchaseOrderRequest()
{
AppKey = purchaseAccount.AppKey,
AppSecret = purchaseAccount.AppSecret,
AppToken = purchaseAccount.AppToken,
Platform = purchaseGroup.PurchasePlatform,
Consignee = request.Consignee,
PurchaseOrderMode = request.PurchaseOrderMode,
Remark = purchaseGroup.Remark,
SourceShopName = request.ShopName,
SourceSku = belongSkus_mappingList,
CargoParamList = purchaseGroup.CargoParamList.Select(p => new CargoParamRequest()
{
ProductId = p.ProductId,
SkuId = p.SkuId,
Quantity = p.Quantity,
SpecId = p.SpecId
}).ToList(),
TradeMode = tradeMode,
Extensions = cardId,
AutoPay = request.AutoPay,
});
var purchaseOrderSimpleInfo = platformSDKBusinessList.FirstOrDefault(p => p.Platform == purchaseGroup.PurchasePlatform).GetOrderSimpleInfo(new GetOrderInfoRequest()
{
AppKey = purchaseAccount.AppKey,
AppSecret = purchaseAccount.AppSecret,
AppToken = purchaseAccount.AppToken,
OrderId = createOrderResponse.PurchaseOrderId,
Platform = purchaseGroup.PurchasePlatform
});
List<long> updatePurchaseTimeSchemeIdList = purchaseGroup.CargoParamList.Select(p => p.BelongSchemeId).Distinct().ToList();
List<PurchaseOrderSku> insertPurchaseOrderSkuList = new List<PurchaseOrderSku>();
List<object> skuPackConfigList = null;
if (purchaseGroup.PurchasePlatform == Enums.Platform.)
skuPackConfigList = new List<object>();
foreach (var belongSkuGroup in belongSkuGroups)
{
var firstProductParam = belongSkuGroup.FirstOrDefault();
var currentOrderSkuProductAmount = 0M; //采购成本
currentOrderSkuProductAmount = purchaseOrderSimpleInfo.ItemList.Where(p => belongSkuGroup.Any(p1 => p1.SkuId == p.SkuId))
?.Sum(p => p.ProductAmount) ?? 0M;
var currentOrderSkuFreightAmount = purchaseOrderSimpleInfo.FreightAmount / belongSkuGroups.Count(); //采购运费(按sku数均分)
var belongSkuBasicInfo = belongSkuBasicInfoList.FirstOrDefault(x=>x.Id == belongSkuGroup.Key);
var purchaseOrderSku = new PurchaseOrderSku()
{
Id = idGenerator.NewLong(),
ShopId = request.ShopId,
PurchaseOrderId = createOrderResponse.PurchaseOrderId,
ProductId = belongSkuBasicInfo.ProductId,
SkuId = firstProductParam.BelongSkuId,
Price = belongSkuBasicInfo.Price,
SkuTitle = belongSkuBasicInfo.Title,
Logo = belongSkuBasicInfo.Logo,
Quantity = firstProductParam.BelongQuantity,
PurchaseSchemeId = firstProductParam.BelongSchemeId,
PurchaseSkuIds = string.Join(",", belongSkuGroup.Select(p => p.SkuId).ToList()),
PurchaseAmount = currentOrderSkuProductAmount + currentOrderSkuFreightAmount,
ProductAmount = currentOrderSkuProductAmount,
PurchaseFreight = currentOrderSkuFreightAmount,
CreateTime = DateTime.Now
};
insertPurchaseOrderSkuList.Add(purchaseOrderSku);
if (purchaseGroup.PurchasePlatform == Enums.Platform.)
{
var skuPackConfig = request.PackSkuConfigList?.FirstOrDefault(s => s.SkuId == firstProductParam.BelongSkuId);
if (skuPackConfig != null)
{
skuPackConfigList.Add(new
{
skuId = firstProductParam.BelongSkuId,
skuCount = skuPackConfig.PurchaseCount,
markMessage = skuPackConfig.RemarkMessage,
wareHourses = skuPackConfig.PackSkuSplitConfigList.Select(x => new
{
wareId = x.IsJST ? "qiyuejushuitan" : x.Store.Id,
wareName = x.IsJST ? "齐越聚水潭" : x.Store.Name,
count = x.PackCount,
wareType = x.IsJST ? 3 : GetQiKuWareType(x.Store.Type)
})
});
}
}
}
var purchaseOrderV2 = new PurchaseOrderV2()
{
Id = createOrderResponse.PurchaseOrderId,
ShopId = request.ShopId,
OrderState = createOrderResponse.IsPay ? Enums.PurchaseOrderState. : Enums.PurchaseOrderState.,
PurchasePlatform = purchaseGroup.PurchasePlatform,
ConsigneeContactName = request.Consignee.ContactName,
ConsigneeMobile = request.Consignee.Mobile,
ConsigneeProvince = request.Consignee.Province,
ConsigneeCity = request.Consignee.City,
ConsigneeCounty = request.Consignee.County,
ConsigneeTown = request.Consignee.Town,
ConsigneeAddress = request.Consignee.Address,
PurchaserId = purchaseGroup.PurchaserId,
PurchaserName = purchaseGroup.PurchaserName,
PurchaseAccountId = purchaseAccount.Id,
PurchaseAmount = purchaseOrderSimpleInfo.TotalAmount,
ProductAmount = purchaseOrderSimpleInfo.ProductAmount,
PurchaseFreight = purchaseOrderSimpleInfo.FreightAmount,
Remark = purchaseGroup.Remark,
CreateTime = DateTime.Now,
PurchaseMethod = Enums.PurchaseMethod.线,
PurchaseOrderMode = request.PurchaseOrderMode
};
if (createOrderResponse.IsPay)
purchaseOrderV2.PayTime = DateTime.Now;
fsql.Transaction(() =>
{
fsql.Insert(purchaseOrderV2).ExecuteAffrows();
//fsql.Insert(purchaseOrderSku).ExecuteAffrows();
fsql.Insert(insertPurchaseOrderSkuList).ExecuteAffrows();
fsql.Update<PurchaseScheme>(updatePurchaseTimeSchemeIdList).Set(p => p.LastPurchaseTime, DateTime.Now).ExecuteAffrows();
});
successSkuIdList.AddRange(belongSkuGroups.Select(g => g.Key));
if (purchaseGroup.PurchasePlatform == Enums.Platform.)
{
qikuPackSkuConfigRequestList.Add(new
{
orderId = purchaseOrderV2.Id,
//shopId = request.ShopId.ToString(),
shopId = purchaseGroup.PurchaserId, //拳探店铺Id(商家Id)
originShopName = request.ShopName,
userName = purchaseAccount.AccountName,
platform = Enums.Platform.,
purchaseTaskModels = skuPackConfigList
});
}
}
catch (Exception ex)
{
failSkuList.AddRange(belongSkuGroups.Select(g => new BatchCreareOrderFailDetail()
{
SkuId = g.Key,
ErrorMsg = ex.Message
}));
//throw new BusinessException(errorBuilder.ToString());
}
}
if (qikuPackSkuConfigRequestList.Count() > 0)
{
Task.Factory.StartNew(() =>
{
foreach (var qikuPackSkuConfigRequest in qikuPackSkuConfigRequestList)
{
try
{
var qikuResponse = restApiService.SendRequest("http://qiku.qiyue666.com/",
"api/PackPurchaseTask/BatchPublicPurchaseTask",
qikuPackSkuConfigRequest,
null,
HttpMethod.Post);
if (qikuResponse.StatusCode != System.Net.HttpStatusCode.OK)
throw new Exception(qikuResponse.Content);
}
catch (Exception ex)
{
nLogManager.GetLogger($"发布打包任务-{request.ShopName}").Error(ex, JsonConvert.SerializeObject(qikuPackSkuConfigRequest));
}
}
});
}
return new BatchCreareOrderResponse()
{
FailSkuList = failSkuList,
SuccessSkuIdList = successSkuIdList
};
}
private int GetQiKuWareType(Enums.StockType stockType)
{
if (stockType == Enums.StockType.)

1
BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase/BatchPurchasePreviewOrderRequest.cs

@ -25,7 +25,6 @@ namespace BBWY.Server.Model.Dto
public Enums.Platform PurchasePlatform { get; set; }
public string BelongSkuId { get; set; }
public string BelongProductId { get; set; }

90
BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCargoParamRequestV2.cs

@ -0,0 +1,90 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BBWY.Server.Model.Dto
{
public class BatchPurchaseCargoParamRequestV2
{
/// <summary>
/// 采购商品Id
/// </summary>
public string ProductId { get; set; }
/// <summary>
/// 采购SkuId
/// </summary>
public string SkuId { get; set; }
/// <summary>
/// 采购SpecId 1688独有
/// </summary>
public string SpecId { get; set; }
/// <summary>
/// 采购SKU数量
/// </summary>
public int Quantity { get; set; }
#region BelongInfo
/// <summary>
/// 归属SKUId(JD)
/// </summary>
public string BelongSkuId { get; set; }
///// <summary>
///// 归属商品Id(JD)
///// </summary>
//public string BelongProductId { get; set; }
///// <summary>
///// 归属商品价格(JD)
///// </summary>
//public decimal BelongPrice { get; set; }
///// <summary>
///// 归属商品标题(JD)
///// </summary>
//public string BelongSkuTitle { get; set; }
///// <summary>
///// 归属商品Logo(JD)
///// </summary>
//public string BelongLogo { get; set; }
/// <summary>
/// 归属SKU数量(JD)
/// </summary>
public int BelongQuantity { get; set; }
/// <summary>
/// 采购方案Id
/// </summary>
public long BelongSchemeId { get; set; }
#endregion
}
public class BatchPurchaseCargoParamGroupRequestV2
{
/// <summary>
/// 采购商Id
/// </summary>
public string PurchaserId { get; set; }
/// <summary>
/// 采购商名称
/// </summary>
public string PurchaserName { get; set; }
public Enums.Platform PurchasePlatform { get; set; }
/// <summary>
/// 下单备注
/// </summary>
public string Remark { get; set; }
/// <summary>
/// 采购商品列表
/// </summary>
public IList<BatchPurchaseCargoParamRequestV2> CargoParamList { get; set; }
}
}

25
BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchaseCreateOrderRequestV2.cs

@ -0,0 +1,25 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace BBWY.Server.Model.Dto
{
public class BatchPurchaseCreateOrderRequestV2 : BatchPurchasePreviewOrderRequestV2
{
/// <summary>
/// 扩展字段 ,格式参考报价接口返回值
/// </summary>
public string Extensions { get; set; }
public long ShopId { get; set; }
public string ShopName { get; set; }
public string AutoPay { get; set; }
/// <summary>
/// 打包设置
/// </summary>
public IList<PackSkuConfigRequest> PackSkuConfigList { get; set; }
}
}

22
BBWY.Server.Model/Dto/Request/PurchaseOrderV2/BatchPurchase2/BatchPurchasePreviewOrderRequestV2.cs

@ -0,0 +1,22 @@
using BBWY.Server.Model.Db;
using System.Collections.Generic;
namespace BBWY.Server.Model.Dto
{
public class BatchPurchasePreviewOrderRequestV2
{
/// <summary>
/// 采购账号列表
/// </summary>
public IList<PurchaseAccount> PurchaseAccountList { get; set; }
public Enums.PurchaseOrderMode PurchaseOrderMode { get; set; }
/// <summary>
/// 收货人信息
/// </summary>
public ConsigneeRequest Consignee { get; set; }
public IList<BatchPurchaseCargoParamGroupRequestV2> CargoParamGroupList { get; set; }
}
}
Loading…
Cancel
Save