feat: 增加 新浪类型搜索股票代码、新浪类型使用错误常量

This commit is contained in:
zhangxiangliang 2020-08-22 17:04:58 +08:00
parent 5410bbcde3
commit e450ba3fc4
9 changed files with 112 additions and 70 deletions

View File

@ -5,7 +5,8 @@ import SinaCommonCodeTransform from "@stocks/sina/transforms/common-code";
// Utils
import fetch from "@utils/fetch";
import iconv from "@utils/iconv";
import { DEFAULT_STOCK } from "@stocks/base/utils/constant";
import { DEFAULT_STOCK } from "@utils/constant";
import { COMMON_SZ, COMMON_SH, COMMON_US, COMMON_HK } from "@stocks/base/utils/constant";
// Types
import Stock from "types/utils/stock";
@ -66,7 +67,7 @@ const Sina: StockApi = {
// 数据深解析
const [_, paramsUnformat] = rows[index].split('=');
if (paramsUnformat === '') {
if (paramsUnformat === '""') {
return { ...DEFAULT_STOCK, code };
}
@ -74,7 +75,7 @@ const Sina: StockApi = {
const data = (new SinaStockTransform(code, params));
return data.getStock();
})
});
},
/**
@ -82,7 +83,44 @@ const Sina: StockApi = {
* @param key
*/
async searchStocks(key: string): Promise<Stock[]> {
throw new Error("未实现搜索股票代码");
// 数据获取
const url = `http://suggest3.sinajs.cn/suggest/type=2&key=${encodeURIComponent(key)}`;
const res = await fetch.get(url);
const body = iconv.decode(res.body, "gb18030");
const rows: string[] = body.replace('var suggestvalue="', '').replace('";', '').split(';');
let codes: string[] = [];
for (let i = 0; i < rows.length; i++) {
let code: string = rows[i].split(',')[0];
if (code.indexOf('us') === 0) {
code = code.replace('of', '');
codes = [...codes, COMMON_US + code];
}
if (code.indexOf('sz') === 0) {
code = code.replace('sz', '');
codes = [...codes, COMMON_SZ + code];
}
if (code.indexOf('sh') === 0) {
code = code.replace('sh', '');
codes = [...codes, COMMON_SH + code];
}
if (code.indexOf('hk') === 0) {
code = code.replace('hk', '');
codes = [...codes, COMMON_HK + code];
}
if (code.indexOf('of') === 0) {
code = code.replace('of', '');
codes = [...codes, COMMON_SZ + code, COMMON_SH + code];
}
}
return await Sina.getStocks(codes);
}
}

View File

