🏥 医疗器械经营资质办理工作台

企业项目 · 材料收集 · 递交审核 · 现场核验 · 培训考核 · 体系运行

➕ 新建企业办理项目

填写企业基本信息并选择办理事项,系统将以母版为底稿自动创建该企业的体系文件册:《制度汇编》《工作程序汇编》《记录表格汇编》《培训考试模块汇编(岗前册)》《培训考试模块汇编(年度册)》《培训精华版》。之后可随时进入该企业工作台处理各事项;企业信息在"编辑企业信息"中修改后,将自动同步贯穿到该企业的全部资料。项目可不断累积新增,互不影响。

▸ 更多经营条件(品种范围/委托贮存——默认普通二三类,需要时再展开)
(全不勾=普通二三类)
其余信息(地址、电话、证号等)创建后可在企业工作台内随时补填

📋 企业项目看板

点击企业卡片进入该企业工作台,选择要处理的事项(材料收集、现场核验、培训等)。企业信息一处修改,全套资料自动同步。

📊 待办汇总:
材料未完成 0 项
·
核验未完成 0 项
·
培训未完成 0 项
·
已完成 0 家
共 0 家项目
·
💾 存储 —
💡 换电脑前先导出备份

⏱ 关键时限速查(务必牢记)

事项时限要求依据
第三类经营许可审查决定受理之日起 20 个工作日内作出决定(整改时间不计入)54 号令第十三条
准予许可后发证10 个工作日内发给许可证54 号令第十三条
许可证有效期5 年54 号令第十四条
延续申请窗口期有效期届满前 90 个工作日 至 30 个工作日 之间提出;逾期不再受理54 号令第十六条
许可事项变更(场所/方式/范围/库房)受理之日起 20 个工作日内决定;其他登记事项当场变更;变更后编号与有效期限不变54 号令第十五条
第二类备案后检查必要时在备案之日起 3 个月内开展现场检查54 号令第二十二条
现场核查整改限期整改的,检查结束后 30 个工作日内一次性提交整改报告国药监械管〔2024〕20号
年度自查报告每年 3 月 31 日前提交上一年度自查报告(二三类经营企业)GSP 2024 第十二条
质量记录保存进货查验/销售记录:有效期满后 2 年;无有效期不少于 5 年;植入类永久保存GSP 2024 第二十三条
UDI 实施(二类全品类)2027-06-01 起生产的全部第二类械(含试剂)及第一类试剂应有 UDI2026年第21号公告

👥 责任人学历与工作年限要求速查(人员资质对照)

岗位/责任人 学历要求(职称替代路径) 专业要求 工作年限要求 适用范围与依据
企业负责人 无硬性学历要求 — — 所有企业。须熟悉医疗器械监管法律、法规、规章、规范及所经营器械相关知识,具备质量安全管理能力(GSP 2024 第三、四章;ZD-02 任职要求)
质量负责人 ★ 大专及以上学历;或中级及以上专业技术职称(职称可替代学历) 医疗器械相关专业:医疗器械、生物医学工程、机械、电子、医学、生物工程、化学、药学、护理学、康复、检验学、计算机、法律、管理学等 3 年及以上医疗器械经营质量管理工作经历 第三类经营为法定条件,仅经营第二类的参照执行(GSP 2024 第二十六条;检查指导原则 ※4.26 关键项)
质量管理人员(从事第三类批发)★ 至少 1 人:大专及以上学历,或中级及以上专业技术职称 医疗器械相关专业:医疗器械、生物医学工程、机械、电子、医学、生物工程、化学、药学、护理学、康复、检验学、计算机、法律、管理学等 无年限硬性要求 从事第三类医疗器械批发经营的企业(GSP 2024 第二十七条;※4.27 关键项)
试剂质量管理专员(经营体外诊断试剂)★ 至少 1 人:主管检验师职称;或检验学相关专业大专及以上学历,或中级及以上专业技术职称 检验学相关专业:检验学、生物医学工程、生物化学、免疫学、基因学、药学、生物技术、临床医学、医疗器械等 按学历/职称路径配备的,另须 3 年及以上检验相关工作经历(主管检验师职称路径无年限要求) 经营体外诊断试剂的企业(仅经营国家规定免于经营备案试剂的除外)(GSP 2024 第二十七条;※4.27 关键项)
试剂验收/售后服务技术人员 中专及以上学历;或检验师初级及以上专业技术职称 检验学相关专业:检验学、生物医学工程、生物化学、免疫学、基因学、药学、生物技术、临床医学、医疗器械等 — 经营体外诊断试剂,从事其验收、售后服务技术工作的人员(GSP 2024 第二十七条;4.28)
植入介入采购/销售人员 至少 1 人:大专及以上学历 医学相关专业:基础医学、预防医学、临床医学、医学技术、口腔医学、中医学、护理学、药学等 无年限硬性要求 经营植入和介入类医疗器械,从事其采购或销售的人员;另须经医疗器械注册人(备案人)或专业机构培训(GSP 2024 第二十八条;4.28)
验收、贮存、销售等作业岗位 无统一学历硬性要求 — — 所有企业。须经上岗培训并考核合格方可上岗(GSP 2024 第三十一条;ZD-26 培训考核制度)
售后服务管理/技术人员 管理人员无硬性学历要求;自行提供安装、维修、培训等技术服务的技术人员须具备相应技术能力 试剂售后服务技术人员按上行试剂要求 — 专职或兼职均可(三类批发建议专职);技术人员经注册人(备案人)或其他专业机构培训(GSP 2024;4.28)
直接接触器械岗位全员 — — — 质量管理、验收、库房管理、零售等直接接触医疗器械岗位人员:岗前+年度健康检查,建立健康档案(GSP 2024 第三十三条;JL-004)
★ 在职在岗要求:质量负责人、质量管理人员应当在职在岗,不得在其他医疗器械经营企业兼任同等职务。"在职"指与企业建立劳动关系的在册人员,"在岗"指工作时间在本岗位履行职责;现场核查通过劳动合同+社保缴纳记录+任命文件核实(※4.25 关键项)。
★ 关键项提示:标 ★ 行对应现场检查指导原则关键项(※4.26/※4.27),不符合直接计入关键项不符合数(判定线:关键项不符合 ≤10% 可限期整改,详见下方判定标准)。
注:第二类经营企业人员条件目前无统一硬性规定,按上表"参照执行"口径配备;各省对零售(含药店兼营)人员另有规定的,从其规定。任命文件按 JL-001 存档,人员调整及时更新并重新培训。

