You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

718 lines
40 KiB

using BBWYB.Common.Log;
using BBWYB.Common.Models;
using BBWYB.Server.Model;
using BBWYB.Server.Model.Db;
using BBWYB.Server.Model.Dto;
using FreeSql;
using Newtonsoft.Json.Linq;
using SDKAdapter;
using SDKAdapter.OperationPlatform.Client;
using SDKAdapter.OperationPlatform.Models;
using Yitter.IdGenerator;
namespace BBWYB.Server.Business.Sync
{
public class OrderSyncBusiness : BaseBusiness, IDenpendency
{
private OP_PlatformClientFactory opPlatformClientFactory;
private VenderBusiness venderBusiness;
private TaskSchedulerManager taskSchedulerManager;
private List<Enums.TimeLimitTaskType> timeLimitTaskTypes;
private TimeLimitRules timeLimitRules;
public OrderSyncBusiness(IFreeSql fsql,
NLogManager nLogManager,
IIdGenerator idGenerator,
OP_PlatformClientFactory opPlatformClientFactory,
VenderBusiness venderBusiness,
TaskSchedulerManager taskSchedulerManager,
TimeLimitRules timeLimitRules) : base(fsql, nLogManager, idGenerator)
{
this.opPlatformClientFactory = opPlatformClientFactory;
this.venderBusiness = venderBusiness;
this.taskSchedulerManager = taskSchedulerManager;
timeLimitTaskTypes = new List<Enums.TimeLimitTaskType>()
{
Enums.TimeLimitTaskType.,
Enums.TimeLimitTaskType.
};
this.timeLimitRules = timeLimitRules;
}
public void AutoOrderSync()
{
var shopList = venderBusiness.GetShopList(platform: Enums.Platform.);
foreach (var shop in shopList)
{
Task.Factory.StartNew(() => Sync(shop, string.Empty, DateTime.Now.AddHours(-3), DateTime.Now, AdapterEnums.SortTimeField.Modify, AdapterEnums.SortType.Desc), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler);
}
}
public void ManualOrderSync(long shopId, string orderId, DateTime? startTime, DateTime? endTime)
{
var shop = venderBusiness.GetShopList(shopId, platform: Enums.Platform.).FirstOrDefault();
if (shop == null)
throw new BusinessException($"未找到店铺Id {shopId}");
Task.Factory.StartNew(() => Sync(shop, orderId, startTime, endTime, AdapterEnums.SortTimeField.Modify, AdapterEnums.SortType.Desc), CancellationToken.None, TaskCreationOptions.LongRunning, taskSchedulerManager.SyncOrderTaskScheduler);
}
public void ManualOrderSync(long shopId, DateTime startTime, DateTime endTime)
{
var shop = venderBusiness.GetShopList(shopId, platform: Enums.Platform.).FirstOrDefault();
if (shop == null)
throw new BusinessException($"未找到店铺Id {shopId}");
while (true)
{
var s = startTime;
var e = s.AddHours(3);
Sync(shop, string.Empty, s, e, AdapterEnums.SortTimeField.Modify, AdapterEnums.SortType.Desc);
if (e >= endTime)
break;
startTime = startTime.AddHours(3);
}
}
private void Sync(ShopResponse shop,
string orderId,
DateTime? startTime,
DateTime? endTime,
AdapterEnums.SortTimeField sortTimeField,
AdapterEnums.SortType sortType)
{
var shopId = long.Parse(shop.ShopId);
var loggerName = $"订单同步-{shop.ShopName}";
try
{
var qtOrderList = opPlatformClientFactory.GetClient(AdapterEnums.PlatformType.).GetOrderList(new OP_QueryOrderRequest()
{
AppKey = shop.AppKey,
AppSecret = shop.AppSecret,
AppToken = shop.AppToken,
OrderId = orderId,
PageIndex = 1,
PageSize = 100,
Platform = AdapterEnums.PlatformType.,
SortTimeField = sortTimeField,
SortType = sortType,
StartDate = startTime,
EndDate = endTime
});
if (qtOrderList.Count == 0)
return;
var qtOrderIdList = qtOrderList.Items.Select(qto => qto.OrderId).ToList();
var dbOrderList = fsql.Select<Model.Db.Order>(qtOrderIdList).ToList();
var payedQTOrderIdList = qtOrderList.Items.Where(qto => qto.IsPay).Select(qto => qto.OrderId).ToList();
var payedQTSpuIdList = qtOrderList.Items.Where(qto => qto.IsPay).SelectMany(qto => qto.OrderSkuList).Select(qtos => qtos.ProductId).Distinct().ToList();
var payedQTSkuIdList = qtOrderList.Items.Where(qto => qto.IsPay).SelectMany(qto => qto.OrderSkuList).Select(qtos => qtos.SkuId).Distinct().ToList();
//限时任务列表
var dbTimeLimitTaskList = fsql.Select<TimeLimitTask>().Where(t => timeLimitTaskTypes.Contains(t.TaskType.Value) &&
payedQTOrderIdList.Contains(t.OrderId)).ToList();
//限时采购任务列表
var dbPurchaseTimeLimitTaskList = dbTimeLimitTaskList.Where(t => t.TaskType == Enums.TimeLimitTaskType.).ToList();
//限时议价任务列表
var dbOptimizationLimitTaskList = dbTimeLimitTaskList.Where(t => t.TaskType == Enums.TimeLimitTaskType.).ToList();
//现有sku销量
var dbSkuTotalSaleInfoList = fsql.Select<SkuTotalSaleInfo>().Where(s => s.ShopId == shopId && s.IsEnabled == true && payedQTSkuIdList.Contains(s.SkuId))
.ToList();
//现有spu销量
var dbSpuTotalSaleInfoList = fsql.Select<SpuTotalSaleInfo>().Where(s => s.ShopId == shopId && s.IsEnabled == true && payedQTSpuIdList.Contains(s.ProductId))
.ToList();
#region DB Operation
List<Model.Db.Order> insertOrderList = new List<Model.Db.Order>();
List<OrderSku> insertOrderSkuList = new List<OrderSku>();
//List<long> updateOrderSkuIdList_OptimizationFlag = new List<long>();
Dictionary<Enums.TriggerOptimizationReason, List<long>> updateOSkuOptimizationFlagByReasonGroups = new Dictionary<Enums.TriggerOptimizationReason, List<long>>();
List<OrderConsignee> insertOrderConsigneeList = new List<OrderConsignee>();
List<TimeLimitTask> insertTimeLimitTaskList = new List<TimeLimitTask>();
List<string> deleteTimeLimitTaskOrderIdList = new List<string>();
List<IUpdate<Model.Db.Order>> updateOrderList = new List<IUpdate<Model.Db.Order>>();
List<SkuTotalSaleInfo> insertSkuTotalSaleInfoList = new List<SkuTotalSaleInfo>();
IList<SkuTotalSaleInfo> updateSkuTotalSaleInfoList = new List<SkuTotalSaleInfo>();
List<SpuTotalSaleInfo> insertSpuTotalSaleInfoList = new List<SpuTotalSaleInfo>();
IList<SpuTotalSaleInfo> updateSpuTotalSaleInfoList = new List<SpuTotalSaleInfo>();
List<SkuOptimizationTask> insertSkuOptimizationTaskList = new List<SkuOptimizationTask>();
List<SkuOptimizationChildTask> insertSkuOptimizationChildTaskList = new List<SkuOptimizationChildTask>();
#endregion
//等待检查sku销量的订单集合
List<OP_OrderResponse> waitToCheckSkuSaleOrderList = new List<OP_OrderResponse>();
IDictionary<string, int> deductionSkuCountDictionary = new Dictionary<string, int>();
IDictionary<string, int> deductionSpuCountDictionary = new Dictionary<string, int>();
#region 同步订单
foreach (var qtOrder in qtOrderList.Items)
{
var dbOrder = dbOrderList.FirstOrDefault(o => o.Id == qtOrder.OrderId);
var orderState = ConvertQuanTanOrderState(qtOrder.OrderState, qtOrder.IsPay, dbOrder?.IsPurchased ?? false);
if (dbOrder == null)
{
//新订单
dbOrder = new Model.Db.Order()
{
Id = qtOrder.OrderId,
OrderSn = qtOrder.OrderSn,
BuyerRemark = qtOrder.BuyerRemark,
EndTime = qtOrder.EndTime,
//ExpressName = qtOrder.DeliveryResponse.ExpressName,
FreightPrice = qtOrder.FreightAmount,
ModifyTime = qtOrder.ModifyTime,
IsPurchased = false,
OrderPayment = qtOrder.OrderPayment,
OrderSellerPrice = qtOrder.OrderProductAmount,
OrderTotalPrice = qtOrder.OrderTotalAmount,
OrderType = 0,
PayType = qtOrder.PayType,
Platform = Enums.Platform.,
PreferentialAmount = qtOrder.PreferentialAmount,
//PurchaseRemark = String.Empty,
ShopId = shopId,
SellerPreferentialAmount = qtOrder.SellerPreferentialAmount,
StartTime = qtOrder.StartTime,
VenderRemark = qtOrder.VenderRemark,
//WaybillNo = qtOrder.DeliveryResponse.WayBillNo,
OrderState = orderState,
ClientOrderId = qtOrder.ClientOrderId,
BuyerAccount = qtOrder.UserAccount,
InPackAmount = qtOrder.PackAmount,
PayTime = qtOrder.PayTime,
};
JArray belongSkus = null;
if (!string.IsNullOrEmpty(qtOrder.Extended))
{
try
{
var jobject = JObject.Parse(qtOrder.Extended);
//dbOrder.SourceSku = jobject.Value<string>("SourceSku");
dbOrder.SourceShopName = jobject.Value<string>("SourceShopName");
if (jobject.ContainsKey("BelongSkus"))
belongSkus = jobject["BelongSkus"] as JArray;
if (jobject.ContainsKey("IntoStoreType"))
dbOrder.IntoStoreType = (Enums.IntoStoreType?)jobject.Value<int?>("IntoStoreType");
}
catch (Exception ex)
{
}
}
if (!insertOrderList.Any(o => o.Id == dbOrder.Id))
insertOrderList.Add(dbOrder);
//订单sku
foreach (var qtOrderSku in qtOrder.OrderSkuList)
{
insertOrderSkuList.Add(new OrderSku()
{
//Id = idGenerator.NewLong(),
Id = long.Parse(qtOrderSku.Id),
CreateTime = DateTime.Now,
SkuId = qtOrderSku.SkuId,
ItemTotal = qtOrderSku.Quantity,
Logo = qtOrderSku.SkuLogo,
OrderId = qtOrder.OrderId,
Price = qtOrderSku.SkuPrice,
InitialPrice = qtOrderSku.SkuPrice,
Title = qtOrderSku.SkuTitle,
ShopId = shopId,
ProductId = qtOrderSku.ProductId,
BelongSkuId = belongSkus?.FirstOrDefault(j => j.Value<string>("SkuId") == qtOrderSku.SkuId)?.Value<string>("BelongSkuId") ?? string.Empty,
InPackAmount = qtOrderSku.PackAmount,
BuyerPayFreight = qtOrderSku.FreightAmount,
IsNeedOptimization = 0,
IsOptimizationCompleted = 0
});
}
//收货人
insertOrderConsigneeList.Add(new OrderConsignee()
{
OrderId = qtOrder.OrderId,
Address = qtOrder.Consignee.Address,
City = qtOrder.Consignee.City,
ContactName = qtOrder.Consignee.ContactName,
County = qtOrder.Consignee.County,
CreateTime = DateTime.Now,
Mobile = qtOrder.Consignee.Mobile,
Province = qtOrder.Consignee.Province,
TelePhone = qtOrder.Consignee.Mobile,
Town = qtOrder.Consignee.Town
});
if (qtOrder.IsPay && !waitToCheckSkuSaleOrderList.Any(x => x.OrderId == qtOrder.OrderId))
waitToCheckSkuSaleOrderList.Add(qtOrder);
}
else
{
#region 订单状态脱离拳探 只处理付款和取消
Enums.OrderState? updateOrderState = null;
if (orderState == Enums.OrderState. && dbOrder.OrderState != Enums.OrderState.)
{
//dbOrder.OrderState = Enums.OrderState.待付款;
updateOrderState = Enums.OrderState.;
}
if (dbOrder.OrderState == Enums.OrderState. && orderState != Enums.OrderState. && orderState != Enums.OrderState.)
{
updateOrderState = Enums.OrderState.;
if (!waitToCheckSkuSaleOrderList.Any(x => x.OrderId == qtOrder.OrderId))
waitToCheckSkuSaleOrderList.Add(qtOrder);
}
if (dbOrder.OrderState != Enums.OrderState. && orderState == Enums.OrderState.)
{
updateOrderState = Enums.OrderState.;
if (dbPurchaseTimeLimitTaskList.Any(t => t.OrderId == qtOrder.OrderId))
deleteTimeLimitTaskOrderIdList.Add(qtOrder.OrderId);
foreach (var qtOrderSku in qtOrder.OrderSkuList)
{
if (!deductionSkuCountDictionary.ContainsKey(qtOrderSku.SkuId))
deductionSkuCountDictionary.Add(qtOrderSku.SkuId, 0);
deductionSkuCountDictionary[qtOrderSku.SkuId] += qtOrderSku.Quantity;
if (!deductionSpuCountDictionary.ContainsKey(qtOrderSku.ProductId))
deductionSpuCountDictionary.Add(qtOrderSku.ProductId, 0);
deductionSpuCountDictionary[qtOrderSku.ProductId] += qtOrderSku.Quantity;
}
}
#endregion
var updateModifyTime = dbOrder.ModifyTime != qtOrder.ModifyTime;
var updateBuyerRemark = dbOrder.BuyerRemark != qtOrder.BuyerRemark;
var updateVenderRemark = dbOrder.VenderRemark != qtOrder.VenderRemark;
var updateBuyerAccount = dbOrder.BuyerAccount != qtOrder.UserAccount;
var updateOrderSn = dbOrder.OrderSn != qtOrder.OrderSn;
var updatePayTime = dbOrder.PayTime != qtOrder.PayTime;
if (updateOrderState != null || updateModifyTime || updateBuyerRemark || updateVenderRemark || updateBuyerAccount || updateOrderSn || updatePayTime)
{
var update = fsql.Update<Model.Db.Order>(dbOrder.Id).SetIf(updateOrderState != null, o => o.OrderState, updateOrderState)
.SetIf(updateModifyTime, o => o.ModifyTime, qtOrder.ModifyTime)
.SetIf(updateBuyerRemark, o => o.BuyerRemark, qtOrder.BuyerRemark)
.SetIf(updateVenderRemark, o => o.VenderRemark, qtOrder.VenderRemark)
.SetIf(updateBuyerAccount, o => o.BuyerAccount, qtOrder.UserAccount)
.SetIf(updateOrderSn, o => o.OrderSn, qtOrder.OrderSn)
.SetIf(updatePayTime, o => o.PayTime, qtOrder.PayTime);
updateOrderList.Add(update);
}
}
}
#endregion
#region 统计销量
foreach (var qtOrder in waitToCheckSkuSaleOrderList)
{
foreach (var qtOrderSku in qtOrder.OrderSkuList)
{
#region 统计sku销量
{
var skuTotalSaleInfo = dbSkuTotalSaleInfoList.FirstOrDefault(s => s.SkuId == qtOrderSku.SkuId);
if (skuTotalSaleInfo == null)
{
skuTotalSaleInfo = insertSkuTotalSaleInfoList.FirstOrDefault(s => s.SkuId == qtOrderSku.SkuId);
if (skuTotalSaleInfo == null)
{
skuTotalSaleInfo = new SkuTotalSaleInfo()
{
SkuId = qtOrderSku.SkuId,
CreateTime = DateTime.Now,
IsEnabled = true,
ItemCount = 0,
ProductId = qtOrderSku.ProductId,
ShopId = shopId,
UpdateTime = DateTime.Now
};
insertSkuTotalSaleInfoList.Add(skuTotalSaleInfo);
}
}
else if (!updateSkuTotalSaleInfoList.Any(s => s.SkuId == qtOrderSku.SkuId))
{
updateSkuTotalSaleInfoList.Add(skuTotalSaleInfo);
}
skuTotalSaleInfo.ItemCount += qtOrderSku.Quantity;
}
#endregion
#region 统计spu销量
{
var spuTotalSaleInfo = dbSpuTotalSaleInfoList.FirstOrDefault(s => s.ProductId == qtOrderSku.ProductId);
if (spuTotalSaleInfo == null)
{
spuTotalSaleInfo = insertSpuTotalSaleInfoList.FirstOrDefault(s => s.ProductId == qtOrderSku.ProductId);
if (spuTotalSaleInfo == null)
{
spuTotalSaleInfo = new SpuTotalSaleInfo()
{
CreateTime = DateTime.Now,
IsEnabled = true,
ItemCount = 0,
ProductId = qtOrderSku.ProductId,
ShopId = shopId,
UpdateTime = DateTime.Now,
LastOptimizationItemCount = 0
};
insertSpuTotalSaleInfoList.Add(spuTotalSaleInfo);
}
}
else if (!updateSpuTotalSaleInfoList.Any(s => s.ProductId == qtOrderSku.ProductId))
{
updateSpuTotalSaleInfoList.Add(spuTotalSaleInfo);
}
spuTotalSaleInfo.ItemCount += qtOrderSku.Quantity;
}
#endregion
}
}
#endregion
#region 检查待议价任务
{
if (waitToCheckSkuSaleOrderList.Count() > 0)
{
var skuIdList = waitToCheckSkuSaleOrderList.SelectMany(o => o.OrderSkuList.Select(osku => osku.SkuId)).Distinct().ToList();
//没有完成首次采购的spu
var noFisrstPurchasedSpuList = dbSpuTotalSaleInfoList.Union(insertSpuTotalSaleInfoList)
.Where(s => s.IsFirstPurchaseCompleted == false)
.Select(s => s.ProductId)
.ToList();
//查询已存在未结束的优化任务
var dbSkuOptimizationTaskList = fsql.Select<SkuOptimizationTask>()
.Where(t => t.ShopId == shopId &&
t.IsOptimizationCompleted == false &&
skuIdList.Contains(t.SkuId))
.ToList();
if (noFisrstPurchasedSpuList.Count() > 0)
{
foreach (var waitCheckOrder in waitToCheckSkuSaleOrderList)
{
foreach (var waitCheckOrderSku in waitCheckOrder.OrderSkuList)
{
if (noFisrstPurchasedSpuList.Contains(waitCheckOrderSku.ProductId) &&
!dbSkuOptimizationTaskList.Any(t => t.SkuId == waitCheckOrderSku.SkuId) &&
!insertSkuOptimizationTaskList.Any(t => t.SkuId == waitCheckOrderSku.SkuId))
{
#region 解析来源店铺数据
JArray belongSkus = null;
string sourceShopName = string.Empty;
if (!string.IsNullOrEmpty(waitCheckOrder.Extended))
{
try
{
var jobject = JObject.Parse(waitCheckOrder.Extended);
//dbOrder.SourceSku = jobject.Value<string>("SourceSku");
sourceShopName = jobject.Value<string>("SourceShopName");
if (jobject.ContainsKey("BelongSkus"))
belongSkus = jobject["BelongSkus"] as JArray;
}
catch (Exception ex)
{
}
}
#endregion
#region 创建待优化任务
var skuOptimizationTask = new SkuOptimizationTask()
{
Id = idGenerator.NewLong(),
PreItemCount = 0,
PrePurchasedAmount = 0,
IsOptimizationCompleted = false,
CreateTime = DateTime.Now,
SafeWarningRemainingDay = 0,
UsePrePurchasedPrice = 0,
TriggerOptimizationReason = Enums.TriggerOptimizationReason.,
SkuId = waitCheckOrderSku.SkuId,
ShopId = shopId,
ProductId = waitCheckOrderSku.ProductId,
BelongShopName = sourceShopName,
CompletionTime = null,
JDSkuId = belongSkus?.FirstOrDefault(j => j.Value<string>("SkuId") == waitCheckOrderSku.SkuId)?.Value<string>("BelongSkuId") ?? string.Empty
};
insertSkuOptimizationTaskList.Add(skuOptimizationTask);
#endregion
#region 创建待优化子任务
{
var yijiagroups = venderBusiness.GetYiJiaGroup();
foreach (var department in yijiagroups)
{
var skuOptimizationChildTask = new SkuOptimizationChildTask()
{
Id = idGenerator.NewLong(),
BelongTeamId = department.Id,
BelongTeamName = department.DepartmentName,
CompletionTime = null,
IsOptimizationCompleted = false,
OptimizationTaskId = skuOptimizationTask.Id
};
insertSkuOptimizationChildTaskList.Add(skuOptimizationChildTask);
}
}
#endregion
#region 创建待优化限时任务
//判断sku是否首次采购
var isFirst = !dbSkuTotalSaleInfoList.Any(s => s.SkuId == waitCheckOrderSku.SkuId);
insertTimeLimitTaskList.Add(new TimeLimitTask()
{
Id = idGenerator.NewLong(),
CreateTme = DateTime.Now,
//ExpirationTime = DateTime.Now.AddDays(isFirst ? 2 : 1),
ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType., DateTime.Now.AddDays(isFirst ? 1 : 0)),
//OrderId = o.OrderId,
//OrderSn = o.OrderSn,
ShopId = shopId,
SkuId = waitCheckOrderSku.SkuId,
TaskType = Enums.TimeLimitTaskType.,
TaskId = skuOptimizationTask.Id,
Remark = "首次采购限时任务"
});
#endregion
}
}
}
}
#region 更新订单sku优化标记
var allSkuOptimizationTaskList = dbSkuOptimizationTaskList.Union(insertSkuOptimizationTaskList);
foreach (var waitCheckOrder in waitToCheckSkuSaleOrderList)
{
foreach (var waitCheckOrderSku in waitCheckOrder.OrderSkuList)
{
var task = allSkuOptimizationTaskList.FirstOrDefault(t => t.SkuId == waitCheckOrderSku.SkuId);
if (task != null)
{
#region 更新sku优化标记
var oskuId = long.Parse(waitCheckOrderSku.SkuId);
var insertOrderSku = insertOrderSkuList.FirstOrDefault(s => s.Id == oskuId);
if (insertOrderSku != null)
{
insertOrderSku.IsNeedOptimization = 1;
insertOrderSku.TriggerOptimizationReason = task.TriggerOptimizationReason;
}
else
{
//updateOrderSkuIdList_OptimizationFlag.Add(oskuId);
if (!updateOSkuOptimizationFlagByReasonGroups.TryGetValue(task.TriggerOptimizationReason.Value, out var updateOSkuOptimizationFlagByReasonList))
{
updateOSkuOptimizationFlagByReasonList = new List<long>();
updateOSkuOptimizationFlagByReasonGroups.Add(task.TriggerOptimizationReason.Value, updateOSkuOptimizationFlagByReasonList);
}
updateOSkuOptimizationFlagByReasonList.Add(oskuId);
}
#endregion
}
}
}
#endregion
}
}
#endregion
#region 检查限时采购任务
CheckPurchaseTimeLimitTask(shopId, qtOrderList.Items, dbPurchaseTimeLimitTaskList, insertTimeLimitTaskList);
#endregion
fsql.Transaction(() =>
{
if (insertOrderList.Count > 0)
fsql.Insert(insertOrderList).ExecuteAffrows();
if (insertOrderSkuList.Count() > 0)
fsql.Insert(insertOrderSkuList).ExecuteAffrows();
if (insertOrderConsigneeList.Count() > 0)
fsql.Insert(insertOrderConsigneeList).ExecuteAffrows();
if (insertTimeLimitTaskList.Count() > 0)
fsql.Insert(insertTimeLimitTaskList).ExecuteAffrows();
if (insertSkuOptimizationTaskList.Count() > 0)
fsql.Insert(insertSkuOptimizationTaskList).ExecuteAffrows();
if (insertSkuOptimizationChildTaskList.Count() > 0)
fsql.Insert(insertSkuOptimizationChildTaskList).ExecuteAffrows();
if (updateOrderList.Count() > 0)
foreach (var update in updateOrderList)
update.ExecuteAffrows();
if (deleteTimeLimitTaskOrderIdList.Count() > 0)
fsql.Delete<TimeLimitTask>().Where(t => deleteTimeLimitTaskOrderIdList.Contains(t.OrderId)).ExecuteAffrows();
if (insertSkuTotalSaleInfoList.Count() > 0)
fsql.Insert(insertSkuTotalSaleInfoList).ExecuteAffrows();
if (updateSkuTotalSaleInfoList.Count() > 0)
{
foreach (var item in updateSkuTotalSaleInfoList)
fsql.Update<SkuTotalSaleInfo>(item.SkuId).Set(s => s.ItemCount, item.ItemCount)
.Set(s => s.UpdateTime, DateTime.Now)
.ExecuteAffrows();
}
if (insertSpuTotalSaleInfoList.Count() > 0)
fsql.Insert(insertSpuTotalSaleInfoList).ExecuteAffrows();
if (updateSpuTotalSaleInfoList.Count() > 0)
{
foreach (var item in updateSpuTotalSaleInfoList)
fsql.Update<SpuTotalSaleInfo>(item.ProductId).Set(s => s.ItemCount, item.ItemCount)
.Set(s => s.UpdateTime, DateTime.Now)
.ExecuteAffrows();
}
//if (updateOrderSkuIdList_OptimizationFlag.Count() > 0)
// fsql.Update<OrderSku>(updateOrderSkuIdList_OptimizationFlag).Set(osku => osku.IsNeedOptimization, 1).ExecuteAffrows();
if (updateOSkuOptimizationFlagByReasonGroups.Keys.Count() > 0)
{
foreach (var triggerOptimizationReason in updateOSkuOptimizationFlagByReasonGroups.Keys)
{
var updateOSkuListOptimizationFlagList = updateOSkuOptimizationFlagByReasonGroups[triggerOptimizationReason];
if (updateOSkuListOptimizationFlagList != null && updateOSkuListOptimizationFlagList.Count > 0)
{
fsql.Update<OrderSku>(updateOSkuListOptimizationFlagList).Set(osku => osku.IsNeedOptimization, 1)
.Set(osku => osku.TriggerOptimizationReason, triggerOptimizationReason)
.ExecuteAffrows();
}
}
}
foreach (var key in deductionSkuCountDictionary.Keys)
fsql.Update<SkuTotalSaleInfo>(key).Set(s => s.ItemCount - deductionSkuCountDictionary[key]).ExecuteAffrows();
foreach (var key in deductionSpuCountDictionary.Keys)
fsql.Update<SpuTotalSaleInfo>(key).Set(s => s.ItemCount - deductionSpuCountDictionary[key]).ExecuteAffrows();
});
}
catch (Exception ex)
{
nLogManager.GetLogger(loggerName).Error(ex);
}
}
/// <summary>
/// 检查限时采购任务
/// </summary>
/// <param name="shopId"></param>
/// <param name="orderList"></param>
/// <param name="dbTimeLimits"></param>
/// <param name="insertTimeLimitTasks"></param>
private void CheckPurchaseTimeLimitTask(long shopId, IList<OP_OrderResponse> orderList, IList<TimeLimitTask> dbTimeLimits, List<TimeLimitTask> insertTimeLimitTasks)
{
foreach (var order in orderList)
{
if (!order.IsPay || order.PayTime == null || order.OrderState == "-1")
continue;
var waitInserTimeLimitTasks = order.OrderSkuList.Where(osku => !dbTimeLimits.Any(x => x.OrderId == order.OrderId && x.SkuId == osku.SkuId))
.Select(osku => new TimeLimitTask()
{
Id = idGenerator.NewLong(),
CreateTme = DateTime.Now,
OrderId = order.OrderId,
OrderSn = order.OrderSn,
SkuId = osku.SkuId,
TaskType = Enums.TimeLimitTaskType.,
ShopId = shopId,
ExpirationTime = timeLimitRules.CalculateExpirationTime(Enums.TimeLimitTaskType., order.PayTime.Value),
PayTime = order.PayTime
}).ToList();
if (waitInserTimeLimitTasks != null && waitInserTimeLimitTasks.Count() > 0)
insertTimeLimitTasks.AddRange(waitInserTimeLimitTasks);
}
}
/// <summary>
/// 计算采购限时任务的到期时间
/// </summary>
/// <param name="payTime">付款时间</param>
/// <returns></returns>
private DateTime CalculationPurcashTimeLimitTaskExpirationTime(DateTime payTime)
{
var addDays = 0;
if (payTime.DayOfWeek == DayOfWeek.Sunday ||
payTime.DayOfWeek == DayOfWeek.Monday ||
payTime.DayOfWeek == DayOfWeek.Tuesday ||
payTime.DayOfWeek == DayOfWeek.Wednesday ||
payTime.DayOfWeek == DayOfWeek.Thursday ||
payTime.DayOfWeek == DayOfWeek.Friday)
{
if (payTime.Hour >= 0 && payTime.Hour < 15)
addDays = 0; //当日
else
addDays = payTime.DayOfWeek == DayOfWeek.Friday ? 2 : 1; //次日,星期五是后天
}
else if (payTime.DayOfWeek == DayOfWeek.Saturday)
addDays = 1;
return payTime.Date.AddDays(addDays).AddHours(16);
}
private Enums.OrderState? ConvertQuanTanOrderState(string qtOrderState, bool isPay, bool isPurchased)
{
/*
-1、已取消;
0、待发货;
1、待收货;
2、待评价;
3、已完成;
*/
if (qtOrderState == "-1")
return Enums.OrderState.;
if (!isPay)
return Enums.OrderState.;
if (qtOrderState == "0")
{
if (!isPurchased)
return Enums.OrderState.;
return Enums.OrderState.;
}
if (qtOrderState == "1")
return Enums.OrderState.;
if (qtOrderState == "2")
return Enums.OrderState.;
if (qtOrderState == "3")
return Enums.OrderState.;
return null;
}
public Enums.TriggerOptimizationReason? GetOptimizationReason(SpuTotalSaleInfo s)
{
if (s.IsFirstPurchaseCompleted == false)
return Enums.TriggerOptimizationReason.;
if (s.IsFirstPurchaseCompleted == true &&
s.IsFirstOptimizationCompleted == false &&
s.ItemCount - s.FirstPurchaseCompletedItemCount >= 20)
return Enums.TriggerOptimizationReason.;
if (s.IsFirstOptimizationCompleted == true && s.LastOptimizationItemCount != 0 && s.ItemCount * 1.0 / s.LastOptimizationItemCount >= 2)
return Enums.TriggerOptimizationReason.;
return null;
}
}
}