Files
KJD/Store.Product/Publish/Steps/Wx/BuildSkuInfoStep.cs
T
2026-09-14 09:16:59 +08:00

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;
}
}