⚠ 页面加载失败

请尝试:1) 强制刷新 (Ctrl+Shift+R) 2) 清除缓存 3) 检查网络/VPN

🔐 需要登录

请登录以访问系统

仪表盘

{{ stats.products }}
产品总数
{{ stats.shops }}
店铺数量
{{ stats.pendingTasks }}
待处理任务
{{ stats.workers }}
在线工作机

快速操作

图片包管理

📦 批量上传图片包

上传队列

📄 {{ item.name }} ({{ Math.round(item.size / 1024 / 1024) }}MB)
等待中 上传中...
总进度 {{ batchUploadProgress.completed }}/{{ batchUploadProgress.total }}

{{ uploadStatus }}

💡 支持格式:ZIP, RAR (仅支持这两种格式)

💡 选择文件夹会自动扫描其中所有的压缩包

💡 支持并行上传,最多同时上传 8 个文件

{{ packageTotal }}
总记录数
{{ packages.filter(p => p.status === 'pending').length }}
待处理
{{ packages.filter(p => p.ai_analyzed).length }}
已 AI 分析
{{ packages.filter(p => p.products && p.products.length > 0).length }}
已创建产品
{{ totalImages }}
图片总数
{{ packages.filter(p => p.ai_analyzed && getPackageValidation(p).status === 'incomplete').length }}
数据不完整
加载中...

{{ record.archive_filename }}

供应商:{{ record.supplier }} 型号:{{ record.model }} 价格:¥{{ record.price }}
{{ record.status }} ✓ 完整 缺 {{ getPackageValidation(record).missingFields.length }} 项
已创建: {{ p.spu || p.id?.substring(0,8) }}{{ idx < record.products.length - 1 ? ', ' : '' }}
主图:{{ record.main_images?.length || 0 }} | 详情:{{ record.detail_images?.length || 0 }} | SKU: {{ record.sku_images?.length || 0 }} ({{ Math.round(record.archive_size / 1024 / 1024) }}MB) | 单图识别:{{ record.image_inferred_count }}/{{ record.image_count }}
AI 建议标题: {{ record.ai_content.title }}
{{ new Date(record.created_at).toLocaleString() }}

暂无图片包记录,请先上传压缩包

共 {{ packageTotal }} 条,第 {{ packagePage }}/{{ Math.ceil(packageTotal / packagePageSize) }} 页
{{ packagePage }}

🔄 批量推理进行中

{{ batchInferStatus }}

{{ batchInferProgress.total }}
总计
{{ batchInferProgress.success }}
成功
{{ batchInferProgress.failed }}
失败
{{ batchInferProgress.skipped }}
跳过

请勿关闭页面,推理将在后台继续...

🛒 发布到 SHEIN

{{ spPackage?.archive_filename }}

{{ s < spStep ? '✓' : s }}

Step 1: 选择 SHEIN 店铺

包信息概要
SPU: {{ spPackage.spu || '未设置' }}
供应商: {{ spPackage.supplier || '-' }}
型号: {{ spPackage.model || '-' }}
价格: ¥{{ spPackage.price || 0 }}
材质: {{ spPackage.material || '-' }}
性别: {{ spPackage.gender || '-' }}
颜色: {{ (spPackage.color || []).join(', ') || '-' }}
英文标题: {{ spPackage.title_en || '-' }}

Step 2: 选择要发布的颜色

每个颜色 = 一个 SKC。请勾选需要发布的颜色。

该图片包没有颜色信息,请先运行 AI 识别。

Step 3: 设置价格和库存

包信息参考价: ¥{{ spPackage?.price || 0 }}

Step 4: 预览图片选择

正在自动选择图片...
颜色: {{ sel.color }}
方图 (1200x1200)
将自动裁剪生成
无可用图片
模特图 ({{ sel.model_images.length }}/6)
无模特图
白底图
无白底图
尺寸图 ({{ sel.size_images.length }})
无尺寸图
内部图 ({{ sel.internal_images.length }})
无内部图
注意: 有 {{ spUninferredCount }} 张图片未进行单图推理,可能影响图片选择质量。建议先运行"批量单图推理"。

Step 5: AI 匹配类目和颜色

类目匹配
类目: {{ spCategoryMatch.category_name }}
ID: {{ spCategoryMatch.category_id }} / Product Type: {{ spCategoryMatch.product_type_id }}
{{ spCategoryMatch.reason }}
颜色属性匹配
请先匹配类目
{{ colorName }} {{ mapping.name }} (ID: {{ mapping.attribute_value_id }})

Step 6: 确认并提交

