diff --git a/.superpowers/prototype/atoms.css b/.superpowers/prototype/atoms.css index d33887a..dbd79f7 100644 --- a/.superpowers/prototype/atoms.css +++ b/.superpowers/prototype/atoms.css @@ -71,6 +71,11 @@ svg{fill:none; stroke:currentColor;} /* ---- 状态徽章 ---- */ .badge{display:inline-flex; align-items:center; gap:5px; height:22px; padding:0 9px; border-radius:var(--r-pill); font-size:var(--fs-sm); font-weight:600;} .badge::before{content:""; width:6px; height:6px; border-radius:50%; background:currentColor;} +/* 徽章图标化(2026-07-04):.bi=代表性图标替代圆点(桌面);.ico=纯图标紧凑徽章(移动卡片) */ +.badge.bi::before, .badge.ico::before{content:none;} +.badge .ic{width:12px; height:12px; stroke-width:2.2;} +.badge.ico{width:22px; padding:0; justify-content:center; gap:0;} +.badge.ico .ic{width:13px; height:13px;} .b-在售{background:var(--success-bg); color:var(--success);} .b-缺货{background:var(--danger-bg); color:var(--danger);} .b-预警{background:var(--warn-bg); color:var(--warn);} diff --git a/.superpowers/prototype/index.html b/.superpowers/prototype/index.html index f3a5af8..ebc3b5f 100644 --- a/.superpowers/prototype/index.html +++ b/.superpowers/prototype/index.html @@ -377,6 +377,8 @@
授权兑换券未使用已兑换作废
账单结清 · 收付未结清已结清收款付款
进价待定 · 调货暂估待定价待定价(入库进价留空/0,确认进价后回填)
+
图标徽章 .bi · 图标替代圆点草稿待审核已审核已拒绝部分退单已退单待定价
+
纯图标徽章 .ico · 移动卡片(图标映射:草稿=文件 待审核=时钟 已审核=勾 已拒绝=叉 退单=撤回箭头 待定价=价签)

KPI 卡

.kpi
diff --git a/.superpowers/prototype/screens/icons.js b/.superpowers/prototype/screens/icons.js index 750f36e..66502dc 100644 --- a/.superpowers/prototype/screens/icons.js +++ b/.superpowers/prototype/screens/icons.js @@ -1,8 +1,8 @@ // 图标 sprite —— 单一真源(Lucide 官方图标,ISC 许可) // 所有屏用 引用;改此处一个 symbol,全局生效。 -// 共 100 个:97 个源自 lucide-static,另有平台品牌图标 i-apple / i-android(simple-icons,填充式,path 自带 fill 覆盖描边样式)与 i-tablet-smartphone(lucide)。新增图标先在此登记 symbol,再用 use 引用。 +// 共 101 个:98 个源自 lucide-static,另有平台品牌图标 i-apple / i-android(simple-icons,填充式,path 自带 fill 覆盖描边样式)与 i-tablet-smartphone(lucide)。新增图标先在此登记 symbol,再用 use 引用。 (function(){ - var SPRITE=''; + var SPRITE=''; function inject(){ if(document.getElementById('ym-icon-sprite'))return; var d=document.createElement('div'); d.id='ym-icon-sprite'; d.style.cssText='position:absolute;width:0;height:0'; d.innerHTML=SPRITE; document.body.insertBefore(d,document.body.firstChild); } if(document.readyState!=='loading')inject(); else document.addEventListener('DOMContentLoaded',inject); })(); diff --git a/.superpowers/prototype/screens/m-stock-in-list.html b/.superpowers/prototype/screens/m-stock-in-list.html index 97875ae..b9b7df9 100644 --- a/.superpowers/prototype/screens/m-stock-in-list.html +++ b/.superpowers/prototype/screens/m-stock-in-list.html @@ -20,14 +20,22 @@
- +
+ +
新增
+
+
+
近30天入库笔数
28
▲ 12% 较上期
+
近30天入库金额
¥186万
▲ 8.4% 较上期
+
待审核 · 点击筛选
4
需尽快处理
+
草稿 · 点击筛选
2
待提交审核
+
入库单
-
@@ -48,6 +56,10 @@ const OPS=['全部','王经理','李采购']; const REVIEWERS=['全部','张主管','王经理']; const DATES=['全部时间','近 7 天','近 30 天','本月']; const state={q:'',status:'全部'}; +/* ---- 状态代表图标(徽章图标化 2026-07-04:移动纯图标 .ico / 桌面图标+文字 .bi) ---- */ +const STICON={'草稿':'i-ic06','待审核':'i-ic04','已审核':'i-check','已拒绝':'i-close','部分退单':'i-undo','已退单':'i-undo','待定价':'i-tag'}; +function icoB(v){ return ``; } +function biB(v){ return `${v}`; } /* ---- 详细搜索条件(与 Flutter _AdvSearchDialog 同一字段集,移动为竖排简化版) ---- */ const ADV_DEF={no:'',product:'',batch:'',party:'全部',series:'全部',spec:'全部',op:'全部',reviewer:'全部',status:'全部',date:'全部时间'}; let adv={...ADV_DEF}; @@ -75,7 +87,7 @@ function render(){ L.innerHTML=rows.map(o=>`
${o.no}
${o.party} · ${o.items} 项
-
${o.status}${o.ret?`${o.ret}`:''}${o.pending?'待定价':''}${o.amount}
+
${icoB(o.status)}${o.ret?icoB(o.ret):''}${o.pending?icoB('待定价'):''}
${o.amount}
${o.date} · 经手人 ${o.by}${o.auditor?' · 审核 '+o.auditor:''}
@@ -121,11 +133,11 @@ function actions(o){ return '
关闭
'; } function openOrder(no){ const o=ORDERS.find(x=>x.no===no); - const pendRow=o.pending?`
成本含待定价
`:''; + const pendRow=o.pending?`
成本${biB('待定价')}
`:''; const confirmBtn=(o.pending&&o.status==='已审核')?`
确认进价
`:''; const lns=o.lines||[]; - const lineRows=lns.map((l,i)=>`
${l.n}
${l.s} · ×${l.q}
${l.pend?'待定价':l.a}
`).join(''); - openSheet('入库单详情', `
单号${o.no}
供应商${o.party}
单据日期${o.date}
入库员${o.by}
审核员${o.auditor||'—'}
合计金额${o.amount}
${pendRow}
状态${o.status}${o.ret?` ${o.ret}`:''}
+ const lineRows=lns.map((l,i)=>`
${l.n}
${l.s} · ×${l.q}
${l.pend?biB('待定价'):l.a}
`).join(''); + openSheet('入库单详情', `
单号${o.no}
供应商${o.party}
单据日期${o.date}
入库员${o.by}
审核员${o.auditor||'—'}
合计金额${o.amount}
${pendRow}
状态${biB(o.status)}${o.ret?' '+biB(o.ret):''}
商品明细 · ${lns.length} 项
${lineRows}
${o.pending?'
调货「先卖后定价」:进价待定,价格确定后点「确认进价」前向补齐成本与应付。
':''}
${confirmBtn}${actions(o)}
`); diff --git a/.superpowers/prototype/screens/m-stock-out-list.html b/.superpowers/prototype/screens/m-stock-out-list.html index 893077f..ca0d7e8 100644 --- a/.superpowers/prototype/screens/m-stock-out-list.html +++ b/.superpowers/prototype/screens/m-stock-out-list.html @@ -20,14 +20,22 @@
- +
+ +
新增
+
+
+
近30天出库笔数
35
▲ 9.2% 较上期
+
近30天出库金额
¥216万
▲ 6.8% 较上期
+
待审核 · 点击筛选
3
需尽快处理
+
草稿 · 点击筛选
1
待提交审核
+
出库单
-
@@ -47,6 +55,10 @@ const OPS=['全部','王经理','李销售']; const REVIEWERS=['全部','张主管','王经理']; const DATES=['全部时间','近 7 天','近 30 天','本月']; const state={q:'',status:'全部'}; +/* ---- 状态代表图标(徽章图标化 2026-07-04:移动纯图标 .ico / 桌面图标+文字 .bi) ---- */ +const STICON={'草稿':'i-ic06','待审核':'i-ic04','已审核':'i-check','已拒绝':'i-close','部分退单':'i-undo','已退单':'i-undo','待定价':'i-tag'}; +function icoB(v){ return ``; } +function biB(v){ return `${v}`; } /* ---- 详细搜索条件(与 Flutter _AdvancedSearchDialog 同一字段集,移动为竖排简化版) ---- */ const ADV_DEF={no:'',product:'',batch:'',party:'全部',series:'全部',spec:'全部',op:'全部',reviewer:'全部',status:'全部',date:'全部时间'}; let adv={...ADV_DEF}; @@ -74,7 +86,7 @@ function render(){ L.innerHTML=rows.map(o=>`
${o.no}
${o.party} · ${o.items} 项
-
${o.status}${o.ret?`${o.ret}`:''}${o.pending?'待定价':''}${o.amount}
+
${icoB(o.status)}${o.ret?icoB(o.ret):''}${o.pending?icoB('待定价'):''}
${o.amount}
${o.date} · 经手人 ${o.by}${o.auditor?' · 审核 '+o.auditor:''}
@@ -120,11 +132,11 @@ function actions(o){ return '
关闭
'; } function openOrder(no){ const o=ORDERS.find(x=>x.no===no); - const pendRow=o.pending?`
售价含待定价
`:''; + const pendRow=o.pending?`
售价${biB('待定价')}
`:''; const confirmBtn=(o.pending&&o.status==='已审核')?`
确认售价
`:''; const lns=o.lines||[]; - const lineRows=lns.map((l,i)=>`
${l.n}
${l.s} · ×${l.q}
${l.pend?'待定价':l.a}
`).join(''); - openSheet('出库单详情', `
单号${o.no}
客户${o.party}
单据日期${o.date}
出库员${o.by}
审核员${o.auditor||'—'}
合计金额${o.amount}
合计利润 · 管理员可见${o.profit}
${pendRow}
状态${o.status}${o.ret?` ${o.ret}`:''}
+ const lineRows=lns.map((l,i)=>`
${l.n}
${l.s} · ×${l.q}
${l.pend?biB('待定价'):l.a}
`).join(''); + openSheet('出库单详情', `
单号${o.no}
客户${o.party}
单据日期${o.date}
出库员${o.by}
审核员${o.auditor||'—'}
合计金额${o.amount}
合计利润 · 管理员可见${o.profit}
${pendRow}
状态${biB(o.status)}${o.ret?' '+biB(o.ret):''}
商品明细 · ${lns.length} 项
${lineRows}
${o.pending?'
「先卖后定价」:售价待定,价格确定后点「确认售价」按售价×数量结算应收。
':''}
${confirmBtn}${actions(o)}
`); diff --git a/.superpowers/prototype/screens/stock-in-list.html b/.superpowers/prototype/screens/stock-in-list.html index 880ecec..6ce3e33 100644 --- a/.superpowers/prototype/screens/stock-in-list.html +++ b/.superpowers/prototype/screens/stock-in-list.html @@ -154,6 +154,9 @@ const PARTY_LABEL='供应商'; function money(n){ return '¥'+n.toLocaleString(); } +/* ---- 状态代表图标(徽章图标化 2026-07-04:圆点 → .bi 图标徽章) ---- */ +const STICON={'草稿':'i-ic06','待审核':'i-ic04','已审核':'i-check','已拒绝':'i-close','部分退单':'i-undo','已退单':'i-undo','待定价':'i-tag'}; +function stBadge(v){ return `${v}`; } function numf(n){ return (Number(n)||0).toLocaleString(); } /* 明细行内数字:去¥,缩一号(2026-07-03) */ function filtered(){ return ORDERS.filter(o=>{ if(state.status!=='全部'&&o.status!==state.status&&o.ret!==state.status)return false; @@ -198,7 +201,7 @@ function render(){ document.getElementById('thead').innerHTML=''+cols.map(c=>{ const cls=(c.num?'num ':'')+(c.key==='act'?'act ':''); if(c.filter){const on=state.status!=='全部'; return `${c.label} `;} return `${c.label}`; }).join('')+''; const rows=filtered(); const start=(state.page-1)*state.perPage; const pageRows=rows.slice(start,start+state.perPage); const tb=document.getElementById('tbody'); if(rows.length===0){ tb.innerHTML=`
没有匹配的入库单 · 试试调整筛选或搜索
`; } - else { tb.innerHTML=pageRows.map(o=>{ const idx=ORDERS.indexOf(o); return ''+cols.map(c=>{ if(c.key==='no')return `${o.no}`; if(c.key==='party')return `${o.party}`; if(c.key==='wh')return `${o.wh}`; if(c.key==='amount')return `${money(o.amount)}`; if(c.key==='status')return `${o.status}${o.ret?` ${o.ret}`:''}`; if(c.key==='op')return `${o.op}`; if(c.key==='auditor')return `${o.auditor?o.auditor:''}`; if(c.key==='act')return `
`; return `${o[c.key]}`; }).join('')+''; }).join(''); } + else { tb.innerHTML=pageRows.map(o=>{ const idx=ORDERS.indexOf(o); return ''+cols.map(c=>{ if(c.key==='no')return `${o.no}`; if(c.key==='party')return `${o.party}`; if(c.key==='wh')return `${o.wh}`; if(c.key==='amount')return `${money(o.amount)}`; if(c.key==='status')return `${stBadge(o.status)}${o.ret?' '+stBadge(o.ret):''}`; if(c.key==='op')return `${o.op}`; if(c.key==='auditor')return `${o.auditor?o.auditor:''}`; if(c.key==='act')return `
`; return `${o[c.key]}`; }).join('')+''; }).join(''); } document.getElementById('pagerInfo').textContent=`显示 ${rows.length?start+1:0}–${Math.min(start+state.perPage,rows.length)},共 ${rows.length}`; const pages=Math.max(1,Math.ceil(rows.length/state.perPage)); let pg=``; for(let p=1;p<=pages;p++)pg+=``; pg+=``; document.getElementById('pager').innerHTML=pg; document.getElementById('subInfo').textContent=`本月 ${rows.length} 笔入库单`; @@ -306,7 +309,7 @@ function openDetail(idx){ const o=ORDERS[idx]; document.getElementById('dTitle') o.lines.forEach(l=>{ const pi=PINFO[l.name]||{}; const pend=(l.price||0)<=0; const priceC=pend?'待定价':numf(l.price); const amtC=pend?'待定价':numf(l.qty*l.price); lh+=`
${l.name}${pi.code||'—'}${pi.series||'—'}${pi.spec||''}${l.qty}${priceC}${amtC}
`; }); lh+='
'; const pendCount=o.lines.filter(l=>(l.price||0)<=0).length; const auditor=o.auditor?o.auditor:''; - document.getElementById('drawerBody').innerHTML=`
单据日期${o.date}
${PARTY_LABEL}${o.party}
仓库${o.wh}
商品数${o.count}
入库员${o.op}
审核员${auditor}
状态${o.status}${o.ret?` ${o.ret}`:''}
${lh}
合计金额 ${money(o.amount)}
`+ + document.getElementById('drawerBody').innerHTML=`
单据日期${o.date}
${PARTY_LABEL}${o.party}
仓库${o.wh}
商品数${o.count}
入库员${o.op}
审核员${auditor}
状态${stBadge(o.status)}${o.ret?' '+stBadge(o.ret):''}
${lh}
合计金额 ${money(o.amount)}
`+ `
单据审核
${auditBtns(o,idx)}
${(o.status==='已审核'&&pendCount>0)?`
成本 · ${pendCount} 项待定价
确认进价
`:''}
打印
打印标签
打印单据
`; document.getElementById('drawer').classList.add('show'); document.getElementById('drawerMask').classList.add('show'); } function closeDrawer(){ document.getElementById('drawer').classList.remove('show'); document.getElementById('drawerMask').classList.remove('show'); } diff --git a/.superpowers/prototype/screens/stock-out-list.html b/.superpowers/prototype/screens/stock-out-list.html index 5dd8c4b..3ec3658 100644 --- a/.superpowers/prototype/screens/stock-out-list.html +++ b/.superpowers/prototype/screens/stock-out-list.html @@ -153,6 +153,9 @@ const PARTY_LABEL='客户'; function money(n){ return '¥'+n.toLocaleString(); } +/* ---- 状态代表图标(徽章图标化 2026-07-04:圆点 → .bi 图标徽章) ---- */ +const STICON={'草稿':'i-ic06','待审核':'i-ic04','已审核':'i-check','已拒绝':'i-close','部分退单':'i-undo','已退单':'i-undo','待定价':'i-tag'}; +function stBadge(v){ return `${v}`; } function numf(n){ return (Number(n)||0).toLocaleString(); } /* 明细行内数字:去¥,缩一号(2026-07-03) */ function filtered(){ return ORDERS.filter(o=>{ if(state.status!=='全部'&&o.status!==state.status&&o.ret!==state.status)return false; @@ -197,7 +200,7 @@ function render(){ document.getElementById('thead').innerHTML=''+cols.map(c=>{ const cls=(c.num?'num ':'')+(c.key==='act'?'act ':''); if(c.filter){const on=state.status!=='全部'; return `${c.label} `;} return `${c.label}`; }).join('')+''; const rows=filtered(); const start=(state.page-1)*state.perPage; const pageRows=rows.slice(start,start+state.perPage); const tb=document.getElementById('tbody'); if(rows.length===0){ tb.innerHTML=`
没有匹配的出库单 · 试试调整筛选或搜索
`; } - else { tb.innerHTML=pageRows.map(o=>{ const idx=ORDERS.indexOf(o); return ''+cols.map(c=>{ if(c.key==='no')return `${o.no}`; if(c.key==='party')return `${o.party}`; if(c.key==='wh')return `${o.wh}`; if(c.key==='amount')return `${money(o.amount)}`; if(c.key==='status')return `${o.status}${o.ret?` ${o.ret}`:''}`; if(c.key==='op')return `${o.op}`; if(c.key==='auditor')return `${o.auditor?o.auditor:''}`; if(c.key==='act')return `
`; return `${o[c.key]}`; }).join('')+''; }).join(''); } + else { tb.innerHTML=pageRows.map(o=>{ const idx=ORDERS.indexOf(o); return ''+cols.map(c=>{ if(c.key==='no')return `${o.no}`; if(c.key==='party')return `${o.party}`; if(c.key==='wh')return `${o.wh}`; if(c.key==='amount')return `${money(o.amount)}`; if(c.key==='status')return `${stBadge(o.status)}${o.ret?' '+stBadge(o.ret):''}`; if(c.key==='op')return `${o.op}`; if(c.key==='auditor')return `${o.auditor?o.auditor:''}`; if(c.key==='act')return `
`; return `${o[c.key]}`; }).join('')+''; }).join(''); } document.getElementById('pagerInfo').textContent=`显示 ${rows.length?start+1:0}–${Math.min(start+state.perPage,rows.length)},共 ${rows.length}`; const pages=Math.max(1,Math.ceil(rows.length/state.perPage)); let pg=``; for(let p=1;p<=pages;p++)pg+=``; pg+=``; document.getElementById('pager').innerHTML=pg; document.getElementById('subInfo').textContent=`本月 ${rows.length} 笔出库单`; @@ -302,7 +305,7 @@ function openDetail(idx){ const o=ORDERS[idx]; document.getElementById('dTitle') o.lines.forEach(l=>{ const pi=PINFO[l.name]||{}; const cost=l.cost!=null?l.cost:Math.round((l.price||0)*0.85); const pend=(l.price||0)<=0; const saleC=pend?'待定价':numf(l.price); const profit=(l.price-cost)*l.qty; const profitC=pend?'待定价':`${numf(profit)}`; lh+=`
${l.name}${pi.code||'—'}${pi.series||'—'}${pi.spec||''}${l.qty}${numf(cost)}${saleC}${pend?'待定价':numf(l.qty*l.price)}${profitC}
`; }); lh+='
'; const pendCount=o.lines.filter(l=>(l.price||0)<=0).length; const auditor=o.auditor?o.auditor:''; - document.getElementById('drawerBody').innerHTML=`
单据日期${o.date}
${PARTY_LABEL}${o.party}
仓库${o.wh}
商品数${o.count}
出库员${o.op}
审核员${auditor}
状态${o.status}${o.ret?` ${o.ret}`:''}
${lh}
合计金额 ${money(o.amount)}
合计利润 ${money(o.lines.reduce((s,l)=>{const c=l.cost!=null?l.cost:Math.round((l.price||0)*0.85);return s+((l.price||0)>0?((l.price-c)*l.qty):0);},0))}
`+ + document.getElementById('drawerBody').innerHTML=`
单据日期${o.date}
${PARTY_LABEL}${o.party}
仓库${o.wh}
商品数${o.count}
出库员${o.op}
审核员${auditor}
状态${stBadge(o.status)}${o.ret?' '+stBadge(o.ret):''}
${lh}
合计金额 ${money(o.amount)}
合计利润 ${money(o.lines.reduce((s,l)=>{const c=l.cost!=null?l.cost:Math.round((l.price||0)*0.85);return s+((l.price||0)>0?((l.price-c)*l.qty):0);},0))}
`+ `
单据审核
${auditBtns(o,idx)}
${(o.status==='已审核'&&pendCount>0)?`
售价 · ${pendCount} 项待定价
确认售价
`:''}
打印
打印标签
打印单据
`; document.getElementById('drawer').classList.add('show'); document.getElementById('drawerMask').classList.add('show'); } function closeDrawer(){ document.getElementById('drawer').classList.remove('show'); document.getElementById('drawerMask').classList.remove('show'); } diff --git a/web/_includes/icons.njk b/web/_includes/icons.njk index 41ae96c..9a9beb0 100644 --- a/web/_includes/icons.njk +++ b/web/_includes/icons.njk @@ -1,3 +1,3 @@ {# 图标雪碧图 — 单一真相源:自 .superpowers/prototype/screens/icons.js 提取(lucide 同源), 页面用 引用;修改图标请先改原型再同步 #} - +