🎯 现场核查判定标准

依据《医疗器械经营质量管理规范现场检查指导原则》(国药监械管〔2024〕20号):
通过检查:适用项目全部符合要求或能当场整改完成;
限期整改:关键项目(※)不符合数 ≤10% 且 一般项目不符合数 ≤20%;
未通过检查:关键项目 >10% 或 一般项目 >20%(可直接不予许可)。
经营方式、范围、品种不适用的项目可作"合理缺项",需书面说明理由并由检查组确认。

📐 面积与人员底线提示

  • 经营场所、库房面积与经营范围规模相适应;不得设在居民住宅内(54号令/GSP 第三十五条)
  • 三类质量负责人:医疗器械相关专业大专及以上学历或中级以上职称 + 3 年以上经营质量管理经历(GSP 第二十六条,专业含计算机、法律、管理学)
  • 三类批发质量管理人员至少 1 人相关专业大专以上(GSP 第二十七条)
  • 经营试剂:至少 1 人主管检验师,或检验学相关专业大专以上 + 3 年检验经历;验收人员检验学中专以上或检验师初级以上(GSP 第二十七条)
  • 植入介入:采购或销售人员至少 1 人医学相关专业大专以上并经培训(GSP 第二十八条)
  • 质量负责人、质量管理人员须在职在岗(有社保记录佐证更稳妥)

✅ 现场验收准备要点(核查前自查)

① 证照与人员

  • 营业执照经营范围含医疗器械经营相关表述
  • 人员任命文件、组织机构图、岗位说明书(对应汇编 ZD-01/ZD-03)
  • 企业负责人、质量负责人、质量管理人员学历职称证件原件备查
  • 质量负责人 3 年以上工作经历佐证(离职证明/劳动合同/社保)
  • 直接接触产品岗位人员岗前+年度健康检查档案(GSP 第三十三条)
  • 关键岗位人员现场问答:知道自己的职责(在职在岗核查重点)

② 场所与设施

  • 库房分区色标:待验区、退货区=黄色;合格品区、发货区=绿色;不合格品区=红色(GSP 第四十条)
  • 货架托盘离地离墙、避光通风防潮防虫防鼠"五防"设施
  • 温湿度监测设备经校准/检定,校准证书在有效期内
  • 冷链(如适用):冷库验证报告、温度自动监测报警、备用发电机组或双回路供电、冷藏箱保温箱
  • 经营场所整洁、证照上墙(零售需陈列柜台与分区标识)

③ 文件与记录

  • 体系文件齐全:GSP 第二十条 24 项制度 + 各环节工作程序(对照汇编目录)
  • 发布令、文件修订记录、受控发放记录齐备,版本受控
  • 记录表格已启用并真实填写:首营审核、进货查验、温湿度、销售、出库复核等
  • 培训计划、培训签到、考核试卷与成绩(GSP 第三十、三十二条)
  • 每季度质量安全风险会商纪要(GSP 第十七条)

④ 计算机系统(三类必备)

  • 部门岗位间数据共享功能可演示
  • 经营业务票据生成、打印、管理
  • 产品信息与质量追溯(注册证号、批号/序列号、生产日期、效期)
  • 采购→出库各环节质量控制(各环节数据可关联演示)
  • 供货者/购货者资质有效性审核控制
  • 效期自动跟踪:近效期预警、过期自动锁定
  • UDI 带码入库、出库(三类及 103 种二类已实施)

🎓 培训考核计划(现场核查与体系运行通用)

培训对象覆盖质量安全关键岗位人员及采购、验收、仓储、养护、销售、运输、售后各岗位;经考核合格后方可上岗,并建立培训记录与考核档案(GSP 第三十至三十二条)。

岗前培训课程(基础课时合计≥12学时,详见培训考试模块汇编(岗前册)PX-G01 课表)

  1. 《医疗器械监督管理条例》(739号令)重点条款
  2. 《医疗器械经营监督管理办法》(54号令)+ 2024版 GSP 总体解读
  3. 本企业质量管理制度与工作程序(对照汇编 ZD/GC 逐项讲解)
  4. 岗位职责与岗位操作规程(人手一册岗位说明书)
  5. 进货查验、贮存、销售追溯实操(含记录表格填写演练)
  6. 不良事件监测与召回报告流程
  7. 冷链专项(适用时):冷链制度、温控设备操作、应急预案演练
  8. 试剂专项(适用时):试剂特性、储运要求、验收要点

年度培训(继续培训)与考核

  1. 法规更新专题(新规解读,如 UDI 分批实施、网络销售规范)
  2. 岗位技能复训 + 书面/实操考核(不合格者离岗再培训,见培训考试模块汇编(年度册)PX-N01)
年度配套任务(非培训课次):年度健康检查、年度自查(3月31日前)、每季度风险会商——分别见制度 ZD-25/ZD-07/ZD-27。
配套记录:签到(PX-D01)、培训记录与效果评估(PX-D02)、成绩与试卷归档(PX-D05)、学时台账(PX-D07)、员工健康档案(JL-004)。