必填属性
无必填属性或尚未加载
发布概要
SPU: {{ spPackage?.spu }}
标题: {{ spPackage?.title_en }}
类目: {{ spCategoryMatch?.category_name }} ({{ spCategoryMatch?.category_id }})
颜色数: {{ spSelectedColors.length }} 个 SKC
供货价: ¥{{ spCostPrice }}
库存: {{ spInventory }}
{{ spSubmitResult.success ? '发布成功!' : '发布失败' }}
{{ spSubmitResult.message || spSubmitResult.error }}
校验错误详情:
  • {{ ve.field || '未知字段' }}: {{ ve.message }}
查看完整返回
{{ JSON.stringify(spSubmitResult.detail, null, 2) }}
步骤 {{ spStep }} / 6

产品管理

无图片
{{ p.spu || '-' }}

{{ p.name || '(未命名)' }}

供应商:{{ p.supplier }} 型号:{{ p.model }}
{{ p.status }}
成本价:¥{{ p.cost_price || 0 }} {{ new Date(p.created_at).toLocaleString() }}

暂无产品,请先上传图片包

从图片记录创建产品

格式:供应商拼音大写_型号

默认使用:压缩包文件名 + 文件夹名

加载中...
暂无图片

AI 建议

标题: {{ selectedRecord.ai_content.title }}

关键词: {{ selectedRecord.ai_content.keywords?.join(', ') }}

价格区间: ¥{{ selectedRecord.ai_content.suggested_price_range?.[0] }} - ¥{{ selectedRecord.ai_content.suggested_price_range?.[1] }}

编辑图片包信息

格式:供应商拼音首字母大写 + 下划线 + 型号

AI 分析结果

标题: {{ selectedRecord.ai_content.title_cn }}

材质: {{ selectedRecord.ai_content.material }}

风格: {{ selectedRecord.ai_content.style }}

价格建议: ¥{{ selectedRecord.ai_content.suggested_price_range?.[0] }} - ¥{{ selectedRecord.ai_content.suggested_price_range?.[1] }}

👜 AI 识别包包属性

说明:选择宽度约 750px 的前 10 张图片进行 AI 分析,自动识别包包的尺寸、材质、颜色等属性

供应商信息:
供应商: {{ inferenceResult.supplier }}
型号: {{ inferenceResult.model }}
价格: ¥{{ inferenceResult.price }}
包包属性:
宽度: {{ inferenceResult.width }} cm
高度: {{ inferenceResult.height }} cm
厚度: {{ inferenceResult.thickness }} cm
重量: {{ inferenceResult.weight }} kg
材质: {{ inferenceResult.material }}
适用性别: {{ inferenceResult.gender }}
肩带数量: {{ inferenceResult.strap_count }}
颜色: {{ inferenceResult.color.join(', ') }}
内部结构: {{ inferenceResult.internal_structure }}
功能: {{ inferenceResult.function_features.join(', ') }}
销售版本: {{ inferenceResult.sales_versions }}
电商信息:
中文标题: {{ inferenceResult.title_cn }}
英文标题: {{ inferenceResult.title_en }}
电商描述: {{ inferenceResult.ecommerce_description.substring(0, 100) }}...

发布产品到店铺

产品:{{ selectedProduct?.name }}

{{ shop.name }} ({{ shop.platform }}) → {{ shop.worker_id }}

店铺管理

{{ shop.name }}

{{ shop.platform }}
{{ shop.status }}

产品数:{{ shop.product_count }} | 待发订单:{{ shop.pending_orders }}

绑定 Worker: {{ shop.worker_id }} 未绑定

暂无店铺,请先添加

{{ editingShop ? '编辑店铺' : '添加店铺' }}

TikTok 全托管登录信息

浏览器数据目录自动管理:server/playwright_data/{店铺ID}/

任务列表

ID 类型 平台/店铺 Worker 状态 创建时间
{{ task.id?.substring(0,8) }} {{ task.type }} {{ task.platform }} / {{ task.shop_id?.substring(0,8) }} {{ task.assigned_worker || '-' }} {{ task.status }} {{ new Date(task.created_at).toLocaleString() }}

暂无任务

工作机状态

{{ worker.name || worker.worker_id }}

{{ worker.worker_id }}

{{ worker.status }}

支持平台:{{ worker.capabilities?.join(', ') }}

CPU: {{ worker.cpu_usage?.toFixed(1) }}% | 内存:{{ worker.memory_usage?.toFixed(1) }}%

浏览器:{{ worker.browser_instances }}/{{ worker.max_browser_instances }}

最后心跳:{{ new Date(worker.last_heartbeat).toLocaleString() }}

暂无工作机连接

🤖 AI 提供者管理

{{ provider.name }}

{{ provider.base_url }}

