172 lines
8.1 KiB
C#
172 lines
8.1 KiB
C#
using AllBase;
|
|
using AllBase.Extension;
|
|
using NaiBa.Util.Extension;
|
|
using AllBase.Helper;
|
|
using AllBase.Model.Config;
|
|
using AllBase.Model.DBModel;
|
|
using AllBase.Model.Param.WXParam;
|
|
using AllBase.Model.Result;
|
|
using AllBase.Model.Result.PDDResult;
|
|
using AllBase.Model.Result.WXResult;
|
|
using Newtonsoft.Json;
|
|
using Newtonsoft.Json.Linq;
|
|
using Store.Product.Models.PublishParameters.Wx;
|
|
using Store.Product.Publish;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Work;
|
|
|
|
namespace Store.Product.Publish.Steps.Wx;
|
|
/// <summary>
|
|
/// 由 WXDBProdUploadForm.UploadProduct 的“构建SKU信息”区段迁移。
|
|
/// TODO(迁移): 原区段中的 TEMUKJD/WXUpload/窗体服务引用需按 Store.Product 运行时适配逐项核对。
|
|
/// </summary>
|
|
public sealed class BuildSkuInfoStep : WxProductPublishStepBase
|
|
{
|
|
public override string Description => "构建SKU信息";
|
|
|
|
protected override Task ExecuteProvider(WXPublishContext context, CancellationToken cancellationToken)
|
|
{
|
|
context.Parameters.ProductParameter.product.productSkus = new List<productSkuParam>();
|
|
context.Parameters.SkuIndex = 0;
|
|
context.Parameters.Id = 3;
|
|
context.Parameters.CatId = 200000000003;
|
|
context.Parameters.FCatId = 200000000003;
|
|
context.Parameters.ValueCatId = (17 + Randomx.GetNumber(11)).ParseToLong();
|
|
context.Parameters.DicSpecParentNameId = new Dictionary<string, long>();
|
|
context.Parameters.DicSpecParentNameCatId = new Dictionary<string, long>();
|
|
context.Parameters.DicSpecNameFCatId = new Dictionary<string, long>();
|
|
context.Parameters.DicSpecNameCatId = new Dictionary<string, long>();
|
|
foreach (var skuInfo in context.Parameters.ProdInfo.detail.sku)
|
|
{
|
|
foreach (var spec in skuInfo.spec)
|
|
{
|
|
if (!context.Parameters.DicSpecParentNameId.Keys.Contains(spec.parent_name))
|
|
{
|
|
context.Parameters.DicSpecParentNameId[spec.parent_name] = context.Parameters.Id++;
|
|
context.Parameters.DicSpecParentNameCatId[spec.parent_name] = context.Parameters.CatId++;
|
|
}
|
|
if (!context.Parameters.DicSpecNameFCatId.Keys.Contains(spec.spec_name))
|
|
{
|
|
context.Parameters.DicSpecNameFCatId[spec.spec_name] = context.Parameters.FCatId++;
|
|
context.Parameters.DicSpecNameCatId[spec.spec_name] = context.Parameters.ValueCatId++;
|
|
}
|
|
}
|
|
}
|
|
if (context.Product.ProductGetTypeText == "厂商直采" && !context.Parameters.ProdInfo.detail.sku.Any(s => s.quantity.ParseToInt() > 0))
|
|
{
|
|
throw new Exception("源商品库存为0");
|
|
}
|
|
foreach (var skuInfo in context.Parameters.ProdInfo.detail.sku)
|
|
{
|
|
productSkuParam skuParam = new productSkuParam();
|
|
context.Parameters.ProductParameter.product.productSkus.Add(skuParam);
|
|
for (int i = skuInfo.spec.Count - 1; i >= 0; i--)
|
|
{
|
|
var specInfo = skuInfo.spec[i];
|
|
skuParam.__skuKey = specInfo.parent_name + "." + specInfo.spec_name + "_";
|
|
skuParam.__skuKey += specInfo.spec_name;
|
|
}
|
|
skuParam.__skuKey.TrimEnd('_');
|
|
skuParam.index = context.Parameters.SkuIndex++;
|
|
skuParam.productSkuInfo = new productSkuInfoParam();
|
|
// 加价
|
|
skuParam.productSkuInfo.salePrice = (skuInfo.multi_price * context.Parameters.DefaultAddPriceRule.AddPriceTimes + context.Parameters.DefaultAddPriceRule.AddMorePrice * 100).ParseToInt();
|
|
if (context.Parameters.DefaultAddPriceRule.AddMorePriceFirst)
|
|
skuParam.productSkuInfo.salePrice = ((skuInfo.multi_price + context.Parameters.DefaultAddPriceRule.AddMorePrice * 100) * context.Parameters.DefaultAddPriceRule.AddPriceTimes).ParseToInt();
|
|
// 阶梯式加价,如果命中则按阶梯式加价进行
|
|
if (context.Parameters.DefaultAddPriceRule.IsStepAddPrice)
|
|
{
|
|
foreach (var addPrice in context.Parameters.AddPriceRules)
|
|
{
|
|
if (skuInfo.multi_price > addPrice.MoreThanPrice * 100 && skuInfo.multi_price <= addPrice.LessThanPrice * 100)
|
|
{
|
|
if (context.Parameters.DefaultAddPriceRule.AddMorePriceFirst) // 先加后乘
|
|
skuParam.productSkuInfo.salePrice = ((skuInfo.multi_price + addPrice.AddMorePrice * 100) * addPrice.AddPriceTimes).ParseToInt();
|
|
else
|
|
skuParam.productSkuInfo.salePrice = (skuInfo.multi_price * addPrice.AddPriceTimes + addPrice.AddMorePrice * 100).ParseToInt();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
// 聚水潭上微信小店,加运费(其他平台shipPrice默认为0)
|
|
skuParam.productSkuInfo.salePrice += (context.Parameters.ShipPrice * context.Parameters.DefaultAddPriceRule.ShippingPriceTimes).ParseToInt();
|
|
// 商品裂变随机增加价格
|
|
if (context.Parameters.IsFissionTitle && context.Parameters.IsFissionRandomPriceChange)
|
|
{
|
|
Invoke(new Action(() =>
|
|
{
|
|
var fissionRandomPrice = Randomx.GetId((context.Parameters.FissionRandomPriceChangeValue * 100).ParseToInt() + 1);
|
|
skuParam.productSkuInfo.salePrice += fissionRandomPrice;
|
|
}));
|
|
}
|
|
// sku图
|
|
skuParam.productSkuInfo.thumbImg = context.Parameters.ProductParameter.product.info.productSaleAttrs[0].items.FirstOrDefault(a => a.value == skuInfo.spec[0].spec_name)?.imgUrl;
|
|
if (context.Product.SpecialProdType == "爆款数据")
|
|
{
|
|
if (!skuInfo.out_sku_sn.StartsWith("BS")) // Best-seller 爆款
|
|
skuInfo.out_sku_sn = "BS" + skuInfo.out_sku_sn;
|
|
}
|
|
skuParam.productSkuInfo.skuCode = skuInfo.out_sku_sn;
|
|
skuParam.productSkuInfo.outSkuId = skuInfo.out_sku_sn;
|
|
skuParam.productSkuInfo.out_sku_id = skuInfo.out_sku_sn;
|
|
//skuParam.productSkuInfo.barCode = skuInfo.out_sku_sn; // 条形码
|
|
skuParam.skuKey.outSkuId = skuInfo.out_sku_sn;
|
|
skuParam.skuKey.productKey = new productKeyParam();
|
|
skuParam.skuKey.productKey.outProductId = context.Parameters.ProductParameter.product.info.spuCode;
|
|
// 库存
|
|
skuParam.productSkuInfo.stockInfo = new stockInfoParam() { stockNum = context.Parameters.DefaultAddPriceRule.StockNum };
|
|
// 厂商直采上家库存为0则按0上架
|
|
if (context.Product.ProductGetTypeText == "厂商直采" && skuInfo.quantity.IsNullOrZero())
|
|
skuParam.productSkuInfo.stockInfo.stockNum = 0;
|
|
skuParam.productSkuInfo.saleParam = new List<saleParamParam>();
|
|
foreach (var specInfo in skuInfo.spec)
|
|
{
|
|
saleParamParam saleParam = new saleParamParam();
|
|
skuParam.productSkuInfo.saleParam.Add(saleParam);
|
|
saleParam.categorys = new List<object>();
|
|
|
|
// specKey
|
|
categoryKeyParam skuCateKeyParam = new categoryKeyParam();
|
|
saleParam.categorys.Add(skuCateKeyParam);
|
|
skuCateKeyParam.isCustomize = true;
|
|
skuCateKeyParam.isMainSale = true;
|
|
skuCateKeyParam.name = specInfo.parent_name;
|
|
skuCateKeyParam.id = context.Parameters.DicSpecParentNameId[specInfo.parent_name].ParseToInt(); // 3;
|
|
skuCateKeyParam.catId = context.Parameters.DicSpecParentNameCatId[specInfo.parent_name];
|
|
skuCateKeyParam.label = "自定义规格";
|
|
skuCateKeyParam.catInfo = new skuCatInfoParam() { isCustomize = 1 };
|
|
skuCateKeyParam.catType = 8;
|
|
|
|
// specValue
|
|
categoryValueParam skuCateValueParam = new categoryValueParam();
|
|
saleParam.categorys.Add(skuCateValueParam);
|
|
skuCateValueParam.fCatId = context.Parameters.DicSpecNameFCatId[specInfo.spec_name];
|
|
skuCateValueParam.catId = context.Parameters.DicSpecNameCatId[specInfo.spec_name];
|
|
skuCateValueParam.name = specInfo.spec_name;
|
|
skuCateValueParam.skuNameValue = specInfo.spec_name;
|
|
skuCateValueParam.desc = "";
|
|
skuCateValueParam.catInfo = new categoryValueCatInfo() { editByUser = 1 };
|
|
skuCateValueParam.thumbImg = "";
|
|
var specIndex = skuInfo.spec.IndexOf(specInfo);
|
|
skuCateValueParam.priority = context.Parameters.ProdInfo.detail.sku.Select(s => s.spec[specIndex].spec_name).Distinct().ToList().IndexOf(specInfo.spec_name);
|
|
skuCateValueParam.selected = false;
|
|
}
|
|
skuParam.productSkuInfo.skuDeliverInfo = new skuDeliverInfoParam();
|
|
skuParam.productSkuInfo.stockDiff = new stockDiffParam() { diffType = 1, num = context.Parameters.DefaultAddPriceRule.StockNum };
|
|
// 厂商直采上家库存为0则按0上架
|
|
if (context.Product.ProductGetTypeText == "厂商直采" && skuInfo.quantity.IsNullOrZero())
|
|
skuParam.productSkuInfo.stockDiff.num = 0;
|
|
skuParam.status = 5;
|
|
}
|
|
return Task.CompletedTask;
|
|
}
|
|
}
|