|
@ -33,7 +33,8 @@ namespace JdShopListener |
|
|
new ProModel(){ Name="价格" , Type= ProType.Price}, |
|
|
new ProModel(){ Name="价格" , Type= ProType.Price}, |
|
|
new ProModel(){ Name="活动" , Type= ProType.Active}, |
|
|
new ProModel(){ Name="活动" , Type= ProType.Active}, |
|
|
new ProModel(){ Name="促销" , Type= ProType.Promotion}, |
|
|
new ProModel(){ Name="促销" , Type= ProType.Promotion}, |
|
|
new ProModel(){ Name="优惠券" , Type= ProType.Coupons} |
|
|
new ProModel(){ Name="优惠券" , Type= ProType.Coupons}, |
|
|
|
|
|
new ProModel(){ Name="Sku" , Type= ProType.Sku}, |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
DateList = new System.Collections.ObjectModel.ObservableCollection<DateModel>() { |
|
|
DateList = new System.Collections.ObjectModel.ObservableCollection<DateModel>() { |
|
@ -61,7 +62,10 @@ namespace JdShopListener |
|
|
SkuList.Clear(); |
|
|
SkuList.Clear(); |
|
|
var list= DbHelper.Db.GetSkuList(); |
|
|
var list= DbHelper.Db.GetSkuList(); |
|
|
list.ForEach(c => { |
|
|
list.ForEach(c => { |
|
|
SkuList.Add(c); |
|
|
if (c.IsShow == 1) |
|
|
|
|
|
{ |
|
|
|
|
|
SkuList.Add(c); |
|
|
|
|
|
} |
|
|
}); |
|
|
}); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -191,9 +195,9 @@ namespace JdShopListener |
|
|
set { Set(ref _IsAdd, value); } |
|
|
set { Set(ref _IsAdd, value); } |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private bool _IsStart; |
|
|
private bool? _IsStart=false; |
|
|
|
|
|
|
|
|
public bool IsStart |
|
|
public bool? IsStart |
|
|
{ |
|
|
{ |
|
|
get { return _IsStart; } |
|
|
get { return _IsStart; } |
|
|
set { Set(ref _IsStart, value); } |
|
|
set { Set(ref _IsStart, value); } |
|
@ -245,12 +249,38 @@ namespace JdShopListener |
|
|
SpuId = spuId |
|
|
SpuId = spuId |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
if (model.SkuId == Sku) |
|
|
|
|
|
{ |
|
|
|
|
|
model.IsShow = 1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//去除重复
|
|
|
//去除重复
|
|
|
if (SkuList.Count(c => c.SkuId == model.SkuId) > 0) |
|
|
if (SkuList.Count(c => c.SkuId == model.SkuId) > 0) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
if (model.IsShow == 1) |
|
|
|
|
|
{ |
|
|
|
|
|
var osku = SkuList.FirstOrDefault(c => c.SkuId == model.SkuId); |
|
|
|
|
|
|
|
|
|
|
|
if (osku.IsShow != 1) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
osku.IsShow = 1; |
|
|
|
|
|
DbHelper.Db.UpdateSkuModel(osku); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
continue; |
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//加入本地数据库
|
|
|
//加入本地数据库
|
|
|
skus.Add(model); |
|
|
skus.Add(model); |
|
|
|
|
|
|
|
|
Application.Current.Dispatcher.Invoke(() => |
|
|
Application.Current.Dispatcher.Invoke(() => |
|
|
{ |
|
|
{ |
|
|
SkuList.Add(model); |
|
|
SkuList.Add(model); |
|
@ -331,7 +361,7 @@ namespace JdShopListener |
|
|
/// </summary>
|
|
|
/// </summary>
|
|
|
public void Start() |
|
|
public void Start() |
|
|
{ |
|
|
{ |
|
|
if (!IsStart) |
|
|
if (IsStart==false) |
|
|
{ |
|
|
{ |
|
|
IsStart = true; |
|
|
IsStart = true; |
|
|
Thread t = new Thread(() => |
|
|
Thread t = new Thread(() => |
|
@ -339,12 +369,36 @@ namespace JdShopListener |
|
|
LastItemChangeList.Clear(); |
|
|
LastItemChangeList.Clear(); |
|
|
LastItemChangeList = DbHelper.Db.GetLastItemChanges(); |
|
|
LastItemChangeList = DbHelper.Db.GetLastItemChanges(); |
|
|
|
|
|
|
|
|
DoWork(); |
|
|
while (IsStart==true) |
|
|
|
|
|
{ |
|
|
|
|
|
AddLog("开始sku定时监控!"); |
|
|
|
|
|
|
|
|
|
|
|
DoWork(); |
|
|
|
|
|
|
|
|
|
|
|
AddLog("全部sku监控执行完成,等待一小时后开始下一轮监控!"); |
|
|
|
|
|
|
|
|
|
|
|
for(int i=0;i<60;i++) |
|
|
|
|
|
{ |
|
|
|
|
|
if (IsStart != true) |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
for (int s = 0; s < 60; s++) |
|
|
|
|
|
{ |
|
|
|
|
|
if (IsStart != true) |
|
|
|
|
|
break; |
|
|
|
|
|
//等待一小时
|
|
|
|
|
|
Thread.Sleep(1000); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
IsStart = false; |
|
|
IsStart = false; |
|
|
}); |
|
|
}); |
|
|
t.Start(); |
|
|
t.Start(); |
|
|
} |
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
IsStart = null; |
|
|
|
|
|
AddLog("开始停止监控!"); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// <summary>
|
|
@ -488,6 +542,66 @@ namespace JdShopListener |
|
|
}); |
|
|
}); |
|
|
} |
|
|
} |
|
|
break; |
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case ProType.Sku: |
|
|
|
|
|
{ |
|
|
|
|
|
var data = list.Where(c => c.NewSkus != c.OldSkus).ToList(); |
|
|
|
|
|
data.ForEach(item => |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
ItemData change = new ItemData() |
|
|
|
|
|
{ |
|
|
|
|
|
Date = item.Date, |
|
|
|
|
|
Desc = item.Desc, |
|
|
|
|
|
ImgUrl = item.ImgUrl, |
|
|
|
|
|
SkuId = item.SkuId |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
if (item.OldSkus == null) |
|
|
|
|
|
{ |
|
|
|
|
|
item.OldSkus = "[]"; |
|
|
|
|
|
} |
|
|
|
|
|
if (item.NewSkus == null) |
|
|
|
|
|
{ |
|
|
|
|
|
item.NewSkus = "[]"; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
List<ProListModel> addSkus = new List<ProListModel>(); |
|
|
|
|
|
List<ProListModel> removeSkus = new List<ProListModel>(); |
|
|
|
|
|
|
|
|
|
|
|
var oldList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ProListModel>>(item.OldSkus).Select(c => c.Title); |
|
|
|
|
|
var newList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<ProListModel>>(item.NewSkus).Select(c => c.Title); |
|
|
|
|
|
|
|
|
|
|
|
foreach (var sku in newList) |
|
|
|
|
|
{ |
|
|
|
|
|
//如果旧列表不存在就是新增
|
|
|
|
|
|
if (!oldList.Contains(sku)) |
|
|
|
|
|
{ |
|
|
|
|
|
addSkus.Add(new ProListModel() { Title=sku }); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
foreach (var sku in oldList) |
|
|
|
|
|
{ |
|
|
|
|
|
//如果新列表没有就是删除
|
|
|
|
|
|
if (!newList.Contains(sku)) |
|
|
|
|
|
{ |
|
|
|
|
|
removeSkus.Add(new ProListModel() { Title = sku }); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
change.OldProList = removeSkus; |
|
|
|
|
|
change.NewProList = addSkus; |
|
|
|
|
|
|
|
|
|
|
|
Application.Current.Dispatcher.Invoke(() => |
|
|
|
|
|
{ |
|
|
|
|
|
ItemList.Add(change); |
|
|
|
|
|
}); |
|
|
|
|
|
}); |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -532,139 +646,176 @@ namespace JdShopListener |
|
|
//开始监控全部
|
|
|
//开始监控全部
|
|
|
foreach (var sku in SkuList) |
|
|
foreach (var sku in SkuList) |
|
|
{ |
|
|
{ |
|
|
var lastSku = LastItemChangeList.FirstOrDefault(c => c.SkuId == sku.SkuId); |
|
|
if (IsStart != true) |
|
|
|
|
|
|
|
|
if(lastSku==null) |
|
|
|
|
|
{ |
|
|
{ |
|
|
lastSku = new ItemChangeModel(); |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
ItemChangeModel item = new ItemChangeModel() |
|
|
try |
|
|
{ |
|
|
{ |
|
|
Date = DateTime.Now, |
|
|
var lastSku = LastItemChangeList.FirstOrDefault(c => c.SkuId == sku.SkuId); |
|
|
Desc = sku.Desc, |
|
|
|
|
|
ImgUrl = sku.ImgUrl, |
|
|
|
|
|
SkuId = sku.SkuId |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
var result = GetWareBusiness(sku); |
|
|
if (lastSku == null) |
|
|
|
|
|
{ |
|
|
|
|
|
lastSku = new ItemChangeModel(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//价格
|
|
|
ItemChangeModel item = new ItemChangeModel() |
|
|
decimal? price = result.price.p; |
|
|
{ |
|
|
if (price == null || price == 0) |
|
|
Date = DateTime.Now, |
|
|
{ |
|
|
Desc = sku.Desc, |
|
|
price = result.price.op ?? 0; |
|
|
ImgUrl = sku.ImgUrl, |
|
|
} |
|
|
SkuId = sku.SkuId |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
item.NewPrice = (decimal)price; |
|
|
var result = GetWareBusiness(sku); |
|
|
|
|
|
|
|
|
#region 活动
|
|
|
//价格
|
|
|
var newActive = new List<object>(); |
|
|
decimal? price = result.price.p; |
|
|
//活动
|
|
|
if (price == null || price == 0) |
|
|
var miaoshaInfo = result.miaoshaInfo; |
|
|
{ |
|
|
//判断是否有活动
|
|
|
price = result.price.op ?? 0; |
|
|
if (miaoshaInfo != null) |
|
|
} |
|
|
{ |
|
|
|
|
|
string miaoshaTitle = miaoshaInfo.title; |
|
|
|
|
|
|
|
|
|
|
|
DateTime endDate = ToDateTime((long)miaoshaInfo.endTime); |
|
|
item.NewPrice = (decimal)price; |
|
|
|
|
|
|
|
|
decimal? msPrice = result.price.p; |
|
|
#region 活动
|
|
|
|
|
|
var newActive = new List<object>(); |
|
|
|
|
|
//活动
|
|
|
|
|
|
var miaoshaInfo = result.miaoshaInfo; |
|
|
|
|
|
//判断是否有活动
|
|
|
|
|
|
if (miaoshaInfo != null) |
|
|
|
|
|
{ |
|
|
|
|
|
string miaoshaTitle = miaoshaInfo.title; |
|
|
|
|
|
|
|
|
newActive.Add(new { title= $"{miaoshaTitle} 价格:{msPrice} 结束时间:{endDate.ToString("yyyy-MM-dd")}", value=string.Empty }); |
|
|
DateTime endDate = ToDateTime((long)miaoshaInfo.endTime); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//活动
|
|
|
decimal? msPrice = result.price.p; |
|
|
var yuyueInfo = result.yuyueInfo; |
|
|
|
|
|
if (yuyueInfo != null) |
|
|
|
|
|
{ |
|
|
|
|
|
string title = "预约抢购"; |
|
|
|
|
|
|
|
|
|
|
|
string time = yuyueInfo.buyTime; |
|
|
newActive.Add(new { title = $"{miaoshaTitle} 价格:{msPrice} 结束时间:{endDate.ToString("yyyy-MM-dd")}", value = string.Empty }); |
|
|
time = (time.Split("-")[3] + time.Split("-")[4] + time.Split("-")[5]); |
|
|
} |
|
|
//DateTime endDate = ToDateTime((long)yuyueInfo.endTime);
|
|
|
|
|
|
|
|
|
|
|
|
decimal? msPrice = result.price.p; |
|
|
//活动
|
|
|
|
|
|
var yuyueInfo = result.yuyueInfo; |
|
|
|
|
|
if (yuyueInfo != null) |
|
|
|
|
|
{ |
|
|
|
|
|
string title = "预约抢购"; |
|
|
|
|
|
|
|
|
newActive.Add(new { title= $"{title} 价格:{msPrice} 结束时间:{time}", value=string.Empty }); |
|
|
string time = yuyueInfo.buyTime; |
|
|
} |
|
|
time = (time.Split("-")[3] + time.Split("-")[4] + time.Split("-")[5]); |
|
|
|
|
|
//DateTime endDate = ToDateTime((long)yuyueInfo.endTime);
|
|
|
|
|
|
|
|
|
item.NewActive = Newtonsoft.Json.JsonConvert.SerializeObject(newActive); |
|
|
decimal? msPrice = result.price.p; |
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 促销
|
|
|
newActive.Add(new { title = $"{title} 价格:{msPrice} 结束时间:{time}", value = string.Empty }); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
var newPromotion = new List<object>(); |
|
|
item.NewActive = Newtonsoft.Json.JsonConvert.SerializeObject(newActive); |
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
//促销
|
|
|
#region 促销
|
|
|
var promotion = result.promotion; |
|
|
|
|
|
if (promotion != null) |
|
|
var newPromotion = new List<object>(); |
|
|
{ |
|
|
|
|
|
//促销活动列表
|
|
|
//促销
|
|
|
var activity = promotion.activity; |
|
|
var promotion = result.promotion; |
|
|
if (activity != null) |
|
|
if (promotion != null) |
|
|
{ |
|
|
{ |
|
|
foreach (var active in activity) |
|
|
//促销活动列表
|
|
|
|
|
|
var activity = promotion.activity; |
|
|
|
|
|
if (activity != null) |
|
|
{ |
|
|
{ |
|
|
string title = active.text; |
|
|
foreach (var active in activity) |
|
|
string value = active.value; |
|
|
{ |
|
|
newPromotion.Add(new { title, value }); |
|
|
string title = active.text; |
|
|
|
|
|
string value = active.value; |
|
|
|
|
|
newPromotion.Add(new { title, value }); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//赠品列表
|
|
|
//赠品列表
|
|
|
var gift = promotion.gift; |
|
|
var gift = promotion.gift; |
|
|
if (gift != null) |
|
|
if (gift != null) |
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
string title = "赠品"; |
|
|
|
|
|
string value = string.Empty; |
|
|
|
|
|
foreach (var gif in gift) |
|
|
|
|
|
{ |
|
|
{ |
|
|
value += gif.skuId + ","; |
|
|
|
|
|
|
|
|
string title = "赠品"; |
|
|
|
|
|
string value = string.Empty; |
|
|
|
|
|
foreach (var gif in gift) |
|
|
|
|
|
{ |
|
|
|
|
|
value += gif.skuId + ","; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(value)) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
|
|
newPromotion.Add(new { title, value }); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(value)) |
|
|
item.NewPromotion = Newtonsoft.Json.JsonConvert.SerializeObject(newPromotion); |
|
|
{ |
|
|
} |
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
newPromotion.Add(new { title, value }); |
|
|
#region 优惠券
|
|
|
|
|
|
var newCoupons = new List<object>(); |
|
|
|
|
|
//优惠券
|
|
|
|
|
|
var couponInfo = result.couponInfo; |
|
|
|
|
|
if (couponInfo != null) |
|
|
|
|
|
{ |
|
|
|
|
|
foreach (var coupon in couponInfo) |
|
|
|
|
|
{ |
|
|
|
|
|
string title = $"满{coupon.quota}减{coupon.discount}"; |
|
|
|
|
|
newCoupons.Add(new { title, value = string.Empty }); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
item.NewPromotion = Newtonsoft.Json.JsonConvert.SerializeObject( newPromotion); |
|
|
item.NewCoupons = Newtonsoft.Json.JsonConvert.SerializeObject(newCoupons); |
|
|
} |
|
|
#endregion
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 优惠券
|
|
|
#region sku
|
|
|
var newCoupons = new List<object>(); |
|
|
|
|
|
//优惠券
|
|
|
var newSkus = new List<object>(); |
|
|
var couponInfo = result.couponInfo; |
|
|
|
|
|
if (couponInfo != null) |
|
|
var detail = GetItemDetail(item.SkuId); |
|
|
{ |
|
|
|
|
|
foreach (var coupon in couponInfo) |
|
|
//相邻的Sku列表
|
|
|
|
|
|
var nearSkus = detail.product.colorSize; |
|
|
|
|
|
|
|
|
|
|
|
foreach (var near in nearSkus) |
|
|
{ |
|
|
{ |
|
|
string title = $"满{coupon.quota}减{coupon.discount}"; |
|
|
if (near != null) |
|
|
newCoupons.Add(new { title, value = string.Empty }); |
|
|
{ |
|
|
|
|
|
newSkus.Add(new { title= near.skuId, value = string.Empty }); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
item.NewSkus = Newtonsoft.Json.JsonConvert.SerializeObject(newSkus); |
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
item.NewCoupons =Newtonsoft.Json.JsonConvert.SerializeObject( newCoupons); |
|
|
//判断是否有变化
|
|
|
#endregion
|
|
|
if (lastSku.NewSkus!=item.NewSkus|| lastSku.NewActive != item.NewActive || lastSku.NewCoupons != item.NewCoupons || lastSku.NewPrice != item.NewPrice || lastSku.NewPromotion != item.NewPromotion) |
|
|
|
|
|
{ |
|
|
//判断是否有变化
|
|
|
item.OldActive = lastSku.NewActive; |
|
|
if (lastSku.NewActive != item.NewActive||lastSku.NewCoupons!=item.NewCoupons||lastSku.NewPrice!=item.NewPrice||lastSku.NewPromotion!=item.NewPromotion) |
|
|
item.OldCoupons = lastSku.NewCoupons; |
|
|
{ |
|
|
item.OldPrice = lastSku.NewPrice; |
|
|
item.OldActive = lastSku.NewActive; |
|
|
item.OldPromotion = lastSku.NewPromotion; |
|
|
item.OldCoupons = lastSku.NewCoupons; |
|
|
item.OldSkus = lastSku.NewSkus; |
|
|
item.OldPrice = lastSku.NewPrice; |
|
|
|
|
|
item.OldPromotion = lastSku.NewPromotion; |
|
|
|
|
|
|
|
|
|
|
|
DbHelper.Db.AddItemChangeModel(item); |
|
|
DbHelper.Db.AddItemChangeModel(item); |
|
|
|
|
|
|
|
|
|
|
|
AddLog($"{sku.SkuId}监控完成!已产生变化记录"); |
|
|
|
|
|
} |
|
|
|
|
|
else { |
|
|
|
|
|
AddLog($"{sku.SkuId}监控完成!未发生变化"); |
|
|
|
|
|
} |
|
|
|
|
|
Thread.Sleep(3000); |
|
|
|
|
|
} |
|
|
|
|
|
catch(Exception ex) |
|
|
|
|
|
{ |
|
|
|
|
|
AddLog(sku.SkuId + "监控失败," + ex.Message); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Thread.Sleep(3000); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|