同步SKU价格到汇总表,添加价格同步脚本
This commit is contained in:
158
.codebuddy/skills/sku-designer/scripts/sync-prices-to-summary.js
Normal file
158
.codebuddy/skills/sku-designer/scripts/sync-prices-to-summary.js
Normal file
@@ -0,0 +1,158 @@
|
|||||||
|
// 价格同步工具 - 将SKU文件中的价格信息同步到产品价格汇总表
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
// 产品目录路径
|
||||||
|
const PRODUCTS_DIR = path.join(__dirname, '../../../../产品');
|
||||||
|
const PRICE_SUMMARY_FILE = path.join(PRODUCTS_DIR, '产品价格汇总表.md');
|
||||||
|
|
||||||
|
// 读取价格汇总表内容
|
||||||
|
function readPriceSummary() {
|
||||||
|
return fs.readFileSync(PRICE_SUMMARY_FILE, 'utf8');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 写入价格汇总表内容
|
||||||
|
function writePriceSummary(content) {
|
||||||
|
fs.writeFileSync(PRICE_SUMMARY_FILE, content, 'utf8');
|
||||||
|
}
|
||||||
|
|
||||||
|
// 递归读取所有SKU文件
|
||||||
|
function findSkuFiles(dir) {
|
||||||
|
const skuFiles = [];
|
||||||
|
|
||||||
|
function traverse(currentDir) {
|
||||||
|
const files = fs.readdirSync(currentDir);
|
||||||
|
|
||||||
|
for (const file of files) {
|
||||||
|
const fullPath = path.join(currentDir, file);
|
||||||
|
const stat = fs.statSync(fullPath);
|
||||||
|
|
||||||
|
if (stat.isDirectory()) {
|
||||||
|
traverse(fullPath);
|
||||||
|
} else if (file.endsWith('.md') && (file.includes('-') || file.includes('openclaw'))) {
|
||||||
|
skuFiles.push(fullPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
traverse(dir);
|
||||||
|
return skuFiles;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析SKU文件内容
|
||||||
|
function parseSkuFile(filePath) {
|
||||||
|
try {
|
||||||
|
const content = fs.readFileSync(filePath, 'utf8');
|
||||||
|
|
||||||
|
const skuData = {
|
||||||
|
model: '',
|
||||||
|
cost: 0,
|
||||||
|
price: 0
|
||||||
|
};
|
||||||
|
|
||||||
|
// 解析产品型号
|
||||||
|
const modelMatch = content.match(/\*\*产品型号\*\*\s*\|\s*([^|]+)\s*\|/);
|
||||||
|
if (modelMatch) {
|
||||||
|
skuData.model = modelMatch[1].trim();
|
||||||
|
} else {
|
||||||
|
console.log(`未找到产品型号: ${filePath}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析总成本
|
||||||
|
const costMatch = content.match(/\*\*总成本\*\*\s*\|\s*-\s*\|\s*¥(\d+)\s*\|/);
|
||||||
|
if (costMatch) {
|
||||||
|
skuData.cost = parseInt(costMatch[1]);
|
||||||
|
} else {
|
||||||
|
console.log(`未找到总成本: ${filePath}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 解析建议零售价
|
||||||
|
const priceMatch = content.match(/\*\*建议零售价\*\*\s*\|\s*-\s*\|\s*¥(\d+)\s*\|/);
|
||||||
|
if (priceMatch) {
|
||||||
|
skuData.price = parseInt(priceMatch[1]);
|
||||||
|
} else {
|
||||||
|
console.log(`未找到建议零售价: ${filePath}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skuData.model && skuData.cost && skuData.price) {
|
||||||
|
console.log(`解析成功: ${skuData.model} - 成本: ¥${skuData.cost}, 售价: ¥${skuData.price}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return skuData;
|
||||||
|
} catch (error) {
|
||||||
|
console.log(`解析文件失败: ${filePath}, 错误: ${error.message}`);
|
||||||
|
return { model: '', cost: 0, price: 0 };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 同步价格信息到汇总表
|
||||||
|
function syncPrices() {
|
||||||
|
console.log('开始同步SKU价格到汇总表...');
|
||||||
|
|
||||||
|
// 读取所有SKU文件
|
||||||
|
const skuFiles = findSkuFiles(PRODUCTS_DIR);
|
||||||
|
console.log(`找到 ${skuFiles.length} 个SKU文件`);
|
||||||
|
|
||||||
|
// 解析所有SKU文件
|
||||||
|
const skuDataMap = new Map();
|
||||||
|
let parsedCount = 0;
|
||||||
|
|
||||||
|
for (const file of skuFiles) {
|
||||||
|
const skuData = parseSkuFile(file);
|
||||||
|
if (skuData.model && skuData.cost && skuData.price) {
|
||||||
|
skuDataMap.set(skuData.model, skuData);
|
||||||
|
parsedCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`解析完成 ${parsedCount} 个SKU数据`);
|
||||||
|
|
||||||
|
// 读取汇总表内容
|
||||||
|
let summaryContent = readPriceSummary();
|
||||||
|
|
||||||
|
// 更新日期
|
||||||
|
const today = new Date().toISOString().split('T')[0];
|
||||||
|
summaryContent = summaryContent.replace(/更新日期:\d{4}-\d{2}-\d{2}/, `更新日期:${today}`);
|
||||||
|
|
||||||
|
// 逐行处理汇总表,避免一次性处理大文件
|
||||||
|
const lines = summaryContent.split('\n');
|
||||||
|
const updatedLines = [];
|
||||||
|
let updatedCount = 0;
|
||||||
|
|
||||||
|
for (const line of lines) {
|
||||||
|
let updatedLine = line;
|
||||||
|
|
||||||
|
// 检查是否是产品行
|
||||||
|
const modelMatch = line.match(/\|\s*\d+\s*\|\s*([^|]+)\s*\|\s*¥\d+\s*\|\s*¥\d+\s*\|\s*¥\d+\s*\|\s*\d+%\s*\|/);
|
||||||
|
if (modelMatch) {
|
||||||
|
const model = modelMatch[1].trim();
|
||||||
|
const skuData = skuDataMap.get(model);
|
||||||
|
|
||||||
|
if (skuData) {
|
||||||
|
const profit = skuData.price - skuData.cost;
|
||||||
|
const profitRate = Math.round((profit / skuData.cost) * 100);
|
||||||
|
|
||||||
|
// 找到行中的序号
|
||||||
|
const indexMatch = line.match(/\|\s*(\d+)\s*\|/);
|
||||||
|
const index = indexMatch ? indexMatch[1] : '1';
|
||||||
|
|
||||||
|
updatedLine = `| ${index} | ${model} | ¥${skuData.cost} | ¥${skuData.price} | ¥${profit} | ${profitRate}% |`;
|
||||||
|
updatedCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
updatedLines.push(updatedLine);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重新组合内容
|
||||||
|
const updatedContent = updatedLines.join('\n');
|
||||||
|
|
||||||
|
// 写入更新后的汇总表
|
||||||
|
writePriceSummary(updatedContent);
|
||||||
|
|
||||||
|
console.log(`同步完成!更新了 ${updatedCount} 个产品的价格信息`);
|
||||||
|
console.log(`价格汇总表已更新,更新日期:${today}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 执行同步
|
||||||
|
syncPrices();
|
||||||
1
user-guide/verification.html
Normal file
1
user-guide/verification.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
verify_ca7a78c8e20649ca3dd554910f193123
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# 全部产品成本与售价汇总表
|
# 全部产品成本与售价汇总表
|
||||||
|
|
||||||
> 更新日期:2026-04-14
|
> 更新日期:2026-04-26
|
||||||
> 定价策略:亚克力单:2G内存成本+20元,4G内存成本+30元;基础版:成本+30;高性能版i3:2代+50,3代+60,4代+70,5代+80;高性能版i5:成本+80;高性能版J1900:成本+50;高性能版J3160:成本+70
|
> 定价策略:亚克力单:2G内存成本+20元,4G内存成本+30元;基础版:成本+30;高性能版i3:2代+50,3代+60,4代+70,5代+80;高性能版i5:成本+80;高性能版J1900:成本+50;高性能版J3160:成本+70
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -12,18 +12,18 @@
|
|||||||
| 1 | 亚克力-单-N2840-2G-16G | ¥136 | ¥156 | ¥20 | 15% |
|
| 1 | 亚克力-单-N2840-2G-16G | ¥136 | ¥156 | ¥20 | 15% |
|
||||||
| 2 | 亚克力-单-N2930-2G-16G | ¥141 | ¥161 | ¥20 | 14% |
|
| 2 | 亚克力-单-N2930-2G-16G | ¥141 | ¥161 | ¥20 | 14% |
|
||||||
| 3 | 亚克力-单-N2930-2G-32G | ¥146 | ¥166 | ¥20 | 14% |
|
| 3 | 亚克力-单-N2930-2G-32G | ¥146 | ¥166 | ¥20 | 14% |
|
||||||
| 4 | 亚克力-单-N2930-4G-64G | ¥203 | ¥233 | ¥30 | 15% |
|
| 4 | 亚克力-单-N2930-4G-64G | ¥178 | ¥208 | ¥30 | 17% |
|
||||||
| 5 | 亚克力-单-N2930-4G-128G | ¥206 | ¥236 | ¥30 | 15% |
|
| 5 | 亚克力-单-N2930-4G-128G | ¥206 | ¥236 | ¥30 | 15% |
|
||||||
| 6 | 亚克力-单-AMD-A4-2G-16G | ¥136 | ¥156 | ¥20 | 15% |
|
| 6 | 亚克力-单-AMD-A4-2G-16G | ¥136 | ¥156 | ¥20 | 15% |
|
||||||
| 7 | 亚克力-单-AMD-A4-2G-32G | ¥141 | ¥161 | ¥20 | 14% |
|
| 7 | 亚克力-单-AMD-A4-2G-32G | ¥141 | ¥161 | ¥20 | 14% |
|
||||||
| 8 | 亚克力-单-AMD-A4-4G-64G | ¥198 | ¥228 | ¥30 | 15% |
|
| 8 | 亚克力-单-AMD-A4-4G-64G | ¥173 | ¥203 | ¥30 | 17% |
|
||||||
| 9 | 亚克力-单-J1900-2G-16G | ¥171 | ¥191 | ¥20 | 12% |
|
| 9 | 亚克力-单-J1900-2G-16G | ¥171 | ¥191 | ¥20 | 12% |
|
||||||
| 10 | 亚克力-单-J1900-2G-32G | ¥176 | ¥196 | ¥20 | 11% |
|
| 10 | 亚克力-单-J1900-2G-32G | ¥176 | ¥196 | ¥20 | 11% |
|
||||||
| 11 | 亚克力-单-J1900-4G-64G | ¥233 | ¥263 | ¥30 | 13% |
|
| 11 | 亚克力-单-J1900-4G-64G | ¥208 | ¥238 | ¥30 | 14% |
|
||||||
| 12 | 亚克力-单-J1900-4G-128G | ¥236 | ¥266 | ¥30 | 13% |
|
| 12 | 亚克力-单-J1900-4G-128G | ¥236 | ¥266 | ¥30 | 13% |
|
||||||
| 13 | 亚克力-单-J3160-2G-16G | ¥181 | ¥201 | ¥20 | 11% |
|
| 13 | 亚克力-单-J3160-2G-16G | ¥181 | ¥201 | ¥20 | 11% |
|
||||||
| 14 | 亚克力-单-J3160-2G-32G | ¥186 | ¥206 | ¥20 | 11% |
|
| 14 | 亚克力-单-J3160-2G-32G | ¥186 | ¥206 | ¥20 | 11% |
|
||||||
| 15 | 亚克力-单-J3160-4G-64G | ¥243 | ¥273 | ¥30 | 12% |
|
| 15 | 亚克力-单-J3160-4G-64G | ¥218 | ¥248 | ¥30 | 14% |
|
||||||
| 16 | 亚克力-单-J3160-4G-128G | ¥246 | ¥276 | ¥30 | 12% |
|
| 16 | 亚克力-单-J3160-4G-128G | ¥246 | ¥276 | ¥30 | 12% |
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -33,17 +33,17 @@
|
|||||||
| 序号 | 产品型号 | 成本 | 售价 | 利润 | 利润率 |
|
| 序号 | 产品型号 | 成本 | 售价 | 利润 | 利润率 |
|
||||||
|:---:|---------|:----:|:----:|:----:|:------:|
|
|:---:|---------|:----:|:----:|:----:|:------:|
|
||||||
| 1 | 亚克力-双-1037U-2G-16G | ¥173 | ¥225 | ¥52 | 30% |
|
| 1 | 亚克力-双-1037U-2G-16G | ¥173 | ¥225 | ¥52 | 30% |
|
||||||
| 2 | 亚克力-双-1037U-2G-32G | ¥183 | ¥238 | ¥55 | 30% |
|
| 2 | 亚克力-双-1037U-2G-32G | ¥178 | ¥231 | ¥53 | 30% |
|
||||||
| 3 | 亚克力-双-1037U-4G-64G | ¥228 | ¥296 | ¥68 | 30% |
|
| 3 | 亚克力-双-1037U-4G-64G | ¥210 | ¥273 | ¥63 | 30% |
|
||||||
| 4 | 亚克力-双-1037U-4G-128G | ¥251 | ¥326 | ¥75 | 30% |
|
| 4 | 亚克力-双-1037U-4G-128G | ¥238 | ¥309 | ¥71 | 30% |
|
||||||
| 5 | 亚克力-双-3217U-2G-16G | ¥183 | ¥238 | ¥55 | 30% |
|
| 5 | 亚克力-双-3217U-2G-16G | ¥173 | ¥225 | ¥52 | 30% |
|
||||||
| 6 | 亚克力-双-3217U-2G-32G | ¥193 | ¥251 | ¥58 | 30% |
|
| 6 | 亚克力-双-3217U-2G-32G | ¥178 | ¥231 | ¥53 | 30% |
|
||||||
| 7 | 亚克力-双-3217U-4G-64G | ¥238 | ¥309 | ¥71 | 30% |
|
| 7 | 亚克力-双-3217U-4G-64G | ¥210 | ¥273 | ¥63 | 30% |
|
||||||
| 8 | 亚克力-双-3217U-4G-128G | ¥261 | ¥339 | ¥78 | 30% |
|
| 8 | 亚克力-双-3217U-4G-128G | ¥238 | ¥309 | ¥71 | 30% |
|
||||||
| 9 | 亚克力-双-5005U-2G-16G | ¥198 | ¥257 | ¥59 | 30% |
|
| 9 | 亚克力-双-5005U-2G-16G | ¥268 | ¥349 | ¥81 | 30% |
|
||||||
| 10 | 亚克力-双-5005U-2G-32G | ¥208 | ¥270 | ¥62 | 30% |
|
| 10 | 亚克力-双-5005U-2G-32G | ¥273 | ¥355 | ¥82 | 30% |
|
||||||
| 11 | 亚克力-双-5005U-4G-64G | ¥253 | ¥329 | ¥76 | 30% |
|
| 11 | 亚克力-双-5005U-4G-64G | ¥305 | ¥397 | ¥92 | 30% |
|
||||||
| 12 | 亚克力-双-5005U-4G-128G | ¥276 | ¥359 | ¥83 | 30% |
|
| 12 | 亚克力-双-5005U-4G-128G | ¥333 | ¥433 | ¥100 | 30% |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -152,7 +152,7 @@
|
|||||||
| 1 | 亚克力-双-J1900-4G-32G | ¥243 | ¥293 | ¥50 | 21% |
|
| 1 | 亚克力-双-J1900-4G-32G | ¥243 | ¥293 | ¥50 | 21% |
|
||||||
| 2 | 亚克力-双-J1900-4G-64G | ¥263 | ¥313 | ¥50 | 19% |
|
| 2 | 亚克力-双-J1900-4G-64G | ¥263 | ¥313 | ¥50 | 19% |
|
||||||
| 3 | 亚克力-双-J1900-8G-64G | ¥313 | ¥363 | ¥50 | 16% |
|
| 3 | 亚克力-双-J1900-8G-64G | ¥313 | ¥363 | ¥50 | 16% |
|
||||||
| 4 | 亚克力-双-J1900-8G-128G | ¥341 | ¥391 | ¥50 | 14% |
|
| 4 | 亚克力-双-J1900-8G-128G | ¥341 | ¥391 | ¥50 | 15% |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user