diff --git a/BBWY.Server.API/Controllers/EvaluationAssistantController.cs b/BBWY.Server.API/Controllers/EvaluationAssistantController.cs index c6b6f0ad..bc5d3578 100644 --- a/BBWY.Server.API/Controllers/EvaluationAssistantController.cs +++ b/BBWY.Server.API/Controllers/EvaluationAssistantController.cs @@ -77,5 +77,15 @@ namespace BBWY.Server.API.Controllers { evaluationAssistantBusiness.EditPromotionTaskSort(request); } + + /// + /// 开始活动 + /// + /// + [HttpPost] + public void StartPromotionTask([FromBody] StartPromotionTaskRequest request) + { + evaluationAssistantBusiness.StartPromotionTask(request); + } } } diff --git a/BBWY.Server.Business/EvaluationAssistant/EvaluationAssistantBusiness.cs b/BBWY.Server.Business/EvaluationAssistant/EvaluationAssistantBusiness.cs index ac67b662..a60c691c 100644 --- a/BBWY.Server.Business/EvaluationAssistant/EvaluationAssistantBusiness.cs +++ b/BBWY.Server.Business/EvaluationAssistant/EvaluationAssistantBusiness.cs @@ -5,9 +5,11 @@ using BBWY.Server.Model; using BBWY.Server.Model.Db; using BBWY.Server.Model.Dto; using Microsoft.Extensions.Options; +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; +using System.Net.Http; using Yitter.IdGenerator; namespace BBWY.Server.Business @@ -69,6 +71,23 @@ namespace BBWY.Server.Business { if (request.Id == 0) { + var relayAPIHost = GetPlatformRelayAPIHost(Enums.Platform.京东); + var restApiResult_spu = restApiService.SendRequest(relayAPIHost, "api/PlatformSDK/GetProductList", new SearchProductRequest() + { + AppKey = "E1AA9247D5583A6D87449CE6AB290185", + AppSecret = "e479558ddd9e40f8929cfc00c6cbbc9c", + AppToken = "01dc6f6e7fc34dcd99090d690312556cmdfk", + PageIndex = 1, + PageSize = 10, + Platform = Enums.Platform.京东, + Spu = request.MainProductSpu + }, GetYunDingRequestHeader(), HttpMethod.Post); + if (restApiResult_spu.StatusCode != System.Net.HttpStatusCode.OK) + throw new BusinessException(restApiResult_spu.Content) { Code = (int)restApiResult_spu.StatusCode }; + var spuResponse = JsonConvert.DeserializeObject>(restApiResult_spu.Content); + if (!spuResponse.Success) + throw new BusinessException(spuResponse.Msg) { Code = spuResponse.Code }; + var sort = fsql.Select().ToAggregate(p => p.Max(p.Key.Sort)); var promotionTask = new PromotionTask() { @@ -87,7 +106,9 @@ namespace BBWY.Server.Business Status = Enums.PromitionTaskStatus.等待, PromotionId = 0, Sort = sort + 1, - UpdateSortTime = DateTime.Now + UpdateSortTime = DateTime.Now, + SpuLogo = spuResponse.Data.Items[0].Logo, + SpuPublishTime = spuResponse.Data.Items[0].CreateTime }; fsql.Insert(promotionTask).ExecuteAffrows(); } @@ -114,9 +135,10 @@ namespace BBWY.Server.Business public PromotionTaskResponse GetPromotionTaskList(QueryPromotionTaskRequest request) { var list = fsql.Select().Where(pt => pt.ShopId == request.ShopId) + .OrderByDescending(pt => pt.Sort) + .OrderByDescending(pt => pt.UpdateSortTime) .Page(request.PageIndex, request.PageSize) .Count(out long count) - .OrderByDescending(pt => new { pt.Sort, pt.UpdateSortTime }) .ToList(); return new PromotionTaskResponse() { @@ -142,7 +164,32 @@ namespace BBWY.Server.Business /// public void StartPromotionTask(StartPromotionTaskRequest request) { - var promotionTask = fsql.Select(request.Id).ToOne(); + var dbPromotionTask = fsql.Select(request.Id).ToOne(); + + if (dbPromotionTask == null) + throw new BusinessException("活动任务不存在"); + if (dbPromotionTask.Status != Enums.PromitionTaskStatus.等待) + throw new BusinessException("只能在活动处于等待状态时才能开始"); + + + var giftTemplateSku = string.Empty; //赠品模板sku + //var mainProductGiftSku = dbPromotionTask.MainProductGiftSku; //主商品的赠品sku + var motherTemplateSku = string.Empty; //奶妈模板的sku + + if (dbPromotionTask.GiftTemplateId != null && dbPromotionTask.GiftTemplateId != 0) + { + var giftTemplate = fsql.Select(dbPromotionTask.GiftTemplateId).ToOne(); + if (giftTemplate == null) + throw new BusinessException("赠品模板不存在"); + giftTemplateSku = giftTemplate.GiftSkus; + } + + if (dbPromotionTask.MotherTemplateId != null && dbPromotionTask.MotherTemplateId != 0) + { + + } + + } #endregion } diff --git a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs index 69ec2f37..9e88e84b 100644 --- a/BBWY.Server.Business/PlatformSDK/JDBusiness.cs +++ b/BBWY.Server.Business/PlatformSDK/JDBusiness.cs @@ -14,6 +14,7 @@ using NLog; using System; using System.Collections.Generic; using System.Linq; +using System.Text; namespace BBWY.Server.Business { @@ -641,5 +642,252 @@ namespace BBWY.Server.Business return (JArray)res.Json["jingdong_stock_read_findSkuStock_responce"]["skuStocks"]; } + + public override void DeleteSku(DeleteSkuRequest request) + { + var jdClient = GetJdClient(request.AppKey, request.AppSecret); + var req = new SkuWriteDeleteSkuRequest(); + req.skuId = long.Parse(request.Sku); + var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime()); + } + + public override int StartJDPromotionTask(StartPromotionTaskRequest2 request) + { + var stepText = string.Empty; + //stepText.AppendLine($"任务Id {request.Id} 店铺Id {request.ShopId}"); + try + { + var jdClient = GetJdClient(request.AppKey, request.AppSecret); + string barCode = string.Empty, categoryId = string.Empty; + IList multiCateProps = null; + long wareId = long.Parse(request.MainProductSpu); + List giftSkuList = new List(); + + #region 获取主商品sku信息 barCode,categoryId,multiCateProps + { + stepText = "获取主商品sku信息"; + var mainSkuList = GetProductSkuList(new SearchProductSkuRequest() + { + AppKey = request.AppKey, + AppSecret = request.AppSecret, + AppToken = request.AppToken, + IsContainSource = true, + Platform = request.Platform, + Spu = request.MainProductSpu + }); + if (mainSkuList.Count() == 0) + throw new BusinessException($"获取主商品sku信息-未查询到sku信息"); + + barCode = mainSkuList[0].Source.Value("barCode"); + categoryId = mainSkuList[0].Source.Value("categoryId"); + multiCateProps = mainSkuList[0].Source["multiCateProps"] != null ? mainSkuList[0].Source["multiCateProps"].ToList() : null; + } + + #endregion + + #region 设置精简标题 + { + stepText = "设置精简标题"; + var req = new WareWriteUpdateWareTitleRequest(); + req.wareId = wareId; + req.title = request.SimpleTitle; + var response = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime()); + if (response.IsError) + throw new BusinessException($"设置精简标题出错-{(string.IsNullOrEmpty(response.ErrorMsg) ? response.ErrMsg : response.ErrorMsg)}"); + } + #endregion + + if (!string.IsNullOrEmpty(request.GiftTemplateSku)) + { + stepText = "上架赠品"; + + #region 上架赠品 + + #region 获取赠品sku信息 + stepText = "获取赠品sku信息"; + var selectGiftSkuList = GetProductSkuList(new SearchProductSkuRequest() + { + AppKey = request.AppKey, + AppSecret = request.AppSecret, + AppToken = request.AppToken, + IsContainSource = true, + Platform = request.Platform, + Sku = request.GiftTemplateSku + }); + #endregion + + #region 获取销售属性 + stepText = "获取销售属性"; + IList colorSaleAttrs = null; + { + var req = new CategoryReadFindAttrsByCategoryIdUnlimitCateRequest(); + req.cid = long.Parse(categoryId); + req.attributeType = 4; + req.field = "attrValueList,attrGroup"; + var response = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime()); + if (response.Json == null) + response.Json = JObject.Parse(response.Body); + var colorProperty = response.Json["jingdong_category_read_findAttrsByCategoryIdUnlimitCate_responce"]["findattrsbycategoryidunlimitcate_result"].FirstOrDefault(j => j.Value("name") == "颜色"); + if (colorProperty == null) + throw new Exception("获取销售属性-缺少颜色属性"); + colorSaleAttrs = colorProperty["attrValueList"].ToList(); + } + #endregion + + #region 组装上架/改名/设置细节图参数 + stepText = "组装上架/改名/设置细节图参数"; + var takeColorIndex = colorSaleAttrs.Count() - 1; + var skusParamList = new List(); + var updateSkuTitleParamList = new List(); + var imageWriteUpdateRequestList = new List(); + + for (var i = 0; i < selectGiftSkuList.Count(); i++) + { + var giftSku = selectGiftSkuList[i]; + var colorProperty = colorSaleAttrs[takeColorIndex]; + + var p = new SkuWriteUpdateSkusItem() + { + type = "com.jd.pop.ware.ic.api.domain.Sku", + wareId = wareId, + //skuId = long.Parse(sku.Id), + jdPrice = giftSku.Price, + stockNum = 500, + barCode = barCode, + saleAttrs = new List() + { + new SkuWriteUpdateSkusItemSaleAttrs() + { + type = "com.jd.pop.ware.ic.api.domain.Prop", + attrId = colorProperty.Value("attId"), + attrValues = new List() { colorProperty.Value("id") }, + index = takeColorIndex + } + } + }; + + p.multiCateProps = new List(); + if (multiCateProps != null && multiCateProps.Count() > 0) + { + foreach (var multiCateProp in multiCateProps) + { + var m = new SkuWriteUpdateSkusItemSaleAttrs(); + m.type = "com.jd.pop.ware.ic.api.domain.Prop"; + m.attrId = multiCateProp.Value("attrId"); + m.attrValues = multiCateProp.Value("attrValues").Select(x => x.ToString()).ToList(); + p.multiCateProps.Add(m); + } + } + + //修改标题参数 + updateSkuTitleParamList.Add(new WareWriteUpdateWareSaleAttrvalueAliasRequestItem() + { + attrId = p.saleAttrs[0].attrId, + attrValues = p.saleAttrs[0].attrValues, + attrValueAlias = new List() { giftSku.Title } + }); + + //修改商品细节图参数 + var imgUrlBuilder = new StringBuilder(); + var imgIndexBuilder = new StringBuilder(); + imgUrlBuilder.Append($"{giftSku.Logo.Substring(giftSku.Logo.IndexOf("jfs"))},"); + imgIndexBuilder.Append("1,"); + imageWriteUpdateRequestList.Add(new ImageWriteUpdateRequest() + { + wareId = wareId, + colorId = colorProperty.Value("id"), + imgUrl = imgUrlBuilder.ToString().Trim(','), + imgIndex = imgIndexBuilder.ToString().Trim(',') + }); + + takeColorIndex--; + skusParamList.Add(p); + } + #endregion + + #region 上架sku + { + stepText = "上架sku"; + var req = new SkuWriteUpdateSkusRequest(); + req.wareId = wareId; + req.skus = skusParamList; + var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime()); + + if (res.Json == null) + res.Json = JObject.Parse(res.Body); + if (res.IsError) + throw new BusinessException($"上架sku失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}"); + var newSkuList = res.Json["jingdong_sku_write_updateSkus_responce"]["skuList"].ToList().Select(x => x.Value("skuId")).ToList(); + giftSkuList.AddRange(newSkuList); + } + #endregion + + #region sku改名 + { + stepText = "sku改名"; + var req = new WareWriteUpdateWareSaleAttrvalueAliasRequest() + { + wareId = wareId, + props = updateSkuTitleParamList + }; + var res = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime()); + if (res.Json == null) + res.Json = JObject.Parse(res.Body); + if (res.IsError) + throw new BusinessException($"sku改名失败-{(string.IsNullOrEmpty(res.ErrorMsg) ? res.ErrMsg : res.ErrorMsg)}"); + } + #endregion + + #region sku修改细节图 + stepText = "sku修改细节图"; + foreach (var imageWriteUpdateRequest in imageWriteUpdateRequestList) + { + var res = jdClient.Execute(imageWriteUpdateRequest, request.AppToken, DateTime.Now.ToLocalTime()); + } + #endregion + + #endregion + } + else + { + var skuList = request.MainProductGiftSku.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + giftSkuList.AddRange(skuList); + } + + #region 创建活动 + + #endregion + + #region 添加活动sku + + #endregion + + #region 审核活动 + + #endregion + + #region 下架赠品sku + + #endregion + + #region 设置完整标题 + { + stepText = "设置完整标题"; + var req = new WareWriteUpdateWareTitleRequest(); + req.wareId = long.Parse(request.MainProductSpu); + req.title = request.FullTitle; + var response = jdClient.Execute(req, request.AppToken, DateTime.Now.ToLocalTime()); + if (response.IsError) + throw new BusinessException($"设置完整标题出错-{(string.IsNullOrEmpty(response.ErrorMsg) ? response.ErrMsg : response.ErrorMsg)}"); + } + #endregion + } + catch (Exception ex) + { + nLogManager.Default().Error(ex, $"任务Id {request.Id} 店铺Id {request.ShopId} 执行步骤 {stepText}"); + throw ex; + } + return base.StartJDPromotionTask(request); + } } } diff --git a/BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs b/BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs index 5d4c94e1..02f0aaff 100644 --- a/BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs +++ b/BBWY.Server.Business/PlatformSDK/PlatformSDKBusiness.cs @@ -147,5 +147,15 @@ namespace BBWY.Server.Business { throw new NotImplementedException(); } + + public virtual int StartJDPromotionTask(StartPromotionTaskRequest2 request) + { + throw new NotImplementedException(); + } + + public virtual void DeleteSku(DeleteSkuRequest request) + { + throw new NotImplementedException(); + } } } diff --git a/BBWY.Server.Model/Db/EvaluationAssistant/PromotionTask.cs b/BBWY.Server.Model/Db/EvaluationAssistant/PromotionTask.cs index d8a70c6c..e2974e3b 100644 --- a/BBWY.Server.Model/Db/EvaluationAssistant/PromotionTask.cs +++ b/BBWY.Server.Model/Db/EvaluationAssistant/PromotionTask.cs @@ -11,7 +11,7 @@ using FreeSql.DataAnnotations; namespace BBWY.Server.Model.Db { - [JsonObject(MemberSerialization.OptIn), Table(Name = "promotiontask", DisableSyncStructure = true)] + [Table(Name = "promotiontask", DisableSyncStructure = true)] public partial class PromotionTask { @@ -91,6 +91,11 @@ namespace BBWY.Server.Model.Db [Column(DbType = "datetime")] public DateTime? UpdateSortTime { get; set; } + + public string SpuLogo { get; set; } + + [Column(DbType = "datetime")] + public DateTime? SpuPublishTime { get; set; } } } diff --git a/BBWY.Server.Model/Dto/Request/Product/DeleteSkuRequest.cs b/BBWY.Server.Model/Dto/Request/Product/DeleteSkuRequest.cs new file mode 100644 index 00000000..4014bd11 --- /dev/null +++ b/BBWY.Server.Model/Dto/Request/Product/DeleteSkuRequest.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BBWY.Server.Model.Dto +{ + public class DeleteSkuRequest : PlatformRequest + { + public string Sku { get; set; } + } +} diff --git a/BBWY.Server.Model/Dto/Request/PromotionTask/StartPromotionTaskRequest.cs b/BBWY.Server.Model/Dto/Request/PromotionTask/StartPromotionTaskRequest.cs index 78e6bb1c..39d673f6 100644 --- a/BBWY.Server.Model/Dto/Request/PromotionTask/StartPromotionTaskRequest.cs +++ b/BBWY.Server.Model/Dto/Request/PromotionTask/StartPromotionTaskRequest.cs @@ -8,4 +8,40 @@ namespace BBWY.Server.Model.Dto { public long Id { get; set; } } + + public class StartPromotionTaskRequest2 : PlatformRequest + { + public long Id { get; set; } + + public long ShopId { get; set; } + + public string SimpleTitle { get; set; } + + public string FullTitle { get; set; } + + /// + /// 主商品Spu + /// + public string MainProductSpu { get; set; } + + /// + /// 赠品模板的Sku + /// + public string GiftTemplateSku { get; set; } + + /// + /// 主商品的赠品sku + /// + public string MainProductGiftSku { get; set; } + + /// + /// 奶妈模板的sku + /// + public string MotherTemplateSku { get; set; } + + /// + /// 主商品的sku (非赠品) + /// + public string MainProductSku { get; set; } + } } diff --git a/BBWY.Server.Model/Enums.cs b/BBWY.Server.Model/Enums.cs index 8272280a..0e66d157 100644 --- a/BBWY.Server.Model/Enums.cs +++ b/BBWY.Server.Model/Enums.cs @@ -237,7 +237,7 @@ } /// - /// 促销任务状态 + /// 促销任务状态 等待 = 0,进行中 = 1,已完成 = 2 /// public enum PromitionTaskStatus { diff --git a/BBWY.Test/JDProductAPITest.cs b/BBWY.Test/JDProductAPITest.cs index 12ab8fbd..5adc6875 100644 --- a/BBWY.Test/JDProductAPITest.cs +++ b/BBWY.Test/JDProductAPITest.cs @@ -34,9 +34,9 @@ namespace BBWY.Test //req.orderId = ; - req.beginDate = "2022-12-22"; + req.beginDate = "20221221"; - //req.endDate = "20221221"; + req.endDate = "20221222"; var response = client.Execute(req, token, DateTime.Now.ToLocalTime()); Console.WriteLine(JsonConvert.SerializeObject(response)); @@ -197,7 +197,6 @@ namespace BBWY.Test { var skusParamList = new List(); var updateSkuTitleParamList = new List(); - var transparentImageWriteAddRequestList = new List(); var imageWriteUpdateRequestList = new List(); var takeColorIndex = colorSaleAttrs.Count() - 1; @@ -247,27 +246,11 @@ namespace BBWY.Test attrValueAlias = new List() { giftSku.Title } }); - ////修改透图参数 - //var transparentImageWriteAddRequest = new TransparentImageWriteAddRequest() - //{ - // wareId = long.Parse(mainSpu), - // colorId = colorProperty.Value("id"), - // //colorId = "0000000000", - // imageUrl = toutuJToken.Value("imageUrl") - //}; - //transparentImageWriteAddRequestList.Add(transparentImageWriteAddRequest); - //修改商品细节图参数 var imgUrlBuilder = new StringBuilder(); var imgIndexBuilder = new StringBuilder(); imgUrlBuilder.Append($"{giftSku.Logo.Substring(giftSku.Logo.IndexOf("jfs"))},"); imgIndexBuilder.Append("1,"); - //for (var ii = 0; ii <= 3; ii++) - //{ - // var imgJToken = imagesByColorList[ii]; - // imgUrlBuilder.Append($"{imgJToken.Value("imgUrl")},"); - // imgIndexBuilder.Append($"{imgJToken.Value("imgIndex") + 1},"); - //} imageWriteUpdateRequestList.Add(new ImageWriteUpdateRequest() { wareId = long.Parse(mainSpu), @@ -276,7 +259,6 @@ namespace BBWY.Test imgIndex = imgIndexBuilder.ToString().Trim(',') }); - takeColorIndex--; skusParamList.Add(p); } @@ -334,20 +316,6 @@ namespace BBWY.Test Console.WriteLine(); } #endregion - - //#region 修改透图 - //foreach (var request in transparentImageWriteAddRequestList) - //{ - // Console.WriteLine("修改透图请求参数"); - // Console.WriteLine(JsonConvert.SerializeObject(request)); - // var res = client.Execute(request, token, DateTime.Now.ToLocalTime()); - - // Console.WriteLine(); - // Console.WriteLine("修改透图返回内容"); - // Console.WriteLine(JsonConvert.SerializeObject(res)); - // Console.WriteLine(); - //} - //#endregion } #endregion diff --git a/BBWY.Test/Program.cs b/BBWY.Test/Program.cs index f3685feb..e57bbc94 100644 --- a/BBWY.Test/Program.cs +++ b/BBWY.Test/Program.cs @@ -15,15 +15,15 @@ namespace BBWY.Test static void Main(string[] args) { - //var appkey = "120EA9EC65AB017567D78CC1139EEEA5"; - //var appSecret = "8a42bc2301e8439b896e99f5475e0a9b"; + var appkey = "E1AA9247D5583A6D87449CE6AB290185"; + var appSecret = "e479558ddd9e40f8929cfc00c6cbbc9c"; ////0e61c4a8ec3e4df4b5836e10884db9220yth 齐盛 ////2ace3023200c4ea9aa682bbf8bffee18jztm 布莱特玩具 - //var token = "0e61c4a8ec3e4df4b5836e10884db9220yth"; //"b46065ef5b894f2297686e28d39cb37a2mdy";//""; + var token = "01dc6f6e7fc34dcd99090d690312556cmdfk"; //齐盛 - var appkey = "120EA9EC65AB017567D78CC1139EEEA5"; - var appSecret = "8a42bc2301e8439b896e99f5475e0a9b"; - var token = "2ace3023200c4ea9aa682bbf8bffee18jztm"; + //var appkey = "120EA9EC65AB017567D78CC1139EEEA5"; + //var appSecret = "8a42bc2301e8439b896e99f5475e0a9b"; + //var token = "2ace3023200c4ea9aa682bbf8bffee18jztm"; //var path = @"C:\Users\pengcong001\Desktop\含赠品SKU.txt"; //var j = JToken.Parse(System.IO.File.ReadAllText(path, System.Text.Encoding.UTF8)); @@ -39,7 +39,7 @@ namespace BBWY.Test //10022515718131 需要进行赠品上架的SPU IJdClient client = GetJdClient(appkey, appSecret); var test1 = new JDProductAPITest(); - test1.QuerySPU(client, token); + test1.QueryOrderCount(client, token); //test1.ShangJiaTest(client, token); //test1.修改属性别名(client, token);