🧾 各事项法定材料清单(依据 54 号令第十条/第二十一条整理)

以下为法定申报材料口径,各省/市政务服务网可能有格式化样表与细微差异,递交前请以当地办事指南为准。

第三类经营许可(新办)

  1. 医疗器械经营许可申请表
  2. 法定代表人(企业负责人)、质量负责人身份证明、学历或职称材料复印件
  3. 企业组织机构与部门设置说明
  4. 医疗器械经营范围、经营方式说明材料
  5. 经营场所和库房的地理位置图、平面图、房屋产权文件或租赁协议复印件
  6. 主要经营设施、设备目录
  7. 经营质量管理制度、工作程序等文件目录
  8. 计算机信息管理系统基本情况介绍和功能说明
  9. 经办人授权文件(委托代办时)+ 营业执照复印件
依据:《医疗器械经营监督管理办法》第十条。三类许可向所在地设区的市级药监部门申请。

第二类经营备案(新办)

  1. 第二类医疗器械经营备案表
  2. 法定代表人(企业负责人)、质量负责人身份证明、学历或职称材料复印件
  3. 企业组织机构与部门设置说明
  4. 医疗器械经营范围、经营方式说明材料
  5. 经营场所和库房的地理位置图、平面图、房屋产权文件或租赁协议复印件
  6. 主要经营设施、设备目录
  7. 经营质量管理制度、工作程序等文件目录
  8. 经办人授权文件(委托代办时)+ 营业执照复印件
依据:54 号令第二十一条(提交第十条规定资料,第(七)项信息管理系统除外)。完成备案即获备案编号;必要时 3 个月内现场检查(第二十二条)。

延续(三类)

  • 医疗器械经营许可延续申请表
  • 按新办口径整理的第十条各项材料(更新至现行状态)
  • 原医疗器械经营许可证
  • 务必在届满前 90~30 个工作日窗口内提出,逾期不再受理
依据:54 号令第十六条。逾期未作出决定的视为准予延续;延续后编号不变。

变更 / 补发

  • 许可事项变更(经营场所、经营方式、经营范围、库房地址):变更申请表 + 涉及变更内容的有关材料(新地址图件/产权租赁、新增人员资格等),受理后 20 个工作日决定
  • 登记事项变更(名称、法定代表人等):变更申请 + 营业执照等佐证,当场办理
  • 补发:补发申请 + 遗失情况说明;补发后编号与有效期限与原证一致
  • 变更、补发后许可证编号和有效期限不变
依据:54 号令第十五条、第十九条。

📗 母版查阅与调整

母版是新建企业项目的底稿(出厂为批零兼营全口径)。进入后可查看并修改母版,修改自动保存为母版——不影响任何已创建项目;之后新建的项目将以调整后的母版为底稿。

进入母版后,工具栏下方显示"母版模式"蓝色提示条即为母版编辑状态。已创建项目在汇编内可点击"⤓ 同步母版"拉取母版最新内容(保留企业信息与经营条件)。

💾 数据备份说明

全部项目数据(企业存档、事项清单、进度)均保存在本浏览器 localStorage中。更换电脑、清理浏览器缓存前,请务必点击右上角"导出工作数据"下载 JSON 备份;在新电脑上用"导入工作数据"恢复。
重复导入不会产生重复企业:同一企业(相同统一社会信用代码,或名称相同)导入时以导入数据覆盖现有记录(企业信息、各册汇编存档、事项清单与进度同步更新),导入数据中缺失的部分保留本地现有内容;不同企业则新增。

🤖 AI 助手 有底线 · 可灵活 · 内置审核员

AI 用于三类工作:① 上传资料字段智能抽取(规则识别兜底);② 法规问答/定制生成——以知识库 6 部官方原文为底线(涉及"应当/不得/时限/条件"的结论必须引用文号+条款号),在此之上灵活作答(可联网补充官方动态与渠道信息、可结合本企业类型方式定制生成体系文件段落),并内置审核员对初稿逐项审核(法规底线/相关性/完整性/详略/企业适配)后给出定稿;③ 知识库检索(Tab5)。不相关的冗余内容自动压缩,答案针对当前企业口径收敛。规则类工作(材料生成、岗位搭配、显隐适配)仍走确定性逻辑。

⚙️ 接口配置(默认已内置 DeepSeek,点击展开/收起)
🔗 联网作答(可选):

⚠ 已内置 DeepSeek 默认 Key(仅存本机浏览器,不同步)。联网搜索为可选增强:法规结论始终以本地知识库为底线,联网内容仅补充动态信息并标注来源链接。若需把「起始页」转发给客户或他人,请先点「🗑 清除 Key」并保存,防止密钥随文件泄露。

💬 法规问答 · 定制生成 底线+灵活 · 联网可选 · 审核员把关 · 流式输出

定制生成快捷: 点选后自动切换"智能体"模式,按当前企业条件定制生成,可再修改提问
回答风格:

📐 知识学习与使用规范(底线+灵活,审核员把关)

  1. 知识来源(底线):知识库仅收录 6 部官方原文(条例739号/54号令/2024 版 GSP/指导原则20号/贮运附录94号/试剂48号令),每部均带发文机关、文号、施行日期、来源链接与收录日期;法规更新时用 构建/gen_ai_kb.py 重新抓取生成,不引用二手转载。
  2. 引用必须:涉及"应当/不得/时限/条件/程序"的结论必须附【依据】文号+条款号并给原文片段;知识库无依据的法规性结论明确回答"未检索到依据"——宁可不答,不许编造。
  3. 灵活有界:操作层面(材料清单细节、办理渠道、行业惯例、官方动态)可在底线之上合理展开并标注"操作建议";开启联网时补充内容必须标注来源链接,与法规冲突的以法规为准。
  4. 审核员机制:智能体模式下先由"起草员"作答,再由"审核员"按五项(法规底线/相关性/完整性/详略/企业条件适配)逐项审核,必要时按审核意见修订后给出定稿;审核意见与初稿均留痕可查。
  5. 结果仅作辅助:AI 输出不直接写入任何交付材料;正式申报与体系文件以法规原文和汇编定稿为准。
  6. 密钥安全:API Key 仅存本机浏览器 localStorage(ylqx_ai_cfg),不上传、不随备份同步到其他用途;接口需支持浏览器跨域(DeepSeek/通义/智谱等 OpenAI 兼容接口一般可用)。

