一个供应商一个来源。操作费口径决定这家的报价怎么折成到手成本
—— 它在导入那一刻冻结到每一行上,改口径不回头改写历史。
新建来源
| 来源 | 操作费口径 | 报价条数 | 覆盖商品 | 指定它供货 | 最新报价日 | 状态 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ sc.name || sc.code }}
{{ sc.code }} · 建好后不能改(导入按它锁定) |
{{ cig.feeModes[sc.fee_mode] }} | {{ sc.n_quotes }} | {{ sc.n_products }} | {{ sc.n_pick }} | {{ sc.last_eff || '—' }} | 启用
|
|
| 还没有货盘来源 —— 先建一个,导入货盘时要按它锁定操作费口径 | |||||||
汇率它只影响 ¥ / $ 参考列,
AUD 才是定价真源 —— 点「立即更新」取一次,不会自己跑
1 AUD = ?
立即更新
手动录入
{{ w.ccy }} 这一档是 {{ w.period }} 的,已经 {{ w.days }} 天没更新
—— 参考列还在按这个旧汇率算,点上面「立即更新」取一次。
| 生效日 | 币种 | 1 AUD = | 来源 | 登记人 |
|---|---|---|---|---|
| {{ f.period }} | {{ (cig.ccyMeta[f.ccy] || {}).sym }} {{ f.ccy }} {{ (cig.ccyMeta[f.ccy] || {}).label }} | {{ (f.rate_m / 10000).toFixed(2) }} | {{ f.src === 'auto' ? '自动' : '人工' }} {{ f.note }} | {{ f.who }} |
| 还没登记过汇率——页面上会标「未登记」并用内置值,不会显示成 0 | ||||
{{ sc.name || sc.code }}
{{ cig.feeModes[(cig.srcs.find(x => x.code===cig.qsrc) || {}).fee_mode] }}
AUD
¥
$
| {{ cigColLabel(c) }} | |
|---|---|
|
{{ r.codes[0] }} 等 {{ r.n_tier }} 条
{{ r.code }}
· {{ r.raw_spec }}
–
|
|
|
{{ t.grams ? (t.grams + ' ' + cigUnit(r.raw_spec))
: ('(没填' + cigUnitCn(r.raw_spec) + ')') }}
{{ t.raw_name }}
{{ t.code }}
含在报价里
{{ (t.eff_date || '').slice(0,10) }}
|
|
| 这个来源下没有符合筛选的报价 |
AUD
¥
$
口径日 {{ cig.mx.on_date }}
| 图 | 商品 | 品类 | {{ sc.name || sc.code }} {{ cig.feeModes[sc.fee_mode] }} | 当前指定 | 最低来源 | 到手价差({{ cigCcyLabel() }}) | ||
|---|---|---|---|---|---|---|---|---|
| 报价({{ cigCcyLabel() }}) | 操作费({{ cigCcyLabel() }}) | 到手({{ cigCcyLabel() }}) | ||||||
| {{ r.name }}
{{ r.product_code }} |
{{ r.cat }} | — 含在报价里 |
|
|
换 → 省 | |||
| 没有符合筛选的商品 |
{{ s.cn }}{{ cig.sh.counts[s.key] || 0 }}
AUD
¥
$
还没核对过在架状态,所以这张发货单是空的。先点右上角
「同步待发货订单」拉一次 —— 在核对之前不会把任何单印进发货单,
这是刻意的:多发出去收不回来,少发一单对方会问。
快照时刻 {{ cig.sh.sync_at }} · 另有
{{ cig.sh.off_n }} 单不在列表里
展开
| 订单金额({{ cigCcyLabel() }})· 不导出 | {{ c }} |
|---|---|
|
{{ v }}
{{
r.src }} · {{ r.prod_name }}
{{ r.each }} × {{ r.qty }} 件
{{
r.issues.join(';') }}
|
|
| 这张发货单当前没有符合筛选的行 |
| 订单编号 | 店铺商品 | 款式 | 为什么认领不到 | 去哪处理 |
|---|---|---|---|---|
| {{ u.order_no }} | {{ u.shop_title }} | {{ u.shop_opt }} | {{ u.why }} | {{ cigFixLabel(u.how) }} → |
| 全部认领到了归属 | ||||
{{ cig.ct.n_never }} 个商品还没回填过内容 ——
点右上「从店铺回填」把店里现有的主图与商详图抓回来。
只读店铺、只写这里,不会覆盖人工填过的。
(一个商品要打一次详情接口,35 个商品约半分钟。)
缺主图 {{ cig.ct.n_no_img }}
缺商详图 {{ cig.ct.n_no_det }}
还没回填 {{ cig.ct.n_never }}
共 {{ (cig.ct.rows || []).length }} 个商品
| 图 | 商品 | 主图 | 商详图 | 店里的分类 | 商详文字 | 回填于 |
|---|---|---|---|---|---|---|
| {{ r.name }}
{{ r.code }} · {{ r.cat }}
· 店里没有 |
{{ r.n_img }} 缺 | {{ r.n_det }} 缺 | {{ (r.colls || []).join('、') || '—' }} | {{ (r.body_note || '').slice(0, 28) }}{{ (r.body_note || '').length > 28 ? '…' : '' }} | {{ r.pulled_at ? r.pulled_at.slice(0, 10) : '—' }} | |
| 这一档下没有商品 —— 清掉筛选 商品列表里还没有商品,先去「商品列表」建。 | ||||||
选中 {{ cig.lsSel.length }}
标为「要上」
标为「不上」
还没有人维护过这家店的铺品计划。
店里现在有 {{ cig.ls.n_extra }} 个商品,它们都还没在计划里 ——
所以现在一个都不会被推上去(没表过态=不上,这是刻意的)。
把店里现有的 {{ cig.ls.n_extra }} 个都标成「要上」
之后再逐个调整;这一步会记进操作日志。
这家店还有 {{ cig.ls.n_unlinked }} 个款式没关联到商品 ——
它们对本页是看不见的(说不出店里那个到底是不是我们这个),
所以上面「计划外」那个数会偏小。
去店铺商品清单关联 →
已铺 {{ cig.ls.n_ok }}
待铺 {{ cig.ls.n_todo }}
计划外 {{ cig.ls.n_extra }}
还没决定 {{ cig.ls.n_undecided }}
不上 {{ cigLsNoCount }}
共 {{ (cig.ls.rows || []).length }} 个商品
|
|
图 | 商品 | 计划 | 店里 | 状态 | 备注 |
|---|---|---|---|---|---|---|
| {{ r.name }}
{{ r.code }} · {{ r.name_en }}
· {{ r.n_var }} 个款式 |
要上 不上 未表态 | {{ r.n_shop_var }} 个款式 (在售 {{ r.n_shop_on }}) 没有 | 已铺 待铺 计划外 还没决定 不上这家 | {{ r.note }}{{ r.note ? ' · ' : '' }}{{ r.who }} | ||
| 这一档下没有商品 —— 清掉筛选 商品列表里还没有商品,先去「商品列表」建。 | ||||||
| 图 | 店铺商品 | 款式 | 关联商品 | 发货来源 | 操作 | |
|---|---|---|---|---|---|---|
| {{ cig.siOpen[r.product_id] ? '⌄' : '›' }} | {{ r.title }} 商品 {{ r.product_id }} |
{{ r.n_var }} | 款式各关各的 ▾ (展开看) {{ r.prod_name }} {{ r.code }} {{ r.n_novar }} 个款式对不上 ▾ 未关联 ▾ |
{{ r.ship_src }}
{{ (r.src_cands || []).join(' / ') }} 两家都能供 —— 要指定 ▾
这个商品还没关货盘
—
|
|
|
| {{ v.opt || '(无款式名)' }} · variant {{ v.variant_id }} | 未关联 ▾ {{ v.var_hit }} {{ v.each ? (v.each + ' /件') : '⚠️ 这个款式没填量' }} {{ v.var_how === 'pick' ? '· 已指定' : '· 按名字对上' }} 款式对不上 ▾ |
|
||||
| 还没有店铺商品 —— 点右上角「从店铺同步」拉一次 | ||||||
{{ cig.siEd.one ? '店铺款式' : '店铺商品' }}
{{ cig.siEd.row.title }}
· {{ cig.siEd.row.opt }}
· 名下 {{ cig.siEd.row.n_var }} 个款式一起关
关联到
{{ cigProdName(cig.siEd.code) }}
{{ cig.siEd.code }}
换一个 ▾
款式(可留空)
关联的是商品列表里的商品;发货走哪一家、发货单上印哪个货盘名,
都由它自动得出。这里刻意不做自动匹配 —— 按名字配实测只中 68%,
而没中的恰好是最容易配错的那些。
AUD
¥
$
| {{ cigColLabel(c) }} | |
|---|---|
|
{{ p.code }}
{{ p.name_en || '未填' }}
{{ p.cat }}
× {{ v.qty }}
未定价
—
{{ v.disc.toFixed(1) }} 折
—
{{ v.gm.toFixed(1) }}%
—
—
—
展开中
|
|
|
{{ v.name }}
货源还没填克重 —— 上面那张关联表里填一下
{{ v.link_label }}
|
|
| 还没有款式 —— 到详情页加一个(款式 = 这个商品 × 数量) | |
| 没有符合筛选的商品 |
{{ g.def }}顶部 tab
分区
{{ it.def }}
最多 {{ mcfg.maxLen }} 个字。保存后页面会自动刷新一次——菜单结构在多处渲染,刷新是最省事也最不会出错的做法。
{{ d.what }}
{{ d.flag }}
{{ d.plain }}
{{ d.from || '(空)' }}
→
{{ d.to || '(空)' }}
无实质变化(保存了一次但内容没变)
{{ plog.detail.row.at }} · {{ plog.detail.row.who || '—' }} ·
{{ plog.kinds[plog.detail.row.kind] || plog.detail.row.kind }} ·
{{ plog.detail.row.target || '—' }}
{{ d.what }}
{{ d.flag }}
{{ d.plain }}
{{ d.from || '(空)' }}
→
{{ d.to || '(空)' }}
备注{{ plog.detail.row.note }}
{{ w === 'old_json' ? '改之前(原始)' : '改之后(原始)' }}
{{ opRawJson(plog.detail.row, w) }}
AI 生图
写一句话就出图。可以传参考图、在参考图上圈出要改的地方(选区只是给 AI 的引导,不保证选区外完全不动)。
历史记录 ↗
1. 模型
{{ aiGen.model || 'gpt-image-2' }}
2. 提示词
aiPhTo('ai', -1, t)">
插入引用
{图{{ i+1 }}}
{图{{ i+1 }}选区{{ k+1 }}}
3. 参考图(可选,最多 {{ aiGen.maxRefs }} 张)
+
4. 尺寸 / 分辨率
分辨率
{{ r.toUpperCase() }}
比例
{{ r === 'auto' ? '自动' : r }}
{{ aiGen.busy ? '提交中…' : '✳ 生成图片' }}
↻ 重置
{{ aiGen.err }}
生成结果
🖼
生成结果将在此处显示
输入提示词并点「生成图片」开始创作
这里只显示本次生成的图;以前出的都在「历史记录」里
标注选区 — 图{{ aiGen.mk.i + 1 }}
▢ 方框选取
✎ 画笔涂抹
撤销
清除全部
{{ aiMkNo(k, aiGen.mk) }}
已标注 {{ aiMkRectN(aiGen.mk) }} 个选区{{ aiMkBrushN(aiGen.mk) ? ('(另有 ' + aiMkBrushN(aiGen.mk) + ' 笔涂抹,会合并成一块区域说给 AI)') : '' }} · 选区只是引导,不保证选区外完全不动
取消
确认标注
批量生成
一次配好 N 条各自不同的提示词,挂着让它慢慢跑。四种玩法见新建页顶部的切换。要出一张就好,去单张生图。
{{ aiBat.picking ? '取消选择' : '选择' }}
刷新
+ 新建批量任务
批次总数
{{ aiBat.sum.batches || 0 }}
{{ aiBat.sum.rows || 0 }} 行
已完成
{{ aiBat.sum.done || 0 }}
成功率 {{ Math.round((aiBat.sum.rate || 0) * 100) }}%
进行中
{{ aiBat.sum.active || 0 }}
{{ (aiBat.sum.active||0) ? '涉及批次' : '都跑完了' }}
失败
{{ aiBat.sum.failed || 0 }}
{{ (aiBat.sum.failed||0) ? '行,点进去看原因' : '无异常' }}
草稿
{{ aiBat.sum.drafts || 0 }}
{{ (aiBat.sum.drafts||0) ? '存着还没提交' : '无草稿' }}
{{ f.label }}{{ f.n }}
卡片
列表
{{ batAllSel() ? '取消全选' : '全选' }}
已选 {{ batSelIds().length }} 个
删除选中({{ batSelIds().length }})
🗂
{{ (aiBat.items||[]).length ? '这个筛选下没有批次' : '还没有批量任务' }}
{{ (aiBat.items||[]).length ? '换个筛选条件看看' : '点右上角「+ 新建批量任务」开始' }}
批次号
提示词
类型
状态
进度
操作
{{ b.batch_no }}
{{ batModeCn(b.mode) }}
{{ batStCn(b.state) }}
{{ b.done }}/{{ b.total }} ✕{{ b.failed }}
接着编
复用
详情
{{ aiBat.live ? aiBat.no : '新建批量任务' }}
四种玩法在下面切。不限条数——但一行约 95 秒,配多少条就要等多久,页面下方会实时算给你看。
已提交,跑完会自动出现在下面。这一批衍生自 {{ aiBat.from }}。可以关掉页面,回来再看。
← 批次列表
单张生图 ↗
{{ aiBat.err }}
玩法
{{ batModeCn(m) }}
▤ 模板灵感
{{ batModeHint() }}
模型
{{ aiBat.model }}
分辨率
{{ r.toUpperCase() }}
比例
{{ r === 'auto' ? '自动' : r }}
共用提示词模板 所有行都用这一段
{图{{ i+1 }}}
「图N」=第 N 个槽位那张图,AI 收到的就是 image N,指得准
槽位定义 每个槽位放一张图,下面每一行按这个次序填
{{ i+1 }}
✕
共 {{ batSlotFilled(i) }} 张
⇪ 批量上传到「图{{ i+1 }}」
+加位置
共用参考图 全批每一行都会带上这几张(最多 {{ aiBat.maxRefs }} 张)
+
任务行
{{ aiBat.rows.length }} 行
✎ 全部再编辑
⋮⋮
{{ ri+1 }}
再编辑
✕
▢
⇪
点击上传或粘贴
没放图
{{ si+1 }} {{ sd.name }}
✕
▢
图{{ i+1 }}
⇪
点击上传或粘贴
加一张
{图{{ i+1 }}}
{图{{ i+1 }}选区{{ k+1 }}}
用上面那句共用模板,这一行只换素材。
槽位只填了一半,这一行还不能跑。
→
✕
✓
{{ batRowLabel(ri) }}
{{ batRowSub(ri) }}
↻
✎
+ 添加一行
{{ aiBat.live ? '加的行会并进这一批一起跑' : '不限条数,但一行约 95 秒' }}
准备好 {{ batReady() }} / {{ batNewRows().length }} 行(新加的)
· {{ batBad() }} 行还不能跑
预计约 {{ batEta() }}(期间图工厂其它出图会排在后面)
存草稿
存成模板
{{ aiBat.busy ? '提交中…'
: ((aiBat.live ? '✳ 生成新任务 ' : '✳ 提交 ') + batReady() + ' 行') }}
模板灵感
把配好的一批(玩法、槽位、提示词、参考图、所有行)存成模板,下次一键套用。本部门共用。在批量生成页底部点「存成模板」即可新增。
刷新
去批量生成 →
▤
还没有模板
在「批量生成」里配好一批,点底部的「存成模板」,它就会出现在这儿
{{ batModeCn((t.payload||{}).mode) }}
{{ ((t.payload||{}).rows||[]).length }} 行
· {{ (t.payload||{}).slots.length }} 个槽位
· {{ (t.payload||{}).size }} / {{ ((t.payload||{}).resolution||'').toUpperCase() }}
{{ t.username }} 于 {{ bjTimeShort(t.created_at) }}
套用
{{ pv.desc }}
{{ pv.empty || '未配置,点右上「添加」粘贴 Key。' }}
密钥经 Fernet 加密后存独立库,页面不回显明文。状态标签可点击切换启用/停用;停用全部 Key 后该接口回落到各自的免费/环境变量兜底。
历史图片
单张生图与批量生成出过的图都在这里,失败的也列出来(那些是真花过钱的)。点图看参考图与提示词,也可以带着它接着改。
h.ai_id),'imgs-all.zip')">↓ 批量下载 {{ hisOkList().length }} 张
⌕
{{ f.label }}{{ f.n }}
{{ hisAllSel() ? '✓' : '' }}{{ hisAllSel() ? '取消全选' : '全选本页' }}
显示 {{ hisList().length }} 张(库里共 {{ his.total }} 张,这页只列最近 {{ his.items.length }} 张)
↓ 下载选中({{ hisSelIds().length }} 张)
{{ h.ai_batch_no }}
单张
{{ bjTimeShort(h.created_at) }}
放大查看
{{ his.items.length ? '没有匹配的结果' : '还没有出过图' }}
{{ his.items.length ? '换个关键字或筛选试试。' : '去「单张生图」或「批量生成」出一张,产物会归到这里。' }}
{{ cigShNoOpen.join('、') }} 还没配开放平台 Token —— 铺品(改价 / 新增商品 / 改图 / 加规格)用不了。
在下面那一行的「开放平台 Token」格里直接粘贴(失焦即存),然后点「测试」。
| # | 编码 | 名称 | 后台域名 | 开放平台网关 | 开放平台 Token 应用要把 8.153.147.28 加进 IP 白名单 |
备注 | 启用 | 操作 |
|---|---|---|---|---|---|---|---|---|
| {{ i + 1 }} | {{ r.code }} |
|
•••••••• 已加密
更换
|
{{ r.is_active ? '启用' : '停用' }} {{ r.is_active ? '启用' : '停用' }} | 查看 测试 {{ r.is_active ? '停用' : '启用' }} 删除 |
编码{{ cig.shopView.code }}
(建了就不能改,别处都在引它)
名称{{ cig.shopView.name || '—' }}
后台域名{{ cig.shopView.admin_base || '—' }}
开放平台网关{{ cig.shopView.open_base || '—' }}
开放平台 Token
{{ cigShKeyName(cig.shopView.open_kid) }}
平台 store_id
{{ cig.shopView.store_id || '—' }}
(API Key 配置里点「测试」会核对它)
状态{{ cig.shopView.is_active ? '启用' : '停用' }}
备注{{ cig.shopView.note || '—' }}
建于{{ cig.shopView.created_at || '—' }}
· {{ cig.shopView.who }}
编码是我们自己起的稳定键(如 smoke123),建了就别改 —— 别处会引它。
编码
名称
后台域名
开放平台网关
{{ nd.l }}
开放平台 Token
备注
⚠️ Token 要用开放应用那把(店铺后台 → 店铺设置 → 系统设置 → 开发者 →
创建应用 → 复制 Token),不是后台的登录 token;并且要先把
8.153.147.28 加进那个应用的 IP 白名单,否则 Token 再对也连不上。