st-comp 0.0.209 → 0.0.211

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,12 +1,12 @@
1
1
  <script setup name="VarietySearch">
2
- import { watch, computed } from "vue";
2
+ import { watch, computed, provide } from "vue";
3
3
  import defaultConfig from "./config.js";
4
4
  import FactorScreen from "./components/FactorScreen/index.vue";
5
5
  import CommonIndicator from "./components/CommonIndicator/index.vue";
6
+ import CompositeOrder from "./components/CompositeOrder/index.vue";
6
7
 
7
8
  const props = defineProps({ config: { type: Object, default: {} } });
8
9
  const searchData = defineModel("searchData");
9
-
10
10
  searchData.value = Object.assign(searchData.value, {
11
11
  // 品种市场
12
12
  varietyMarket: null,
@@ -26,10 +26,12 @@ searchData.value = Object.assign(searchData.value, {
26
26
  list: [],
27
27
  sqlEnable: 0,
28
28
  sqlValue: null,
29
- factorSelectExpr: '',
29
+ factorSelectExpr: "",
30
30
  },
31
31
  // 常用指标
32
32
  commonIndicator: [],
33
+ // 组合排序
34
+ compositeOrder: [],
33
35
  });
34
36
 
35
37
  // 合并配置项
@@ -43,6 +45,7 @@ const config = computed(() => {
43
45
  });
44
46
  return result;
45
47
  });
48
+
46
49
  // 选项数据源: 品种市场
47
50
  const varietyMarketDict = computed(() => {
48
51
  return config.value.varietyMarket.options;
@@ -115,7 +118,7 @@ const clearRow = (key) => {
115
118
  list: [],
116
119
  sqlEnable: 0,
117
120
  sqlValue: null,
118
- factorSelectExpr: '',
121
+ factorSelectExpr: "",
119
122
  };
120
123
  break;
121
124
  }
@@ -123,6 +126,10 @@ const clearRow = (key) => {
123
126
  searchData.value[key] = [];
124
127
  break;
125
128
  }
129
+ case "compositeOrder": {
130
+ searchData.value[key] = [];
131
+ break;
132
+ }
126
133
  default: {
127
134
  searchData.value[key] = null;
128
135
  break;
@@ -155,6 +162,7 @@ watch(
155
162
  }
156
163
  );
157
164
 
165
+ provide("clearRow", clearRow);
158
166
  defineExpose({
159
167
  // 生成接口传参结构的数据
160
168
  formatData: (data) => {
@@ -438,6 +446,10 @@ defineExpose({
438
446
  };
439
447
  }
440
448
  }
449
+ // 8.组合分析
450
+ if (data.compositeOrder?.length) {
451
+ params.compositeOrder = data.compositeOrder.map(({ name, value }) => ({ name, value }));
452
+ }
441
453
  console.log("%c[st-varietySearch]: 接口传参数据生成完毕", "color: green", params);
442
454
  return params;
443
455
  },
@@ -462,10 +474,12 @@ defineExpose({
462
474
  list: [],
463
475
  sqlEnable: 0,
464
476
  sqlValue: null,
465
- factorSelectExpr: '',
477
+ factorSelectExpr: "",
466
478
  },
467
479
  // 常用指标
468
480
  commonIndicator: [],
481
+ // 组合排序
482
+ compositeOrder: [],
469
483
  };
470
484
  },
471
485
  });
@@ -474,137 +488,131 @@ defineExpose({
474
488
  <template>
475
489
  <div class="variety-search">
476
490
  <!-- 品种市场 -->
477
- <div
478
- v-if="config.varietyMarket?.show"
479
- class="variety-search-row"
480
- >
481
- <div class="title">
482
- <span>品种市场: </span>
483
- <span @click="clearRow('varietyMarket')">不限</span>
491
+ <template v-if="config.varietyMarket?.show">
492
+ <div class="variety-search-row">
493
+ <div class="title">
494
+ <span>品种市场: </span>
495
+ <span @click="clearRow('varietyMarket')">不限</span>
496
+ </div>
497
+ <el-radio-group
498
+ v-model="searchData.varietyMarket"
499
+ size="small"
500
+ >
501
+ <el-radio
502
+ v-for="{ label, value } in varietyMarketDict"
503
+ :label="label"
504
+ :value="value"
505
+ :key="value"
506
+ />
507
+ </el-radio-group>
484
508
  </div>
485
- <el-radio-group
486
- v-model="searchData.varietyMarket"
487
- size="small"
488
- >
489
- <el-radio
490
- v-for="{ label, value } in varietyMarketDict"
491
- :label="label"
492
- :value="value"
493
- :key="value"
494
- />
495
- </el-radio-group>
496
- </div>
509
+ </template>
497
510
  <!-- 常用选项 -->
498
- <div
499
- v-if="config.commonOption?.show && commonOptionDict.length"
500
- class="variety-search-row"
501
- >
502
- <div class="title">
503
- <span>常用选项: </span>
504
- <span @click="clearRow('commonOption')">不限</span>
511
+ <template v-if="config.commonOption?.show && commonOptionDict.length">
512
+ <div class="variety-search-row">
513
+ <div class="title">
514
+ <span>常用选项: </span>
515
+ <span @click="clearRow('commonOption')">不限</span>
516
+ </div>
517
+ <el-checkbox-group
518
+ v-model="searchData.commonOption"
519
+ size="small"
520
+ >
521
+ <el-checkbox
522
+ v-for="{ label, value } in commonOptionDict"
523
+ :label="label"
524
+ :value="value"
525
+ :key="value"
526
+ />
527
+ </el-checkbox-group>
505
528
  </div>
506
- <el-checkbox-group
507
- v-model="searchData.commonOption"
508
- size="small"
509
- >
510
- <el-checkbox
511
- v-for="{ label, value } in commonOptionDict"
512
- :label="label"
513
- :value="value"
514
- :key="value"
515
- />
516
- </el-checkbox-group>
517
- </div>
529
+ </template>
518
530
  <!-- 上市板块 -->
519
- <div
520
- v-if="config.marketIds?.show && marketIdsOptionDict.length"
521
- class="variety-search-row"
522
- >
523
- <div class="title">
524
- <span>上市板块: </span>
525
- <span @click="clearRow('marketIds')">不限</span>
531
+ <template v-if="config.marketIds?.show && marketIdsOptionDict.length">
532
+ <div class="variety-search-row">
533
+ <div class="title">
534
+ <span>上市板块: </span>
535
+ <span @click="clearRow('marketIds')">不限</span>
536
+ </div>
537
+ <el-checkbox-group
538
+ v-model="searchData.marketIds"
539
+ size="small"
540
+ >
541
+ <el-checkbox
542
+ v-for="{ label, value } in marketIdsOptionDict"
543
+ :label="label"
544
+ :value="value"
545
+ :key="value"
546
+ />
547
+ </el-checkbox-group>
526
548
  </div>
527
- <el-checkbox-group
528
- v-model="searchData.marketIds"
529
- size="small"
530
- >
531
- <el-checkbox
532
- v-for="{ label, value } in marketIdsOptionDict"
533
- :label="label"
534
- :value="value"
535
- :key="value"
536
- />
537
- </el-checkbox-group>
538
- </div>
549
+ </template>
539
550
  <!-- 自定标签 -->
540
- <div
541
- v-if="config.customTag?.show && customTagDict.length"
542
- class="variety-search-row"
543
- >
544
- <div class="title">
545
- <span>自定标签: </span>
546
- <span @click="clearRow('customTag')">不限</span>
551
+ <template v-if="config.customTag?.show && customTagDict.length">
552
+ <div class="variety-search-row">
553
+ <div class="title">
554
+ <span>自定标签: </span>
555
+ <span @click="clearRow('customTag')">不限</span>
556
+ </div>
557
+ <el-checkbox-group
558
+ v-model="searchData.customTag"
559
+ size="small"
560
+ >
561
+ <el-checkbox
562
+ v-for="{ label, value } in customTagDict"
563
+ :label="label"
564
+ :value="value"
565
+ :key="value"
566
+ />
567
+ </el-checkbox-group>
547
568
  </div>
548
- <el-checkbox-group
549
- v-model="searchData.customTag"
550
- size="small"
551
- >
552
- <el-checkbox
553
- v-for="{ label, value } in customTagDict"
554
- :label="label"
555
- :value="value"
556
- :key="value"
557
- />
558
- </el-checkbox-group>
559
- </div>
569
+ </template>
560
570
  <!-- 价差转换 -->
561
- <div
562
- v-if="config.jcTranslate?.show"
563
- class="variety-search-row"
564
- >
565
- <div class="title">
566
- <span>价差转换: </span>
567
- <span @click="clearRow('jcTranslate')">不限</span>
571
+ <template v-if="config.jcTranslate?.show">
572
+ <div class="variety-search-row">
573
+ <div class="title">
574
+ <span>价差转换: </span>
575
+ <span @click="clearRow('jcTranslate')">不限</span>
576
+ </div>
577
+ <el-radio-group
578
+ v-model="searchData.jcTranslate.type"
579
+ size="small"
580
+ >
581
+ <el-radio :value="2">价差转品种</el-radio>
582
+ <el-radio :value="1">品种转价差</el-radio>
583
+ </el-radio-group>
584
+ <el-select
585
+ v-show="searchData.jcTranslate.type === 1"
586
+ v-model="searchData.jcTranslate.jcList"
587
+ size="small"
588
+ multiple
589
+ collapse-tags
590
+ collapse-tags-tooltip
591
+ placeholder="请选择价差品种"
592
+ style="width: 140px"
593
+ >
594
+ <el-option
595
+ v-for="item in jcOptions"
596
+ :key="item.value"
597
+ :label="item.label"
598
+ :value="item.value"
599
+ />
600
+ </el-select>
568
601
  </div>
569
- <el-radio-group
570
- v-model="searchData.jcTranslate.type"
571
- size="small"
572
- >
573
- <el-radio :value="2">价差转品种</el-radio>
574
- <el-radio :value="1">品种转价差</el-radio>
575
- </el-radio-group>
576
- <el-select
577
- v-show="searchData.jcTranslate.type === 1"
578
- v-model="searchData.jcTranslate.jcList"
579
- size="small"
580
- multiple
581
- collapse-tags
582
- collapse-tags-tooltip
583
- placeholder="请选择价差品种"
584
- style="width: 140px"
585
- >
586
- <el-option
587
- v-for="item in jcOptions"
588
- :key="item.value"
589
- :label="item.label"
590
- :value="item.value"
591
- />
592
- </el-select>
593
- </div>
602
+ </template>
594
603
  <!-- 因子筛选 -->
595
- <div
596
- v-if="config.factorScreen?.show"
597
- class="variety-search-row"
598
- >
599
- <div class="title">
600
- <span>因子筛选: </span>
601
- <span @click="clearRow('factorScreen')">不限</span>
604
+ <template v-if="config.factorScreen?.show">
605
+ <div class="variety-search-row">
606
+ <div class="title">
607
+ <span>因子筛选: </span>
608
+ <span @click="clearRow('factorScreen')">不限</span>
609
+ </div>
610
+ <FactorScreen
611
+ v-model:data="searchData.factorScreen"
612
+ :config="config.factorScreen"
613
+ />
602
614
  </div>
603
- <FactorScreen
604
- v-model:data="searchData.factorScreen"
605
- :config="config.factorScreen"
606
- />
607
- </div>
615
+ </template>
608
616
  <!-- 常用指标 -->
609
617
  <CommonIndicator
610
618
  v-model:data="searchData.commonIndicator"
@@ -612,6 +620,13 @@ defineExpose({
612
620
  :commonOption="searchData.commonOption"
613
621
  :config="config.commonIndicator"
614
622
  />
623
+ <!-- 组合排序 -->
624
+ <CompositeOrder
625
+ v-model:data="searchData.compositeOrder"
626
+ :varietyMarket="searchData.varietyMarket"
627
+ :commonOption="searchData.commonOption"
628
+ :config="config.compositeOrder"
629
+ />
615
630
  </div>
616
631
  </template>
617
632
 
@@ -1,10 +1,12 @@
1
1
  <script setup>
2
2
  import axios from "axios";
3
- import { inject, ref, onMounted, computed } from "vue";
3
+ import { inject, ref, onMounted, computed, watch } from "vue";
4
4
  import { getAlarDict, getAlarFreq, getAlarFactor } from "./api.js";
5
5
 
6
6
  const { request } = inject("stConfig"); // 组件库全局配置
7
7
 
8
+ const searchData = ref({});
9
+
8
10
  const varietySearchRef = ref(null);
9
11
  const varietySearchData = ref({
10
12
  varietyMarket: null,
@@ -21,21 +23,87 @@ const varietySearchData = ref({
21
23
  sqlValue: null,
22
24
  },
23
25
  commonIndicator: [],
26
+ compositeOrder: [],
24
27
  });
25
28
  const varietySearchConfig = ref({});
26
29
 
27
30
  const data = ref();
31
+ const multipleTableRef = ref();
32
+ const orderByInfo = ref({ code: "asc" });
33
+ const sortable = ref("tableHeader");
28
34
 
29
35
  // 前端筛选条件格式化成API接口入参
30
36
  const apiParams = computed(() => {
31
37
  return { ...(varietySearchRef.value?.formatData(varietySearchData.value) ?? {}) };
32
38
  });
33
39
 
34
- // 查询数据
35
- const queryData = async () => {
36
- const { body } = await request.post("/common/qt/getFeatureInfosByPage", { ...apiParams.value, pageNum: 1, pageSize: 20 });
40
+ // 表格: 获取表格数据
41
+ const getTableData = async () => {
42
+ const params = {
43
+ ...apiParams.value,
44
+ pageNum: 1,
45
+ pageSize: 20,
46
+ };
47
+ /**
48
+ * @description: 根据用户最后一次操作交互的时机, 决定排序使用哪个维度
49
+ * 常规排序字段: orderByInfo
50
+ * 表头的orderByInfo和预警组的orderByInfo为顺序互斥, 谁最后操作就用谁
51
+ *
52
+ * 组合排序字段: compositeOrder
53
+ * 表头的orderByInfo与compositeOrder为顺序互斥, 谁最后操作就用谁
54
+ * 预警组的orderByInfo与compositeOrder为强制互斥, compositeOrder有值就一定优先使用compositeOrder
55
+ */
56
+ switch (sortable.value) {
57
+ case "tableHeader": {
58
+ delete params.compositeOrder; // 删除组合排序参数
59
+ params.orderByInfo = orderByInfo.value; // 传入常规排序参数
60
+ break;
61
+ }
62
+ case "alarmGroup": {
63
+ // 1. 如果存在组合排序, 那就直接使用组合排序
64
+ if (params.compositeOrder && params.compositeOrder.length) {
65
+ // 不进行额外处理
66
+ }
67
+ // 2. 如果不存在组合排序, 预警组选项存在
68
+ else if (searchData.value.groupId) {
69
+ orderByInfo.value = { orderByIndex: "asc" };
70
+ params.orderByInfo = orderByInfo.value;
71
+ }
72
+ // 3. 如果不存在组合排序, 预警组选项也不存在, 就传递常规排序初始值
73
+ else {
74
+ orderByInfo.value = { code: "asc" };
75
+ params.orderByInfo = orderByInfo.value;
76
+ multipleTableRef.value.clearSort();
77
+ }
78
+ break;
79
+ }
80
+ case "compositeOrder": {
81
+ multipleTableRef.value.clearSort(); // 清除表头排序样式
82
+ break;
83
+ }
84
+ }
85
+ console.log(params);
86
+ const { body } = await request.post("/common/qt/getFeatureInfosByPage", params);
37
87
  data.value = body.list;
38
88
  };
89
+ // 表格: 排序
90
+ const sortChange = ({ column, prop, order }) => {
91
+ const sortValueMap = new Map([
92
+ ["ascending", "asc"],
93
+ ["descending", "desc"],
94
+ ]);
95
+ if (order !== null) {
96
+ orderByInfo.value = {
97
+ [prop]: sortValueMap.get(order),
98
+ };
99
+ } else {
100
+ orderByInfo.value = {
101
+ code: "asc", //默认值
102
+ };
103
+ }
104
+ sortable.value = "tableHeader";
105
+ getTableData();
106
+ };
39
107
 
40
108
  onMounted(async () => {
41
109
  const dicAlar = await getAlarDict();
@@ -100,8 +168,21 @@ onMounted(async () => {
100
168
  commonIndicator: {
101
169
  show: true,
102
170
  },
171
+ // 组合排序 [选项: 组合默认]
172
+ compositeOrder: {
173
+ show: true,
174
+ },
103
175
  };
104
176
  });
177
+ watch(
178
+ () => varietySearchData.value.compositeOrder,
179
+ (newValue) => {
180
+ sortable.value = "compositeOrder";
181
+ },
182
+ {
183
+ deep: true,
184
+ }
185
+ );
105
186
  </script>
106
187
 
107
188
  <template>
@@ -111,10 +192,15 @@ onMounted(async () => {
111
192
  v-model:searchData="varietySearchData"
112
193
  :config="varietySearchConfig"
113
194
  />
114
- <el-divider content-position="left">格式化转为接口入参格式apiParams:</el-divider>
115
- <div>{{ apiParams }}</div>
116
- <el-divider content-position="left">结果内容, 分页为1, 页码为20:</el-divider>
117
- <el-button @click="queryData">查询测试</el-button>
195
+ <div>品种池组件接口参数: {{ apiParams }}</div>
196
+ <el-button
197
+ size="small"
198
+ type="primary"
199
+ @click="getTableData"
200
+ style="margin: 10px 0"
201
+ >
202
+ 查询测试
203
+ </el-button>
118
204
  <el-table
119
205
  class="alarm"
120
206
  ref="multipleTableRef"
@@ -122,6 +208,7 @@ onMounted(async () => {
122
208
  :stripe="true"
123
209
  :border="true"
124
210
  :data="data"
211
+ @sort-change="sortChange"
125
212
  >
126
213
  <el-table-column
127
214
  type="selection"
@@ -157,3 +244,9 @@ onMounted(async () => {
157
244
  </el-table>
158
245
  </div>
159
246
  </template>
247
+
248
+ <style lang="scss" scoped>
249
+ .alarm {
250
+ height: calc(100vh - 400px);
251
+ }
252
+ </style>