arms-app 1.0.68 → 1.0.70

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,224 +0,0 @@
1
- <template>
2
- <section class="listed-companies-page">
3
- <h1>并购企业</h1>
4
- <div>
5
- <el-form :model="filters" label-position="top" size="mini">
6
- <el-row :gutter="12">
7
- <el-col :span="5">
8
- <el-form-item label="并购方名称">
9
- <el-input v-model="filters.acquirer" placeholder="请输入" clearable size="mini" style="width: 100%" />
10
- </el-form-item>
11
- </el-col>
12
- <el-col :span="5">
13
- <el-form-item label="被并购方名称">
14
- <el-input v-model="filters.target" placeholder="请输入" clearable size="mini" style="width: 100%" />
15
- </el-form-item>
16
- </el-col>
17
- <el-col :span="5">
18
- <el-form-item label="交易方式">
19
- <el-select v-model="filters.method" placeholder="请选择" clearable size="mini" style="width: 100%">
20
- <el-option v-for="opt in methodOptions" :key="opt.value" :label="opt.label" :value="opt.value" />
21
- </el-select>
22
- </el-form-item>
23
- </el-col>
24
- <el-col :span="5">
25
- <el-form-item label=" ">
26
- <el-button type="primary" size="mini" @click="applyFilters">查询</el-button>
27
- <el-button size="mini" @click="resetFilters">重置</el-button>
28
- </el-form-item>
29
- </el-col>
30
- </el-row>
31
- </el-form>
32
- </div>
33
-
34
- <el-table
35
- :data="pagedRows"
36
- stripe
37
- border
38
- style="width: 100%"
39
- @sort-change="onSortChange"
40
- >
41
- <el-table-column type="index" label="序号" width="56" align="center" header-align="center" />
42
- <el-table-column prop="name" label="并购方" align="center" header-align="center">
43
- <template slot-scope="scope">
44
- <div class="name-row">
45
- <span class="name">{{ scope.row.name }}</span>
46
- <span class="code">({{ scope.row.code }})</span>
47
- </div>
48
- <div class="sub-row">
49
- <el-tag size="mini">{{ scope.row.exchange }}</el-tag>
50
- <el-tag size="mini" type="info">{{ scope.row.region }}</el-tag>
51
- </div>
52
- </template>
53
- </el-table-column>
54
- <el-table-column prop="customerTags" label="客户标签" align="center" header-align="center">
55
- <template slot-scope="scope">
56
- <div class="tag-list">
57
- <el-tag v-for="(t, i) in (scope.row.customerTags || [scope.row.customerLevel])" :key="i" size="mini" type="info">{{ t }}</el-tag>
58
- </div>
59
- </template>
60
- </el-table-column>
61
- <el-table-column prop="targetName" label="被并购方" align="center" header-align="center" />
62
- <el-table-column prop="targetShortName" label="被并购方简称" align="center" header-align="center" />
63
- <el-table-column prop="industry" label="行业" align="center" header-align="center" />
64
- <el-table-column prop="region" label="地区" align="center" header-align="center" />
65
- <el-table-column prop="startDate" label="开始时间" sortable="custom" align="center" header-align="center">
66
- <template slot-scope="scope">{{ formatDate(scope.row.startDate) }}</template>
67
- </el-table-column>
68
- <el-table-column prop="closingDate" label="完成时间" sortable="custom" align="center" header-align="center">
69
- <template slot-scope="scope">{{ formatDate(scope.row.closingDate) }}</template>
70
- </el-table-column>
71
- <el-table-column prop="tradeStatus" label="交易状态" align="center" header-align="center" />
72
- <el-table-column prop="tradeMethod" label="交易方式" align="center" header-align="center">
73
- <template slot-scope="scope">{{ methodLabel(scope.row.tradeMethod) }}</template>
74
- </el-table-column>
75
- <el-table-column prop="amount" label="交易金额" align="center" header-align="center" sortable="custom">
76
- <template slot-scope="scope">{{ formatCurrency(scope.row.amount) }}</template>
77
- </el-table-column>
78
- <el-table-column prop="amountCNY" label="交易金额(人民币)" align="center" header-align="center">
79
- <template slot-scope="scope">{{ formatCurrency(scope.row.amountCNY) }}</template>
80
- </el-table-column>
81
- <el-table-column prop="equityPercent" label="交易股权" align="center" header-align="center" sortable="custom">
82
- <template slot-scope="scope">{{ (scope.row.equityPercent != null ? scope.row.equityPercent : 0) + '%' }}</template>
83
- </el-table-column>
84
- <el-table-column prop="valuation" label="估值(人民币)" align="center" header-align="center" sortable="custom">
85
- <template slot-scope="scope">{{ formatCurrency(scope.row.valuation) }}</template>
86
- </el-table-column>
87
- </el-table>
88
-
89
- <div>
90
- <el-pagination
91
- layout="prev, pager, next, sizes, total"
92
- :current-page.sync="page.current"
93
- :page-size.sync="page.size"
94
- :page-sizes="[10,20,30,50]"
95
- :total="filteredRows.length"
96
- @current-change="onPageChange"
97
- @size-change="onSizeChange"
98
- />
99
- </div>
100
- </section>
101
-
102
- </template>
103
-
104
- <script>
105
- export default {
106
- name: 'ListedCompaniesView',
107
- data() {
108
- return {
109
- keyword: '',
110
- filters: { acquirer: '', target: '', method: '' },
111
- methodOptions: [
112
- { label: '现金', value: 'cash' },
113
- { label: '股票发行', value: 'stock' },
114
- { label: '混合', value: 'hybrid' }
115
- ],
116
- sort: { prop: '', order: '' },
117
- page: { current: 1, size: 10 },
118
- rows: [
119
- { name: '博雅医药', code: '000013', exchange: '创业板', region: '四川', industry: '医药', customerLevel: 'NK', customerTags: ['NK','电子产品厂','后备供应商'], targetName: '华康制药', targetShortName: '华康', startDate: '2024-01-10', closingDate: '2024-03-28', tradeStatus: '已完成', tradeMethod: 'cash', amount: 120000000, amountCNY: 120000000, equityPercent: 35, valuation: 350000000 },
120
- { name: '优选消费', code: '000014', exchange: '沪深A股', region: '福建', industry: '消费', customerLevel: 'A', targetName: '乐享食品', targetShortName: '乐享', startDate: '2019-06-02', closingDate: '2019-07-11', tradeStatus: '已完成', tradeMethod: 'stock', amount: 90000000, amountCNY: 90000000, equityPercent: 20, valuation: 260000000 },
121
- { name: '恒材材料', code: '000015', exchange: '科创板', region: '上海', industry: '材料', customerLevel: 'B', customerTags: ['B','新材料','重点供应商'], targetName: '新材科技', targetShortName: '新材', startDate: '2024-07-01', closingDate: '2024-09-20', tradeStatus: '已完成', tradeMethod: 'hybrid', amount: 135000000, amountCNY: 135000000, equityPercent: 28, valuation: 420000000 },
122
- { name: '联通通信', code: '000016', exchange: '沪深A股', region: '广东', industry: '通信', customerLevel: 'C', targetName: '朗讯通讯', targetShortName: '朗讯', startDate: '2015-08-01', closingDate: '2015-10-12', tradeStatus: '已完成', tradeMethod: 'cash', amount: 75000000, amountCNY: 75000000, equityPercent: 15, valuation: 180000000 },
123
- { name: '远景能源', code: '000017', exchange: '沪深A股', region: '内蒙古', industry: '能源', customerLevel: 'A', targetName: '清源电力', targetShortName: '清源', startDate: '2020-03-01', closingDate: '2020-05-06', tradeStatus: '已完成', tradeMethod: 'stock', amount: 210000000, amountCNY: 210000000, equityPercent: 42, valuation: 680000000 },
124
- { name: '未来科技', code: '000018', exchange: '科创板', region: '上海', industry: '科技', customerLevel: 'S', targetName: '数云科技', targetShortName: '数云', startDate: '2022-12-20', closingDate: '2023-02-18', tradeStatus: '已完成', tradeMethod: 'hybrid', amount: 420000000, amountCNY: 420000000, equityPercent: 51, valuation: 980000000 },
125
- { name: '工匠制造', code: '000019', exchange: '沪深A股', region: '安徽', industry: '制造', customerLevel: 'B', targetName: '精工机械', targetShortName: '精工', startDate: '2021-02-10', closingDate: '2021-03-30', tradeStatus: '已完成', tradeMethod: 'cash', amount: 56000000, amountCNY: 56000000, equityPercent: 18, valuation: 150000000 },
126
- { name: '卓越金融', code: '000020', exchange: '港股', region: '香港', industry: '金融', customerLevel: 'A', targetName: '恒盛资管', targetShortName: '恒盛', startDate: '2014-10-20', closingDate: '2014-12-01', tradeStatus: '已完成', tradeMethod: 'stock', amount: 320000000, amountCNY: 320000000, equityPercent: 33, valuation: 760000000 },
127
- { name: '广域地产', code: '000021', exchange: '沪深A股', region: '广东', industry: '地产', customerLevel: 'B', targetName: '新城置地', targetShortName: '新城', startDate: '2018-09-02', closingDate: '2018-11-07', tradeStatus: '已完成', tradeMethod: 'hybrid', amount: 270000000, amountCNY: 270000000, equityPercent: 25, valuation: 500000000 },
128
- { name: '星海科技', code: '000022', exchange: '科创板', region: '北京', industry: '科技', customerLevel: 'C', targetName: '极光智能', targetShortName: '极光', startDate: '2022-04-05', closingDate: '2022-06-10', tradeStatus: '已完成', tradeMethod: 'stock', amount: 600000000, amountCNY: 600000000, equityPercent: 60, valuation: 1200000000 }
129
- ]
130
- };
131
- },
132
- computed: {
133
- filteredRows() {
134
- const kw = (this.keyword || '').trim().toLowerCase();
135
- const acq = (this.filters.acquirer || '').trim().toLowerCase();
136
- const tgt = (this.filters.target || '').trim().toLowerCase();
137
- const method = this.filters.method || '';
138
- return this.rows.filter(r => {
139
- const okKw = kw ? (r.name.toLowerCase().includes(kw) || r.code.toLowerCase().includes(kw)) : true;
140
- const okAcq = acq ? r.name.toLowerCase().includes(acq) : true;
141
- const okTgt = tgt ? (r.targetName || '').toLowerCase().includes(tgt) : true;
142
- const okMethod = method ? r.tradeMethod === method : true;
143
- return okKw && okAcq && okTgt && okMethod;
144
- });
145
- },
146
- sortedRows() {
147
- const arr = this.filteredRows.slice();
148
- const prop = this.sort.prop;
149
- const order = this.sort.order;
150
- if (!prop || !order) return arr;
151
- arr.sort((a, b) => {
152
- const va = a[prop];
153
- const vb = b[prop];
154
- if (prop === 'closingDate' || prop === 'listedDate') {
155
- const ta = new Date(va).getTime();
156
- const tb = new Date(vb).getTime();
157
- return order === 'ascending' ? ta - tb : tb - ta;
158
- }
159
- if (typeof va === 'number' && typeof vb === 'number') {
160
- return order === 'ascending' ? va - vb : vb - va;
161
- }
162
- const sa = String(va || '').localeCompare(String(vb || ''));
163
- return order === 'ascending' ? sa : -sa;
164
- });
165
- return arr;
166
- },
167
- pagedRows() {
168
- const start = (this.page.current - 1) * this.page.size;
169
- return this.filteredRows.slice(start, start + this.page.size);
170
- }
171
- },
172
- methods: {
173
- onSearch() {},
174
- formatDate(d) {
175
- if (!d) return '';
176
- const dt = new Date(d);
177
- const y = dt.getFullYear();
178
- const m = String(dt.getMonth() + 1).padStart(2, '0');
179
- const day = String(dt.getDate()).padStart(2, '0');
180
- return `${y}-${m}-${day}`;
181
- },
182
- statusTagType(st) {
183
- if (st === '正常') return 'success';
184
- if (st === '风险') return 'warning';
185
- if (st === '退市') return 'danger';
186
- return 'info';
187
- },
188
- methodLabel(v) {
189
- if (v === 'cash') return '现金';
190
- if (v === 'stock') return '股票发行';
191
- if (v === 'hybrid') return '混合';
192
- return '—';
193
- },
194
- formatCurrency(n) {
195
- const v = Number(n || 0);
196
- return v.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
197
- },
198
- formatNumber(n) {
199
- const v = Number(n || 0);
200
- return v.toLocaleString('zh-CN');
201
- },
202
- onSortChange({ prop, order }) {
203
- this.sort = { prop, order };
204
- },
205
- applyFilters() {
206
- this.page.current = 1;
207
- },
208
- resetFilters() {
209
- this.filters = { acquirer: '', target: '', method: '' };
210
- this.page.current = 1;
211
- },
212
- onPageChange(page) {
213
- this.page.current = page;
214
- },
215
- onSizeChange(size) {
216
- this.page.size = size;
217
- this.page.current = 1;
218
- }
219
- }
220
- };
221
- </script>
222
-
223
- <style scoped>
224
- </style>
@@ -1,206 +0,0 @@
1
- <template>
2
- <section class="listed-enterprises-page">
3
- <h1>上市企业</h1>
4
-
5
- <div class="filters">
6
- <el-form label-position="top" size="mini">
7
- <el-row :gutter="12">
8
- <el-col :span="6">
9
- <el-form-item label="股票名称">
10
- <el-input v-model="filters.stockName" size="mini" placeholder="请输入" clearable @keyup.enter.native="applyFilters" style="width: 100%" />
11
- </el-form-item>
12
- </el-col>
13
- <el-col :span="6">
14
- <el-form-item label="上市时间">
15
- <el-date-picker v-model="filters.listedDate" type="date" placeholder="请选择" size="mini" style="width: 100%" />
16
- </el-form-item>
17
- </el-col>
18
- <el-col :span="6">
19
- <el-form-item label="是否专精特新">
20
- <el-select v-model="filters.specialized" size="mini" placeholder="请选择" clearable style="width: 100%">
21
- <el-option :label="'是'" :value="true" />
22
- <el-option :label="'否'" :value="false" />
23
- </el-select>
24
- </el-form-item>
25
- </el-col>
26
- <el-col :span="6">
27
- <el-form-item label=" ">
28
- <el-button type="primary" size="mini" @click="applyFilters">查询</el-button>
29
- <el-button size="mini" @click="resetFilters">重置</el-button>
30
- </el-form-item>
31
- </el-col>
32
- </el-row>
33
- </el-form>
34
- </div>
35
-
36
- <el-table :data="pagedRows" border stripe size="small" @sort-change="onSortChange">
37
- <el-table-column type="index" label="序号" width="56" align="center" header-align="center" />
38
- <el-table-column prop="stockName" label="股票名称" min-width="160">
39
- <template slot-scope="scope">
40
- <div class="name-row">
41
- <span class="name">{{ scope.row.stockName }}</span>
42
- <span class="code">({{ scope.row.code }})</span>
43
- </div>
44
- <div class="sub-row">
45
- <el-tag size="mini">{{ scope.row.exchange }}</el-tag>
46
- </div>
47
- </template>
48
- </el-table-column>
49
- <el-table-column prop="customerTags" label="客户标签" min-width="160">
50
- <template slot-scope="scope">
51
- <div class="tag-list">
52
- <el-tag v-for="(t,i) in (scope.row.customerTags || [])" :key="i" size="mini" type="info">{{ t }}</el-tag>
53
- </div>
54
- </template>
55
- </el-table-column>
56
- <el-table-column prop="listedDate" label="上市时间" min-width="120" sortable="custom">
57
- <template slot-scope="scope">{{ formatDate(scope.row.listedDate) }}</template>
58
- </el-table-column>
59
- <el-table-column prop="exchange" label="交易所" min-width="120" />
60
- <el-table-column prop="code" label="股票代码" min-width="120" />
61
- <el-table-column prop="marketCap" label="当前市值" min-width="140" align="right" sortable="custom">
62
- <template slot-scope="scope">{{ formatCurrency(scope.row.marketCap) }}</template>
63
- </el-table-column>
64
- <el-table-column prop="peTtm" label="市盈率TTM" min-width="120" align="right" sortable="custom">
65
- <template slot-scope="scope">{{ formatNumber(scope.row.peTtm) }}</template>
66
- </el-table-column>
67
- <el-table-column prop="companyName" label="企业名称" min-width="180" />
68
- <el-table-column prop="industryDomain" label="行业领域" min-width="140" />
69
- <el-table-column prop="hq" label="总部" min-width="120" />
70
- <el-table-column prop="registeredRegion" label="注册地区" min-width="120" />
71
- <el-table-column prop="establishedDate" label="成立时间" min-width="120" sortable="custom">
72
- <template slot-scope="scope">{{ formatDate(scope.row.establishedDate) }}</template>
73
- </el-table-column>
74
- <el-table-column prop="issuePrice" label="发行价" min-width="120" align="right" sortable="custom">
75
- <template slot-scope="scope">{{ formatCurrency(scope.row.issuePrice) }}</template>
76
- </el-table-column>
77
- <el-table-column prop="raisedAmount" label="实际募集" min-width="140" align="right" sortable="custom">
78
- <template slot-scope="scope">{{ formatCurrency(scope.row.raisedAmount) }}</template>
79
- </el-table-column>
80
- <el-table-column prop="vcBacked" label="是否创投" min-width="100" align="center">
81
- <template slot-scope="scope">{{ scope.row.vcBacked ? '是' : '否' }}</template>
82
- </el-table-column>
83
- <el-table-column prop="totalRounds" label="累计融资数" min-width="120" align="center" sortable="custom" />
84
- <el-table-column prop="totalFinancing" label="累计融资金额" min-width="160" align="right" sortable="custom">
85
- <template slot-scope="scope">{{ formatCurrency(scope.row.totalFinancing) }}</template>
86
- </el-table-column>
87
- <el-table-column prop="investorCount" label="参与机构数" min-width="120" align="center" sortable="custom" />
88
- </el-table>
89
-
90
- <div class="pager">
91
- <el-pagination
92
- layout="prev, pager, next, sizes, total"
93
- :current-page.sync="page.current"
94
- :page-size.sync="page.size"
95
- :page-sizes="[10,20,30,50]"
96
- :total="filteredRows.length"
97
- @current-change="onPageChange"
98
- @size-change="onSizeChange"
99
- />
100
- </div>
101
- </section>
102
- </template>
103
-
104
- <script>
105
- export default {
106
- name: 'ListedEnterprisesView',
107
- data() {
108
- return {
109
- filters: { stockName: '', listedDate: null, specialized: null },
110
- sort: { prop: '', order: '' },
111
- page: { current: 1, size: 10 },
112
- rows: [
113
- { stockName: '北一金', companyName: '北一金能源技术', code: '000001', exchange: '沪深A股', customerTags: ['重点客户'], listedDate: '2024-03-21', marketCap: 185032000000, peTtm: 28.3, industryDomain: '能源', hq: '北京', registeredRegion: '北京', establishedDate: '2016-05-12', issuePrice: 12.68, raisedAmount: 300000000, vcBacked: true, totalRounds: 6, totalFinancing: 1200000000, investorCount: 12 },
114
- { stockName: '星海科技', companyName: '星海科技股份有限公司', code: '000022', exchange: '科创板', customerTags: ['战略客户'], listedDate: '2023-11-01', marketCap: 60011000000, peTtm: 45.8, industryDomain: '科技', hq: '北京', registeredRegion: '北京', establishedDate: '2018-01-10', issuePrice: 38.20, raisedAmount: 150000000, vcBacked: true, totalRounds: 4, totalFinancing: 520000000, investorCount: 8 },
115
- { stockName: '优选消费', companyName: '优选消费集团', code: '000014', exchange: '沪深A股', customerTags: ['普通客户'], listedDate: '2019-06-02', marketCap: 20513000000, peTtm: 18.6, industryDomain: '消费', hq: '福建', registeredRegion: '福建', establishedDate: '2007-08-11', issuePrice: 9.50, raisedAmount: 60000000, vcBacked: false, totalRounds: 2, totalFinancing: 120000000, investorCount: 5 },
116
- { stockName: '恒材材料', companyName: '恒材新材料股份', code: '000015', exchange: '科创板', customerTags: ['新材料'], listedDate: '2024-10-21', marketCap: 15844000000, peTtm: 32.1, industryDomain: '材料', hq: '上海', registeredRegion: '上海', establishedDate: '2020-04-17', issuePrice: 21.30, raisedAmount: 90000000, vcBacked: false, totalRounds: 3, totalFinancing: 210000000, investorCount: 7 },
117
- { stockName: '联通通信', companyName: '联通通信科技', code: '000016', exchange: '沪深A股', customerTags: ['战略客户'], listedDate: '2023-08-01', marketCap: 72002000000, peTtm: 22.9, industryDomain: '通信', hq: '广东', registeredRegion: '广东', establishedDate: '2005-06-02', issuePrice: 16.80, raisedAmount: 200000000, vcBacked: true, totalRounds: 7, totalFinancing: 980000000, investorCount: 15 },
118
- { stockName: '远景能源', companyName: '远景能源集团', code: '000017', exchange: '沪深A股', customerTags: ['普通客户'], listedDate: '2022-10-10', marketCap: 40821000000, peTtm: 19.2, industryDomain: '能源', hq: '内蒙古', registeredRegion: '内蒙古', establishedDate: '2010-12-13', issuePrice: 11.20, raisedAmount: 100000000, vcBacked: false, totalRounds: 4, totalFinancing: 430000000, investorCount: 9 },
119
- { stockName: '康宁医药', companyName: '康宁医药集团', code: '000013', exchange: '创业板', customerTags: ['后备供应商'], listedDate: '2024-03-09', marketCap: 28566000000, peTtm: 35.6, industryDomain: '医药', hq: '四川', registeredRegion: '四川', establishedDate: '2019-05-09', issuePrice: 23.50, raisedAmount: 50000000, vcBacked: true, totalRounds: 2, totalFinancing: 150000000, investorCount: 6 }
120
- ]
121
- };
122
- },
123
- computed: {
124
- filteredRows() {
125
- const name = (this.filters.stockName || '').trim().toLowerCase();
126
- const listedDate = this.filters.listedDate ? this.formatDate(this.filters.listedDate) : '';
127
- const specialized = this.filters.specialized;
128
- return this.rows.filter(r => {
129
- const okName = name ? (r.stockName.toLowerCase().includes(name) || r.code.toLowerCase().includes(name)) : true;
130
- const okDate = listedDate ? this.formatDate(r.listedDate) === listedDate : true;
131
- const okSpec = specialized === null ? true : r.vcBacked === specialized;
132
- return okName && okDate && okSpec;
133
- });
134
- },
135
- sortedRows() {
136
- const arr = this.filteredRows.slice();
137
- const { prop, order } = this.sort;
138
- if (!prop || !order) return arr;
139
- arr.sort((a, b) => {
140
- const va = a[prop];
141
- const vb = b[prop];
142
- if (prop === 'listedDate' || prop === 'establishedDate') {
143
- const ta = new Date(va).getTime();
144
- const tb = new Date(vb).getTime();
145
- return order === 'ascending' ? ta - tb : tb - ta;
146
- }
147
- if (typeof va === 'number' && typeof vb === 'number') {
148
- return order === 'ascending' ? va - vb : vb - va;
149
- }
150
- const sa = String(va || '').localeCompare(String(vb || ''));
151
- return order === 'ascending' ? sa : -sa;
152
- });
153
- return arr;
154
- },
155
- pagedRows() {
156
- const start = (this.page.current - 1) * this.page.size;
157
- return this.sortedRows.slice(start, start + this.page.size);
158
- }
159
- },
160
- methods: {
161
- applyFilters() {
162
- this.page.current = 1;
163
- },
164
- resetFilters() {
165
- this.filters = { stockName: '', listedDate: null, specialized: null };
166
- this.page.current = 1;
167
- },
168
- onSortChange({ prop, order }) {
169
- this.sort = { prop, order };
170
- this.page.current = 1;
171
- },
172
- onPageChange(p) {
173
- this.page.current = p;
174
- },
175
- onSizeChange(s) {
176
- this.page.size = s;
177
- this.page.current = 1;
178
- },
179
- formatDate(d) {
180
- if (!d) return '';
181
- const x = new Date(d);
182
- const y = x.getFullYear();
183
- const m = String(x.getMonth() + 1).padStart(2, '0');
184
- const day = String(x.getDate()).padStart(2, '0');
185
- return `${y}-${m}-${day}`;
186
- },
187
- formatCurrency(n) {
188
- const v = Number(n) || 0;
189
- return v.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
190
- },
191
- formatNumber(n) {
192
- const v = Number(n) || 0;
193
- return v.toLocaleString('zh-CN');
194
- }
195
- }
196
- };
197
- </script>
198
-
199
- <style scoped>
200
- .listed-enterprises-page { padding: 24px; }
201
- .name-row { display: flex; align-items: baseline; gap: 6px; }
202
- .name { font-weight: 600; }
203
- .code { color: #909399; }
204
- .tag-list { display: flex; gap: 6px; flex-wrap: wrap; }
205
- .pager { margin-top: 12px; }
206
- </style>
@@ -1,195 +0,0 @@
1
- <template>
2
- <section class="listed-inc-page">
3
- <h1>上市增定企业</h1>
4
-
5
- <div class="filters">
6
- <el-form label-position="top" size="mini">
7
- <el-row :gutter="12">
8
- <el-col :span="5">
9
- <el-form-item label="企业名称">
10
- <el-input v-model="filters.name" size="mini" placeholder="请输入" clearable @keyup.enter.native="applyFilters" style="width: 100%" />
11
- </el-form-item>
12
- </el-col>
13
- <el-col :span="5">
14
- <el-form-item label="地区">
15
- <el-select v-model="filters.region" size="mini" placeholder="请选择" clearable filterable style="width: 100%">
16
- <el-option v-for="opt in regionOptions" :key="opt" :label="opt" :value="opt" />
17
- </el-select>
18
- </el-form-item>
19
- </el-col>
20
- <el-col :span="5">
21
- <el-form-item label="交易所">
22
- <el-select v-model="filters.exchange" size="mini" placeholder="请选择" clearable filterable style="width: 100%">
23
- <el-option v-for="opt in exchangeOptions" :key="opt" :label="opt" :value="opt" />
24
- </el-select>
25
- </el-form-item>
26
- </el-col>
27
- <el-col :span="5">
28
- <el-form-item label="是否专精特新">
29
- <el-select v-model="filters.specialized" size="mini" placeholder="请选择" clearable style="width: 100%">
30
- <el-option :label="'是'" :value="true" />
31
- <el-option :label="'否'" :value="false" />
32
- </el-select>
33
- </el-form-item>
34
- </el-col>
35
- <el-col :span="4">
36
- <el-form-item label=" ">
37
- <el-button type="primary" size="mini" @click="applyFilters">查询</el-button>
38
- <el-button size="mini" @click="resetFilters">重置</el-button>
39
- </el-form-item>
40
- </el-col>
41
- </el-row>
42
- </el-form>
43
- </div>
44
-
45
- <el-table :data="pagedRows" border stripe size="small" @sort-change="onSortChange">
46
- <el-table-column type="index" label="序号" width="56" align="center" header-align="center" />
47
- <el-table-column prop="shortName" label="企业简称" min-width="140" />
48
- <el-table-column prop="business" label="业务" min-width="140" />
49
- <el-table-column prop="name" label="企业名称" min-width="180">
50
- <template slot-scope="scope">
51
- <div class="name-row">
52
- <span class="name">{{ scope.row.name }}</span>
53
- <span class="code">({{ scope.row.code }})</span>
54
- </div>
55
- </template>
56
- </el-table-column>
57
- <el-table-column prop="customerTags" label="客户标签" min-width="160">
58
- <template slot-scope="scope">
59
- <div class="tag-list">
60
- <el-tag v-for="(t,i) in (scope.row.customerTags || [])" :key="i" size="mini" type="info">{{ t }}</el-tag>
61
- </div>
62
- </template>
63
- </el-table-column>
64
- <el-table-column prop="industryDomain" label="行业领域" min-width="140" />
65
- <el-table-column prop="registeredRegion" label="注册地区" min-width="120" />
66
- <el-table-column prop="establishedDate" label="成立时间" min-width="120" sortable="custom">
67
- <template slot-scope="scope">{{ formatDate(scope.row.establishedDate) }}</template>
68
- </el-table-column>
69
- <el-table-column prop="round" label="当前轮次" min-width="120" />
70
- <el-table-column prop="latestInvestDate" label="最新投资时间" min-width="140" sortable="custom">
71
- <template slot-scope="scope">{{ formatDate(scope.row.latestInvestDate) }}</template>
72
- </el-table-column>
73
- <el-table-column prop="latestAmount" label="最新融资金额" min-width="140" sortable="custom" align="right">
74
- <template slot-scope="scope">{{ formatCurrency(scope.row.latestAmount) }}</template>
75
- </el-table-column>
76
- <el-table-column prop="latestAmountCNY" label="最新融资金额(人民币)" min-width="180" align="right">
77
- <template slot-scope="scope">{{ formatCurrency(scope.row.latestAmountCNY) }}</template>
78
- </el-table-column>
79
- <el-table-column prop="investors" label="投资方" min-width="200">
80
- <template slot-scope="scope">{{ Array.isArray(scope.row.investors) ? scope.row.investors.join('、') : scope.row.investors }}</template>
81
- </el-table-column>
82
- <el-table-column prop="registeredCapital" label="注册资本" min-width="120" align="right">
83
- <template slot-scope="scope">{{ formatCurrency(scope.row.registeredCapital) }}</template>
84
- </el-table-column>
85
- <el-table-column prop="valuation" label="市值/估值" min-width="140" align="right">
86
- <template slot-scope="scope">{{ formatCurrency(scope.row.valuation) }}</template>
87
- </el-table-column>
88
- <el-table-column prop="totalRounds" label="累计融资次数" min-width="140" sortable="custom" align="center" />
89
- <el-table-column prop="totalFinancing" label="累计融资金额" min-width="140" sortable="custom" align="right">
90
- <template slot-scope="scope">{{ formatCurrency(scope.row.totalFinancing) }}</template>
91
- </el-table-column>
92
- <el-table-column prop="legalRep" label="法人代表" min-width="120" />
93
- </el-table>
94
-
95
- <div class="pager">
96
- <el-pagination
97
- layout="prev, pager, next, sizes, total"
98
- :current-page.sync="page.current"
99
- :page-size.sync="page.size"
100
- :page-sizes="[10,20,30,50]"
101
- :total="filteredRows.length"
102
- @current-change="onPageChange"
103
- @size-change="onSizeChange"
104
- />
105
- </div>
106
- </section>
107
- </template>
108
-
109
- <script>
110
- export default {
111
- name: 'ListedIncrementalEnterprisesView',
112
- data() {
113
- return {
114
- filters: { name: '', region: '', exchange: '', specialized: null },
115
- sort: { prop: '', order: '' },
116
- page: { current: 1, size: 10 },
117
- regionOptions: ['北京','上海','广东','浙江','江苏','四川','香港','内蒙古','安徽','福建','深圳','山东','河南'],
118
- exchangeOptions: ['沪深A股','科创板','创业板','港股','北交所'],
119
- rows: [
120
- { shortName: '北一金', business: '能源服务', name: '北一金能源技术', code: '000001', customerTags: ['重点客户'], industryDomain: '能源', registeredRegion: '北京', region: '北京', exchange: '沪深A股', specialized: true, establishedDate: '2016-05-12', round: 'D轮', latestInvestDate: '2024-09-18', latestAmount: 300000000, latestAmountCNY: 300000000, investors: ['高瓴资本','红杉中国'], registeredCapital: 80000000, valuation: 185032000000, totalRounds: 6, totalFinancing: 1200000000, legalRep: '张三' },
121
- { shortName: '星海科技', business: 'AI软件', name: '星海科技股份有限公司', code: '000022', customerTags: ['战略客户'], industryDomain: '科技', registeredRegion: '北京', region: '北京', exchange: '科创板', specialized: true, establishedDate: '2018-01-10', round: 'C轮', latestInvestDate: '2023-11-01', latestAmount: 150000000, latestAmountCNY: 150000000, investors: ['IDO基金'], registeredCapital: 50000000, valuation: 60011000000, totalRounds: 4, totalFinancing: 520000000, legalRep: '李四' },
122
- { shortName: '华源制造', business: '装备制造', name: '华源制造有限公司', code: '000003', customerTags: ['普通客户'], industryDomain: '制造', registeredRegion: '江苏', region: '江苏', exchange: '沪深A股', specialized: false, establishedDate: '2012-03-21', round: 'B轮', latestInvestDate: '2022-06-15', latestAmount: 80000000, latestAmountCNY: 80000000, investors: ['工银投资'], registeredCapital: 30000000, valuation: 56077000000, totalRounds: 3, totalFinancing: 210000000, legalRep: '王五' },
123
- { shortName: '锦泰金融', business: '金融服务', name: '锦泰金融控股', code: '000020', customerTags: ['重点供应商'], industryDomain: '金融', registeredRegion: '香港', region: '香港', exchange: '港股', specialized: false, establishedDate: '2009-10-20', round: 'Pre-IPO', latestInvestDate: '2014-09-28', latestAmount: 120000000, latestAmountCNY: 120000000, investors: ['摩根大通'], registeredCapital: 200000000, valuation: 139077000000, totalRounds: 5, totalFinancing: 650000000, legalRep: '赵六' },
124
- { shortName: '康宁医药', business: '制药', name: '康宁医药集团', code: '000013', customerTags: ['后备供应商'], industryDomain: '医药', registeredRegion: '四川', region: '四川', exchange: '创业板', specialized: true, establishedDate: '2019-05-09', round: 'A轮', latestInvestDate: '2024-03-09', latestAmount: 50000000, latestAmountCNY: 50000000, investors: ['博裕资本'], registeredCapital: 25000000, valuation: 28566000000, totalRounds: 2, totalFinancing: 150000000, legalRep: '孙八' },
125
- { shortName: '恒材材料', business: '新材料', name: '恒材新材料股份', code: '000015', customerTags: ['新材料'], industryDomain: '材料', registeredRegion: '上海', region: '上海', exchange: '科创板', specialized: false, establishedDate: '2020-04-17', round: 'B轮', latestInvestDate: '2024-10-21', latestAmount: 90000000, latestAmountCNY: 90000000, investors: ['启明创投'], registeredCapital: 20000000, valuation: 15844000000, totalRounds: 3, totalFinancing: 210000000, legalRep: '周九' },
126
- { shortName: '联通通信', business: '通讯设备', name: '联通通信科技', code: '000016', customerTags: ['战略客户'], industryDomain: '通信', registeredRegion: '广东', region: '广东', exchange: '沪深A股', specialized: true, establishedDate: '2005-06-02', round: 'E轮', latestInvestDate: '2023-08-01', latestAmount: 200000000, latestAmountCNY: 200000000, investors: ['中金资本'], registeredCapital: 120000000, valuation: 72002000000, totalRounds: 7, totalFinancing: 980000000, legalRep: '吴十' },
127
- { shortName: '远景能源', business: '新能源', name: '远景能源集团', code: '000017', customerTags: ['普通客户'], industryDomain: '能源', registeredRegion: '内蒙古', region: '内蒙古', exchange: '沪深A股', specialized: false, establishedDate: '2010-12-13', round: 'C轮', latestInvestDate: '2022-10-10', latestAmount: 100000000, latestAmountCNY: 100000000, investors: ['中新资本'], registeredCapital: 45000000, valuation: 40821000000, totalRounds: 4, totalFinancing: 430000000, legalRep: '钱七' },
128
- { shortName: '优选消费', business: '消费品', name: '优选消费集团', code: '000014', customerTags: ['普通客户'], industryDomain: '消费', registeredRegion: '福建', region: '福建', exchange: '沪深A股', specialized: false, establishedDate: '2007-08-11', round: 'A轮', latestInvestDate: '2019-06-02', latestAmount: 60000000, latestAmountCNY: 60000000, investors: ['真格基金'], registeredCapital: 30000000, valuation: 20513000000, totalRounds: 2, totalFinancing: 120000000, legalRep: '郑一' },
129
- { shortName: '迅捷科技', business: '软件平台', name: '迅捷科技有限公司', code: '000010', customerTags: ['重点客户'], industryDomain: '科技', registeredRegion: '上海', region: '上海', exchange: '科创板', specialized: true, establishedDate: '2016-10-12', round: 'D轮', latestInvestDate: '2024-04-12', latestAmount: 260000000, latestAmountCNY: 260000000, investors: ['源码资本'], registeredCapital: 60000000, valuation: 61578000000, totalRounds: 5, totalFinancing: 960000000, legalRep: '冯二' }
130
- ]
131
- };
132
- },
133
- computed: {
134
- filteredRows() {
135
- const name = (this.filters.name || '').trim().toLowerCase();
136
- const region = this.filters.region || '';
137
- const exchange = this.filters.exchange || '';
138
- const specialized = this.filters.specialized;
139
- return this.rows.filter(r => {
140
- const okName = name ? r.name.toLowerCase().includes(name) : true;
141
- const okRegion = region ? r.region === region : true;
142
- const okEx = exchange ? r.exchange === exchange : true;
143
- const okSpec = specialized === null ? true : r.specialized === specialized;
144
- return okName && okRegion && okEx && okSpec;
145
- });
146
- },
147
- sortedRows() {
148
- return this.filteredRows;
149
- },
150
- pagedRows() {
151
- const start = (this.page.current - 1) * this.page.size;
152
- return this.sortedRows.slice(start, start + this.page.size);
153
- }
154
- },
155
- methods: {
156
- applyFilters() {
157
- this.page.current = 1;
158
- },
159
- resetFilters() {
160
- this.filters = { name: '', region: '', exchange: '', specialized: null };
161
- this.page.current = 1;
162
- },
163
- onSortChange({ prop, order }) {
164
- this.sort = { prop, order };
165
- this.page.current = 1;
166
- },
167
- onPageChange(p) {
168
- this.page.current = p;
169
- },
170
- onSizeChange(s) {
171
- this.page.size = s;
172
- this.page.current = 1;
173
- },
174
- formatDate(d) {
175
- if (!d) return '';
176
- const x = new Date(d);
177
- const y = x.getFullYear();
178
- const m = String(x.getMonth() + 1).padStart(2, '0');
179
- const day = String(x.getDate()).padStart(2, '0');
180
- return `${y}-${m}-${day}`;
181
- },
182
- formatBn(n) {
183
- const v = Number(n) || 0;
184
- return v.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
185
- },
186
- formatCurrency(n) {
187
- const v = Number(n) || 0;
188
- return v.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
189
- }
190
- }
191
- };
192
- </script>
193
-
194
- <style scoped>
195
- </style>