{{ model.display_name || model.name }} (禁用)
{{ provider.is_active ? '已启用' : '已禁用' }}

暂无 AI 提供者配置


🎯 包包识别配置

配置 AI 识别包包属性时使用的固定模型,设置后图片包列表的"AI 识别"按钮将自动使用此配置。

✅ 当前启用: {{ activeInferenceConfig.provider_name || '未知提供者' }} {{ activeInferenceConfig.model_name }}

⚠️ 暂无启用的配置,请添加配置以使用 AI 识别功能

{{ config.provider_name || '未知提供者' }} → {{ config.model_name }}

创建时间:{{ new Date(config.created_at).toLocaleString() }}

{{ config.is_active ? '已启用' : '已禁用' }}

暂无 AI 识别配置


🖼️ 单图识别配置

配置 AI 识别单张图片时使用的固定模型,设置后图片列表中的"AI 识别"按钮将自动使用此配置。

✅ 当前启用: {{ activeImageInferenceConfig.provider_name || '未知提供者' }} {{ activeImageInferenceConfig.model_name }} | 并发: {{ activeImageInferenceConfig.max_concurrency || 10 }}

⚠️ 暂无启用的配置,请添加配置以使用 AI 单图识别功能

{{ config.provider_name || '未知提供者' }} → {{ config.model_name }} 并发: {{ config.max_concurrency || 10 }}

创建时间:{{ new Date(config.created_at).toLocaleString() }}

{{ config.is_active ? '已启用' : '已禁用' }}

暂无 AI 单图识别配置


💬 AI 助手配置

配置 AI 聊天助手使用的固定模型,设置后 AI 助手将自动使用此配置。

✅ 当前启用: {{ activeChatConfig.provider_name || '未知提供者' }} {{ activeChatConfig.model_name }}

⚠️ 暂无启用的配置,请添加配置以使用 AI 助手功能

{{ config.provider_name || '未知提供者' }} → {{ config.model_name }}

创建时间:{{ new Date(config.created_at).toLocaleString() }}

{{ config.is_active ? '已启用' : '已禁用' }}

暂无 AI 助手配置

{{ editingChatConfig ? '编辑 AI 助手配置' : '添加 AI 助手配置' }}

{{ editingImageInferenceConfig ? '编辑单图识别配置' : '添加单图识别配置' }}

批量推理和一键推理时的最大并发数量(1-50),建议 5-15

{{ editingInferenceConfig ? '编辑识别配置' : '添加识别配置' }}

📷 图片列表 - {{ selectedRecord?.archive_filename || '' }}

✓ 已识别:{{ selectedPackageImages.filter(i => getImageValidation(i).status === 'complete').length }} ○ 未识别:{{ selectedPackageImages.filter(i => getImageValidation(i).status !== 'complete').length }} | 🎨 颜色参考图已标记 ⚠ 缺少颜色参考图
{{ img.filename }}
{{ img.folder_name }} {{ img.width }}x{{ img.height }}
✓ 已识别 ○ 未识别 🎨 颜色参考图
颜色: {{ img.color.join(', ') }} {{ img.color }}
白底:{{ img.is_white_background ? '✓ 是' : '✗ 否' }}
模特:{{ img.is_model_photo ? '✓ 是' : '✗ 否' }}
内部:{{ img.is_internal ? '✓ 是' : '✗ 否' }}
文字:{{ img.has_text ? '✓ 有' : '✗ 无' }}
尺寸标注:{{ img.has_size_mark ? '✓ 有' : '✗ 无' }}

暂无图片

{{ editingProvider ? '编辑 AI 提供者' : '添加 AI 提供者' }}

唯一标识符,不能与其他提供者重复

兼容 OpenAI 格式的 API 地址

API Key 或访问令牌

远程浏览器控制

选择一个在线的工作机,查看其浏览器画面并进行远程操作

{{ remoteUrl }}
等待画面...

🖥️

选择工作机并连接以查看远程画面

🛒 SHEIN 授权管理

授权流程:

  1. 添加 SHEIN 开放平台的应用配置(APP_ID + APP_SecretKey)
  2. 点击"发起授权"生成授权链接,在浏览器中打开
  3. 商家登录 SHEIN 并同意授权后,系统自动完成密钥换取并创建店铺

应用配置

{{ app.name }}

APP_ID: {{ app.app_id }}

Secret: {{ app.app_secret_masked }}

环境: {{ app.environment === 'production' ? '生产' : '测试' }}

回调: {{ app.redirect_url }}

暂无应用配置

授权页面已在新窗口打开,请在 SHEIN 页面完成授权。

授权成功后系统将自动换取密钥并创建店铺。


已授权的 SHEIN 店铺

{{ shop.name }}