📚 专业知识库 官方原文 · 文号/施行日期/来源可查 · 更新走 构建/gen_ai_kb.py

📖 法规目录

原文阅读

文档加载中…
正在加载文档…

🖨 请使用文档工具栏的「打印」按钮

当前处于文档编辑视图,浏览器直接打印本页无法输出文档内容。

请点击上方工具栏「🖨 打印」按钮(或按 Ctrl / ⌘ + P),
系统将在新标签页打开文档并自动进入打印预览。

'); w.document.close(); } else { toast("打印窗口被浏览器拦截,请允许弹出窗口后重试"); } } function info2(it, wb){ return { name: it.name, boss: it.boss, qa: it.qa, drafter: wb.drafter||"", reviewer: wb.reviewer||"", approver: wb.approver||"" }; } window.stfPrint = stfPrint; $("#stfPrint").addEventListener("click", function(){ window.stfPrint(); }); /* ============ AI 服务层(可选增强:配置→调用→知识库检索→问答→识别增强) ============ */ var AI_CFG_DEFAULT = { url:"https://api.deepseek.com/v1", model:"deepseek-chat", key:"sk-47cdfc11780f4aeaba8b0f2633426962", webUrl:"", webKey:"", webOn:false }; /* 自动写入制度汇编 FM-04《文件修订记录》:变更/延续生成修订记录时同步登记 */ function fm04Append(entId, rowHtml, label){ try{ var k = "ylqx_e" + entId + "_zd_v1"; var o = JSON.parse(localStorage.getItem(k) || "null"); var d = null; if(o && o.docs && o.docs.length){ for(var i = 0; i < o.docs.length; i++){ if(o.docs[i].code === "FM-04"){ d = o.docs[i]; break; } } } if(d && d.body){ var blank = "        "; var b = d.body; if(b.indexOf(blank) >= 0){ b = b.replace(blank, rowHtml); } else { b = b.replace("", rowHtml + ""); } d.body = b; if(!safeSet(k, JSON.stringify(o))){ toast("写入 FM-04 失败:本地存储无法写入"); return false; } /* 若制度汇编正以 iframe 打开,通知其同步刷新 FM-04 节点,消除直写与自动保存的竞态 */ try{ var fr = document.getElementById("docFrame"); if(fr && fr.contentWindow){ fr.contentWindow.postMessage({type:"fm04Reload"}, "*"); } }catch(e){} toast("✅ 已自动写入制度汇编 FM-04《文件修订记录》(" + (label || "修订") + ")"); return true; } /* 存档为空壳/缺 FM-04:写入暂存队列,下次打开制度汇编时自动写入 FM-04 */ var qk = "ylqx_fm04q_" + entId; var q = []; try{ q = JSON.parse(localStorage.getItem(qk) || "[]"); }catch(e){} q.push(rowHtml); safeSet(qk, JSON.stringify(q)); toast("✅ 修订记录已暂存——下次打开该企业《制度汇编》时自动写入 FM-04《文件修订记录》"); return false; var blank = "        "; var b = d.body; if(b.indexOf(blank) >= 0){ b = b.replace(blank, rowHtml); } else { b = b.replace("", rowHtml + ""); } d.body = b; try{ localStorage.setItem(k, JSON.stringify(o)); }catch(e){ toast("写入 FM-04 失败:" + e.message); return false; } toast("✅ 已自动写入制度汇编 FM-04《文件修订记录》(" + (label || "修订") + ")"); return true; }catch(e){ toast("写入 FM-04 失败:" + e.message); return false; } } window.fm04Append = fm04Append; function aiCfg(){ try{ var c = JSON.parse(localStorage.getItem("ylqx_ai_cfg")||"{}"); return Object.assign({}, AI_CFG_DEFAULT, c || {}); }catch(e){ return Object.assign({}, AI_CFG_DEFAULT); } } function aiSaveCfg(c){ try{ localStorage.setItem("ylqx_ai_cfg", JSON.stringify(c)); }catch(e){} } function aiEnabled(){ var c = aiCfg(); return !!(c.url && c.key); } window.aiEnabled = aiEnabled; function aiChat(messages, opts){ opts = opts || {}; var c = aiCfg(); if(!aiEnabled() && !c.mock) return Promise.reject(new Error("AI 未配置(可在顶部保存接口,或勾选离线演示模式)")); if(c.mock) return Promise.resolve(aiMockReply(messages, opts)); var ctrl = (typeof AbortController !== "undefined") ? new AbortController() : null; var timer = setTimeout(function(){ if(ctrl) ctrl.abort(); }, opts.timeout || 60000); var body = { model: c.model || "deepseek-chat", messages: messages }; if(opts.json) body.response_format = { type:"json_object" }; else if(!/reasoner|r1|thinking/i.test(c.model || "")) body.temperature = 0.2; /* 思考型模型不传采样参数 */ return fetch((c.url||"").replace(/\/+$/, "") + "/chat/completions", { method:"POST", headers:{ "Content-Type":"application/json", "Authorization":"Bearer " + c.key }, body: JSON.stringify(body), signal: ctrl ? ctrl.signal : undefined }).then(function(r){ if(!r.ok){ return r.text().then(function(tx){ throw new Error("接口返回 " + r.status + ":" + tx.slice(0,120) + (r.status === 0 ? "(可能是跨域被拦截或网络不通)" : "")); }); } return r.json(); }).then(function(d){ var msg = (d.choices && d.choices[0] && d.choices[0].message) || {}; var m = msg.content || ""; if(msg.reasoning_content && opts.onThink){ try{ opts.onThink(String(msg.reasoning_content), false); }catch(e){} } if(!m) throw new Error("接口未返回内容"); return m; }).catch(function(e){ if(e && e.name === "AbortError") throw new Error("请求超时(60 秒)"); throw e; }).finally(function(){ clearTimeout(timer); }); } window.aiChat = aiChat; function aiChatStream(messages, onDelta, opts){ opts = opts || {}; var c = aiCfg(); if(!aiEnabled() && !c.mock) return Promise.reject(new Error("AI 未配置(可在顶部保存接口,或勾选离线演示模式)")); if(c.mock){ var full = aiMockReply(messages, opts); var mkThink = "(离线演示·模拟思考)判断问题性质与适用法规范围 → 知识库检索命中条款 → 结合企业画像筛选适用要点 → 组织结论、依据与追问。"; return new Promise(function(res){ function startMain(){ var idx = 0, iv = setInterval(function(){ idx += 14; onDelta(full.slice(0, idx)); if(idx >= full.length){ clearInterval(iv); window.__aiIv = null; if(opts.onThink){ try{ opts.onThink(mkThink, false); }catch(e){} } onDelta(null, true); res(full); } }, 50); window.__aiIv = iv; } if(!opts.onThink){ startMain(); return; } var ti = 0, tiv = setInterval(function(){ ti += 16; opts.onThink(mkThink.slice(0, ti), true); if(ti >= mkThink.length){ clearInterval(tiv); startMain(); } }, 28); }); } var ctrl = new AbortController(); window.__aiCtrl = ctrl; var timer = setTimeout(function(){ try{ ctrl.abort(); }catch(e){} }, opts.timeout || 120000); return fetch((c.url||"").replace(/\/+$/,"") + "/chat/completions", { method:"POST", headers:{ "Content-Type":"application/json", "Authorization":"Bearer " + c.key }, body: JSON.stringify(Object.assign({ model: c.model || "deepseek-chat", messages: messages, stream: true }, /reasoner|r1|thinking/i.test(c.model || "") ? {} : { temperature: 0.2 })), /* 思考型模型不传采样参数 */ signal: ctrl.signal }).then(function(r){ if(!r.ok){ return r.text().then(function(tx){ throw new Error("接口返回 " + r.status + ":" + tx.slice(0,120)); }); } var reader = r.body.getReader(); var dec = new TextDecoder("utf-8"); var buf = "", full = "", thinkFull = ""; function pump(){ return reader.read().then(function(rr){ if(rr.done){ clearTimeout(timer); if(opts.onThink && thinkFull){ try{ opts.onThink(thinkFull, false); }catch(e){} } onDelta(null, true); return full; } buf += dec.decode(rr.value, {stream:true}); var lines = buf.split("\n"); buf = lines.pop(); lines.forEach(function(line){ line = line.trim(); if(line.slice(0,5) !== "data:") return; var payload = line.slice(5).trim(); if(payload === "[DONE]") return; try{ var j = JSON.parse(payload); var dd = (j.choices && j.choices[0] && j.choices[0].delta) || {}; if(dd.reasoning_content || dd.reasoning){ /* 思考型模型:推理链实时透出 */ thinkFull += (dd.reasoning_content || dd.reasoning || ""); if(opts.onThink){ try{ opts.onThink(thinkFull, true); }catch(e){} } } if(dd.content){ full += dd.content; onDelta(full); } }catch(e){} }); return pump(); }); } return pump(); }).catch(function(e){ clearTimeout(timer); if(e && e.name === "AbortError") throw new Error("已停止"); throw e; }); } window.aiChatStream = aiChatStream; /* 联网补充检索(可选):Tavily 式 POST {query} -> {results:[{title,url,content}]},失败/未配置返回 [] */ async function aiWebSearch(q){ var c = aiCfg(); if(!c.webOn || !c.webUrl) return []; if(c.mock){ return [ { title:"演示联网结果·国家药监局最新公告动态", url:"https://www.nmpa.gov.cn/xxgk/ggtg/", content:"(离线演示模式模拟)官方公告栏最新动态:涉及经营许可延续、变更的办理提示以当地省级药监部门公告为准。" }, { title:"演示联网结果·省级药监局办事指南", url:"https://example.gov.cn/ylqx", content:"(离线演示模式模拟)各省级局办事指南对材料份数、装订与线上提交渠道有细化要求,办理前请核对当地最新指南。" } ]; } var ctrl = (typeof AbortController !== "undefined") ? new AbortController() : null; var timer = setTimeout(function(){ if(ctrl) ctrl.abort(); }, 15000); try{ var r = await fetch(c.webUrl.replace(/\/+$/,""), { method:"POST", headers:{ "Content-Type":"application/json" }, body: JSON.stringify({ api_key: c.webKey || undefined, query: String(q).slice(0, 300), max_results: 5, search_depth: "basic" }), signal: ctrl ? ctrl.signal : undefined }); if(!r.ok) throw new Error("search " + r.status); var d = await r.json(); var rs = d && d.results ? d.results : []; return rs.slice(0, 5).map(function(x){ return { title: String(x.title||""), url: String(x.url||""), content: String(x.content||x.snippet||"").slice(0, 400) }; }); }catch(e){ return []; } finally{ clearTimeout(timer); } } window.aiWebSearch = aiWebSearch; /* 企业画像(定制生成/口径注入用) */ function aiEntProfile(it){ if(!it) return "(未绑定企业,通用口径)"; var cat3x = !((it.bizType||"TIP3") === "TIP2" || (it.bizType||"TIP3") === "TIP2C"); var imp = !!it.imp, ivd = !!it.ivd, cold = !!it.cold || (it.kinds||"").indexOf("冷藏") >= 0; var consign = !!it.consign; var parts = []; parts.push("企业名称:" + (it.name||"")); parts.push("办理事项:" + (BIZ_NAMES[it.bizType] || it.bizType || "新办三类许可")); parts.push("经营类别:" + (cat3x ? "第二类、第三类" : "仅第二类")); parts.push("经营方式:" + (it.mode||"批零兼营")); parts.push("品种范围:" + (it.kinds||"普通") + (imp ? "(含植入介入)" : "(无植入介入)") + (ivd ? "(含体外诊断试剂)" : "(无体外诊断试剂)") + (cold ? "(含冷藏冷冻)" : "(无冷藏冷冻)")); parts.push("贮存模式:" + (consign ? "全部委托专门提供贮运服务企业(不设库房)" : "自设库房(自贮自运)")); return parts.join(";"); } window.aiEntProfile = aiEntProfile; /* ============ 生成文件一键 AI 审核(内置审核员把关) ============ */ var AUD_LABEL = "", AUD_TEXT = "", AUD_RUNNING = false; async function aiAuditDoc(label, text){ var c = aiCfg(); if(!aiEnabled() && !c.mock){ toast("AI 审核需要先配置接口(🤖 AI 助手页顶部,或勾选离线演示模式)"); return; } AUD_LABEL = String(label || "交付文件"); AUD_TEXT = String(text || "").slice(0, 10000); $("#audTitle").textContent = "📄 " + AUD_LABEL; $("#audPrev").textContent = AUD_TEXT || "(空文件)"; $("#audRes").style.display = "none"; $("#audRes").textContent = ""; $("#audVerdict").textContent = ""; $("#audStop").style.display = "none"; $("#audTip").textContent = "待审核:点击「🔍 开始审核」由审核员逐项把关"; $("#aiAuditModal").classList.add("on"); aiLogPush({at:new Date().toISOString(), q:"文件审核:" + AUD_LABEL, mode:"audit", a:"", src:[]}); } window.aiAuditDoc = aiAuditDoc; $("#audRun").addEventListener("click", async function(){ if(AUD_RUNNING) return; window.__audDone = 0; if(!AUD_TEXT){ $("#audTip").textContent = "文件内容为空,无需审核"; return; } var c = aiCfg(); if(!aiEnabled() && !c.mock){ $("#audTip").textContent = "请先在 AI 助手页配置接口(或勾选离线演示模式)"; return; } AUD_RUNNING = true; $("#audRun").style.display = "none"; $("#audStop").style.display = ""; $("#audTip").textContent = "审核员审核中…"; $("#audRes").style.display = "block"; var hits = aiKbSearch(AUD_LABEL, 6); var ctx = hits.length ? hits.map(function(h, i){ return "【资料" + (i+1) + "】《" + h.doc.title + "》(" + h.doc.docNo + ")\n" + h.text; }).join("\n\n") : "(未检索到直接相关条款,请审核员就不确定处标注\"需人工核对法规\")"; var profile = aiEntProfile(curEnt ? findEnt(curEnt) : null); var msgs = [ {role:"system", content: aiSysReviewer() + "\n\n注意:本次审核对象是一份【交付文件】(申报材料/记录/封面等),不是问答答案;请按同样格式对文件逐项审核。对无法确认的法规细节,明确写\"需人工核对法规原文\",不得臆断。"}, {role:"user", content:"企业画像:" + profile + "\n文件标题:" + AUD_LABEL + "\n相关法规资料:\n" + ctx.slice(0, 4000) + "\n\n待审核文件内容:\n" + AUD_TEXT} ]; try{ var report = await aiChatStream(msgs, function(delta, done){ if(delta != null){ $("#audRes").textContent = delta; } if(done){ AUD_RUNNING = false; $("#audRun").style.display = ""; $("#audStop").style.display = "none"; $("#audTip").textContent = ""; } }); $("#audVerdict").innerHTML = /【审核结论】\s*需修改/.test(report || "") ? '审核结论:需修改(请按【修改建议】完善后重新生成/编辑)' : '审核结论:通过'; var l = aiLog(); var last = l[l.length - 1]; if(last && last.mode === "audit"){ last.a = report || ""; last.src = hits.map(function(h){ return h.doc.docNo; }); try{ localStorage.setItem(aiLogKey(), JSON.stringify(l)); }catch(e){} } window.__audDone = Date.now(); }catch(e){ AUD_RUNNING = false; $("#audRun").style.display = ""; $("#audStop").style.display = "none"; $("#audRes").textContent = "审核调用失败:" + (e && e.message ? e.message : e); $("#audTip").textContent = ""; } }); $("#audStop").addEventListener("click", function(){ if(window.__aiCtrl){ try{ window.__aiCtrl.abort(); }catch(e){} } if(window.__aiIv){ try{ clearInterval(window.__aiIv); window.__aiIv = null; }catch(e){} } AUD_RUNNING = false; $("#audRun").style.display = ""; $("#audStop").style.display = "none"; $("#audTip").textContent = "已停止"; }); $("#audCopy").addEventListener("click", function(){ var txt = $("#audRes").textContent || ""; if(!txt){ return; } if(navigator.clipboard && navigator.clipboard.writeText){ navigator.clipboard.writeText(txt); toast("审核报告已复制"); } }); $("#audExport").addEventListener("click", function(){ var txt = "【AI 审核报告】\n文件:" + AUD_LABEL + "\n时间:" + new Date().toLocaleString() + "\n\n" + ($("#audRes").textContent || "(暂无)"); var blob = new Blob(["\ufeff" + txt], {type:"text/plain;charset=utf-8"}); var a = document.createElement("a"); a.href = URL.createObjectURL(blob); a.download = "AI审核报告_" + new Date().toISOString().slice(0,16).replace(/[:T]/g,"-") + ".txt"; a.click(); setTimeout(function(){ URL.revokeObjectURL(a.href); }, 3000); }); /* 起草员/审核员 系统提示词(底线+灵活+相关性) */ function aiSysBase(){ return "你是医疗器械经营合规智能体的「起草员」。铁律(底线):\n" + "1. 涉及\"应当/不得/必须/时限/条件/程序\"的法规性结论,只能依据用户提供的【法规资料】作答,并标注【依据】文号+条款号、尽量引用原文关键句;资料中没有依据的明确写\"未检索到依据\",禁止编造条款号、文号、时限;\n" + "2. 灵活有界:操作层面(材料清单细节、办理渠道、准备顺序、风险提示)可在底线之上合理展开,标注\"操作建议\";【联网资料】仅作动态补充(官方通知、渠道、流程更新),引用时必须标注来源链接,与法规冲突的以法规为准;\n" + "3. 相关性收敛:先判断该问题与【咨询口径】是否相关;不相关、不适用的内容一律不展开(最多一句话说明不适用即可),答案只覆盖与问题直接相关的要点,不堆砌背景介绍;\n" + "4. 详略得当:直接相关的要点要详细(要素列全、步骤完整),边缘内容从简;\n" + "5. 输出结构:先【答案】(结论+依据,条理清晰),再【建议】(针对该企业/事项的实操建议,标注\"操作建议\"),必要时附【依据】引用清单;简体中文,Markdown 轻量排版。" + ({brief:"\n【本次简答模式】先给一句话结论(含依据条款),至多再列 3 条必要补充,全文不超过 150 字,省略【建议】段。", table:"\n【本次表格模式】主体用 Markdown 表格呈现(列:事项|法规要求|依据条款|本企业要点),表后至多 3 条备注。", checklist:"\n【本次清单模式】输出逐项检查清单:每行「□ 检查项+要点+(依据条款)」,覆盖该问题全部关键点。"}[window.__aiStyle] || "") + "\n6. 追问引导:全部回答结束后另起一段,以【可继续追问】开头,列出 2~3 个该企业场景下最值得继续确认的问题,每行一个。"; } function aiSysReviewer(){ return "你是本智能体的「审核员」,职责是对起草员输出逐项审核,严谨、严格、宁严勿松。审核五项:\n" + "① 法规底线:引用文号/条款号是否准确、有无编造或与原文冲突、是否遗漏\"未检索到依据\";\n" + "② 相关性:是否存在与本题/该企业口径无关的冗余内容,是否需要删减;\n" + "③ 完整性:直接相关的关键要素/条款/步骤是否缺漏,需要补充什么;\n" + "④ 详略:该详细的地方是否足够详细(要素列全),可以补充哪些细节;\n" + "⑤ 企业条件适配:内容是否与企业的办理事项/经营类别/经营方式/品种范围/贮存模式匹配,不适用的表述是否已去除。\n" + "输出格式固定为:\n【审核结论】通过 或 需修改\n【逐项审核】按①~⑤逐项给结论(通过/问题+说明)\n【修改建议】仅当结论为\"需修改\"时列出逐条可执行修改建议(最多6条,每条指明位置与改法)。不要输出其他内容。"; } function aiMockReply(messages, opts){ var q = String(((messages||[])[messages.length-1]||{}).content || ""); var sys0 = String((messages||[])[0] && (messages[0].content || "")); if(opts && opts.json){ var o = {}; if(/统一社会信用代码/.test(q) || /信用代码/.test(q)) o.uscc = {label:"统一社会信用代码", grp:"证照", values:["91411000MA47DEMO01"]}; o.name = {label:"企业名称", grp:"证照", values:["河南演示医疗科技有限公司"]}; if(/许可|备案/.test(q)) o.licno = {label:"许可证/备案编号", grp:"证照", values:["豫药监械经营许20260088号"]}; return JSON.stringify(o); } /* ===== 审核员环节 ===== */ if(/你是本智能体的「审核员」/.test(sys0)){ var _qm2 = String(q||"").match(/问题:([^\n]+)/); var _qq2 = _qm2 ? _qm2[1] : String(q||""); if(/延续申请|90个工作日/.test(_qq2)) return "【审核结论】通过\n\n【逐项审核】\n① 法规底线:通过——引用文号与条款号准确(54 号令第十六条);\n② 相关性:通过——内容与延续口径一致,无冗余;\n③ 完整性:通过——申请时限、逾期受理、视为准予延续等要点齐全;\n④ 详略:通过——直接相关要素完整;\n⑤ 企业条件适配:通过。\n\n【修改建议】(结论为通过,无需改动。)"; return "【审核结论】需修改\n\n【逐项审核】\n① 法规底线:通过(引用文号与条款号准确);\n② 相关性:需修改——第2点存在与本企业口径无关的冗余表述,建议删减;\n③ 完整性:需修改——建议补充记录保存期限的完整情形(有有效期/无有效期两类);\n④ 详略:通过——直接相关要素已列全;\n⑤ 企业条件适配:通过——与当前企业条件一致。\n\n【修改建议】\n1. 删除与本企业不相关的冗余内容(第2点);\n2. 在记录保存期限处补充\"无有效期的不少于5年\"情形(依据2024 版 GSP第二十三条)。"; } /* ===== 修订环节:按审核意见产出定稿(与初稿可区分) ===== */ if(/你是修订环节/.test(sys0)){ var base = aiMockDraft(q); return base + "\n\n---\n\n✅ **(定稿·已按审核意见修订)**\n1. 已删除与本企业口径无关的冗余内容;\n2. 已补充:无有效期的,进货查验记录、销售记录保存期限不得少于5年(依据2024 版 GSP第二十三条);\n3. 其余内容经审核无误,保持原样。"; } return aiMockDraft(q); } /* 起草员 mock:按口径给差异化示例(二类备案/延续/质量负责人/默认) */ function aiMockDraft(q){ var _qm = String(q||"").match(/问题:([^\n]+)/); var _qq = _qm ? _qm[1] : String(q||""); var isGen = /定制生成|制度条款段|岗位职责|培训计划要点|自查报告要点|汇编说明页/.test(_qq); if(isGen) return "# 【定制生成·初稿】\n\n(离线演示模式·智能体流程演示)\n\n按当前企业条件(口径见问题区)生成体系文件段落:\n\n**第一条(目的)**:为规范本企业医疗器械经营质量管理,依据《医疗器械监督管理条例》(国务院令第739号)与《医疗器械经营质量管理规范》(2024年7月1日起施行),结合本企业经营范围与实际条件,制定本制度。【依据:739号条例;2024 版 GSP】\n\n**第二条(适用范围)**:适用于本企业(按当前口径:经营方式、品种范围、贮存模式)经营全过程相关岗位与环节。\n\n**第三条(职责)**:企业负责人全面负责;质量负责人组织执行;质量管理人员按岗位分工落实。\n\n(演示模式说明:配置真实 Key 后,将按知识库检索到的原文条款+本企业条件生成完整定制段落,并经审核员审核修订后给出定稿。)"; if(/延续/.test(_qq)) return "# 【答案】\n\n(离线演示模式·延续口径)\n\n1. **延续申请时限**:应当在《医疗器械经营许可证》有效期届满前90个工作日至30个工作日期间提出延续申请;逾期未提出申请的,不再受理【依据:54 号令第十六条】;\n2. **视为准予延续**:受理后逾期未作出决定的,视为准予延续【依据:54 号令第十六条】;\n3. **材料**:延续申请材料按54 号令第十条(第二类按第二十一条)提交,并附原许可证【操作建议:以当地受理窗口最新口径为准】。\n\n# 【建议】\n\n- 操作建议:提前90个工作日启动自查与材料准备,避免错过窗口;\n- 建议在 DeepSeek 平台为该 Key 设置消费额度上限。"; if(/备案|第二类/.test(_qq)) return "# 【答案】\n\n(离线演示模式·二类备案口径)\n\n1. **二类备案材料**:提交54 号令第十条规定的资料,其中第(七)项信息管理系统基本情况除外【依据:54 号令第二十一条】;\n2. **备案凭证**:备案完成后获取《第二类医疗器械经营备案凭证》;\n3. **备案变更**:经营场所、经营方式、经营范围、库房地址等备案事项发生变化的,应当及时办理备案变更【依据:54 号令第二十四条】。\n\n# 【建议】\n\n- 操作建议:备案后3个月内可能被现场检查,建议同步完成体系文件与记录准备;\n- 建议在 DeepSeek 平台为该 Key 设置消费额度上限。"; if(/质量负责人/.test(_qq)) return "# 【答案】\n\n(离线演示模式·人员口径)\n\n1. **三类经营企业质量负责人**:医疗器械相关专业大专及以上学历或中级及以上专业技术职称,且3年及以上医疗器械经营质量管理工作经历【依据:2024 版 GSP第二十六条】;\n2. **二类经营企业质量负责人**:熟悉医疗器械监督管理法律法规和所经营医疗器械的专业知识,符合有关法律法规规定的资格要求【依据:2024 版 GSP第四章】;\n3. 质量负责人应当在职在岗并履行岗位职责【依据:2024 版 GSP第四章】。\n\n# 【建议】\n\n- 操作建议:任命、调整均留存记录归档(JL-001),供现场核查出示;\n- 建议在 DeepSeek 平台为该 Key 设置消费额度上限。"; return "# 【答案】\n\n(离线演示模式)按知识库口径演示作答:\n\n1. **二类备案材料**:提交54 号令第十条规定资料,其中第(七)项信息管理系统基本情况除外【依据:54 号令第二十一条】;\n2. **延续申请**:应在有效期届满前90个工作日至30个工作日期间提出,逾期不再受理;逾期未作出决定的视为准予延续【依据:54 号令第十六条】;\n3. **三类质量负责人**:相关专业大专及以上学历或中级及以上职称,且3年以上质量管理工作经历【依据:2024 版 GSP第二十六条】。\n\n# 【建议】\n\n- 操作建议:配置真实 Key 后,将按您的问题从 6 部官方原文检索作答并给出原文片段;\n- 建议在 DeepSeek 平台为该 Key 设置消费额度上限。"; } /* 知识库分块(条款首段加权) */ /* Markdown 轻渲染:标题/列表/粗体(先转义再转换,防注入) */ function mdLite(txt){ var s = esc(String(txt||"")); var lines = s.split("\n"); var out = [], listOpen = false; function closeL(){ if(listOpen){ out.push(""); listOpen = false; } } lines.forEach(function(l){ if(/^####\s/.test(l)){ closeL(); out.push('

' + l.replace(/^####\s/, "") + '

'); } else if(/^###\s/.test(l)){ closeL(); out.push('

' + l.replace(/^###\s/, "") + '

'); } else if(/^##\s/.test(l)){ closeL(); out.push('

' + l.replace(/^##\s/, "") + '

'); } else if(/^#\s/.test(l)){ closeL(); out.push('

' + l.replace(/^#\s/, "") + '

'); } else if(/^\s*[-•]\s+/.test(l)){ if(!listOpen){ out.push('