imeik-bizui 2.6.6 → 2.6.7

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.
@@ -2,7 +2,7 @@
2
2
  通用「底价明细」弹窗(纯展示,无接口依赖)
3
3
  - 顶部汇总:由 Dashboard 传入概览产品行
4
4
  - 下方三区(销售订单 / 非销出库 / 销售费用)等分三列并排
5
- - 三列卡片按内容收高(不强制等高撑白),表格按当前页行数自适应、无内部滚动条
5
+ - 三列卡片等高:表格固定高度按 pageSize 撑开,合计底对齐
6
6
  - 分区数据前端分页(pageSize);无底部关闭按钮,右上角关闭即可
7
7
  -->
8
8
  <template>
@@ -22,13 +22,8 @@
22
22
  >
23
23
  <div v-if="error" class="fpd-msg fpd-msg--error">{{ error }}</div>
24
24
 
25
- <!-- 首次加载无内容时用骨架撑住高度,避免先闪出一条窄框 -->
25
+ <!-- 首次加载无内容时用骨架撑住高度,避免先闪出一条窄框;计算说明骨架仍在底部 -->
26
26
  <div v-else-if="showLoadingShell" class="fpd-skeleton" aria-hidden="true">
27
- <div class="fpd-skeleton__formulas">
28
- <div class="fpd-skeleton__bar fpd-skeleton__bar--label" />
29
- <div class="fpd-skeleton__bar fpd-skeleton__bar--md" />
30
- <div class="fpd-skeleton__bar fpd-skeleton__bar--sm" />
31
- </div>
32
27
  <div class="fpd-skeleton__summary">
33
28
  <div class="fpd-skeleton__bar fpd-skeleton__bar--lg" />
34
29
  <div class="fpd-skeleton__bar" />
@@ -41,26 +36,15 @@
41
36
  <div class="fpd-skeleton__bar fpd-skeleton__bar--footer" />
42
37
  </div>
43
38
  </div>
39
+ <div class="fpd-skeleton__formulas">
40
+ <div class="fpd-skeleton__bar fpd-skeleton__bar--label" />
41
+ <div class="fpd-skeleton__bar fpd-skeleton__bar--md" />
42
+ <div class="fpd-skeleton__bar fpd-skeleton__bar--sm" />
43
+ </div>
44
44
  </div>
45
45
 
46
46
  <template v-else>
47
- <div v-if="formulaItems.length" class="fpd-formulas" role="note">
48
- <span class="fpd-formulas__label">计算说明</span>
49
- <div class="fpd-formulas__list">
50
- <span
51
- v-for="(item, idx) in formulaItems"
52
- :key="idx"
53
- class="fpd-formulas__item"
54
- >
55
- <em class="fpd-formulas__key">{{ item.key }}</em>
56
- <span class="fpd-formulas__eq">=</span>
57
- <span class="fpd-formulas__expr">{{ item.expr }}</span>
58
- </span>
59
- </div>
60
- </div>
61
-
62
47
  <div v-if="summaryColumns.length" class="fpd-summary">
63
- <div v-if="isNarrow" class="fpd-summary__hint">汇总表可左右滑动</div>
64
48
  <el-table
65
49
  :data="summaryRows"
66
50
  border
@@ -107,7 +91,6 @@
107
91
  <div class="fpd-section__head">
108
92
  <span class="fpd-section__title">{{ section.title }}</span>
109
93
  <span v-if="section.subtitle" class="fpd-section__subtitle">{{ section.subtitle }}</span>
110
- <span v-if="isNarrow" class="fpd-section__hint">左右滑动查看完整信息</span>
111
94
  </div>
112
95
 
113
96
  <div class="fpd-section__table-wrap">
@@ -116,6 +99,7 @@
116
99
  border
117
100
  size="small"
118
101
  class="fpd-table fpd-table--section"
102
+ :height="resolvedTableHeight"
119
103
  :header-cell-style="headerCellStyle"
120
104
  >
121
105
  <el-table-column
@@ -166,6 +150,22 @@
166
150
  </div>
167
151
  </div>
168
152
  </div>
153
+
154
+ <!-- 计算说明固定底部:有表格内容后再渲染,避免加载时单独成一条窄框 -->
155
+ <div v-if="formulaItems.length && hasDetailContent" class="fpd-formulas" role="note">
156
+ <span class="fpd-formulas__label">计算说明</span>
157
+ <div class="fpd-formulas__list">
158
+ <span
159
+ v-for="(item, idx) in formulaItems"
160
+ :key="idx"
161
+ class="fpd-formulas__item"
162
+ >
163
+ <em class="fpd-formulas__key">{{ item.key }}</em>
164
+ <span class="fpd-formulas__eq">=</span>
165
+ <span class="fpd-formulas__expr">{{ item.expr }}</span>
166
+ </span>
167
+ </div>
168
+ </div>
169
169
  </template>
