Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
H
huaguang-project-kb
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
bos-project-kb
huaguang-project-kb
Commits
8b23a785
Commit
8b23a785
authored
Aug 28, 2026
by
刘宇心
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
chore(huaguang-ops-26): 重新生成公司格式看板(含导入的19条,共30条)
parent
8ce09cb8
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
298 additions
and
298 deletions
+298
-298
huaguang-ops-26_体检.html
issues-ledger/huaguang-ops-26_体检.html
+149
-0
huaguang-ops-26_看板.html
issues-ledger/huaguang-ops-26_看板.html
+0
-149
看板_公司.html
issues-ledger/看板_公司.html
+149
-0
问题清单_看板.html
issues-ledger/问题清单_看板.html
+0
-149
No files found.
issues-ledger/huaguang-ops-26_体检.html
0 → 100644
View file @
8b23a785
<!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
:
1
fr
1
fr
;
gap
:
16px
}
@media
(
max-width
:
820px
){
.row2
{
grid-template-columns
:
1
fr
}}
.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
=>
({
'&'
:
'&'
,
'<'
:
'<'
,
'>'
:
'>'
}[
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
issues-ledger/huaguang-ops-26_看板.html
deleted
100644 → 0
View file @
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
:
1
fr
1
fr
;
gap
:
16px
}
@media
(
max-width
:
820px
){
.row2
{
grid-template-columns
:
1
fr
}}
.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
=>
({
'&'
:
'&'
,
'<'
:
'<'
,
'>'
:
'>'
}[
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
issues-ledger/看板_公司.html
0 → 100644
View file @
8b23a785
<!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
:
1
fr
1
fr
;
gap
:
16px
}
@media
(
max-width
:
820px
){
.row2
{
grid-template-columns
:
1
fr
}}
.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
=>
({
'&'
:
'&'
,
'<'
:
'<'
,
'>'
:
'>'
}[
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
issues-ledger/问题清单_看板.html
deleted
100644 → 0
View file @
8ce09cb8
<!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
:
1
fr
1
fr
;
gap
:
16px
}
@media
(
max-width
:
820px
){
.row2
{
grid-template-columns
:
1
fr
}}
.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
=>
({
'&'
:
'&'
,
'<'
:
'<'
,
'>'
:
'>'
}[
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment