st-comp 0.0.168 → 0.0.170

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "st-comp",
3
3
  "public": true,
4
- "version": "0.0.168",
4
+ "version": "0.0.170",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "dev": "vite",
@@ -8,6 +8,9 @@ const { request } = inject("stConfig"); // 组件库全局配置
8
8
  const emit = defineEmits("callBack");
9
9
  const props = defineProps({
10
10
  indicatorStore: { type: Object, default: () => ({}) }, // 指标配置Store
11
+ origin: { type: String, default: "server" }, // 数据来源: server服务器, local本地
12
+ // 如果server此项不用管, 如果local则使用此项
13
+ cycleOptions: { type: Array, default: () => [] },
11
14
  });
12
15
 
13
16
  const visible = ref(false);
@@ -23,25 +26,37 @@ const handleReset = () => {
23
26
  // 配置: 保存配置
24
27
  const handleSubmit = async () => {
25
28
  const json = JSON.stringify(form);
26
- await request.post("/common/qt/updateUserConfig", { appId: 1, json });
29
+ if (props.origin === "server") {
30
+ await request.post("/common/qt/updateUserConfig", { appId: 1, json });
31
+ } else {
32
+ localStorage.setItem("userKlineConfig", json);
33
+ }
27
34
  emit("callBack", json);
28
35
  visible.value = false;
29
36
  };
30
-
31
37
  // 获取配置数据
32
38
  const getKlineConfig = async () => {
33
- const { body } = await request.post("/common/qt/getUserConfig", { appId: 1 });
34
- Object.assign(form, getDefaultUserKlineConfig(), body ? JSON.parse(body) : {});
39
+ if (props.origin === "server") {
40
+ const { body } = await request.post("/common/qt/getUserConfig", { appId: 1 });
41
+ Object.assign(form, getDefaultUserKlineConfig(), body ? JSON.parse(body) : {});
42
+ } else {
43
+ const body = localStorage.getItem("userKlineConfig");
44
+ Object.assign(form, getDefaultUserKlineConfig(), body ? JSON.parse(body) : {});
45
+ }
35
46
  };
36
47
  // 获取周期选项
37
48
  const getCycleOptions = async () => {
38
- const { body } = await request.post("/common/qt/getDict", { dictIds: [1002] });
39
- cycleOptions.value = body[1002].map((item) => {
40
- return {
41
- label: item.dictName,
42
- value: item.dictCode,
43
- };
44
- });
49
+ if (props.origin === "server") {
50
+ const { body } = await request.post("/common/qt/getDict", { dictIds: [1002] });
51
+ cycleOptions.value = body[1002].map((item) => {
52
+ return {
53
+ label: item.dictName,
54
+ value: item.dictCode,
55
+ };
56
+ });
57
+ } else {
58
+ cycleOptions.value = props.cycleOptions;
59
+ }
45
60
  };
46
61
 
47
62
  onMounted(() => {
@@ -22,6 +22,10 @@ const props = defineProps({
22
22
  rightType: { type: Number, required: true },
23
23
  // 常用选项 [期货]
24
24
  klineType: { type: Number, required: true },
25
+
26
+ // 业务系统相关
27
+ deleteFirstNumber: { type: Number, default: 1 }, // 绩效标记
28
+ withoutPermission: { type: Number, default: 0 }, // 三方标记(不需要token授权)
25
29
  });
26
30
  const klineData = ref({
27
31
  data: [], // <[开 收 低 高 成交额 涨跌值 涨跌百分比]>
@@ -37,7 +41,8 @@ const getData = async () => {
37
41
  cycle: "6",
38
42
  startTime: "1999-01-01 00:00:00",
39
43
  endTime: dayjs().format("YYYY-MM-DD 23:59:59"),
40
- deleteFirstNumber: 1, // 后端要求标识
44
+ deleteFirstNumber: props.deleteFirstNumber,
45
+ withoutPermission: props.withoutPermission,
41
46
  };
42
47
  // 参数加工
43
48
  switch (props.varietyStock) {
@@ -28,15 +28,18 @@ const props = defineProps({
28
28
  initTimeRange: { type: Array, required: true },
29
29
  mainIndicator: { type: String, required: true },
30
30
 
31
- // 绘制数据: 成交
31
+ // 绘制数据
32
32
  tradeLog: { type: Array, default: () => [] }, // 成交数据
33
- // 绘制数据: 净值
34
33
  netPositionData: { type: Array, default: () => [] }, // 净值数据
35
34
 
36
- // 功能: 强制定位高亮(非必填)
35
+ // 强制定位高亮(非必填)
37
36
  positionTime: { type: [String, null], default: null },
38
- // 功能: 同步刷选范围(非必填)
37
+ // 同步刷选范围(非必填)
39
38
  syncBrushRange: { type: Object, default: () => ({ cycleList: [], startTime: null, endTime: null }) },
39
+
40
+ // 业务系统相关
41
+ deleteFirstNumber: { type: Number, default: 1 }, // 绩效标记
42
+ withoutPermission: { type: Number, default: 0 }, // 三方标记(不需要token授权)
40
43
  });
41
44
 
42
45
  // 加载标记
@@ -174,7 +177,8 @@ const getMainData = async ({ startTime, endTime }) => {
174
177
  contractType: props.varietyStock ? null : props.klineType, // 合约类型
175
178
  mainIndicatorList: props.indicatorStore.getIndicatorParams(props.mainIndicator),
176
179
  subIndicator: subIndicator.value,
177
- deleteFirstNumber: 1, // >> 重要: 绩效后端特殊要求传参 <<
180
+ deleteFirstNumber: props.deleteFirstNumber,
181
+ withoutPermission: props.withoutPermission,
178
182
  };
179
183
  // Echarts如果一屏如果正好展示了所有数据, 是无法缩放触发加载更多的
180
184
  // 所以在请求中需要对开始和结束时间进行延伸, 但是首屏的展示时间定位还是会以传入的开始结束时间为准
@@ -197,9 +201,24 @@ const getMainData = async ({ startTime, endTime }) => {
197
201
  const { body } = await request.post("/middleLayer/kline/getKline", params);
198
202
  klineData.value = body ?? { data: [], mainIndicator: [], subIndicator: [], time: [] };
199
203
 
200
- // 绘制图表
201
- const startValue = klineData.value.time.findIndex((item) => new Date(item) >= new Date(startTime));
202
- const endValue = klineData.value.time.findIndex((item) => new Date(item) >= new Date(endTime));
204
+ // 找到匹配对应传入的开始, 结束时间的数据索引, 绘制图表
205
+ let startValue = -1;
206
+ let endValue = -1;
207
+ for (let index = 0; index < klineData.value.time.length; index++) {
208
+ const day = dayjs(klineData.value.time[index]).format("YYYY-MM-DD");
209
+ if (startValue !== -1 && endValue !== -1) break;
210
+ if (startValue === -1) {
211
+ if (new Date(day) === new Date(startTime)) startValue = index;
212
+ else if (new Date(day) > new Date(startTime)) startValue = index - 1;
213
+ }
214
+ if (endValue === -1) {
215
+ if (new Date(day) === new Date(endTime)) endValue = index;
216
+ else if (new Date(day) > new Date(endTime)) endValue = index - 1;
217
+ }
218
+ }
219
+ if (endValue === -1) endValue = klineData.value.time.length - 1;
220
+ // const startValue = klineData.value.time.findIndex((item) => new Date(item) >= new Date(startTime));
221
+ // const endValue = klineData.value.time.findIndex((item) => new Date(item) >= new Date(endTime));
203
222
  draw({
204
223
  startValue: startValue === -1 ? 0 : startValue,
205
224
  endValue: endValue === -1 ? klineData.value.time.length - 1 : endValue,
@@ -223,7 +242,8 @@ const getMoreData = async (type) => {
223
242
  limit: loadAddCount,
224
243
  mainIndicatorList: props.indicatorStore.getIndicatorParams(props.mainIndicator),
225
244
  subIndicator: subIndicator.value,
226
- deleteFirstNumber: 1,
245
+ deleteFirstNumber: props.deleteFirstNumber,
246
+ withoutPermission: props.withoutPermission,
227
247
  };
228
248
  const { body } = await request.post("/middleLayer/kline/getKline", params);
229
249
  // 合并数据
@@ -245,9 +265,10 @@ const getMoreData = async (type) => {
245
265
  contractType: props.varietyStock ? null : props.klineType, // 合约类型
246
266
  startTime: klineData.value.time[klineData.value.time.length - 1], // 开始时间
247
267
  limit: loadAddCount, // 查询K线数量
248
- deleteFirstNumber: 1, // >> 重要: 绩效后端特殊要求传参 <<
249
268
  mainIndicatorList: props.indicatorStore.getIndicatorParams(props.mainIndicator),
250
269
  subIndicator: subIndicator.value,
270
+ deleteFirstNumber: props.deleteFirstNumber,
271
+ withoutPermission: props.withoutPermission,
251
272
  };
252
273
  const { body } = await request.post("/middleLayer/kline/getKline", params);
253
274
  // 合并数据
@@ -688,6 +709,7 @@ watch(
688
709
  startTime: klineData.value.time[startValue],
689
710
  endTime: klineData.value.time[endValue],
690
711
  cycle: props.cycle,
712
+ type: "middle",
691
713
  });
692
714
  getMainData({ startTime, endTime });
693
715
  },
@@ -796,6 +818,8 @@ defineExpose({
796
818
  :varietyStock="varietyStock"
797
819
  :rightType="rightType"
798
820
  :klineType="klineType"
821
+ :deleteFirstNumber="props.deleteFirstNumber"
822
+ :withoutPermission="props.withoutPermission"
799
823
  @change="handleSliderChange"
800
824
  />
801
825
  </div>
@@ -26,15 +26,32 @@ export const dayBarsNumByCycle = {
26
26
  8: 0.033, // 每月1根(按21个交易日算)
27
27
  };
28
28
 
29
- // 校验时间间隔, 避免开始和结束时间过大, 超过一屏根数上限
30
- export const checkTimeInterval = ({ startTime, endTime, cycle }) => {
29
+ /**
30
+ * @description: 校验时间间隔, 避免开始和结束时间过大, 超过一屏根数上限
31
+ */
32
+ export const checkTimeInterval = ({ startTime, endTime, cycle, type = "end" }) => {
31
33
  // 大切小时可能会出现请求超过一屏上限的数据量, 进行时间间隔校验, 由于是估算, 所以计算时可以比一屏上限根数多一些
32
34
  const { maxValueSpan } = loadKlineConfig;
33
35
  const N = Math.ceil((maxValueSpan + 1000) / dayBarsNumByCycle[cycle]);
34
36
  const d1 = dayjs(startTime);
35
37
  const d2 = dayjs(endTime);
36
38
  const diff = d2.diff(d1, "day");
37
- return [diff <= N ? startTime : dayjs(endTime).subtract(N, "day").format("YYYY-MM-DD HH:mm:ss"), endTime];
39
+ // 未超出间隔, 返回原本的开始, 结束时间
40
+ if (diff <= N) return [startTime, endTime];
41
+ // 超出间隔, 按照期望以结束时间, 还是中间时间去计算
42
+ if (type === "end") return [dayjs(endTime).subtract(N, "day").format("YYYY-MM-DD HH:mm:ss"), endTime];
43
+ if (type === "middle") {
44
+ const middleTime = dayjs((dayjs(startTime).valueOf() + dayjs(endTime).valueOf()) / 2).format("YYYY-MM-DD HH:mm:ss");
45
+ console.log("超过一屏数量上限, 进行中间时间计算", middleTime, N / 2);
46
+ return [
47
+ dayjs(middleTime)
48
+ .subtract(N / 2, "day")
49
+ .format("YYYY-MM-DD HH:mm:ss"),
50
+ dayjs(middleTime)
51
+ .add(N / 2, "day")
52
+ .format("YYYY-MM-DD HH:mm:ss"),
53
+ ];
54
+ }
38
55
  };
39
56
 
40
57
  // 获取副图配置