<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>负责人映射管理</title>
<style>
  *{box-sizing:border-box;margin:0;padding:0}
  body{font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;background:#f5f5f7;color:#1d1d1f;padding:32px 24px}
  h1{font-size:22px;font-weight:600;margin-bottom:24px}
  .card{background:#fff;border-radius:12px;padding:24px;box-shadow:0 1px 4px rgba(0,0,0,.08);margin-bottom:24px}
  .card h2{font-size:15px;font-weight:600;margin-bottom:16px;color:#444}
  #file-name{font-size:13px;color:#0071e3}
  .btn{display:inline-block;padding:10px 24px;background:#0071e3;color:#fff;border:none;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;transition:background .2s}
  .btn:hover{background:#0077ed}
  .btn:disabled{background:#b0b0b5;cursor:not-allowed}
  #msg{margin-top:12px;font-size:13px;min-height:18px}
  #msg.ok{color:#1a7f37}
  #msg.err{color:#cf222e}
  .tip{font-size:12px;color:#888;margin-top:8px}
  table{width:100%;border-collapse:collapse;font-size:13px}
  th{background:#f5f5f7;padding:8px 10px;text-align:left;font-weight:600;border-bottom:1px solid #e5e5ea}
  td{padding:8px 10px;border-bottom:1px solid #f0f0f0;vertical-align:top;word-break:break-all}
  tr:last-child td{border-bottom:none}
  .count{font-size:12px;color:#888;margin-bottom:10px}
  .page-btn{padding:4px 10px;border:1px solid #d1d1d6;border-radius:6px;background:#fff;font-size:12px;cursor:pointer;color:#444;transition:all .15s}
  .page-btn:hover:not(:disabled){border-color:#0071e3;color:#0071e3}
  .page-btn:disabled{color:#b0b0b5;cursor:not-allowed}
  .page-num{display:inline-block;padding:4px 8px;border-radius:6px;font-size:12px;cursor:pointer;color:#444;border:1px solid transparent}
  .page-num:hover{border-color:#d1d1d6}
  .page-num.active{background:#0071e3;color:#fff;border-color:#0071e3}
  .tab-bar{display:flex;gap:0;border-bottom:1px solid #e5e5ea;margin-bottom:16px}
  .tab{padding:8px 18px;font-size:13px;font-weight:500;color:#888;cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:all .15s}
  .tab:hover{color:#444}
  .tab.active{color:#0071e3;border-bottom-color:#0071e3}
  .tab-panel{display:none}
  .tab-panel.active{display:block}
  .row-btn{padding:2px 8px;font-size:11px;border-radius:4px;border:1px solid #d1d1d6;background:#fff;cursor:pointer;transition:all .15s}
  .edit-btn:hover{border-color:#0071e3;color:#0071e3}
  .del-btn{color:#cf222e;border-color:#f5c6cb;padding:2px 6px}
  .del-btn:hover{background:#cf222e;color:#fff;border-color:#cf222e}
  .clear-btn{font-size:12px;padding:4px 10px;border-radius:6px;border:1px solid #f5c6cb;background:#fff;color:#cf222e;cursor:pointer;transition:all .15s;white-space:nowrap}
  .clear-btn:hover{background:#cf222e;color:#fff;border-color:#cf222e}
  .save-btn{border-color:#0071e3;color:#0071e3}
  .save-btn:hover{background:#0071e3;color:#fff}
  tr.editing td{background:#f0f7ff}
  #cfg-msg.ok{color:#1a7f37}
  #cfg-msg.err{color:#cf222e}
  .current-val{font-size:12px;color:#888;margin-top:4px}
  .cfg-grid{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start}
  .cfg-col{}
  .cfg-field{margin-bottom:10px}
  .cfg-field label{display:block;font-size:12px;color:#888;margin-bottom:4px}
  .cfg-field input{width:100%;padding:7px 10px;border:1px solid #d1d1d6;border-radius:8px;font-size:13px;outline:none}
  .cfg-field input:focus{border-color:#0071e3}
  .cfg-current{font-size:12px;color:#888;margin-top:3px;word-break:break-all}
  .cfg-actions{display:flex;align-items:center;gap:12px;margin-top:4px}
  .btn-sm{padding:7px 18px;font-size:13px;background:#0071e3;color:#fff;border:none;border-radius:7px;cursor:pointer;transition:background .2s}
  .btn-sm:hover{background:#0077ed}
</style>
</head>
<body>
<h1>负责人映射管理</h1>

<div class="card">
  <h2>组织架构配置</h2>
  <form id="cfg-form">
    <div class="cfg-grid">
      <div class="cfg-col">
        <div class="cfg-field">
          <label>系统链接</label>
          <input type="url" id="cfg-url" placeholder="https://sellerinventory.yswg.com.cn/" value="https://sellerinventory.yswg.com.cn/">
          <div class="cfg-current"><a href="https://sellerinventory.yswg.com.cn/" target="_blank" style="color:#0071e3">https://sellerinventory.yswg.com.cn/</a></div>
        </div>
      </div>
      <div class="cfg-col">
        <div class="cfg-field">
          <label>查找路径</label>
          <input type="text" id="cfg-path" placeholder="inventory > 其他 > 组织架构" value="inventory > 其他 > 组织架构">
          <div class="cfg-current">inventory > 其他 > 组织架构</div>
        </div>
      </div>
    </div>
    <div class="cfg-actions">
      <button type="submit" class="btn-sm">保存</button>
      <span id="cfg-msg" style="font-size:13px"></span>
      <span class="tip" style="margin-top:0">命中负责人时自动附上此链接和路径</span>
    </div>
  </form>
</div>

<div class="card">
  <h2>上传数据（Excel .xlsx）</h2>
  <form id="upload-form" style="display:flex;align-items:center;gap:12px;flex-wrap:wrap">
    <label for="file-input" style="display:inline-flex;align-items:center;gap:8px;padding:7px 14px;border:1px solid #d1d1d6;border-radius:8px;cursor:pointer;font-size:13px;color:#444;background:#fff;transition:border-color .2s" onmouseover="this.style.borderColor='#0071e3'" onmouseout="this.style.borderColor='#d1d1d6'">
      📂 选择文件
      <input type="file" id="file-input" accept=".xlsx" style="display:none">
    </label>
    <span id="file-name" style="font-size:13px;color:#0071e3"></span>
    <button type="submit" class="btn-sm" id="submit-btn" disabled>上传并替换</button>
    <span id="msg" style="font-size:13px"></span>
  </form>
  <div class="tip" style="margin-top:8px">自动识别表头类型：含「问题类型/负责人」字段的工作表导入为负责人映射，其余导入为知识文档库；支持中英文表头，多工作表均会导入</div>
</div>

<div class="card">
  <div style="display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px;margin-bottom:0">
    <div class="tab-bar" style="margin-bottom:0;border-bottom:none;flex:1">
      <span class="tab active" onclick="switchTab('docs',this)">知识文档库 <span style="color:#b0b0b5;font-weight:400">(62)</span></span>
      <span class="tab" onclick="switchTab('owners',this)">负责人映射 <span style="color:#b0b0b5;font-weight:400">(2)</span></span>
    </div>
    <button class="clear-btn" onclick="clearAll()">清空全部</button>
    <div style="display:flex;align-items:center;gap:8px;font-size:13px" id="pagination-bar">
      <span id="page-info" style="color:#888"></span>
      <button class="page-btn" id="btn-prev" onclick="changePage(-1)">‹ 上一页</button>
      <span id="page-nums"></span>
      <button class="page-btn" id="btn-next" onclick="changePage(1)">下一页 ›</button>
    </div>
  </div>
  <div style="border-bottom:1px solid #e5e5ea;margin-bottom:16px"></div>

  <div class="tab-panel active" id="panel-docs">
    
    <div style="overflow-x:auto">
    <table id="docs-table">
      <thead><tr>
        <th>文档名称</th><th>分类</th><th>内容简述</th><th>关键词</th><th>链接</th><th style="width:90px">操作</th>
      </tr></thead>
      <tbody id="docs-tbody"></tbody>
    </table>
    </div>
  </div>

  <div class="tab-panel" id="panel-owners">
    
    <div style="overflow-x:auto">
    <table id="owners-table">
      <thead><tr>
        <th>问题类型</th><th>关键词</th><th>部门</th><th>组别</th><th>负责人</th><th>备用负责人</th><th>处理路径</th><th style="width:90px">操作</th>
      </tr></thead>
      <tbody id="owners-tbody"></tbody>
    </table>
    </div>
  </div>
</div>

<script>
const input = document.getElementById('file-input');
const nameEl = document.getElementById('file-name');
const btn = document.getElementById('submit-btn');
const msg = document.getElementById('msg');

// ── 分页 & Tab ────────────────────────────────────────────
const ALL_DOCS = [{"title":"A+视频申请标准26年3月份.xlsx","category":"公司规定","summary":"A+、精细视频、AI视频申请要求","tags":["A+","精细视频","AI视频"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4Hkn63NNAb4AlQZwACQ"},{"title":"Inventory+广告系统+前台培训(2).doc","category":"公司规定","summary":"Inventory使用说明，广告系统使用说明，前台培训","tags":["inventory","inv","广告系统","亚马逊前台"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4RScI05UAb4AlQZwACQ"},{"title":"变体资料修改 洪雨欣.docx","category":"公司规定","summary":"变体概念，变体资料修改流程和规定","tags":["变体"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA46X1BQP1Ab4AlQZwACQ"},{"title":"关于变体 王雯雯 张语言.docx","category":"公司规定","summary":"变体概念，变体资料修改流程和规定","tags":["变体"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4e0dK0c5Ab4AlQZwACQ"},{"title":"新变老变优化 黄萍.docx","category":"公司规定","summary":"变体概念，变体资料修改流程和规定","tags":["变体"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4qH40kgyAb4AlQZwACQ"},{"title":"变体共图的类型和常规处理方法.docx","category":"公司规定","summary":"变体共图类型和常规处理方法","tags":["共图"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4BzfHnWdAb4AlQZwACQ"},{"title":"儿童产品审核细则梳理.doc","category":"公司规定","summary":"儿童产品分类，儿童词处理方法，案例","tags":["儿童产品"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4rU9FbpLAb4AlQZwACQ"},{"title":"儿童词示例&处理方法(2).xlsx","category":"公司规定","summary":"儿童产品分类，儿童词处理方法，案例","tags":["儿童产品"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4F1KZW36Ab4AlQZwACQ"},{"title":"公司内部网站.xlsx","category":"公司规定","summary":"工作常用网站","tags":["工作网站"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4dlURk6GAb4AlQZwACQ"},{"title":"外部常用网站.xlsx","category":"公司规定","summary":"工作常用网站","tags":["工作网站"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA44HEuaLOAb4AlQZwACQ"},{"title":"化妆品判断标准梳理.docx","category":"公司规定","summary":"化妆品判断标准","tags":["化妆品"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4nMAxPkuAb4AlQZwACQ"},{"title":"inventory系统限制词的类型以及限制逻辑--2024.1.29.pdf","category":"公司规定","summary":"敏感词，律所维权词，品牌警报词，系统限制词类型","tags":["敏感词","违禁词"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4V36LQ79Ab4AlQZwACQ"},{"title":"清仓服务商培训销售部.pdf","category":"公司规定","summary":"清仓方法","tags":["清仓"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4c19CgqSAb4AlQZwACQ"},{"title":"商标查询标准化.docx","category":"公司规定","summary":"商标查询，商标概念，商标侵权案例，敏感词","tags":["商标"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA49zaSw4EAb4AlQZwACQ"},{"title":"商标查询工具--2024.1.25.pdf","category":"公司规定","summary":"商标查询，商标概念，商标侵权案例，敏感词","tags":["商标"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4EkC7NWAAb4AlQZwACQ"},{"title":"商标的基本理论--2024.1.19.pdf","category":"公司规定","summary":"商标查询，商标概念，商标侵权案例，敏感词","tags":["商标"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4WrUSpOqAb4AlQZwACQ"},{"title":"商标与敏感词(2).docx","category":"公司规定","summary":"商标查询，商标概念，商标侵权案例，敏感词","tags":["商标"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4Hl1ye3vAb4AlQZwACQ"},{"title":"类别选择&装箱数.docx","category":"公司规定","summary":"审核列表填写流程、注意事项","tags":["审核列表","类别选择","装箱数"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4M0FKR8UAb4AlQZwACQ"},{"title":"审核列表的填写步骤.xlsx","category":"公司规定","summary":"审核列表填写流程、注意事项","tags":["审核列表","类别选择","装箱数"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4osJgpT5Ab4AlQZwACQ"},{"title":"食品判断标准梳理.docx","category":"公司规定","summary":"人用食品、动物用食品判断标准","tags":["食品"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4fIEVlpeAb4AlQZwACQ"},{"title":"销售部门系统功能优化 & 业务通知汇总表","category":"公司规定","summary":"销售部门系统功能优化情况","tags":["系统优化"],"link":"https://doc.weixin.qq.com/sheet/e3_AT0AtAZGAPMCNfwq5VkJtQu2oyuvJ?scode=AGgAIQe6AA4LW6QG14ASwAwAYOAP8&tab=BB08J2"},{"title":"《红人营销-亚马逊Youtube红人的基础介绍》.pdf","category":"公司规定","summary":"红人营销概念，规定，申请流程","tags":["红人","站外营销"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4Ia6tP7aAb4AlQZwACQ"},{"title":"红人营销系统申请流程说明.docx","category":"公司规定","summary":"红人营销概念，规定，申请流程","tags":["红人","站外营销"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA41qsAmXtAb4AlQZwACQ"},{"title":"新品打造全流程.docx","category":"工作经验","summary":"产品打造流程","tags":["新品打造","产品打造流程","产品打造"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4FwTzH54Ab4AlQZwACQ"},{"title":"产品打造SOP（全流程）.pdf","category":"工作经验","summary":"产品打造流程","tags":["新品打造","产品打造流程","产品打造"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA45TyFxplAb4AlQZwACQ"},{"title":"图需制作与AI运用.docx","category":"工作经验","summary":"图需制作流程、注意事项、使用工具","tags":["图需","制图"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4bzHowMyAb4AlQZwACQ"},{"title":"图需制作（培训文件）.pdf","category":"工作经验","summary":"图需制作流程、注意事项、使用工具","tags":["图需","制图"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4Uzo8jtRAb4AlQZwACQ"},{"title":"市场分析.docx","category":"工作经验","summary":"市场分析流程、方法、注意事项","tags":["市场分析"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4yZa81I5Ab4AlQZwACQ"},{"title":"老品维护技巧--裘艳菲.docx 3.25.docx","category":"工作经验","summary":"老品概念、维护流程、维护方法","tags":["老品"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4b7keUtfAb4AlQZwACQ"},{"title":"老品维护方法和流程.docx","category":"工作经验","summary":"老品概念、维护流程、维护方法","tags":["老品"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4ufWYCUeAb4AlQZwACQ"},{"title":"关键词精准筛选与工具应用.docx","category":"工作经验","summary":"关键词筛选、判断关键词属性、关键词反查工具","tags":["关键词"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4Prz4GyOAb4AlQZwACQ"},{"title":"产品客户需求分析.docx","category":"工作经验","summary":"产品客户需求分析方法、流程","tags":["客户","需求分析"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4GDRjsQVAb4AlQZwACQ"},{"title":"Listing分析与优化.docx","category":"工作经验","summary":"listing分析、优化","tags":["listing","文案"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA47y0qQ0sAb4AlQZwACQ"},{"title":"多变体产品维护和打造方法.docx","category":"工作经验","summary":"多变体打造方法、维护方法、打造流程","tags":["多变体"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4iboEwWwAb4AlQZwACQ"},{"title":"新品多变体打造流程.docx","category":"工作经验","summary":"多变体打造方法、维护方法、打造流程","tags":["多变体"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA468b49QuAb4AlQZwACQ"},{"title":"擦边词广告打法","category":"工作经验","summary":"广告词创新打法，特殊词打造方法","tags":["广告词","关键词","商标词广告","符号广告词"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4zAc5IdRAb4AlQZwACQ"},{"title":"适用于商标词","category":"工作经验","summary":"广告词创新打法，特殊词打造方法","tags":["广告词","关键词","商标词广告","符号广告词"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4zAc5IdRAb4AlQZwACQ"},{"title":"敏感词","category":"工作经验","summary":"广告词创新打法，特殊词打造方法","tags":["广告词","关键词","商标词广告","符号广告词"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4zAc5IdRAb4AlQZwACQ"},{"title":"违规词是产品核心出单词的情况.docx","category":"工作经验","summary":"广告词创新打法，特殊词打造方法","tags":["广告词","关键词","商标词广告","符号广告词"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4zAc5IdRAb4AlQZwACQ"},{"title":"广告关键词符号创新打法.docx","category":"工作经验","summary":"广告词创新打法，特殊词打造方法","tags":["广告词","关键词","商标词广告","符号广告词"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4AKwJsc1Ab4AlQZwACQ"},{"title":"高CPC产品广告打法以及拓宽流量.docx","category":"工作经验","summary":"广告维护、打造、拓流技巧","tags":["广告","拓流"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4desm2nWAb4AlQZwACQ"},{"title":"如何利用旺季大促打出翻盘-叶世安（外部资料","category":"工作经验","summary":"广告维护、打造、拓流技巧","tags":["广告","拓流"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA489FEr2QAb4AlQZwACQ"},{"title":"注意鉴别适用性）.pdf","category":"工作经验","summary":"广告维护、打造、拓流技巧","tags":["广告","拓流"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA489FEr2QAb4AlQZwACQ"},{"title":"商品定投（外部资料","category":"工作经验","summary":"广告维护、打造、拓流技巧","tags":["广告","拓流"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4QsPazR0Ab4AlQZwACQ"},{"title":"注意鉴别适用性）.pdf","category":"工作经验","summary":"广告维护、打造、拓流技巧","tags":["广告","拓流"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4QsPazR0Ab4AlQZwACQ"},{"title":"生命周期流量与广告高阶操盘策略（外部资料","category":"工作经验","summary":"广告维护、打造、拓流技巧","tags":["广告","拓流"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4aDMPyUQAb4AlQZwACQ"},{"title":"注意鉴别适用性）.pdf","category":"工作经验","summary":"广告维护、打造、拓流技巧","tags":["广告","拓流"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4aDMPyUQAb4AlQZwACQ"},{"title":"亚马逊旺季广告打法-吴凡（外部资料","category":"工作经验","summary":"广告维护、打造、拓流技巧","tags":["广告","拓流"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4aN3j9tkAb4AlQZwACQ"},{"title":"注意鉴别适用性）.pdf","category":"工作经验","summary":"广告维护、打造、拓流技巧","tags":["广告","拓流"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4aN3j9tkAb4AlQZwACQ"},{"title":"如何高效推广季节性产品-Lenry（外部资料","category":"工作经验","summary":"节气/季节性产品打造方法、节气细分风格","tags":["节气","季节性"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4NXA1x8IAb4AlQZwACQ"},{"title":"注意鉴别适用性）.pdf","category":"工作经验","summary":"节气/季节性产品打造方法、节气细分风格","tags":["节气","季节性"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4NXA1x8IAb4AlQZwACQ"},{"title":"短节气爆发礼物产品打造节奏.pdf","category":"工作经验","summary":"节气/季节性产品打造方法、节气细分风格","tags":["节气","季节性"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4nALh0kNAb4AlQZwACQ"},{"title":"圣诞细分风格.xlsx","category":"工作经验","summary":"节气/季节性产品打造方法、节气细分风格","tags":["节气","季节性"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4sNVxYntAb4AlQZwACQ"},{"title":"沟通表达技能培养.pdf","category":"工作经验","summary":"沟通技巧、客户关系维护","tags":["沟通技巧","开发沟通"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4BiWsG7pAb4AlQZwACQ"},{"title":"推荐产品思路分享.docx","category":"工作经验","summary":"产品拓展方法","tags":["产品推荐","产品拓展"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA48ZI9bLPAb4AlQZwACQ"},{"title":"新老品拓展思路.xlsx","category":"工作经验","summary":"产品拓展方法","tags":["产品推荐","产品拓展"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4pR2NgL7Ab4AlQZwACQ"},{"title":"高效时间管理指南.pdf","category":"工作经验","summary":"时间管理，工作效率提升方法","tags":["工作效率","时间分配","时间","时间管理"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4Ju7vb6CAb4AlQZwACQ"},{"title":"新人带教流程与方法手册.docx","category":"工作经验","summary":"常规精品新人带教指南","tags":["带教","新人","导师"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4EOnax0qAb4AlQZwACQ"},{"title":"亚马逊算法汇总与逻辑说明.docx","category":"工作经验","summary":"亚马逊算法汇总、逻辑","tags":["算法","A10","cosmo","rufus","价值打发"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4N8IKhnhAb4AlQZwACQ"},{"title":"价值打法纯净版（外部资料","category":"工作经验","summary":"亚马逊算法汇总、逻辑","tags":["算法","A10","cosmo","rufus","价值打发"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4sJWjnrqAb4AlQZwACQ"},{"title":"注意鉴别适用性）.pdf","category":"工作经验","summary":"亚马逊算法汇总、逻辑","tags":["算法","A10","cosmo","rufus","价值打发"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4sJWjnrqAb4AlQZwACQ"},{"title":"亚马逊促销工具叠加逻辑.pdf","category":"工作经验","summary":"折扣、促销使用说明","tags":["折扣","促销","coupon","会员折扣","prime","Promotion"],"link":"https://drive.weixin.qq.com/s?k=AGgAIQe6AA4kJq9jwtAb4AlQZwACQ"}];
const ALL_OWNERS = [{"issue_type":"购物车丢失","keyword_rules":["购物车丢失","购物车不见","车丢了"],"dept":"英文编辑","group_name":"账户管理组","owner_name":"段文丽","lookup_path":"inventory -> Amazon -> SKU对应英文编辑；企业微信搜索账号 -> 对应英文编辑","backup_owner":"阳宁","updated_at":"2026-04-20"},{"issue_type":"Hou账号账管查询","keyword_rules":["Hou账号","HOU账号","账管是谁","账号账管"],"dept":"账户C4组","group_name":"账户管理组","owner_name":"段文丽","lookup_path":"企业微信 -> 搜索账号HOU -> 查看对应账管","backup_owner":"阳宁","updated_at":"2026-04-20"}];
const PAGE_SIZE = 15;
var currentPage = 1;
var currentTab = 'docs';

function esc(s) {
  return String(s||'').split('&').join('&amp;').split('<').join('&lt;').split('>').join('&gt;').split('"').join('&quot;');
}

function renderPagination(total) {
  var totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE));
  currentPage = Math.min(Math.max(1, currentPage), totalPages);
  document.getElementById('page-info').textContent = '第 ' + currentPage + ' / ' + totalPages + ' 页';
  document.getElementById('btn-prev').disabled = currentPage <= 1;
  document.getElementById('btn-next').disabled = currentPage >= totalPages;
  var numsEl = document.getElementById('page-nums');
  var nums = '';
  for (var i = 1; i <= totalPages; i++) {
    if (totalPages <= 7 || i === 1 || i === totalPages || Math.abs(i - currentPage) <= 1) {
      nums += '<span class="page-num' + (i === currentPage ? ' active' : '') + '" onclick="renderPage(' + i + ')">' + i + '</span>';
    } else if (Math.abs(i - currentPage) === 2) {
      nums += '<span style="font-size:12px;color:#888;padding:0 2px">…</span>';
    }
  }
  numsEl.innerHTML = nums;
}

function actionBtns(type, realIdx) {
  return '<td style="white-space:nowrap">'
    + '<button class="row-btn edit-btn" title="编辑" onclick="startEdit(this,\'' + type + '\',' + realIdx + ')">'
    + '<svg width="13" height="13" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8"><path d="M11.5 2.5l2 2L5 13H3v-2L11.5 2.5z"/></svg>'
    + '</button> '
    + '<button class="row-btn del-btn" title="删除" onclick="delRow(\'' + type + '\',' + realIdx + ')">'
    + '<svg width="13" height="13" viewBox="0 0 16 16" fill="none" stroke="currentColor" stroke-width="1.8"><polyline points="3,5 13,5"/><path d="M6 5V3h4v2M5 5l1 9h4l1-9"/></svg>'
    + '</button>'
    + '</td>';
}

function renderPage(page) {
  currentPage = page;
  if (currentTab === 'docs') {
    var tbody = document.getElementById('docs-tbody');
    if (!tbody) return;
    var slice = ALL_DOCS.slice((currentPage-1)*PAGE_SIZE, currentPage*PAGE_SIZE);
    tbody.innerHTML = slice.map(function(d, i) {
      var realIdx = (currentPage-1)*PAGE_SIZE + i;
      var link = d.link ? '<a href="' + esc(d.link) + '" target="_blank" style="color:#0071e3;word-break:break-all">' + esc(d.link) + '</a>' : '';
      var tags = Array.isArray(d.tags) ? d.tags.join('、') : '';
      return '<tr data-idx="' + realIdx + '" data-type="docs">'
        + '<td>' + esc(d.title) + '</td><td>' + esc(d.category) + '</td><td>' + esc(d.summary) + '</td>'
        + '<td>' + esc(tags) + '</td><td>' + link + '</td>'
        + actionBtns('docs', realIdx) + '</tr>';
    }).join('');
    renderPagination(ALL_DOCS.length);
  } else {
    var tbody = document.getElementById('owners-tbody');
    if (!tbody) return;
    var slice = ALL_OWNERS.slice((currentPage-1)*PAGE_SIZE, currentPage*PAGE_SIZE);
    tbody.innerHTML = slice.map(function(r, i) {
      var realIdx = (currentPage-1)*PAGE_SIZE + i;
      var kw = Array.isArray(r.keyword_rules) ? r.keyword_rules.join('、') : '';
      return '<tr data-idx="' + realIdx + '" data-type="owners">'
        + '<td>' + esc(r.issue_type) + '</td><td>' + esc(kw) + '</td><td>' + esc(r.dept) + '</td>'
        + '<td>' + esc(r.group_name) + '</td><td>' + esc(r.owner_name) + '</td>'
        + '<td>' + esc(r.backup_owner) + '</td><td>' + esc(r.lookup_path) + '</td>'
        + actionBtns('owners', realIdx) + '</tr>';
    }).join('');
    renderPagination(ALL_OWNERS.length);
  }
}

function changePage(delta) { renderPage(currentPage + delta); }

function switchTab(tab, el) {
  currentTab = tab;
  currentPage = 1;
  document.querySelectorAll('.tab').forEach(function(t){ t.classList.remove('active'); });
  el.classList.add('active');
  document.querySelectorAll('.tab-panel').forEach(function(p){ p.classList.remove('active'); });
  document.getElementById('panel-' + tab).classList.add('active');
  renderPage(1);
}

// ── 行内编辑 ──────────────────────────────────────────────
var DOC_FIELDS  = ['title','category','summary','tags','link'];
var OWNER_FIELDS = ['issue_type','keyword_rules','dept','group_name','owner_name','backup_owner','lookup_path'];

function startEdit(btn, type, idx) {
  var tr = btn.closest('tr');
  if (tr.classList.contains('editing')) return;
  tr.classList.add('editing');
  var fields = type === 'docs' ? DOC_FIELDS : OWNER_FIELDS;
  var data = type === 'docs' ? ALL_DOCS[idx] : ALL_OWNERS[idx];
  var tds = tr.querySelectorAll('td');
  fields.forEach(function(f, i) {
    var val = Array.isArray(data[f]) ? data[f].join('、') : (data[f] || '');
    tds[i].innerHTML = '<input style="width:100%;padding:3px 6px;border:1px solid #0071e3;border-radius:4px;font-size:12px" value="' + esc(val) + '">';
  });
  var lastTd = tds[tds.length - 1];
  lastTd.innerHTML = '<button class="row-btn save-btn" onclick="saveEdit(this,\'' + type + '\',' + idx + ')">保存</button> '
    + '<button class="row-btn" onclick="cancelEdit(this)">取消</button>';
}

function cancelEdit(btn) {
  renderPage(currentPage);
}

async function saveEdit(btn, type, idx) {
  var tr = btn.closest('tr');
  var fields = type === 'docs' ? DOC_FIELDS : OWNER_FIELDS;
  var inputs = tr.querySelectorAll('input');
  var patch = {};
  fields.forEach(function(f, i) {
    var val = inputs[i] ? inputs[i].value.trim() : '';
    if (f === 'tags' || f === 'keyword_rules') {
      patch[f] = val.split(/[，,、；;\n]+/).map(function(s){ return s.trim(); }).filter(Boolean);
    } else {
      patch[f] = val;
    }
  });
  try {
    var r = await fetch('/admin/' + type + '/' + idx, {
      method: 'PUT',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(patch)
    });
    var j = await r.json();
    if (j.code === 0) {
      if (type === 'docs') ALL_DOCS[idx] = Object.assign(ALL_DOCS[idx], patch);
      else ALL_OWNERS[idx] = Object.assign(ALL_OWNERS[idx], patch);
      renderPage(currentPage);
    } else {
      alert('保存失败：' + j.message);
    }
  } catch(e) { alert('网络错误：' + e.message); }
}

async function delRow(type, idx) {
  if (!confirm('确认删除这条记录？')) return;
  try {
    var r = await fetch('/admin/' + type + '/' + idx, { method: 'DELETE' });
    var j = await r.json();
    if (j.code === 0) {
      if (type === 'docs') ALL_DOCS.splice(idx, 1);
      else ALL_OWNERS.splice(idx, 1);
      renderPage(currentPage);
    } else {
      alert('删除失败：' + j.message);
    }
  } catch(e) { alert('网络错误：' + e.message); }
}

async function clearAll() {
  var label = currentTab === 'docs' ? '知识文档库' : '负责人映射';
  if (!confirm('确认清空全部「' + label + '」数据？此操作不可恢复。')) return;
  try {
    var r = await fetch('/admin/' + currentTab, { method: 'DELETE' });
    var j = await r.json();
    if (j.code === 0) {
      if (currentTab === 'docs') ALL_DOCS.splice(0, ALL_DOCS.length);
      else ALL_OWNERS.splice(0, ALL_OWNERS.length);
      renderPage(1);
    } else {
      alert('清空失败：' + j.message);
    }
  } catch(e) { alert('网络错误：' + e.message); }
}

renderPage(1);

// ── 文件选择 ──────────────────────────────────────────────
input.addEventListener('change', function() {
  if (input.files[0]) {
    nameEl.textContent = '已选择：' + input.files[0].name;
    btn.disabled = false;
  }
});

// ── 上传表单 ──────────────────────────────────────────────
document.getElementById('upload-form').addEventListener('submit', async function(e) {
  e.preventDefault();
  if (!input.files[0]) return;
  btn.disabled = true;
  msg.style.color = '#888';
  msg.textContent = '上传中...';
  var fd = new FormData();
  fd.append('file', input.files[0]);
  try {
    var r = await fetch('/admin/upload', { method: 'POST', body: fd });
    var j = await r.json();
    if (j.code === 0) {
      msg.style.color = '#1a7f37';
      msg.textContent = '上传成功，共导入 ' + j.count + ' 条记录，页面即将刷新…';
      setTimeout(function() { location.reload(); }, 1500);
    } else {
      msg.style.color = '#cf222e';
      msg.textContent = '失败：' + (j.message || '未知错误');
      btn.disabled = false;
    }
  } catch (err) {
    msg.style.color = '#cf222e';
    msg.textContent = '网络错误：' + err.message;
    btn.disabled = false;
  }
});

// ── 组织架构配置 ──────────────────────────────────────────
document.getElementById('cfg-form').addEventListener('submit', async function(e) {
  e.preventDefault();
  var cfgMsg = document.getElementById('cfg-msg');
  cfgMsg.style.color = '#888';
  cfgMsg.textContent = '保存中...';
  try {
    var r = await fetch('/admin/config', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify({
        org_chart_url: document.getElementById('cfg-url').value.trim(),
        org_chart_path: document.getElementById('cfg-path').value.trim()
      })
    });
    var j = await r.json();
    if (j.code === 0) {
      cfgMsg.style.color = '#1a7f37';
      cfgMsg.textContent = '保存成功，页面即将刷新…';
      setTimeout(function() { location.reload(); }, 1200);
    } else {
      cfgMsg.style.color = '#cf222e';
      cfgMsg.textContent = '失败：' + (j.message || '未知错误');
    }
  } catch (err) {
    cfgMsg.style.color = '#cf222e';
    cfgMsg.textContent = '网络错误：' + err.message;
  }
});
</script>
</body>
</html>