fix: PMC 测试清单未完成项 + YYX#row22 未读角标

PMC#16 账户登录地址不正确:
- 写死的 https://airshelf.com/login(不存在的域名)改成 ${location.origin}/login,
  与邀请链接同源,成员拿到的就是当前真实访问地址。

PMC#17/#18 成员三档额度只有月度生效、日/总纯装饰 → 列表显示与配置对不上:
- TeamMember 新增 daily_credit_limit / total_credit_limit(0=不限,迁移 0006);
- reserve_credit 逐档真实管控(每日/每月/累计总额),口径=窗口内 CHARGE 流水 + 在途预留;
- 成员列表"每日额度"由写死"不限"改成真实日额度+今日已用,并新增"总额度"列;
- 创建/编辑弹窗三档额度真入库真生效;补 3 个计费单测(日/总拦截、0=不限)。

PMC#24 同批生成的图片文字/内容雷同:
- 根因=套图/自由创作同批 N 张用同一 prompt 且无变化(只有模特上身图按 index 变);
- 给平台套图/自由参考/纯文生图都加按 index 的版式变体,避开传 seed(防中转站 400)。

PMC#25 重跑应在原任务上重跑而非新开任务:
- 全批"重跑"改为原地复位同一批次卡;"重跑这张/再生成"改为补图进原卡(不覆盖好图、不新开任务)。

YYX#row22 图片生成未读角标(本仓库既有改动一并提交):
- AITask 新增 read_at(迁移 0020 + 索引一致性迁移 0021);导航栏"图片生成"未读胶囊、
  商品预览右下角未读分数;查看某商品即标记其生成任务已读、清零角标。

注:PMC#14/#15/#20/#22/#23 早前提交已修,需部署重测;PMC#13/#21 为 provider 侧
生成失败,代码侧重试/退费/僵尸回收/错误外露已就位,需部署后看真实 error_message 定位;
PMC#19 收件箱标记与设计稿逐字一致,待截图复现。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
zyc
2026-06-27 18:27:15 +08:00
co-authored by Claude Opus 4.8
parent 2e1c28abea
commit 6e7425048c
19 changed files with 483 additions and 98 deletions
+47 -2
View File
@@ -315,12 +315,24 @@
.image-workbench .iw-prod-item:hover { background: var(--black-alpha-4); }
.image-workbench .iw-prod-item.active { background: var(--heat-12); border-color: var(--heat-20); }
.image-workbench .iw-prod-item .thumb {
position: relative;
flex-shrink: 0;
width: 36px; height: 36px;
border-radius: var(--r-sm);
}
.image-workbench .iw-prod-item .thumb.has-real-media { overflow: hidden; background: var(--background-lighter); }
.image-workbench .iw-prod-item .thumb.has-real-media img { width: 100%; height: 100%; object-fit: cover; display: block; }
/* YYX#row22:商品预览右下角 · 未读生成任务分数(H22 示例) */
.image-workbench .iw-prod-item .thumb .iw-prod-unread {
position: absolute; right: -4px; bottom: -4px;
min-width: 16px; height: 16px; padding: 0 4px;
display: grid; place-items: center;
background: var(--heat); color: var(--accent-white);
font-family: var(--font-mono); font-size: 10px; line-height: 1; font-weight: 600;
border-radius: 999px; border: 2px solid var(--background-base);
z-index: 2;
}
/* 不用 overflow:hidden 裁切(否则切掉右下角未读角标);改由 img 自己圆角 */
.image-workbench .iw-prod-item .thumb.has-real-media { background: var(--background-lighter); }
.image-workbench .iw-prod-item .thumb.has-real-media img { width: 100%; height: 100%; object-fit: cover; display: block; border-radius: var(--r-sm); }
.image-workbench .iw-prod-item .body { flex: 1; min-width: 0; }
.image-workbench .iw-prod-item .nm {
font-size: 13px; color: var(--accent-black); font-weight: 500;
@@ -693,6 +705,23 @@
.image-workbench .iw-filter-opt .ck { color: var(--heat); opacity: 0; flex-shrink: 0; }
.image-workbench .iw-filter-opt.on .ck { opacity: 1; }
/* ── YYX#G23:筛选已开启 · 结果区置顶提示栏 ── */
.image-workbench .iw-filter-notice {
display: flex; align-items: center; gap: 10px;
margin-bottom: 14px; padding: 10px 14px;
background: var(--heat-12);
border: 1px solid var(--heat-20); border-radius: var(--r-md);
}
.image-workbench .iw-filter-notice .ifn-text {
flex: 1; font-size: 13px; color: var(--accent-black);
}
.image-workbench .iw-filter-notice .ifn-clear {
flex-shrink: 0; display: inline-flex; align-items: center; gap: 4px;
border: 0; background: none; cursor: pointer;
font-size: 12px; color: var(--heat); font-family: inherit;
}
.image-workbench .iw-filter-notice .ifn-clear:hover { text-decoration: underline; }
/* ── YYX#18:结果卡精简头部(提示词折叠 + 灰色张数,无容器/引号/标题)── */
.image-workbench .iw-batch-head { padding: 2px 2px 0; margin-bottom: 8px; }
.image-workbench .iw-batch-head .ibh-prompt {
@@ -933,6 +962,22 @@
首个头紧跟 iw-preview 顶 padding,无需额外上间距(故只给跟在卡片后的头加 margin)。 */
.image-workbench .gen-batch-card + .iw-pv-h { margin-top: 22px; }
/* ── YYX#row24/row25:去掉结果批次卡的白色容器 / 边框 / 内边距 + 底部分割线 ──
让图片显示区铺满预览宽度、更大;批次间距由「卡片 → 下一个批次头」拉开。 */
.image-workbench .gen-batch-card {
background: transparent;
border: 0;
border-radius: 0;
padding: 0;
gap: 12px;
}
.image-workbench .gen-batch-card .gen-batch-actions {
border-top: 0;
padding-top: 0;
margin-top: 8px;
}
.image-workbench .gen-batch-card + .iw-batch-head { margin-top: 22px; }
/* P0③ · 平台套图多平台分组 section 头(平台 logo + 名 + 批次数) */
.image-workbench .iw-cover-group-h {
display: flex; align-items: center; gap: 8px;