OpenKeyId: {{ shop.open_key_id }}

SecretKey: {{ shop.secret_key_status }} {{ shop.secret_key_masked }}

环境: {{ shop.environment === 'production' ? '生产' : '测试' }}

授权时间: {{ shop.authorized_at }}

{{ shop.status }}

基础信息

商品 & 库存

订单 & 履约

财务

查询中...

暂无已授权的 SHEIN 店铺

{{ {products:'商品列表', orders:'采购单', deliveries:'发货单', brands:'品牌列表', categories:'类目树', sites:'站点/货币', warehouses:'收货仓', 'store-info':'店铺信息', 'ip-list':'IP白名单', 'stock-goods':'备货信息', 'express-list':'物流产品', finance:'报账单', 'sync-categories':'类目同步结果', 'publish-standard':'发布规范', 'sync-attributes':'属性模板', 'transform-image':'图片转换', 'product-review':'审核结果'}[sheinQueryType] || '查询结果' }}

{{ JSON.stringify(sheinQueryResult, null, 2) }}

添加 SHEIN 应用配置

授权成功后 SHEIN 将重定向到此地址

📊 亚马逊运营

店铺
还没有配置亚马逊店铺。

📤 亚马逊刊登

流程:从图片包起草 → 大模型识别产品信息 → 人工核验修改 → 提交刊登。 识别结果只是初稿,图片与文案都可以改完再提交。
{{ d.name }} {{ amzListingStatusText(d.status) }} {{ d.product_type }} 已 AI 识别
{{ d.title || '(未填标题)' }}
SKU {{ d.sku || '—' }} | 售价 {{ d.price || '—' }} | 图片 {{ d.images.length }} 张
还差 {{ d.problems.length }} 项:{{ d.problems.slice(0,2).join(';') }}
{{ d.publish_error.slice(0,180) }}

还没有单品草稿,点右上角「从图片包起草」开始。多变体商品在「🎨 多变体」里。

父 SKU 只负责把子归到一个商品页,本身不可售;买家看到的价格与库存来自各个子 SKU。 标题、五点、描述、必填属性整族共享,只需填一次;每个子只填自己的颜色、Color Map、SKU 与图片。
{{ f.name }} {{ f.theme || 'COLOR' }} · {{ f.children }} 个子变体 {{ f.product_type }} 已刊登 {{ f.published }} 个
{{ f.title || '(未填标题)' }}
父 SKU {{ f.parent_sku || '—' }} | 颜色:{{ f.colors.join('、') || '—' }}
还差 {{ f.problems }} 项没填完

还没有变体族,点右上角「从图片包建变体族」开始

变体族核验 · {{ amzFam.shared.name }} 父 {{ amzFam.shared.parent_sku }} + {{ amzFam.children.length }} 个子

共享信息 父与所有子一致

当前:{{ amzFam.shared.product_type }}

决定买家在商品页上看到的切换维度

商品属性 {{ amzAttrDefs.length ? (amzAttrDefs.length + ' 项,按产品类型要求;整族共享') : '选好产品类型后加载' }}

标 * 的是 Amazon 必填。有下拉的必须从选项里选,自己填的值会被拒。 颜色不在这里填 —— 它是每个子变体各自的维度,在下面的子变体表里填。 类型 schema 声明的必填项是不全的,点「问 Amazon 要必填清单」会做一次 只校验不落库的提交,把真正缺的属性全问出来。

{{ amzFamCheck.total_errors ? ('Amazon 校验出 ' + amzFamCheck.total_errors + ' 个问题') : 'Amazon 校验通过,可以提交' }}

[{{ r.role }}] {{ r.sku }}: {{ r.error.slice(0,160) }} {{ r.errors.map(e => e.message).slice(0,6).join(';') }}

子 SKU 报的「找不到父 SKU」是预期内的 —— 父还没真正提交,已忽略。

{{ a.title }} {{ a.name }} 选填

选好产品类型后点「加载属性」,会按该类型的要求列出需要填的项

公共图片 父 SKU 用,{{ amzFam.shared.images.length }}/9 张
{{ img.role || '-' }}

没有公共图 —— 父 SKU 也需要图片

子变体 每个子只需填颜色、Color Map、SKU、价格库存与自己的图
还差:{{ c.problems.join(';') }}
{{ c.publish_error.slice(0,200) }}
{{ c.color_name || '本变体' }} 的图片({{ c.images.length }}/9),第一张是主图
{{ img.role || '-' }}

共享部分还差:

  • {{ p }}
{{ amzFamSaving ? '保存中...' : '已保存' }}

从图片包挑图 点一张就加进去

{{ img.colors.join('/') }}