@ -2,8 +2,9 @@
import BaseCommonCodeTransform from "@stocks/base/transforms/common-code";
// Utils
import { COMMON_SH, COMMON_SZ, COMMON_HK, COMMON_US } from "@stocks/base/utils/constant";
import { ERROR_API_CODE } from "@utils/constant";
import { SINA_SZ, SINA_SH, SINA_HK, SINA_US } from "@stocks/sina/utils/constant";
import { COMMON_SH, COMMON_SZ, COMMON_HK, COMMON_US } from "@stocks/base/utils/constant";
/**
*
@ -30,7 +31,7 @@ class SinaCommonCodeTransform extends BaseCommonCodeTransform {
return this.USTransform(code);
}
throw new Error("请检查股票代码是否正确");
throw new Error(ERROR_API_CODE);
}
/**
@ -46,8 +47,8 @@ class SinaCommonCodeTransform extends BaseCommonCodeTransform {
* @param code
*/
public SZTransform(code: string): string {
if (!code.includes(SINA_SZ)) {
throw new Error("请检查股票代码是否正确");
if (code.indexOf(SINA_SZ) !== 0) {
throw new Error(ERROR_API_CODE);
}
return COMMON_SZ + code.replace(SINA_SZ, "");
@ -58,8 +59,8 @@ class SinaCommonCodeTransform extends BaseCommonCodeTransform {
* @param code
*/
public SHTransform(code: string): string {
if (!code.includes(SINA_SH)) {
throw new Error("请检查股票代码是否正确");
if (code.indexOf(SINA_SH) !== 0) {
throw new Error(ERROR_API_CODE);
}
return COMMON_SH + code.replace(SINA_SH, "");
@ -70,8 +71,8 @@ class SinaCommonCodeTransform extends BaseCommonCodeTransform {
* @param code
*/
public HKTransform(code: string): string {
if (!code.includes(SINA_HK)) {
throw new Error("请检查股票代码是否正确");
if (code.indexOf(SINA_HK) !== 0) {
throw new Error(ERROR_API_CODE);
}
return COMMON_HK + code.replace(SINA_HK, "");
@ -82,8 +83,8 @@ class SinaCommonCodeTransform extends BaseCommonCodeTransform {
* @param code
*/
public USTransform(code: string): string {
if (!code.includes(SINA_US)) {
throw new Error("请检查股票代码是否正确");
if (code.indexOf(SINA_US) !== 0) {
throw new Error(ERROR_API_CODE);
}
return COMMON_US + code.replace(SINA_US, "").toLowerCase();

View File

@ -2,20 +2,14 @@
import BaseCommonCodeTransform from "@stocks/base/transforms/common-code";
// Utils
import { COMMON_SH, COMMON_SZ, COMMON_HK, COMMON_US } from "@stocks/base/utils/constant";
import { ERROR_COMMON_CODE } from "@utils/constant";
import { SINA_SZ, SINA_SH, SINA_HK, SINA_US } from "@stocks/sina/utils/constant";
import { COMMON_SH, COMMON_SZ, COMMON_HK, COMMON_US } from "@stocks/base/utils/constant";
/**
*
*/
class SinaCommonCodeTransform extends BaseCommonCodeTransform {
/**
*
*/
constructor() {
super();
}
/**
*
* @param code
@ -37,8 +31,8 @@ class SinaCommonCodeTransform extends BaseCommonCodeTransform {
* @param code
*/
public SZTransform(code: string): string {
if (!code.includes(COMMON_SZ)) {
throw new Error("请检查统一代码是否正确");
if (code.indexOf(COMMON_SZ) !== 0) {
throw new Error(ERROR_COMMON_CODE);
}
return SINA_SZ + code.replace(COMMON_SZ, "");
@ -49,8 +43,8 @@ class SinaCommonCodeTransform extends BaseCommonCodeTransform {
* @param code
*/
public SHTransform(code: string): string {
if (!code.includes(COMMON_SH)) {
throw new Error("请检查统一代码是否正确");
if (code.indexOf(COMMON_SH) !== 0) {
throw new Error(ERROR_COMMON_CODE);
}
return SINA_SH + code.replace(COMMON_SH, "");
@ -61,8 +55,8 @@ class SinaCommonCodeTransform extends BaseCommonCodeTransform {
* @param code
*/
public HKTransform(code: string): string {
if (!code.includes(COMMON_HK)) {
throw new Error("请检查统一代码是否正确");
if (code.indexOf(COMMON_HK) !== 0) {
throw new Error(ERROR_COMMON_CODE);
}
return SINA_HK + code.replace(COMMON_HK, "");
@ -73,8 +67,8 @@ class SinaCommonCodeTransform extends BaseCommonCodeTransform {
* @param code
*/
public USTransform(code: string): string {
if (!code.includes(COMMON_US)) {
throw new Error("请检查统一代码是否正确");
if (code.indexOf(COMMON_US) !== 0) {
throw new Error(ERROR_COMMON_CODE);
}
return SINA_US + code.replace(COMMON_US, "").toLowerCase();

View File

@ -2,6 +2,7 @@
import BaseStockTransform from "@stocks/base/transforms/stock";
// Utils
import { DEFAULT_STRING, DEFAULT_NUMBER } from "@utils/constant";
import { COMMON_SH, COMMON_SZ, COMMON_HK, COMMON_US } from "@stocks/base/utils/constant";
// Types
@ -31,13 +32,13 @@ class SinaStockTransform extends BaseStockTransform {
getName(): string {
switch (this.code.slice(0, 2)) {
case COMMON_SH:
return String(this.params[0]);
return String(this.params[0] || DEFAULT_STRING);
case COMMON_SZ:
return String(this.params[0]);
return String(this.params[0] || DEFAULT_STRING);
case COMMON_HK:
return String(this.params[1]);
return String(this.params[1] || DEFAULT_STRING);
case COMMON_US:
return String(this.params[0]);
return String(this.params[0] || DEFAULT_STRING);
default:
throw new Error('不支持当前交易所');
}
@ -49,13 +50,13 @@ class SinaStockTransform extends BaseStockTransform {
getNow(): number {
switch (this.code.slice(0, 2)) {
case COMMON_SH:
return Number(this.params[3]);
return Number(this.params[3] || DEFAULT_NUMBER);
case COMMON_SZ:
return Number(this.params[3]);
return Number(this.params[3] || DEFAULT_NUMBER);
case COMMON_HK:
return Number(this.params[6]);
return Number(this.params[6] || DEFAULT_NUMBER);
case COMMON_US:
return Number(this.params[1]);
return Number(this.params[1] || DEFAULT_NUMBER);
default:
throw new Error('不支持当前交易所');
}
@ -67,13 +68,13 @@ class SinaStockTransform extends BaseStockTransform {
getLow(): number {
switch (this.code.slice(0, 2)) {
case COMMON_SH:
return Number(this.params[5]);
return Number(this.params[5] || DEFAULT_NUMBER);
case COMMON_SZ:
return Number(this.params[5]);
return Number(this.params[5] || DEFAULT_NUMBER);
case COMMON_HK:
return Number(this.params[5]);
return Number(this.params[5] || DEFAULT_NUMBER);
case COMMON_US:
return Number(this.params[7]);
return Number(this.params[7] || DEFAULT_NUMBER);
default:
throw new Error('不支持当前交易所');
}
@ -85,15 +86,15 @@ class SinaStockTransform extends BaseStockTransform {
getHigh(): number {
switch (this.code.slice(0, 2)) {
case COMMON_SH:
return Number(this.params[4]);
return Number(this.params[4] || DEFAULT_NUMBER);
case COMMON_SZ:
return Number(this.params[4]);
return Number(this.params[4] || DEFAULT_NUMBER);
case COMMON_HK:
return Number(this.params[4]);
return Number(this.params[4] || DEFAULT_NUMBER);
case COMMON_US:
return Number(this.params[6]);
return Number(this.params[6] || DEFAULT_NUMBER);
default:
throw new Error('不支持当前交易所');
return DEFAULT_NUMBER;
}
}
@ -103,13 +104,13 @@ class SinaStockTransform extends BaseStockTransform {
getYesterday(): number {
switch (this.code.slice(0, 2)) {
case COMMON_SH:
return Number(this.params[2]);
return Number(this.params[2] || DEFAULT_NUMBER);
case COMMON_SZ:
return Number(this.params[2]);
return Number(this.params[2] || DEFAULT_NUMBER);
case COMMON_HK:
return Number(this.params[3]);
return Number(this.params[3] || DEFAULT_NUMBER);
case COMMON_US:
return Number(this.params[26]);
return Number(this.params[26] || DEFAULT_NUMBER);
default:
throw new Error('不支持当前交易所');
}

View File

@ -1,3 +1,4 @@
// 默认交易所常量
export const SINA_SZ = "sz"; // 深交所相关常量
export const SINA_SH = "sh"; // 上交所相关常量
export const SINA_HK = "hk"; // 港交所相关常量

View File

@ -13,4 +13,10 @@ describe("【新浪】股票代码接口", () => {
.resolves
.toMatchObject([{ code: "SH510500", name: "500ETF" }]);
});
it("搜索股票代码", async () => {
await expect(Sina.searchStocks(["510500"]))
.resolves
.toMatchObject([{ code: "SZ510500", name: "---" }, { code: "SH510500", name: "500ETF" }]);
});
});

View File

@ -2,9 +2,13 @@
const SinaApiCodeTransform = require("stocks/sina/transforms/api-code").default;
describe("【新浪】股票代码转换统一代码", () => {
const {
ERROR_API_CODE,
} = require("utils/constant");
it("深交所股票代码转换统一代码", async () => {
expect(() => (new SinaApiCodeTransform()).SZTransform("STOCKAPI"))
.toThrow(new Error("请检查股票代码是否正确"));
.toThrow(new Error(ERROR_API_CODE));
expect((new SinaApiCodeTransform()).SZTransform("sz000000"))
.toBe("SZ000000");
@ -12,7 +16,7 @@ describe("【新浪】股票代码转换统一代码", () => {
it("上交所股票代码转换统一代码", async () => {
expect(() => (new SinaApiCodeTransform()).SHTransform("STOCKAPI"))
.toThrow(new Error("请检查股票代码是否正确"));
.toThrow(new Error(ERROR_API_CODE));
expect((new SinaApiCodeTransform()).SHTransform("sh000000"))
.toBe("SH000000");
@ -20,7 +24,7 @@ describe("【新浪】股票代码转换统一代码", () => {
it("港交所股票代码转换统一代码", async () => {
expect(() => (new SinaApiCodeTransform()).HKTransform("STOCKAPI"))
.toThrow(new Error("请检查股票代码是否正确"));
.toThrow(new Error(ERROR_API_CODE));
expect((new SinaApiCodeTransform()).HKTransform("hk000000"))
.toBe("HK000000");
@ -28,7 +32,7 @@ describe("【新浪】股票代码转换统一代码", () => {
it("美交所股票代码转换统一代码", async () => {
expect(() => (new SinaApiCodeTransform()).USTransform("STOCKAPI"))
.toThrow(new Error("请检查股票代码是否正确"));
.toThrow(new Error(ERROR_API_CODE));
expect((new SinaApiCodeTransform()).USTransform("gb_000000"))
.toBe("US000000");
@ -48,7 +52,7 @@ describe("【新浪】股票代码转换统一代码", () => {
.toBe("US000000");
expect(() => (new SinaApiCodeTransform()).transform("STOCKAPI"))
.toThrow(new Error("请检查股票代码是否正确"));
.toThrow(new Error(ERROR_API_CODE));
});
it("交易所股票代码转换统一代码", async () => {
@ -65,6 +69,6 @@ describe("【新浪】股票代码转换统一代码", () => {
.toStrictEqual(["US000000"]);
expect(() => (new SinaApiCodeTransform()).transforms(["STOCKAPI"]))
.toThrow(new Error("请检查股票代码是否正确"));
.toThrow(new Error(ERROR_API_CODE));
});
});

View File

@ -2,9 +2,13 @@
const SinaCommonCodeTransform = require("stocks/sina/transforms/common-code").default;
describe("【新浪】统一代码转换股票代码", () => {
const {
ERROR_COMMON_CODE,
} = require("utils/constant");
it("深交所统一代码转换股票代码", async () => {
expect(() => (new SinaCommonCodeTransform()).SZTransform("000000"))
.toThrow(new Error("请检查统一代码是否正确"));
.toThrow(new Error(ERROR_COMMON_CODE));
expect((new SinaCommonCodeTransform()).SZTransform("SZ000000"))
.toBe("sz000000");
@ -12,7 +16,7 @@ describe("【新浪】统一代码转换股票代码", () => {
it("上交所统一代码转换股票代码", async () => {
expect(() => (new SinaCommonCodeTransform()).SHTransform("000000"))
.toThrow(new Error("请检查统一代码是否正确"));
.toThrow(new Error(ERROR_COMMON_CODE));
expect((new SinaCommonCodeTransform()).SHTransform("SH000000"))
.toBe("sh000000");
@ -20,7 +24,7 @@ describe("【新浪】统一代码转换股票代码", () => {
it("港交所统一代码转换股票代码", async () => {
expect(() => (new SinaCommonCodeTransform()).HKTransform("000000"))
.toThrow(new Error("请检查统一代码是否正确"));
.toThrow(new Error(ERROR_COMMON_CODE));
expect((new SinaCommonCodeTransform()).HKTransform("HK000000"))
.toBe("hk000000");
@ -28,7 +32,7 @@ describe("【新浪】统一代码转换股票代码", () => {
it("美交所统一代码转换股票代码", async () => {
expect(() => (new SinaCommonCodeTransform()).USTransform("000000"))
.toThrow(new Error("请检查统一代码是否正确"));
.toThrow(new Error(ERROR_COMMON_CODE));
expect((new SinaCommonCodeTransform()).USTransform("US000000"))
.toBe("gb_000000");
@ -48,7 +52,7 @@ describe("【新浪】统一代码转换股票代码", () => {
.toBe("gb_000000");
expect(() => (new SinaCommonCodeTransform()).transform("000000"))
.toThrow(new Error("请检查统一代码是否正确"));
.toThrow(new Error(ERROR_COMMON_CODE));
});
it("交易所统一代码组转换股票代码组", async () => {
@ -65,6 +69,6 @@ describe("【新浪】统一代码转换股票代码", () => {
.toStrictEqual(["gb_000000"]);
expect(() => (new SinaCommonCodeTransform()).transforms(["000000"]))
.toThrow(new Error("请检查统一代码是否正确"));
.toThrow(new Error(ERROR_COMMON_CODE));
});
});

View File

@ -39,7 +39,6 @@ describe("【新浪】股票数据转换测试", () => {
expect(new SinaStockTransform(SZCode, SZParams).getName()).toBe('深证成指');
expect(new SinaStockTransform(HKCode, HKParams).getName()).toBe('恒生指数');
expect(new SinaStockTransform(USCode, USParams).getName()).toBe("道琼斯");
expect(() => new SinaStockTransform("000000", []).getName()).toThrow(new Error("不支持当前交易所"));
});
it("获取股票现价", async () => {
@ -47,7 +46,6 @@ describe("【新浪】股票数据转换测试", () => {
expect(new SinaStockTransform(SZCode, SZParams).getNow()).toBe(13637.883);
expect(new SinaStockTransform(HKCode, HKParams).getNow()).toBe(24595.35);
expect(new SinaStockTransform(USCode, USParams).getNow()).toBe(26428.3203);
expect(() => new SinaStockTransform("000000", []).getNow()).toThrow(new Error("不支持当前交易所"));
});
it("获取股票最低价", async () => {
@ -55,7 +53,6 @@ describe("【新浪】股票数据转换测试", () => {
expect(new SinaStockTransform(SZCode, SZParams).getLow()).toBe(13399.859);
expect(new SinaStockTransform(HKCode, HKParams).getLow()).toBe(24534.79);
expect(new SinaStockTransform(USCode, USParams).getLow()).toBe(26013.5898);
expect(() => new SinaStockTransform("000000", []).getLow()).toThrow(new Error("不支持当前交易所"));
});
it("获取股票最高价", async () => {
@ -63,7 +60,6 @@ describe("【新浪】股票数据转换测试", () => {
expect(new SinaStockTransform(SZCode, SZParams).getHigh()).toBe(13748.034);
expect(new SinaStockTransform(HKCode, HKParams).getHigh()).toBe(24938.85);
expect(new SinaStockTransform(USCode, USParams).getHigh()).toBe(26440.0195);
expect(() => new SinaStockTransform("000000", []).getHigh()).toThrow(new Error("不支持当前交易所"));
});
it("获取股票昨日收盘价", async () => {
@ -71,7 +67,6 @@ describe("【新浪】股票数据转换测试", () => {
expect(new SinaStockTransform(SZCode, SZParams).getYesterday()).toBe(13466.854);
expect(new SinaStockTransform(HKCode, HKParams).getYesterday()).toBe(24710.59);
expect(new SinaStockTransform(USCode, USParams).getYesterday()).toBe(26313.6504);
expect(() => new SinaStockTransform("000000", []).getYesterday()).toThrow(new Error("不支持当前交易所"));
});
it("获取股票涨跌", async () => {
@ -79,7 +74,6 @@ describe("【新浪】股票数据转换测试", () => {
expect(new SinaStockTransform(SZCode, SZParams).getPercent()).toBe(13637.883 / 13466.854 - 1);
expect(new SinaStockTransform(HKCode, HKParams).getPercent()).toBe(24595.35 / 24710.59 - 1);
expect(new SinaStockTransform(USCode, USParams).getPercent()).toBe(26428.3203 / 26313.6504 - 1);
expect(() => new SinaStockTransform("000000", []).getPercent()).toThrow(new Error("不支持当前交易所"));
});
it("获取股票数据", async () => {
@ -87,7 +81,6 @@ describe("【新浪】股票数据转换测试", () => {
expect(new SinaStockTransform(SZCode, SZParams).getStock()).toStrictEqual({ code: 'SZ399001', name: '深证成指', percent: 13637.883 / 13466.854 - 1, now: 13637.883, low: 13399.859, high: 13748.034, yesterday: 13466.854 });
expect(new SinaStockTransform(HKCode, HKParams).getStock()).toStrictEqual({ code: 'HKHSI', name: '恒生指数', percent: 24595.35 / 24710.59 - 1, now: 24595.35, low: 24534.79, high: 24938.85, yesterday: 24710.59 });
expect(new SinaStockTransform(USCode, USParams).getStock()).toStrictEqual({ code: 'USDJI', name: '道琼斯', percent: 26428.3203 / 26313.6504 - 1, now: 26428.3203, low: 26013.5898, high: 26440.0195, yesterday: 26313.6504 });
expect(() => new SinaStockTransform("000000", []).getStock()).toThrow(new Error("不支持当前交易所"));
});
});