Commit 8b23a785 authored by 刘宇心's avatar 刘宇心

chore(huaguang-ops-26): 重新生成公司格式看板(含导入的19条,共30条)

parent 8ce09cb8
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>华光SAP问题清单 · Ledger 看板</title>
<style>
*{box-sizing:border-box}body{margin:0;font-family:-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;
background:#0f1115;color:#e7e9ee;font-size:14px}
.wrap{max-width:1280px;margin:0 auto;padding:20px}
h1{font-size:22px;margin:0 0 2px}.sub{color:#8b93a7;font-size:13px;margin-bottom:18px}
.sec{font-size:13px;letter-spacing:2px;color:#8b93a7;margin:22px 0 10px;text-transform:uppercase}
.cards{display:flex;flex-wrap:wrap;gap:12px}
.card{background:#171a21;border:1px solid #232734;border-radius:10px;padding:14px 16px;min-width:150px;flex:1}
.card .n{font-size:26px;font-weight:700}.card .l{color:#8b93a7;font-size:12px;margin-top:3px}
.card.bad{border-color:#5a2330;background:#1d1417}.card.bad .n{color:#ff6b81}
.card.good{border-color:#1f4a36}.card.good .n{color:#48d597}
.card .why{color:#6f7689;font-size:11px;margin-top:6px;line-height:1.4}
.bar{height:8px;background:#232734;border-radius:4px;overflow:hidden;margin-top:6px}
.bar>i{display:block;height:100%}
.row2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:820px){.row2{grid-template-columns:1fr}}
.panel{background:#171a21;border:1px solid #232734;border-radius:10px;padding:14px 16px}
.dist .item{display:flex;align-items:center;gap:10px;margin:7px 0;font-size:13px}
.dist .item span:first-child{width:96px;color:#b9c0d0}.dist .item span:last-child{width:34px;text-align:right;color:#8b93a7}
.dist .item .bar{flex:1}
.controls{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0}
select,input{background:#171a21;color:#e7e9ee;border:1px solid #2a2f3d;border-radius:7px;padding:7px 10px;font-size:13px}
input{flex:1;min-width:180px}
.chk{display:flex;align-items:center;gap:5px;color:#b9c0d0;font-size:13px;padding:6px 8px}
table{width:100%;border-collapse:collapse;margin-top:6px}
th,td{text-align:left;padding:8px 9px;border-bottom:1px solid #20242e;font-size:13px;vertical-align:top}
th{color:#8b93a7;font-weight:600;cursor:pointer;user-select:none;position:sticky;top:0;background:#0f1115}
tr.issue{cursor:pointer}tr.issue:hover{background:#171a21}
.pill{display:inline-block;padding:2px 8px;border-radius:11px;font-size:11px;font-weight:600;white-space:nowrap}
.f-已完成{background:#103a28;color:#48d597}.f-待用户验证{background:#3d3414;color:#e8c24b}
.f-进行中{background:#16304d;color:#5fa8ff}.f-进行中\(返工\){background:#3d2414;color:#ff9b54}
.f-未开始{background:#262a36;color:#9aa3b5}.f-已关闭{background:#22262f;color:#6f7689}
.pr-{color:#ff6b81;font-weight:700}.pr-{color:#e8c24b}.pr-{color:#8b93a7}
.od{color:#ff6b81;font-weight:700}
.detail{background:#12151b}.detail td{padding:0}
.dbox{padding:14px 18px}
.log{border-left:2px solid #2a2f3d;margin-left:6px;padding-left:14px}
.log .e{margin:9px 0;font-size:13px;line-height:1.45}
.log .meta{color:#6f7689;font-size:11px}.log .meta b{color:#9aa3b5;font-weight:600}
.kv{color:#8b93a7;font-size:12px;margin:4px 0}
.tag{display:inline-block;background:#202637;color:#8fb0ff;border-radius:5px;padding:1px 7px;font-size:11px;margin-right:5px}
.note{color:#6f7689;font-size:12px;margin-top:4px}
.foot{color:#5b6172;font-size:11px;margin:24px 0 8px;text-align:center}
</style></head><body><div class="wrap">
<h1>华光SAP问题清单 · Ledger 看板</h1>
<div class="sub" id="sub"></div>
<div class="sec">① Excel 体检 — 这张表把什么藏起来了</div>
<div class="cards" id="audit"></div>
<div class="sec">② 可信汇总(由 206 个对象派生,不是手填)</div>
<div class="row2">
<div class="panel"><div class="cards" id="topnums"></div></div>
<div class="panel dist" id="fsdist"></div>
</div>
<div class="row2" style="margin-top:16px">
<div class="panel dist" id="ownerdist"><div class="sec" style="margin:0 0 8px">各责任顾问 · 未关闭(调度)</div></div>
<div class="panel dist" id="pridist"><div class="sec" style="margin:0 0 8px">按优先级</div></div>
</div>
<div class="sec">③ 工作台 — 点任意一行看 append-only 进展日志</div>
<div class="controls">
<select id="f_owner"></select><select id="f_final"></select><select id="f_pri"></select>
<input id="f_q" placeholder="搜索描述/标题/编号…">
<label class="chk"><input type="checkbox" id="f_od">只看超期</label>
<label class="chk"><input type="checkbox" id="f_open" checked>只看未关闭</label>
</div>
<table><thead><tr>
<th data-k="id">编号</th><th data-k="owner">责任顾问</th><th data-k="priority">优先级</th>
<th data-k="final">最终状态</th><th data-k="plan">计划完成</th><th data-k="nlog">进展</th><th data-k="title">标题</th>
</tr></thead><tbody id="tb"></tbody></table>
<div class="foot" id="foot"></div>
</div>
<script>
const DATA=[{"id": "ISS-HUA-001", "owner": "刘宇心", "raised_by": "刘占康", "raised_dept": "财务部", "priority": "高", "category": "开发需求", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "2026-08-30", "overdue": false, "desc": "汇票拆分回传新功能可开发", "desc_html": "汇票拆分回传新功能可开发", "plan_txt": "## 进展日志\n- 2026-08-08 · 刘玉鑫 · [历史需求] · 创建问题;sap_status=未开始, acceptance=NA;owner=刘玉鑫→刘宇心(新建指派)", "title": "汇票拆分回传新功能可开发", "nlog": 1, "logs": [{"date": "2026-08-08", "author": "刘玉鑫", "source": "历史需求", "text": "创建问题;sap_status=未开始, acceptance=NA;owner=刘玉鑫→刘宇心(新建指派)"}], "linked": [], "owner_history": [{"from": "刘玉鑫", "to": "刘宇心", "by": "刘玉鑫", "date": "2026-08-08", "reason": "新建指派"}], "attachments": []}, {"id": "ISS-HUA-002", "owner": "郑容彬", "raised_by": "周杰", "raised_dept": "''", "priority": "中", "category": "开发需求", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "'2026-08-08'", "overdue": true, "desc": "新增中台调用会计凭证查询接口", "desc_html": "新增中台调用会计凭证查询接口", "plan_txt": "无", "title": "新增中台调用会计凭证查询接口", "nlog": 1, "logs": [{"date": "2026-08-08", "author": "郑容彬", "source": "更新", "text": "验收 待验证→NA"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-003", "owner": "周杰", "raised_by": "", "raised_dept": "", "priority": "高", "category": "数据问题", "sap": "已完成", "acc": "已验证", "final": "已完成", "plan": "2026-08-17", "overdue": false, "desc": "客户发票 90189057 在 VF02 过账报错:公司代码1000不允许信贷控制范围7000(消息 F4 746)。\n根因:存量单据 VBAK(订单20010040)/VBRK 携带旧信贷控制范围 KKBER=1000(配置调整前创建),而公司代码7000 的 T001CM 仅允许 CCA=7000,过账时冲突。\n配置链已核实完整:销售范围7000→CCA7000,CCA7000→信用段7000(所有公司代码=7000),UKM_KKBER2SGM 7000→7000,T001 公司7000默认CCA=7000。\n另有客户 1001344 未清FI发票 35 条旧 KKBER=1000 待刷新(UKM_RFDKLI20_AR 测试运行确认)。", "desc_html": "客户发票 90189057 在 VF02 过账报错:公司代码1000不允许信贷控制范围7000(消息 F4 746)。\n根因:存量单据 VBAK(订单20010040)/VBRK 携带旧信贷控制范围 KKBER=1000(配置调整前创建),而公司代码7000 的 T001CM 仅允许 CCA=7000,过账时冲突。\n配置链已核实完整:销售范围7000→CCA7000,CCA7000→信用段7000(所有公司代码=7000),UKM_KKBER2SGM 7000→7000,T001 公司7000默认CCA=7000。\n另有客户 1001344 未清FI发票 35 条旧 KKBER=1000 待刷新(UKM_RFDKLI20_AR 测试运行确认)。", "plan_txt": "方案A:直接修正存量单据 VBAK/VBRK 的 KKBER 1000→7000 后重新过账;FI 未清项走标准报表 UKM_RFDKLI20_AR 同步信用敞口(禁止直接改 BSEG);SD 批量由自定义 Z 程序 ZFI_FIX_KKBER_BATCH(范围=7000组公司代码)处理。", "title": "华光 客户发票过账报错 信贷控制范围1000残留", "nlog": 4, "logs": [{"date": "2026-08-17", "author": "周杰", "source": "现场运维", "text": "创建问题;sap_status=未开始, acceptance=NA"}, {"date": "2026-08-17", "author": "周杰", "source": "现场运维", "text": "修复完成并验证;(sap_status: 未开始→已完成)"}, {"date": "2026-08-17", "author": "周杰", "source": "checklist:chk-complete-required", "text": "解决方案=标准方案A修复:直接修正存量单据 VBAK/VBRK 的 KKBER 1000→7000 后重新过账;FI 未清项走标准报表 UKM_RFDKLI20_AR 同步信用敞口;SD 批量由自定义 Z 程序 ZFI_FIX_KKBER_BATCH(范围=7000组公司代码)处理。;工时(hours)=4"}, {"date": "2026-08-17", "author": "周杰", "source": "现场运维", "text": "(acceptance: NA→已验证)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-004", "owner": "周杰", "raised_by": "", "raised_dept": "", "priority": "中", "category": "系统优化问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "银企直连,银行回单界面,使用S09类型收款清账时,对一张发票多次清账,系统报错:清账金额不平,相差5450.00,请检查凭证请手动处理票据清账。\n报错原因:多次清账时,查找的清账凭证有误。", "desc_html": "银企直连,银行回单界面,使用S09类型收款清账时,对一张发票多次清账,系统报错:清账金额不平,相差5450.00,请检查凭证请手动处理票据清账。\n报错原因:多次清账时,查找的清账凭证有误。", "plan_txt": "重新梳理回单清账界面的未清数据逻辑,更正清账时查找未清凭证的逻辑:\n1. 当回单界面已核销金额=0 时,清账凭证用回单界面的会计凭证、会计年度、项查找未清凭证清账;\n2. 当回单界面已核销金额≠0 时,用回单界面的会计凭证、会计年度、项等于 BSID-REBZG、REBZJ、REBZZ,取 BSID-GJAHR、BELNR、BUZEI 进行清账。", "title": "银企直连 回单S09多次清账报错", "nlog": 3, "logs": [{"date": "2026-08-17", "author": "周杰", "source": "现场运维", "text": "创建问题;sap_status=未开始, acceptance=待验证"}, {"date": "2026-08-17", "author": "周杰", "source": "现场运维", "text": "修复完成,待用户验证;(sap_status: 未开始→已完成)"}, {"date": "2026-08-17", "author": "周杰", "source": "checklist:chk-complete-required", "text": "解决方案=更正回单清账界面查找未清凭证的逻辑:已核销金额=0 时,用回单界面会计凭证/年度/项查未清凭证清账;已核销金额≠0 时,用回单界面的会计凭证/年度/项等于 BSID-REBZG/REBZJ/REBZZ,取 BSID-GJAHR/BELNR/BUZEI 清账。;工时(hours)=3"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-005", "owner": "张丽英", "raised_by": "", "raised_dept": "", "priority": "低", "category": "未分类", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "", "overdue": false, "desc": "目前泰国工厂公司间交易存在两种情况:1、国内销售开票含税,泰国采购发票无税,2、国内销售开票无税,泰国采购发票无税", "desc_html": "目前泰国工厂公司间交易存在两种情况:1、国内销售开票含税,泰国采购发票无税,2、国内销售开票无税,泰国采购发票无税", "plan_txt": "## 进展日志\n- 2026-08-03 · unknown · [新建] · 创建问题;sap_status=未开始, acceptance=NA;owner=unknown→张丽英(新建指派)", "title": "泰国是否使用自动触发公司间开票", "nlog": 1, "logs": [{"date": "2026-08-03", "author": "unknown", "source": "新建", "text": "创建问题;sap_status=未开始, acceptance=NA;owner=unknown→张丽英(新建指派)"}], "linked": [], "owner_history": [{"from": "unknown", "to": "张丽英", "by": "unknown", "date": "2026-08-03", "reason": "新建指派"}], "attachments": []}, {"id": "ISS-HUA-006", "owner": "张丽英 <zhangliying@bos.local>", "raised_by": "", "raised_dept": "", "priority": "中", "category": "开发需求", "sap": "已完成", "acc": "已验证", "final": "已完成", "plan": "", "overdue": false, "desc": "MIRO:发票从700同步至900后,发现金额缩减了100倍;原因:OBBS中维护的兑换比例与系统程序逻辑相悖导致。记录人:张丽英;完成时间:2026/8/14。", "desc_html": "MIRO:发票从700同步至900后,发现金额缩减了100倍;原因:OBBS中维护的兑换比例与系统程序逻辑相悖导致。记录人:张丽英;完成时间:2026/8/14。", "plan_txt": "解决方案:OBBS中维护的兑换比例与系统程序逻辑相悖导致;工时:1h", "title": "MIRO发票金额缩减100倍", "nlog": 2, "logs": [{"date": "2026-08-17", "author": "张丽英", "source": "新建", "text": "创建问题;sap_status=已完成, acceptance=NA;owner=张丽英→张丽英 <zhangliying@bos.local>(新建指派)"}, {"date": "2026-08-17", "author": "张丽英", "source": "张丽英", "text": "验收确认:问题已完成验收通过;(acceptance: NA→已验证)"}], "linked": [], "owner_history": [{"from": "张丽英", "to": "张丽英 <zhangliying@bos.local>", "by": "张丽英", "date": "2026-08-17", "reason": "新建指派"}], "attachments": []}, {"id": "ISS-HUA-007", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "高", "category": "系统优化问题", "sap": "进行中", "acc": "已验证", "final": "进行中", "plan": "2026.8.31", "overdue": false, "desc": "此问题与客户沟通过三次,最终定位问题为:\n在回单处理平台,客户清账时,一张发票只能清账一次,第二次清账,报错未找到 dynpro SAPMF05A 0710 的批次输入数据。预期 SAPDF05X 3100。\n\n经查询:客户采用剩余清账法,当清账完成后,原凭证已经被新的凭证所替代,需要清新生成的凭证,通过键值查找新的凭证进行清账。", "desc_html": "此问题与客户沟通过三次,最终定位问题为:\n在回单处理平台,客户清账时,一张发票只能清账一次,第二次清账,报错未找到 dynpro SAPMF05A 0710 的批次输入数据。预期 SAPDF05X 3100。\n\n经查询:客户采用剩余清账法,当清账完成后,原凭证已经被新的凭证所替代,需要清新生成的凭证,通过键值查找新的凭证进行清账。", "plan_txt": "卢老师增加开发逻辑;工时(hours)=8", "title": "序号1: WORD的文档说明是 1、一个发票部分", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "卢老师增加开发逻辑;工时(hours)=8"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-008", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "高", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "2026.8.31", "overdue": false, "desc": "把数据拉取到应收票据平台的文件路径,应收票据平台的数据来源于后台表0001,在0006返回回单时,已经将URL进行存储,但是不知道什么原因,并未传输到001,需要开发接入查看问题点。", "desc_html": "把数据拉取到应收票据平台的文件路径,应收票据平台的数据来源于后台表0001,在0006返回回单时,已经将URL进行存储,但是不知道什么原因,并未传输到001,需要开发接入查看问题点。", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "序号2: 需求:应收票据平台没有电子版票据下载链", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-009", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "高", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "2026.8.25", "overdue": false, "desc": "检查检查该笔6000元在 ZRATEPIC_0006 中得状态为已支付\n检查BSIK中对应凭证行是确实已经清账剩余7800\n检查ZRATEPIC_0004中该项目的状态是是\"已支付\n检查ZRATEPIC_0003状态已支付,支付金额为0,在途支付为6000\n需要开发看一下数据如何恢复,进行调整", "desc_html": "检查检查该笔6000元在 ZRATEPIC_0006 中得状态为已支付\n检查BSIK中对应凭证行是确实已经清账剩余7800\n检查ZRATEPIC_0004中该项目的状态是是\"已支付\n检查ZRATEPIC_0003状态已支付,支付金额为0,在途支付为6000\n需要开发看一下数据如何恢复,进行调整", "plan_txt": "手工将003的状态进行修改,但是数据未能成功需要开发看一下取值逻辑,以及004数据为何未更新到003报表", "title": "202608120013已经付了6000,但是在", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "微信群", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "手工将003的状态进行修改,但是数据未能成功需要开发看一下取值逻辑,以及004数据为何未更新到003报表"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-010", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "530529000227920260713001321717 000107387491 000111097490 客户反馈此票据为供应商退回票据,并没有背书成功,但是SAP系统显示此票据已经成功背书,系统显示被202607240020 项目号成功背书,需要客户在自己平台查询一下数据情况,再确认", "desc_html": "530529000227920260713001321717 000107387491 000111097490 客户反馈此票据为供应商退回票据,并没有背书成功,但是SAP系统显示此票据已经成功背书,系统显示被202607240020 项目号成功背书,需要客户在自己平台查询一下数据情况,再确认", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "供应商退回票据在应收票据平台没有,无法认领-例子", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-011", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "供应商付款时,为部分清账法,已经清了一部分,现在剩余的部分没有办法自动清账,同时也没有办法用前台清账的方式找到相关数据,此问题需要开发排查部分清账的自动清账问题", "desc_html": "供应商付款时,为部分清账法,已经清了一部分,现在剩余的部分没有办法自动清账,同时也没有办法用前台清账的方式找到相关数据,此问题需要开发排查部分清账的自动清账问题", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "款项处理平台:项目号202606270004 无", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-012", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "目前查找到原始凭证已经被认领并清账,需要确认", "desc_html": "目前查找到原始凭证已经被认领并清账,需要确认", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "应收票据平台:2025年7月的1张票据生成了一张", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-013", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "用户操作问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "此问题为银行问题,返回数据失败,跟踪中", "desc_html": "此问题为银行问题,返回数据失败,跟踪中", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "款项处理平台里的外币付款生成的凭证与回单处理平台", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-014", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "需要开发查询,002532968896 ~ 002533411620 此票确实已经从银行返回,但是SAP没有收到", "desc_html": "需要开发查询,002532968896 ~ 002533411620 此票确实已经从银行返回,但是SAP没有收到", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "应收票据平台:票据号53253310540332", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-015", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "开发需求", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "一期数据处理逻辑就是合并的", "desc_html": "一期数据处理逻辑就是合并的", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "同一客户收到的多笔票据合并认领,生成的分录金额是", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-016", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "供应商付款时,为部分清账法,已经清了一部分,现在剩余的部分没有办法自动清账,同时也没有办法用前台清账的方式找到相关数据,此问题需要开发排查部分清账的自动清账问题", "desc_html": "供应商付款时,为部分清账法,已经清了一部分,现在剩余的部分没有办法自动清账,同时也没有办法用前台清账的方式找到相关数据,此问题需要开发排查部分清账的自动清账问题", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "回单处理平台:应付票据到期入账生成凭证报错", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-017", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "票据同时拆分背书给供应商A、B、C、D。", "desc_html": "票据同时拆分背书给供应商A、B、C、D。", "plan_txt": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=4", "title": "票据拆分测试", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=4"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-018", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "序号15:\n票据拆分背书给供应商A和供应商B,供应商A已签收,供应商B未签收,然后继续拆分给供应商C后,剩余票据贴现。", "desc_html": "序号15:\n票据拆分背书给供应商A和供应商B,供应商A已签收,供应商B未签收,然后继续拆分给供应商C后,剩余票据贴现。", "plan_txt": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=4", "title": "票据拆分测试", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=4"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-019", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "序号16:\n票据拆分背书给供应商A,供应商A签收后,因其他原因,退回给我司。", "desc_html": "序号16:\n票据拆分背书给供应商A,供应商A签收后,因其他原因,退回给我司。", "plan_txt": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6", "title": "票据拆分测试", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-020", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "序号17:\n票据拆分背书给供应商A,供应商A拒签。或者我司撤回票据", "desc_html": "序号17:\n票据拆分背书给供应商A,供应商A拒签。或者我司撤回票据", "plan_txt": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6", "title": "票据拆分测试", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-021", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "序号18:\n母公司背书票据给子公司", "desc_html": "序号18:\n母公司背书票据给子公司", "plan_txt": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6", "title": "票据拆分测试", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-022", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "", "overdue": false, "desc": "序号19:票据从直联A银行质押到非直联B银行,然后在非直联B银行托收", "desc_html": "序号19:票据从直联A银行质押到非直联B银行,然后在非直联B银行托收", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "票据拆分测试", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-023", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "2026.8.31", "overdue": false, "desc": "在银行银企直联的汇票区间,已经全部去除前导0,SAP的历史数据都存在前导0,例如SAP为0000001,cfs为1,此时会导致数据对不上传输失败,之前那只考虑了新数据的去除,本次需要考虑将要将含有汇票号及汇票区间的数据全部去除,", "desc_html": "在银行银企直联的汇票区间,已经全部去除前导0,SAP的历史数据都存在前导0,例如SAP为0000001,cfs为1,此时会导致数据对不上传输失败,之前那只考虑了新数据的去除,本次需要考虑将要将含有汇票号及汇票区间的数据全部去除,", "plan_txt": "robin老师开发程序,测试系统验证结果;工时(hours)=3", "title": "号段区间去0测试:历史票据能否进行后续业务,和新", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "robin老师开发程序,测试系统验证结果;工时(hours)=3"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-024", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "2026.8.22", "overdue": false, "desc": "sap 票据确实,需要开发协助补充数据", "desc_html": "sap 票据确实,需要开发协助补充数据", "plan_txt": "卢峰老师修改数据;工时(hours)=2", "title": "DLCZB250521A006323229425", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "微信群", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "卢峰老师修改数据;工时(hours)=2"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-025", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "", "overdue": false, "desc": "SAPTO12K数据:\n7200 ICBC5 I4094 861530204094 CNY 1002041100\n7200 ICBC5 I4095 861530204094 USD 1002040200出错的那笔美元交易在ZRATEPIC_0007中的记录为 USD,正常情况要匹配1002040200,需要开发接入看一下问题点", "desc_html": "SAPTO12K数据:\n7200 ICBC5 I4094 861530204094 CNY 1002041100\n7200 ICBC5 I4095 861530204094 USD 1002040200出错的那笔美元交易在ZRATEPIC_0007中的记录为 USD,正常情况要匹配1002040200,需要开发接入看一下问题点", "plan_txt": "robin debug", "title": "多币种优化问题:出现USD记入人民币科目", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "微信群", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "robin debug"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-huaguang-000", "owner": "陈政辉", "raised_by": "", "raised_dept": "", "priority": "中", "category": "未分类", "sap": "已完成", "acc": "NA", "final": "进行中", "plan": "2026-07-30", "overdue": true, "desc": "华光 500测试系统销售发票过账报 税码 OXTCN不存在的问题", "desc_html": "华光 500测试系统销售发票过账报 税码 OXTCN不存在的问题", "plan_txt": "## 进展日志", "title": "华光 500测试系统销售发票过账报 税码 OXTCN不存在的问题", "nlog": 0, "logs": [], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-huaguang-001", "owner": "陈政辉", "raised_by": "", "raised_dept": "", "priority": "中", "category": "未分类", "sap": "已完成", "acc": "NA", "final": "进行中", "plan": "2026-07-28", "overdue": true, "desc": "华光 交货单开票汇率要带出销售订单汇率", "desc_html": "华光 交货单开票汇率要带出销售订单汇率", "plan_txt": "## 进展日志", "title": "华光 交货单开票汇率要带出销售订单汇率", "nlog": 0, "logs": [], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-huaguang-002", "owner": "陈政辉", "raised_by": "", "raised_dept": "", "priority": "中", "category": "未分类", "sap": "已完成", "acc": "NA", "final": "进行中", "plan": "2026-07-24", "overdue": true, "desc": "华光 采购订单修改后审批策略没有了", "desc_html": "华光 采购订单修改后审批策略没有了", "plan_txt": "## 进展日志", "title": "华光 采购订单修改后审批策略没有了", "nlog": 0, "logs": [], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-huaguang-003", "owner": "陈政辉", "raised_by": "", "raised_dept": "", "priority": "中", "category": "未分类", "sap": "已完成", "acc": "NA", "final": "进行中", "plan": "2026-08-16", "overdue": true, "desc": "华光 泰国公司间调拨订单要求提过配置过程截图", "desc_html": "华光 泰国公司间调拨订单要求提过配置过程截图", "plan_txt": "## 进展日志\n- 2026-08-21 · 陈政辉 · [导入] · 从Excel清单模板导入", "title": "华光 泰国公司间调拨订单要求提过配置过程截图", "nlog": 1, "logs": [{"date": "2026-08-21", "author": "陈政辉", "source": "导入", "text": "从Excel清单模板导入"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-huaguang-004", "owner": "陈政辉", "raised_by": "刘宇心", "raised_dept": "", "priority": "中", "category": "数据问题", "sap": "已完成", "acc": "已验证", "final": "已完成", "plan": "2026-08-20", "overdue": false, "desc": "ZEPIC回单处理清账报错问题处理", "desc_html": "ZEPIC回单处理清账报错问题处理", "plan_txt": "DEBUG跟踪问题点+逻辑调整(工时:11h)", "title": "华光-ZEPIC回单处理清账报错问题处理", "nlog": 0, "logs": [], "linked": [], "owner_history": [], "attachments": []}], S={"total": 30, "total_logs": 42, "fs": {"未开始": 6, "已完成": 3, "待用户验证": 7, "进行中": 14}, "pri": {"高": 5, "中": 8, "低": 1, "未定": 16}, "owner_open": {"刘宇心": 20, "陈政辉": 4, "郑容彬": 1, "周杰": 1, "张丽英": 1}, "overdue": 5, "sap_done": 14, "final_done": 3, "today": "2026-08-28", "audit": null};
const fsOrder=["进行中(返工)","进行中","待用户验证","未开始","已完成","已关闭"];
document.getElementById('sub').textContent=
`数据源 = ${S.total} 个结构化对象(issues/*.md)· 实时重算 · 生成于 ${S.today} — 这不是那张 Excel,是它本该有的样子`;
// ① audit
if(S.audit){const a=S.audit;const items=[
[a.contradictions,'处状态自相矛盾','原表"SAP已完成"却"最终状态≠已完成"。Ledger 里最终状态是派生函数,结构上不可能矛盾。'],
[a.changelog_cells,'个单元格塞手写流水账',`已拆成 ${S.total_logs} 条带 时间·作者·来源 的 append-only 日志(点下方任意行看)。`],
[a.missing_priority+'/'+a.missing_category,'缺优先级/缺分类','没人强制填。Ledger 受控字段缺失即标红不过门。'],
[a.acc_distinct,'种"验收反馈"自由写法','同一个"已解决"68 种写法,机器没法聚合。Ledger 用受控状态+证据指针。']];
document.getElementById('audit').innerHTML=items.map(x=>
`<div class="card bad"><div class="n">${x[0]}</div><div class="l">${x[1]}</div><div class="why">${x[2]}</div></div>`).join('');
}else{document.getElementById('audit').innerHTML='<div class="card">未提供源 Excel,跳过体检</div>';}
// ② top nums
const pct=(n)=>S.total?Math.round(n/S.total*100):0;
document.getElementById('topnums').innerHTML=[
['good',S.total,'问题总数',''],
['good',S.final_done,'最终已完成',`SAP完成且用户验证 · ${pct(S.final_done)}%`],
['',S.sap_done,'SAP 已完成',`${pct(S.sap_done)}%(≠最终完成)`],
['bad',S.overdue,'超期未关闭','计划完成日已过']
].map(x=>`<div class="card ${x[0]}"><div class="n">${x[1]}</div><div class="l">${x[2]}</div><div class="why">${x[3]}</div></div>`).join('');
function dist(el,obj,order,total,title){const keys=order?order.filter(k=>obj[k]):Object.keys(obj).sort((a,b)=>obj[b]-obj[a]);
const mx=Math.max(1,...Object.values(obj));const col={'已完成':'#48d597','待用户验证':'#e8c24b','进行中':'#5fa8ff','进行中(返工)':'#ff9b54','未开始':'#9aa3b5','已关闭':'#6f7689','高':'#ff6b81','中':'#e8c24b','低':'#7f8aa0'};
let h=title?`<div class="sec" style="margin:0 0 8px">${title}</div>`:'';
h+=keys.map(k=>`<div class="item"><span>${k}</span><div class="bar"><i style="width:${obj[k]/mx*100}%;background:${col[k]||'#5fa8ff'}"></i></div><span>${obj[k]}</span></div>`).join('');
el.innerHTML=h;}
dist(document.getElementById('fsdist'),S.fs,fsOrder,S.total,'按最终状态(派生)');
dist(document.getElementById('ownerdist'),S.owner_open,null,S.total,'各责任顾问 · 未关闭(调度)');
dist(document.getElementById('pridist'),S.pri,['高','中','低','未定'],S.total,'按优先级');
// ③ table
function opts(el,arr,all){el.innerHTML=`<option value="">${all}</option>`+arr.map(v=>`<option>${v}</option>`).join('');}
opts(document.getElementById('f_owner'),[...new Set(DATA.map(d=>d.owner))].sort(),'全部责任顾问');
opts(document.getElementById('f_final'),fsOrder,'全部状态');
opts(document.getElementById('f_pri'),['高','中','低','未定'],'全部优先级');
let sortK='id',sortAsc=true;
const esc=s=>(s||'').replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));
function render(){
const fo=f_owner.value,ff=f_final.value,fp=f_pri.value,q=f_q.value.trim(),od=f_od.checked,op=f_open.checked;
let rows=DATA.filter(d=>(!fo||d.owner===fo)&&(!ff||d.final===ff)&&(!fp||d.priority===fp)
&&(!od||d.overdue)&&(!op||(d.final!=='已完成'&&d.final!=='已关闭'))
&&(!q||(d.id+d.title+d.desc).toLowerCase().includes(q.toLowerCase())));
rows.sort((a,b)=>{let x=a[sortK],y=b[sortK];if(sortK==='nlog'){x=+x;y=+y}return (x>y?1:x<y?-1:0)*(sortAsc?1:-1)});
tb.innerHTML=rows.map(d=>{
const od=d.overdue?'<span class="od"> ⚠超期</span>':'';
const logs=d.logs.map(l=>`<div class="e"><div class="meta"><b>${l.date}</b> · ${esc(l.author)} · <span class="tag">${esc(l.source)}</span></div>${esc(l.text)}</div>`).join('');
const lk=(d.linked||[]).map(x=>`<span class="tag">${x.rel}${x.id}</span>`).join('');
const attChips=(d.attachments||[]).map(a=>`<span class="tag">${esc(a.filename)}</span>`).join('');
const ownerHist=(d.owner_history||[]).map(h=>`<div class="e"><div class="meta"><b>${esc(h.date)}</b> · ${esc(h.by)} · <span class="tag">转派</span></div>${esc(h.from)}${esc(h.to)}${esc(h.reason||'')}</div>`).join('');
return `<tr class="issue" onclick="this.nextElementSibling.style.display=this.nextElementSibling.style.display==='table-row'?'none':'table-row'">
<td>${d.id}</td><td>${esc(d.owner)}</td><td class="pr-${d.priority}">${d.priority}</td>
<td><span class="pill f-${d.final}">${d.final}</span></td><td>${d.plan||'—'}${od}</td><td>${d.nlog}</td><td>${esc(d.title)}</td></tr>
<tr class="detail" style="display:none"><td colspan="7"><div class="dbox">
<div class="kv"><b>${d.id}</b> 提出:${esc(d.raised_dept)}/${esc(d.raised_by)} SAP:${d.sap} 验收:${d.acc} 分类:${esc(d.category)} ${lk}</div>
<div class="kv">责任顾问:${esc(d.owner)} ${attChips}</div>
<div class="kv" style="white-space:pre-wrap">问题描述:${d.desc_html}</div>
<div class="kv">当前方案:${esc(d.plan_txt)||'—'}</div>
<div class="sec" style="margin:12px 0 6px">责任人变更历史</div>
<div class="log">${ownerHist||'<div class="note">无</div>'}</div>
<div class="sec" style="margin:12px 0 6px">进展日志(append-only)</div>
<div class="log">${logs||'<div class="note">无</div>'}</div>
</div></td></tr>`;}).join('');
foot.textContent=`显示 ${rows.length} / ${DATA.length} 条 · 点行展开进展日志`;
}
document.querySelectorAll('th[data-k]').forEach(th=>th.onclick=()=>{const k=th.dataset.k;if(sortK===k)sortAsc=!sortAsc;else{sortK=k;sortAsc=true}render();});
['f_owner','f_final','f_pri','f_q','f_od','f_open'].forEach(id=>document.getElementById(id).addEventListener('input',render));
render();
</script></body></html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>华光SAP问题清单 · Ledger 看板</title>
<style>
*{box-sizing:border-box}body{margin:0;font-family:-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;
background:#0f1115;color:#e7e9ee;font-size:14px}
.wrap{max-width:1280px;margin:0 auto;padding:20px}
h1{font-size:22px;margin:0 0 2px}.sub{color:#8b93a7;font-size:13px;margin-bottom:18px}
.sec{font-size:13px;letter-spacing:2px;color:#8b93a7;margin:22px 0 10px;text-transform:uppercase}
.cards{display:flex;flex-wrap:wrap;gap:12px}
.card{background:#171a21;border:1px solid #232734;border-radius:10px;padding:14px 16px;min-width:150px;flex:1}
.card .n{font-size:26px;font-weight:700}.card .l{color:#8b93a7;font-size:12px;margin-top:3px}
.card.bad{border-color:#5a2330;background:#1d1417}.card.bad .n{color:#ff6b81}
.card.good{border-color:#1f4a36}.card.good .n{color:#48d597}
.card .why{color:#6f7689;font-size:11px;margin-top:6px;line-height:1.4}
.bar{height:8px;background:#232734;border-radius:4px;overflow:hidden;margin-top:6px}
.bar>i{display:block;height:100%}
.row2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:820px){.row2{grid-template-columns:1fr}}
.panel{background:#171a21;border:1px solid #232734;border-radius:10px;padding:14px 16px}
.dist .item{display:flex;align-items:center;gap:10px;margin:7px 0;font-size:13px}
.dist .item span:first-child{width:96px;color:#b9c0d0}.dist .item span:last-child{width:34px;text-align:right;color:#8b93a7}
.dist .item .bar{flex:1}
.controls{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0}
select,input{background:#171a21;color:#e7e9ee;border:1px solid #2a2f3d;border-radius:7px;padding:7px 10px;font-size:13px}
input{flex:1;min-width:180px}
.chk{display:flex;align-items:center;gap:5px;color:#b9c0d0;font-size:13px;padding:6px 8px}
table{width:100%;border-collapse:collapse;margin-top:6px}
th,td{text-align:left;padding:8px 9px;border-bottom:1px solid #20242e;font-size:13px;vertical-align:top}
th{color:#8b93a7;font-weight:600;cursor:pointer;user-select:none;position:sticky;top:0;background:#0f1115}
tr.issue{cursor:pointer}tr.issue:hover{background:#171a21}
.pill{display:inline-block;padding:2px 8px;border-radius:11px;font-size:11px;font-weight:600;white-space:nowrap}
.f-已完成{background:#103a28;color:#48d597}.f-待用户验证{background:#3d3414;color:#e8c24b}
.f-进行中{background:#16304d;color:#5fa8ff}.f-进行中\(返工\){background:#3d2414;color:#ff9b54}
.f-未开始{background:#262a36;color:#9aa3b5}.f-已关闭{background:#22262f;color:#6f7689}
.pr-{color:#ff6b81;font-weight:700}.pr-{color:#e8c24b}.pr-{color:#8b93a7}
.od{color:#ff6b81;font-weight:700}
.detail{background:#12151b}.detail td{padding:0}
.dbox{padding:14px 18px}
.log{border-left:2px solid #2a2f3d;margin-left:6px;padding-left:14px}
.log .e{margin:9px 0;font-size:13px;line-height:1.45}
.log .meta{color:#6f7689;font-size:11px}.log .meta b{color:#9aa3b5;font-weight:600}
.kv{color:#8b93a7;font-size:12px;margin:4px 0}
.tag{display:inline-block;background:#202637;color:#8fb0ff;border-radius:5px;padding:1px 7px;font-size:11px;margin-right:5px}
.note{color:#6f7689;font-size:12px;margin-top:4px}
.foot{color:#5b6172;font-size:11px;margin:24px 0 8px;text-align:center}
</style></head><body><div class="wrap">
<h1>华光SAP问题清单 · Ledger 看板</h1>
<div class="sub" id="sub"></div>
<div class="sec">① Excel 体检 — 这张表把什么藏起来了</div>
<div class="cards" id="audit"></div>
<div class="sec">② 可信汇总(由 206 个对象派生,不是手填)</div>
<div class="row2">
<div class="panel"><div class="cards" id="topnums"></div></div>
<div class="panel dist" id="fsdist"></div>
</div>
<div class="row2" style="margin-top:16px">
<div class="panel dist" id="ownerdist"><div class="sec" style="margin:0 0 8px">各责任顾问 · 未关闭(调度)</div></div>
<div class="panel dist" id="pridist"><div class="sec" style="margin:0 0 8px">按优先级</div></div>
</div>
<div class="sec">③ 工作台 — 点任意一行看 append-only 进展日志</div>
<div class="controls">
<select id="f_owner"></select><select id="f_final"></select><select id="f_pri"></select>
<input id="f_q" placeholder="搜索描述/标题/编号…">
<label class="chk"><input type="checkbox" id="f_od">只看超期</label>
<label class="chk"><input type="checkbox" id="f_open" checked>只看未关闭</label>
</div>
<table><thead><tr>
<th data-k="id">编号</th><th data-k="owner">责任顾问</th><th data-k="priority">优先级</th>
<th data-k="final">最终状态</th><th data-k="plan">计划完成</th><th data-k="nlog">进展</th><th data-k="title">标题</th>
</tr></thead><tbody id="tb"></tbody></table>
<div class="foot" id="foot"></div>
</div>
<script>
const DATA=[{"id": "ISS-HUA-001", "owner": "刘宇心", "raised_by": "刘占康", "raised_dept": "财务部", "priority": "高", "category": "开发需求", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "2026-08-30", "overdue": false, "desc": "汇票拆分回传新功能可开发", "desc_html": "汇票拆分回传新功能可开发", "plan_txt": "## 进展日志\n- 2026-08-08 · 刘玉鑫 · [历史需求] · 创建问题;sap_status=未开始, acceptance=NA;owner=刘玉鑫→刘宇心(新建指派)", "title": "汇票拆分回传新功能可开发", "nlog": 1, "logs": [{"date": "2026-08-08", "author": "刘玉鑫", "source": "历史需求", "text": "创建问题;sap_status=未开始, acceptance=NA;owner=刘玉鑫→刘宇心(新建指派)"}], "linked": [], "owner_history": [{"from": "刘玉鑫", "to": "刘宇心", "by": "刘玉鑫", "date": "2026-08-08", "reason": "新建指派"}], "attachments": []}], S={"total": 1, "total_logs": 1, "fs": {"未开始": 1}, "pri": {"高": 1}, "owner_open": {"刘宇心": 1}, "overdue": 0, "sap_done": 0, "final_done": 0, "today": "2026-08-08", "audit": null};
const fsOrder=["进行中(返工)","进行中","待用户验证","未开始","已完成","已关闭"];
document.getElementById('sub').textContent=
`数据源 = ${S.total} 个结构化对象(issues/*.md)· 实时重算 · 生成于 ${S.today} — 这不是那张 Excel,是它本该有的样子`;
// ① audit
if(S.audit){const a=S.audit;const items=[
[a.contradictions,'处状态自相矛盾','原表"SAP已完成"却"最终状态≠已完成"。Ledger 里最终状态是派生函数,结构上不可能矛盾。'],
[a.changelog_cells,'个单元格塞手写流水账',`已拆成 ${S.total_logs} 条带 时间·作者·来源 的 append-only 日志(点下方任意行看)。`],
[a.missing_priority+'/'+a.missing_category,'缺优先级/缺分类','没人强制填。Ledger 受控字段缺失即标红不过门。'],
[a.acc_distinct,'种"验收反馈"自由写法','同一个"已解决"68 种写法,机器没法聚合。Ledger 用受控状态+证据指针。']];
document.getElementById('audit').innerHTML=items.map(x=>
`<div class="card bad"><div class="n">${x[0]}</div><div class="l">${x[1]}</div><div class="why">${x[2]}</div></div>`).join('');
}else{document.getElementById('audit').innerHTML='<div class="card">未提供源 Excel,跳过体检</div>';}
// ② top nums
const pct=(n)=>S.total?Math.round(n/S.total*100):0;
document.getElementById('topnums').innerHTML=[
['good',S.total,'问题总数',''],
['good',S.final_done,'最终已完成',`SAP完成且用户验证 · ${pct(S.final_done)}%`],
['',S.sap_done,'SAP 已完成',`${pct(S.sap_done)}%(≠最终完成)`],
['bad',S.overdue,'超期未关闭','计划完成日已过']
].map(x=>`<div class="card ${x[0]}"><div class="n">${x[1]}</div><div class="l">${x[2]}</div><div class="why">${x[3]}</div></div>`).join('');
function dist(el,obj,order,total,title){const keys=order?order.filter(k=>obj[k]):Object.keys(obj).sort((a,b)=>obj[b]-obj[a]);
const mx=Math.max(1,...Object.values(obj));const col={'已完成':'#48d597','待用户验证':'#e8c24b','进行中':'#5fa8ff','进行中(返工)':'#ff9b54','未开始':'#9aa3b5','已关闭':'#6f7689','高':'#ff6b81','中':'#e8c24b','低':'#7f8aa0'};
let h=title?`<div class="sec" style="margin:0 0 8px">${title}</div>`:'';
h+=keys.map(k=>`<div class="item"><span>${k}</span><div class="bar"><i style="width:${obj[k]/mx*100}%;background:${col[k]||'#5fa8ff'}"></i></div><span>${obj[k]}</span></div>`).join('');
el.innerHTML=h;}
dist(document.getElementById('fsdist'),S.fs,fsOrder,S.total,'按最终状态(派生)');
dist(document.getElementById('ownerdist'),S.owner_open,null,S.total,'各责任顾问 · 未关闭(调度)');
dist(document.getElementById('pridist'),S.pri,['高','中','低','未定'],S.total,'按优先级');
// ③ table
function opts(el,arr,all){el.innerHTML=`<option value="">${all}</option>`+arr.map(v=>`<option>${v}</option>`).join('');}
opts(document.getElementById('f_owner'),[...new Set(DATA.map(d=>d.owner))].sort(),'全部责任顾问');
opts(document.getElementById('f_final'),fsOrder,'全部状态');
opts(document.getElementById('f_pri'),['高','中','低','未定'],'全部优先级');
let sortK='id',sortAsc=true;
const esc=s=>(s||'').replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));
function render(){
const fo=f_owner.value,ff=f_final.value,fp=f_pri.value,q=f_q.value.trim(),od=f_od.checked,op=f_open.checked;
let rows=DATA.filter(d=>(!fo||d.owner===fo)&&(!ff||d.final===ff)&&(!fp||d.priority===fp)
&&(!od||d.overdue)&&(!op||(d.final!=='已完成'&&d.final!=='已关闭'))
&&(!q||(d.id+d.title+d.desc).toLowerCase().includes(q.toLowerCase())));
rows.sort((a,b)=>{let x=a[sortK],y=b[sortK];if(sortK==='nlog'){x=+x;y=+y}return (x>y?1:x<y?-1:0)*(sortAsc?1:-1)});
tb.innerHTML=rows.map(d=>{
const od=d.overdue?'<span class="od"> ⚠超期</span>':'';
const logs=d.logs.map(l=>`<div class="e"><div class="meta"><b>${l.date}</b> · ${esc(l.author)} · <span class="tag">${esc(l.source)}</span></div>${esc(l.text)}</div>`).join('');
const lk=(d.linked||[]).map(x=>`<span class="tag">${x.rel}${x.id}</span>`).join('');
const attChips=(d.attachments||[]).map(a=>`<span class="tag">${esc(a.filename)}</span>`).join('');
const ownerHist=(d.owner_history||[]).map(h=>`<div class="e"><div class="meta"><b>${esc(h.date)}</b> · ${esc(h.by)} · <span class="tag">转派</span></div>${esc(h.from)}${esc(h.to)}${esc(h.reason||'')}</div>`).join('');
return `<tr class="issue" onclick="this.nextElementSibling.style.display=this.nextElementSibling.style.display==='table-row'?'none':'table-row'">
<td>${d.id}</td><td>${esc(d.owner)}</td><td class="pr-${d.priority}">${d.priority}</td>
<td><span class="pill f-${d.final}">${d.final}</span></td><td>${d.plan||'—'}${od}</td><td>${d.nlog}</td><td>${esc(d.title)}</td></tr>
<tr class="detail" style="display:none"><td colspan="7"><div class="dbox">
<div class="kv"><b>${d.id}</b> 提出:${esc(d.raised_dept)}/${esc(d.raised_by)} SAP:${d.sap} 验收:${d.acc} 分类:${esc(d.category)} ${lk}</div>
<div class="kv">责任顾问:${esc(d.owner)} ${attChips}</div>
<div class="kv" style="white-space:pre-wrap">问题描述:${d.desc_html}</div>
<div class="kv">当前方案:${esc(d.plan_txt)||'—'}</div>
<div class="sec" style="margin:12px 0 6px">责任人变更历史</div>
<div class="log">${ownerHist||'<div class="note">无</div>'}</div>
<div class="sec" style="margin:12px 0 6px">进展日志(append-only)</div>
<div class="log">${logs||'<div class="note">无</div>'}</div>
</div></td></tr>`;}).join('');
foot.textContent=`显示 ${rows.length} / ${DATA.length} 条 · 点行展开进展日志`;
}
document.querySelectorAll('th[data-k]').forEach(th=>th.onclick=()=>{const k=th.dataset.k;if(sortK===k)sortAsc=!sortAsc;else{sortK=k;sortAsc=true}render();});
['f_owner','f_final','f_pri','f_q','f_od','f_open'].forEach(id=>document.getElementById(id).addEventListener('input',render));
render();
</script></body></html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>华光SAP问题清单 · Ledger 看板</title>
<style>
*{box-sizing:border-box}body{margin:0;font-family:-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;
background:#0f1115;color:#e7e9ee;font-size:14px}
.wrap{max-width:1280px;margin:0 auto;padding:20px}
h1{font-size:22px;margin:0 0 2px}.sub{color:#8b93a7;font-size:13px;margin-bottom:18px}
.sec{font-size:13px;letter-spacing:2px;color:#8b93a7;margin:22px 0 10px;text-transform:uppercase}
.cards{display:flex;flex-wrap:wrap;gap:12px}
.card{background:#171a21;border:1px solid #232734;border-radius:10px;padding:14px 16px;min-width:150px;flex:1}
.card .n{font-size:26px;font-weight:700}.card .l{color:#8b93a7;font-size:12px;margin-top:3px}
.card.bad{border-color:#5a2330;background:#1d1417}.card.bad .n{color:#ff6b81}
.card.good{border-color:#1f4a36}.card.good .n{color:#48d597}
.card .why{color:#6f7689;font-size:11px;margin-top:6px;line-height:1.4}
.bar{height:8px;background:#232734;border-radius:4px;overflow:hidden;margin-top:6px}
.bar>i{display:block;height:100%}
.row2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:820px){.row2{grid-template-columns:1fr}}
.panel{background:#171a21;border:1px solid #232734;border-radius:10px;padding:14px 16px}
.dist .item{display:flex;align-items:center;gap:10px;margin:7px 0;font-size:13px}
.dist .item span:first-child{width:96px;color:#b9c0d0}.dist .item span:last-child{width:34px;text-align:right;color:#8b93a7}
.dist .item .bar{flex:1}
.controls{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0}
select,input{background:#171a21;color:#e7e9ee;border:1px solid #2a2f3d;border-radius:7px;padding:7px 10px;font-size:13px}
input{flex:1;min-width:180px}
.chk{display:flex;align-items:center;gap:5px;color:#b9c0d0;font-size:13px;padding:6px 8px}
table{width:100%;border-collapse:collapse;margin-top:6px}
th,td{text-align:left;padding:8px 9px;border-bottom:1px solid #20242e;font-size:13px;vertical-align:top}
th{color:#8b93a7;font-weight:600;cursor:pointer;user-select:none;position:sticky;top:0;background:#0f1115}
tr.issue{cursor:pointer}tr.issue:hover{background:#171a21}
.pill{display:inline-block;padding:2px 8px;border-radius:11px;font-size:11px;font-weight:600;white-space:nowrap}
.f-已完成{background:#103a28;color:#48d597}.f-待用户验证{background:#3d3414;color:#e8c24b}
.f-进行中{background:#16304d;color:#5fa8ff}.f-进行中\(返工\){background:#3d2414;color:#ff9b54}
.f-未开始{background:#262a36;color:#9aa3b5}.f-已关闭{background:#22262f;color:#6f7689}
.pr-{color:#ff6b81;font-weight:700}.pr-{color:#e8c24b}.pr-{color:#8b93a7}
.od{color:#ff6b81;font-weight:700}
.detail{background:#12151b}.detail td{padding:0}
.dbox{padding:14px 18px}
.log{border-left:2px solid #2a2f3d;margin-left:6px;padding-left:14px}
.log .e{margin:9px 0;font-size:13px;line-height:1.45}
.log .meta{color:#6f7689;font-size:11px}.log .meta b{color:#9aa3b5;font-weight:600}
.kv{color:#8b93a7;font-size:12px;margin:4px 0}
.tag{display:inline-block;background:#202637;color:#8fb0ff;border-radius:5px;padding:1px 7px;font-size:11px;margin-right:5px}
.note{color:#6f7689;font-size:12px;margin-top:4px}
.foot{color:#5b6172;font-size:11px;margin:24px 0 8px;text-align:center}
</style></head><body><div class="wrap">
<h1>华光SAP问题清单 · Ledger 看板</h1>
<div class="sub" id="sub"></div>
<div class="sec">① Excel 体检 — 这张表把什么藏起来了</div>
<div class="cards" id="audit"></div>
<div class="sec">② 可信汇总(由 206 个对象派生,不是手填)</div>
<div class="row2">
<div class="panel"><div class="cards" id="topnums"></div></div>
<div class="panel dist" id="fsdist"></div>
</div>
<div class="row2" style="margin-top:16px">
<div class="panel dist" id="ownerdist"><div class="sec" style="margin:0 0 8px">各责任顾问 · 未关闭(调度)</div></div>
<div class="panel dist" id="pridist"><div class="sec" style="margin:0 0 8px">按优先级</div></div>
</div>
<div class="sec">③ 工作台 — 点任意一行看 append-only 进展日志</div>
<div class="controls">
<select id="f_owner"></select><select id="f_final"></select><select id="f_pri"></select>
<input id="f_q" placeholder="搜索描述/标题/编号…">
<label class="chk"><input type="checkbox" id="f_od">只看超期</label>
<label class="chk"><input type="checkbox" id="f_open" checked>只看未关闭</label>
</div>
<table><thead><tr>
<th data-k="id">编号</th><th data-k="owner">责任顾问</th><th data-k="priority">优先级</th>
<th data-k="final">最终状态</th><th data-k="plan">计划完成</th><th data-k="nlog">进展</th><th data-k="title">标题</th>
</tr></thead><tbody id="tb"></tbody></table>
<div class="foot" id="foot"></div>
</div>
<script>
const DATA=[{"id": "ISS-HUA-001", "owner": "刘宇心", "raised_by": "刘占康", "raised_dept": "财务部", "priority": "高", "category": "开发需求", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "2026-08-30", "overdue": false, "desc": "汇票拆分回传新功能可开发", "desc_html": "汇票拆分回传新功能可开发", "plan_txt": "## 进展日志\n- 2026-08-08 · 刘玉鑫 · [历史需求] · 创建问题;sap_status=未开始, acceptance=NA;owner=刘玉鑫→刘宇心(新建指派)", "title": "汇票拆分回传新功能可开发", "nlog": 1, "logs": [{"date": "2026-08-08", "author": "刘玉鑫", "source": "历史需求", "text": "创建问题;sap_status=未开始, acceptance=NA;owner=刘玉鑫→刘宇心(新建指派)"}], "linked": [], "owner_history": [{"from": "刘玉鑫", "to": "刘宇心", "by": "刘玉鑫", "date": "2026-08-08", "reason": "新建指派"}], "attachments": []}, {"id": "ISS-HUA-002", "owner": "郑容彬", "raised_by": "周杰", "raised_dept": "''", "priority": "中", "category": "开发需求", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "'2026-08-08'", "overdue": true, "desc": "新增中台调用会计凭证查询接口", "desc_html": "新增中台调用会计凭证查询接口", "plan_txt": "无", "title": "新增中台调用会计凭证查询接口", "nlog": 1, "logs": [{"date": "2026-08-08", "author": "郑容彬", "source": "更新", "text": "验收 待验证→NA"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-003", "owner": "周杰", "raised_by": "", "raised_dept": "", "priority": "高", "category": "数据问题", "sap": "已完成", "acc": "已验证", "final": "已完成", "plan": "2026-08-17", "overdue": false, "desc": "客户发票 90189057 在 VF02 过账报错:公司代码1000不允许信贷控制范围7000(消息 F4 746)。\n根因:存量单据 VBAK(订单20010040)/VBRK 携带旧信贷控制范围 KKBER=1000(配置调整前创建),而公司代码7000 的 T001CM 仅允许 CCA=7000,过账时冲突。\n配置链已核实完整:销售范围7000→CCA7000,CCA7000→信用段7000(所有公司代码=7000),UKM_KKBER2SGM 7000→7000,T001 公司7000默认CCA=7000。\n另有客户 1001344 未清FI发票 35 条旧 KKBER=1000 待刷新(UKM_RFDKLI20_AR 测试运行确认)。", "desc_html": "客户发票 90189057 在 VF02 过账报错:公司代码1000不允许信贷控制范围7000(消息 F4 746)。\n根因:存量单据 VBAK(订单20010040)/VBRK 携带旧信贷控制范围 KKBER=1000(配置调整前创建),而公司代码7000 的 T001CM 仅允许 CCA=7000,过账时冲突。\n配置链已核实完整:销售范围7000→CCA7000,CCA7000→信用段7000(所有公司代码=7000),UKM_KKBER2SGM 7000→7000,T001 公司7000默认CCA=7000。\n另有客户 1001344 未清FI发票 35 条旧 KKBER=1000 待刷新(UKM_RFDKLI20_AR 测试运行确认)。", "plan_txt": "方案A:直接修正存量单据 VBAK/VBRK 的 KKBER 1000→7000 后重新过账;FI 未清项走标准报表 UKM_RFDKLI20_AR 同步信用敞口(禁止直接改 BSEG);SD 批量由自定义 Z 程序 ZFI_FIX_KKBER_BATCH(范围=7000组公司代码)处理。", "title": "华光 客户发票过账报错 信贷控制范围1000残留", "nlog": 4, "logs": [{"date": "2026-08-17", "author": "周杰", "source": "现场运维", "text": "创建问题;sap_status=未开始, acceptance=NA"}, {"date": "2026-08-17", "author": "周杰", "source": "现场运维", "text": "修复完成并验证;(sap_status: 未开始→已完成)"}, {"date": "2026-08-17", "author": "周杰", "source": "checklist:chk-complete-required", "text": "解决方案=标准方案A修复:直接修正存量单据 VBAK/VBRK 的 KKBER 1000→7000 后重新过账;FI 未清项走标准报表 UKM_RFDKLI20_AR 同步信用敞口;SD 批量由自定义 Z 程序 ZFI_FIX_KKBER_BATCH(范围=7000组公司代码)处理。;工时(hours)=4"}, {"date": "2026-08-17", "author": "周杰", "source": "现场运维", "text": "(acceptance: NA→已验证)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-004", "owner": "周杰", "raised_by": "", "raised_dept": "", "priority": "中", "category": "系统优化问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "银企直连,银行回单界面,使用S09类型收款清账时,对一张发票多次清账,系统报错:清账金额不平,相差5450.00,请检查凭证请手动处理票据清账。\n报错原因:多次清账时,查找的清账凭证有误。", "desc_html": "银企直连,银行回单界面,使用S09类型收款清账时,对一张发票多次清账,系统报错:清账金额不平,相差5450.00,请检查凭证请手动处理票据清账。\n报错原因:多次清账时,查找的清账凭证有误。", "plan_txt": "重新梳理回单清账界面的未清数据逻辑,更正清账时查找未清凭证的逻辑:\n1. 当回单界面已核销金额=0 时,清账凭证用回单界面的会计凭证、会计年度、项查找未清凭证清账;\n2. 当回单界面已核销金额≠0 时,用回单界面的会计凭证、会计年度、项等于 BSID-REBZG、REBZJ、REBZZ,取 BSID-GJAHR、BELNR、BUZEI 进行清账。", "title": "银企直连 回单S09多次清账报错", "nlog": 3, "logs": [{"date": "2026-08-17", "author": "周杰", "source": "现场运维", "text": "创建问题;sap_status=未开始, acceptance=待验证"}, {"date": "2026-08-17", "author": "周杰", "source": "现场运维", "text": "修复完成,待用户验证;(sap_status: 未开始→已完成)"}, {"date": "2026-08-17", "author": "周杰", "source": "checklist:chk-complete-required", "text": "解决方案=更正回单清账界面查找未清凭证的逻辑:已核销金额=0 时,用回单界面会计凭证/年度/项查未清凭证清账;已核销金额≠0 时,用回单界面的会计凭证/年度/项等于 BSID-REBZG/REBZJ/REBZZ,取 BSID-GJAHR/BELNR/BUZEI 清账。;工时(hours)=3"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-005", "owner": "张丽英", "raised_by": "", "raised_dept": "", "priority": "低", "category": "未分类", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "", "overdue": false, "desc": "目前泰国工厂公司间交易存在两种情况:1、国内销售开票含税,泰国采购发票无税,2、国内销售开票无税,泰国采购发票无税", "desc_html": "目前泰国工厂公司间交易存在两种情况:1、国内销售开票含税,泰国采购发票无税,2、国内销售开票无税,泰国采购发票无税", "plan_txt": "## 进展日志\n- 2026-08-03 · unknown · [新建] · 创建问题;sap_status=未开始, acceptance=NA;owner=unknown→张丽英(新建指派)", "title": "泰国是否使用自动触发公司间开票", "nlog": 1, "logs": [{"date": "2026-08-03", "author": "unknown", "source": "新建", "text": "创建问题;sap_status=未开始, acceptance=NA;owner=unknown→张丽英(新建指派)"}], "linked": [], "owner_history": [{"from": "unknown", "to": "张丽英", "by": "unknown", "date": "2026-08-03", "reason": "新建指派"}], "attachments": []}, {"id": "ISS-HUA-006", "owner": "张丽英 <zhangliying@bos.local>", "raised_by": "", "raised_dept": "", "priority": "中", "category": "开发需求", "sap": "已完成", "acc": "已验证", "final": "已完成", "plan": "", "overdue": false, "desc": "MIRO:发票从700同步至900后,发现金额缩减了100倍;原因:OBBS中维护的兑换比例与系统程序逻辑相悖导致。记录人:张丽英;完成时间:2026/8/14。", "desc_html": "MIRO:发票从700同步至900后,发现金额缩减了100倍;原因:OBBS中维护的兑换比例与系统程序逻辑相悖导致。记录人:张丽英;完成时间:2026/8/14。", "plan_txt": "解决方案:OBBS中维护的兑换比例与系统程序逻辑相悖导致;工时:1h", "title": "MIRO发票金额缩减100倍", "nlog": 2, "logs": [{"date": "2026-08-17", "author": "张丽英", "source": "新建", "text": "创建问题;sap_status=已完成, acceptance=NA;owner=张丽英→张丽英 <zhangliying@bos.local>(新建指派)"}, {"date": "2026-08-17", "author": "张丽英", "source": "张丽英", "text": "验收确认:问题已完成验收通过;(acceptance: NA→已验证)"}], "linked": [], "owner_history": [{"from": "张丽英", "to": "张丽英 <zhangliying@bos.local>", "by": "张丽英", "date": "2026-08-17", "reason": "新建指派"}], "attachments": []}, {"id": "ISS-HUA-007", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "高", "category": "系统优化问题", "sap": "进行中", "acc": "已验证", "final": "进行中", "plan": "2026.8.31", "overdue": false, "desc": "此问题与客户沟通过三次,最终定位问题为:\n在回单处理平台,客户清账时,一张发票只能清账一次,第二次清账,报错未找到 dynpro SAPMF05A 0710 的批次输入数据。预期 SAPDF05X 3100。\n\n经查询:客户采用剩余清账法,当清账完成后,原凭证已经被新的凭证所替代,需要清新生成的凭证,通过键值查找新的凭证进行清账。", "desc_html": "此问题与客户沟通过三次,最终定位问题为:\n在回单处理平台,客户清账时,一张发票只能清账一次,第二次清账,报错未找到 dynpro SAPMF05A 0710 的批次输入数据。预期 SAPDF05X 3100。\n\n经查询:客户采用剩余清账法,当清账完成后,原凭证已经被新的凭证所替代,需要清新生成的凭证,通过键值查找新的凭证进行清账。", "plan_txt": "卢老师增加开发逻辑;工时(hours)=8", "title": "序号1: WORD的文档说明是 1、一个发票部分", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "卢老师增加开发逻辑;工时(hours)=8"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-008", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "高", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "2026.8.31", "overdue": false, "desc": "把数据拉取到应收票据平台的文件路径,应收票据平台的数据来源于后台表0001,在0006返回回单时,已经将URL进行存储,但是不知道什么原因,并未传输到001,需要开发接入查看问题点。", "desc_html": "把数据拉取到应收票据平台的文件路径,应收票据平台的数据来源于后台表0001,在0006返回回单时,已经将URL进行存储,但是不知道什么原因,并未传输到001,需要开发接入查看问题点。", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "序号2: 需求:应收票据平台没有电子版票据下载链", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-009", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "高", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "2026.8.25", "overdue": false, "desc": "检查检查该笔6000元在 ZRATEPIC_0006 中得状态为已支付\n检查BSIK中对应凭证行是确实已经清账剩余7800\n检查ZRATEPIC_0004中该项目的状态是是\"已支付\n检查ZRATEPIC_0003状态已支付,支付金额为0,在途支付为6000\n需要开发看一下数据如何恢复,进行调整", "desc_html": "检查检查该笔6000元在 ZRATEPIC_0006 中得状态为已支付\n检查BSIK中对应凭证行是确实已经清账剩余7800\n检查ZRATEPIC_0004中该项目的状态是是\"已支付\n检查ZRATEPIC_0003状态已支付,支付金额为0,在途支付为6000\n需要开发看一下数据如何恢复,进行调整", "plan_txt": "手工将003的状态进行修改,但是数据未能成功需要开发看一下取值逻辑,以及004数据为何未更新到003报表", "title": "202608120013已经付了6000,但是在", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "微信群", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "手工将003的状态进行修改,但是数据未能成功需要开发看一下取值逻辑,以及004数据为何未更新到003报表"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-010", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "530529000227920260713001321717 000107387491 000111097490 客户反馈此票据为供应商退回票据,并没有背书成功,但是SAP系统显示此票据已经成功背书,系统显示被202607240020 项目号成功背书,需要客户在自己平台查询一下数据情况,再确认", "desc_html": "530529000227920260713001321717 000107387491 000111097490 客户反馈此票据为供应商退回票据,并没有背书成功,但是SAP系统显示此票据已经成功背书,系统显示被202607240020 项目号成功背书,需要客户在自己平台查询一下数据情况,再确认", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "供应商退回票据在应收票据平台没有,无法认领-例子", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-011", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "供应商付款时,为部分清账法,已经清了一部分,现在剩余的部分没有办法自动清账,同时也没有办法用前台清账的方式找到相关数据,此问题需要开发排查部分清账的自动清账问题", "desc_html": "供应商付款时,为部分清账法,已经清了一部分,现在剩余的部分没有办法自动清账,同时也没有办法用前台清账的方式找到相关数据,此问题需要开发排查部分清账的自动清账问题", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "款项处理平台:项目号202606270004 无", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-012", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "目前查找到原始凭证已经被认领并清账,需要确认", "desc_html": "目前查找到原始凭证已经被认领并清账,需要确认", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "应收票据平台:2025年7月的1张票据生成了一张", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-013", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "用户操作问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "此问题为银行问题,返回数据失败,跟踪中", "desc_html": "此问题为银行问题,返回数据失败,跟踪中", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "款项处理平台里的外币付款生成的凭证与回单处理平台", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-014", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "需要开发查询,002532968896 ~ 002533411620 此票确实已经从银行返回,但是SAP没有收到", "desc_html": "需要开发查询,002532968896 ~ 002533411620 此票确实已经从银行返回,但是SAP没有收到", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "应收票据平台:票据号53253310540332", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-015", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "开发需求", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "一期数据处理逻辑就是合并的", "desc_html": "一期数据处理逻辑就是合并的", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "同一客户收到的多笔票据合并认领,生成的分录金额是", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-016", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "进行中", "acc": "NA", "final": "进行中", "plan": "", "overdue": false, "desc": "供应商付款时,为部分清账法,已经清了一部分,现在剩余的部分没有办法自动清账,同时也没有办法用前台清账的方式找到相关数据,此问题需要开发排查部分清账的自动清账问题", "desc_html": "供应商付款时,为部分清账法,已经清了一部分,现在剩余的部分没有办法自动清账,同时也没有办法用前台清账的方式找到相关数据,此问题需要开发排查部分清账的自动清账问题", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "回单处理平台:应付票据到期入账生成凭证报错", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-017", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "票据同时拆分背书给供应商A、B、C、D。", "desc_html": "票据同时拆分背书给供应商A、B、C、D。", "plan_txt": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=4", "title": "票据拆分测试", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=4"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-018", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "序号15:\n票据拆分背书给供应商A和供应商B,供应商A已签收,供应商B未签收,然后继续拆分给供应商C后,剩余票据贴现。", "desc_html": "序号15:\n票据拆分背书给供应商A和供应商B,供应商A已签收,供应商B未签收,然后继续拆分给供应商C后,剩余票据贴现。", "plan_txt": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=4", "title": "票据拆分测试", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=4"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-019", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "序号16:\n票据拆分背书给供应商A,供应商A签收后,因其他原因,退回给我司。", "desc_html": "序号16:\n票据拆分背书给供应商A,供应商A签收后,因其他原因,退回给我司。", "plan_txt": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6", "title": "票据拆分测试", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-020", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "序号17:\n票据拆分背书给供应商A,供应商A拒签。或者我司撤回票据", "desc_html": "序号17:\n票据拆分背书给供应商A,供应商A拒签。或者我司撤回票据", "plan_txt": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6", "title": "票据拆分测试", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-021", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "", "overdue": false, "desc": "序号18:\n母公司背书票据给子公司", "desc_html": "序号18:\n母公司背书票据给子公司", "plan_txt": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6", "title": "票据拆分测试", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "配合客户做数据及提供SAP数据,测试场景问题进行沟通,配置汇票号,回传信息确实反馈,测试联调;工时(hours)=6"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-022", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "", "overdue": false, "desc": "序号19:票据从直联A银行质押到非直联B银行,然后在非直联B银行托收", "desc_html": "序号19:票据从直联A银行质押到非直联B银行,然后在非直联B银行托收", "plan_txt": "## 进展日志\n- 2026-08-28 · 刘宇心 · [问题清单] · 从 Excel 模板导入(华光)", "title": "票据拆分测试", "nlog": 1, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-023", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "系统优化问题", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "2026.8.31", "overdue": false, "desc": "在银行银企直联的汇票区间,已经全部去除前导0,SAP的历史数据都存在前导0,例如SAP为0000001,cfs为1,此时会导致数据对不上传输失败,之前那只考虑了新数据的去除,本次需要考虑将要将含有汇票号及汇票区间的数据全部去除,", "desc_html": "在银行银企直联的汇票区间,已经全部去除前导0,SAP的历史数据都存在前导0,例如SAP为0000001,cfs为1,此时会导致数据对不上传输失败,之前那只考虑了新数据的去除,本次需要考虑将要将含有汇票号及汇票区间的数据全部去除,", "plan_txt": "robin老师开发程序,测试系统验证结果;工时(hours)=3", "title": "号段区间去0测试:历史票据能否进行后续业务,和新", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "问题清单", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "robin老师开发程序,测试系统验证结果;工时(hours)=3"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-024", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "已完成", "acc": "待验证", "final": "待用户验证", "plan": "2026.8.22", "overdue": false, "desc": "sap 票据确实,需要开发协助补充数据", "desc_html": "sap 票据确实,需要开发协助补充数据", "plan_txt": "卢峰老师修改数据;工时(hours)=2", "title": "DLCZB250521A006323229425", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "微信群", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "卢峰老师修改数据;工时(hours)=2"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-HUA-025", "owner": "刘宇心", "raised_by": "", "raised_dept": "银企直联", "priority": "未定", "category": "数据问题", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "", "overdue": false, "desc": "SAPTO12K数据:\n7200 ICBC5 I4094 861530204094 CNY 1002041100\n7200 ICBC5 I4095 861530204094 USD 1002040200出错的那笔美元交易在ZRATEPIC_0007中的记录为 USD,正常情况要匹配1002040200,需要开发接入看一下问题点", "desc_html": "SAPTO12K数据:\n7200 ICBC5 I4094 861530204094 CNY 1002041100\n7200 ICBC5 I4095 861530204094 USD 1002040200出错的那笔美元交易在ZRATEPIC_0007中的记录为 USD,正常情况要匹配1002040200,需要开发接入看一下问题点", "plan_txt": "robin debug", "title": "多币种优化问题:出现USD记入人民币科目", "nlog": 2, "logs": [{"date": "2026-08-28", "author": "刘宇心", "source": "微信群", "text": "从 Excel 模板导入(华光)"}, {"date": "2026-08-28", "author": "刘宇心", "source": "Excel导入", "text": "robin debug"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-huaguang-000", "owner": "陈政辉", "raised_by": "", "raised_dept": "", "priority": "中", "category": "未分类", "sap": "已完成", "acc": "NA", "final": "进行中", "plan": "2026-07-30", "overdue": true, "desc": "华光 500测试系统销售发票过账报 税码 OXTCN不存在的问题", "desc_html": "华光 500测试系统销售发票过账报 税码 OXTCN不存在的问题", "plan_txt": "## 进展日志", "title": "华光 500测试系统销售发票过账报 税码 OXTCN不存在的问题", "nlog": 0, "logs": [], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-huaguang-001", "owner": "陈政辉", "raised_by": "", "raised_dept": "", "priority": "中", "category": "未分类", "sap": "已完成", "acc": "NA", "final": "进行中", "plan": "2026-07-28", "overdue": true, "desc": "华光 交货单开票汇率要带出销售订单汇率", "desc_html": "华光 交货单开票汇率要带出销售订单汇率", "plan_txt": "## 进展日志", "title": "华光 交货单开票汇率要带出销售订单汇率", "nlog": 0, "logs": [], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-huaguang-002", "owner": "陈政辉", "raised_by": "", "raised_dept": "", "priority": "中", "category": "未分类", "sap": "已完成", "acc": "NA", "final": "进行中", "plan": "2026-07-24", "overdue": true, "desc": "华光 采购订单修改后审批策略没有了", "desc_html": "华光 采购订单修改后审批策略没有了", "plan_txt": "## 进展日志", "title": "华光 采购订单修改后审批策略没有了", "nlog": 0, "logs": [], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-huaguang-003", "owner": "陈政辉", "raised_by": "", "raised_dept": "", "priority": "中", "category": "未分类", "sap": "已完成", "acc": "NA", "final": "进行中", "plan": "2026-08-16", "overdue": true, "desc": "华光 泰国公司间调拨订单要求提过配置过程截图", "desc_html": "华光 泰国公司间调拨订单要求提过配置过程截图", "plan_txt": "## 进展日志\n- 2026-08-21 · 陈政辉 · [导入] · 从Excel清单模板导入", "title": "华光 泰国公司间调拨订单要求提过配置过程截图", "nlog": 1, "logs": [{"date": "2026-08-21", "author": "陈政辉", "source": "导入", "text": "从Excel清单模板导入"}], "linked": [], "owner_history": [], "attachments": []}, {"id": "ISS-huaguang-004", "owner": "陈政辉", "raised_by": "刘宇心", "raised_dept": "", "priority": "中", "category": "数据问题", "sap": "已完成", "acc": "已验证", "final": "已完成", "plan": "2026-08-20", "overdue": false, "desc": "ZEPIC回单处理清账报错问题处理", "desc_html": "ZEPIC回单处理清账报错问题处理", "plan_txt": "DEBUG跟踪问题点+逻辑调整(工时:11h)", "title": "华光-ZEPIC回单处理清账报错问题处理", "nlog": 0, "logs": [], "linked": [], "owner_history": [], "attachments": []}], S={"total": 30, "total_logs": 42, "fs": {"未开始": 6, "已完成": 3, "待用户验证": 7, "进行中": 14}, "pri": {"高": 5, "中": 8, "低": 1, "未定": 16}, "owner_open": {"刘宇心": 20, "陈政辉": 4, "郑容彬": 1, "周杰": 1, "张丽英": 1}, "overdue": 5, "sap_done": 14, "final_done": 3, "today": "2026-08-28", "audit": null};
const fsOrder=["进行中(返工)","进行中","待用户验证","未开始","已完成","已关闭"];
document.getElementById('sub').textContent=
`数据源 = ${S.total} 个结构化对象(issues/*.md)· 实时重算 · 生成于 ${S.today} — 这不是那张 Excel,是它本该有的样子`;
// ① audit
if(S.audit){const a=S.audit;const items=[
[a.contradictions,'处状态自相矛盾','原表"SAP已完成"却"最终状态≠已完成"。Ledger 里最终状态是派生函数,结构上不可能矛盾。'],
[a.changelog_cells,'个单元格塞手写流水账',`已拆成 ${S.total_logs} 条带 时间·作者·来源 的 append-only 日志(点下方任意行看)。`],
[a.missing_priority+'/'+a.missing_category,'缺优先级/缺分类','没人强制填。Ledger 受控字段缺失即标红不过门。'],
[a.acc_distinct,'种"验收反馈"自由写法','同一个"已解决"68 种写法,机器没法聚合。Ledger 用受控状态+证据指针。']];
document.getElementById('audit').innerHTML=items.map(x=>
`<div class="card bad"><div class="n">${x[0]}</div><div class="l">${x[1]}</div><div class="why">${x[2]}</div></div>`).join('');
}else{document.getElementById('audit').innerHTML='<div class="card">未提供源 Excel,跳过体检</div>';}
// ② top nums
const pct=(n)=>S.total?Math.round(n/S.total*100):0;
document.getElementById('topnums').innerHTML=[
['good',S.total,'问题总数',''],
['good',S.final_done,'最终已完成',`SAP完成且用户验证 · ${pct(S.final_done)}%`],
['',S.sap_done,'SAP 已完成',`${pct(S.sap_done)}%(≠最终完成)`],
['bad',S.overdue,'超期未关闭','计划完成日已过']
].map(x=>`<div class="card ${x[0]}"><div class="n">${x[1]}</div><div class="l">${x[2]}</div><div class="why">${x[3]}</div></div>`).join('');
function dist(el,obj,order,total,title){const keys=order?order.filter(k=>obj[k]):Object.keys(obj).sort((a,b)=>obj[b]-obj[a]);
const mx=Math.max(1,...Object.values(obj));const col={'已完成':'#48d597','待用户验证':'#e8c24b','进行中':'#5fa8ff','进行中(返工)':'#ff9b54','未开始':'#9aa3b5','已关闭':'#6f7689','高':'#ff6b81','中':'#e8c24b','低':'#7f8aa0'};
let h=title?`<div class="sec" style="margin:0 0 8px">${title}</div>`:'';
h+=keys.map(k=>`<div class="item"><span>${k}</span><div class="bar"><i style="width:${obj[k]/mx*100}%;background:${col[k]||'#5fa8ff'}"></i></div><span>${obj[k]}</span></div>`).join('');
el.innerHTML=h;}
dist(document.getElementById('fsdist'),S.fs,fsOrder,S.total,'按最终状态(派生)');
dist(document.getElementById('ownerdist'),S.owner_open,null,S.total,'各责任顾问 · 未关闭(调度)');
dist(document.getElementById('pridist'),S.pri,['高','中','低','未定'],S.total,'按优先级');
// ③ table
function opts(el,arr,all){el.innerHTML=`<option value="">${all}</option>`+arr.map(v=>`<option>${v}</option>`).join('');}
opts(document.getElementById('f_owner'),[...new Set(DATA.map(d=>d.owner))].sort(),'全部责任顾问');
opts(document.getElementById('f_final'),fsOrder,'全部状态');
opts(document.getElementById('f_pri'),['高','中','低','未定'],'全部优先级');
let sortK='id',sortAsc=true;
const esc=s=>(s||'').replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));
function render(){
const fo=f_owner.value,ff=f_final.value,fp=f_pri.value,q=f_q.value.trim(),od=f_od.checked,op=f_open.checked;
let rows=DATA.filter(d=>(!fo||d.owner===fo)&&(!ff||d.final===ff)&&(!fp||d.priority===fp)
&&(!od||d.overdue)&&(!op||(d.final!=='已完成'&&d.final!=='已关闭'))
&&(!q||(d.id+d.title+d.desc).toLowerCase().includes(q.toLowerCase())));
rows.sort((a,b)=>{let x=a[sortK],y=b[sortK];if(sortK==='nlog'){x=+x;y=+y}return (x>y?1:x<y?-1:0)*(sortAsc?1:-1)});
tb.innerHTML=rows.map(d=>{
const od=d.overdue?'<span class="od"> ⚠超期</span>':'';
const logs=d.logs.map(l=>`<div class="e"><div class="meta"><b>${l.date}</b> · ${esc(l.author)} · <span class="tag">${esc(l.source)}</span></div>${esc(l.text)}</div>`).join('');
const lk=(d.linked||[]).map(x=>`<span class="tag">${x.rel}${x.id}</span>`).join('');
const attChips=(d.attachments||[]).map(a=>`<span class="tag">${esc(a.filename)}</span>`).join('');
const ownerHist=(d.owner_history||[]).map(h=>`<div class="e"><div class="meta"><b>${esc(h.date)}</b> · ${esc(h.by)} · <span class="tag">转派</span></div>${esc(h.from)}${esc(h.to)}${esc(h.reason||'')}</div>`).join('');
return `<tr class="issue" onclick="this.nextElementSibling.style.display=this.nextElementSibling.style.display==='table-row'?'none':'table-row'">
<td>${d.id}</td><td>${esc(d.owner)}</td><td class="pr-${d.priority}">${d.priority}</td>
<td><span class="pill f-${d.final}">${d.final}</span></td><td>${d.plan||'—'}${od}</td><td>${d.nlog}</td><td>${esc(d.title)}</td></tr>
<tr class="detail" style="display:none"><td colspan="7"><div class="dbox">
<div class="kv"><b>${d.id}</b> 提出:${esc(d.raised_dept)}/${esc(d.raised_by)} SAP:${d.sap} 验收:${d.acc} 分类:${esc(d.category)} ${lk}</div>
<div class="kv">责任顾问:${esc(d.owner)} ${attChips}</div>
<div class="kv" style="white-space:pre-wrap">问题描述:${d.desc_html}</div>
<div class="kv">当前方案:${esc(d.plan_txt)||'—'}</div>
<div class="sec" style="margin:12px 0 6px">责任人变更历史</div>
<div class="log">${ownerHist||'<div class="note">无</div>'}</div>
<div class="sec" style="margin:12px 0 6px">进展日志(append-only)</div>
<div class="log">${logs||'<div class="note">无</div>'}</div>
</div></td></tr>`;}).join('');
foot.textContent=`显示 ${rows.length} / ${DATA.length} 条 · 点行展开进展日志`;
}
document.querySelectorAll('th[data-k]').forEach(th=>th.onclick=()=>{const k=th.dataset.k;if(sortK===k)sortAsc=!sortAsc;else{sortK=k;sortAsc=true}render();});
['f_owner','f_final','f_pri','f_q','f_od','f_open'].forEach(id=>document.getElementById(id).addEventListener('input',render));
render();
</script></body></html>
\ No newline at end of file
<!DOCTYPE html>
<html lang="zh"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>周例会 · 问题清单 Ledger 看板</title>
<style>
*{box-sizing:border-box}body{margin:0;font-family:-apple-system,"Segoe UI","Microsoft YaHei",sans-serif;
background:#0f1115;color:#e7e9ee;font-size:14px}
.wrap{max-width:1280px;margin:0 auto;padding:20px}
h1{font-size:22px;margin:0 0 2px}.sub{color:#8b93a7;font-size:13px;margin-bottom:18px}
.sec{font-size:13px;letter-spacing:2px;color:#8b93a7;margin:22px 0 10px;text-transform:uppercase}
.cards{display:flex;flex-wrap:wrap;gap:12px}
.card{background:#171a21;border:1px solid #232734;border-radius:10px;padding:14px 16px;min-width:150px;flex:1}
.card .n{font-size:26px;font-weight:700}.card .l{color:#8b93a7;font-size:12px;margin-top:3px}
.card.bad{border-color:#5a2330;background:#1d1417}.card.bad .n{color:#ff6b81}
.card.good{border-color:#1f4a36}.card.good .n{color:#48d597}
.card .why{color:#6f7689;font-size:11px;margin-top:6px;line-height:1.4}
.bar{height:8px;background:#232734;border-radius:4px;overflow:hidden;margin-top:6px}
.bar>i{display:block;height:100%}
.row2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:820px){.row2{grid-template-columns:1fr}}
.panel{background:#171a21;border:1px solid #232734;border-radius:10px;padding:14px 16px}
.dist .item{display:flex;align-items:center;gap:10px;margin:7px 0;font-size:13px}
.dist .item span:first-child{width:96px;color:#b9c0d0}.dist .item span:last-child{width:34px;text-align:right;color:#8b93a7}
.dist .item .bar{flex:1}
.controls{display:flex;flex-wrap:wrap;gap:8px;margin:14px 0}
select,input{background:#171a21;color:#e7e9ee;border:1px solid #2a2f3d;border-radius:7px;padding:7px 10px;font-size:13px}
input{flex:1;min-width:180px}
.chk{display:flex;align-items:center;gap:5px;color:#b9c0d0;font-size:13px;padding:6px 8px}
table{width:100%;border-collapse:collapse;margin-top:6px}
th,td{text-align:left;padding:8px 9px;border-bottom:1px solid #20242e;font-size:13px;vertical-align:top}
th{color:#8b93a7;font-weight:600;cursor:pointer;user-select:none;position:sticky;top:0;background:#0f1115}
tr.issue{cursor:pointer}tr.issue:hover{background:#171a21}
.pill{display:inline-block;padding:2px 8px;border-radius:11px;font-size:11px;font-weight:600;white-space:nowrap}
.f-已完成{background:#103a28;color:#48d597}.f-待用户验证{background:#3d3414;color:#e8c24b}
.f-进行中{background:#16304d;color:#5fa8ff}.f-进行中\(返工\){background:#3d2414;color:#ff9b54}
.f-未开始{background:#262a36;color:#9aa3b5}.f-已关闭{background:#22262f;color:#6f7689}
.pr-{color:#ff6b81;font-weight:700}.pr-{color:#e8c24b}.pr-{color:#8b93a7}
.od{color:#ff6b81;font-weight:700}
.detail{background:#12151b}.detail td{padding:0}
.dbox{padding:14px 18px}
.log{border-left:2px solid #2a2f3d;margin-left:6px;padding-left:14px}
.log .e{margin:9px 0;font-size:13px;line-height:1.45}
.log .meta{color:#6f7689;font-size:11px}.log .meta b{color:#9aa3b5;font-weight:600}
.kv{color:#8b93a7;font-size:12px;margin:4px 0}
.tag{display:inline-block;background:#202637;color:#8fb0ff;border-radius:5px;padding:1px 7px;font-size:11px;margin-right:5px}
.note{color:#6f7689;font-size:12px;margin-top:4px}
.foot{color:#5b6172;font-size:11px;margin:24px 0 8px;text-align:center}
</style></head><body><div class="wrap">
<h1>周例会 · 问题清单 Ledger 看板</h1>
<div class="sub" id="sub"></div>
<div class="sec">① Excel 体检 — 这张表把什么藏起来了</div>
<div class="cards" id="audit"></div>
<div class="sec">② 可信汇总(由 206 个对象派生,不是手填)</div>
<div class="row2">
<div class="panel"><div class="cards" id="topnums"></div></div>
<div class="panel dist" id="fsdist"></div>
</div>
<div class="row2" style="margin-top:16px">
<div class="panel dist" id="ownerdist"><div class="sec" style="margin:0 0 8px">各责任顾问 · 未关闭(调度)</div></div>
<div class="panel dist" id="pridist"><div class="sec" style="margin:0 0 8px">按优先级</div></div>
</div>
<div class="sec">③ 工作台 — 点任意一行看 append-only 进展日志</div>
<div class="controls">
<select id="f_owner"></select><select id="f_final"></select><select id="f_pri"></select>
<input id="f_q" placeholder="搜索描述/标题/编号…">
<label class="chk"><input type="checkbox" id="f_od">只看超期</label>
<label class="chk"><input type="checkbox" id="f_open" checked>只看未关闭</label>
</div>
<table><thead><tr>
<th data-k="id">编号</th><th data-k="owner">责任顾问</th><th data-k="priority">优先级</th>
<th data-k="final">最终状态</th><th data-k="plan">计划完成</th><th data-k="nlog">进展</th><th data-k="title">标题</th>
</tr></thead><tbody id="tb"></tbody></table>
<div class="foot" id="foot"></div>
</div>
<script>
const DATA=[{"id": "ISS-HUA-001", "owner": "刘宇心", "raised_by": "刘占康", "raised_dept": "财务部", "priority": "高", "category": "开发需求", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "2026-08-30", "overdue": false, "desc": "汇票拆分回传新功能可开发", "desc_html": "汇票拆分回传新功能可开发", "plan_txt": "无", "title": "汇票拆分回传新功能可开发", "nlog": 1, "logs": [{"date": "2026-08-08", "author": "刘玉鑫", "source": "历史需求", "text": "创建问题;sap_status=未开始, acceptance=NA;owner=刘玉鑫→刘宇心(新建指派)"}], "linked": [], "owner_history": [{"from": "刘玉鑫", "to": "刘宇心", "by": "刘玉鑫", "date": "2026-08-08", "reason": "新建指派"}], "attachments": []}, {"id": "ISS-HUA-002", "owner": "郑容彬", "raised_by": "周杰", "raised_dept": "", "priority": "中", "category": "开发需求", "sap": "未开始", "acc": "NA", "final": "未开始", "plan": "2026-08-08", "overdue": false, "desc": "新增中台调用会计凭证查询接口", "desc_html": "新增中台调用会计凭证查询接口", "plan_txt": "无\n无", "title": "新增中台调用会计凭证查询接口", "nlog": 1, "logs": [{"date": "2026-08-08", "author": "郑容彬", "source": "更新", "text": "验收 待验证→NA"}], "linked": [], "owner_history": [], "attachments": []}], S={"total": 2, "total_logs": 2, "fs": {"未开始": 2}, "pri": {"高": 1, "中": 1}, "owner_open": {"刘宇心": 1, "郑容彬": 1}, "overdue": 0, "sap_done": 0, "final_done": 0, "today": "2026-08-08", "audit": null};
const fsOrder=["进行中(返工)","进行中","待用户验证","未开始","已完成","已关闭"];
document.getElementById('sub').textContent=
`数据源 = ${S.total} 个结构化对象(issues/*.md)· 实时重算 · 生成于 ${S.today} — 这不是那张 Excel,是它本该有的样子`;
// ① audit
if(S.audit){const a=S.audit;const items=[
[a.contradictions,'处状态自相矛盾','原表"SAP已完成"却"最终状态≠已完成"。Ledger 里最终状态是派生函数,结构上不可能矛盾。'],
[a.changelog_cells,'个单元格塞手写流水账',`已拆成 ${S.total_logs} 条带 时间·作者·来源 的 append-only 日志(点下方任意行看)。`],
[a.missing_priority+'/'+a.missing_category,'缺优先级/缺分类','没人强制填。Ledger 受控字段缺失即标红不过门。'],
[a.acc_distinct,'种"验收反馈"自由写法','同一个"已解决"68 种写法,机器没法聚合。Ledger 用受控状态+证据指针。']];
document.getElementById('audit').innerHTML=items.map(x=>
`<div class="card bad"><div class="n">${x[0]}</div><div class="l">${x[1]}</div><div class="why">${x[2]}</div></div>`).join('');
}else{document.getElementById('audit').innerHTML='<div class="card">未提供源 Excel,跳过体检</div>';}
// ② top nums
const pct=(n)=>S.total?Math.round(n/S.total*100):0;
document.getElementById('topnums').innerHTML=[
['good',S.total,'问题总数',''],
['good',S.final_done,'最终已完成',`SAP完成且用户验证 · ${pct(S.final_done)}%`],
['',S.sap_done,'SAP 已完成',`${pct(S.sap_done)}%(≠最终完成)`],
['bad',S.overdue,'超期未关闭','计划完成日已过']
].map(x=>`<div class="card ${x[0]}"><div class="n">${x[1]}</div><div class="l">${x[2]}</div><div class="why">${x[3]}</div></div>`).join('');
function dist(el,obj,order,total,title){const keys=order?order.filter(k=>obj[k]):Object.keys(obj).sort((a,b)=>obj[b]-obj[a]);
const mx=Math.max(1,...Object.values(obj));const col={'已完成':'#48d597','待用户验证':'#e8c24b','进行中':'#5fa8ff','进行中(返工)':'#ff9b54','未开始':'#9aa3b5','已关闭':'#6f7689','高':'#ff6b81','中':'#e8c24b','低':'#7f8aa0'};
let h=title?`<div class="sec" style="margin:0 0 8px">${title}</div>`:'';
h+=keys.map(k=>`<div class="item"><span>${k}</span><div class="bar"><i style="width:${obj[k]/mx*100}%;background:${col[k]||'#5fa8ff'}"></i></div><span>${obj[k]}</span></div>`).join('');
el.innerHTML=h;}
dist(document.getElementById('fsdist'),S.fs,fsOrder,S.total,'按最终状态(派生)');
dist(document.getElementById('ownerdist'),S.owner_open,null,S.total,'各责任顾问 · 未关闭(调度)');
dist(document.getElementById('pridist'),S.pri,['高','中','低','未定'],S.total,'按优先级');
// ③ table
function opts(el,arr,all){el.innerHTML=`<option value="">${all}</option>`+arr.map(v=>`<option>${v}</option>`).join('');}
opts(document.getElementById('f_owner'),[...new Set(DATA.map(d=>d.owner))].sort(),'全部责任顾问');
opts(document.getElementById('f_final'),fsOrder,'全部状态');
opts(document.getElementById('f_pri'),['高','中','低','未定'],'全部优先级');
let sortK='id',sortAsc=true;
const esc=s=>(s||'').replace(/[&<>]/g,c=>({'&':'&amp;','<':'&lt;','>':'&gt;'}[c]));
function render(){
const fo=f_owner.value,ff=f_final.value,fp=f_pri.value,q=f_q.value.trim(),od=f_od.checked,op=f_open.checked;
let rows=DATA.filter(d=>(!fo||d.owner===fo)&&(!ff||d.final===ff)&&(!fp||d.priority===fp)
&&(!od||d.overdue)&&(!op||(d.final!=='已完成'&&d.final!=='已关闭'))
&&(!q||(d.id+d.title+d.desc).toLowerCase().includes(q.toLowerCase())));
rows.sort((a,b)=>{let x=a[sortK],y=b[sortK];if(sortK==='nlog'){x=+x;y=+y}return (x>y?1:x<y?-1:0)*(sortAsc?1:-1)});
tb.innerHTML=rows.map(d=>{
const od=d.overdue?'<span class="od"> ⚠超期</span>':'';
const logs=d.logs.map(l=>`<div class="e"><div class="meta"><b>${l.date}</b> · ${esc(l.author)} · <span class="tag">${esc(l.source)}</span></div>${esc(l.text)}</div>`).join('');
const lk=(d.linked||[]).map(x=>`<span class="tag">${x.rel}${x.id}</span>`).join('');
const attChips=(d.attachments||[]).map(a=>`<span class="tag">${esc(a.filename)}</span>`).join('');
const ownerHist=(d.owner_history||[]).map(h=>`<div class="e"><div class="meta"><b>${esc(h.date)}</b> · ${esc(h.by)} · <span class="tag">转派</span></div>${esc(h.from)}${esc(h.to)}${esc(h.reason||'')}</div>`).join('');
return `<tr class="issue" onclick="this.nextElementSibling.style.display=this.nextElementSibling.style.display==='table-row'?'none':'table-row'">
<td>${d.id}</td><td>${esc(d.owner)}</td><td class="pr-${d.priority}">${d.priority}</td>
<td><span class="pill f-${d.final}">${d.final}</span></td><td>${d.plan||'—'}${od}</td><td>${d.nlog}</td><td>${esc(d.title)}</td></tr>
<tr class="detail" style="display:none"><td colspan="7"><div class="dbox">
<div class="kv"><b>${d.id}</b> 提出:${esc(d.raised_dept)}/${esc(d.raised_by)} SAP:${d.sap} 验收:${d.acc} 分类:${esc(d.category)} ${lk}</div>
<div class="kv">责任顾问:${esc(d.owner)} ${attChips}</div>
<div class="kv" style="white-space:pre-wrap">问题描述:${d.desc_html}</div>
<div class="kv">当前方案:${esc(d.plan_txt)||'—'}</div>
<div class="sec" style="margin:12px 0 6px">责任人变更历史</div>
<div class="log">${ownerHist||'<div class="note">无</div>'}</div>
<div class="sec" style="margin:12px 0 6px">进展日志(append-only)</div>
<div class="log">${logs||'<div class="note">无</div>'}</div>
</div></td></tr>`;}).join('');
foot.textContent=`显示 ${rows.length} / ${DATA.length} 条 · 点行展开进展日志`;
}
document.querySelectorAll('th[data-k]').forEach(th=>th.onclick=()=>{const k=th.dataset.k;if(sortK===k)sortAsc=!sortAsc;else{sortK=k;sortAsc=true}render();});
['f_owner','f_final','f_pri','f_q','f_od','f_open'].forEach(id=>document.getElementById(id).addEventListener('input',render));
render();
</script></body></html>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment