st-comp 0.0.246 → 0.0.248

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.
Files changed (92) hide show
  1. package/es/ChartLayout.js +4 -4
  2. package/es/CustomFunction.js +42 -42
  3. package/es/FactorWarning.js +33 -33
  4. package/es/Kline.js +17 -17
  5. package/es/KlineBasic.cjs +1 -1
  6. package/es/KlineBasic.js +520 -512
  7. package/es/KlineConfig.js +61 -61
  8. package/es/KlineNew.js +16 -16
  9. package/es/KlinePlus.cjs +4 -4
  10. package/es/KlinePlus.js +589 -575
  11. package/es/LinearLegend.cjs +1 -1
  12. package/es/LinearLegend.js +1 -63
  13. package/es/MonacoEditor.js +24 -24
  14. package/es/Pagination.js +73 -73
  15. package/es/PasswordPrompt.js +3 -3
  16. package/es/Table.js +38 -38
  17. package/es/User.js +44 -44
  18. package/es/VarSelectDialog.js +25 -25
  19. package/es/VarietyAutoComplete.js +10 -10
  20. package/es/VarietySearch.js +38 -38
  21. package/es/{VarietySelect-5a9dd50b.js → VarietySelect-b9fe3000.js} +4 -4
  22. package/es/VarietyTextCopy.cjs +3 -3
  23. package/es/VarietyTextCopy.js +15 -15
  24. package/es/VirtualTable.js +14 -14
  25. package/es/{_initCloneObject-c34c65bc.js → _initCloneObject-382335b2.js} +7 -7
  26. package/es/{base-a5af3db3.js → base-ff0e366f.js} +40 -40
  27. package/es/{castArray-7741a212.js → castArray-15070be9.js} +1 -1
  28. package/es/{config-provider-06a63185.js → config-provider-2e85eee8.js} +6 -6
  29. package/es/{debounce-8d53f4dd.js → debounce-e9e47f9a.js} +1 -1
  30. package/es/{dropdown-302f71e7.js → dropdown-2b35a683.js} +13 -13
  31. package/es/{el-autocomplete-ed75a659.js → el-autocomplete-18be2c5a.js} +16 -16
  32. package/es/{el-button-d09ff85f.js → el-button-f08c0639.js} +39 -39
  33. package/es/{el-checkbox-64648e02.js → el-checkbox-058dba2d.js} +31 -31
  34. package/es/{el-dialog-6a80e3d8.js → el-dialog-d328e0d8.js} +15 -15
  35. package/es/{el-divider-4e059794.js → el-divider-4fe55ebe.js} +1 -1
  36. package/es/{el-empty-33cb66f1.js → el-empty-ceecb81c.js} +5 -5
  37. package/es/{el-form-item-4eca95be.js → el-form-item-cb328886.js} +36 -36
  38. package/es/{el-input-cae60510.js → el-input-0f6ead19.js} +50 -50
  39. package/es/{el-input-number-c2499410.js → el-input-number-66e68609.js} +36 -36
  40. package/es/{el-loading-c738468d.js → el-loading-412370c7.js} +5 -5
  41. package/es/{el-menu-item-f904f685.js → el-menu-item-0ee8ad18.js} +22 -22
  42. package/es/{el-message-box-05d8cf39.js → el-message-box-6db52b29.js} +11 -11
  43. package/es/{el-message-0df23ae7.js → el-message-e6c755df.js} +23 -23
  44. package/es/{el-overlay-cc9bc792.js → el-overlay-981f8d49.js} +56 -56
  45. package/es/{el-popconfirm-a6f66a0e.js → el-popconfirm-005013fa.js} +20 -20
  46. package/es/{el-popper-a38874f4.js → el-popper-fdc7c793.js} +109 -109
  47. package/es/{el-segmented-51b1c797.js → el-segmented-050d0090.js} +8 -8
  48. package/es/{el-select-1b149fab.js → el-select-23a1f302.js} +64 -64
  49. package/es/{el-table-column-3e30ebae.js → el-table-column-d0c374cf.js} +15 -15
  50. package/es/{el-tag-0a25efdf.js → el-tag-f13f463b.js} +15 -15
  51. package/es/{el-text-73d899ff.js → el-text-27cef2be.js} +2 -2
  52. package/es/{index-42e59bf5.js → index-09bd2621.js} +43 -43
  53. package/es/{index-94e43e0d.js → index-15b9603e.js} +3 -3
  54. package/es/{index-960806da.js → index-269b8a8c.js} +36 -36
  55. package/es/{index-54d289d1.js → index-4a3f30c5.js} +12 -12
  56. package/es/{index-6e967429.js → index-80a7ad32.js} +17 -17
  57. package/es/{index-d77a7336.js → index-93a8960e.js} +1 -1
  58. package/es/{index-4194c942.js → index-b937ea22.js} +2 -2
  59. package/es/{index-ac98a4d8.js → index-c266c23a.js} +10 -10
  60. package/es/{index-6806997d.js → index-e0901394.js} +34 -34
  61. package/es/{index-87b4bf61.js → index-ec7ad93f.js} +31 -31
  62. package/es/{python-a914569a.js → python-823b276b.js} +24 -24
  63. package/es/raf-8e05a7f4.js +6 -0
  64. package/es/{scroll-679bd6bf.js → scroll-41b4f625.js} +5 -5
  65. package/es/style.css +1 -1
  66. package/es/{use-form-common-props-47e50c10.js → use-form-common-props-631cacae.js} +65 -65
  67. package/es/{use-global-config-f52caea0.js → use-global-config-5d001623.js} +14 -14
  68. package/es/{validator-94c04152.js → validator-4160d9e7.js} +1 -1
  69. package/es/{vnode-5ddb7ed1.js → vnode-06571d5b.js} +1 -1
  70. package/es/{zh-cn-4921961d.js → zh-cn-5df98ac2.js} +2 -2
  71. package/lib/bundle.js +1 -1
  72. package/lib/bundle.umd.cjs +162 -162
  73. package/lib/{index-2a325d42.js → index-f00d1e1f.js} +13173 -13151
  74. package/lib/{python-eb65d93b.js → python-0f34e2e6.js} +1 -1
  75. package/lib/style.css +1 -1
  76. package/package.json +1 -1
  77. package/packages/KlineBasic/components/KlineSub/index.vue +35 -15
  78. package/packages/KlineBasic/components/KlineTips/index.vue +2 -2
  79. package/packages/KlineBasic/index.vue +39 -41
  80. package/packages/KlinePlus/index.vue +88 -62
  81. package/src/App.vue +15 -4
  82. package/src/pages/KlineBasic/index.vue +7 -7
  83. package/src/pages/KlineNew/components/KlineAction/mockApi/index.js +1 -1
  84. package/src/pages/KlineNew/components/KlineBasic/utils.js +1 -1
  85. package/src/pages/KlineNew/components/KlineSlide/utils.js +1 -1
  86. package/src/pages/KlinePlus/KlineDialog/MultiCycle.vue +312 -0
  87. package/src/pages/KlinePlus/KlineDialog/api.js +108 -0
  88. package/src/pages/KlinePlus/KlineDialog/index.vue +582 -0
  89. package/src/pages/KlinePlus/KlineDialog/indicator.js +109 -0
  90. package/src/pages/KlinePlus/KlineDialog/tools.js +86 -0
  91. package/src/pages/KlinePlus/index.vue +23 -209
  92. package/es/raf-80ef0c0a.js +0 -6
@@ -0,0 +1,312 @@
1
+ <script setup>
2
+ import dayjs from "dayjs";
3
+ import { ref, onMounted, nextTick } from "vue";
4
+ import { formatLabel, estimateKlineTime, getTimeRange } from "./tools";
5
+ import { getCycleList } from "./api.js";
6
+
7
+ const emit = defineEmits(["goToSingleCycle"]);
8
+ const props = defineProps({
9
+ varietyCode: { type: String, required: true },
10
+ varietyStock: { type: Number, required: true }, // 品种市场类型 0-期货, 1-股票, 2-期权
11
+ indicatorStore: { type: Object, required: true }, // 指标配置Store
12
+ userKlineConfig: { type: Object, required: true }, // 用户自定义的K线配置
13
+
14
+ // 交互选项
15
+ sellBuy: { type: Number, default: 1 },
16
+ rightType: { type: Number, default: null },
17
+ klineType: { type: Number, default: null },
18
+ initTimeRange: { type: Array, required: true },
19
+ mainIndicator: { type: String, required: true },
20
+
21
+ // 绘制数据: 成交
22
+ tradeLog: { type: Array, default: () => [] }, // 成交数据
23
+ // 绘制数据: 净值
24
+ netPositionData: { type: Array, default: () => [] }, // 净值数据
25
+
26
+ // 功能: 强制定位高亮(非必填)
27
+ positionTime: { type: [String, null], default: null },
28
+ });
29
+ const chartList = ref([]); // 图表列表
30
+ const chartDomRefList = ref([]); // 图表Dom列表
31
+ const cycleOptions = ref([]);
32
+ const menuList = [{ key: "syncBrushRangeOtherKline", label: "同步其它K线范围" }]; // 菜单列表
33
+
34
+ // 同步刷选范围
35
+ const syncBrushRange = ref({
36
+ cycleList: [], // 需要进行刷选的周期
37
+ startTime: null,
38
+ endTime: null,
39
+ });
40
+
41
+ // 清除单个图表的同步刷选
42
+ const handleClearSyncBrush = (cycle) => {
43
+ if (syncBrushRange.value.cycleList.includes(cycle)) {
44
+ const index = syncBrushRange.value.cycleList.findIndex((i) => i === cycle);
45
+ syncBrushRange.value.cycleList.splice(index, 1);
46
+ }
47
+ };
48
+
49
+ // 绑定图表Ref
50
+ const handleSetChartDomRef = (el, index) => {
51
+ if (el) chartDomRefList.value[index] = el;
52
+ };
53
+
54
+ // 点击菜单项
55
+ const handleClickMenuItem = (menu, item, index) => {
56
+ switch (menu.key) {
57
+ // 同步刷选范围
58
+ case "syncBrushRangeOtherKline": {
59
+ const { screenTimeRange, contextmenuKlineTime } = chartDomRefList.value[index];
60
+ // 生成同步刷选的时间范围
61
+ switch (item.cycle) {
62
+ // 大周期将contextmenuKlineTime按周期拆成范围, 再使用
63
+ case "6": {
64
+ syncBrushRange.value = {
65
+ cycleList: [],
66
+ startTime: dayjs(contextmenuKlineTime).format("YYYY-MM-DD 00:00:00"),
67
+ endTime: dayjs(contextmenuKlineTime).format("YYYY-MM-DD 23:59:59"),
68
+ };
69
+ break;
70
+ }
71
+ case "7": {
72
+ syncBrushRange.value = {
73
+ cycleList: [],
74
+ startTime: dayjs(contextmenuKlineTime).startOf("week").add(1, "day").format("YYYY-MM-DD 00:00:00"),
75
+ endTime: dayjs(contextmenuKlineTime).endOf("week").add(1, "day").format("YYYY-MM-DD 23:59:59"),
76
+ };
77
+ break;
78
+ }
79
+ case "8": {
80
+ syncBrushRange.value = {
81
+ cycleList: [],
82
+ startTime: dayjs(contextmenuKlineTime).startOf("month").format("YYYY-MM-DD 00:00:00"),
83
+ endTime: dayjs(contextmenuKlineTime).endOf("month").format("YYYY-MM-DD 23:59:59"),
84
+ };
85
+ break;
86
+ }
87
+ // 小周期直接用screenTimeRange
88
+ default: {
89
+ syncBrushRange.value = {
90
+ cycleList: [],
91
+ startTime: screenTimeRange[0],
92
+ endTime: screenTimeRange[1],
93
+ };
94
+ }
95
+ }
96
+ // 图表重绘
97
+ chartList.value.forEach((citem, cindex) => {
98
+ if (cindex !== index) {
99
+ syncBrushRange.value.cycleList.push(citem.cycle);
100
+ const startTime = estimateKlineTime(syncBrushRange.value.startTime, "before", 200, citem.cycle);
101
+ const endTime = estimateKlineTime(syncBrushRange.value.endTime, "after", 200, citem.cycle);
102
+ citem.initTimeRange = [startTime, endTime];
103
+ }
104
+ nextTick(() => chartDomRefList.value[index].reDraw());
105
+ });
106
+ break;
107
+ }
108
+ }
109
+ };
110
+
111
+ onMounted(async () => {
112
+ cycleOptions.value = (await getCycleList()).body[1002].map((item) => ({ label: item.dictName, value: item.dictCode }));
113
+ const { multiCycleNum, multiCycleList } = props.userKlineConfig;
114
+ chartList.value = multiCycleList.slice(0, multiCycleNum).map((cycle) => {
115
+ const params = {
116
+ type: "reset",
117
+ cycle,
118
+ startTime: props.tradeLog[0].openTime,
119
+ endTime: props.positionTime ? props.positionTime : props.tradeLog.at(-1).closeTime,
120
+ };
121
+ const initTimeRange = getTimeRange(params);
122
+ return { cycle, initTimeRange };
123
+ });
124
+ });
125
+ defineExpose({
126
+ changeTimeRange: (type) => {
127
+ chartList.value = chartList.value.map((item) => {
128
+ const params = {
129
+ type,
130
+ cycle: item.cycle,
131
+ startTime: props.tradeLog[0].openTime,
132
+ endTime: props.positionTime ? props.positionTime : props.tradeLog.at(-1).closeTime,
133
+ };
134
+ return {
135
+ ...item,
136
+ initTimeRange: getTimeRange(params),
137
+ };
138
+ });
139
+ // 同步刷选范围
140
+ switch (type) {
141
+ case "week": {
142
+ const startDate = dayjs().startOf("week").add(1, "day").format("YYYY-MM-DD 00:00:00");
143
+ const endDate = dayjs().endOf("week").add(1, "day").format("YYYY-MM-DD 23:59:59");
144
+ syncBrushRange.value = {
145
+ cycleList: ["6", "7", "8"],
146
+ startTime: startDate,
147
+ endTime: endDate,
148
+ };
149
+ break;
150
+ }
151
+ case "month": {
152
+ const startDate = dayjs().startOf("month").format("YYYY-MM-DD 00:00:00");
153
+ const endDate = dayjs().endOf("month").format("YYYY-MM-DD 23:59:59");
154
+ syncBrushRange.value = {
155
+ cycleList: ["6", "7", "8"],
156
+ startTime: startDate,
157
+ endTime: endDate,
158
+ };
159
+ break;
160
+ }
161
+ case "reset": {
162
+ syncBrushRange.value = {
163
+ cycleList: [],
164
+ startTime: null,
165
+ endTime: null,
166
+ };
167
+ break;
168
+ }
169
+ }
170
+ },
171
+ });
172
+ </script>
173
+
174
+ <template>
175
+ <div :class="`kline-multi grid-${userKlineConfig.multiCycleNum}`">
176
+ <div
177
+ class="box"
178
+ v-for="(item, index) in chartList"
179
+ @dblclick="emit('goToSingleCycle', item)"
180
+ >
181
+ <div class="cycleName">
182
+ <span>{{ formatLabel(item.cycle, cycleOptions) }}</span>
183
+ <el-select
184
+ v-model="item.cycle"
185
+ popper-class="element-dark"
186
+ :popper-append-to-body="false"
187
+ @change="handleClearSyncBrush(item.cycle)"
188
+ >
189
+ <el-option
190
+ v-for="(item, index) in cycleOptions"
191
+ :key="index"
192
+ :label="item.label"
193
+ :value="item.value"
194
+ />
195
+ </el-select>
196
+ </div>
197
+ <st-contextmenu>
198
+ <st-klinePlus
199
+ :ref="(el) => handleSetChartDomRef(el, index)"
200
+ :varietyCode="varietyCode"
201
+ :varietyStock="varietyStock"
202
+ :indicatorStore="indicatorStore"
203
+ :userKlineConfig="userKlineConfig"
204
+ :cycle="item.cycle"
205
+ :sellBuy="sellBuy"
206
+ :rightType="rightType"
207
+ :klineType="klineType"
208
+ :initTimeRange="item.initTimeRange"
209
+ :mainIndicator="mainIndicator"
210
+ :tradeLog="tradeLog"
211
+ :netPositionData="netPositionData"
212
+ :positionTime="positionTime"
213
+ :syncBrushRange="syncBrushRange"
214
+ />
215
+ <template #popover>
216
+ <el-menu
217
+ :style="{
218
+ borderRadius: '4px',
219
+ overflow: 'hidden',
220
+ background: '#fff',
221
+ borderRight: 0,
222
+ }"
223
+ >
224
+ <el-menu-item
225
+ v-for="menuItem in menuList"
226
+ style="height: 36px"
227
+ :key="menuItem.key"
228
+ :index="menuItem.key"
229
+ @click="handleClickMenuItem(menuItem, item, index)"
230
+ >
231
+ {{ menuItem.label }}
232
+ </el-menu-item>
233
+ </el-menu>
234
+ </template>
235
+ </st-contextmenu>
236
+ </div>
237
+ </div>
238
+ </template>
239
+
240
+ <style lang="scss" scoped>
241
+ .kline-multi {
242
+ width: 100%;
243
+ height: 100%;
244
+ box-sizing: border-box;
245
+ padding: 2px;
246
+ display: grid;
247
+ grid-template-columns: repeat(3, minmax(150px, 1fr));
248
+ grid-template-rows: repeat(2, minmax(100px, 1fr));
249
+ grid-gap: 2px;
250
+ .box {
251
+ position: relative;
252
+ border: 1px solid var(--el-border-color);
253
+ transition: 0.2s;
254
+ &:hover {
255
+ border: 1px solid var(--el-color-primary);
256
+ }
257
+ .cycleName {
258
+ color: white;
259
+ font-size: 12px;
260
+ padding: 1px 4px;
261
+ background-color: var(--el-color-primary);
262
+ display: flex;
263
+ align-items: center;
264
+ border-bottom-left-radius: 4px;
265
+ position: absolute;
266
+ z-index: 999;
267
+ right: 0px;
268
+ top: 0px;
269
+ :deep(.el-select) {
270
+ margin-left: 4px;
271
+ width: 14px;
272
+ .el-select__icon {
273
+ margin-left: 0;
274
+ color: black;
275
+ width: 14px;
276
+ height: 14px;
277
+ }
278
+ .el-select__wrapper {
279
+ border-radius: 50%;
280
+ background: #ccc;
281
+ padding: 0;
282
+ gap: 0;
283
+ min-height: 14px;
284
+ line-height: 14px;
285
+ }
286
+ .el-select__input {
287
+ min-width: 0 !important;
288
+ width: 0 !important;
289
+ }
290
+ }
291
+ }
292
+ }
293
+ }
294
+ .grid-2 {
295
+ display: grid;
296
+ grid-template-columns: repeat(2, 1fr);
297
+ grid-template-rows: repeat(1, minmax(80px, 1fr));
298
+ grid-gap: 2px;
299
+ }
300
+ .grid-4 {
301
+ display: grid;
302
+ grid-template-columns: repeat(2, 1fr);
303
+ grid-template-rows: repeat(2, minmax(80px, 1fr));
304
+ grid-gap: 2px;
305
+ }
306
+ .grid-6 {
307
+ display: grid;
308
+ grid-template-columns: repeat(3, 1fr);
309
+ grid-template-rows: repeat(2, minmax(80px, 1fr));
310
+ grid-gap: 2px;
311
+ }
312
+ </style>
@@ -0,0 +1,108 @@
1
+ import axios from "axios";
2
+
3
+ // 测试环境
4
+ // const userid = 103;
5
+ // const token = "490cebe77872589fc6f670d30983b268";
6
+ // export const host = "http://192.168.12.38:5173";
7
+
8
+ // 线上环境
9
+ const userid = 200;
10
+ const token = "02e233681c5cecaf788525e70c380ed5";
11
+ export const host = "//investapi.hzyotoy.com";
12
+
13
+ // 获取数据: 指标列表
14
+ export const getIndicator = async (data) => {
15
+ const res = await axios({
16
+ method: "post",
17
+ headers: { token, userid },
18
+ url: `${host}/middleLayer/kline/getIndicator`,
19
+ data,
20
+ });
21
+ return res.data;
22
+ };
23
+
24
+ // 获取周期列表
25
+ export const getCycleList = async () => {
26
+ const res = await axios({
27
+ method: "post",
28
+ headers: { token, userid },
29
+ url: `${host}/middleLayer/post/common/qt/getDict`,
30
+ data: { dictIds: [1002] },
31
+ });
32
+ return res.data;
33
+ };
34
+
35
+ // 查询品种是否股票
36
+ export const queryContractType = async (data) => {
37
+ const res = await axios({
38
+ method: "post",
39
+ headers: { token, userid },
40
+ url: `${host}/middleLayer/bjpost/invest/analysis/queryContractType`,
41
+ data,
42
+ });
43
+ return res.data;
44
+ };
45
+
46
+ // 获取净值曲线数据
47
+ export const queryVarietyNetPositionValue = async (data) => {
48
+ const res = await axios({
49
+ method: "post",
50
+ headers: { token, userid },
51
+ url: `${host}/middleLayer/bjpost/invest/analysis/queryVarietyNetPositionValue`,
52
+ data,
53
+ });
54
+ return res.data;
55
+ };
56
+
57
+ // 获取交易订单数据
58
+ export const queryPairedRecordByVariety = async (data) => {
59
+ const res = await axios({
60
+ method: "post",
61
+ headers: { token, userid },
62
+ url: `${host}/middleLayer/bjpost/invest/analysis/queryPairedRecordByVariety`,
63
+ data,
64
+ });
65
+ return res.data;
66
+ };
67
+
68
+ // 获取篮子品种对应的价差指数
69
+ export const queryJCVariety = async (data) => {
70
+ const res = await axios({
71
+ method: "post",
72
+ headers: { token, userid },
73
+ url: `${host}/middleLayer/bjpost/invest/analysis/queryJCVariety`,
74
+ data,
75
+ });
76
+ return res.data;
77
+ };
78
+
79
+ export const getUserConfig = async (data) => {
80
+ const res = await axios({
81
+ method: "post",
82
+ headers: { token, userid },
83
+ url: `${host}/middleLayer/bjpost/common/qt/getUserConfig`,
84
+ data,
85
+ });
86
+ return res.data;
87
+ };
88
+
89
+ // 获取配置
90
+ export const getConfig = async () => {
91
+ const res = await axios({
92
+ method: "get",
93
+ headers: { token, userid },
94
+ url: `${host}/middleLayer/get/invest/sys/frontconfig/info`,
95
+ });
96
+ return res.data;
97
+ };
98
+
99
+ // 设置配置
100
+ export const setConfig = async (data) => {
101
+ const res = await axios({
102
+ method: "post",
103
+ headers: { token, userid },
104
+ url: `${host}/middleLayer/post/invest/sys/frontconfig/save`,
105
+ data,
106
+ });
107
+ return res.data;
108
+ };