联华质量管理部 · 生鲜抽检数据分析平台

数据更新于 | 浙江省市场监督管理局及各地市 / 区县 / 国家总局抽检不合格数据(2026)

① 生鲜类抽检不合格汇总(检索 + 分析)

类别分布
风险等级
来源(监管局)TOP15
月度趋势
高频不合格商品 TOP15
高频不合格项目 TOP15

② 全品类抽检不合格汇总(检索 + 分析)

类别分布
风险等级
来源(监管局)TOP15
月度趋势
高频不合格商品 TOP15
高频不合格项目 TOP15

③ 每周汇总(突出当周)

当周 · 类别分布
当周 · 来源(监管局)
当周新增不合格记录(按风险高亮)

④ 联华专项分析(逐条详细 + 举一反三 + 后续建议)

联华 · 按风险等级
联华 · 按类别
联华 · 按门店(被抽样单位)
document.getElementById('upd').textContent = SITE.build_date; const RISKCOLOR = {'高':'#e74c3c','中':'#f39c12','低':'#27ae60','未评定':'#95a5a6'}; const CATCOLOR = ['#2c6fbb','#27ae60','#e67e22','#8e44ad','#16a085','#c0392b','#2980b9','#d35400','#7f8c8d','#2c3e50']; // ---------- 导航 ---------- document.querySelectorAll('nav button').forEach(b=>{ b.onclick=()=>{ document.querySelectorAll('nav button').forEach(x=>x.classList.remove('active')); document.querySelectorAll('.tab').forEach(x=>x.classList.remove('active')); b.classList.add('active'); document.getElementById(b.dataset.tab).classList.add('active'); }; }); // ---------- 通用图表 ---------- function bars(el, arr, colorFn){ el.innerHTML=''; const max = Math.max(1, ...arr.map(x=>x.v)); arr.forEach(x=>{ const row=document.createElement('div'); row.className='bar-row'; const c = colorFn? colorFn(x):'#2c6fbb'; row.innerHTML = '
'+x.l+'
'+ '
'+ '
'+x.v+'
'; el.appendChild(row); }); } function donut(el, arr){ el.innerHTML='
'; const tot = arr.reduce((s,x)=>s+x.v,0)||1; const box = el.firstChild; arr.forEach(x=>{ const s=document.createElement('span'); s.style.width=(x.v/tot*100)+'%'; s.style.background=RISKCOLOR[x.l]||'#95a5a6'; s.title=x.l+': '+x.v; box.appendChild(s); }); const lg=document.createElement('div'); lg.className='legend'; arr.forEach(x=>{ lg.innerHTML += ''+x.l+' '+x.v+''; }); el.appendChild(lg); } function trend(el, recs){ const m={}; recs.forEach(r=>{ if(r.date&&r.date.length>=7){ const k=r.date.slice(0,7); m[k]=(m[k]||0)+1; } }); const keys=Object.keys(m).sort(); const arr=keys.map(k=>({l:k, v:m[k]})); bars(el, arr); } // ---------- 表格 ---------- function tableHTML(recs, cols){ let h=''+cols.map(c=>'').join('')+''; if(!recs.length){ h+='
'+c.t+'
无匹配记录
'; return h; } recs.forEach((r,i)=>{ h+=''; cols.forEach(c=>{ let v = r[c.k]||''; if(c.k==='risk') v=''+v+''; else if(c.k==='link') v = r.link? '查看公告':''; else if(c.k==='name'||c.k==='unit'||c.k==='proj'||c.k==='maker') v = (v||'').replace(/'; }); h+=''; }); h+=''; return h; } const COLS = [ {k:'name',t:'商品名称'},{k:'maker',t:'标称生产单位'},{k:'unit',t:'被抽样单位'}, {k:'proj',t:'不合格项目'},{k:'cat',t:'类别'},{k:'risk',t:'风险'},{k:'region',t:'来源'}, {k:'date',t:'通报日期'},{k:'link',t:'公告'} ]; // ---------- 检索+分析 面板 ---------- function analysisPanel(prefix, dataset){ const ctrl = document.getElementById(prefix+'-ctrl'); // 搜索框 let html = ''; // 风险筛选 html += ''; // 地区筛选 const regions=[...new Set(dataset.map(r=>r.region))].sort(); html += ''; // 排序 html += ''; ctrl.innerHTML = html; // 类别 chips const cats=[...new Set(dataset.map(r=>r.cat))].sort(); const chips=document.createElement('div'); chips.className='chips'; cats.forEach(c=>{ const s=document.createElement('span'); s.className='chip on'; s.textContent=c; s.onclick=()=>{s.classList.toggle('on'); render();}; chips.appendChild(s); }); ctrl.appendChild(chips); const state={q:'',risk:'',region:'',sort:'date',cats:new Set(cats),sortDir:1}; document.getElementById(prefix+'-q').oninput=e=>{state.q=e.target.value;render();}; document.getElementById(prefix+'-risk').onchange=e=>{state.risk=e.target.value;render();}; document.getElementById(prefix+'-region').onchange=e=>{state.region=e.target.value;render();}; document.getElementById(prefix+'-sort').onchange=e=>{state.sort=e.target.value;render();}; function filtered(){ let arr=dataset.filter(r=>{ if(state.cats.size && !state.cats.has(r.cat)) return false; if(state.risk && r.risk!==state.risk) return false; if(state.region && r.region!==state.region) return false; if(state.q){ const q=state.q.toLowerCase(); const hay=(r.name+' '+r.maker+' '+r.unit+' '+r.proj+' '+r.region+' '+r.src).toLowerCase(); if(!hay.includes(q)) return false; } return true; }); const k=state.sort; arr.sort((a,b)=>{ let x=a[k]||'', y=b[k]||''; if(k==='times'){x=+x;y=+y;} if(xy)return 1*state.sortDir; return 0; }); return arr; } window['render_'+prefix]=render; function stats(arr){ const box=document.getElementById(prefix+'-stats'); const hi=arr.filter(r=>r.risk==='高').length; const regs=new Set(arr.map(r=>r.region)).size; box.innerHTML= stat(arr.length,'当前匹配记录')+stat(hi,'高风险')+ stat(regs,'涉及监管局')+stat(dataset.length,'该板块总记录'); } function render(){ const arr=filtered(); stats(arr); // 类别 const cm={}; arr.forEach(r=>cm[r.cat]=(cm[r.cat]||0)+1); bars(document.getElementById(prefix+'-cat'), Object.keys(cm).sort((a,b)=>cm[b]-cm[a]).map(k=>({l:k,v:cm[k]}))); // 风险 const rm={}; arr.forEach(r=>rm[r.risk]=(rm[r.risk]||0)+1); donut(document.getElementById(prefix+'-risk'), ['高','中','低','未评定'].filter(x=>rm[x]).map(x=>({l:x,v:rm[x]}))); // 地区 const zm={}; arr.forEach(r=>zm[r.region]=(zm[r.region]||0)+1); bars(document.getElementById(prefix+'-region'), Object.keys(zm).sort((a,b)=>zm[b]-zm[a]).slice(0,15).map(k=>({l:k,v:zm[k]}))); // 趋势 trend(document.getElementById(prefix+'-trend'), arr); // 商品TOP const pm={}; arr.forEach(r=>pm[r.name]=(pm[r.name]||0)+1); bars(document.getElementById(prefix+'-prod'), Object.keys(pm).sort((a,b)=>pm[b]-pm[a]).slice(0,15).map(k=>({l:k,v:pm[k]}))); // 项目TOP(按 不合格项目 文本聚合前8字) const im={}; arr.forEach(r=>{const k=(r.proj||'').slice(0,10); if(k)im[k]=(im[k]||0)+1;}); bars(document.getElementById(prefix+'-item'), Object.keys(im).sort((a,b)=>im[b]-im[a]).slice(0,15).map(k=>({l:k,v:im[k]}))); // 表 document.getElementById(prefix+'-table').innerHTML=tableHTML(arr, COLS); } render(); } function stat(n,l){return '
'+n+'
'+l+'
';} // ---------- Tab3 每周汇总 ---------- function weekly(){ const w=SITE.week; document.getElementById('t3-banner').innerHTML= '统计口径:上周五 '+w.last_friday+' → 本周四 '+w.this_thursday+'(与 Word 周报一致)。'+ '上周窗口 '+w.prev_last_friday+' ~ '+w.prev_this_thursday+',共 '+w.prev_count+' 条。'; const recs=w.records; const hi=recs.filter(r=>r.risk==='高').length; const regs=new Set(recs.map(r=>r.region)).size; const delta=w.count-w.prev_count; document.getElementById('t3-stats').innerHTML= stat(w.count,'当周新增')+stat(hi,'当周高风险')+stat(regs,'涉及监管局')+ stat((delta>=0?'+':'')+delta,'环比上周'); const cm={}; recs.forEach(r=>cm[r.cat]=(cm[r.cat]||0)+1); bars(document.getElementById('t3-cat'), Object.keys(cm).sort((a,b)=>cm[b]-cm[a]).map(k=>({l:k,v:cm[k]}))); const zm={}; recs.forEach(r=>zm[r.region]=(zm[r.region]||0)+1); bars(document.getElementById('t3-region'), Object.keys(zm).sort((a,b)=>zm[b]-zm[a]).map(k=>({l:k,v:zm[k]}))); // 表(按风险+日期排序,高风险置顶) const ord=recs.slice().sort((a,b)=>{ const rv={'高':0,'中':1,'低':2,'未评定':3}; if(rv[a.risk]!==rv[b.risk]) return rv[a.risk]-rv[b.risk]; return (a.dater.risk==='高').length; const stores=new Set(L.map(r=>r.unit)).size; const food=L.filter(r=>r.type==='食品抽检').length; document.getElementById('t4-stats').innerHTML= stat(L.length,'联华不合格总数')+stat(hi,'高风险')+stat(stores,'涉及门店')+stat(food,'其中食品抽检'); const rm={}; L.forEach(r=>rm[r.risk]=(rm[r.risk]||0)+1); donut(document.getElementById('t4-risk'), ['高','中','低','未评定'].filter(x=>rm[x]).map(x=>({l:x,v:rm[x]}))); const cm={}; L.forEach(r=>cm[r.cat]=(cm[r.cat]||0)+1); bars(document.getElementById('t4-cat'), Object.keys(cm).sort((a,b)=>cm[b]-cm[a]).map(k=>({l:k,v:cm[k]}))); const sm={}; L.forEach(r=>sm[r.unit]=(sm[r.unit]||0)+1); bars(document.getElementById('t4-store'), Object.keys(sm).sort((a,b)=>sm[b]-sm[a]).map(k=>({l:k.length>18?k.slice(0,18)+'…':k,v:sm[k]})).slice(0,12)); // 逐条卡片 const rv={'高':0,'中':1,'低':2,'未评定':3}; const ord=L.slice().sort((a,b)=> rv[a.risk]-rv[b.risk] || (a.date{ h+='

'+(i+1)+'. '+esc(r.name)+ ' '+r.risk+'

'+ '
门店:'+esc(r.unit)+' | 类别:'+esc(r.cat)+ ' | 来源:'+esc(r.src)+' | 通报日期:'+esc(r.date)+ (r.link?' | 查看公告':'')+'
'+ '
不合格项目:'+esc(r.proj)+'
'+ (r.maker&&r.maker!=='无'?'
标称生产单位:'+esc(r.maker)+'
':'')+ '
🔍 举一反三:
'+r.fan+'
'+ '
✅ 后续建议举措:
'+r.adv+'
'+ '
'; }); document.getElementById('t4-list').innerHTML=h; } function esc(s){return (s||'').replace(//g,'>');} // ---------- 启动 ---------- analysisPanel('t1', SITE.fresh); analysisPanel('t2', SITE.all); weekly(); lianhua();