Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gebijia-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
gebijia-project-kb
Commits
156196ee
Commit
156196ee
authored
Aug 04, 2026
by
杨欣
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
issue: 迁移 ISS-GB-001/002 → ISS-GEB-009/010(来自 gbjzd-issue-001)
parent
25eee93d
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
112 additions
and
150 deletions
+112
-150
.gitignore
.gitignore
+1
-0
gebijia-ops-26_看板.html
issues-ledger/gebijia-ops-26_看板.html
+44
-150
ISS-GEB-009.md
issues-ledger/issues/ISS-GEB-009.md
+35
-0
ISS-GEB-010.md
issues-ledger/issues/ISS-GEB-010.md
+32
-0
No files found.
.gitignore
0 → 100644
View file @
156196ee
.push-pending
issues-ledger/gebijia-ops-26_看板.html
View file @
156196ee
...
@@ -44,15 +44,8 @@ tr.issue{cursor:pointer}tr.issue:hover{background:#171a21}
...
@@ -44,15 +44,8 @@ tr.issue{cursor:pointer}tr.issue:hover{background:#171a21}
.tag
{
display
:
inline-block
;
background
:
#202637
;
color
:
#8fb0ff
;
border-radius
:
5px
;
padding
:
1px
7px
;
font-size
:
11px
;
margin-right
:
5px
}
.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
}
.note
{
color
:
#6f7689
;
font-size
:
12px
;
margin-top
:
4px
}
.foot
{
color
:
#5b6172
;
font-size
:
11px
;
margin
:
24px
0
8px
;
text-align
:
center
}
.foot
{
color
:
#5b6172
;
font-size
:
11px
;
margin
:
24px
0
8px
;
text-align
:
center
}
.lang-btn
{
background
:
#232734
;
color
:
#b9c0d0
;
border
:
1px
solid
#2a2f3d
;
border-radius
:
7px
;
padding
:
6px
14px
;
font-size
:
13px
;
cursor
:
pointer
;
font-weight
:
600
}
.lang-btn.active
{
background
:
#5fa8ff
;
color
:
#fff
;
border-color
:
#5fa8ff
}
</style></head><body><div
class=
"wrap"
>
</style></head><body><div
class=
"wrap"
>
<div
style=
"display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap"
>
<h1>
gebijia问题清单 · Ledger 看板
</h1>
<h1
id=
"h1"
>
gebijia问题清单 · Ledger 看板
</h1>
<div
style=
"display:flex;gap:6px"
>
<button
class=
"lang-btn active"
onclick=
"setLang('zh')"
id=
"btn-zh"
>
中文
</button>
<button
class=
"lang-btn"
onclick=
"setLang('en')"
id=
"btn-en"
>
EN
</button>
</div></div>
<div
class=
"sub"
id=
"sub"
></div>
<div
class=
"sub"
id=
"sub"
></div>
<div
class=
"sec"
>
① Excel 体检 — 这张表把什么藏起来了
</div>
<div
class=
"sec"
>
① Excel 体检 — 这张表把什么藏起来了
</div>
...
@@ -82,174 +75,74 @@ tr.issue{cursor:pointer}tr.issue:hover{background:#171a21}
...
@@ -82,174 +75,74 @@ tr.issue{cursor:pointer}tr.issue:hover{background:#171a21}
<div
class=
"foot"
id=
"foot"
></div>
<div
class=
"foot"
id=
"foot"
></div>
</div>
</div>
<script>
<script>
const
DATA
=
[],
S
=
{
"total"
:
0
,
"total_logs"
:
0
,
"fs"
:
{},
"pri"
:
{},
"owner_open"
:
{},
"overdue"
:
0
,
"sap_done"
:
0
,
"final_done"
:
0
,
"today"
:
"2026-08-03"
,
"audit"
:
null
};
const
DATA
=
[{
"id"
:
"ISS-GEB-001"
,
"owner"
:
"刘欣媛 <xinyuan.liu@boscloud.cn>"
,
"raised_by"
:
""
,
"raised_dept"
:
"采购部"
,
"priority"
:
"高"
,
"category"
:
"系统优化问题"
,
"sap"
:
"未开始"
,
"acc"
:
"NA"
,
"final"
:
"未开始"
,
"plan"
:
""
,
"overdue"
:
false
,
"desc"
:
"公司间交易采购下达时要根据气泡等级(Z01-Z28)去带出相应的价格。当前采购订单创建时价格未按气泡等级自动带出,需要系统根据气泡等级自动匹配公司间交易价格。"
,
"desc_html"
:
"公司间交易采购下达时要根据气泡等级(Z01-Z28)去带出相应的价格。当前采购订单创建时价格未按气泡等级自动带出,需要系统根据气泡等级自动匹配公司间交易价格。"
,
"plan_txt"
:
"## 进展日志
\
n- 2026-08-03 · 刘欣媛 · [opencode会话] · 创建问题;sap_status=未开始, acceptance=NA;owner=刘欣媛→刘欣媛 <xinyuan.liu@boscloud.cn>(新建指派)"
,
"title"
:
"公司间采购按气泡等级带出价格"
,
"nlog"
:
1
,
"logs"
:
[{
"date"
:
"2026-08-03"
,
"author"
:
"刘欣媛"
,
"source"
:
"opencode会话"
,
"text"
:
"创建问题;sap_status=未开始, acceptance=NA;owner=刘欣媛→刘欣媛 <xinyuan.liu@boscloud.cn>(新建指派)"
}],
"linked"
:
[],
"owner_history"
:
[{
"from"
:
"刘欣媛"
,
"to"
:
"刘欣媛 <xinyuan.liu@boscloud.cn>"
,
"by"
:
"刘欣媛"
,
"date"
:
"2026-08-03"
,
"reason"
:
"新建指派"
}],
"attachments"
:
[]},
{
"id"
:
"ISS-GEB-002"
,
"owner"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"raised_by"
:
""
,
"raised_dept"
:
"IT"
,
"priority"
:
"高"
,
"category"
:
"系统优化问题"
,
"sap"
:
"已完成"
,
"acc"
:
"已验证"
,
"final"
:
"已完成"
,
"plan"
:
""
,
"overdue"
:
false
,
"desc"
:
"WMS系统12月上线,SAP实施是否需要考虑对接"
,
"desc_html"
:
"WMS系统12月上线,SAP实施是否需要考虑对接"
,
"plan_txt"
:
"本次实施需对接WMS,与SAP一起上线"
,
"title"
:
"WMS-SAP对接考虑"
,
"nlog"
:
6
,
"logs"
:
[{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"问题清单_20260408"
,
"text"
:
"创建问题;sap_status=未开始, acceptance=NA;owner=jing.wang→jing.wang <jing.wang@boscloud.cn>(新建指派)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"确认"
,
"text"
:
"WMS为项目范围外,本次需对接,同步与SAP上线;(sap_status: 未开始→已完成)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"checklist:chk-complete"
,
"text"
:
"测过了吗?已确定WMS对接方案了吗?=已确认方案;影响哪些范围?=仅WMS-SAP接口"
},
{
"date"
:
"2026-08-03"
,
"author"
:
"jing.wang"
,
"source"
:
"更新"
,
"text"
:
"(acceptance: NA→已验证,更新当前方案)"
},
{
"date"
:
"2026-08-03"
,
"author"
:
"jing.wang"
,
"source"
:
"checklist:chk-accept-verified"
,
"text"
:
"谁确认验收?=IT/用户;验收渠道是什么?=会议/纪要;证据指针(可抽检的依据)?=对接方案/纪要"
},
{
"date"
:
"2026-08-03"
,
"author"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"source"
:
"迁移"
,
"text"
:
"从旧清单 gebijia-issues-ops 迁移,原编号 GBJ-GBJ-001 → ISS-GEB-002"
}],
"linked"
:
[],
"owner_history"
:
[{
"from"
:
"jing.wang"
,
"to"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"by"
:
"jing.wang"
,
"date"
:
"2026-07-15"
,
"reason"
:
"新建指派"
}],
"attachments"
:
[]},
{
"id"
:
"ISS-GEB-003"
,
"owner"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"raised_by"
:
""
,
"raised_dept"
:
"财务部"
,
"priority"
:
"中"
,
"category"
:
"系统优化问题"
,
"sap"
:
"已完成"
,
"acc"
:
"已验证"
,
"final"
:
"已完成"
,
"plan"
:
""
,
"overdue"
:
false
,
"desc"
:
"个别子公司仅财务账无实际业务,SAP是否纳入"
,
"desc_html"
:
"个别子公司仅财务账无实际业务,SAP是否纳入"
,
"plan_txt"
:
"## 进展日志
\
n- 2026-07-15 · jing.wang · [问题清单_20260408] · 创建问题;sap_status=未开始, acceptance=NA;owner=jing.wang→jing.wang <jing.wang@boscloud.cn>(新建指派)
\
n- 2026-07-15 · jing.wang · [确认] · 本次实施范围是5家法人公司,其他公司与账务不考虑;(sap_status: 未开始→已完成)
\
n- 2026-07-15 · jing.wang · [checklist:chk-complete] · 测过了吗?已确定WMS对接方案了吗?=方案已明确;影响哪些范围?=仅影响未纳入的法人公司
\
n- 2026-07-15 · jing.wang · [验收确认] · 用户已确认验收;(acceptance: NA→已验证)
\
n- 2026-07-15 · jing.wang · [checklist:chk-accept-verified] · 谁确认验收?=用户确认;验收渠道是什么?=项目确认;证据指针(可抽检的依据)=项目决策记录"
,
"title"
:
"子公司仅财务账处理"
,
"nlog"
:
5
,
"logs"
:
[{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"问题清单_20260408"
,
"text"
:
"创建问题;sap_status=未开始, acceptance=NA;owner=jing.wang→jing.wang <jing.wang@boscloud.cn>(新建指派)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"确认"
,
"text"
:
"本次实施范围是5家法人公司,其他公司与账务不考虑;(sap_status: 未开始→已完成)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"checklist:chk-complete"
,
"text"
:
"测过了吗?已确定WMS对接方案了吗?=方案已明确;影响哪些范围?=仅影响未纳入的法人公司"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"验收确认"
,
"text"
:
"用户已确认验收;(acceptance: NA→已验证)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"checklist:chk-accept-verified"
,
"text"
:
"谁确认验收?=用户确认;验收渠道是什么?=项目确认;证据指针(可抽检的依据)=项目决策记录"
}],
"linked"
:
[],
"owner_history"
:
[{
"from"
:
"jing.wang"
,
"to"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"by"
:
"jing.wang"
,
"date"
:
"2026-07-15"
,
"reason"
:
"新建指派"
}],
"attachments"
:
[]},
{
"id"
:
"ISS-GEB-004"
,
"owner"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"raised_by"
:
""
,
"raised_dept"
:
"财务部"
,
"priority"
:
"中"
,
"category"
:
"报表需求问题"
,
"sap"
:
"已完成"
,
"acc"
:
"已验证"
,
"final"
:
"已完成"
,
"plan"
:
""
,
"overdue"
:
false
,
"desc"
:
"预算管理报表:系统可实现/不可实现功能分类清单"
,
"desc_html"
:
"预算管理报表:系统可实现/不可实现功能分类清单"
,
"plan_txt"
:
"## 进展日志
\
n- 2026-07-15 · jing.wang · [经营分析专题会_20260615] · 创建问题;sap_status=未开始, acceptance=NA;owner=jing.wang→jing.wang <jing.wang@boscloud.cn>(新建指派)
\
n- 2026-07-15 · jing.wang · [确认] · 已确认,状态更新为进行中;(sap_status: 未开始→进行中)
\
n- 2026-07-15 · jing.wang · [checklist:chk-take-ownership] · 沟通清楚了吗?=已沟通;和谁沟通的?=项目组"
,
"title"
:
"预算管理报表功能分类"
,
"nlog"
:
3
,
"logs"
:
[{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"经营分析专题会_20260615"
,
"text"
:
"创建问题;sap_status=未开始, acceptance=NA;owner=jing.wang→jing.wang <jing.wang@boscloud.cn>(新建指派)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"确认"
,
"text"
:
"已确认,状态更新为进行中;(sap_status: 未开始→进行中)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"checklist:chk-take-ownership"
,
"text"
:
"沟通清楚了吗?=已沟通;和谁沟通的?=项目组"
}],
"linked"
:
[],
"owner_history"
:
[{
"from"
:
"jing.wang"
,
"to"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"by"
:
"jing.wang"
,
"date"
:
"2026-07-15"
,
"reason"
:
"新建指派"
}],
"attachments"
:
[]},
{
"id"
:
"ISS-GEB-005"
,
"owner"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"raised_by"
:
""
,
"raised_dept"
:
"总经办"
,
"priority"
:
"高"
,
"category"
:
"管理综合问题"
,
"sap"
:
"已完成"
,
"acc"
:
"已验证"
,
"final"
:
"已完成"
,
"plan"
:
""
,
"overdue"
:
false
,
"desc"
:
"组织架构事业部交叉问题(产品/区域/客户)需捋清"
,
"desc_html"
:
"组织架构事业部交叉问题(产品/区域/客户)需捋清"
,
"plan_txt"
:
"## 进展日志
\
n- 2026-07-15 · jing.wang · [顶层设计会_20260408] · 创建问题;sap_status=未开始, acceptance=NA;owner=jing.wang→jing.wang <jing.wang@boscloud.cn>(新建指派)
\
n- 2026-07-15 · jing.wang · [确认] · 已确认,状态更新为进行中;(sap_status: 未开始→进行中)
\
n- 2026-07-15 · jing.wang · [checklist:chk-take-ownership] · 沟通清楚了吗?=已沟通;和谁沟通的?=项目组"
,
"title"
:
"组织架构事业部交叉问题"
,
"nlog"
:
3
,
"logs"
:
[{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"顶层设计会_20260408"
,
"text"
:
"创建问题;sap_status=未开始, acceptance=NA;owner=jing.wang→jing.wang <jing.wang@boscloud.cn>(新建指派)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"确认"
,
"text"
:
"已确认,状态更新为进行中;(sap_status: 未开始→进行中)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"checklist:chk-take-ownership"
,
"text"
:
"沟通清楚了吗?=已沟通;和谁沟通的?=项目组"
}],
"linked"
:
[],
"owner_history"
:
[{
"from"
:
"jing.wang"
,
"to"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"by"
:
"jing.wang"
,
"date"
:
"2026-07-15"
,
"reason"
:
"新建指派"
}],
"attachments"
:
[]},
{
"id"
:
"ISS-GEB-006"
,
"owner"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"raised_by"
:
""
,
"raised_dept"
:
"IT"
,
"priority"
:
"高"
,
"category"
:
"数据问题"
,
"sap"
:
"已完成"
,
"acc"
:
"已验证"
,
"final"
:
"已完成"
,
"plan"
:
""
,
"overdue"
:
false
,
"desc"
:
"BOM/物料/客户/供应商缺乏统一管控规则"
,
"desc_html"
:
"BOM/物料/客户/供应商缺乏统一管控规则"
,
"plan_txt"
:
"主数据管控规则按数据文档填写,部门同步出具配套制度"
,
"title"
:
"主数据缺乏统一管控规则"
,
"nlog"
:
6
,
"logs"
:
[{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"顶层设计会_20260408"
,
"text"
:
"创建问题;sap_status=未开始, acceptance=NA;owner=jing.wang→jing.wang <jing.wang@boscloud.cn>(新建指派)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"确认"
,
"text"
:
"按照业务蓝图中确认,各数据管控规则按照数据文档中的规则填写,部门同步出具配套制度;(sap_status: 未开始→已完成)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"checklist:chk-complete"
,
"text"
:
"测过了吗?已确定WMS对接方案了吗?=蓝图已确认;影响哪些范围?=主数据管控规则+配套制度"
},
{
"date"
:
"2026-08-03"
,
"author"
:
"jing.wang"
,
"source"
:
"更新"
,
"text"
:
"(acceptance: NA→已验证,更新当前方案)"
},
{
"date"
:
"2026-08-03"
,
"author"
:
"jing.wang"
,
"source"
:
"checklist:chk-accept-verified"
,
"text"
:
"谁确认验收?=IT/用户;验收渠道是什么?=会议/纪要;证据指针(可抽检的依据)?=主数据管控规则及配套制度"
},
{
"date"
:
"2026-08-03"
,
"author"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"source"
:
"迁移"
,
"text"
:
"从旧清单 gebijia-issues-ops 迁移,原编号 GBJ-GBJ-005 → ISS-GEB-006"
}],
"linked"
:
[],
"owner_history"
:
[{
"from"
:
"jing.wang"
,
"to"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"by"
:
"jing.wang"
,
"date"
:
"2026-07-15"
,
"reason"
:
"新建指派"
}],
"attachments"
:
[]},
{
"id"
:
"ISS-GEB-007"
,
"owner"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"raised_by"
:
""
,
"raised_dept"
:
"总经办"
,
"priority"
:
"中"
,
"category"
:
"跟踪类问题"
,
"sap"
:
"已完成"
,
"acc"
:
"已验证"
,
"final"
:
"已完成"
,
"plan"
:
""
,
"overdue"
:
false
,
"desc"
:
"玻纤子公司拆分时间未明确"
,
"desc_html"
:
"玻纤子公司拆分时间未明确"
,
"plan_txt"
:
"玻纤子公司剥离时间未定,暂配置系统组织架构,后续迁移时补充数据"
,
"title"
:
"玻纤子公司拆分时间未明确"
,
"nlog"
:
6
,
"logs"
:
[{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"KB_05风险"
,
"text"
:
"创建问题;sap_status=未开始, acceptance=NA;owner=jing.wang→jing.wang <jing.wang@boscloud.cn>(新建指派)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"确认"
,
"text"
:
"玻纤子公司剥离时间未定,SAP系统暂配置组织架构即可;(sap_status: 未开始→已完成)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"checklist:chk-complete"
,
"text"
:
"测过了吗?已确定WMS对接方案了吗?=方案已定;影响哪些范围?=仅组织架构配置"
},
{
"date"
:
"2026-08-03"
,
"author"
:
"jing.wang"
,
"source"
:
"更新"
,
"text"
:
"(acceptance: NA→已验证,更新当前方案)"
},
{
"date"
:
"2026-08-03"
,
"author"
:
"jing.wang"
,
"source"
:
"checklist:chk-accept-verified"
,
"text"
:
"谁确认验收?=总经办/用户;验收渠道是什么?=会议/纪要;证据指针(可抽检的依据)?=组织架构配置方案,后续迁移时补充数据"
},
{
"date"
:
"2026-08-03"
,
"author"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"source"
:
"迁移"
,
"text"
:
"从旧清单 gebijia-issues-ops 迁移,原编号 GBJ-GBJ-006 → ISS-GEB-007"
}],
"linked"
:
[],
"owner_history"
:
[{
"from"
:
"jing.wang"
,
"to"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"by"
:
"jing.wang"
,
"date"
:
"2026-07-15"
,
"reason"
:
"新建指派"
}],
"attachments"
:
[]},
{
"id"
:
"ISS-GEB-008"
,
"owner"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"raised_by"
:
""
,
"raised_dept"
:
"IT"
,
"priority"
:
"高"
,
"category"
:
"跟踪类问题"
,
"sap"
:
"已取消"
,
"acc"
:
"NA"
,
"final"
:
"已关闭"
,
"plan"
:
""
,
"overdue"
:
false
,
"desc"
:
"立体库/WMS实施周期150天,与SAP协同时间待确认"
,
"desc_html"
:
"立体库/WMS实施周期150天,与SAP协同时间待确认"
,
"plan_txt"
:
"## 进展日志
\
n- 2026-07-15 · jing.wang · [KB_05风险] · 创建问题;sap_status=未开始, acceptance=NA;owner=jing.wang→jing.wang <jing.wang@boscloud.cn>(新建指派)
\
n- 2026-07-15 · jing.wang · [整理合并] · 与问题GBJ-GBJ-001重复(WMS-SAP对接),关闭;(sap_status: 未开始→已取消)
\
n- 2026-07-15 · jing.wang · [checklist:chk-close] · 为什么关闭?=与GBJ-GBJ-001重复;客户知道吗?=已告知"
,
"title"
:
"立体库WMS实施周期协同"
,
"nlog"
:
3
,
"logs"
:
[{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"KB_05风险"
,
"text"
:
"创建问题;sap_status=未开始, acceptance=NA;owner=jing.wang→jing.wang <jing.wang@boscloud.cn>(新建指派)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"整理合并"
,
"text"
:
"与问题GBJ-GBJ-001重复(WMS-SAP对接),关闭;(sap_status: 未开始→已取消)"
},
{
"date"
:
"2026-07-15"
,
"author"
:
"jing.wang"
,
"source"
:
"checklist:chk-close"
,
"text"
:
"为什么关闭?=与GBJ-GBJ-001重复;客户知道吗?=已告知"
}],
"linked"
:
[],
"owner_history"
:
[{
"from"
:
"jing.wang"
,
"to"
:
"jing.wang <jing.wang@boscloud.cn>"
,
"by"
:
"jing.wang"
,
"date"
:
"2026-07-15"
,
"reason"
:
"新建指派"
}],
"attachments"
:
[]}],
S
=
{
"total"
:
8
,
"total_logs"
:
33
,
"fs"
:
{
"未开始"
:
1
,
"已完成"
:
6
,
"已关闭"
:
1
},
"pri"
:
{
"高"
:
5
,
"中"
:
3
},
"owner_open"
:
{
"刘欣媛 <xinyuan.liu@boscloud.cn>"
:
1
},
"overdue"
:
0
,
"sap_done"
:
6
,
"final_done"
:
6
,
"today"
:
"2026-08-04"
,
"audit"
:
null
};
let
lang
=
'zh'
;
const
fsOrder
=
[
"进行中(返工)"
,
"进行中"
,
"待用户验证"
,
"未开始"
,
"已完成"
,
"已关闭"
];
const
h1El
=
document
.
getElementById
(
'h1'
);
document
.
getElementById
(
'sub'
).
textContent
=
const
origH1
=
h1El
.
textContent
;
`数据源 =
${
S
.
total
}
个结构化对象(issues/*.md)· 实时重算 · 生成于
${
S
.
today
}
— 这不是那张 Excel,是它本该有的样子`
;
const
listName
=
origH1
.
replace
(
/
\s
*·
\s
*Ledger
\s
*看板$/i
,
''
).
replace
(
/
\s
*·
\s
*Issue
\/
Task
\s
*Ledger$/i
,
''
);
const
fsOrder_zh
=
[
"进行中(返工)"
,
"进行中"
,
"待用户验证"
,
"未开始"
,
"已完成"
,
"已关闭"
];
const
fsOrder_en
=
[
"Rework"
,
"In Progress"
,
"Pending Verification"
,
"Not Started"
,
"Completed"
,
"Closed"
];
const
fsOrder
=
fsOrder_zh
;
const
colMap
=
{
'已完成'
:
'#48d597'
,
'Completed'
:
'#48d597'
,
'待用户验证'
:
'#e8c24b'
,
'Pending Verification'
:
'#e8c24b'
,
'进行中'
:
'#5fa8ff'
,
'In Progress'
:
'#5fa8ff'
,
'进行中(返工)'
:
'#ff9b54'
,
'Rework'
:
'#ff9b54'
,
'未开始'
:
'#9aa3b5'
,
'Not Started'
:
'#9aa3b5'
,
'已关闭'
:
'#6f7689'
,
'Closed'
:
'#6f7689'
,
'高'
:
'#ff6b81'
,
'High'
:
'#ff6b81'
,
'中'
:
'#e8c24b'
,
'Medium'
:
'#e8c24b'
,
'低'
:
'#7f8aa0'
,
'Low'
:
'#7f8aa0'
,
'未定'
:
'#7f8aa0'
,
'Unset'
:
'#7f8aa0'
};
const
L
=
{
zh
:{
title
:
listName
+
' · 问题清单 Ledger 看板'
,
sub
:
`数据源 =
${
S
.
total
}
个结构化对象 · 实时重算 ·
${
S
.
today
}
`
,
audit
:
`① Excel 体检`
,
summary
:
`② 可信汇总`
,
ownerSec
:
`各责任顾问 · 未关闭`
,
priSec
:
`按优先级`
,
workSec
:
`③ 工作台 — 点行展开日志`
,
fOwner
:
'全部责任顾问'
,
fFinal
:
'全部状态'
,
fPri
:
'全部优先级'
,
fQ
:
'搜索编号/标题/描述…'
,
fOd
:
'只看超期'
,
fOpen
:
'只看未关闭'
,
thId
:
'编号'
,
thOwner
:
'责任顾问'
,
thPri
:
'优先级'
,
thFinal
:
'最终状态'
,
thPlan
:
'计划完成'
,
thNlog
:
'进展'
,
thTitle
:
'标题'
,
total
:
'问题总数'
,
done
:
'最终已完成'
,
sapDone
:
'SAP 已完成'
,
overdueN
:
'超期未关闭'
,
fsDist
:
'按最终状态(派生)'
,
ownerDist
:
'各责任顾问 · 未关闭(调度)'
,
priDist
:
'按优先级'
,
od
:
'⚠超期'
,
descLabel
:
'问题描述'
,
planLabel
:
'当前方案'
,
histLabel
:
'责任人变更历史'
,
logLabel
:
'进展日志(append-only)'
,
footer
:
`显示 {n} / {t} 条 · 点行展开进展日志`
,
auditC
:
'处状态自相矛盾'
,
auditLog
:
'个单元格塞手写流水账'
,
auditPri
:
'缺优先级/缺分类'
,
auditAcc
:
'种"验收反馈"自由写法'
,
auditWhy1
:
'原表"SAP已完成"却"最终状态≠已完成"。Ledger 里最终态是派生函数,结构上不可能矛盾。'
,
auditWhy2
:(
n
)
=>
`已拆成
${
n
}
条带 时间·作者·来源 的 append-only 日志。`
,
auditWhy3
:
'没人强制填。Ledger 受控字段缺失即标红不过门。'
,
auditWhy4
:
'同一个"已解决"68 种写法,机器没法聚合。Ledger 用受控状态+证据指针。'
},
en
:{
title
:
listName
+
' · Issue/Task Ledger'
,
sub
:
`
${
S
.
total
}
structured objects · Real-time ·
${
S
.
today
}
`
,
audit
:
`① Excel Audit`
,
summary
:
`② Summary`
,
ownerSec
:
`Owner · Open Issues`
,
priSec
:
`By Priority`
,
workSec
:
`③ Workbench — Click row to expand`
,
fOwner
:
'All Owners'
,
fFinal
:
'All Status'
,
fPri
:
'All Priority'
,
fQ
:
'Search ID/title/desc…'
,
fOd
:
'Overdue only'
,
fOpen
:
'Open only'
,
thId
:
'ID'
,
thOwner
:
'Owner'
,
thPri
:
'Priority'
,
thFinal
:
'Final Status'
,
thPlan
:
'Plan Date'
,
thNlog
:
'Logs'
,
thTitle
:
'Title'
,
total
:
'Total'
,
done
:
'Completed'
,
sapDone
:
'SAP Done'
,
overdueN
:
'Overdue'
,
fsDist
:
'By Final Status'
,
ownerDist
:
'Owner · Open (Dispatch)'
,
priDist
:
'By Priority'
,
od
:
'⚠Overdue'
,
descLabel
:
'Description'
,
planLabel
:
'Current Plan'
,
histLabel
:
'Owner Change History'
,
logLabel
:
'Progress Log (append-only)'
,
footer
:
`Showing {n} / {t} · Click row to expand`
,
auditC
:
'Status contradictions'
,
auditLog
:
'Cells with handwritten logs'
,
auditPri
:
'Missing priority/category'
,
auditAcc
:
'Different acceptance formats'
,
auditWhy1
:
'SAP=Done but Final≠Done. Ledger derives final status — structurally impossible to contradict.'
,
auditWhy2
:(
n
)
=>
`Split into
${
n
}
append-only logs with time·author·source.`
,
auditWhy3
:
'No enforcement. Ledger marks missing fields red.'
,
auditWhy4
:
'68 ways to write "resolved". Ledger uses controlled states + evidence pointers.'
}
};
function
setLang
(
l
){
lang
=
l
;
document
.
getElementById
(
'btn-zh'
).
className
=
'lang-btn'
+
(
l
===
'zh'
?
' active'
:
''
);
document
.
getElementById
(
'btn-en'
).
className
=
'lang-btn'
+
(
l
===
'en'
?
' active'
:
''
);
const
t
=
L
[
l
];
document
.
getElementById
(
'h1'
).
textContent
=
t
.
title
;
document
.
getElementById
(
'sub'
).
textContent
=
t
.
sub
;
document
.
getElementById
(
'sec-audit'
).
textContent
=
t
.
audit
;
document
.
getElementById
(
'sec-summary'
).
textContent
=
t
.
summary
;
document
.
getElementById
(
'sec-owner'
).
textContent
=
t
.
ownerSec
;
document
.
getElementById
(
'sec-pri'
).
textContent
=
t
.
priSec
;
document
.
getElementById
(
'sec-work'
).
textContent
=
t
.
workSec
;
document
.
getElementById
(
'f_q'
).
placeholder
=
t
.
fQ
;
document
.
getElementById
(
'lbl-od'
).
textContent
=
t
.
fOd
;
document
.
getElementById
(
'lbl-open'
).
textContent
=
t
.
fOpen
;
document
.
querySelectorAll
(
'th[data-k]'
).
forEach
(
th
=>
{
const
k
=
th
.
dataset
.
k
;
th
.
textContent
=
t
[
'th'
+
k
.
charAt
(
0
).
toUpperCase
()
+
k
.
slice
(
1
)]
||
k
;
});
// Update selects
const
fO
=
document
.
getElementById
(
'f_owner'
);
const
fF
=
document
.
getElementById
(
'f_final'
);
const
fP
=
document
.
getElementById
(
'f_pri'
);
fO
.
options
[
0
].
text
=
t
.
fOwner
;
fF
.
options
[
0
].
text
=
t
.
fFinal
;
fP
.
options
[
0
].
text
=
t
.
fPri
;
render
();
}
// ① audit
// ① audit
if
(
S
.
audit
){
const
a
=
S
.
audit
;
const
t
=
L
[
lang
];
if
(
S
.
audit
){
const
a
=
S
.
audit
;
const
items
=
[
const
items
=
[
[
a
.
contradictions
,
'处状态自相矛盾'
,
'原表"SAP已完成"却"最终状态≠已完成"。Ledger 里最终状态是派生函数,结构上不可能矛盾。'
],
[
a
.
contradictions
,
t
.
auditC
,
t
.
auditWhy1
],
[
a
.
changelog_cells
,
'个单元格塞手写流水账'
,
`已拆成
${
S
.
total_logs
}
条带 时间·作者·来源 的 append-only 日志(点下方任意行看)。`
],
[
a
.
changelog_cells
,
t
.
auditLog
,
t
.
auditWhy2
(
S
.
total_logs
)],
[
a
.
missing_priority
+
'/'
+
a
.
missing_category
,
'缺优先级/缺分类'
,
'没人强制填。Ledger 受控字段缺失即标红不过门。'
],
[
a
.
missing_priority
+
'/'
+
a
.
missing_category
,
t
.
auditPri
,
t
.
auditWhy3
],
[
a
.
acc_distinct
,
'种"验收反馈"自由写法'
,
'同一个"已解决"68 种写法,机器没法聚合。Ledger 用受控状态+证据指针。'
]];
[
a
.
acc_distinct
,
t
.
auditAcc
,
t
.
auditWhy4
]];
document
.
getElementById
(
'audit'
).
innerHTML
=
items
.
map
(
x
=>
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
(
''
);
`<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">
No source Excel
</div>'
;}
}
else
{
document
.
getElementById
(
'audit'
).
innerHTML
=
'<div class="card">
未提供源 Excel,跳过体检
</div>'
;}
// ② top nums
// ② top nums
const
pct
=
(
n
)
=>
S
.
total
?
Math
.
round
(
n
/
S
.
total
*
100
):
0
;
const
pct
=
(
n
)
=>
S
.
total
?
Math
.
round
(
n
/
S
.
total
*
100
):
0
;
function
renderStats
(){
document
.
getElementById
(
'topnums'
).
innerHTML
=
[
const
t
=
L
[
lang
];
[
'good'
,
S
.
total
,
'问题总数'
,
''
],
document
.
getElementById
(
'topnums'
).
innerHTML
=
[
[
'good'
,
S
.
final_done
,
'最终已完成'
,
`SAP完成且用户验证 ·
${
pct
(
S
.
final_done
)}
%`
],
[
'good'
,
S
.
total
,
t
.
total
,
''
],
[
''
,
S
.
sap_done
,
'SAP 已完成'
,
`
${
pct
(
S
.
sap_done
)}
%(≠最终完成)`
],
[
'good'
,
S
.
final_done
,
t
.
done
,
`SAP done + verified ·
${
pct
(
S
.
final_done
)}
%`
],
[
'bad'
,
S
.
overdue
,
'超期未关闭'
,
'计划完成日已过'
]
[
''
,
S
.
sap_done
,
t
.
sapDone
,
`
${
pct
(
S
.
sap_done
)}
%`
],
].
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
(
''
);
[
'bad'
,
S
.
overdue
,
t
.
overdueN
,
'Plan date passed'
]
].
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
){
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
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'
};
const
mx
=
Math
.
max
(
1
,...
Object
.
values
(
obj
));
let
h
=
title
?
`<div class="sec" style="margin:0 0 8px">
${
title
}
</div>`
:
''
;
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
Map
[
k
]
||
'#5fa8ff'
}
"></i></div><span>
${
obj
[
k
]}
</span></div>`
).
join
(
''
);
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
;}
el
.
innerHTML
=
h
;}
dist
(
document
.
getElementById
(
'fsdist'
),
S
.
fs
,
fsOrder
,
S
.
total
,
'按最终状态(派生)'
);
function
renderDist
(){
dist
(
document
.
getElementById
(
'ownerdist'
),
S
.
owner_open
,
null
,
S
.
total
,
'各责任顾问 · 未关闭(调度)'
);
const
t
=
L
[
lang
];
dist
(
document
.
getElementById
(
'pridist'
),
S
.
pri
,[
'高'
,
'中'
,
'低'
,
'未定'
],
S
.
total
,
'按优先级'
);
const
fo
=
fsOrder
;
dist
(
document
.
getElementById
(
'fsdist'
),
S
.
fs
,
fo
,
S
.
total
,
t
.
fsDist
);
dist
(
document
.
getElementById
(
'ownerdist'
),
S
.
owner_open
,
null
,
S
.
total
,
t
.
ownerDist
);
dist
(
document
.
getElementById
(
'pridist'
),
S
.
pri
,[
'高'
,
'High'
,
'中'
,
'Medium'
,
'低'
,
'Low'
,
'未定'
,
'Unset'
],
S
.
total
,
t
.
priDist
);
}
// ③ table
// ③ table
function
opts
(
el
,
arr
,
all
){
el
.
innerHTML
=
`<option value="">
${
all
}
</option>`
+
arr
.
map
(
v
=>
`<option>
${
v
}
</option>`
).
join
(
''
);}
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
(),
L
.
zh
.
fOwner
);
opts
(
document
.
getElementById
(
'f_owner'
),[...
new
Set
(
DATA
.
map
(
d
=>
d
.
owner
))].
sort
(),
'全部责任顾问'
);
opts
(
document
.
getElementById
(
'f_final'
),
fsOrder
_zh
,
L
.
zh
.
fFinal
);
opts
(
document
.
getElementById
(
'f_final'
),
fsOrder
,
'全部状态'
);
opts
(
document
.
getElementById
(
'f_pri'
),[
'高'
,
'中'
,
'低'
,
'未定'
],
L
.
zh
.
fPri
);
opts
(
document
.
getElementById
(
'f_pri'
),[
'高'
,
'中'
,
'低'
,
'未定'
],
'全部优先级'
);
let
sortK
=
'id'
,
sortAsc
=
true
;
let
sortK
=
'id'
,
sortAsc
=
true
;
const
esc
=
s
=>
(
s
||
''
).
replace
(
/
[
&<>
]
/g
,
c
=>
({
'&'
:
'&'
,
'<'
:
'<'
,
'>'
:
'>'
}[
c
]));
const
esc
=
s
=>
(
s
||
''
).
replace
(
/
[
&<>
]
/g
,
c
=>
({
'&'
:
'&'
,
'<'
:
'<'
,
'>'
:
'>'
}[
c
]));
function
render
(){
function
render
(){
const
t
=
L
[
lang
];
const
isEn
=
lang
===
'en'
;
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
;
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
;
const
fsNow
=
isEn
?
fsOrder_en
:
fsOrder_zh
;
let
rows
=
DATA
.
filter
(
d
=>
(
!
fo
||
d
.
owner
===
fo
)
&&
(
!
ff
||
d
.
final
===
ff
)
&&
(
!
fp
||
d
.
priority
===
fp
)
let
rows
=
DATA
.
filter
(
d
=>
{
&&
(
!
od
||
d
.
overdue
)
&&
(
!
op
||
(
d
.
final
!==
'已完成'
&&
d
.
final
!==
'已关闭'
))
const
dPri
=
isEn
?
d
.
priority_en
:
d
.
priority
;
&&
(
!
q
||
(
d
.
id
+
d
.
title
+
d
.
desc
).
toLowerCase
().
includes
(
q
.
toLowerCase
())));
const
dFinal
=
isEn
?
mapFinalEn
(
d
.
final
):
d
.
final
;
return
(
!
fo
||
d
.
owner
===
fo
)
&&
(
!
ff
||
dFinal
===
ff
)
&&
(
!
fp
||
dPri
===
fp
)
&&
(
!
od
||
d
.
overdue
)
&&
(
!
op
||
(
dFinal
!==
'Completed'
&&
dFinal
!==
'Closed'
&&
d
.
final
!==
'已完成'
&&
d
.
final
!==
'已关闭'
))
&&
(
!
q
||
(
d
.
id
+
(
isEn
?
d
.
title_en
:
d
.
title
)
+
(
isEn
?
d
.
desc_en
:
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
)});
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
=>
{
tb
.
innerHTML
=
rows
.
map
(
d
=>
{
const
od
=
d
.
overdue
?
`<span class="od">
${
t
.
od
}
</span>`
:
''
;
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
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
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
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">
${
isEn
?
'Reassigned'
:
'转派'
}
</span></div>
${
esc
(
h
.
from
)}
→
${
esc
(
h
.
to
)}
:
${
esc
(
h
.
reason
||
''
)}
</div>`
).
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
(
''
);
const
title
=
isEn
?
d
.
title_en
:
d
.
title
;
const
cat
=
isEn
?
d
.
category_en
:
d
.
category
;
const
pri
=
isEn
?
d
.
priority_en
:
d
.
priority
;
const
sap
=
isEn
?
d
.
sap_en
:
d
.
sap
;
const
acc
=
isEn
?
d
.
acc_en
:
d
.
acc
;
const
final
=
isEn
?
mapFinalEn
(
d
.
final
):
d
.
final
;
const
descH
=
isEn
?
esc
(
d
.
desc_en
):
d
.
desc_html
;
return
`<tr class="issue" onclick="this.nextElementSibling.style.display=this.nextElementSibling.style.display==='table-row'?'none':'table-row'">
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-
${
pri
}
">
${
pri
}
</td>
<td>
${
d
.
id
}
</td><td>
${
esc
(
d
.
owner
)}
</td><td class="pr-
${
d
.
priority
}
">
${
d
.
priority
}
</td>
<td><span class="pill f-
${
final
}
">
${
final
}
</span></td><td>
${
d
.
plan
||
'—'
}${
od
}
</td><td>
${
d
.
nlog
}
</td><td>
${
esc
(
title
)}
</td></tr>
<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">
<tr class="detail" style="display:none"><td colspan="7"><div class="dbox">
<div class="kv"><b>
${
d
.
id
}
</b>
${
isEn
?
'Raised'
:
'提出'
}
:
${
esc
(
d
.
raised_dept
)}
/
${
esc
(
d
.
raised_by
)}
SAP:
${
sap
}
${
isEn
?
'Acceptance'
:
'验收'
}
:
${
acc
}
${
isEn
?
'Category'
:
'分类'
}
:
${
esc
(
cat
)}
${
lk
}
</div>
<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">
${
isEn
?
'Owner'
:
'责任顾问'
}
:
${
esc
(
d
.
owner
)}
${
attChips
}
</div>
<div class="kv">
责任顾问
:
${
esc
(
d
.
owner
)}
${
attChips
}
</div>
<div class="kv" style="white-space:pre-wrap">
${
t
.
descLabel
}
:
${
descH
}
</div>
<div class="kv" style="white-space:pre-wrap">
问题描述:
${
d
.
desc_html
}
</div>
<div class="kv">
${
t
.
planLabel
}
:
${
esc
(
d
.
plan_txt
)
||
'—'
}
</div>
<div class="kv">
当前方案
:
${
esc
(
d
.
plan_txt
)
||
'—'
}
</div>
<div class="sec" style="margin:12px 0 6px">
${
t
.
histLabel
}
</div>
<div class="sec" style="margin:12px 0 6px">
责任人变更历史
</div>
<div class="log">
${
ownerHist
||
'<div class="note">
'
+
(
isEn
?
'None'
:
'无'
)
+
'
</div>'
}
</div>
<div class="log">
${
ownerHist
||
'<div class="note">
无
</div>'
}
</div>
<div class="sec" style="margin:12px 0 6px">
${
t
.
logLabel
}
</div>
<div class="sec" style="margin:12px 0 6px">
进展日志(append-only)
</div>
<div class="log">
${
logs
||
'<div class="note">
'
+
(
isEn
?
'None'
:
'无'
)
+
'
</div>'
}
</div>
<div class="log">
${
logs
||
'<div class="note">
无
</div>'
}
</div>
</div></td></tr>`
;}).
join
(
''
);
</div></td></tr>`
;}).
join
(
''
);
foot
.
textContent
=
t
.
footer
.
replace
(
'{n}'
,
rows
.
length
).
replace
(
'{t}'
,
DATA
.
length
);
foot
.
textContent
=
`显示
${
rows
.
length
}
/
${
DATA
.
length
}
条 · 点行展开进展日志`
;
renderStats
();
renderDist
();
}
}
function
mapFinalEn
(
f
){
const
m
=
{
'已完成'
:
'Completed'
,
'已关闭'
:
'Closed'
,
'进行中'
:
'In Progress'
,
'进行中(返工)'
:
'Rework'
,
'待用户验证'
:
'Pending Verification'
,
'未开始'
:
'Not Started'
};
return
m
[
f
]
||
f
;
}
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
();});
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
));
[
'f_owner'
,
'f_final'
,
'f_pri'
,
'f_q'
,
'f_od'
,
'f_open'
].
forEach
(
id
=>
document
.
getElementById
(
id
).
addEventListener
(
'input'
,
render
));
setLang
(
'zh'
);
render
(
);
</script></body></html>
</script></body></html>
\ No newline at end of file
issues-ledger/issues/ISS-GEB-009.md
0 → 100644
View file @
156196ee
---
id
:
ISS-GEB-009
project
:
gebijia项目
title
:
车灯事业部产线组织变更
raised_dept
:
车灯事业部
raised_by
:
杨欣
owner
:
杨欣 <yangxin@bosi.com>
owner_history
:
-
{
from
:
杨欣
,
to
:
杨欣 <yangxin@bosi.com>
,
by
:
杨欣
,
date
:
2026-07-08
,
reason
:
新建指派
}
system
:
SAP
registered
:
2026-07-08
category
:
管理综合问题
priority
:
高
sap_status
:
已完成
acceptance
:
NA
plan_date
:
"
"
developer
:
"
"
evidence
:
[]
attachments
:
[]
source
:
新建
linked
:
[]
---
# ISS-GEB-009 车灯事业部产线组织变更
## 问题描述
车灯事业部的一条产线需要从原组织架构下变更到精密器件公司法人下,需要调整SAP组织架构(公司代码/工厂/利润中心/成本中心等)。
## 当前方案
调整SAP组织架构:车灯工厂利润中心取消,车灯成本中心编码调整
## 进展日志
-
2026-07-08 · 杨欣 ·
[
新建
]
· 创建问题;sap_status=未开始, acceptance=NA;owner=杨欣→杨欣
<yangxin@bosi.com>
(新建指派)
-
2026-07-08 · 杨欣 ·
[
更新
]
· 结论:调整SAP组织架构,车灯工厂、利润中心取消,车灯成本中心编码调整;(sap_status: 未开始→已完成,更新当前方案)
-
2026-07-08 · 杨欣 ·
[
更新
]
· 调整SAP组织架构,车灯工厂利润中心取消,车灯成本中心编码调整;(更新当前方案)
-
2026-08-04 · 杨欣 ·
[
迁移
]
· 从 gbjzd-issue-001 清单迁移至 gebijia-ops-26 清单(原ID: ISS-GB-001)
issues-ledger/issues/ISS-GEB-010.md
0 → 100644
View file @
156196ee
---
id
:
ISS-GEB-010
project
:
gebijia项目
title
:
OA同步物料主数据-分类视图缺新建API
raised_dept
:
项目组
raised_by
:
杨欣
owner
:
杨欣 <yangxin@bosi.com>
owner_history
:
-
{
from
:
杨欣
,
to
:
杨欣 <yangxin@bosi.com>
,
by
:
杨欣
,
date
:
2026-07-28
,
reason
:
新建指派
}
system
:
SAP
registered
:
2026-07-28
category
:
开发需求
priority
:
高
sap_status
:
未开始
acceptance
:
NA
plan_date
:
2026-08-30
developer
:
"
"
attachments
:
[]
source
:
新建
linked
:
[]
---
# ISS-GEB-010 OA同步物料主数据-分类视图缺新建API
## 问题描述
物料主数据通过OA系统同步到SAP系统,自动生成编码成功,但分类视图没有新建的API,导致分类视图数据无法通过OA自动同步到SAP。
## 当前方案
## 进展日志
-
2026-07-28 · 杨欣 ·
[
新建
]
· 创建问题;sap_status=未开始, acceptance=NA;owner=杨欣→杨欣
<yangxin@bosi.com>
(新建指派)
-
2026-08-04 · 杨欣 ·
[
迁移
]
· 从 gbjzd-issue-001 清单迁移至 gebijia-ops-26 清单(原ID: ISS-GB-002)
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