170
170
  </div>
171
171
  </el-dialog>
@@ -236,16 +236,17 @@ export default {
236
236
  default: null
237
237
  },
238
238
  /**
239
- * 骨架屏占位高度(表格本身按当前页行数自适应,不再用固定 height,避免内部滚动条)
239
+ * 三区表格统一高度(按 pageSize 撑满),数量少也留白对齐
240
+ * 可传 tableHeight 覆盖
240
241
  */
241
242
  tableHeight: {
242
243
  type: [Number, String],
243
- default: 180
244
+ default: null
244
245
  },
245
- /** 分区前端分页大小(略少以控制弹窗总高) */
246
+ /** 分区前端分页大小 */
246
247
  pageSize: {
247
248
  type: Number,
248
- default: 4
249
+ default: 5
249
250
  }
250
251
  },
251
252
  data() {
@@ -274,11 +275,16 @@ export default {
274
275
  resolvedTop() {
275
276
  return this.isNarrow ? '5vh' : this.top
276
277
  },
277
- /** 仅骨架屏使用;真实表格按页内行数撑开,不设固定 height */
278
+ /** 三区表格等高:优先用 prop,否则按 pageSize × 行高推算 */
278
279
  resolvedTableHeight() {
279
- const base = Number(this.tableHeight)
280
- const fallback = Number.isFinite(base) && base > 0 ? base : 220
281
- return this.isNarrow ? Math.min(fallback, 180) : fallback
280
+ const override = Number(this.tableHeight)
281
+ if (Number.isFinite(override) && override > 0) {
282
+ return this.isNarrow ? Math.min(override, 200) : override
283
+ }
284
+ const size = this.pageSize || 5
285
+ const rowH = this.isNarrow ? 38 : 40
286
+ const headH = this.isNarrow ? 36 : 38
287
+ return headH + size * rowH
282
288
  },
283
289
  formulaList() {
284
290
  if (Array.isArray(this.formulas)) return this.formulas
@@ -301,13 +307,13 @@ export default {
301
307
  return (this.summaryColumns && this.summaryColumns.length > 0) ||
302
308
  (this.sections && this.sections.length > 0)
303
309
  },
304
- /** 首次打开尚无数据:用骨架撑高,避免窄框闪一下 */
310
+ /** 首次打开尚无数据:用骨架撑高;计算说明不单独先行渲染 */
305
311
  showLoadingShell() {
306
312
  return this.loading && !this.error && !this.hasDetailContent
307
313
  },
308
314
  /** 任一分区需要分页时,其余无分页列才占位对齐;全都没有则不占空白 */
309
315
  anySectionNeedsPager() {
310
- const size = this.pageSize || 4
316
+ const size = this.pageSize || 5
311
317
  return (this.sections || []).some((section) => this.sectionRowCount(section) > size)
312
318
  },
313
319
  /** 窄屏三区已改为单列,无需为空分页占位 */
@@ -385,7 +391,7 @@ export default {
385
391
  pagedRows(section) {
386
392
  const rows = section.rows || []
387
393
  const page = this.sectionPage(section)
388
- const size = this.pageSize || 4
394
+ const size = this.pageSize || 5
389
395
  const start = (page - 1) * size
390
396
  return rows.slice(start, start + size)
391
397
  },
@@ -579,6 +585,7 @@ export default {
579
585
  }
580
586
 
581
587
  .fpd-skeleton__formulas {
588
+ margin-top: auto;
582
589
  padding: 8px 12px;
583
590
  background: #eef3ff;
584
591
  border: 1px solid #d6e0f5;
@@ -658,23 +665,19 @@ export default {
658
665
  border-radius: 8px;
659
666
  }
660
667
 
661
- .fpd-summary__hint {
662
- display: none;
663
- }
664
-
665
668
  .fpd-sections {
666
669
  display: grid;
667
670
  grid-template-columns: minmax(0, 1.2fr) minmax(0, 1.05fr) minmax(0, 0.9fr);
668
671
  gap: 10px;
669
- margin-bottom: 0;
670
- align-items: start;
672
+ margin-bottom: 10px;
673
+ align-items: stretch;
671
674
  }
672
675
 
673
676
  .fpd-section {
674
677
  display: flex;
675
678
  flex-direction: column;
676
679
  min-width: 0;
677
- min-height: 0;
680
+ height: 100%;
678
681
  border: 1px solid #e5e7eb;
679
682
  border-radius: 8px;
680
683
  overflow: hidden;
@@ -706,13 +709,10 @@ export default {
706
709
  color: #8f959e;
707
710
  }
708
711
 
709
- .fpd-section__hint {
710
- display: none;
711
- }
712
-
713
712
  .fpd-section__table-wrap {
714
- flex: 0 0 auto;
713
+ flex: 1 1 auto;
715
714
  min-width: 0;
715
+ min-height: 0;
716
716
  overflow-x: auto;
717
717
  overflow-y: hidden;
718
718
  -webkit-overflow-scrolling: touch;
@@ -720,6 +720,7 @@ export default {
720
720
 
721
721
  .fpd-section__footer {
722
722
  flex-shrink: 0;
723
+ margin-top: auto;
723
724
  display: flex;
724
725
  justify-content: space-between;
725
726
  align-items: center;
@@ -805,6 +806,11 @@ export default {
805
806
  border-bottom: none;
806
807
  }
807
808
 
809
+ /* 分区表固定等高后,末行下方有留白,需保留底部分隔线 */
810
+ &.fpd-table--section .el-table__body tr:last-child td.el-table__cell {
811
+ border-bottom: 1px solid #eef0f3;
812
+ }
813
+
808
814
  .cell {
809
815
  padding: 12px 16px;
810
816
  line-height: 22px;
@@ -834,20 +840,20 @@ export default {
834
840
  }
835
841
  }
836
842
 
837
- /* 分区表略收紧行高,一页内更紧凑且无内部滚动 */
843
+ /* 分区表行高与汇总表接近,避免过扁难读 */
838
844
  ::v-deep .fpd-table--section {
839
845
  .cell {
840
- padding-top: 6px;
841
- padding-bottom: 6px;
842
- line-height: 18px;
846
+ padding-top: 10px;
847
+ padding-bottom: 10px;
848
+ line-height: 20px;
843
849
  }
844
850
 
845
851
  th .cell {
846
- padding-top: 6px;
847
- padding-bottom: 6px;
852
+ padding-top: 9px;
853
+ padding-bottom: 9px;
848
854
  }
849
855
 
850
- /* 无固定 height 时仍兜底隐藏纵向滚动条 */
856
+ /* 固定等高后仍隐藏纵向滚动条(分页控制行数) */
851
857
  .el-table__body-wrapper {
852
858
  overflow-y: hidden !important;
853
859
  }
@@ -903,7 +909,8 @@ export default {
903
909
  display: flex;
904
910
  align-items: center;
905
911
  gap: 8px 10px;
906
- margin-bottom: 10px;
912
+ margin-top: 0;
913
+ margin-bottom: 0;
907
914
  padding: 6px 10px;
908
915
  border-radius: 6px;
909
916
  background: linear-gradient(90deg, #eef4ff 0%, #f5f8ff 100%);
@@ -996,28 +1003,14 @@ export default {
996
1003
  box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
997
1004
  }
998
1005
 
999
- .fpd-summary__hint,
1000
- .fpd-section__hint {
1001
- display: block;
1002
- padding: 0;
1003
- font-size: 11px;
1004
- line-height: 16px;
1005
- color: #8f959e;
1006
- font-weight: 400;
1007
- }
1008
-
1009
- .fpd-summary__hint {
1010
- padding: 8px 12px 0;
1011
- }
1012
-
1013
1006
  .fpd-sections {
1014
1007
  gap: 12px;
1015
- margin-bottom: 0;
1016
- align-items: start;
1008
+ margin-bottom: 12px;
1009
+ align-items: stretch;
1017
1010
  }
1018
1011
 
1019
1012
  .fpd-section {
1020
- min-height: 0;
1013
+ height: auto;
1021
1014
  border-radius: 10px;
1022
1015
  border-color: #e8ebf0;
1023
1016
  box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
@@ -1101,7 +1094,8 @@ export default {
1101
1094
  flex-direction: column;
1102
1095
  gap: 6px;
1103
1096
  padding: 8px 10px 8px 12px;
1104
- margin-bottom: 12px;
1097
+ margin-top: 0;
1098
+ margin-bottom: 0;
1105
1099
  }
1106
1100
 
1107
1101
  .fpd-formulas__label {