From 22bbc76ef58ef23f519db13a263aa27234c2a527 Mon Sep 17 00:00:00 2001 From: Ethan Shen <42264778+nczitzk@users.noreply.github.com> Date: Sat, 30 Apr 2022 23:03:30 +0800 Subject: [PATCH] =?UTF-8?q?fix(route):=20=E6=B7=B1=E5=9C=B3=E8=AF=81?= =?UTF-8?q?=E5=88=B8=E4=BA=A4=E6=98=93=E6=89=80=E9=97=AE=E8=AF=A2=E5=87=BD?= =?UTF-8?q?=E4=BB=B6=20(#9658)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(route): 深圳证券交易所问询函件 * fix typo * fix description * docs: fix category --- docs/finance.md | 83 +++++++++++++++++++++ docs/other.md | 74 ------------------ lib/router.js | 6 +- lib/routes/szse/inquire.js | 87 ---------------------- lib/routes/szse/projectdynamic.js | 103 -------------------------- lib/v2/szse/inquire.js | 41 ++++++++++ lib/v2/szse/maintainer.js | 3 + lib/{routes => v2}/szse/notice.js | 0 lib/v2/szse/projectdynamic.js | 90 ++++++++++++++++++++++ lib/v2/szse/radar.js | 20 +++++ lib/v2/szse/router.js | 3 + lib/v2/szse/rule.js | 6 +- lib/v2/szse/templates/description.art | 19 +++++ lib/v2/szse/templates/inquire.art | 6 ++ 14 files changed, 271 insertions(+), 270 deletions(-) delete mode 100644 lib/routes/szse/inquire.js delete mode 100644 lib/routes/szse/projectdynamic.js create mode 100644 lib/v2/szse/inquire.js rename lib/{routes => v2}/szse/notice.js (100%) create mode 100644 lib/v2/szse/projectdynamic.js create mode 100644 lib/v2/szse/templates/description.art create mode 100644 lib/v2/szse/templates/inquire.art diff --git a/docs/finance.md b/docs/finance.md index e303b493d3..f331db59b8 100644 --- a/docs/finance.md +++ b/docs/finance.md @@ -221,6 +221,89 @@ pageClass: routes +### 上市公司信息最新公告披露 + + + +### 可转换公司债券公告 + + + +### 科创板项目动态 + + + +### 监管问询 + + + +## 深圳证券交易所 + +### 上市公告 - 可转换债券 + + + +### 问询函件 + + + +类型 + +| 主板 | 创业板 | +| -- | --- | +| 0 | 1 | + +函件类别 + +| 全部函件类别 | 非许可类重组问询函 | 问询函 | 违法违规线索分析报告 | 许可类重组问询函 | 监管函(会计师事务所模板) | 提请关注函(会计师事务所模板) | 年报问询函 | 向中介机构发函 | 半年报问询函 | 关注函 | 公司部函 | 三季报问询函 | +| ------ | --------- | --- | ---------- | -------- | ------------- | --------------- | ----- | ------- | ------ | --- | ---- | ------ | + + + +### 最新规则 + + + +### 创业板项目动态 + + + +类型 + +| IPO | 再融资 | 重大资产重组 | +| --- | --- | ------ | +| 1 | 2 | 3 | + +阶段 + +| 全部 | 受理 | 问询 | 上市委会议 | +| -- | -- | -- | ----- | +| 0 | 10 | 20 | 30 | + +| 提交注册 | 注册结果 | 中止 | 终止 | +| ---- | ---- | -- | -- | +| 35 | 40 | 50 | 60 | + +状态 + +| 全部 | 新受理 | 已问询 | 通过 | 未通过 | +| -- | --- | --- | -- | --- | +| 0 | 20 | 30 | 45 | 44 | + +| 暂缓审议 | 复审通过 | 复审不通过 | 提交注册 | +| ---- | ---- | ----- | ---- | +| 46 | 56 | 54 | 60 | + +| 注册生效 | 不予注册 | 补充审核 | 终止注册 | +| ---- | ---- | ---- | ---- | +| 70 | 74 | 78 | 76 | + +| 中止 | 审核不通过 | 撤回 | +| -- | ----- | -- | +| 80 | 90 | 95 | + + + ## 世界经济论坛 ### 报告 diff --git a/docs/other.md b/docs/other.md index 74000e0382..a384dda4f5 100644 --- a/docs/other.md +++ b/docs/other.md @@ -751,80 +751,6 @@ type 为 all 时,category 参数不支持 cost 和 free -## 上海证券交易所 - -### 上市公司信息最新公告披露 - - - -## 上证债券信息网 - -### 可转换公司债券公告 - - - -### 科创板项目动态 - - - -### 监管问询 - - - -## 深圳证券交易所 - -### 上市公告 - 可转换债券 - - - -### 问询函件 (全部 / 主板 / 中小企业板 / 创业板) - - - -### 最新规则 - - - -### 创业板项目动态 - - - -类型 - -| IPO | 再融资 | 重大资产重组 | -| --- | --- | ------ | -| 1 | 2 | 3 | - -阶段 - -| 全部 | 受理 | 问询 | 上市委会议 | -| -- | -- | -- | ----- | -| 0 | 10 | 20 | 30 | - -| 提交注册 | 注册结果 | 中止 | 终止 | -| ---- | ---- | -- | -- | -| 35 | 40 | 50 | 60 | - -状态 - -| 全部 | 新受理 | 已问询 | 通过 | 未通过 | -| -- | --- | --- | -- | --- | -| 0 | 20 | 30 | 45 | 44 | - -| 暂缓审议 | 复审通过 | 复审不通过 | 提交注册 | -| ---- | ---- | ----- | ---- | -| 46 | 56 | 54 | 60 | - -| 注册生效 | 不予注册 | 补充审核 | 终止注册 | -| ---- | ---- | ---- | ---- | -| 70 | 74 | 78 | 76 | - -| 中止 | 审核不通过 | 撤回 | -| -- | ----- | -- | -| 80 | 90 | 95 | - - - ## 守望先锋 ### 补丁说明 diff --git a/lib/router.js b/lib/router.js index c8fe4cc927..9db2721f07 100644 --- a/lib/router.js +++ b/lib/router.js @@ -2029,9 +2029,9 @@ router.get('/sse/inquire', lazyloadRouteHandler('./routes/sse/inquire')); router.get('/sse/disclosure/:query?', lazyloadRouteHandler('./routes/sse/disclosure')); // 深圳证券交易所 -router.get('/szse/notice', lazyloadRouteHandler('./routes/szse/notice')); -router.get('/szse/inquire/:type', lazyloadRouteHandler('./routes/szse/inquire')); -router.get('/szse/projectdynamic/:type?/:stage?/:status?', lazyloadRouteHandler('./routes/szse/projectdynamic')); +// router.get('/szse/notice', lazyloadRouteHandler('./routes/szse/notice')); +// router.get('/szse/inquire/:type', lazyloadRouteHandler('./routes/szse/inquire')); +// router.get('/szse/projectdynamic/:type?/:stage?/:status?', lazyloadRouteHandler('./routes/szse/projectdynamic')); // 前端艺术家每日整理&&飞冰早报 router.get('/jskou/:type?', lazyloadRouteHandler('./routes/jskou/index')); diff --git a/lib/routes/szse/inquire.js b/lib/routes/szse/inquire.js deleted file mode 100644 index d023943ce9..0000000000 --- a/lib/routes/szse/inquire.js +++ /dev/null @@ -1,87 +0,0 @@ -const got = require('@/utils/got'); -const cheerio = require('cheerio'); - -module.exports = async (ctx) => { - const type = ctx.params.type; - const ptype = { - navall: { name: '主板+中小企业+创业板', tabkey: 'tab0', dataNum: 0, dataCategory: '全部', dataArr: [] }, - nav1: { name: '主板', tabkey: 'tab1', dataNum: 0, dataCategory: '主板', dataArr: [] }, - nav2: { name: '中小企业板', tabkey: 'tab2', dataNum: 1, dataCategory: '中小企业板', dataArr: [] }, - nav3: { name: '创业板', tabkey: 'tab3', dataNum: 2, dataCategory: '创业板', dataArr: [] }, - }; - function getUrl(params) { - const $ = cheerio.load(params); - const url = $('a').attr('encode-open'); - return url; - } - function restUrl(params) { - const $ = cheerio.load(params); - const getText = $('a').text(); - const url = $('a').attr('encode-open'); - const resthref = `http://reportdocs.static.szse.cn${url}`; - if (params !== '') { - params = `${getText}`; - } else { - params = ''; - } - return params; - } - for (const key in ptype) { - if (key !== 'navall') { - const host = 'http://www.szse.cn/'; - const link = `http://www.szse.cn/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=main_wxhj&TABKEY=${ptype[key].tabkey}&loading=first`; - // eslint-disable-next-line no-await-in-loop - const response = await got.get(link, { - Referer: host, - }); - const datNum = ptype[key].dataNum; - const temp = response.data; - ptype[key].dataArr = temp[datNum].data; - for (let i = 0; i < ptype[key].dataArr.length; i++) { - ptype[key].dataArr[i].category = ptype[key].dataCategory; - } - } - } - - let outList; - switch (type) { - case 'nav1': - outList = ptype.navall.dataArr.concat(ptype.nav1.dataArr); - break; - case 'nav2': - outList = ptype.navall.dataArr.concat(ptype.nav2.dataArr); - break; - case 'nav3': - outList = ptype.navall.dataArr.concat(ptype.nav3.dataArr); - break; - default: - outList = ptype.navall.dataArr.concat(ptype.nav1.dataArr, ptype.nav2.dataArr, ptype.nav3.dataArr); - break; - } - ctx.state.data = { - title: `深圳证券交易所——【${ptype[type].name}】问询函件`, - link: `http://www.szse.cn/disclosure/supervision/inquire/index.html`, - description: `深圳证券交易所/信息披露/监管信息公开/问询函件`, - item: outList.map((item) => ({ - title: `【${item.category}】` + item.gsjc, - category: item.category, - author: item.category, - description: - ` - - - - - - - -
公司代码 : ${item.gsdm}
公司简称 : ${item.gsjc}
发函日期 : ${item.fhrq}
函件类别 : ${item.hjlb}
函件内容 : ` + - restUrl(item.ck) + - `
公司回复 : ` + - restUrl(item.hfck) + - `
`, - pubDate: new Date(item.fhrq).toUTCString(), - link: `http://reportdocs.static.szse.cn${getUrl(item.ck)}`, - })), - }; -}; diff --git a/lib/routes/szse/projectdynamic.js b/lib/routes/szse/projectdynamic.js deleted file mode 100644 index 49a146a56e..0000000000 --- a/lib/routes/szse/projectdynamic.js +++ /dev/null @@ -1,103 +0,0 @@ -const got = require('@/utils/got'); -const { parseDate } = require('@/utils/parse-date'); - -module.exports = async (ctx) => { - const typeMap = { - 1: 'IPO', - 2: '再融资', - 3: '重大资产重组', - }; - - const stageMap = { - 10: '受理', - 20: '问询', - 30: '上市委会议', - 35: '提交注册', - 40: '注册结果', - 50: '中止', - 60: '终止', - }; - - const statusMap = { - 20: '新受理', - 30: '已问询', - 45: '通过', - 44: '未通过', - 46: '暂缓审议', - 56: '复审通过', - 54: '复审不通过', - 60: '提交注册', - 70: '注册生效', - 74: '不予注册', - 78: '补充审核', - 76: '终止注册', - 80: '中止', - 90: '审核不通过', - 95: '撤回', - }; - - const type = ctx.params.type || '1'; - const stage = ctx.params.stage || '0'; - const status = ctx.params.status || '0'; - - const rootUrl = 'http://listing.szse.cn'; - const apiUrl = `${rootUrl}/api/ras/projectrends/query?bizType=${type}${stage === '0' ? '' : `&stage=${stage}`}${status === '0' ? '' : `&status=${status}`}&pageIndex=0&pageSize=20`; - - const response = await got({ - method: 'get', - url: apiUrl, - }); - - const list = response.data.data.map((item) => ({ - title: item.prjid, - link: `${rootUrl}/api/ras/projectrends/details?id=${item.prjid}`, - })); - - const items = await Promise.all( - list.map((item) => - ctx.cache.tryGet(item.link, async () => { - const detailResponse = await got({ - method: 'get', - url: item.link, - }); - - const data = detailResponse.data.data; - const current = JSON.parse(data.pjdot)['-1']; - - item.link = `${rootUrl}/projectdynamic/ipo/detail/index.html?id=${item.title}`; - item.title = `[${data.prjst}] ${data.cmpnm} (${data.cmpsnm})- ${data.csrcind}`; - - item.description = - `

${data.cmpnm}

${current.startTime} ${current.name}

项目基本信息

` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `` + - `
公司全称${data.cmpnm}公司简称${data.cmpsnm}
受理日期${data.acptdt}更新日期${data.updtdt}
审核状态${data.prjst}预计融资金额(亿元)${data.maramt}
保荐机构${data.sprinst}保荐代表人${data.sprrep}
会计师事务所${data.acctfm}签字会计师${data.acctsgnt}
律师事务所${data.lawfm}签字律师${data.lglsgnt}
评估机构${data.evalinst}签字评估师${data.evalsgnt}
最近一期审计基准日${data.lastestAuditEndDate}
`; - - item.pubDate = parseDate(current.startTime, 'YYYY-MM-DD HH:mm:ss'); - - return item; - }) - ) - ); - - ctx.state.data = { - title: `${typeMap[type]}项目动态${status !== '0' ? ` (${statusMap[status]}) ` : stage !== '0' ? ` (${stageMap[stage]}) ` : ''} - 创业板发行上市审核信息公开网站 - 深圳证券交易所`, - link: `${rootUrl}/projectdynamic/${type}/index.html`, - item: items, - }; -}; diff --git a/lib/v2/szse/inquire.js b/lib/v2/szse/inquire.js new file mode 100644 index 0000000000..c608021f1f --- /dev/null +++ b/lib/v2/szse/inquire.js @@ -0,0 +1,41 @@ +const got = require('@/utils/got'); +const { parseDate } = require('@/utils/parse-date'); +const { art } = require('@/utils/render'); +const path = require('path'); + +module.exports = async (ctx) => { + const category = ctx.params.category ?? '0'; + const select = ctx.params.select ?? '全部函件类别'; + const keyword = ctx.params.keyword ?? ''; + + const rootUrl = 'https://www.szse.cn'; + const currentUrl = `${rootUrl}/api/report/ShowReport/data?SHOWTYPE=JSON&CATALOGID=main_wxhj&TABKEY=tab${parseInt(category) + 2}${select === '全部函件类别' ? '' : `&selecthjlb=${select}`}${keyword ? `&txtZqdm=${keyword}` : ''}`; + + const response = await got({ + method: 'get', + url: currentUrl, + }); + + const data = response.data[category]; + + const items = data.data.map((item) => { + item.ck = item.ck.match(/encode-open='\/(.*)'>详细内容/)[1]; + item.hfck = item.hfck.replace(/encode-open='\//, "encode-open='http://reportdocs.static.szse.cn/"); + + return { + title: `[${item.gsdm}] ${item.gsjc} (${item.hjlb})`, + link: `http://reportdocs.static.szse.cn/${item.ck}`, + pubDate: parseDate(item.fhrq), + description: art(path.join(__dirname, 'templates/inquire.art'), { + item, + }), + }; + }); + + ctx.state.data = { + title: `深圳证券交易所 - 问询函件 - ${data.metadata.name}`, + link: `${rootUrl}/disclosure/supervision/inquire/index.html`, + item: items, + description: `函件类别:${select}${keyword ? `; 公司代码或简称:${keyword}` : ''}`, + }; +}; diff --git a/lib/v2/szse/maintainer.js b/lib/v2/szse/maintainer.js index d1e8166866..ff1ac450c5 100644 --- a/lib/v2/szse/maintainer.js +++ b/lib/v2/szse/maintainer.js @@ -1,3 +1,6 @@ module.exports = { + '/inquire/:category?/:select?/:keyword?': ['Jeason0228', 'nczitzk'], + '/notice': ['Jeason0228', 'nczitzk'], + '/projectdynamic/:type?/:stage?/:status?': ['nczitzk'], '/rule': ['nczitzk'], }; diff --git a/lib/routes/szse/notice.js b/lib/v2/szse/notice.js similarity index 100% rename from lib/routes/szse/notice.js rename to lib/v2/szse/notice.js diff --git a/lib/v2/szse/projectdynamic.js b/lib/v2/szse/projectdynamic.js new file mode 100644 index 0000000000..8eda37ebbf --- /dev/null +++ b/lib/v2/szse/projectdynamic.js @@ -0,0 +1,90 @@ +const got = require('@/utils/got'); +const timezone = require('@/utils/timezone'); +const { parseDate } = require('@/utils/parse-date'); +const { art } = require('@/utils/render'); +const path = require('path'); + +module.exports = async (ctx) => { + const typeMap = { + 1: 'IPO', + 2: '再融资', + 3: '重大资产重组', + }; + + const stageMap = { + 10: '受理', + 20: '问询', + 30: '上市委会议', + 35: '提交注册', + 40: '注册结果', + 50: '中止', + 60: '终止', + }; + + const statusMap = { + 20: '新受理', + 30: '已问询', + 45: '通过', + 44: '未通过', + 46: '暂缓审议', + 56: '复审通过', + 54: '复审不通过', + 60: '提交注册', + 70: '注册生效', + 74: '不予注册', + 78: '补充审核', + 76: '终止注册', + 80: '中止', + 90: '审核不通过', + 95: '撤回', + }; + + const type = ctx.params.type ?? '1'; + const stage = ctx.params.stage ?? '0'; + const status = ctx.params.status ?? '0'; + + const rootUrl = 'http://listing.szse.cn'; + const apiUrl = `${rootUrl}/api/ras/projectrends/query?bizType=${type}${stage === '0' ? '' : `&stage=${stage}`}${status === '0' ? '' : `&status=${status}`}&pageIndex=0&pageSize=20`; + + const response = await got({ + method: 'get', + url: apiUrl, + }); + + let items = response.data.data.map((item) => ({ + title: item.prjid, + link: `${rootUrl}/api/ras/projectrends/details?id=${item.prjid}`, + })); + + items = await Promise.all( + items.map((item) => + ctx.cache.tryGet(item.link, async () => { + const detailResponse = await got({ + method: 'get', + url: item.link, + }); + + const data = detailResponse.data.data; + const current = JSON.parse(data.pjdot)['-1']; + + item.link = `${rootUrl}/projectdynamic/ipo/detail/index.html?id=${item.title}`; + item.title = `[${data.prjst}] ${data.cmpnm} (${data.cmpsnm})- ${data.csrcind}`; + + item.description = art(path.join(__dirname, 'templates/description.art'), { + data, + current, + }); + + item.pubDate = timezone(parseDate(current.startTime, 'YYYY-MM-DD HH:mm:ss'), +8); + + return item; + }) + ) + ); + + ctx.state.data = { + title: `${typeMap[type]}项目动态${status !== '0' ? ` (${statusMap[status]}) ` : stage !== '0' ? ` (${stageMap[stage]}) ` : ''} - 创业板发行上市审核信息公开网站 - 深圳证券交易所`, + link: `${rootUrl}/projectdynamic/${type}/index.html`, + item: items, + }; +}; diff --git a/lib/v2/szse/radar.js b/lib/v2/szse/radar.js index d9099c4f1c..020c6db77d 100644 --- a/lib/v2/szse/radar.js +++ b/lib/v2/szse/radar.js @@ -2,6 +2,18 @@ module.exports = { 'szse.cn': { _name: '深圳证券交易所', '.': [ + { + title: '上市公告 - 可转换债券', + docs: 'https://docs.rsshub.app/other.html#shen-zhen-zheng-quan-jiao-yi-suo-shang-shi-gong-gao-ke-zhu-huan-zheng-zhi-quan', + source: ['/disclosure/notice/company/index.html', '/'], + target: '/szse/notice', + }, + { + title: '问询函件', + docs: 'https://docs.rsshub.app/other.html#shen-zhen-zheng-quan-jiao-yi-suo-wen-xun-huan-jian', + source: ['/disclosure/supervision/inquire/index.html', '/'], + target: '/szse/inquire', + }, { title: '最新规则', docs: 'https://docs.rsshub.app/other.html#shen-zhen-zheng-quan-jiao-yi-suo-zui-xin-gui-ze', @@ -9,5 +21,13 @@ module.exports = { target: '/szse/rule', }, ], + listing: [ + { + title: '创业板项目动态', + docs: 'https://docs.rsshub.app/other.html#shen-zhen-zheng-quan-jiao-yi-suo-chuang-ye-ban-xiang-mu-dong-tai', + source: ['/projectdynamic/1/index.html', '/projectdynamic/2/index.html', '/projectdynamic/3/index.html', '/'], + target: '/szse/projectdynamic/:type?/:stage?/:status?', + }, + ], }, }; diff --git a/lib/v2/szse/router.js b/lib/v2/szse/router.js index 1fc4370589..5dd6c40897 100644 --- a/lib/v2/szse/router.js +++ b/lib/v2/szse/router.js @@ -1,3 +1,6 @@ module.exports = function (router) { + router.get('/inquire/:category?/:select?/:keyword?', require('./inquire')); + router.get('/notice', require('./notice')); + router.get('/projectdynamic/:type?/:stage?/:status?', require('./projectdynamic')); router.get('/rule', require('./rule')); }; diff --git a/lib/v2/szse/rule.js b/lib/v2/szse/rule.js index baf98df3a9..73779a6eb0 100644 --- a/lib/v2/szse/rule.js +++ b/lib/v2/szse/rule.js @@ -20,14 +20,14 @@ module.exports = async (ctx) => { }, }); - const list = response.data.data.map((item) => ({ + let items = response.data.data.map((item) => ({ title: item.doctitle, link: item.docpuburl, pubDate: parseDate(item.docpubtime), })); - const items = await Promise.all( - list.map((item) => + items = await Promise.all( + items.map((item) => ctx.cache.tryGet(item.link, async () => { const detailResponse = await got({ method: 'get', diff --git a/lib/v2/szse/templates/description.art b/lib/v2/szse/templates/description.art new file mode 100644 index 0000000000..18c9679f5f --- /dev/null +++ b/lib/v2/szse/templates/description.art @@ -0,0 +1,19 @@ +

{{ data.cmpnm }}

{{ current.startTime }} {{ current.name }}

项目基本信息

+ + + + + + + + + + + + + + + + + +
公司全称{{ cmpnm }}公司简称{{ data.cmpsnm }}
受理日期{{ data.acptdt }}更新日期{{ data.updtdt }}
审核状态{{ data.prjst }}预计融资金额(亿元){{ data.maramt }}
保荐机构{{ data.sprinst }}保荐代表人{{ data.sprrep }}
会计师事务所{{ data.acctfm }}签字会计师{{ data.acctsgnt }}
律师事务所{{ data.lawfm }}签字律师{{ data.lglsgnt }}
评估机构{{ data.evalinst }}签字评估师{{ data.evalsgnt }}
最近一期审计基准日{{ data.lastestAuditEndDate }}
\ No newline at end of file diff --git a/lib/v2/szse/templates/inquire.art b/lib/v2/szse/templates/inquire.art new file mode 100644 index 0000000000..7929c17eb9 --- /dev/null +++ b/lib/v2/szse/templates/inquire.art @@ -0,0 +1,6 @@ +

公司代码:{{ item.gsdm }}

+

公司简称:{{ item.gsjc }}

+

发函日期:{{ item.fhrq }}

+

函件类别:{{ item.hjlb }}

+

函件内容:详细内容

+

公司回复:{{@ item.hfck }}

\ No newline at end of file