图片包里没有图片

共 {{ amzOnlineTotal }} 个在线商品,当前列出 {{ amzOnlineItems.length }} 个。 改动走增量补丁,只提交动过的字段,没动的属性 Amazon 那边原样保留。

{{ it.sku }} {{ it.asin }} 可售 已上架未可售 未上架 {{ it.fulfillment_channel === 'AMAZON_NA' ? 'FBA' : (it.fulfillment_channel ? '自发货' : '无报价') }} {{ it.error_count }} 个错误
{{ it.title }}
{{ it.product_type }} | 价 {{ it.price ?? '—' }} {{ it.currency }} | 库存 {{ it.quantity ?? '(FBA 管理)' }}

{{ amzOnlineBusy ? '读取中...' : '没有商品' }}

在线商品 · {{ amzOnline.sku }} {{ amzOnline.asin }} · {{ amzOnline.product_type }}

Amazon 当前报出的问题:

[{{ is.severity }}] {{ is.message }}

改成 FBA 会取消自发货报价,可售数量由亚马逊仓的实际入库决定

商品属性 {{ amzOnlineDefs.length }} 项,当前是 Amazon 上的值
{{ a.title }} {{ a.name }}

这个商品没有可编辑的属性,点「添加属性」挑要填的

只提交动过的字段 · 建议先预检

添加属性 点一项就加进表单

{{ o.title }} {{ o.name }} (已在表单里)
{{ o.description }}

搜一下,或点「常用」看尺寸、重量、包装这些常填的

{{ b.name }} {{ {draft:'编辑中', generated:'已展开', done:'已完成', failed:'部分失败'}[b.status] || b.status }}
{{ b.package_ids.length }} 个图片包 | {{ b.product_type || '未选类型' }} | {{ b.brand || '未选品牌' }} | ${{ b.price || '—' }} | 已展开 {{ b.generated_count }} 份
还差 {{ b.problems.length }} 项:{{ b.problems.slice(0,2).join(';') }}

还没有批次,点右上角「新建批次」开始

批量刊登 · {{ amzLbBatch.name }}

图片包 已选 {{ amzLbBatch.package_ids.length }} 个,一个包对应一个商品

点「刷新列表」加载图片包

公共配置 套用到本批次每个商品

占位符:{spu} {model} {index}

已展开 {{ amzLbDrafts.length }} 份草稿

{{ amzListingStatusText(d.status) }} {{ d.sku }} {{ d.title || d.name }} 差 {{ d.problems.length }} 项
{{ amzLbSaving ? '保存中...' : '已保存' }}

选择图片包

多颜色的商品点「建变体族」—— 会按包里的颜色生成 1 个父 SKU + 每色 1 个子 SKU, 父不可售只管归类,子各自带价格库存与本色图片。
{{ p.product_name || p.archive_filename }} {{ p.color }} {{ p.image_count }} 张图

没有可用的图片包

刊登核验 · {{ amzListing.name }} 父 SKU · 不可售 子 SKU · 归属 {{ amzListing.parent_sku }}

图片核验 主图必选,其余为附图

没有图片

当前:{{ amzListing.product_type }}

父 SKU 不可售,不需要价格与库存 —— 买家看到的价格来自各个子 SKU。

文案核验 大模型已生成,请逐项确认

还没有品牌数据,点上面的「从亚马逊同步品牌」拉一次(之后读库,不必每次同步)。

商品属性 {{ amzAttrDefs.length ? (amzAttrDefs.length + ' 项,按产品类型要求') : '选好产品类型后加载' }}

以下属性是上次提交时 Amazon 报出的必填项。有下拉的必须从选项里选, 自己填的值会被拒。

{{ a.title }} {{ a.name }}

选好产品类型后点「加载属性」,会按该类型的要求列出需要填的项

  • {{ p }}

Amazon 返回的问题:

[{{ is.severity }}] {{ is.message }}
{{ amzListingSaving ? '保存中...' : '已保存' }}

{{ amzRule.id ? '编辑规则' : '新建规则' }}

看最近几天的报表数据来判断

样本太小时 ACOS 是噪声,低于这个数不动

触发条件
{{ ['acos','ctr','cvr'].includes(c.metric) ? '比率用小数(0.35 = 35%)' : '' }}

没有条件时,只要过了上面的门槛就算命中(配合「只挑没出单的」用)

防止配置失误一次扫全店,超出的下次再处理

不选 = 全部

定点时间按美西(太平洋)算,与广告数据同口径

🔑 亚马逊授权

