lambo-design-bi 0.0.251 → 0.0.252
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,46 +1,6 @@
|
|
|
1
1
|
import biConfig from "../../config/config"
|
|
2
2
|
import ajax from "@lambo-design/shared/utils/ajax"
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* 获取简报右侧摘要(data 阶段,单接口)
|
|
6
|
-
* 后端:GET /bs/bulletin/data/summary,服务端读四个 *_api_id 分别取数并归一为 BulletinSummary
|
|
7
|
-
* 前端直接使用返回结构,不再逐段请求。
|
|
8
|
-
*
|
|
9
|
-
* @param {*} bulletinWidgetId 简报控件 id
|
|
10
|
-
* @param {*} params 页面级查询条件
|
|
11
|
-
* @returns { code, data: { title, meta, conclusions[], metrics[], highlights[], risks[], advices[], warnings[] } }
|
|
12
|
-
*/
|
|
13
|
-
export function getBulletinSummary(bulletinWidgetId, params) {
|
|
14
|
-
return ajax.request({
|
|
15
|
-
url: biConfig.dataServerContext + '/bs/bulletin/data/summary',
|
|
16
|
-
method: 'get',
|
|
17
|
-
params: {
|
|
18
|
-
bulletinWidgetId: bulletinWidgetId,
|
|
19
|
-
params: JSON.stringify(params || {})
|
|
20
|
-
}
|
|
21
|
-
})
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* 查询简报已发布成品附件(data 阶段)
|
|
26
|
-
* 后端:GET /bs/bulletin/data/publishedDocs,读 plat_bulletin_publish_doc 中 is_publish='1',
|
|
27
|
-
* 按 bulletinWidgetId + params(期间按 period_type 落列 / 组织)过滤。
|
|
28
|
-
*
|
|
29
|
-
* @param {*} bulletinWidgetId 简报控件 id(= plat_bulletin.bulletin_id)
|
|
30
|
-
* @param {*} params 页面级查询条件(如 period / orgCode)
|
|
31
|
-
* @returns { code, data: [{ bulletinId, docId, docName, periodYear, comId, distCtId, publishTime, ... }] }
|
|
32
|
-
*/
|
|
33
|
-
export function getPublishedBulletinDocs(bulletinWidgetId, params) {
|
|
34
|
-
return ajax.request({
|
|
35
|
-
url: biConfig.dataServerContext + '/bs/bulletin/data/publishedDocs',
|
|
36
|
-
method: 'get',
|
|
37
|
-
params: {
|
|
38
|
-
bulletinWidgetId: bulletinWidgetId,
|
|
39
|
-
params: JSON.stringify(params || {})
|
|
40
|
-
}
|
|
41
|
-
})
|
|
42
|
-
}
|
|
43
|
-
|
|
44
4
|
/**
|
|
45
5
|
* 查询简报发布成品列表(data 阶段)
|
|
46
6
|
* 后端:GET /bs/bulletin/doc/list,按 简报×期间×组织 查已发布成品
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
<!-- eslint-disable -->
|
|
2
1
|
<template>
|
|
3
2
|
<div class="bulletin-widget">
|
|
4
3
|
<div class="bulletin-header" v-if="hasTitle || previewUrl">
|
|
@@ -6,20 +5,13 @@
|
|
|
6
5
|
<div class="bulletin-title">{{ cardTitle }}</div>
|
|
7
6
|
<div class="bulletin-subtitle" v-if="subTitle">{{ subTitle }}</div>
|
|
8
7
|
</div>
|
|
9
|
-
<div
|
|
10
|
-
v-if="previewUrl"
|
|
11
|
-
class="bulletin-download-btn"
|
|
12
|
-
title="下载简报"
|
|
13
|
-
@click="doDownload">
|
|
8
|
+
<div v-if="previewUrl" class="bulletin-download-btn" title="下载简报" @click="doDownload">
|
|
14
9
|
<Icon type="md-download" class="btn-icon" />
|
|
15
10
|
<span class="btn-text">下载</span>
|
|
16
11
|
</div>
|
|
17
12
|
</div>
|
|
18
13
|
|
|
19
|
-
<div
|
|
20
|
-
class="bulletin-body"
|
|
21
|
-
:class="{ 'is-empty': !previewUrl }"
|
|
22
|
-
:style="containerStyle || {}">
|
|
14
|
+
<div class="bulletin-body" :class="{ 'is-empty': !previewUrl }" :style="containerStyle || {}">
|
|
23
15
|
<div v-if="querying && !previewUrl" class="bulletin-placeholder">
|
|
24
16
|
<p>加载简报中…</p>
|
|
25
17
|
</div>
|
|
@@ -31,11 +23,7 @@
|
|
|
31
23
|
<p>尚未发布简报</p>
|
|
32
24
|
<p class="hint">该期间/组织暂无已发布的简报成品</p>
|
|
33
25
|
</div>
|
|
34
|
-
<lambo-doc-word
|
|
35
|
-
v-else
|
|
36
|
-
:url="previewUrl"
|
|
37
|
-
:key="previewUrl"
|
|
38
|
-
:report="summary"
|
|
26
|
+
<lambo-doc-word v-else :url="previewUrl" :key="previewUrl" :report="summary" :publisher="publisher"
|
|
39
27
|
:publish-time="publishTime" />
|
|
40
28
|
</div>
|
|
41
29
|
</div>
|
|
@@ -52,7 +40,6 @@ const LOG = '[BiBulletin]'
|
|
|
52
40
|
// 摘要空对象骨架,摘要内容未加载/缺省时兜底,避免 lambo-doc-word 内部空指针
|
|
53
41
|
const EMPTY_SUMMARY = Object.freeze({
|
|
54
42
|
title: '',
|
|
55
|
-
meta: '',
|
|
56
43
|
conclusions: [],
|
|
57
44
|
metrics: [],
|
|
58
45
|
highlights: [],
|
|
@@ -123,8 +110,10 @@ export default {
|
|
|
123
110
|
previewUrl: '',
|
|
124
111
|
lastDocId: '',
|
|
125
112
|
lastFileName: '',
|
|
126
|
-
//
|
|
113
|
+
// 简报发布时间(plat_bulletin_publish_doc.publish_time),展示在左侧目录下方
|
|
127
114
|
publishTime: '',
|
|
115
|
+
// 简报发布人(plat_bulletin_publish_doc.publish_user_name),展示在左侧目录下方
|
|
116
|
+
publisher: '',
|
|
128
117
|
// 空态原因:'' 无 / 'invalid' 查询条件不足(校验未过)/ 'empty' 已查询但无成品
|
|
129
118
|
emptyReason: '',
|
|
130
119
|
// 摘要:取自已发布成品行的 sum_json(plat_bulletin_publish_doc.sum_json),缺省为 null
|
|
@@ -184,6 +173,7 @@ export default {
|
|
|
184
173
|
this.lastFileName = ''
|
|
185
174
|
this.previewUrl = ''
|
|
186
175
|
this.publishTime = ''
|
|
176
|
+
this.publisher = ''
|
|
187
177
|
this.emptyReason = reason || ''
|
|
188
178
|
},
|
|
189
179
|
loadDoc(params) {
|
|
@@ -249,7 +239,8 @@ export default {
|
|
|
249
239
|
console.log(LOG, 'loadDoc 命中已发布成品,直接渲染', { docId: doc.docId, docName: doc.docName })
|
|
250
240
|
this.lastDocId = doc.docId
|
|
251
241
|
this.lastFileName = doc.docName || (this.cardTitle + '.docx')
|
|
252
|
-
//
|
|
242
|
+
// 发布人/发布时间统一展示在左侧目录下方(数据源 plat_bulletin_publish_doc)
|
|
243
|
+
this.publisher = doc.publishUserName ? String(doc.publishUserName).trim() : ''
|
|
253
244
|
this.publishTime = doc.publishTime ? `简报发布时间:${normalizePublishTime(doc.publishTime)}` : ''
|
|
254
245
|
this.previewUrl = fileGetUrl + doc.docId
|
|
255
246
|
this.emptyReason = ''
|
|
@@ -305,9 +296,6 @@ export default {
|
|
|
305
296
|
this.summaryData = null
|
|
306
297
|
return
|
|
307
298
|
}
|
|
308
|
-
// 库内 meta 是生成时的"统计时间",发布后以发布人为准(发布时间已在左侧目录下方展示)
|
|
309
|
-
const publisher = doc.publishUserName ? String(doc.publishUserName).trim() : ''
|
|
310
|
-
parsed.meta = publisher ? ('发布人:' + publisher) : ''
|
|
311
299
|
this.summaryData = parsed
|
|
312
300
|
console.log(LOG, 'applySummaryFromDoc 摘要已加载', {
|
|
313
301
|
docId: doc.docId,
|
|
@@ -353,15 +341,6 @@ export default {
|
|
|
353
341
|
console.log(LOG, 'created config 阶段解析', { widget: this.widget, options: this.bulletinOptions })
|
|
354
342
|
// config 阶段:由父页面完成配置装配,此处仅解析结构性配置
|
|
355
343
|
this.initConfig()
|
|
356
|
-
},
|
|
357
|
-
mounted() {
|
|
358
|
-
// params 已有值(父组件同步传入)→ 直接加载;否则等 watcher 触发
|
|
359
|
-
// if (this.params && Object.keys(this.params).length > 0) {
|
|
360
|
-
// console.log(LOG, 'mounted params 已就绪,直接加载', { params: this.params })
|
|
361
|
-
// this.loadData(this.params)
|
|
362
|
-
// } else {
|
|
363
|
-
// console.log(LOG, 'mounted params 为空,等 watcher 触发')
|
|
364
|
-
// }
|
|
365
344
|
}
|
|
366
345
|
}
|
|
367
346
|
</script>
|
|
@@ -370,6 +349,7 @@ export default {
|
|
|
370
349
|
.bulletin-widget {
|
|
371
350
|
width: 100%;
|
|
372
351
|
}
|
|
352
|
+
|
|
373
353
|
/* 自绘标题栏:左标题右按钮,无边框,仅与下方内容留间距 */
|
|
374
354
|
.bulletin-header {
|
|
375
355
|
display: flex;
|
|
@@ -378,27 +358,32 @@ export default {
|
|
|
378
358
|
gap: 12px;
|
|
379
359
|
padding: 0 0 3px;
|
|
380
360
|
}
|
|
361
|
+
|
|
381
362
|
.bulletin-title-wrap {
|
|
382
363
|
min-width: 0;
|
|
383
364
|
}
|
|
365
|
+
|
|
384
366
|
.bulletin-title {
|
|
385
367
|
font-size: 16px;
|
|
386
368
|
font-weight: 600;
|
|
387
369
|
color: #17233d;
|
|
388
370
|
line-height: 1.4;
|
|
389
371
|
}
|
|
372
|
+
|
|
390
373
|
.bulletin-subtitle {
|
|
391
374
|
margin-top: 2px;
|
|
392
375
|
color: #999;
|
|
393
376
|
font-size: 12px;
|
|
394
377
|
line-height: 1.4;
|
|
395
378
|
}
|
|
379
|
+
|
|
396
380
|
.bulletin-body {
|
|
397
381
|
width: 100%;
|
|
398
382
|
/* 视口自适应高度:吃满屏幕剩余空间,大屏不留白;减去的值覆盖页头/查询栏/简报标题栏/边距 */
|
|
399
383
|
height: calc(100vh - 210px);
|
|
400
384
|
min-height: 480px;
|
|
401
385
|
}
|
|
386
|
+
|
|
402
387
|
/* 下载按钮:标题栏右侧,文字链接式,主题蓝可点,hover 加深 */
|
|
403
388
|
.bulletin-download-btn {
|
|
404
389
|
flex-shrink: 0;
|
|
@@ -411,20 +396,25 @@ export default {
|
|
|
411
396
|
cursor: pointer;
|
|
412
397
|
transition: color 0.18s ease;
|
|
413
398
|
}
|
|
399
|
+
|
|
414
400
|
.bulletin-download-btn .btn-icon {
|
|
415
401
|
font-size: 16px;
|
|
416
402
|
}
|
|
403
|
+
|
|
417
404
|
.bulletin-download-btn:hover {
|
|
418
405
|
color: #57a3f3;
|
|
419
406
|
}
|
|
407
|
+
|
|
420
408
|
.bulletin-download-btn:active {
|
|
421
409
|
color: #2372c8;
|
|
422
410
|
}
|
|
411
|
+
|
|
423
412
|
/* 空态/加载态:无文档时高度自适应内容,避免撑出大片空白 */
|
|
424
413
|
.bulletin-body.is-empty {
|
|
425
414
|
height: auto;
|
|
426
415
|
min-height: 0;
|
|
427
416
|
}
|
|
417
|
+
|
|
428
418
|
.bulletin-placeholder {
|
|
429
419
|
width: 100%;
|
|
430
420
|
height: 100%;
|
|
@@ -439,14 +429,17 @@ export default {
|
|
|
439
429
|
border: 1px dashed #e2e8f0;
|
|
440
430
|
border-radius: 6px;
|
|
441
431
|
}
|
|
432
|
+
|
|
442
433
|
/* 空态容器高度自适应时,用内边距撑出紧凑高度而非塌陷 */
|
|
443
434
|
.bulletin-body.is-empty .bulletin-placeholder {
|
|
444
435
|
height: auto;
|
|
445
436
|
padding: 48px 16px;
|
|
446
437
|
}
|
|
438
|
+
|
|
447
439
|
.bulletin-placeholder p {
|
|
448
440
|
margin: 0;
|
|
449
441
|
}
|
|
442
|
+
|
|
450
443
|
.bulletin-placeholder .hint {
|
|
451
444
|
font-size: 12px;
|
|
452
445
|
color: #cbd5e1;
|
package/package.json
CHANGED
package/pub/doc/word/index.vue
CHANGED
|
@@ -8,7 +8,6 @@
|
|
|
8
8
|
<Icon type="ios-arrow-back" />
|
|
9
9
|
</span>
|
|
10
10
|
</div>
|
|
11
|
-
<div class="word-nav-publish" v-if="publishTime">{{ publishTime }}</div>
|
|
12
11
|
<div v-if="!ready" class="word-nav-empty">解析中…</div>
|
|
13
12
|
<div v-else-if="!toc.length" class="word-nav-empty">未识别到章节目录</div>
|
|
14
13
|
<a
|
|
@@ -18,6 +17,10 @@
|
|
|
18
17
|
:class="['level-' + item.level, { active: activeId === item.id }]"
|
|
19
18
|
@click="scrollTo(item)"
|
|
20
19
|
>{{ item.text }}</a>
|
|
20
|
+
<div class="word-nav-publish" v-if="publisher || publishTime">
|
|
21
|
+
<div v-if="publisher" class="meta-line">发布人:{{ publisher }}</div>
|
|
22
|
+
<div v-if="publishTime" class="meta-line">{{ publishTime }}</div>
|
|
23
|
+
</div>
|
|
21
24
|
</aside>
|
|
22
25
|
<!-- 左侧折叠窄条 -->
|
|
23
26
|
<div class="word-rail word-rail-left" v-else title="展开目录" @click="toggleNav">
|
|
@@ -46,7 +49,6 @@
|
|
|
46
49
|
<Icon type="ios-arrow-forward" />
|
|
47
50
|
</span>
|
|
48
51
|
<div class="paper-title" v-if="internalReport.title">{{ internalReport.title }}</div>
|
|
49
|
-
<div class="paper-meta" v-if="internalReport.meta">{{ internalReport.meta }}</div>
|
|
50
52
|
|
|
51
53
|
<!-- 1. 核心结论(数据为空时整段隐藏,含标题) -->
|
|
52
54
|
<div class="summary-section" v-if="internalReport.conclusions && internalReport.conclusions.length">
|
|
@@ -121,47 +123,18 @@ export default {
|
|
|
121
123
|
type: Object,
|
|
122
124
|
default: null
|
|
123
125
|
},
|
|
124
|
-
//
|
|
126
|
+
// 简报发布人(plat_bulletin_publish_doc.publish_user_name),展示在目录下方
|
|
127
|
+
publisher: {
|
|
128
|
+
type: String,
|
|
129
|
+
default: ""
|
|
130
|
+
},
|
|
131
|
+
// 简报发布时间(plat_bulletin_publish_doc.publish_time),展示在目录下方
|
|
125
132
|
publishTime: {
|
|
126
133
|
type: String,
|
|
127
134
|
default: ""
|
|
128
135
|
}
|
|
129
136
|
},
|
|
130
137
|
data() {
|
|
131
|
-
// 内置模拟摘要 —— 作为未传 report 时的 fallback,同时保留原 demo 页面观感
|
|
132
|
-
const defaultReport = {
|
|
133
|
-
title: "文档摘要",
|
|
134
|
-
meta: "2025年全省系统卷烟物流费用及对标指标情况通报",
|
|
135
|
-
conclusions: [
|
|
136
|
-
"2025年全省物流费用全面攀升,总量增幅28.72%",
|
|
137
|
-
"单箱费用增幅67.34%",
|
|
138
|
-
"人工成本占比近七成是主因",
|
|
139
|
-
"各单位间差距悬殊"
|
|
140
|
-
],
|
|
141
|
-
metrics: [
|
|
142
|
-
{ name: "物流总费用", value: "2279.53万元", change: "+28.72%", trend: "up-bad" },
|
|
143
|
-
{ name: "单箱物流费用", value: "10912.47元/箱", change: "+67.34%", trend: "up-bad" },
|
|
144
|
-
{ name: "人工费用占比", value: "69.53%", change: "+3.42个百分点", trend: "up-bad" },
|
|
145
|
-
{ name: "物流费用率", value: "27.11%", change: "+4.88个百分点", trend: "up-bad" },
|
|
146
|
-
{ name: "单箱可控费用", value: "1579.56元/箱", change: "-43.69%", trend: "down-good" }
|
|
147
|
-
],
|
|
148
|
-
highlights: [
|
|
149
|
-
"扣除人工折旧后单箱可控费用同比下降43.69%",
|
|
150
|
-
"10家单位实现下降,精细化管理初显成效",
|
|
151
|
-
"咸阳市公司物流总费用降幅33.66%,全省最大"
|
|
152
|
-
],
|
|
153
|
-
risks: [
|
|
154
|
-
"配送费用激增67.13%,占物流总费用六成",
|
|
155
|
-
"单箱配送费用增幅70.99%,成本管控压力大",
|
|
156
|
-
"各单位指标差异悬殊,单箱费用最高与最低相差2.6倍",
|
|
157
|
-
"对标短板明显"
|
|
158
|
-
],
|
|
159
|
-
advices: [
|
|
160
|
-
"重点管控配送环节成本,优化送货线路与车辆调度",
|
|
161
|
-
"推广咸阳市降本经验,组织落后单位专项对标改进",
|
|
162
|
-
"关注人工成本刚性增长趋势,探索外包与自动化替代方案"
|
|
163
|
-
]
|
|
164
|
-
};
|
|
165
138
|
return {
|
|
166
139
|
ready: false,
|
|
167
140
|
toc: [],
|
|
@@ -172,8 +145,7 @@ export default {
|
|
|
172
145
|
docRoot: null,
|
|
173
146
|
scrollEl: null,
|
|
174
147
|
// 右侧摘要(优先使用外部 report prop,缺失时回退到内置模拟数据)
|
|
175
|
-
internalReport: this.report
|
|
176
|
-
defaultReport: defaultReport,
|
|
148
|
+
internalReport: this.report,
|
|
177
149
|
// 折叠状态(从 localStorage 恢复,容错降级为默认展开)
|
|
178
150
|
navCollapsed: this.readCollapsed(NAV_COLLAPSE_KEY),
|
|
179
151
|
asideCollapsed: this.readCollapsed(ASIDE_COLLAPSE_KEY)
|
|
@@ -181,7 +153,7 @@ export default {
|
|
|
181
153
|
},
|
|
182
154
|
watch: {
|
|
183
155
|
report(v) {
|
|
184
|
-
this.internalReport = v
|
|
156
|
+
this.internalReport = v
|
|
185
157
|
},
|
|
186
158
|
url: {
|
|
187
159
|
immediate: true,
|
|
@@ -595,13 +567,18 @@ export default {
|
|
|
595
567
|
color: #1e40af;
|
|
596
568
|
font-weight: 700;
|
|
597
569
|
}
|
|
598
|
-
/*
|
|
570
|
+
/* 文档目录底部:简报发布人 / 发布时间 */
|
|
599
571
|
.word-nav-publish {
|
|
600
|
-
margin:
|
|
572
|
+
margin-top: 10px;
|
|
573
|
+
padding-top: 8px;
|
|
574
|
+
border-top: 1px solid #eef1f5;
|
|
601
575
|
font-size: 11px;
|
|
602
576
|
color: #64748b;
|
|
603
577
|
line-height: 1.6;
|
|
604
578
|
}
|
|
579
|
+
.word-nav-publish .meta-line {
|
|
580
|
+
margin: 0;
|
|
581
|
+
}
|
|
605
582
|
|
|
606
583
|
/* 中间 Word 预览 */
|
|
607
584
|
.word-doc {
|
|
@@ -648,11 +625,6 @@ export default {
|
|
|
648
625
|
/* 给右上角悬浮收起按钮让位 */
|
|
649
626
|
padding-right: 26px;
|
|
650
627
|
}
|
|
651
|
-
.paper-meta {
|
|
652
|
-
font-size: 11px;
|
|
653
|
-
color: #64748b;
|
|
654
|
-
margin-bottom: 6px;
|
|
655
|
-
}
|
|
656
628
|
/* 摘要分区 */
|
|
657
629
|
.summary-section {
|
|
658
630
|
margin-bottom: 18px;
|