一个店铺 = 一个亚马逊卖家账户,同时持有 SP-API 与广告两套凭据。
SP-API:在卖家后台「开发者中心」自授权后,把 LWA App ID / Secret / Refresh Token 填进来。
广告 API:填好 Client ID / Secret 与本店铺专属的回调地址后点「广告授权」走 OAuth。
回调地址要和开发者应用里登记的 redirect_uri 完全一致,且该域名需解析到本服务器。 多店铺建议各用一个子域(如 acc1.jinjixitong.com/callback),不要共用同一个回调域名。
{{ acc.name }} {{ acc.region }} 已停用 SP-API {{ acc.has_sp_credentials ? '已配置' : '未配置' }} 广告 {{ acc.has_ad_credentials ? (acc.ad_profile_id ? '已就绪' : '待选 Profile') : '未授权' }}
卖家 ID: {{ acc.seller_id || '—' }} | 市场: {{ acc.marketplace_id || '—' }}
广告 Profile: {{ acc.ad_profile_id || '—' }}
广告回调: {{ acc.ad_redirect_uri || '未设置' }}
SP 巡检 {{ amazonStatusText(acc.sp_status) }} {{ amazonAgo(acc.sp_last_ok_at) }} 广告巡检 {{ amazonStatusText(acc.ad_status) }} {{ amazonAgo(acc.ad_last_ok_at) }} SP 授权{{ acc.expiry.days_left < 0 ? '已过期' : ('还有 ' + acc.expiry.days_left + ' 天到期') }} 未填授权日期,无法倒计时 保活已关闭
🔑 {{ k.n }} 密钥轮换{{ k.d && k.d.days_left < 0 ? '已逾期' : ('还有 ' + (k.d ? k.d.days_left : '') + ' 天') }}
SP: {{ acc.sp_last_error }}
广告: {{ acc.ad_last_error }}
{{ amazonTestResult.label }}:{{ amazonTestResult.success ? '连接正常' : '连接失败' }}
{{ amazonTestResult.error }}
可用市场:{{ amazonTestResult.participations.map(p => p.country).join(', ') }}
点击选择该店铺使用的广告 Profile:
{{ amazonProfiles.error }}

暂无店铺,点击右上角「添加店铺」

{{ editingAmazonAccount ? '编辑' : '添加' }}亚马逊店铺

SP-API 凭据(销售数据)

广告 API 凭据

必须与开发者应用中登记的 redirect_uri 完全一致;该域名需解析到本服务器。 每个店铺用独立子域,避免多店铺共用同一回调域名。

刊登时 Amazon 会从公网来抓商品图,这里填能解析到本服务的域名。 留空使用 .env 里的 PUBLIC_BASE_URL;多店铺想各用一个子域时在此按店铺配。

授权有效期与保活

SP-API 的 refresh token 自授权起一年到期,到期需卖家在 Seller Central 重新授权,程序无法自动续期。填了这个日期才能做到期倒计时。 在此更新 SP Refresh Token 时会自动重置为当天。

LWA client secret 必须每 180 天轮换一次,逾期该应用所有调用会被拒 (AccessDeniedException)。填开发者后台上显示的「轮换截止日期」。 轮换不影响 refresh token,卖家无需重新授权:在后台点轮换后, 7 天宽限期内把新密钥填回上面对应的 Secret 栏即可无缝切换。

用户管理

用户名 姓名 邮箱 角色 状态 创建时间 操作
{{ u.username }} {{ u.full_name || '-' }} {{ u.email || '-' }} 超级管理员 普通用户 启用 禁用 {{ u.created_at ? u.created_at.slice(0,10) : '-' }}
暂无用户

{{ editingUser ? '编辑用户' : '新建用户' }}

💬 飞书机器人配置

{{ feishuStatus.connected ? '🟢' : '⚪' }}
{{ feishuStatus.connected ? '机器人已连接' : '机器人未连接' }}
Bot Open ID: {{ feishuStatus.bot_open_id }}
{{ cfg.name }}
App ID: {{ cfg.app_id }} Secret: {{ cfg.app_secret }}
创建于 {{ cfg.created_at ? cfg.created_at.slice(0, 10) : '-' }}
已启用 已禁用
💬

还没有飞书机器人配置

点击右上角「添加配置」开始

📋 飞书用户映射

飞书名称 飞书 Open ID 系统用户 绑定时间
{{ m.feishu_name || '-' }} {{ m.feishu_open_id }} {{ m.system_username }} ({{ m.system_full_name }}) {{ m.created_at ? m.created_at.slice(0, 10) : '-' }}

{{ editingFeishuConfig ? '编辑飞书配置' : '添加飞书配置' }}

提示:飞书开放平台创建自建应用, 开通权限:im:message、im:message.receive_v1、im:resource、cardkit:card。 使用 WebSocket 连接无需公网 IP。

🏷️ SHEIN 预发布

已选 {{ prePublishSelected.length }} 项:
{{ batchProgress.message }} {{ batchProgress.current }}/{{ batchProgress.total }}
加载中...

暂无预发布记录

请在「图片包管理」中点击「🏷️ SHEIN预发布」创建

{{ pp.package_name || '未知包' }}

SPU: {{ pp.package_spu || '-' }} 店铺: {{ pp.shop_name || '-' }} {{ new Date(pp.created_at).toLocaleString() }}
{{ pp.package_title_en }}
草稿 已匹配类目 已匹配颜色 已选图 已上传 已推理属性 已发布 {{ pp.status }} {{ pp.color_count }}色 / {{ pp.image_count }}图
颜色: {{ c }}
类目匹配结果
{{ pp.category_match.category_name }} (ID: {{ pp.category_match.category_id }}, TypeID: {{ pp.category_match.product_type_id }})
{{ pp.category_match.reason }}
颜色匹配结果
{{ colorName }} {{ mapped.name }}
选图结果
加载中...
{{ cs.color_name }} — {{ cs.images.length }} 张图片
T5 方图
{{ img.is_hero ? '⭐T1' : 'T2' }} {{ ppRoleName(img.role) }}
T6 色块

发布属性预览

基本信息

SPU编码: {{ ppPreviewData.preview.supplier_code }}
标题: {{ ppPreviewData.preview.title }}
类目ID: {{ ppPreviewData.preview.category_id }}
商品类型ID: {{ ppPreviewData.preview.product_type_id }}
成本价: ¥{{ ppPreviewData.preview.base_cost || 0 }}
供货价 ({{ ppPreviewData.preview.currency }}): (成本+4)
库存数量:
颜色属性ID: {{ ppPreviewData.preview.color_attribute_id }}

商品属性 ({{ ppPreviewData.preview.attributes.length }} 项)

属性名 来源
{{ a.name }} {{ a.value_name }} {{ a.source }}

规格信息

主规格: {{ ppPreviewData.preview.spec_info.main_sale_attr.name }} (id={{ ppPreviewData.preview.spec_info.main_sale_attr.id }})
次规格: {{ s.name }} (id={{ s.id }}, status={{ s.status }})
无次规格

发布颜色 ({{ ppPreviewData.preview.color_details.filter(c => c.selected).length }} / {{ ppPreviewData.preview.color_details.length }})

无图
{{ cd.color_name }}
→ {{ cd.shein_color_name }}
{{ cd.image_count }} 张图

正在生成预览...

📦 SHEIN 备货管理

📝 备货单下单

{{ g.supplier_code }}
{{ g.spu_name }} | SKU: {{ (g.sku_list||[]).length }}个
{{ item.supplier_code }}
SKC: {{ item.skc }}
搜索并添加要下单的商品
{{ createOrderMessage }}

🏷️ 打印商品条码

每行一个供方货号(即商家SKU编码 supplierSku)

{{ barcodeError }}

{{ barcodePrinted ? '✅ 条码已发送打印' : '✅ 条码 PDF 已生成' }}

📄 点击下载/打印 PDF

本地: {{ barcodePdfPath }}

📷 图片导入备货单

打印出来的备货单在「到货」列手写了实际数量,拍照传上来, 系统认出数字后按「到货 − 已下未发」下单

直接拍照下单 —— 不用等每日备货单, 手上有写好到货的单子就直接传,货号会自动去商品表里查 SKC/SKU 与已下未发。

还没有备货单记录。可以直接用上面的「传照片下单」, 或者生成一次每日备货单后再拍照回填。

导入记录保留 7 天,之后连同照片自动清理;也可以随时手动删除。

{{ o.order_date }} {{ o.source === 'photo' ? '拍照直下' : '每日备货单' }} {{ stockOrderStatusText(o.status) }} {{ o.items }} 行 已打印 人工改过
待下单 {{ o.will_order_qty }} 件 · 核对后提交
待下单 {{ o.will_order_qty }} 件 · 已提交,等最终确认
{{ (o.order_result || {}).total_qty || 0 }} 件已下单 (自动)
下单失败:{{ (o.order_result || {}).msg }}
{{ stockOrderDetail.order_date }} {{ stockOrderStatusText(stockOrderDetail.status) }}

把手写了「到货」的那张纸拍清楚传上来(正对着拍,别糊)

核对数量后点「提交」 —— 提交本身不下单,之后还要再确认一次才会真正发给 SHEIN。 任何一行的到货和下单量都能直接改; 照片里到货没写的按没提货算(下单 0),要下就把数字填上。
已提交,等最终确认 —— 确认后会立刻向 SHEIN 下 {{ stockOrderDetail.will_order_items }} 行 / {{ stockOrderDetail.will_order_qty }} 件。 还想改就直接改下面的数字,改完要重新提交。
{{ stockOrderDetail.preview.length }} 要下单 {{ stockOrderDetail.will_order_items }} 行 / {{ stockOrderDetail.will_order_qty }} {{ stockOrderDetail.blank_rows }} 行照片里没写到货,按 0 算 {{ stockOrderMismatch }} 行备货数与系统对不上,建议核对
供货方号 属性 备货 已下未发 可下单 到货 下单 说明
{{ p.supplier_code }} {{ p.suffix_zh }} {{ p.plan_qty }} {{ p.stay_deliver || '—' }} {{ p.order_limit === undefined ? '—' : p.order_limit }} {{ p.note }}
已于 {{ (stockOrderDetail.ordered_at || '').replace('T',' ').slice(0,16) }} 下单: {{ (stockOrderDetail.order_result || {}).skc_count }} 个 SKC、 {{ (stockOrderDetail.order_result || {}).total_qty }} 件
📈 备货款销量 统计日 {{ sheinSales.stat_date }} · {{ (sheinSales.totals || {}).sku_count || 0 }} 个 SKU

口径:商品层次属于备货款A/B、新款、新款A、保证在售款 。 退供款、自主停产、清仓款、售完下架一律排除。 拉取销量时会先把这些状态从 SHEIN 刷一遍再筛。

还没有销量数据。点「拉取最新销量」,或者生成一次备货单 —— 备货查询会顺手把销量刷上。

销量走势 · {{ sheinTrend.supplier_code }} {{ sheinTrend.suffix_zh }} · {{ sheinTrend.sku_code }}

目前只有 {{ sheinTrend.points.length }} 天的数据。
SHEIN 的销量接口只给「当前的当日/昨日/7天/30天」,没有历史。 系统每天拉一次存一天,攒几天之后这里就能看到走势了。

{{ sheinStockMessage }}
📦

SHEIN 备货管理

选择店铺后点击「生成每日备货单」或「生成排产单」

每日备货单: 备货+急采 → Excel双Sheet  |  排产单: 含图片,系数可调

🎵 TikTok 预发布

暂无 TikTok 预发布记录

请在「图片包管理」中点击「🎵 TikTok预发布」创建

{{ pp.title || '(未命名)' }} {{ {draft:'草稿',category_matched:'已匹配类目',color_matched:'已匹配颜色',images_selected:'已选图',ready:'待发布',publishing:'发布中',published:'已发布',failed:'失败'}[pp.status] || pp.status }}
📦 {{ pp.package_name }}  |  类目: {{ pp.category || '(待匹配)' }}  |  颜色: {{ pp.color_count }}个 ({{ pp.colors_display.join(', ') }})  |  图片: {{ pp.image_count }}张  |  店铺: {{ pp.shop_name }}
错误: {{ pp.publish_error }}
创建: {{ pp.created_at ? new Date(pp.created_at).toLocaleString() : '' }}  |  发布: {{ new Date(pp.published_at).toLocaleString() }}

{{ tikTokForm.id ? '编辑' : '新建' }} TikTok 预发布

请先添加颜色变体
{{ c.color || '颜色 ' + (idx+1) }}

⏰ 定时任务

任务名称 任务类型 频率 执行时间 选项 状态 上次执行 下次执行 操作
{{ st.name }} {{ scheduledTaskTypeLabel(st.task_type) }} {{ st.frequency === 'daily' ? '每天' : '单次' }} {{ st.execute_time }} 🖨️ 打印 -
{{ new Date(st.last_run_at).toLocaleString() }} {{ st.last_run_status === 'success' ? '✓成功' : st.last_run_status === 'failed' ? '✗失败' : '⏳执行中' }}
未执行
{{ st.next_run_at ? new Date(st.next_run_at).toLocaleString() : '-' }}

暂无定时任务,点击右上角「新建定时任务」

最近执行记录

{{ st.name }} {{ st.last_run_at ? new Date(st.last_run_at).toLocaleString() : '' }}
{{ st.last_run_message }}

{{ editingScheduledTask ? '编辑定时任务' : '新建定时任务' }}

任务选项

💬 AI 助手

✅ {{ activeChatConfig.provider_name }} → {{ activeChatConfig.model_name }} ⚠️ 未配置模型,点击前往设置
🤖
你好!我是 AI 助手
我可以帮你查询图片包、分析产品、创建产品等
{{ chatStatusText }}
📎 {{ chatUploadFile.name }} ({{ (chatUploadFile.size / 1024 / 1024).toFixed(2) }} MB)