diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java index 33b745b..34979c8 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java @@ -154,4 +154,86 @@ public class Constants */ public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", "org.springframework.jndi" }; + + + public static final int EXPIRED_TIME = 60*60*24*3; + /** + * 动量趋势 + */ + public static final String TRENDS = "trends:"; + + /** + * 首页涨跌分布,all,sh,sz,ge(创业板),star(科创) + */ + public static final String HOME_STOCKS_DISTRIBUTE = "home_stocks_distribute:"; + + /** + * 板块涨跌分布 + */ + public static final String STOCKINDEX_STOCKS_DISTRIBUTE = "stockindex_stocks_distribute:"; + + /** + * 首页动量去趋势 + */ + public static final String HOME_TRENDS = "home_trends:"; + + /** + * 首页上涨分布 + */ + public static final String HOME_LIMIT_DISTRIBUTE = "home_limit_distribute:"; + + /** + * 首页下跌分布 + */ + public static final String HOME_DROP_LIMIT_DISTRIBUTE = "home_drop_limit_distribute:"; + + /** + * 首页新高分布 + */ + public static final String HOME_HIGH_DISTRIBUTE = "home_high_distribute:"; + + /** + * 首页新低分布 + */ + public static final String HOME_LOW_DISTRIBUTE = "home_low_distribute:"; + + /** + * 首页动量趋势个股(动量排行榜前10的获取5个,10-20的获取3个) + */ + public static final String HOME_TRENDS_STOCKS = "home_trends_stocks:"; + + /** + * 首页涨停个股 + */ + public static final String HOME_LIMIT_STOCKS = "home_limit_stocks:"; + + /** + * 首页跌停个股 + */ + public static final String HOME_DROP_LIMIT_STOCKS = "home_drop_limit_stocks:"; + + /** + * 首页强势个股 + */ + public static final String HOME_STRONG_STOCKS = "home_strong_stocks:"; + + /** + * 板块趋势值 + */ + public static final String TRENDS_SECTION_BLEMIND = "trends_section_blemind:"; + + /** + * 个股代码联想 + */ + public static final String STOCK_CODE_QUERY = "stock_code_query:"; + + /** + * 个股名称联想 + */ + public static final String STOCK_NAME_QUERY = "stock_name_query:"; + + /** + * 板块名称联想 + */ + public static final String STOCKINDEX_NAME_QUERY = "stock_index_name_query:"; } \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java index 658926e..133f78e 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java @@ -116,6 +116,8 @@ public class RedisCache */ public long setCacheList(final String key, final List dataList) { + if(dataList.isEmpty() || key.isEmpty()) + return 0; Long count = redisTemplate.opsForList().rightPushAll(key, dataList); return count == null ? 0 : count; } @@ -213,7 +215,7 @@ public class RedisCache * 删除Hash中的数据 * * @param key - * @param mapkey + * @param hkey */ public void delCacheMapValue(final String key, final String hkey) { diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java index 4557ca0..45c23a6 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -278,6 +278,23 @@ public class ExcelUtil { fieldsMap.put(column, objects); } + else + { + //再进行模糊匹配,模糊匹配再失败了,才是真的失败了 + //或者在注解里添加模糊匹配规则 + // attr 为java中的注解 + for (Map.Entry entry : cellMap.entrySet()) + { + String name = entry.getKey(); + String attrName = attr.name(); + if(name.contains(attrName)) + { + column = cellMap.get(name); + fieldsMap.put(column, objects); + break; + } + } + } } for (int i = titleNum + 1; i <= rows; i++) { @@ -1282,6 +1299,10 @@ public class ExcelUtil else if (cell.getCellType() == CellType.STRING) { val = cell.getStringCellValue(); + if("——".equals(val)) + { + val = new BigDecimal("0"); + } } else if (cell.getCellType() == CellType.BOOLEAN) { diff --git a/ruoyi-ui/src/api/index.js b/ruoyi-ui/src/api/index.js index 1f0d820..821fe9a 100644 --- a/ruoyi-ui/src/api/index.js +++ b/ruoyi-ui/src/api/index.js @@ -45,7 +45,7 @@ export function listWarningStocks(query) { }) } -// 查询警告个股列表 +// 查询涨跌分布 export function listStocksDistribution(query) { return request({ url: '/stocksystem/stocks/distribution', @@ -54,6 +54,15 @@ export function listStocksDistribution(query) { }) } +// 查询板块涨跌分布 +export function listStockIndexStocksDistribution(query) { + return request({ + url: '/stocksystem/stocks/stockindestocksdistribution', + method: 'get', + params: query + }) +} + // 查询菜单列表 export function getLatestTradeDay() { return request({ @@ -81,3 +90,64 @@ export function listGroupNewRecord(query) { params: query }) } + +// 查询所有创新高新低 +export function getAllNewRecords(query) { + return request({ + url: '/stocksystem/newrecord/getAllNewRecords', + method: 'get', + params: query + }) +} +//查询板块内强势个股 +export function listStrongStocks(query) { + return request({ + url: '/stocksystem/stocks/listStrongStocks', + method: 'get', + params: query + }) +} +//查询板块内涨跌停个股 +export function listLimitStocks(query) { + return request({ + url: '/stocksystem/stocks/listLimitStocks', + method: 'get', + params: query + }) +} + +//查询板块内涨跌停个股 +export function listDropStocks(query) { + return request({ + url: '/stocksystem/stocks/listDropStocks', + method: 'get', + params: query + }) +} + +// 查询股票联想数据 +export function listStocksQueryData(query) { + return request({ + url: '/stocksystem/stocks/stockQueryData', + method: 'get', + params: query + }) +} + +// 查询股票联想数据 +export function listStocksNameQueryData(query) { + return request({ + url: '/stocksystem/stocks/stockNameQueryData', + method: 'get', + params: query + }) +} + +// 查询股票联想数据 +export function listStockIndexsNameQueryData(query) { + return request({ + url: '/stocksystem/stocks/stockIndexsNameQueryData', + method: 'get', + params: query + }) +} diff --git a/ruoyi-ui/src/api/stocksystem/financial.js b/ruoyi-ui/src/api/stocksystem/financial.js new file mode 100644 index 0000000..5e94cf6 --- /dev/null +++ b/ruoyi-ui/src/api/stocksystem/financial.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询A股财务数据列表 +export function listFinancial(query) { + return request({ + url: '/stocksystem/financial/list', + method: 'get', + params: query + }) +} + +// 查询A股财务数据详细 +export function getFinancial(id) { + return request({ + url: '/stocksystem/financial/' + id, + method: 'get' + }) +} + +// 新增A股财务数据 +export function addFinancial(data) { + return request({ + url: '/stocksystem/financial', + method: 'post', + data: data + }) +} + +// 修改A股财务数据 +export function updateFinancial(data) { + return request({ + url: '/stocksystem/financial', + method: 'put', + data: data + }) +} + +// 删除A股财务数据 +export function delFinancial(id) { + return request({ + url: '/stocksystem/financial/' + id, + method: 'delete' + }) +} diff --git a/ruoyi-ui/src/api/stocksystem/trends.js b/ruoyi-ui/src/api/stocksystem/trends.js index 60df03d..5f79fac 100644 --- a/ruoyi-ui/src/api/stocksystem/trends.js +++ b/ruoyi-ui/src/api/stocksystem/trends.js @@ -18,6 +18,51 @@ export function listTrendsSection(query) { }) } +// 查询时间段内动量结果列表 +export function listTradeVolume(query) { + return request({ + url: '/stocksystem/trends/listTradeVolume', + method: 'get', + params: query + }) +} + +// 查询指数内涨停板数量 +export function listStockIndexLimitUp(query) { + return request({ + url: '/stocksystem/trends/listStockIndexLimitUp', + method: 'get', + params: query + }) +} + +// 查询板块内跌停板数量 +export function listStockIndexLimitDown(query) { + return request({ + url: '/stocksystem/trends/listStockIndexLimitDown', + method: 'get', + params: query + }) +} + +// 查询创新高板块 +export function listStockIndexHighRocord(query) { + return request({ + url: '/stocksystem/trends/listStockIndexHighRocord', + method: 'get', + params: query + }) +} + +// 查询创新低板块 +export function listStockIndexLowRocord(query) { + return request({ + url: '/stocksystem/trends/listStockIndexLowRocord', + method: 'get', + params: query + }) +} + // 查询时间段内动量结果列表 export function listSectionByBlemind(query) { return request({ @@ -27,7 +72,7 @@ export function listSectionByBlemind(query) { }) } -// 查询动量个股列表 +// 查询个股历史k线数据 export function listStockHistory(query) { return request({ url: '/stocksystem/stocks/stockHistory', @@ -36,6 +81,15 @@ export function listStockHistory(query) { }) } +// 板块历史k线数据 +export function listStockIndexHistory(query) { + return request({ + url: '/stocksystem/stocks/stockIndexHistory', + method: 'get', + params: query + }) +} + // 查询动量结果详细 export function getTrends(id) { return request({ diff --git a/ruoyi-ui/src/components/Kdialog/index.vue b/ruoyi-ui/src/components/Kdialog/index.vue index 3820b91..8286f9a 100644 --- a/ruoyi-ui/src/components/Kdialog/index.vue +++ b/ruoyi-ui/src/components/Kdialog/index.vue @@ -2,6 +2,119 @@
+ + + + + {{ tradeDay }} + + + + + + + {{ blemind2 }} + + + + + + + {{ blemind3 }} + + + + + + + + + {{ openPrice }} + + + + + + + {{ closePrice }} + + + + + + + {{ highPrice }} + + + + + + + {{ lowPrice }} + + + + + + + + + {{ volumn }} + + + + + + + {{ volumn20 }} + + + + + + + {{ highDate }} + + + + + + + {{ highDate }} + + + + + + + + + {{ highDate }} + + + + + + + {{ highDate }} + + + + + + + {{ jlr }} + + + + + + + {{ jlrtbzzl }} + + + +
@@ -14,20 +127,33 @@ export default { name: "Kdialog", props: { /* 标题 */ - title: { - type: String, - default: "测试k对话框", - }, + // title: { + // type: String, + // default: "测试k对话框", + // }, /* 是否显示 */ - open: { - type: Boolean, - default: false, - } + // open: { + // type: Boolean, + // default: false, + // } }, data() { return { open:false, - title: "" + title: "", + tradeDay : null, + blemind2:null, + blemind3:null, + closePrice:"0.00", + openPrice:"0.00", + volumn:"0", + volumn20:"0", + highDate:"--", + highPrice:"0.00", + lowDate:"--", + lowPrice:"0.00", + jlr:"--", + jlrtbzzl:"--", }; }, methods:{ @@ -41,22 +167,63 @@ export default { console.log('datas: ' ,datas); const data = splitData(datas); console.log('data0 : ', data); + this.tradeDay = data.categoryData[data.categoryData.length-1]; + this.closePrice = data.values[data.values.length-1][1]; + this.openPrice = data.values[data.values.length-1][0]; + this.highPrice = data.values[data.values.length-1][3]; + this.lowPrice = data.values[data.values.length-1][2]; + this.volumn = data.volumes[data.volumes.length-1][1]; + this.volumn20 = calculateVolumn(20); + this.blemind2 = data.blemind2[0]; + this.blemind3 = data.blemind3[0]; + this.jlr = data.jlr[0]; + this.jlrtbzzl = Math.floor(data.jlrtbzz[0] * 100) / 100; + if(this.jlr < 0) + this.title = this.title + "(亏损)"; function splitData(rawData) { let categoryData = []; let values = []; let volumes = []; + let tblemind2 = []; + let tblemind3 = []; + let tjlr = []; + let tjlrtbzz = []; for (let i = 0; i < rawData.length; i++) { categoryData.push(rawData[i].splice(0, 1)[0]); values.push(rawData[i]); volumes.push([i, rawData[i][4], rawData[i][0] > rawData[i][1] ? 1 : -1]); + tblemind2.push(rawData[i][6]); + tblemind3.push(rawData[i][7]); + tjlr.push(rawData[i][8]); + tjlrtbzz.push(rawData[i][9]); } return { categoryData: categoryData, values: values, - volumes: volumes + volumes: volumes, + blemind2: tblemind2, + blemind3: tblemind3, + jlr: tjlr, + jlrtbzz:tjlrtbzz }; } + function calculateVolumn(dayCount){ + console.log('calculateVolumn : dayCount : ', dayCount, data); + var result = 0; + var sum = 0; + var i = 0; + for (var j = data.volumes.length - 1 , len = data.volumes.length; i < len; i++ , j--) { + if(i >= dayCount) + break; + sum += +data.volumes[j][1]; + // result.push(+(sum / dayCount).toFixed(3)); + } + result = +(sum / dayCount).toFixed(3); + console.log('after calculateVolumn : result : ', result); + return result; + } + function calculateMA(dayCount) { console.log('calculateMA : dayCount : ', dayCount, data); var result = []; @@ -69,7 +236,7 @@ export default { for (var j = 0; j < dayCount; j++) { sum += +data.values[i - j][1]; } - result.push(+(sum / dayCount).toFixed(3)); + result.push(+(sum / dayCount).toFixed(2)); } console.log('after calculateMA : result : ', result); return result; @@ -250,15 +417,16 @@ export default { xAxisIndex: [0, 1], start: 0, end: 100 - }, - { - show: true, - xAxisIndex: [0, 1], - type: 'slider', - top: '90%', - start: 0, - end: 100 } + // 放大缩小区域 + //, { + // show: true, + // xAxisIndex: [0, 1], + // type: 'slider', + // top: '90%', + // start: 0, + // end: 100 + // } ], series: [ { diff --git a/ruoyi-ui/src/components/NegativeDialog/index.vue b/ruoyi-ui/src/components/NegativeDialog/index.vue new file mode 100644 index 0000000..7653109 --- /dev/null +++ b/ruoyi-ui/src/components/NegativeDialog/index.vue @@ -0,0 +1,321 @@ + + + + diff --git a/ruoyi-ui/src/components/TrendStocksDialog/index.vue b/ruoyi-ui/src/components/TrendStocksDialog/index.vue new file mode 100644 index 0000000..e0991d6 --- /dev/null +++ b/ruoyi-ui/src/components/TrendStocksDialog/index.vue @@ -0,0 +1,1098 @@ + + + + diff --git a/ruoyi-ui/src/main.js b/ruoyi-ui/src/main.js index 179ea8a..e668505 100644 --- a/ruoyi-ui/src/main.js +++ b/ruoyi-ui/src/main.js @@ -41,6 +41,8 @@ import DictData from '@/components/DictData' import Kdialog from "@/components/Kdialog"; //板块对话框 import TrendStocksDialog from "@/components/TrendStocksDialog"; +//涨跌停、新高新低对话框 +import NegativeDialog from "@/components/NegativeDialog"; // 全局方法挂载 Vue.prototype.getDicts = getDicts @@ -63,6 +65,7 @@ Vue.component('ImageUpload', ImageUpload) Vue.component('ImagePreview', ImagePreview) Vue.component('Kdialog', Kdialog) Vue.component('TrendStocksDialog', TrendStocksDialog) +Vue.component('NegativeDialog', NegativeDialog) Vue.use(directive) Vue.use(plugins) diff --git a/ruoyi-ui/src/utils/request.js b/ruoyi-ui/src/utils/request.js index 1fff1ee..6f5953b 100644 --- a/ruoyi-ui/src/utils/request.js +++ b/ruoyi-ui/src/utils/request.js @@ -14,7 +14,7 @@ const service = axios.create({ // axios中请求配置有baseURL选项,表示请求URL公共部分 baseURL: process.env.VUE_APP_BASE_API, // 超时 - timeout: 30000 + timeout: 60000 }) // request拦截器 diff --git a/ruoyi-ui/src/views/booksystem/book/index.vue b/ruoyi-ui/src/views/booksystem/book/index.vue index d0fec3f..ccdc7b1 100644 --- a/ruoyi-ui/src/views/booksystem/book/index.vue +++ b/ruoyi-ui/src/views/booksystem/book/index.vue @@ -1,32 +1,39 @@ diff --git a/sql/extends.sql b/sql/extends.sql new file mode 100644 index 0000000..997bd20 --- /dev/null +++ b/sql/extends.sql @@ -0,0 +1,11 @@ +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('行情数据导入', '2057', '6', '#', '', 1, 0, 'F', '0', '0', 'stocksystem:stocks:import', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('每日创新高新低导入', '2094', '5', '#', '', 1, 0, 'F', '0', '0', 'stocksystem:newrecord:import', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('指数交易行情导入', '2100', '5', '#', '', 1, 0, 'F', '0', '0', 'stocksystem:stockindex:import', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('A股财务数据导入', '2107', '5', '#', '', 1, 0, 'F', '0', '0', 'stocksystem:financial:import', '#', 'admin', sysdate(), '', null, ''); diff --git a/sql/financialMenu.sql b/sql/financialMenu.sql new file mode 100644 index 0000000..32619ad --- /dev/null +++ b/sql/financialMenu.sql @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('A股财务数据', '2013', '1', 'financial', 'stocksystem/financial/index', 1, 0, 'C', '0', '0', 'stocksystem:financial:list', '#', 'admin', sysdate(), '', null, 'A股财务数据菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('A股财务数据查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', 'stocksystem:financial:query', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('A股财务数据新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', 'stocksystem:financial:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('A股财务数据修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', 'stocksystem:financial:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('A股财务数据删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', 'stocksystem:financial:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) +values('A股财务数据导出', @parentId, '5', '#', '', 1, 0, 'F', '0', '0', 'stocksystem:financial:export', '#', 'admin', sysdate(), '', null, ''); \ No newline at end of file diff --git a/sql/nstocks/stock_financial.sql b/sql/nstocks/stock_financial.sql new file mode 100644 index 0000000..f8b170e --- /dev/null +++ b/sql/nstocks/stock_financial.sql @@ -0,0 +1,39 @@ +/* + Navicat Premium Data Transfer + + Source Server : localhost + Source Server Type : MySQL + Source Server Version : 80022 + Source Host : localhost:3306 + Source Schema : nstocks + + Target Server Type : MySQL + Target Server Version : 80022 + File Encoding : 65001 + + Date: 29/12/2021 23:43:25 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for stock_basis +-- ---------------------------- +DROP TABLE IF EXISTS `stock_financial`; +CREATE TABLE `stock_financial` ( + `id` double NOT NULL AUTO_INCREMENT COMMENT 'idstock_basis', + `code` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '股票代码', + `period` date NULL DEFAULT NULL COMMENT '报告期', + `jlrtbzzl` decimal(50, 4) NULL DEFAULT NULL COMMENT '净利润同比增长率', + `jlrhbzzl` decimal(50, 4) NULL DEFAULT NULL COMMENT '净利润环比增长率', + `jzcsylroe` decimal(50, 4) NULL DEFAULT NULL COMMENT '净资产收益率ROE', + `epsbasic` decimal(50, 4) NULL DEFAULT NULL COMMENT '每股收益EPS', + `jlr` decimal(50, 4) NULL DEFAULT NULL COMMENT '净利润', + `jbmgsy` decimal(50, 4) NULL DEFAULT NULL COMMENT '基本每股收益', + `mgjzc` decimal(50, 4) NULL DEFAULT NULL COMMENT '每股净资产BPS', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 137032 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'A股财务数据' ROW_FORMAT = Dynamic; + + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/sql/nstocks/stocks_tmp.sql b/sql/nstocks/stocks_tmp.sql new file mode 100644 index 0000000..a168f6d --- /dev/null +++ b/sql/nstocks/stocks_tmp.sql @@ -0,0 +1,35 @@ +/* + Navicat Premium Data Transfer + + Source Server : localhost + Source Server Type : MySQL + Source Server Version : 80022 + Source Host : localhost:3306 + Source Schema : nstocks + + Target Server Type : MySQL + Target Server Version : 80022 + File Encoding : 65001 + + Date: 29/12/2021 23:43:52 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for stocks +-- ---------------------------- +DROP TABLE IF EXISTS `stocks_tmp`; +CREATE TABLE `stocks_tmp` ( + `id` double NOT NULL AUTO_INCREMENT, + `code` varchar(45) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, + `trade_day` date NULL DEFAULT NULL COMMENT '交易日期', + `differrange3` decimal(50, 4) NULL DEFAULT NULL COMMENT '3日区间涨跌幅', + `differrange5` decimal(50, 4) NULL DEFAULT NULL COMMENT '5日区间涨跌幅', + `differrange15` decimal(50, 4) NULL DEFAULT NULL COMMENT '15日区间涨跌幅', + `differrange30` decimal(50, 4) NULL DEFAULT NULL COMMENT '30日区间涨跌幅', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 82694 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '全部A股每日交易数据辅助表' ROW_FORMAT = Dynamic; + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StockFinancialController.java b/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StockFinancialController.java new file mode 100644 index 0000000..9fe48d5 --- /dev/null +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StockFinancialController.java @@ -0,0 +1,136 @@ +package com.ruoyi.stocksystem.controller; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.stocksystem.domain.Stocks; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.stocksystem.domain.StockFinancial; +import com.ruoyi.stocksystem.service.IStockFinancialService; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.common.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; + +/** + * A股财务数据Controller + * + * @author lxy + * @date 2022-05-05 + */ +@RestController +@RequestMapping("/stocksystem/financial") +public class StockFinancialController extends BaseController +{ + @Autowired + private IStockFinancialService stockFinancialService; + + /** + * 查询A股财务数据列表 + */ + @PreAuthorize("@ss.hasPermi('stocksystem:financial:list')") + @GetMapping("/list") + public TableDataInfo list(StockFinancial stockFinancial) + { + startPage(); + List list = stockFinancialService.selectStockFinancialList(stockFinancial); + return getDataTable(list); + } + + /** + * 导出A股财务数据列表 + */ + @PreAuthorize("@ss.hasPermi('stocksystem:financial:export')") + @Log(title = "A股财务数据", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, StockFinancial stockFinancial) + { + List list = stockFinancialService.selectStockFinancialList(stockFinancial); + ExcelUtil util = new ExcelUtil(StockFinancial.class); + util.exportExcel(response, list, "A股财务数据数据"); + } + + /** + * 获取A股财务数据详细信息 + */ + @PreAuthorize("@ss.hasPermi('stocksystem:financial:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return AjaxResult.success(stockFinancialService.selectStockFinancialById(id)); + } + + /** + * 新增A股财务数据 + */ + @PreAuthorize("@ss.hasPermi('stocksystem:financial:add')") + @Log(title = "A股财务数据", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody StockFinancial stockFinancial) + { + return toAjax(stockFinancialService.insertStockFinancial(stockFinancial)); + } + + /** + * 修改A股财务数据 + */ + @PreAuthorize("@ss.hasPermi('stocksystem:financial:edit')") + @Log(title = "A股财务数据", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody StockFinancial stockFinancial) + { + return toAjax(stockFinancialService.updateStockFinancial(stockFinancial)); + } + + /** + * 删除A股财务数据 + */ + @PreAuthorize("@ss.hasPermi('stocksystem:financial:remove')") + @Log(title = "A股财务数据", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(stockFinancialService.deleteStockFinancialByIds(ids)); + } + + @Log(title = "财报数据导入", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.hasPermi('stocksystem:financial:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport, String s) throws Exception + { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");//注意月份是MM + System.out.println(" tradeDay :" + s); + Date tradeDay1 = null; + try + { + tradeDay1 = simpleDateFormat.parse(s); + }catch (ParseException e) { + e.printStackTrace(); + } + if(tradeDay1 == null) + { + return AjaxResult.success("failed"); + } + ExcelUtil stockFinancial = new ExcelUtil(StockFinancial.class); + List stockFinancialList = stockFinancial.importExcel(file.getInputStream()); + System.out.println("stockFinancialList count : " + stockFinancialList.size() + " tradeDay :" + s); + String operName = getUsername(); + String message = stockFinancialService.importStock(stockFinancialList, updateSupport, operName, s); + return AjaxResult.success(message); + } +} diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StockIndexController.java b/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StockIndexController.java index d7216b8..2f80022 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StockIndexController.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StockIndexController.java @@ -1,7 +1,12 @@ package com.ruoyi.stocksystem.controller; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletResponse; + +import com.ruoyi.stocksystem.domain.StocksNewRecord; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -20,6 +25,7 @@ import com.ruoyi.stocksystem.domain.StockIndex; import com.ruoyi.stocksystem.service.IStockIndexService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; +import org.springframework.web.multipart.MultipartFile; /** * 指数交易行情Controller @@ -59,6 +65,36 @@ public class StockIndexController extends BaseController util.exportExcel(response, list, "指数交易行情数据"); } + @Log(title = "指数数据导入", businessType = BusinessType.IMPORT) + @PreAuthorize("@ss.hasPermi('stocksystem:stockindex:import')") + @PostMapping("/importData") + public AjaxResult importData(MultipartFile file, boolean updateSupport, String s) throws Exception + { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");//注意月份是MM + System.out.println(" tradeDay :" + s); + Date tradeDay1 = null; + try + { + tradeDay1 = simpleDateFormat.parse(s); + }catch (ParseException e) { + e.printStackTrace(); + } + if(tradeDay1 == null) + { + return AjaxResult.success("failed"); + } + ExcelUtil stocksIndexRecords = new ExcelUtil(StockIndex.class); + List stocksIndexList = stocksIndexRecords.importExcel(file.getInputStream()); + System.out.println("stockIndexList count : " + stocksIndexList.size() + " tradeDay :" + s); + for (StockIndex stockIndex: stocksIndexList) + { + System.out.println(stockIndex.toString()); + } + String operName = getUsername(); + String message = stockIndexService.importStockIndexs(stocksIndexList, updateSupport, operName, s); + return AjaxResult.success(message); + } + /** * 获取指数交易行情详细信息 */ diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StocksController.java b/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StocksController.java index 0fd0d8d..1baf9cd 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StocksController.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StocksController.java @@ -8,11 +8,13 @@ import java.time.format.DateTimeFormatter; import java.util.*; import javax.servlet.http.HttpServletResponse; +import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.stocksystem.domain.*; import com.ruoyi.stocksystem.domain.service.IStocksInTrendService; import com.ruoyi.stocksystem.domain.service.ITradeDatesService; import com.ruoyi.stocksystem.domain.service.ITrendsService; +import com.ruoyi.stocksystem.service.IStockFinancialService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -32,6 +34,8 @@ import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; import org.springframework.web.multipart.MultipartFile; +import static com.ruoyi.common.constant.Constants.*; + /** * 行情数据Controller * @@ -54,6 +58,12 @@ public class StocksController extends BaseController @Autowired private ITradeDatesService tradeDatesService; + @Autowired + private IStockFinancialService stockFinancialService; + + @Autowired + private RedisCache redisCache; + /** * 查询行情数据列表 */ @@ -79,161 +89,566 @@ public class StocksController extends BaseController return getDataTable(list); } - /** - * 查询涨跌分布 - */ - @GetMapping("/distribution") - public TableDataInfo listDistribution(Stocks stocks) + @GetMapping("/listStrongStocks") + public TableDataInfo listStrongStocks(Stocks stocks) { - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - List rfvList = new ArrayList<>(); - ResponseForVue rfv = new ResponseForVue(); - rfv.setTitle(formatter.format(stocks.getTradeDay())); - List distributionNameList = new ArrayList<>(); - distributionNameList.add("≥10%"); - distributionNameList.add("≥7%"); - distributionNameList.add("7~5%"); - distributionNameList.add("5~3%"); - distributionNameList.add("3~0%"); - distributionNameList.add("平"); - distributionNameList.add("0~-3%"); - distributionNameList.add("-3~-5%"); - distributionNameList.add("-5~-7%"); - distributionNameList.add("≤-7%"); - distributionNameList.add("≤-10%"); - rfv.setDataList(distributionNameList); - rfvList.add(rfv); + List ret; + if(!StringUtils.isEmpty(stocks.getBlemind2())) + ret = new ArrayList<>(); + else + ret = redisCache.getCacheList(getStrongStocksRedisKey(stocks)); + if(ret.isEmpty()) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + TradeDates tradeDates = new TradeDates(); + tradeDates.setDate(stocks.getTradeDay()); + tradeDates.setLimitCount(60l); + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + int count = 1; + HashMap tradeDaysMap = new HashMap<>(); + for (TradeDates tradeDates1 : tradeDatesList) { + tradeDaysMap.put(formatter.format(tradeDates1.getDate()), count); + count++; + } +// String latestTradeDayStr = formatter.format(latestTradeDay); - List list = stocksService.selectStocksListB(stocks); - int count10 = 0; - int count710 = 0; - int count57 = 0; - int count35 = 0; - int count03 = 0; - int count0 = 0; - int countf03 = 0; - int countf35 = 0; - int countf57 = 0; - int countf710 = 0; - int countf10 = 0; - - String comparePrefix = ""; - String compareEndfix = ""; - //all(全部), sh(上证), sz(深圳) ,ge(创业板),star(科创板) - if(StringUtils.isEmpty(stocks.getType()) || stocks.getType().equals("all")) - { - //全部A股 - comparePrefix = ""; - } - else if(stocks.getType().equals("sh")) - { - compareEndfix = ".SH"; - } - else if(stocks.getType().equals("sz")) - { - compareEndfix = ".SZ"; - } - else if(stocks.getType().equals("ge")) - { - comparePrefix = "30"; - } - else if(stocks.getType().equals("star")) - { - comparePrefix = "68"; - } + Stocks strongStocks = new Stocks(); + long dateTime = stocks.getTradeDay().getTime() - 60 * 24 * 60 * 60 * 1000L; + Date startDate = new Date(); + startDate.setTime(dateTime); - for(Stocks stocks1 : list) - { - if(!StringUtils.isEmpty(comparePrefix)) - { - //查询过滤 - if(!stocks1.getCode().startsWith(comparePrefix)) - { - continue; + long cal5Time = 5 * 24 * 60 * 60 * 1000L;//5天时间 + + long calStartTime = stocks.getTradeDay().getTime() - cal5Time; + Date calStartDate = new Date(); + calStartDate.setTime(calStartTime); + + strongStocks.setTradeDay(stocks.getTradeDay()); + strongStocks.setStradeDay(startDate); + strongStocks.setIslimit(stocks.getIslimit()); + strongStocks.setIsdrop(stocks.getIsdrop()); + strongStocks.setBlemind2(stocks.getBlemind2()); + List list = stocksService.selectStrongStocksList(strongStocks); + List basicList = stocksService.selectStocksListB(stocks); + List result = new ArrayList(); + Stocks lastStock = new Stocks(); + + long lastLimitTime = 0; + //todo 暂定连续5个交易日没有涨停板停止计算 + for (Stocks stocks1 : list) { + if (StringUtils.isNull(lastStock.getCode())) { + lastStock = stocks1; + lastLimitTime = stocks1.getTradeDay().getTime(); + lastStock.setCalLimitTradeDates(new BigDecimal(1)); + lastStock.setLimitTradeDates(new BigDecimal(1)); + lastStock.setStradeDay(stocks1.getTradeDay()); + } else { + if (lastStock.getCode().equals(stocks1.getCode())) { + //大于5天没有涨停板 +// System.out.println("stocks1.getTradeDay().getTime() : " + stocks1.getTradeDay().getTime() +// + " cal5Time: " + cal5Time + " lastLimitTime: " + lastLimitTime); + if (stocks1.getTradeDay().getTime() < (lastLimitTime - cal5Time)) { + continue; + } else { + lastLimitTime = stocks1.getTradeDay().getTime(); + lastStock.setLimitTradeDates(lastStock.getLimitTradeDates().add(new BigDecimal(1))); + lastStock.setStradeDay(stocks1.getTradeDay()); + } + } else { + if (!StringUtils.isNull(lastStock.getCode()) && lastStock.getTradeDay().after(calStartDate)) + result.add(lastStock); + lastStock = stocks1; + lastLimitTime = stocks1.getTradeDay().getTime(); + lastStock.setLimitTradeDates(new BigDecimal(1)); + lastStock.setStradeDay(stocks1.getTradeDay()); + } } } - else if(!StringUtils.isEmpty(compareEndfix)) - { - //查询过滤 - if(!stocks1.getCode().endsWith(compareEndfix)) - { - continue; + +// List ret = new ArrayList<>(); + //进行基础资料补全和板块过滤 强势股不包含一个涨停板 + for (Stocks stocks1 : result) { + for (Stocks stocks2 : basicList) { + if (StringUtils.isEmpty(stocks.getBlemind2()) || stocks2.getBlemind2().equals(stocks.getBlemind2())) { + if (stocks2.getCode().equals(stocks1.getCode())) { + System.out.println("stock2 code equals stock1.code " + stocks2.getCode() + " name: " + stocks2.getName()); + if (!stocks2.getName().contains("ST")) { + stocks1.setBlemind2(stocks2.getBlemind2()); + stocks1.setBlemind3(stocks2.getBlemind3()); + stocks1.setDifferrange(stocks2.getDifferrange()); + stocks1.setDifferrange10(stocks2.getDifferrange10()); + stocks1.setDifferrange20(stocks2.getDifferrange20()); + stocks1.setDifferrange30(stocks2.getDifferrange30()); + stocks1.setDifferrange3(stocks2.getDifferrange3()); + stocks1.setDifferrange5(stocks2.getDifferrange5()); + stocks1.setDifferrange15(stocks2.getDifferrange15()); + stocks1.setName(stocks2.getName()); + stocks1.setAgenciesHold(stocks2.getAgenciesHold()); + stocks1.setOpen(stocks2.getOpen()); + stocks1.setClose(stocks2.getClose()); + if (!StringUtils.isNull(stocks1.getStradeDay())) { + System.out.println("strongStocks: code: " + stocks1.getCode()); + String sdate = formatter.format(stocks1.getStradeDay()); + System.out.println("strongStocks: startTradeDate: " + sdate); + stocks1.setCalLimitTradeDates(new BigDecimal(tradeDaysMap.get(sdate))); + } + if (stocks1.getCalLimitTradeDates().compareTo(new BigDecimal(1)) == 1) { + ret.add(stocks1); + } + } + break; + } + } } } - - if(!StringUtils.isNull(stocks1.getDifferrange())) - { - //a.compareTo(b) ==-1 a小于b ==0 a等于b ==1 a大于b >-1 a大于等于b < 1 a小于等于b - if(stocks1.getDifferrange().compareTo(new BigDecimal(10)) > -1) - { - count10++; + //进行排序 规则:涨停数量 今日涨停 + Collections.sort(ret, new Comparator() { + @Override + public int compare(Stocks s1, Stocks s2) { + // 返回值 -1 当前排在比较值前 0 位置不变 1 排在比较值后 + // compareTo -1 小于 0 相等 1大于 + if (s1.getLimitTradeDates().compareTo(s2.getLimitTradeDates()) == 1) { + return -1; + } else if (s1.getLimitTradeDates().compareTo(s2.getLimitTradeDates()) == -1) { + return 1; + } else { + return 0; + } } - else if(stocks1.getDifferrange().compareTo(new BigDecimal(7)) > -1) - { - count710++; + }); + if(StringUtils.isEmpty(stocks.getBlemind2())) { + if(!ret.isEmpty()) { + redisCache.setCacheList(getStrongStocksRedisKey(stocks), ret); + redisCache.expire(getStrongStocksRedisKey(stocks), EXPIRED_TIME); } - else if(stocks1.getDifferrange().compareTo(new BigDecimal(5)) > -1) - { - count57++; + } + + //对日期排序 +// Collections.sort(ret, new Comparator() { +// @Override +// public int compare(Stocks s1, Stocks s2) { +// // 返回值 -1 当前排在比较值前 0 位置不变 1 排在比较值后 +// // compareTo -1 小于 0 相等 1大于 +// if(s1.getTradeDay().compareTo(s2.getTradeDay()) == 1) { +// return -1; +// } +// else if(s1.getTradeDay().compareTo(s2.getTradeDay()) == -1) { +// return 1; +// } +// else { +// return 0; +// } +// } +// }); + } + return getDataTable(ret); + } + @GetMapping("/listLimitStocks") + public TableDataInfo listLimitStocks(Stocks stocks) + { + List ret; + if(!StringUtils.isEmpty(stocks.getBlemind2())) + ret = new ArrayList<>(); + else + ret = redisCache.getCacheList(getLimitStocksRedisKey(stocks)); + if(ret.isEmpty()) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + TradeDates tradeDates = new TradeDates(); + tradeDates.setDate(stocks.getTradeDay()); + tradeDates.setLimitCount(60l); + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + int count = 1; + HashMap tradeDaysMap = new HashMap<>(); + for (TradeDates tradeDates1 : tradeDatesList) { + tradeDaysMap.put(formatter.format(tradeDates1.getDate()), count); + count++; + } +// String latestTradeDayStr = formatter.format(latestTradeDay); + + Stocks strongStocks = new Stocks(); + long dateTime = stocks.getTradeDay().getTime() - 60 * 24 * 60 * 60 * 1000L; + Date startDate = new Date(); + startDate.setTime(dateTime); + + long cal5Time = 5 * 24 * 60 * 60 * 1000L;//5天时间 + + long calStartTime = stocks.getTradeDay().getTime() - cal5Time; + Date calStartDate = new Date(); + calStartDate.setTime(calStartTime); + + strongStocks.setTradeDay(stocks.getTradeDay()); + strongStocks.setStradeDay(startDate); + strongStocks.setIslimit(stocks.getIslimit()); + strongStocks.setIsdrop(stocks.getIsdrop()); + strongStocks.setBlemind2(stocks.getBlemind2()); + List list = stocksService.selectStrongStocksList(strongStocks); + List basicList = stocksService.selectStocksListB(stocks); + List result = new ArrayList(); + Stocks lastStock = new Stocks(); + + long lastLimitTime = 0; + //todo 暂定连续5个交易日没有涨停板停止计算 + for (Stocks stocks1 : list) { + if (StringUtils.isNull(lastStock.getCode())) { + lastStock = stocks1; + lastLimitTime = stocks1.getTradeDay().getTime(); + lastStock.setCalLimitTradeDates(new BigDecimal(1)); + lastStock.setLimitTradeDates(new BigDecimal(1)); + lastStock.setStradeDay(stocks1.getTradeDay()); + } else { + if (lastStock.getCode().equals(stocks1.getCode())) { + //大于5天没有涨停板 +// System.out.println("stocks1.getTradeDay().getTime() : " + stocks1.getTradeDay().getTime() +// + " cal5Time: " + cal5Time + " lastLimitTime: " + lastLimitTime); + if (stocks1.getTradeDay().getTime() < (lastLimitTime - cal5Time)) { + continue; + } else { + lastLimitTime = stocks1.getTradeDay().getTime(); + lastStock.setLimitTradeDates(lastStock.getLimitTradeDates().add(new BigDecimal(1))); + lastStock.setStradeDay(stocks1.getTradeDay()); + } + } else { + if (!StringUtils.isNull(lastStock.getCode()) && lastStock.getTradeDay().after(calStartDate)) + result.add(lastStock); + lastStock = stocks1; + lastLimitTime = stocks1.getTradeDay().getTime(); + lastStock.setLimitTradeDates(new BigDecimal(1)); + lastStock.setStradeDay(stocks1.getTradeDay()); + } } - else if(stocks1.getDifferrange().compareTo(new BigDecimal(3)) > -1) - { - count35++; + } + +// List ret = new ArrayList<>(); + //进行基础资料补全和板块过滤 涨停只选当前交易日 + for (Stocks stocks1 : result) { + for (Stocks stocks2 : basicList) { + if (StringUtils.isEmpty(stocks.getBlemind2()) || stocks2.getBlemind2().equals(stocks.getBlemind2())) { + if (stocks2.getCode().equals(stocks1.getCode())) { + if (!stocks2.getName().contains("ST")) { + if (stocks1.getTradeDay().equals(stocks.getTradeDay())) { + stocks1.setBlemind2(stocks2.getBlemind2()); + stocks1.setBlemind3(stocks2.getBlemind3()); + stocks1.setDifferrange(stocks2.getDifferrange()); + stocks1.setDifferrange10(stocks2.getDifferrange10()); + stocks1.setDifferrange20(stocks2.getDifferrange20()); + stocks1.setDifferrange30(stocks2.getDifferrange30()); + stocks1.setDifferrange3(stocks2.getDifferrange3()); + stocks1.setDifferrange5(stocks2.getDifferrange5()); + stocks1.setDifferrange15(stocks2.getDifferrange15()); + stocks1.setName(stocks2.getName()); + stocks1.setAgenciesHold(stocks2.getAgenciesHold()); + stocks1.setOpen(stocks2.getOpen()); + stocks1.setClose(stocks2.getClose()); + if (!StringUtils.isNull(stocks1.getStradeDay())) { + System.out.println("strongStocks: code: " + stocks1.getCode()); + String sdate = formatter.format(stocks1.getStradeDay()); + System.out.println("strongStocks: startTradeDate: " + sdate); + stocks1.setCalLimitTradeDates(new BigDecimal(tradeDaysMap.get(sdate))); + } + ret.add(stocks1); + } + } + break; + } + } } - else if(stocks1.getDifferrange().compareTo(new BigDecimal(0)) == 1) - { - count03++; + } + //进行排序 规则:涨停数量 今日涨停 + Collections.sort(ret, new Comparator() { + @Override + public int compare(Stocks s1, Stocks s2) { + // 返回值 -1 当前排在比较值前 0 位置不变 1 排在比较值后 + // compareTo -1 小于 0 相等 1大于 + if (s1.getLimitTradeDates().compareTo(s2.getLimitTradeDates()) == 1) { + return -1; + } else if (s1.getLimitTradeDates().compareTo(s2.getLimitTradeDates()) == -1) { + return 1; + } else { + return 0; + } } - else if(stocks1.getDifferrange().compareTo(new BigDecimal(0)) == 0) - { - count0++; + }); + if(StringUtils.isEmpty(stocks.getBlemind2())) { + if(!ret.isEmpty()) { + redisCache.setCacheList(getLimitStocksRedisKey(stocks), ret); + redisCache.expire(getLimitStocksRedisKey(stocks), EXPIRED_TIME); } - else if(stocks1.getDifferrange().compareTo(new BigDecimal(-3)) > -1) - { - countf03++; + } + } + return getDataTable(ret); + } + + @GetMapping("/listDropStocks") + public TableDataInfo listDropStocks(Stocks stocks) + { + List ret; + if(!StringUtils.isEmpty(stocks.getBlemind2())) + ret = new ArrayList<>(); + else + ret = redisCache.getCacheList(getDropLimitStocksRedisKey(stocks)); + if(ret.isEmpty()) { + List list = stocksService.selectLimitStocksList(stocks); + List basicList = stocksService.selectStocksListB(stocks); + +// List ret = new ArrayList<>(); + //进行基础资料补全和板块过滤 + for (Stocks stocks1 : list) { + for (Stocks stocks2 : basicList) { + if (StringUtils.isEmpty(stocks.getBlemind2()) || stocks2.getBlemind2().equals(stocks.getBlemind2())) { + if (stocks2.getCode().equals(stocks1.getCode())) { + stocks1.setBlemind2(stocks2.getBlemind2()); + stocks1.setBlemind3(stocks2.getBlemind3()); + stocks1.setDifferrange(stocks2.getDifferrange()); + stocks1.setDifferrange10(stocks2.getDifferrange10()); + stocks1.setDifferrange20(stocks2.getDifferrange20()); + stocks1.setDifferrange30(stocks2.getDifferrange30()); + stocks1.setDifferrange3(stocks2.getDifferrange3()); + stocks1.setDifferrange5(stocks2.getDifferrange5()); + stocks1.setDifferrange15(stocks2.getDifferrange15()); + stocks1.setName(stocks2.getName()); + stocks1.setAgenciesHold(stocks2.getAgenciesHold()); + stocks1.setOpen(stocks2.getOpen()); + stocks1.setClose(stocks2.getClose()); + + ret.add(stocks1); + break; + } + } } - else if(stocks1.getDifferrange().compareTo(new BigDecimal(-5)) > -1) - { - countf35++; + } + if(StringUtils.isEmpty(stocks.getBlemind2())) { + if(!ret.isEmpty()) { + redisCache.setCacheList(getDropLimitStocksRedisKey(stocks), ret); + redisCache.expire(getDropLimitStocksRedisKey(stocks), EXPIRED_TIME); } - else if(stocks1.getDifferrange().compareTo(new BigDecimal(-7)) > -1) - { - countf57++; + } + } + return getDataTable(ret); + } + + /** + * 查询涨跌分布 + */ + @GetMapping("/distribution") + public TableDataInfo listDistribution(Stocks stocks) + { + List rfvList = redisCache.getCacheList(getDistributeRedisKey(stocks)); + if(rfvList.isEmpty()) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); +// List rfvList = new ArrayList<>(); + ResponseForVue rfv = new ResponseForVue(); + rfv.setTitle(formatter.format(stocks.getTradeDay())); + List distributionNameList = new ArrayList<>(); + distributionNameList.add("≥10%"); + distributionNameList.add("≥7%"); + distributionNameList.add("7~5%"); + distributionNameList.add("5~3%"); + distributionNameList.add("3~0%"); + distributionNameList.add("平"); + distributionNameList.add("0~-3%"); + distributionNameList.add("-3~-5%"); + distributionNameList.add("-5~-7%"); + distributionNameList.add("≤-7%"); + distributionNameList.add("≤-10%"); + rfv.setDataList(distributionNameList); + rfvList.add(rfv); + + List list = stocksService.selectStocksListB(stocks); + int count10 = 0; + int count710 = 0; + int count57 = 0; + int count35 = 0; + int count03 = 0; + int count0 = 0; + int countf03 = 0; + int countf35 = 0; + int countf57 = 0; + int countf710 = 0; + int countf10 = 0; + + String comparePrefix = ""; + String compareEndfix = ""; + //all(全部), sh(上证), sz(深圳) ,ge(创业板),star(科创板) + if (StringUtils.isEmpty(stocks.getType()) || stocks.getType().equals("all")) { + //全部A股 + comparePrefix = ""; + } else if (stocks.getType().equals("sh")) { + compareEndfix = ".SH"; + } else if (stocks.getType().equals("sz")) { + compareEndfix = ".SZ"; + } else if (stocks.getType().equals("ge")) { + comparePrefix = "30"; + } else if (stocks.getType().equals("star")) { + comparePrefix = "68"; + } + + for (Stocks stocks1 : list) { + if (!StringUtils.isEmpty(comparePrefix)) { + //查询过滤 + if (!stocks1.getCode().startsWith(comparePrefix)) { + continue; + } + } else if (!StringUtils.isEmpty(compareEndfix)) { + //查询过滤 + if (!stocks1.getCode().endsWith(compareEndfix)) { + continue; + } } - else if(stocks1.getDifferrange().compareTo(new BigDecimal(-10)) == 1) - { - countf710++; + + if (!StringUtils.isNull(stocks1.getDifferrange())) { + //a.compareTo(b) ==-1 a小于b ==0 a等于b ==1 a大于b >-1 a大于等于b < 1 a小于等于b + if (stocks1.getDifferrange().compareTo(new BigDecimal(10)) > -1) { + count10++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(7)) > -1) { + count710++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(5)) > -1) { + count57++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(3)) > -1) { + count35++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(0)) == 1) { + count03++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(0)) == 0) { + count0++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(-3)) > -1) { + countf03++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(-5)) > -1) { + countf35++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(-7)) > -1) { + countf57++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(-10)) == 1) { + countf710++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(-10)) < 1) { + countf10++; + } } - else if(stocks1.getDifferrange().compareTo(new BigDecimal(-10)) < 1) - { - countf10++; + } + List dlist = new ArrayList<>(); + dlist.add(String.valueOf(count10)); + dlist.add(String.valueOf(count710)); + dlist.add(String.valueOf(count57)); + dlist.add(String.valueOf(count35)); + dlist.add(String.valueOf(count03)); + dlist.add(String.valueOf(count0)); + dlist.add(String.valueOf(countf03)); + dlist.add(String.valueOf(countf35)); + dlist.add(String.valueOf(countf57)); + dlist.add(String.valueOf(countf710)); + dlist.add(String.valueOf(countf10)); + + + ResponseForVue rfv2 = new ResponseForVue(); + rfv2.setTitle(formatter.format(stocks.getTradeDay())); + rfv2.setDataList(dlist); + + rfvList.add(rfv2); + if(!rfvList.isEmpty()) { + redisCache.setCacheList(getDistributeRedisKey(stocks), rfvList); + redisCache.expire(getDistributeRedisKey(stocks), EXPIRED_TIME); + } + } + return getDataTable(rfvList); + } + + /** + * 查询板块涨跌分布 + */ + @GetMapping("/stockindestocksdistribution") + public TableDataInfo listStockIndexStocksDistribution(Stocks stocks) + { + List rfvList = redisCache.getCacheList(getStockIndexStocksDistributeRedisKey(stocks)); + if(rfvList.isEmpty()) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); +// List rfvList = new ArrayList<>(); + ResponseForVue rfv = new ResponseForVue(); + rfv.setTitle(formatter.format(stocks.getTradeDay())); + List distributionNameList = new ArrayList<>(); + distributionNameList.add("≥10%"); + distributionNameList.add("≥7%"); + distributionNameList.add("7~5%"); + distributionNameList.add("5~3%"); + distributionNameList.add("3~0%"); + distributionNameList.add("平"); + distributionNameList.add("0~-3%"); + distributionNameList.add("-3~-5%"); + distributionNameList.add("-5~-7%"); + distributionNameList.add("≤-7%"); + distributionNameList.add("≤-10%"); + rfv.setDataList(distributionNameList); + rfvList.add(rfv); + + List list = stocksService.selectStocksListB(stocks); + int count10 = 0; + int count710 = 0; + int count57 = 0; + int count35 = 0; + int count03 = 0; + int count0 = 0; + int countf03 = 0; + int countf35 = 0; + int countf57 = 0; + int countf710 = 0; + int countf10 = 0; + + + for (Stocks stocks1 : list) { + if(!stocks1.getBlemind2().equals(stocks.getBlemind2())) + continue; + + if (!StringUtils.isNull(stocks1.getDifferrange())) { + //a.compareTo(b) ==-1 a小于b ==0 a等于b ==1 a大于b >-1 a大于等于b < 1 a小于等于b + if (stocks1.getDifferrange().compareTo(new BigDecimal(10)) > -1) { + count10++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(7)) > -1) { + count710++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(5)) > -1) { + count57++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(3)) > -1) { + count35++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(0)) == 1) { + count03++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(0)) == 0) { + count0++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(-3)) > -1) { + countf03++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(-5)) > -1) { + countf35++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(-7)) > -1) { + countf57++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(-10)) == 1) { + countf710++; + } else if (stocks1.getDifferrange().compareTo(new BigDecimal(-10)) < 1) { + countf10++; + } } } + List dlist = new ArrayList<>(); + dlist.add(String.valueOf(count10)); + dlist.add(String.valueOf(count710)); + dlist.add(String.valueOf(count57)); + dlist.add(String.valueOf(count35)); + dlist.add(String.valueOf(count03)); + dlist.add(String.valueOf(count0)); + dlist.add(String.valueOf(countf03)); + dlist.add(String.valueOf(countf35)); + dlist.add(String.valueOf(countf57)); + dlist.add(String.valueOf(countf710)); + dlist.add(String.valueOf(countf10)); + + + ResponseForVue rfv2 = new ResponseForVue(); + rfv2.setTitle(formatter.format(stocks.getTradeDay())); + rfv2.setDataList(dlist); + + rfvList.add(rfv2); + if(!rfvList.isEmpty()) { + redisCache.setCacheList(getStockIndexStocksDistributeRedisKey(stocks), rfvList); + redisCache.expire(getStockIndexStocksDistributeRedisKey(stocks), EXPIRED_TIME); + } } - List dlist = new ArrayList<>(); - dlist.add(String.valueOf(count10)); - dlist.add(String.valueOf(count710)); - dlist.add(String.valueOf(count57)); - dlist.add(String.valueOf(count35)); - dlist.add(String.valueOf(count03)); - dlist.add(String.valueOf(count0)); - dlist.add(String.valueOf(countf03)); - dlist.add(String.valueOf(countf35)); - dlist.add(String.valueOf(countf57)); - dlist.add(String.valueOf(countf710)); - dlist.add(String.valueOf(countf10)); - - - ResponseForVue rfv2 = new ResponseForVue(); - rfv2.setTitle(formatter.format(stocks.getTradeDay())); - rfv2.setDataList(dlist); - - rfvList.add(rfv2); return getDataTable(rfvList); } /** - * 查询个股历史数据 + * 查询个股历史数据(k线) */ @GetMapping("/stockHistory") public TableDataInfo stockHistory(Stocks stocks) @@ -241,9 +656,47 @@ public class StocksController extends BaseController SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); List rfvList = new ArrayList<>(); List list = stocksService.selectStockHistory(stocks); + StockFinancial stockFinancial = new StockFinancial(); + stockFinancial.setCode(stocks.getCode()); + stockFinancial.setPeriod(stocks.getTradeDay()); + List stockFinancialList = stockFinancialService.selectStockFinancialByPeriod(stockFinancial); + if(stockFinancialList.size() > 0) + stockFinancial = stockFinancialList.get(0); for (Stocks stocks1 : list) { - //tradeDay,open,close,low,high + //tradeDay,open,close,low,high,volumn,differange,blemind2,blemind3 , jlr ,jlrtbzz + List dlist = new ArrayList<>(); + dlist.add(formatter.format(stocks1.getTradeDay())); + dlist.add(String.valueOf(stocks1.getOpen())); + dlist.add(String.valueOf(stocks1.getClose())); + dlist.add(String.valueOf(stocks1.getLow())); + dlist.add(String.valueOf(stocks1.getHigh())); + dlist.add(String.valueOf(stocks1.getVolumn())); + dlist.add(String.valueOf(stocks1.getDifferrange())); + dlist.add(stocks1.getBlemind2()); + dlist.add(stocks1.getBlemind3()); + dlist.add(String.valueOf(stockFinancial.getJlr())); + dlist.add(String.valueOf(stockFinancial.getJlrtbzzl())); + ResponseForVue rfv2 = new ResponseForVue(); + rfv2.setTitle(formatter.format(stocks1.getTradeDay())); + rfv2.setDataList(dlist); + rfvList.add(rfv2); + } + return getDataTable(rfvList); + } + + /** + * 查询板块历史数据(k线) + */ + @GetMapping("/stockIndexHistory") + public TableDataInfo stockIndexHistory(Stocks stocks) + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + List rfvList = new ArrayList<>(); + List list = stocksService.selectStockIndexHistory(stocks); + for (Stocks stocks1 : list) + { + //tradeDay,open,close,low,high,volumn,differange,blemind2,blemind3 , jlr ,jlrtbzz List dlist = new ArrayList<>(); dlist.add(formatter.format(stocks1.getTradeDay())); dlist.add(String.valueOf(stocks1.getOpen())); @@ -266,10 +719,91 @@ public class StocksController extends BaseController public TableDataInfo grouplist(Stocks stocks) { // startPage(); - List list = stocksService.selectGroupStocksLimit(stocks); +// List list = stocksService.selectGroupStocksLimit(stocks); + String redisKey = getLimitReidsKey(stocks); + List list = redisCache.getCacheList(redisKey); + if(list.isEmpty()) + { + list = stocksService.selectGroupStocksLimit(stocks); + if(!list.isEmpty()) + { + redisCache.setCacheList(redisKey,list); + redisCache.expire(redisKey,EXPIRED_TIME); + } + } return getDataTable(list); } + /** + * 获取联想的数据 + */ + @GetMapping("/stockQueryData") + public TableDataInfo stockQueryData() + { + Stocks stocks = new Stocks(); + List result = redisCache.getCacheList(getStockCodeForQueryRedisKey()); + if(result.isEmpty()) { + List ret = stocksService.selectStocksDataForQuery(stocks); + for (Stocks stocks1 : ret) { + QueryData qd = new QueryData(); + qd.setValue(stocks1.getCode()); + qd.setData(stocks1.getName()); + result.add(qd); + } + if(!result.isEmpty()) { + redisCache.setCacheList(getStockCodeForQueryRedisKey(), result); + redisCache.expire(getStockCodeForQueryRedisKey(), 60 * 60 * 12); + } + } + return getDataTable(result); + } + /** + * 获取联想的数据 + */ + @GetMapping("/stockNameQueryData") + public TableDataInfo stockNameQueryData() + { + List result = redisCache.getCacheList(getStockNameForQueryRedisKey()); + if(result.isEmpty()) { + Stocks stocks = new Stocks(); + List ret = stocksService.selectStocksDataForQuery(stocks); + for (Stocks stocks1 : ret) { + QueryData qd = new QueryData(); + qd.setValue(stocks1.getName()); + qd.setData(stocks1.getCode()); + result.add(qd); + } + if(!result.isEmpty()) { + redisCache.setCacheList(getStockNameForQueryRedisKey(), result); + redisCache.expire(getStockNameForQueryRedisKey(), 60 * 60 * 12); + } + } + return getDataTable(result); + } + + /** + * 获取联想的数据 + */ + @GetMapping("/stockIndexsNameQueryData") + public TableDataInfo stockIndexsNameQueryData() + { + List result = redisCache.getCacheList(getStockIndexForQueryRedisKey()); + if(result.isEmpty()) { + Stocks stocks = new Stocks(); + List ret = stocksService.selectStockIndexsDataForQuery(stocks); + for (Stocks stocks1 : ret) { + QueryData qd = new QueryData(); + qd.setValue(stocks1.getName()); + qd.setData(stocks1.getCode()); + result.add(qd); + } + if(!result.isEmpty()) { + redisCache.setCacheList(getStockIndexForQueryRedisKey(), result); + redisCache.expire(getStockIndexForQueryRedisKey(), 60 * 60 * 12); + } + } + return getDataTable(result); + } /** * 获取最近的交易日 */ @@ -284,7 +818,10 @@ public class StocksController extends BaseController tradeDates.setDate(date); tradeDates.setLimitCount(10l); List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); - Date latestTradeDay = tradeDatesList.get(0).getDate(); +// Date latestTradeDay = tradeDatesList.get(0).getDate(); + Date latestTradeDay = redisCache.getCacheObject(getLastImportStocksDate()); + if(StringUtils.isNull(latestTradeDay)) + latestTradeDay = tradeDatesList.get(0).getDate(); if(latestTradeDay.equals(date)) { LocalTime localTime = LocalTime.now(); @@ -314,6 +851,7 @@ public class StocksController extends BaseController @Log(title = "行情数据导入", businessType = BusinessType.IMPORT) @PreAuthorize("@ss.hasPermi('stocksystem:stocks:import')") +// @PreAuthorize("@ss.hasRole('admin') || @ss.hasRole('normal_admin')") @PostMapping("/importData") public AjaxResult importData(MultipartFile file, boolean updateSupport, String s) throws Exception { @@ -338,20 +876,430 @@ public class StocksController extends BaseController return AjaxResult.success(message); } + private void batchUpdateXDiff(Stocks stocks) + { + System.out.println("testAnalysis " + stocks.getTradeDay() + " " + stocks.getType()); + TradeDates allTradeDates = new TradeDates(); + allTradeDates.setDate(stocks.getTradeDay()); + allTradeDates.setLimitCount(100l);//5日的规则, 当天算日期+1,计算5日前的起势是5日的前一个交易日收盘价,所以日期再+1 + List allTradeDatesList = tradeDatesService.selectTradeDatesListB(allTradeDates); + for(TradeDates tradeDates : allTradeDatesList) + { + stocks.setTradeDay(tradeDates.getDate()); +// TradeDates tradeDates = new TradeDates(); +// tradeDates.setDate(stocks.getTradeDay()); + tradeDates.setLimitCount(32l);//5日的规则, 当天算日期+1,计算5日前的起势是5日的前一个交易日收盘价,所以日期再+1 + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + System.out.println(tradeDatesList); + + //获取当天的成交数据 + stocks.setTradeDays(1l); + List stocksList = stocksService.selectStocksListSort(stocks); + + //获取3日前的成交数据 +// stocks.setTradeDay(tradeDatesList.get(tradeDatesList.size()-1).getDate()); + stocks.setTradeDay(tradeDatesList.get(4).getDate()); + System.out.println("3日前交易日 : " + stocks.getTradeDay()); + List stocksList3 = stocksService.selectStocksListSort(stocks); + + stocks.setTradeDay(tradeDatesList.get(6).getDate()); + System.out.println("5日前交易日 : " + stocks.getTradeDay()); + List stocksList5 = stocksService.selectStocksListSort(stocks); + + stocks.setTradeDay(tradeDatesList.get(16).getDate()); + System.out.println("15日前交易日 : " + stocks.getTradeDay()); + List stocksList15 = stocksService.selectStocksListSort(stocks); + + stocks.setTradeDay(tradeDatesList.get(31).getDate()); + System.out.println("31日前交易日 : " + stocks.getTradeDay()); + List stocksList30 = stocksService.selectStocksListSort(stocks); + + for (Stocks stocks1 : stocksList) { + BigDecimal close1 = stocks1.getClose(); + for (Stocks stocks32 : stocksList3) { + if (stocks1.getCode().equals(stocks32.getCode())) { + BigDecimal close3 = stocks32.getClose(); + BigDecimal sub = close1.subtract(close3); + BigDecimal res = sub.divide(close3, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); + System.out.println("code : " + stocks1.getCode() + " 3日涨跌幅 : " + res + " 3日涨跌 : " + sub + " 当日收盘 : " + close1 + " 3日收盘 :" + close3); + stocks1.setDifferrange3(res); + break; + } + } + + for (Stocks stocks5 : stocksList5) { + if (stocks1.getCode().equals(stocks5.getCode())) { + BigDecimal close5 = stocks5.getClose(); + BigDecimal sub = close1.subtract(close5); + BigDecimal res = sub.divide(close5, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); + System.out.println("code : " + stocks1.getCode() + " 5日涨跌幅 : " + res + " 5日涨跌 : " + sub + " 当日收盘 : " + close1 + " 5日收盘 :" + close5); + stocks1.setDifferrange5(res); + break; + } + } + + for (Stocks stocks15 : stocksList15) { + if (stocks1.getCode().equals(stocks15.getCode())) { + BigDecimal close15 = stocks15.getClose(); + BigDecimal sub = close1.subtract(close15); + BigDecimal res = sub.divide(close15, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); + System.out.println("code : " + stocks1.getCode() + " 15日涨跌幅 : " + res + " 15日涨跌 : " + sub + " 当日收盘 : " + close1 + " 15日收盘 :" + close15); + stocks1.setDifferrange15(res); + break; + } + } + + for (Stocks stocks30 : stocksList30) { + if (stocks1.getCode().equals(stocks30.getCode())) { + BigDecimal close30 = stocks30.getClose(); + BigDecimal sub = close1.subtract(close30); + BigDecimal res = sub.divide(close30, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); + System.out.println("code : " + stocks1.getCode() + " 30日涨跌幅 : " + res + " 30日涨跌 : " + sub + " 当日收盘 : " + close1 + " 30日收盘 :" + close30); + stocks1.setDifferrange30(res); + break; + } + } + stocksService.insertStocksTmp(stocks1); + } + } + System.out.println("testAnalysis finished."); + } + + //更新当天的其他涨跌幅数据 + private void updateXDiff(Stocks stocks) + { + TradeDates tradeDates = new TradeDates(); + tradeDates.setDate(stocks.getTradeDay()); + tradeDates.setLimitCount(32l);//5日的规则, 当天算日期+1,计算5日前的起势是5日的前一个交易日收盘价,所以日期再+1 + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + System.out.println(tradeDatesList); + //获取当天的成交数据 + stocks.setTradeDays(1l); + stocks.setOrderParam("differrange"); + List stocksList = stocksService.selectStocksListSortA(stocks); + //获取3日前的成交数据 +// socks.setTradeDay(tradeDatesList.get(tradeDatesList.size()-1).getDate()); + stocks.setTradeDay(tradeDatesList.get(4).getDate()); + System.out.println("3日前交易日 : " + stocks.getTradeDay()); + List stocksList3 = stocksService.selectStocksListSortA(stocks); + stocks.setTradeDay(tradeDatesList.get(6).getDate()); + System.out.println("5日前交易日 : " + stocks.getTradeDay()); + List stocksList5 = stocksService.selectStocksListSortA(stocks); + stocks.setTradeDay(tradeDatesList.get(16).getDate()); + System.out.println("15日前交易日 : " + stocks.getTradeDay()); + List stocksList15 = stocksService.selectStocksListSortA(stocks); + stocks.setTradeDay(tradeDatesList.get(31).getDate()); + System.out.println("31日前交易日 : " + stocks.getTradeDay()); + List stocksList30 = stocksService.selectStocksListSortA(stocks); + for (Stocks stocks1 : stocksList) { + BigDecimal close1 = stocks1.getClose(); + for (Stocks stocks32 : stocksList3) { + if (stocks1.getCode().equals(stocks32.getCode())) { + BigDecimal close3 = stocks32.getClose(); + BigDecimal sub = close1.subtract(close3); + BigDecimal res = sub.divide(close3, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); + System.out.println("code : " + stocks1.getCode() + " 3日涨跌幅 : " + res + " 3日涨跌 : " + sub + " 当日收盘 : " + close1 + " 3日收盘 :" + close3); + stocks1.setDifferrange3(res); + break; + } + } + for (Stocks stocks5 : stocksList5) { + if (stocks1.getCode().equals(stocks5.getCode())) { + BigDecimal close5 = stocks5.getClose(); + BigDecimal sub = close1.subtract(close5); + BigDecimal res = sub.divide(close5, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); + System.out.println("code : " + stocks1.getCode() + " 5日涨跌幅 : " + res + " 5日涨跌 : " + sub + " 当日收盘 : " + close1 + " 5日收盘 :" + close5); + stocks1.setDifferrange5(res); + break; + } + } + for (Stocks stocks15 : stocksList15) { + if (stocks1.getCode().equals(stocks15.getCode())) { + BigDecimal close15 = stocks15.getClose(); + BigDecimal sub = close1.subtract(close15); + BigDecimal res = sub.divide(close15, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); + System.out.println("code : " + stocks1.getCode() + " 15日涨跌幅 : " + res + " 15日涨跌 : " + sub + " 当日收盘 : " + close1 + " 15日收盘 :" + close15); + stocks1.setDifferrange15(res); + break; + } + } + for (Stocks stocks30 : stocksList30) { + if (stocks1.getCode().equals(stocks30.getCode())) { + BigDecimal close30 = stocks30.getClose(); + BigDecimal sub = close1.subtract(close30); + BigDecimal res = sub.divide(close30, 4, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal(100)); + System.out.println("code : " + stocks1.getCode() + " 30日涨跌幅 : " + res + " 30日涨跌 : " + sub + " 当日收盘 : " + close1 + " 30日收盘 :" + close30); + stocks1.setDifferrange30(res); + break; + } + } + stocksService.insertStocksTmp(stocks1); + } + System.out.println("testAnalysis finished."); + } + + //批量分析数据 + private void batchAnalysis(Stocks pstocks) + { + TradeDates allTradeDates = new TradeDates(); + allTradeDates.setDate(pstocks.getTradeDay()); + allTradeDates.setLimitCount(100l);//5日的规则, 当天算日期+1,计算5日前的起势是5日的前一个交易日收盘价,所以日期再+1 + List allTradeDatesList = tradeDatesService.selectTradeDatesListB(allTradeDates); + for(TradeDates tradeDates1 : allTradeDatesList) + { + pstocks.setTradeDay(tradeDates1.getDate()); + StocksInTrend stocksInTrend = new StocksInTrend(); + stocksInTrend.setTradeDay(pstocks.getTradeDay()); + List typeList = new ArrayList<>(); + typeList.add("1"); + typeList.add("10"); + typeList.add("20"); + typeList.add("3"); + typeList.add("5"); + typeList.add("15"); + typeList.add("30"); + //获取上一个交易日日期 + TradeDates tradeDates = new TradeDates(); + tradeDates.setDate(pstocks.getTradeDay()); + tradeDates.setLimitCount(10l); + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + String analysisResult = "分析完成"; + for (String tyep : typeList) { + System.out.println("analysis type : " + tyep); + stocksInTrend.setType(tyep); + List list = stocksInTrendService.selectStocksInTrendList(stocksInTrend); + System.out.println("StocksInTrend list : " + list.size()); + if(list.size() <= 0) + { + //检查是否有基础数据,有,则进行分析 + Stocks stocks = new Stocks(); + stocks.setTradeDay(stocksInTrend.getTradeDay()); + stocks.setTradeDays(1l); + stocks.setType(stocksInTrend.getType()); + if(StringUtils.isNull(stocksInTrend.getType())) + stocksInTrend.setType("20"); + if(tyep.equals("1")) + stocks.setOrderParam("differrange"); + else if(tyep.equals("3")) + stocks.setOrderParam("differrange3"); + else if(tyep.equals("5")) + stocks.setOrderParam("differrange5"); + else if(tyep.equals("10")) + stocks.setOrderParam("differrange10"); + else if(tyep.equals("15")) + stocks.setOrderParam("differrange15"); + else if(tyep.equals("20")) + stocks.setOrderParam("differrange20"); + else if(tyep.equals("30")) + stocks.setOrderParam("differrange30"); + else if(tyep.equals("60")) + stocks.setOrderParam("differrange60"); + List stocksList = stocksService.selectStocksListSort(stocks); + if(stocksList.size() > 0 && stocksList.size() < 5000) + { + System.out.println("!StringUtils.isNull(stocksList)"); + long sort = 1; + for(Stocks stock : stocksList) + { + System.out.println("after sort : code : " + stock.getCode()); + StocksInTrend sit = new StocksInTrend(); + sit.setCode(stock.getCode()); + sit.setSort(sort); + sort++; + sit.setTradeDay(stock.getTradeDay()); + sit.setType(stocksInTrend.getType()); +// stocksInTrendService.insertStocksInTrend(sit); + } + sort = 1; + long index = 0; + for(Stocks stock : stocksList) + { + if(StringUtils.isNull(stock)) + { + index ++; + continue; + } + if(stock.getAgenciesHold() == null) + { + index ++; + continue; + } + if(stock.getTradeDays() >= 120 && stock.getAgenciesHold().compareTo(new BigDecimal(2)) == 1) { + StocksInTrend sit = new StocksInTrend(); + sit.setCode(stock.getCode()); + sit.setSort(sort); + sort++; + sit.setTradeDay(stock.getTradeDay()); + sit.setType(stocksInTrend.getType()); + stocksInTrendService.insertStocksInTrend(sit); + } + index++; + if(index > 600) + break; + + } + //计算动量值 + //获取板块内个股数量 + List blemindStockList = stocksService.selectGroupStocksList(stocks); + Map blemindCoundMap = new HashMap(); + for(Stocks stock:blemindStockList) + { + System.out.println("[all]blemind2 : " + stock.getBlemind2() + " count : " + stock.getBlemindCount()); + blemindCoundMap.put(stock.getBlemind2(),stock.getBlemindCount()); + } + //获取动量个股内的板块个股数量 + List blemindTrendStockList = stocksInTrendService.selectGroupStocksInTrendList(stocks); + //做计算,并插入数据库 + List trendsList = new ArrayList<>(); + for(Stocks stock:blemindTrendStockList) { + int count = blemindCoundMap.get(stock.getBlemind2()); + Trends trends = new Trends(); + trends.setTradeDay(stocks.getTradeDay()); + trends.setBlemind2(stock.getBlemind2()); + BigDecimal c = new BigDecimal(stock.getBlemindCount()); + BigDecimal allStocks = new BigDecimal(blemindCoundMap.get(stock.getBlemind2())); + BigDecimal result = c.multiply(c).divide(allStocks, 2, BigDecimal.ROUND_HALF_UP); + System.out.println(stock.getBlemind2() + " 计算动量 allStocks : " + allStocks + " 板块个股: " + c + " 结果: " + result); + trends.setTrendValue(result); + trends.setType(stocksInTrend.getType()); + trends.setStocksCount(c); + trendsList.add(trends); + } + Collections.sort(trendsList, new Comparator() { + @Override + public int compare(Trends s1, Trends s2) { +// return s1.getTrendValue().compareTo(s2.getTrendValue()) == 1 ? 1 : -1; + if(s1.getTrendValue().compareTo(s2.getTrendValue()) == 1) + return -1; + else if(s1.getTrendValue().compareTo(s2.getTrendValue()) == -1) + return 1; + else + return 0; + } + }); + //获取上一个交易日动量数据,用于计算变化 + Trends trends = new Trends(); + trends.setTradeDay(tradeDatesList.get(1).getDate()); + trends.setType(stocks.getType()); + List trendslist = trendsService.selectTrendsList(trends); + Map lastTrendsMap = new HashMap(); + for(Trends trend : trendslist) + { + lastTrendsMap.put(trend.getBlemind2(),trend); + } + //后续需要判断插入还是更新 + sort = 1; + for(Trends trend : trendsList) + { + System.out.println("after sort : blemind2 : " + trend.getBlemind2()); + if(lastTrendsMap.containsKey(trend.getBlemind2())) + { + trend.setSort(sort); + trend.setSortChange(lastTrendsMap.get(trend.getBlemind2()).getSort() - sort); + trend.setTrendValueChange(lastTrendsMap.get(trend.getBlemind2()).getTrendValue().subtract(trend.getTrendValue())); + } + else + { + trend.setSort(sort); + trend.setSortChange(blemindCoundMap.size() - sort); + trend.setTrendValueChange(trend.getTrendValue()); + } + sort++; + trendsService.insertTrends(trend); + } + } + } + else + { + //已存在,不作任何操作;02-13 此时检验是否存在变化值,不存在则进行更新 + Trends trends = new Trends(); + trends.setTradeDay(pstocks.getTradeDay()); + trends.setType(tyep); + List trendsList = trendsService.selectTrendsList(trends); + boolean needsUpdate = false; + if(trendsList.size() > 0) + { + if(trendsList.get(0).getSortChange() == -1) + { + //需要进行更新 + needsUpdate = true; + } + } + if(needsUpdate) + { + //获取上一个交易日动量数据,用于计算变化 + Trends qtrends = new Trends(); + qtrends.setTradeDay(tradeDatesList.get(1).getDate()); + qtrends.setType(tyep); + List qtrendslist = trendsService.selectTrendsList(qtrends); + Map lastTrendsMap = new HashMap(); + for(Trends trend : qtrendslist) + { + lastTrendsMap.put(trend.getBlemind2(),trend); + } + + //获取板块内个股数量 + Stocks stocks = new Stocks(); + stocks.setTradeDay(stocksInTrend.getTradeDay()); + stocks.setTradeDays(1l); + stocks.setType(stocksInTrend.getType()); + List blemindStockList = stocksService.selectGroupStocksList(stocks); + + for(Trends trend : trendsList) + { + System.out.println("after sort : blemind2 : " + trend.getBlemind2()); + if(lastTrendsMap.containsKey(trend.getBlemind2())) + { + trend.setSortChange(lastTrendsMap.get(trend.getBlemind2()).getSort() - trend.getSort()); + trend.setTrendValueChange(lastTrendsMap.get(trend.getBlemind2()).getTrendValue().subtract(trend.getTrendValue())); + } + else + { + trend.setSortChange(blemindStockList.size() - trend.getSort()); + trend.setTrendValueChange(trend.getTrendValue()); + } + trendsService.updateTrends(trend); + } + + } + analysisResult = "更新内容已分析完成"; + } + } + } + System.out.println("analysis finished " ); + } + /** * 分析行情数据 */ - @PreAuthorize("@ss.hasPermi('stocksystem:stocks:analysis')") +// @PreAuthorize("@ss.hasPermi('stocksystem:stocks:analysis')") + @PreAuthorize("@ss.hasRole('admin') || @ss.hasRole('normal_admin')") @Log(title = "行情数据", businessType = BusinessType.OTHER) @PostMapping(("/analysis")) public AjaxResult analysis(@RequestBody Stocks pstocks) { + //批量生成涨跌幅数据 +// batchUpdateXDiff(pstocks); +// return AjaxResult.success("分析完成"); + //批量计算动量相关 +// batchAnalysis(pstocks); +// return AjaxResult.success("分析完成"); + Stocks pstock1 = new Stocks(); + pstock1.setTradeDay(pstocks.getTradeDay()); + redisCache.setCacheObject(getLastImportStocksDate(),pstocks.getTradeDay()); + //更新当天的其他涨跌幅数据 + updateXDiff(pstock1); + //进行分析计算 StocksInTrend stocksInTrend = new StocksInTrend(); stocksInTrend.setTradeDay(pstocks.getTradeDay()); List typeList = new ArrayList<>(); typeList.add("1"); typeList.add("10"); typeList.add("20"); + typeList.add("3"); + typeList.add("5"); + typeList.add("15"); + typeList.add("30"); //获取上一个交易日日期 TradeDates tradeDates = new TradeDates(); tradeDates.setDate(pstocks.getTradeDay()); @@ -359,6 +1307,7 @@ public class StocksController extends BaseController List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); String analysisResult = "分析完成"; for (String tyep : typeList) { + System.out.println("analysis type : " + tyep); stocksInTrend.setType(tyep); List list = stocksInTrendService.selectStocksInTrendList(stocksInTrend); System.out.println("StocksInTrend list : " + list.size()); @@ -371,56 +1320,26 @@ public class StocksController extends BaseController stocks.setType(stocksInTrend.getType()); if(StringUtils.isNull(stocksInTrend.getType())) stocksInTrend.setType("20"); + if(tyep.equals("1")) + stocks.setOrderParam("differrange"); + else if(tyep.equals("3")) + stocks.setOrderParam("differrange3"); + else if(tyep.equals("5")) + stocks.setOrderParam("differrange5"); + else if(tyep.equals("10")) + stocks.setOrderParam("differrange10"); + else if(tyep.equals("15")) + stocks.setOrderParam("differrange15"); + else if(tyep.equals("20")) + stocks.setOrderParam("differrange20"); + else if(tyep.equals("30")) + stocks.setOrderParam("differrange30"); + else if(tyep.equals("60")) + stocks.setOrderParam("differrange60"); List stocksList = stocksService.selectStocksListSort(stocks); - if(stocksList.size() > 0 && stocksList.size() < 5000) + if(stocksList.size() > 0 && stocksList.size() < 6000) { System.out.println("!StringUtils.isNull(stocksList)"); - Collections.sort(stocksList, new Comparator() { - @Override - public int compare(Stocks s1, Stocks s2) { - if ("20".equals(stocksInTrend.getType())) { - if(s1.getDifferrange20() == null || s2.getDifferrange20() == null) - return 1; - if(s1.getDifferrange20().compareTo(s2.getDifferrange20()) == 1) - return -1; - else if(s1.getDifferrange20().compareTo(s2.getDifferrange20()) == -1) - return 1; - else - return 0; - } else if ("10".equals(stocksInTrend.getType())) { - if(s1.getDifferrange10() == null || s2.getDifferrange10() == null) - return 1; - if(s1.getDifferrange10().compareTo(s2.getDifferrange10()) == 1) - return -1; - else if(s1.getDifferrange10().compareTo(s2.getDifferrange10()) == -1) - return 1; - else - return 0; - } else if ("60".equals(stocksInTrend.getType())) { - if(s1.getDifferrange60() == null || s2.getDifferrange60() == null) - return 1; - if(s1.getDifferrange60().compareTo(s2.getDifferrange60()) == 1) - return -1; - else if(s1.getDifferrange60().compareTo(s2.getDifferrange60()) == -1) - return 1; - else - return 0; - }else if("1".equals(stocksInTrend.getType())) - { - if(s1.getDifferrange() == null || s2.getDifferrange() == null) - return 1; - if(s1.getDifferrange().compareTo(s2.getDifferrange()) == 1) - return -1; - else if(s1.getDifferrange().compareTo(s2.getDifferrange()) == -1) - return 1; - else - return 0; - } - else { - return 0; - } - } - }); long sort = 1; for(Stocks stock : stocksList) { @@ -457,7 +1376,7 @@ public class StocksController extends BaseController stocksInTrendService.insertStocksInTrend(sit); } index++; - if(index > 590) + if(index > 600) break; } @@ -588,8 +1507,252 @@ public class StocksController extends BaseController analysisResult = "更新内容已分析完成"; } } - return AjaxResult.success(analysisResult); + +// StocksInTrend stocksInTrend = new StocksInTrend(); +// stocksInTrend.setTradeDay(pstocks.getTradeDay()); +// List typeList = new ArrayList<>(); +// typeList.add("1"); +// typeList.add("10"); +// typeList.add("20"); +// //获取上一个交易日日期 +// TradeDates tradeDates = new TradeDates(); +// tradeDates.setDate(pstocks.getTradeDay()); +// tradeDates.setLimitCount(10l); +// List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); +// String analysisResult = "分析完成"; +// for (String tyep : typeList) { +// stocksInTrend.setType(tyep); +// List list = stocksInTrendService.selectStocksInTrendList(stocksInTrend); +// System.out.println("StocksInTrend list : " + list.size()); +// if(list.size() <= 0) +// { +// //检查是否有基础数据,有,则进行分析 +// Stocks stocks = new Stocks(); +// stocks.setTradeDay(stocksInTrend.getTradeDay()); +// stocks.setTradeDays(1l); +// stocks.setType(stocksInTrend.getType()); +// if(StringUtils.isNull(stocksInTrend.getType())) +// stocksInTrend.setType("20"); +// List stocksList = stocksService.selectStocksListSort(stocks); +// if(stocksList.size() > 0 && stocksList.size() < 5000) +// { +// System.out.println("!StringUtils.isNull(stocksList)"); +// Collections.sort(stocksList, new Comparator() { +// @Override +// public int compare(Stocks s1, Stocks s2) { +// if ("20".equals(stocksInTrend.getType())) { +// if(s1.getDifferrange20() == null || s2.getDifferrange20() == null) +// return 1; +// if(s1.getDifferrange20().compareTo(s2.getDifferrange20()) == 1) +// return -1; +// else if(s1.getDifferrange20().compareTo(s2.getDifferrange20()) == -1) +// return 1; +// else +// return 0; +// } else if ("10".equals(stocksInTrend.getType())) { +// if(s1.getDifferrange10() == null || s2.getDifferrange10() == null) +// return 1; +// if(s1.getDifferrange10().compareTo(s2.getDifferrange10()) == 1) +// return -1; +// else if(s1.getDifferrange10().compareTo(s2.getDifferrange10()) == -1) +// return 1; +// else +// return 0; +// } else if ("60".equals(stocksInTrend.getType())) { +// if(s1.getDifferrange60() == null || s2.getDifferrange60() == null) +// return 1; +// if(s1.getDifferrange60().compareTo(s2.getDifferrange60()) == 1) +// return -1; +// else if(s1.getDifferrange60().compareTo(s2.getDifferrange60()) == -1) +// return 1; +// else +// return 0; +// }else if("1".equals(stocksInTrend.getType())) +// { +// if(s1.getDifferrange() == null || s2.getDifferrange() == null) +// return 1; +// if(s1.getDifferrange().compareTo(s2.getDifferrange()) == 1) +// return -1; +// else if(s1.getDifferrange().compareTo(s2.getDifferrange()) == -1) +// return 1; +// else +// return 0; +// } +// else { +// return 0; +// } +// } +// }); +// long sort = 1; +// for(Stocks stock : stocksList) +// { +// System.out.println("after sort : code : " + stock.getCode()); +// StocksInTrend sit = new StocksInTrend(); +// sit.setCode(stock.getCode()); +// sit.setSort(sort); +// sort++; +// sit.setTradeDay(stock.getTradeDay()); +// sit.setType(stocksInTrend.getType()); +//// stocksInTrendService.insertStocksInTrend(sit); +// } +// sort = 1; +// long index = 0; +// for(Stocks stock : stocksList) +// { +// if(StringUtils.isNull(stock)) +// { +// index ++; +// continue; +// } +// if(stock.getAgenciesHold() == null) +// { +// index ++; +// continue; +// } +// if(stock.getTradeDays() >= 120 && stock.getAgenciesHold().compareTo(new BigDecimal(2)) == 1) { +// StocksInTrend sit = new StocksInTrend(); +// sit.setCode(stock.getCode()); +// sit.setSort(sort); +// sort++; +// sit.setTradeDay(stock.getTradeDay()); +// sit.setType(stocksInTrend.getType()); +// stocksInTrendService.insertStocksInTrend(sit); +// } +// index++; +// if(index > 600) +// break; +// +// } +// //计算动量值 +// //获取板块内个股数量 +// List blemindStockList = stocksService.selectGroupStocksList(stocks); +// Map blemindCoundMap = new HashMap(); +// for(Stocks stock:blemindStockList) +// { +// System.out.println("[all]blemind2 : " + stock.getBlemind2() + " count : " + stock.getBlemindCount()); +// blemindCoundMap.put(stock.getBlemind2(),stock.getBlemindCount()); +// } +// //获取动量个股内的板块个股数量 +// List blemindTrendStockList = stocksInTrendService.selectGroupStocksInTrendList(stocks); +// //做计算,并插入数据库 +// List trendsList = new ArrayList<>(); +// for(Stocks stock:blemindTrendStockList) { +// int count = blemindCoundMap.get(stock.getBlemind2()); +// Trends trends = new Trends(); +// trends.setTradeDay(stocks.getTradeDay()); +// trends.setBlemind2(stock.getBlemind2()); +// BigDecimal c = new BigDecimal(stock.getBlemindCount()); +// BigDecimal allStocks = new BigDecimal(blemindCoundMap.get(stock.getBlemind2())); +// BigDecimal result = c.multiply(c).divide(allStocks, 2, BigDecimal.ROUND_HALF_UP); +// System.out.println(stock.getBlemind2() + " 计算动量 allStocks : " + allStocks + " 板块个股: " + c + " 结果: " + result); +// trends.setTrendValue(result); +// trends.setType(stocksInTrend.getType()); +// trends.setStocksCount(c); +// trendsList.add(trends); +// } +// Collections.sort(trendsList, new Comparator() { +// @Override +// public int compare(Trends s1, Trends s2) { +//// return s1.getTrendValue().compareTo(s2.getTrendValue()) == 1 ? 1 : -1; +// if(s1.getTrendValue().compareTo(s2.getTrendValue()) == 1) +// return -1; +// else if(s1.getTrendValue().compareTo(s2.getTrendValue()) == -1) +// return 1; +// else +// return 0; +// } +// }); +// //获取上一个交易日动量数据,用于计算变化 +// Trends trends = new Trends(); +// trends.setTradeDay(tradeDatesList.get(1).getDate()); +// trends.setType(stocks.getType()); +// List trendslist = trendsService.selectTrendsList(trends); +// Map lastTrendsMap = new HashMap(); +// for(Trends trend : trendslist) +// { +// lastTrendsMap.put(trend.getBlemind2(),trend); +// } +// //后续需要判断插入还是更新 +// sort = 1; +// for(Trends trend : trendsList) +// { +// System.out.println("after sort : blemind2 : " + trend.getBlemind2()); +// if(lastTrendsMap.containsKey(trend.getBlemind2())) +// { +// trend.setSort(sort); +// trend.setSortChange(lastTrendsMap.get(trend.getBlemind2()).getSort() - sort); +// trend.setTrendValueChange(lastTrendsMap.get(trend.getBlemind2()).getTrendValue().subtract(trend.getTrendValue())); +// } +// else +// { +// trend.setSort(sort); +// trend.setSortChange(blemindCoundMap.size() - sort); +// trend.setTrendValueChange(trend.getTrendValue()); +// } +// sort++; +// trendsService.insertTrends(trend); +// } +// } +// } +// else +// { +// //已存在,不作任何操作;02-13 此时检验是否存在变化值,不存在则进行更新 +// Trends trends = new Trends(); +// trends.setTradeDay(pstocks.getTradeDay()); +// trends.setType(tyep); +// List trendsList = trendsService.selectTrendsList(trends); +// boolean needsUpdate = false; +// if(trendsList.size() > 0) +// { +// if(trendsList.get(0).getSortChange() == -1) +// { +// //需要进行更新 +// needsUpdate = true; +// } +// } +// if(needsUpdate) +// { +// //获取上一个交易日动量数据,用于计算变化 +// Trends qtrends = new Trends(); +// qtrends.setTradeDay(tradeDatesList.get(1).getDate()); +// qtrends.setType(tyep); +// List qtrendslist = trendsService.selectTrendsList(qtrends); +// Map lastTrendsMap = new HashMap(); +// for(Trends trend : qtrendslist) +// { +// lastTrendsMap.put(trend.getBlemind2(),trend); +// } +// +// //获取板块内个股数量 +// Stocks stocks = new Stocks(); +// stocks.setTradeDay(stocksInTrend.getTradeDay()); +// stocks.setTradeDays(1l); +// stocks.setType(stocksInTrend.getType()); +// List blemindStockList = stocksService.selectGroupStocksList(stocks); +// +// for(Trends trend : trendsList) +// { +// System.out.println("after sort : blemind2 : " + trend.getBlemind2()); +// if(lastTrendsMap.containsKey(trend.getBlemind2())) +// { +// trend.setSortChange(lastTrendsMap.get(trend.getBlemind2()).getSort() - trend.getSort()); +// trend.setTrendValueChange(lastTrendsMap.get(trend.getBlemind2()).getTrendValue().subtract(trend.getTrendValue())); +// } +// else +// { +// trend.setSortChange(blemindStockList.size() - trend.getSort()); +// trend.setTrendValueChange(trend.getTrendValue()); +// } +// trendsService.updateTrends(trend); +// } +// +// } +// analysisResult = "更新内容已分析完成"; +// } +// } +// +// return AjaxResult.success(analysisResult); } /** @@ -634,4 +1797,64 @@ public class StocksController extends BaseController { return toAjax(stocksService.deleteStocksByIds(ids)); } + + private String getDistributeRedisKey(Stocks stocks) + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + return HOME_STOCKS_DISTRIBUTE + formatter.format(stocks.getTradeDay()) + "_" + stocks.getType(); + } + + private String getStockIndexStocksDistributeRedisKey(Stocks stocks) + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + return STOCKINDEX_STOCKS_DISTRIBUTE + formatter.format(stocks.getTradeDay()) + "_" + stocks.getBlemind2(); + } + + private String getLimitStocksRedisKey(Stocks stocks) + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + return HOME_LIMIT_STOCKS + formatter.format(stocks.getTradeDay()); + } + + private String getDropLimitStocksRedisKey(Stocks stocks) + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + return HOME_DROP_LIMIT_STOCKS + formatter.format(stocks.getTradeDay()); + } + + private String getStrongStocksRedisKey(Stocks stocks) + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + return HOME_STRONG_STOCKS + formatter.format(stocks.getTradeDay()); + } + + private String getLimitReidsKey(Stocks stocks) + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + if(stocks.getIsdrop().equals("是")) + return HOME_DROP_LIMIT_DISTRIBUTE + formatter.format(stocks.getTradeDay()); + else + return HOME_LIMIT_DISTRIBUTE + formatter.format(stocks.getTradeDay()); + } + + private String getStockCodeForQueryRedisKey() + { + return STOCK_CODE_QUERY; + } + + private String getStockNameForQueryRedisKey() + { + return STOCK_NAME_QUERY; + } + + private String getStockIndexForQueryRedisKey() + { + return STOCKINDEX_NAME_QUERY; + } + + private String getLastImportStocksDate() + { + return "last_trade_day:"; + } } + diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StocksNewRecordController.java b/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StocksNewRecordController.java index 6c19fa6..fdde6fd 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StocksNewRecordController.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/controller/StocksNewRecordController.java @@ -6,6 +6,8 @@ import java.util.Date; import java.util.List; import javax.servlet.http.HttpServletResponse; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.stocksystem.domain.StocksLimit; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -27,6 +29,8 @@ import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; import org.springframework.web.multipart.MultipartFile; +import static com.ruoyi.common.constant.Constants.*; + /** * 每日创新高新低Controller * @@ -40,6 +44,9 @@ public class StocksNewRecordController extends BaseController @Autowired private IStocksNewRecordService stocksNewRecordService; + @Autowired + private RedisCache redisCache; + /** * 查询每日创新高新低列表 */ @@ -72,12 +79,35 @@ public class StocksNewRecordController extends BaseController public TableDataInfo grouplist(StocksNewRecord stocksNewRecord) { // startPage(); - List list = stocksNewRecordService.selectGroupStocksNewRecord(stocksNewRecord); +// List list = stocksNewRecordService.selectGroupStocksNewRecord(stocksNewRecord); + String redisKey = getRecordReidsKey(stocksNewRecord); + List list = redisCache.getCacheList(redisKey); + if(list.isEmpty()) + { + list = stocksNewRecordService.selectGroupStocksNewRecord(stocksNewRecord); +// String redisKey = getRecordReidsKey(stocksNewRecord); + if(!list.isEmpty()) { + redisCache.setCacheList(redisKey, list); + redisCache.expire(redisKey, EXPIRED_TIME); + } + } + return getDataTable(list); + } + + /** + * 查询每日新高新低列表 + */ + @GetMapping("/getAllNewRecords") + public TableDataInfo getAllNewRecords(StocksNewRecord stocksNewRecord) + { +// startPage(); + List list = stocksNewRecordService.selectGroupStocksNewRecordAll(stocksNewRecord); return getDataTable(list); } @Log(title = "创新高新低数据导入", businessType = BusinessType.IMPORT) @PreAuthorize("@ss.hasPermi('stocksystem:newrecord:import')") +// @PreAuthorize("@ss.hasRole('admin') || @ss.hasRole('normal_admin')") @PostMapping("/importData") public AjaxResult importData(MultipartFile file, boolean updateSupport, String s) throws Exception { @@ -144,4 +174,15 @@ public class StocksNewRecordController extends BaseController { return toAjax(stocksNewRecordService.deleteStocksNewRecordByIds(ids)); } + + private String getRecordReidsKey(StocksNewRecord stocksNewRecord) + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + if(StringUtils.isNull(stocksNewRecord.getIsHigh())) + return ""; + if(stocksNewRecord.getIsHigh().equals("是")) + return HOME_HIGH_DISTRIBUTE + formatter.format(stocksNewRecord.getTradeDay()); + else + return HOME_LOW_DISTRIBUTE + formatter.format(stocksNewRecord.getTradeDay()); + } } diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/controller/TrendsController.java b/stock-system/src/main/java/com/ruoyi/stocksystem/controller/TrendsController.java index 1ee3a27..74ce58d 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/controller/TrendsController.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/controller/TrendsController.java @@ -5,10 +5,13 @@ import java.text.SimpleDateFormat; import java.util.*; import javax.servlet.http.HttpServletResponse; +import com.ruoyi.common.core.redis.RedisCache; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.stocksystem.domain.*; import com.ruoyi.stocksystem.domain.service.IStocksInTrendService; import com.ruoyi.stocksystem.domain.service.IStocksService; import com.ruoyi.stocksystem.domain.service.ITradeDatesService; +import com.ruoyi.stocksystem.service.IStockIndexService; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; @@ -27,6 +30,8 @@ import com.ruoyi.stocksystem.domain.service.ITrendsService; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.core.page.TableDataInfo; +import static com.ruoyi.common.constant.Constants.*; + /** * 动量结果Controller * @@ -49,6 +54,11 @@ public class TrendsController extends BaseController @Autowired private IStocksService stocksService; + @Autowired + private IStockIndexService stockIndexService; + + @Autowired + private RedisCache redisCache; /** * 查询动量结果列表 */ @@ -56,9 +66,18 @@ public class TrendsController extends BaseController @GetMapping("/list") public TableDataInfo list(Trends trends) { +// List list = redisCache.getCacheList(STOCK_TRENDS + trends.getTradeDay().toString() + "_" + trends.getType()); +// System.out.println("redisKey: " + STOCK_TRENDS + trends.getTradeDay().toString() + "_" + trends.getType()); +// if(list.isEmpty()) { +// System.out.println("redisKey is Empty."); +// startPage(); +//// System.out.println("trendList tradeDay : " + trends.getTradeDay().toString()); +//// List list = trendsService.selectTrendsList(trends); +// list = trendsService.selectTrendsList(trends); +// redisCache.setCacheList(STOCK_TRENDS + trends.getTradeDay().toString() + "_" + trends.getType(), list); +// } startPage(); -// System.out.println("trendList tradeDay : " + trends.getTradeDay().toString()); - List list = trendsService.selectTrendsList(trends); + List list = trendsService.selectTrendsList(trends); return getDataTable(list); } @@ -77,103 +96,101 @@ public class TrendsController extends BaseController @GetMapping("/querytrendstockslist") public TableDataInfo querytrendstockslist(Trends trends) { + List result = redisCache.getCacheList(getHomeTrendsStocks(trends)); + if(result.isEmpty()) { // startPage(); - System.out.println("querytrendstockslist type : " + trends.getType()); - System.out.println("querytrendstockslist tradeDay : " + trends.getTradeDay().toString()); - List list = trendsService.selectTrendsList(trends); - System.out.println("querytrendstockslist : get trends list size : " + list.size()); - List stocksInTrendList = new ArrayList(); - StocksInTrend stocksInTrend = new StocksInTrend(); - //获取10日、20日、60日的日期 - TradeDates tradeDates = new TradeDates(); - tradeDates.setDate(trends.getTradeDay()); - tradeDates.setLimitCount(60l); - List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); - boolean has10 = tradeDatesList.size() >= 10; - boolean has20 = tradeDatesList.size() >= 10; - boolean has60 = tradeDatesList.size() >= 10; - Date tradeDay10; - if(has10) - tradeDay10 = tradeDatesList.get(9).getDate(); - else - tradeDay10 = tradeDatesList.get(tradeDatesList.size()-1).getDate(); - Date tradeDay20; - if(has20) - tradeDay20 = tradeDatesList.get(19).getDate(); - else - tradeDay20 = tradeDatesList.get(tradeDatesList.size()-1).getDate(); - Date tradeDay60; - if(has60) - tradeDay60 = tradeDatesList.get(59).getDate(); - else - tradeDay60 = tradeDatesList.get(tradeDatesList.size()-1).getDate(); - //获取动量板块内的个股 - stocksInTrend.setType(trends.getType()); - stocksInTrend.setTradeDay(trends.getTradeDay()); - List stocksInTrendList1 = stocksInTrendService.selectStocksInTrendList(stocksInTrend); - int trendCount = 0; - for(Trends trends1: list) - { - if(trendCount >= 20) - break; - int trendStockLimit = 5; - if(trendCount <= 9) - trendStockLimit = 5; + System.out.println("querytrendstockslist type : " + trends.getType()); + System.out.println("querytrendstockslist tradeDay : " + trends.getTradeDay().toString()); + List list = trendsService.selectTrendsList(trends); + System.out.println("querytrendstockslist : get trends list size : " + list.size()); + List stocksInTrendList = new ArrayList(); + StocksInTrend stocksInTrend = new StocksInTrend(); + //获取10日、20日、60日的日期 + TradeDates tradeDates = new TradeDates(); + tradeDates.setDate(trends.getTradeDay()); + tradeDates.setLimitCount(60l); + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + boolean has10 = tradeDatesList.size() >= 10; + boolean has20 = tradeDatesList.size() >= 10; + boolean has60 = tradeDatesList.size() >= 10; + Date tradeDay10; + if (has10) + tradeDay10 = tradeDatesList.get(9).getDate(); else - trendStockLimit = 3; - trendCount++; - for(StocksInTrend stocksInTrend1 : stocksInTrendList1) - { - if(trendStockLimit <= 0) + tradeDay10 = tradeDatesList.get(tradeDatesList.size() - 1).getDate(); + Date tradeDay20; + if (has20) + tradeDay20 = tradeDatesList.get(19).getDate(); + else + tradeDay20 = tradeDatesList.get(tradeDatesList.size() - 1).getDate(); + Date tradeDay60; + if (has60) + tradeDay60 = tradeDatesList.get(59).getDate(); + else + tradeDay60 = tradeDatesList.get(tradeDatesList.size() - 1).getDate(); + //获取动量板块内的个股 + stocksInTrend.setType(trends.getType()); + stocksInTrend.setTradeDay(trends.getTradeDay()); + List stocksInTrendList1 = stocksInTrendService.selectStocksInTrendList(stocksInTrend); + int trendCount = 0; + for (Trends trends1 : list) { + if (trendCount >= 20) break; - if(trends1.getBlemind2().equals(stocksInTrend1.getBlemind2())) - { - stocksInTrendList.add(stocksInTrend1); - trendStockLimit--; + int trendStockLimit = 5; + if (trendCount <= 9) + trendStockLimit = 5; + else + trendStockLimit = 3; + trendCount++; + for (StocksInTrend stocksInTrend1 : stocksInTrendList1) { + if (trendStockLimit <= 0) + break; + if (trends1.getBlemind2().equals(stocksInTrend1.getBlemind2())) { + stocksInTrendList.add(stocksInTrend1); + trendStockLimit--; + } } } - } - Stocks stocks = new Stocks(); - stocks.setTradeDay(trends.getTradeDay()); - stocks.setStradeDay(tradeDay20); - List stocksList = stocksService.selectStocksForHigh(stocks); - stocks.setStradeDay(tradeDay10); - List stocksList10 = stocksService.selectStocksForHigh(stocks); - List result = new ArrayList(); - for(StocksInTrend stocksInTrend1 :stocksInTrendList) - { - for(Stocks stocks1 : stocksList) - { - if(stocks1.getCode().equals(stocksInTrend1.getCode())) - { - //计算 - BigDecimal current = stocksInTrend1.getClose(); - BigDecimal high = stocks1.getClose(); - BigDecimal diff = current.subtract(high); - BigDecimal hresult = diff.divide(high, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")); - System.out.println("20 code : " + stocksInTrend1.getCode() + " currentClose: " + current + " highClose: " + high + " diff: " + diff + " res: " + hresult); - stocksInTrend1.setBackDifferrange20(hresult); + Stocks stocks = new Stocks(); + stocks.setTradeDay(trends.getTradeDay()); + stocks.setStradeDay(tradeDay20); + List stocksList = stocksService.selectStocksForHigh(stocks); + stocks.setStradeDay(tradeDay10); + List stocksList10 = stocksService.selectStocksForHigh(stocks); +// List result = new ArrayList(); + for (StocksInTrend stocksInTrend1 : stocksInTrendList) { + for (Stocks stocks1 : stocksList) { + if (stocks1.getCode().equals(stocksInTrend1.getCode())) { + //计算 + BigDecimal current = stocksInTrend1.getClose(); + BigDecimal high = stocks1.getClose(); + BigDecimal diff = current.subtract(high); + BigDecimal hresult = diff.divide(high, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")); + System.out.println("20 code : " + stocksInTrend1.getCode() + " currentClose: " + current + " highClose: " + high + " diff: " + diff + " res: " + hresult); + stocksInTrend1.setBackDifferrange20(hresult); // result.add(stocksInTrend1); - break; + break; + } } - } - for(Stocks stocks2 : stocksList10) - { - if(stocks2.getCode().equals(stocksInTrend1.getCode())) - { - //计算 - BigDecimal current = stocksInTrend1.getClose(); - BigDecimal high = stocks2.getClose(); - BigDecimal diff = current.subtract(high); - BigDecimal hresult = diff.divide(high, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")); - System.out.println("10 code : " + stocksInTrend1.getCode() + " currentClose: " + current + " highClose: " + high + " diff: " + diff + " res: " + hresult); - stocksInTrend1.setBackDifferrange10(hresult); - break; + for (Stocks stocks2 : stocksList10) { + if (stocks2.getCode().equals(stocksInTrend1.getCode())) { + //计算 + BigDecimal current = stocksInTrend1.getClose(); + BigDecimal high = stocks2.getClose(); + BigDecimal diff = current.subtract(high); + BigDecimal hresult = diff.divide(high, 2, BigDecimal.ROUND_HALF_UP).multiply(new BigDecimal("100")); + System.out.println("10 code : " + stocksInTrend1.getCode() + " currentClose: " + current + " highClose: " + high + " diff: " + diff + " res: " + hresult); + stocksInTrend1.setBackDifferrange10(hresult); + break; + } } + result.add(stocksInTrend1); + } + if(!result.isEmpty()) { + redisCache.setCacheList(getHomeTrendsStocks(trends), result); + redisCache.expire(getHomeTrendsStocks(trends), EXPIRED_TIME); } - result.add(stocksInTrend1); - } // //遍历获取板块内个股 // int trendsCount = 0; @@ -232,6 +249,7 @@ public class TrendsController extends BaseController // stocksInTrendList.add(sit); // } // } + } System.out.println("querytrendstockslist count : " + result.size()); return getDataTable(result); } @@ -242,137 +260,552 @@ public class TrendsController extends BaseController @GetMapping("/listSection") public TableDataInfo listSection(Trends trends) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + // startPage(); + List resultDataList; + //如果存在搜索条件时,不走redis,也不缓存 + if(!StringUtils.isEmpty(trends.getBlemind2())) + resultDataList = new ArrayList<>(); + else + resultDataList = redisCache.getCacheList(getTrendsRedisKey(trends)); + System.out.println("redisKey: " + getTrendsRedisKey(trends)); + //查询可交易日期 +// SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + if(resultDataList.isEmpty()) { + TradeDates tradeDates = new TradeDates(); + tradeDates.setDate(trends.getTradeDay()); + tradeDates.setLimitCount(10l); + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + + trends.setTradeDay(tradeDatesList.get(0).getDate()); + + List currentTradeDayTrendslist = trendsService.selectTrendsList(trends); +// List resultDataList = new ArrayList(); + TrendForVue tfv = new TrendForVue(); + List blemind2List = new ArrayList(); + for (Trends ct : currentTradeDayTrendslist) { + blemind2List.add(ct.getBlemind2()); + } + tfv.setDataList(currentTradeDayTrendslist); + tfv.setTitle("2级行业"); + tfv.setIsBlemind2(true); + tfv.setSortDataList(blemind2List); + resultDataList.add(tfv); + + //初始化列表 + for (TradeDates day : tradeDatesList) { + List sortDataList = new ArrayList(); + TrendForVue tf = new TrendForVue(); + tf.setTitle(formatter.format(day.getDate())); + tf.setIsBlemind2(false); + ; + tf.setSortDataList(sortDataList); + resultDataList.add(tf); + } + + for (Trends trend : currentTradeDayTrendslist) { + Trends t = new Trends(); + t.setType(trends.getType()); + t.setBlemind2(trend.getBlemind2()); + t.setTradeDay(trends.getTradeDay()); + List list = trendsService.selectTrendList(t); + for (int i = 1; i < resultDataList.size(); i++) { + boolean isHasSort = false; + for (Trends ttrend : list) { + if (formatter.format(ttrend.getTradeDay()).equals(resultDataList.get(i).getTitle())) { + resultDataList.get(i).getSortDataList().add(ttrend.getSort().toString()); + isHasSort = true; + break; + } + } + if (!isHasSort) { + resultDataList.get(i).getSortDataList().add("-1"); + } + } + } + if(StringUtils.isEmpty(trends.getBlemind2())) { + if(!resultDataList.isEmpty()) { + redisCache.setCacheList(getTrendsRedisKey(trends), resultDataList); + redisCache.expire(getTrendsRedisKey(trends), EXPIRED_TIME);//单位秒 + } + } + System.out.println("redisKey: list is empty."); + } + return getDataTable(resultDataList); + +// //当天的数据在第一列,后面都是以这个为顺序 +// List currentTradeDayTrendslist = trendsService.selectTrendsList(trends); +// List > resultDataList = new ArrayList >(); +// resultDataList.add(currentTradeDayTrendslist); +// +// for(Trends trend : currentTradeDayTrendslist) +// { +// Trends t = new Trends(); +// t.setType(trends.getType()); +// t.setBlemind2(trend.getBlemind2()); +// t.setTradeDay(trends.getTradeDay()); +// List list = trendsService.selectTrendList(t); +// resultDataList.add(list); +// } +// +// return getDataTable(resultDataList); + } + + /** + * 查询行情数据列表含基础数据 + */ + @GetMapping("/listTradeVolume") + public TableDataInfo listTradeVolume(StockIndex stockIndex) + { //查询可交易日期 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); -// String dateString = formatter.format(currentTime); TradeDates tradeDates = new TradeDates(); - tradeDates.setDate(trends.getTradeDay()); + tradeDates.setDate(stockIndex.getTradeDay()); tradeDates.setLimitCount(10l); List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); - trends.setTradeDay(tradeDatesList.get(0).getDate()); + stockIndex.setTradeDay(tradeDatesList.get(0).getDate()); - List currentTradeDayTrendslist = trendsService.selectTrendsList(trends); + List currentTradeDayStockIndexlist = stockIndexService.selectStockIndexTradeVolumeList(stockIndex); List resultDataList = new ArrayList(); TrendForVue tfv = new TrendForVue(); List blemind2List = new ArrayList(); - for(Trends ct : currentTradeDayTrendslist) + for(StockIndex ct : currentTradeDayStockIndexlist) { - blemind2List.add(ct.getBlemind2()); + blemind2List.add(ct.getName()); } - tfv.setDataList(currentTradeDayTrendslist); +// tfv.setDataList(currentTradeDayTrendslist); tfv.setTitle("2级行业"); tfv.setIsBlemind2(true); tfv.setSortDataList(blemind2List); + tfv.setRawDataList(blemind2List); resultDataList.add(tfv); //初始化列表 + StockIndex stockIndex1 = new StockIndex(); for (TradeDates day : tradeDatesList) { + stockIndex1.setTradeDay(day.getDate()); + List trradeDayStockIndexlist = stockIndexService.selectStockIndexTradeVolumeList(stockIndex1); List sortDataList = new ArrayList(); + List amoutsDataList = new ArrayList(); TrendForVue tf = new TrendForVue(); tf.setTitle(formatter.format(day.getDate())); - tf.setIsBlemind2(false);; + tf.setIsBlemind2(false); + for(StockIndex stockIndexTmp : currentTradeDayStockIndexlist) + { + boolean isHasSort = false; + int currentSort = 1; + for(StockIndex stockIndex2 : trradeDayStockIndexlist) + { + if(stockIndex2.getCode().equals(stockIndexTmp.getCode())) + { +// sortDataList.add(stockIndex2.Amountliqmv().toString()); + sortDataList.add(String.valueOf(currentSort));//传输的是排名 + amoutsDataList.add(stockIndex2.getAmountliqmv().setScale(2, BigDecimal.ROUND_UP).toString()); + currentSort++; + isHasSort = true; + break; + } + else + { + currentSort++; + } + } + if(!isHasSort) + { + sortDataList.add("-1"); + amoutsDataList.add("-1"); + } + } tf.setSortDataList(sortDataList); + tf.setRawDataList(amoutsDataList); resultDataList.add(tf); } + return getDataTable(resultDataList); + } - for(Trends trend : currentTradeDayTrendslist) + /** + * 查询行情数据列表含基础数据 + */ + @GetMapping("/listStockIndexLimitUp") + public TableDataInfo listStockIndexLimitUp(StockIndex stockIndex) + { + //查询可交易日期 + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + TradeDates tradeDates = new TradeDates(); + tradeDates.setDate(stockIndex.getTradeDay()); + tradeDates.setLimitCount(10l); + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + + stockIndex.setTradeDay(tradeDatesList.get(0).getDate()); + + stockIndex.setOrderParam("limitupnum"); + List currentTradeDayStockIndexlist = stockIndexService.selectStockIndexRecordsList(stockIndex); + List resultDataList = new ArrayList(); + TrendForVue tfv = new TrendForVue(); + List blemind2List = new ArrayList(); + for(StockIndex ct : currentTradeDayStockIndexlist) { - Trends t = new Trends(); - t.setType(trends.getType()); - t.setBlemind2(trend.getBlemind2()); - t.setTradeDay(trends.getTradeDay()); - List list = trendsService.selectTrendList(t); - for(int i = 1 ; i < resultDataList.size() ; i++) + blemind2List.add(ct.getName()); + } +// tfv.setDataList(currentTradeDayTrendslist); + tfv.setTitle("2级行业"); + tfv.setIsBlemind2(true); + tfv.setSortDataList(blemind2List); + resultDataList.add(tfv); + + //初始化列表 + StockIndex stockIndex1 = new StockIndex(); + for (TradeDates day : tradeDatesList) + { + stockIndex1.setTradeDay(day.getDate()); + stockIndex1.setOrderParam("limitupnum"); + List trradeDayStockIndexlist = stockIndexService.selectStockIndexRecordsList(stockIndex1); + List sortDataList = new ArrayList(); + TrendForVue tf = new TrendForVue(); + tf.setTitle(formatter.format(day.getDate())); + tf.setIsBlemind2(false); + for(StockIndex stockIndexTmp : currentTradeDayStockIndexlist) { boolean isHasSort = false; - for(Trends ttrend : list) + for(StockIndex stockIndex2 : trradeDayStockIndexlist) { - if(formatter.format(ttrend.getTradeDay()).equals(resultDataList.get(i).getTitle())) + if(stockIndex2.getCode().equals(stockIndexTmp.getCode())) { - resultDataList.get(i).getSortDataList().add(ttrend.getSort().toString()); + sortDataList.add(stockIndex2.getLimitupnum().setScale(0,BigDecimal.ROUND_UP).toString()); isHasSort = true; break; } } if(!isHasSort) { - resultDataList.get(i).getSortDataList().add("-1"); + sortDataList.add("-1"); } } + tf.setSortDataList(sortDataList); + resultDataList.add(tf); } return getDataTable(resultDataList); + } -// //当天的数据在第一列,后面都是以这个为顺序 -// List currentTradeDayTrendslist = trendsService.selectTrendsList(trends); -// List > resultDataList = new ArrayList >(); -// resultDataList.add(currentTradeDayTrendslist); + /** + * 查询行情数据列表含基础数据 + */ + @GetMapping("/listStockIndexLimitDown") + public TableDataInfo listStockIndexLimitDown(StockIndex stockIndex) + { + //查询可交易日期 + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + TradeDates tradeDates = new TradeDates(); + tradeDates.setDate(stockIndex.getTradeDay()); + tradeDates.setLimitCount(10l); + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + + stockIndex.setTradeDay(tradeDatesList.get(0).getDate()); + + stockIndex.setOrderParam("limitdownnum"); + List currentTradeDayStockIndexlist = stockIndexService.selectStockIndexRecordsList(stockIndex); + List resultDataList = new ArrayList(); + TrendForVue tfv = new TrendForVue(); + List blemind2List = new ArrayList(); + for(StockIndex ct : currentTradeDayStockIndexlist) + { + blemind2List.add(ct.getName()); + } +// tfv.setDataList(currentTradeDayTrendslist); + tfv.setTitle("2级行业"); + tfv.setIsBlemind2(true); + tfv.setSortDataList(blemind2List); + resultDataList.add(tfv); + + //初始化列表 + StockIndex stockIndex1 = new StockIndex(); + for (TradeDates day : tradeDatesList) + { + stockIndex1.setTradeDay(day.getDate()); + stockIndex1.setOrderParam("limitdownnum"); + List trradeDayStockIndexlist = stockIndexService.selectStockIndexRecordsList(stockIndex1); + List sortDataList = new ArrayList(); + TrendForVue tf = new TrendForVue(); + tf.setTitle(formatter.format(day.getDate())); + tf.setIsBlemind2(false); + for(StockIndex stockIndexTmp : currentTradeDayStockIndexlist) + { + boolean isHasSort = false; + for(StockIndex stockIndex2 : trradeDayStockIndexlist) + { + if(stockIndex2.getCode().equals(stockIndexTmp.getCode())) + { + sortDataList.add(stockIndex2.getLimitdownnum().toString()); + isHasSort = true; + break; + } + } + if(!isHasSort) + { + sortDataList.add("-1"); + } + } + tf.setSortDataList(sortDataList); + resultDataList.add(tf); + } + return getDataTable(resultDataList); + } + + /** + * 查询行情数据列表含基础数据 + */ + @GetMapping("/listStockIndexHighRocord") + public TableDataInfo listStockIndexHighRocord(StockIndex stockIndex) + { + //查询可交易日期 + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + TradeDates tradeDates = new TradeDates(); + tradeDates.setDate(stockIndex.getTradeDay()); + tradeDates.setLimitCount(10l); + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + + stockIndex.setTradeDay(tradeDatesList.get(0).getDate()); + + stockIndex.setOrderParam("rcnthigh"); + List currentTradeDayStockIndexlist = stockIndexService.selectStockIndexRecordsList(stockIndex); + List resultDataList = new ArrayList(); + TrendForVue tfv = new TrendForVue(); + List blemind2List = new ArrayList(); + for(StockIndex ct : currentTradeDayStockIndexlist) + { + blemind2List.add(ct.getName()); + } +// tfv.setDataList(currentTradeDayTrendslist); + tfv.setTitle("2级行业"); + tfv.setIsBlemind2(true); + tfv.setSortDataList(blemind2List); + resultDataList.add(tfv); + + //初始化列表 + StockIndex stockIndex1 = new StockIndex(); + for (TradeDates day : tradeDatesList) + { + stockIndex1.setTradeDay(day.getDate()); + stockIndex1.setOrderParam("rcnthigh"); + List trradeDayStockIndexlist = stockIndexService.selectStockIndexRecordsList(stockIndex1); + List sortDataList = new ArrayList(); + TrendForVue tf = new TrendForVue(); + tf.setTitle(formatter.format(day.getDate())); + tf.setIsBlemind2(false); + for(StockIndex stockIndexTmp : currentTradeDayStockIndexlist) + { + boolean isHasSort = false; + for(StockIndex stockIndex2 : trradeDayStockIndexlist) + { + if(stockIndex2.getCode().equals(stockIndexTmp.getCode())) + { + sortDataList.add(stockIndex2.getRcnthigh().equals("是") ? "1" : "-1"); + isHasSort = true; + break; + } + } + if(!isHasSort) + { + sortDataList.add("-1"); + } + } + tf.setSortDataList(sortDataList); + resultDataList.add(tf); + } + return getDataTable(resultDataList); + } + + /** + * 查询行情数据列表含基础数据 + */ + @GetMapping("/listStockIndexLowRocord") + public TableDataInfo listStockIndexLowRocord(StockIndex stockIndex) + { + //查询可交易日期 + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + + TradeDates tradeDates = new TradeDates(); + tradeDates.setDate(stockIndex.getTradeDay()); + tradeDates.setLimitCount(10l); + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + + stockIndex.setTradeDay(tradeDatesList.get(0).getDate()); + + stockIndex.setOrderParam("rcntlow"); + List currentTradeDayStockIndexlist = stockIndexService.selectStockIndexRecordsList(stockIndex); + List resultDataList = new ArrayList(); + TrendForVue tfv = new TrendForVue(); + List blemind2List = new ArrayList(); + for(StockIndex ct : currentTradeDayStockIndexlist) + { + blemind2List.add(ct.getName()); + } +// tfv.setDataList(currentTradeDayTrendslist); + tfv.setTitle("2级行业"); + tfv.setIsBlemind2(true); + tfv.setSortDataList(blemind2List); + resultDataList.add(tfv); + + //初始化列表 + StockIndex stockIndex1 = new StockIndex(); + for (TradeDates day : tradeDatesList) + { + stockIndex1.setTradeDay(day.getDate()); + stockIndex1.setOrderParam("rcntlow"); + List trradeDayStockIndexlist = stockIndexService.selectStockIndexRecordsList(stockIndex1); + List sortDataList = new ArrayList(); + TrendForVue tf = new TrendForVue(); + tf.setTitle(formatter.format(day.getDate())); + tf.setIsBlemind2(false); + for(StockIndex stockIndexTmp : currentTradeDayStockIndexlist) + { + boolean isHasSort = false; + for(StockIndex stockIndex2 : trradeDayStockIndexlist) + { + if(stockIndex2.getCode().equals(stockIndexTmp.getCode())) + { + sortDataList.add(stockIndex2.getRcntlow().equals("是") ? "1" : "-1"); + isHasSort = true; + break; + } + } + if(!isHasSort) + { + sortDataList.add("-1"); + } + } + tf.setSortDataList(sortDataList); + resultDataList.add(tf); + } + return getDataTable(resultDataList); + } + + +// /** +// * 查询行情数据列表含基础数据 2022-08-13原实现 +// */ +// @GetMapping("/listSectionByBlemind") +// public TableDataInfo listSectionByBlemind(Trends trends) +// { +// SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); // -// for(Trends trend : currentTradeDayTrendslist) +// TradeDates tradeDates = new TradeDates(); +// tradeDates.setDate(trends.getTradeDay()); +// tradeDates.setLimitCount(90l); +// List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); +// +// List resultDataList = new ArrayList(); +// TrendForVue tfv = new TrendForVue(); +// List xAxisDataList = new ArrayList(); +// List seriesDataList = new ArrayList(); +// for(TradeDates tradeDates1 : tradeDatesList) // { +// xAxisDataList.add(formatter.format(tradeDates1.getDate())); // Trends t = new Trends(); // t.setType(trends.getType()); -// t.setBlemind2(trend.getBlemind2()); -// t.setTradeDay(trends.getTradeDay()); +// t.setBlemind2(trends.getBlemind2()); +// t.setTradeDay(tradeDates1.getDate()); +// t.setLimitCount(1l); // List list = trendsService.selectTrendList(t); -// resultDataList.add(list); +// if(list.size() <= 0) +// { +// seriesDataList.add("100"); +// } +// else { +// for (Trends ttrend : list) { +// if (formatter.format(ttrend.getTradeDay()).equals(formatter.format(tradeDates1.getDate()))) { +// seriesDataList.add(ttrend.getSort().toString()); +// } else { +// seriesDataList.add("100"); +// } +// } +// } +// // } +// tfv.setTitle("交易日期"); +// tfv.setSortDataList(xAxisDataList); +// resultDataList.add(tfv); // +// TrendForVue tfvSeries = new TrendForVue(); +// tfvSeries.setTitle("Series"); +// tfvSeries.setSortDataList(seriesDataList); +// resultDataList.add(tfvSeries); // return getDataTable(resultDataList); - } - +// } /** - * 查询行情数据列表含基础数据 + * 查询板块动量值 */ @GetMapping("/listSectionByBlemind") public TableDataInfo listSectionByBlemind(Trends trends) { - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + String redisKey = getSectionByBlemindRedisKey(trends); + List resultDataList = redisCache.getCacheList(redisKey); + if(resultDataList.isEmpty()) { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); - TradeDates tradeDates = new TradeDates(); - tradeDates.setDate(trends.getTradeDay()); - tradeDates.setLimitCount(90l); - List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); + TradeDates tradeDates = new TradeDates(); + tradeDates.setDate(trends.getTradeDay()); + tradeDates.setLimitCount(90l); + List tradeDatesList = tradeDatesService.selectTradeDatesListB(tradeDates); - List resultDataList = new ArrayList(); - TrendForVue tfv = new TrendForVue(); - List xAxisDataList = new ArrayList(); - List seriesDataList = new ArrayList(); - for(TradeDates tradeDates1 : tradeDatesList) - { - xAxisDataList.add(formatter.format(tradeDates1.getDate())); Trends t = new Trends(); t.setType(trends.getType()); t.setBlemind2(trends.getBlemind2()); - t.setTradeDay(tradeDates1.getDate()); - t.setLimitCount(1l); - List list = trendsService.selectTrendList(t); - if(list.size() <= 0) - { - seriesDataList.add("100"); - } - else { - for (Trends ttrend : list) { - if (formatter.format(ttrend.getTradeDay()).equals(formatter.format(tradeDates1.getDate()))) { - seriesDataList.add(ttrend.getSort().toString()); - } else { + t.setTradeDay(trends.getTradeDay()); + t.setLimitCount(90l); + List tradeDatesTrendsList = trendsService.selectTrendList(t); + +// List resultDataList = new ArrayList(); + TrendForVue tfv = new TrendForVue(); + List xAxisDataList = new ArrayList(); + List seriesDataList = new ArrayList(); + List rawDataList = new ArrayList(); + int trendsCount = tradeDatesTrendsList.size(); + int tradeDatesCount = tradeDatesList.size(); + for (int i = 0; i < tradeDatesCount; i++) { + xAxisDataList.add(formatter.format(tradeDatesList.get(i).getDate())); + if (i < trendsCount) { + boolean isFound = false; + for (Trends ttrend : tradeDatesTrendsList) { + if (formatter.format(ttrend.getTradeDay()).equals(formatter.format(tradeDatesList.get(i).getDate()))) { + seriesDataList.add(ttrend.getSort().toString()); + rawDataList.add(ttrend.getTrendValue().toString()); + isFound = true; + break; + } + } + if (!isFound) { seriesDataList.add("100"); + rawDataList.add("0"); } + } else { + seriesDataList.add("100"); + rawDataList.add("0"); } } - } - tfv.setTitle("交易日期"); - tfv.setSortDataList(xAxisDataList); - resultDataList.add(tfv); + tfv.setTitle("交易日期"); + tfv.setSortDataList(xAxisDataList); + resultDataList.add(tfv); + + TrendForVue tfvSeries = new TrendForVue(); + tfvSeries.setTitle("Series"); + tfvSeries.setSortDataList(seriesDataList); + tfvSeries.setRawDataList(rawDataList); + resultDataList.add(tfvSeries); - TrendForVue tfvSeries = new TrendForVue(); - tfvSeries.setTitle("Series"); - tfvSeries.setSortDataList(seriesDataList); - resultDataList.add(tfvSeries); + if(!resultDataList.isEmpty()) { + redisCache.setCacheList(redisKey, resultDataList); + redisCache.expire(redisKey, EXPIRED_TIME); + } + } return getDataTable(resultDataList); } @@ -431,4 +864,22 @@ public class TrendsController extends BaseController { return toAjax(trendsService.deleteTrendsByIds(ids)); } + + private String getTrendsRedisKey(Trends trends) + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + return TRENDS + formatter.format(trends.getTradeDay()) + "_" + trends.getType(); + } + + private String getHomeTrendsStocks(Trends trends) + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + return HOME_TRENDS_STOCKS + formatter.format(trends.getTradeDay()) + "_" + trends.getType(); + } + + private String getSectionByBlemindRedisKey(Trends trends) + { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + return TRENDS_SECTION_BLEMIND + formatter.format(trends.getTradeDay()) + "_" + trends.getBlemind2() + "_" + trends.getType(); + } } diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/QueryData.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/QueryData.java new file mode 100644 index 0000000..5e6875e --- /dev/null +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/QueryData.java @@ -0,0 +1,42 @@ +package com.ruoyi.stocksystem.domain; + +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.List; + +public class QueryData extends BaseEntity { + private static final long serialVersionUID = 1L; + + private String value; + + private String data; + + + public void setValue(String value) + { + this.value = value; + } + public String getValue() + { + return this.value; + } + + public void setData(String data) + { + this.data = data; + } + public String getData() + { + return this.data; + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE) + .append("value", getValue()).append("name",getData()) + .toString(); + } +} diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StockFinancial.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StockFinancial.java new file mode 100644 index 0000000..4ee6d75 --- /dev/null +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StockFinancial.java @@ -0,0 +1,167 @@ +package com.ruoyi.stocksystem.domain; + +import java.math.BigDecimal; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * A股财务数据对象 stock_financial + * + * @author lxy + * @date 2022-05-05 + */ +public class StockFinancial extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** id */ + private Long id; + + /** 股票代码 */ + @Excel(name = "股票代码") + private String code; + + /** 报告期 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "报告期", width = 30, dateFormat = "yyyy-MM-dd") + private Date period; + + /** 净利润同比增长率 */ + @Excel(name = "净利润同比增长率") + private BigDecimal jlrtbzzl; + + /** 净利润环比增长率 */ + @Excel(name = "净利润环比增长率") + private BigDecimal jlrhbzzl; + + /** 净资产收益率ROE */ + @Excel(name = "净资产收益率ROE") + private BigDecimal jzcsylroe; + + /** 每股收益EPS */ + @Excel(name = "每股收益EPS") + private BigDecimal epsbasic; + + /** 净利润 */ + @Excel(name = "净利润") + private BigDecimal jlr; + + /** 基本每股收益 */ + @Excel(name = "基本每股收益") + private BigDecimal jbmgsy; + + /** 每股净资产BPS */ + @Excel(name = "每股净资产BPS") + private BigDecimal mgjzc; + + public void setId(Long id) + { + this.id = id; + } + + public Long getId() + { + return id; + } + public void setCode(String code) + { + this.code = code; + } + + public String getCode() + { + return code; + } + public void setPeriod(Date period) + { + this.period = period; + } + + public Date getPeriod() + { + return period; + } + public void setJlrtbzzl(BigDecimal jlrtbzzl) + { + this.jlrtbzzl = jlrtbzzl; + } + + public BigDecimal getJlrtbzzl() + { + return jlrtbzzl; + } + public void setJlrhbzzl(BigDecimal jlrhbzzl) + { + this.jlrhbzzl = jlrhbzzl; + } + + public BigDecimal getJlrhbzzl() + { + return jlrhbzzl; + } + public void setJzcsylroe(BigDecimal jzcsylroe) + { + this.jzcsylroe = jzcsylroe; + } + + public BigDecimal getJzcsylroe() + { + return jzcsylroe; + } + public void setEpsbasic(BigDecimal epsbasic) + { + this.epsbasic = epsbasic; + } + + public BigDecimal getEpsbasic() + { + return epsbasic; + } + public void setJlr(BigDecimal jlr) + { + this.jlr = jlr; + } + + public BigDecimal getJlr() + { + return jlr; + } + public void setJbmgsy(BigDecimal jbmgsy) + { + this.jbmgsy = jbmgsy; + } + + public BigDecimal getJbmgsy() + { + return jbmgsy; + } + public void setMgjzc(BigDecimal mgjzc) + { + this.mgjzc = mgjzc; + } + + public BigDecimal getMgjzc() + { + return mgjzc; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("code", getCode()) + .append("period", getPeriod()) + .append("jlrtbzzl", getJlrtbzzl()) + .append("jlrhbzzl", getJlrhbzzl()) + .append("jzcsylroe", getJzcsylroe()) + .append("epsbasic", getEpsbasic()) + .append("jlr", getJlr()) + .append("jbmgsy", getJbmgsy()) + .append("mgjzc", getMgjzc()) + .toString(); + } +} diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StockIndex.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StockIndex.java index 9cdc267..e5d1b49 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StockIndex.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StockIndex.java @@ -22,11 +22,11 @@ public class StockIndex extends BaseEntity private Long id; /** 指数代码 */ - @Excel(name = "指数代码") + @Excel(name = "证券代码") private String code; /** 指数名称 */ - @Excel(name = "指数名称") + @Excel(name = "证券名称") private String name; /** 交易日期 */ @@ -87,7 +87,7 @@ public class StockIndex extends BaseEntity private BigDecimal flatnum; /** 成分个数 */ - @Excel(name = "成分个数") + @Excel(name = "成份个数") private BigDecimal componentnum; /** 总市值 */ @@ -108,11 +108,26 @@ public class StockIndex extends BaseEntity /** 近期创历史新高 */ @Excel(name = "近期创历史新高") - private BigDecimal rcnthigh; + private String rcnthigh; /** 近期创历史新低 */ @Excel(name = "近期创历史新低") - private BigDecimal rcntlow; + private String rcntlow; + + private BigDecimal amountmv; + + private BigDecimal amountliqmv; + + //排序字段 + private String orderParam; + public void setOrderParam(String orderParam) + { + this.orderParam = orderParam; + } + public String getOrderParam() + { + return orderParam; + } public void setId(Long id) { @@ -312,25 +327,43 @@ public class StockIndex extends BaseEntity { return liqmv; } - public void setRcnthigh(BigDecimal rcnthigh) + public void setRcnthigh(String rcnthigh) { this.rcnthigh = rcnthigh; } - public BigDecimal getRcnthigh() + public String getRcnthigh() { return rcnthigh; } - public void setRcntlow(BigDecimal rcntlow) + public void setRcntlow(String rcntlow) { this.rcntlow = rcntlow; } - public BigDecimal getRcntlow() + public String getRcntlow() { return rcntlow; } + public void setAmountmv(BigDecimal amountmv) + { + this.amountmv = amountmv; + } + public BigDecimal getAmountmv() + { + return amountmv; + } + + public void setAmountliqmv(BigDecimal amountliqmv) + { + this.amountliqmv = amountliqmv; + } + public BigDecimal getAmountliqmv() + { + return amountliqmv; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -357,7 +390,7 @@ public class StockIndex extends BaseEntity .append("pettmMid", getPettmMid()) .append("liqmv", getLiqmv()) .append("rcnthigh", getRcnthigh()) - .append("rcntlow", getRcntlow()) + .append("rcntlow", getRcntlow()).append("amountliqmv", getAmountmv()) .toString(); } } diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/Stocks.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/Stocks.java index 49a6496..a6e3c56 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/Stocks.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/Stocks.java @@ -28,6 +28,8 @@ public class Stocks extends BaseEntity @Excel(name = "证券代码") private String code; + public String value; + /** 股票名称 */ @Excel(name = "证券名称") private String name; @@ -130,9 +132,42 @@ public class Stocks extends BaseEntity //查询使用,动量类型 1、10、20; 涨跌分布类型: all(全部), sh(上证), sz(深圳) ,ge(创业板),star(科创板) private String type; + //财务数据 + private StockFinancial stockFinancial; + /** 基础数据信息 */ private List stockBasicList; + /** 3日区间涨跌幅 */ + @Excel(name = "3日区间涨跌幅") + private BigDecimal differrange3; + + /** 5日区间涨跌幅 */ + @Excel(name = "5日区间涨跌幅") + private BigDecimal differrange5; + + /** 15日区间涨跌幅 */ + @Excel(name = "15日区间涨跌幅") + private BigDecimal differrange15; + + /** 30日区间涨跌幅 */ + @Excel(name = "30日区间涨跌幅") + private BigDecimal differrange30; + + private BigDecimal calLimitTradeDates; + private BigDecimal limitTradeDates; + + //排序字段 + private String orderParam; + public void setOrderParam(String orderParam) + { + this.orderParam = orderParam; + } + public String getOrderParam() + { + return orderParam; + } + public void setType(String type) { this.type = type; @@ -395,6 +430,69 @@ public class Stocks extends BaseEntity return blemindsCount; } + public void setStockFinancial(StockFinancial stockFinancial) + { + this.stockFinancial = stockFinancial; + } + public StockFinancial getStockFinancial() + { + return this.stockFinancial; + } + + public void setDifferrange3(BigDecimal differrange3) + { + this.differrange3 = differrange3; + } + public BigDecimal getDifferrange3() + { + return differrange3; + } + + public void setDifferrange5(BigDecimal differrange5) + { + this.differrange5 = differrange5; + } + public BigDecimal getDifferrange5() + { + return differrange5; + } + + public void setDifferrange15(BigDecimal differrange15) + { + this.differrange15 = differrange15; + } + public BigDecimal getDifferrange15() + { + return differrange15; + } + + public void setDifferrange30(BigDecimal differrange30) + { + this.differrange30 = differrange30; + } + public BigDecimal getDifferrange30() + { + return differrange30; + } + + public void setCalLimitTradeDates(BigDecimal calLimitTradeDates) + { + this.calLimitTradeDates = calLimitTradeDates; + } + public BigDecimal getCalLimitTradeDates() + { + return calLimitTradeDates; + } + + public void setLimitTradeDates(BigDecimal limitTradeDates) + { + this.limitTradeDates = limitTradeDates; + } + public BigDecimal getLimitTradeDates() + { + return limitTradeDates; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) @@ -414,6 +512,10 @@ public class Stocks extends BaseEntity .append("differrange10", getDifferrange10()) .append("differrange20", getDifferrange20()) .append("differrange60", getDifferrange60()) + .append("differrange3", getDifferrange3()) + .append("differrange5", getDifferrange5()) + .append("differrange15", getDifferrange15()) + .append("differrange30", getDifferrange30()) .append("avgVolume20", getAvgVolume20()) .append("freefloatMarketValue", getFreefloatMarketValue()) .append("totalMarketValue", getTotalMarketValue()) diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StocksInTrend.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StocksInTrend.java index 59532f2..0f1ec7e 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StocksInTrend.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StocksInTrend.java @@ -87,6 +87,22 @@ public class StocksInTrend extends BaseEntity @Excel(name = "60日区间最大回撤") private BigDecimal backdifferrange60; + /** 3日区间涨跌幅 */ + @Excel(name = "3日区间涨跌幅") + private BigDecimal differrange3; + + /** 5日区间涨跌幅 */ + @Excel(name = "5日区间涨跌幅") + private BigDecimal differrange5; + + /** 15日区间涨跌幅 */ + @Excel(name = "15日区间涨跌幅") + private BigDecimal differrange15; + + /** 30日区间涨跌幅 */ + @Excel(name = "30日区间涨跌幅") + private BigDecimal differrange30; + public void setId(Long id) { this.id = id; @@ -238,6 +254,42 @@ public class StocksInTrend extends BaseEntity return backdifferrange60; } + public void setDifferrange3(BigDecimal differrange3) + { + this.differrange3 = differrange3; + } + public BigDecimal getDifferrange3() + { + return differrange3; + } + + public void setDifferrange5(BigDecimal differrange5) + { + this.differrange5 = differrange5; + } + public BigDecimal getDifferrange5() + { + return differrange5; + } + + public void setDifferrange15(BigDecimal differrange15) + { + this.differrange15 = differrange15; + } + public BigDecimal getDifferrange15() + { + return differrange15; + } + + public void setDifferrange30(BigDecimal differrange30) + { + this.differrange30 = differrange30; + } + public BigDecimal getDifferrange30() + { + return differrange30; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StocksNewRecord.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StocksNewRecord.java index 197cebd..2d46627 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StocksNewRecord.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/StocksNewRecord.java @@ -34,6 +34,7 @@ public class StocksNewRecord extends BaseEntity private String isHigh; /** 是否300天新低 */ +// @Excel(name = "近期创阶段新低") @Excel(name = "近期创阶段新低") private String isLow; diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/TrendForVue.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/TrendForVue.java index 0e8ae79..93bf881 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/TrendForVue.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/TrendForVue.java @@ -31,6 +31,9 @@ public class TrendForVue extends BaseEntity private List sortDataList; + //原始数据 + private List rawDataList; + public void setTitle(String title) { this.title = title; @@ -67,6 +70,15 @@ public class TrendForVue extends BaseEntity this.sortDataList = sortdataList; } + public List getRawDataList() + { + return this.rawDataList; + } + public void setRawDataList(List rawDataList) + { + this.rawDataList = rawDataList; + } + @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStockFinancialService.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStockFinancialService.java new file mode 100644 index 0000000..852391f --- /dev/null +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStockFinancialService.java @@ -0,0 +1,80 @@ +package com.ruoyi.stocksystem.service; + +import java.util.List; +import com.ruoyi.stocksystem.domain.StockFinancial; +import com.ruoyi.stocksystem.domain.Stocks; + +/** + * A股财务数据Service接口 + * + * @author lxy + * @date 2022-05-05 + */ +public interface IStockFinancialService +{ + /** + * 查询A股财务数据 + * + * @param id A股财务数据主键 + * @return A股财务数据 + */ + public StockFinancial selectStockFinancialById(Long id); + + /** + * 查询A股财务数据 + * + * @param stockFinancial A股财务数据 根据period 和 code查询 + * @return A股财务数据 + */ + public List selectStockFinancialByPeriod(StockFinancial stockFinancial); + + /** + * 查询A股财务数据列表 + * + * @param stockFinancial A股财务数据 + * @return A股财务数据集合 + */ + public List selectStockFinancialList(StockFinancial stockFinancial); + + /** + * 新增A股财务数据 + * + * @param stockFinancial A股财务数据 + * @return 结果 + */ + public int insertStockFinancial(StockFinancial stockFinancial); + + /** + * 修改A股财务数据 + * + * @param stockFinancial A股财务数据 + * @return 结果 + */ + public int updateStockFinancial(StockFinancial stockFinancial); + + /** + * 批量删除A股财务数据 + * + * @param ids 需要删除的A股财务数据主键集合 + * @return 结果 + */ + public int deleteStockFinancialByIds(Long[] ids); + + /** + * 删除A股财务数据信息 + * + * @param id A股财务数据主键 + * @return 结果 + */ + public int deleteStockFinancialById(Long id); + + /** + * 导入行情数据 + * + * @param StockFinancialList 行情数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + public String importStock(List StockFinancialList, Boolean isUpdateSupport, String operName, String sTradeDay); +} diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStockIndexService.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStockIndexService.java index 54ccb12..aaf59c7 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStockIndexService.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStockIndexService.java @@ -2,6 +2,7 @@ package com.ruoyi.stocksystem.service; import java.util.List; import com.ruoyi.stocksystem.domain.StockIndex; +import com.ruoyi.stocksystem.domain.Stocks; /** * 指数交易行情Service接口 @@ -27,6 +28,33 @@ public interface IStockIndexService */ public List selectStockIndexList(StockIndex stockIndex); + /** + * 查询指数成交量交易行情列表 + * + * @param stockIndex 指数交易行情 + * @return 指数交易行情集合 + */ + public List selectStockIndexTradeVolumeList(StockIndex stockIndex); + + /** + * 查询指数涨跌停板、历史新高新低交易行情列表 + * + * @param stockIndex 指数交易行情 + * @return 指数交易行情集合 + */ + public List selectStockIndexRecordsList(StockIndex stockIndex); + + + /** + * 导入行情数据 + * + * @param stockIndexList 行情数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + public String importStockIndexs(List stockIndexList, Boolean isUpdateSupport, String operName, String sTradeDay); + /** * 新增指数交易行情 * diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStocksNewRecordService.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStocksNewRecordService.java index 2989eec..376d7e9 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStocksNewRecordService.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStocksNewRecordService.java @@ -67,6 +67,14 @@ public interface IStocksNewRecordService */ public List selectGroupStocksNewRecord(StocksNewRecord stocksNewRecord); + /** + * 查询每日新高新低列表(所有) + * + * @param stocksNewRecord 每日涨跌停板 + * @return 每日涨跌停板集合 + */ + public List selectGroupStocksNewRecordAll(StocksNewRecord stocksNewRecord); + /** * 导入行情数据 * diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStocksService.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStocksService.java index d403348..be16c27 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStocksService.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/IStocksService.java @@ -38,6 +38,22 @@ public interface IStocksService */ public List selectStocksListB(Stocks stocks); + /** + * 查询行情数据列表涨跌停板 + * + * @param stocks 行情数据 + * @return 行情数据集合 + */ + public List selectStrongStocksList(Stocks stocks); + + /** + * 查询行情数据列表涨跌停板 + * + * @param stocks 行情数据 + * @return 行情数据集合 + */ + public List selectLimitStocksList(Stocks stocks); + /** * 查询行情数据列表含基础数据 * @@ -46,6 +62,14 @@ public interface IStocksService */ public List selectStocksListSort(Stocks stocks); + /** + * 查询行情数据列表含基础数据 + * + * @param stocks 行情数据 + * @return 行情数据集合 + */ + public List selectStocksListSortA(Stocks stocks); + /** * 查询交易日期的板块内个股数量(东财2级) * @@ -62,6 +86,14 @@ public interface IStocksService */ public int insertStocks(Stocks stocks); + /** + * 新增行情数据,辅助计算涨跌幅 + * + * @param stocks 行情数据 + * @return 结果 + */ + public int insertStocksTmp(Stocks stocks); + /** * 修改行情数据 * @@ -161,6 +193,14 @@ public interface IStocksService */ public List selectStockHistory(Stocks stocks); + /** + * 查询个股历史数据 + * + * @param stocks 每日涨跌停板 + * @return 每日涨跌停板 + */ + public List selectStockIndexHistory(Stocks stocks); + /** * 查询个股阶段最高价 * @@ -168,4 +208,20 @@ public interface IStocksService * @return 个股列表 */ public List selectStocksForHigh(Stocks stocks); + + /** + * 查询个股阶段最高价 + * + * @param stocks 查询个股阶段最高价 + * @return 个股列表 + */ + public List selectStocksDataForQuery(Stocks stocks); + + /** + * 查询个股阶段最高价 + * + * @param stocks 查询板块阶段最高价 + * @return 个股列表 + */ + public List selectStockIndexsDataForQuery(Stocks stocks); } diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StockFinancialServiceImpl.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StockFinancialServiceImpl.java new file mode 100644 index 0000000..c3e7b57 --- /dev/null +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StockFinancialServiceImpl.java @@ -0,0 +1,208 @@ +package com.ruoyi.stocksystem.service.impl; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.bean.BeanValidators; +import com.ruoyi.stocksystem.domain.StocksLimit; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.stocksystem.mapper.StockFinancialMapper; +import com.ruoyi.stocksystem.domain.StockFinancial; +import com.ruoyi.stocksystem.service.IStockFinancialService; + +import javax.validation.Validator; + +/** + * A股财务数据Service业务层处理 + * + * @author lxy + * @date 2022-05-05 + */ +@Service +public class StockFinancialServiceImpl implements IStockFinancialService +{ + @Autowired + private StockFinancialMapper stockFinancialMapper; + + @Autowired + protected Validator validator; + + /** + * 查询A股财务数据 + * + * @param id A股财务数据主键 + * @return A股财务数据 + */ + @Override + public StockFinancial selectStockFinancialById(Long id) + { + return stockFinancialMapper.selectStockFinancialById(id); + } + + /** + * 查询A股财务数据 + * + * @param stockFinancial A股财务数据 根据period 和 code查询 + * @return A股财务数据 + */ + @Override + public List selectStockFinancialByPeriod(StockFinancial stockFinancial) + { + return stockFinancialMapper.selectStockFinancialByPeriod(stockFinancial); + } + + /** + * 查询A股财务数据列表 + * + * @param stockFinancial A股财务数据 + * @return A股财务数据 + */ + @Override + public List selectStockFinancialList(StockFinancial stockFinancial) + { + return stockFinancialMapper.selectStockFinancialList(stockFinancial); + } + + /** + * 新增A股财务数据 + * + * @param stockFinancial A股财务数据 + * @return 结果 + */ + @Override + public int insertStockFinancial(StockFinancial stockFinancial) + { + return stockFinancialMapper.insertStockFinancial(stockFinancial); + } + + /** + * 修改A股财务数据 + * + * @param stockFinancial A股财务数据 + * @return 结果 + */ + @Override + public int updateStockFinancial(StockFinancial stockFinancial) + { + return stockFinancialMapper.updateStockFinancial(stockFinancial); + } + + /** + * 批量删除A股财务数据 + * + * @param ids 需要删除的A股财务数据主键 + * @return 结果 + */ + @Override + public int deleteStockFinancialByIds(Long[] ids) + { + return stockFinancialMapper.deleteStockFinancialByIds(ids); + } + + /** + * 删除A股财务数据信息 + * + * @param id A股财务数据主键 + * @return 结果 + */ + @Override + public int deleteStockFinancialById(Long id) + { + return stockFinancialMapper.deleteStockFinancialById(id); + } + + /** + * 导入行情数据 + * + * @param StockFinancial 涨跌停数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + @Override + public String importStock(List StockFinancialList, Boolean isUpdateSupport, String operName, String sTradeDay) + { + if(sTradeDay.isEmpty()) + { + throw new ServiceException("导入行情数据时,交易日期不能为空!"); + } + if (StringUtils.isNull(StockFinancialList) || StockFinancialList.size() == 0) + { + throw new ServiceException("导入行情数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");//注意月份是MM + Date tradeDay = null; + try + { + tradeDay = simpleDateFormat.parse(sTradeDay); + }catch (ParseException e) { + e.printStackTrace(); + } + if(tradeDay == null) + { + throw new ServiceException("交易日期格式异常!"); + } + + for (StockFinancial stockFinancial : StockFinancialList) + { + try + { + if (!StringUtils.isNull(stockFinancial)) + { + if(StringUtils.isNull(stockFinancial.getCode())) + continue; + //不存在,进行导入 + BeanValidators.validateWithException(validator, stockFinancial); + stockFinancial.setPeriod(tradeDay); + this.insertStockFinancial(stockFinancial); + successNum++; + System.out.println("
" + successNum + "、股票代码 " + stockFinancial.getCode() + " 导入成功"); + successMsg.append("
" + successNum + "、股票代码 " + stockFinancial.getCode() + " 导入成功"); + } + else if (isUpdateSupport) + { +// //存在,进行更新 +// BeanValidators.validateWithException(validator, user); +// user.setUpdateBy(operName); +// this.updateUser(user); +// successNum++; +// successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 更新成功"); + failureNum++; + failureMsg.append("
" + failureNum + "、股票代码 " + stockFinancial.getCode() + " 已存在"); + } + else + { + //已存在,不进行操作 + failureNum++; + failureMsg.append("
" + failureNum + "、股票代码 " + stockFinancial.getCode() + " 已存在"); + } + } + catch (Exception e) + { + failureNum++; + String msg = "
" + failureNum + "、股票代码 " + stockFinancial.getCode() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); +// log.error(msg, e); + } + } + if (failureNum > 0) + { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } + else + { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } +} diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StockIndexServiceImpl.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StockIndexServiceImpl.java index c397ce4..7ec9ec3 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StockIndexServiceImpl.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StockIndexServiceImpl.java @@ -1,12 +1,23 @@ package com.ruoyi.stocksystem.service.impl; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.List; + +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.bean.BeanValidators; +import com.ruoyi.stocksystem.domain.Stocks; +import com.ruoyi.stocksystem.domain.StocksLimit; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.stocksystem.mapper.StockIndexMapper; import com.ruoyi.stocksystem.domain.StockIndex; import com.ruoyi.stocksystem.service.IStockIndexService; +import javax.validation.Validator; + /** * 指数交易行情Service业务层处理 * @@ -19,6 +30,9 @@ public class StockIndexServiceImpl implements IStockIndexService @Autowired private StockIndexMapper stockIndexMapper; + @Autowired + protected Validator validator; + /** * 查询指数交易行情 * @@ -43,6 +57,30 @@ public class StockIndexServiceImpl implements IStockIndexService return stockIndexMapper.selectStockIndexList(stockIndex); } + /** + * 查询指数成交量交易行情列表 + * + * @param stockIndex 指数交易行情 + * @return 指数交易行情 + */ + @Override + public List selectStockIndexTradeVolumeList(StockIndex stockIndex) + { + return stockIndexMapper.selectStockIndexTradeVolumeList(stockIndex); + } + + /** + * 查询指数涨跌停板、历史新高新低交易行情列表 + * + * @param stockIndex 指数交易行情 + * @return 指数交易行情 + */ + @Override + public List selectStockIndexRecordsList(StockIndex stockIndex) + { + return stockIndexMapper.selectStockIndexRecordsList(stockIndex); + } + /** * 新增指数交易行情 * @@ -90,4 +128,97 @@ public class StockIndexServiceImpl implements IStockIndexService { return stockIndexMapper.deleteStockIndexById(id); } + + /** + * 导入指数行情数据 + * + * @param stockIndexList 行情数据列表 + * @param isUpdateSupport 是否更新支持,如果已存在,则进行更新数据 + * @param operName 操作用户 + * @return 结果 + */ + @Override + public String importStockIndexs(List stockIndexList, Boolean isUpdateSupport, String operName, String sTradeDay) + { + if(sTradeDay.isEmpty()) + { + throw new ServiceException("导入行情数据时,交易日期不能为空!"); + } + if (StringUtils.isNull(stockIndexList) || stockIndexList.size() == 0) + { + throw new ServiceException("导入行情数据不能为空!"); + } + int successNum = 0; + int failureNum = 0; + StringBuilder successMsg = new StringBuilder(); + StringBuilder failureMsg = new StringBuilder(); + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");//注意月份是MM + Date tradeDay = null; + try + { + tradeDay = simpleDateFormat.parse(sTradeDay); + }catch (ParseException e) { + e.printStackTrace(); + } + if(tradeDay == null) + { + throw new ServiceException("交易日期格式异常!"); + } + + for (StockIndex stockIndex : stockIndexList) + { + try + { + if (!StringUtils.isNull(stockIndex)) + { + if(StringUtils.isNull(stockIndex.getCode())) + continue; + if(StringUtils.isNull(stockIndex.getName()) || StringUtils.isNull(stockIndex.getOpen()) || StringUtils.isNull(stockIndex.getClose())) + continue; + //不存在,进行导入 + BeanValidators.validateWithException(validator, stockIndex); + stockIndex.setTradeDay(tradeDay); + this.insertStockIndex(stockIndex); + successNum++; + System.out.println("
" + successNum + "、指数代码 " + stockIndex.getCode() + " 导入成功"); + successMsg.append("
" + successNum + "、指数代码 " + stockIndex.getCode() + " 导入成功"); + } + else if (isUpdateSupport) + { +// //存在,进行更新 +// BeanValidators.validateWithException(validator, user); +// user.setUpdateBy(operName); +// this.updateUser(user); +// successNum++; +// successMsg.append("
" + successNum + "、账号 " + user.getUserName() + " 更新成功"); + failureNum++; + failureMsg.append("
" + failureNum + "、指数代码 " + stockIndex.getCode() + " 已存在"); + } + else + { + //已存在,不进行操作 + failureNum++; + failureMsg.append("
" + failureNum + "、指数代码 " + stockIndex.getCode() + " 已存在"); + } + } + catch (Exception e) + { + failureNum++; + String msg = "
" + failureNum + "、指数代码 " + stockIndex.getCode() + " stockIndex: " + stockIndex.toString() + " 导入失败:"; + failureMsg.append(msg + e.getMessage()); +// log.error(msg, e); + } + } + if (failureNum > 0) + { + failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:"); + throw new ServiceException(failureMsg.toString()); + } + else + { + successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:"); + } + return successMsg.toString(); + } + } diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StocksNewRecordServiceImpl.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StocksNewRecordServiceImpl.java index b0af28d..2810fb3 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StocksNewRecordServiceImpl.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StocksNewRecordServiceImpl.java @@ -116,6 +116,18 @@ public class StocksNewRecordServiceImpl implements IStocksNewRecordService return stocksNewRecordMapper.selectGroupStocksNewRecord(stocksNewRecord); } + /** + * 查询每日创新高创新低列表 + * + * @param stocksNewRecord 每日创新高创新低 + * @return 每日涨跌停板 + */ + @Override + public List selectGroupStocksNewRecordAll(StocksNewRecord stocksNewRecord) + { + return stocksNewRecordMapper.selectGroupStocksNewRecordAll(stocksNewRecord); + } + /** * 导入行情数据 diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StocksServiceImpl.java b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StocksServiceImpl.java index 546c350..8fbd1a5 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StocksServiceImpl.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/domain/service/impl/StocksServiceImpl.java @@ -87,6 +87,29 @@ public class StocksServiceImpl implements IStocksService return stocksMapper.selectStocksListB(stocks); } + /** + * 查询行情数据列表涨跌停板 + * + * @param stocks 行情数据 + * @return 行情数据集合 + */ + @Override + public List selectStrongStocksList(Stocks stocks) + { + return stocksMapper.selectStrongStocksList(stocks); + } + + /** + * 查询行情数据列表涨跌停板 + * + * @param stocks 行情数据 + * @return 行情数据集合 + */ + public List selectLimitStocksList(Stocks stocks) + { + return stocksMapper.selectLimitStocksList(stocks); + } + /** * 查询行情数据列表 * @@ -99,6 +122,18 @@ public class StocksServiceImpl implements IStocksService return stocksMapper.selectStocksListSort(stocks); } + /** + * 查询行情数据列表 + * + * @param stocks 行情数据 + * @return 行情数据 + */ + @Override + public List selectStocksListSortA(Stocks stocks) + { + return stocksMapper.selectStocksListSortA(stocks); + } + /** * 查询行情数据列表 * @@ -127,6 +162,22 @@ public class StocksServiceImpl implements IStocksService return rows; } + /** + * 新增行情数据,辅助计算涨跌幅 + * + * @param stocks 行情数据 + * @return 结果 + */ + @Transactional + @Override + public int insertStocksTmp(Stocks stocks) + { + int rows = stocksMapper.insertStocksTmp(stocks); + //todo 需要更新基础数据 +// insertStockBasic(stocks); + return rows; + } + /** * 修改行情数据 * @@ -483,6 +534,18 @@ public class StocksServiceImpl implements IStocksService return stocksMapper.selectStockHistory(stocks); } + /** + * 查询个股历史数据 + * + * @param stocks 每日涨跌停板 + * @return 每日涨跌停板 + */ + @Override + public List selectStockIndexHistory(Stocks stocks) + { + return stocksMapper.selectStockIndexHistory(stocks); + } + /** * 查询个股阶段最高价 * @@ -494,4 +557,28 @@ public class StocksServiceImpl implements IStocksService { return stocksMapper.selectStocksForHigh(stocks); } + + /** + * 查询个股阶段最高价 + * + * @param stocks 查询个股阶段最高价 + * @return 个股列表 + */ + @Override + public List selectStocksDataForQuery(Stocks stocks) + { + return stocksMapper.selectStocksDataForQuery(stocks); + } + + /** + * 查询个股阶段最高价 + * + * @param stocks 查询个股阶段最高价 + * @return 个股列表 + */ + @Override + public List selectStockIndexsDataForQuery(Stocks stocks) + { + return stocksMapper.selectStockIndexsDataForQuery(stocks); + } } diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StockFinancialMapper.java b/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StockFinancialMapper.java new file mode 100644 index 0000000..b1d4dff --- /dev/null +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StockFinancialMapper.java @@ -0,0 +1,70 @@ +package com.ruoyi.stocksystem.mapper; + +import java.util.List; +import com.ruoyi.stocksystem.domain.StockFinancial; + +/** + * A股财务数据Mapper接口 + * + * @author lxy + * @date 2022-05-05 + */ +public interface StockFinancialMapper +{ + /** + * 查询A股财务数据 + * + * @param id A股财务数据主键 + * @return A股财务数据 + */ + public StockFinancial selectStockFinancialById(Long id); + + /** + * 查询A股财务数据 + * + * @param stockFinancial A股财务数据 根据period 和 code查询 + * @return A股财务数据 + */ + public List selectStockFinancialByPeriod(StockFinancial stockFinancial); + + + /** + * 查询A股财务数据列表 + * + * @param stockFinancial A股财务数据 + * @return A股财务数据集合 + */ + public List selectStockFinancialList(StockFinancial stockFinancial); + + /** + * 新增A股财务数据 + * + * @param stockFinancial A股财务数据 + * @return 结果 + */ + public int insertStockFinancial(StockFinancial stockFinancial); + + /** + * 修改A股财务数据 + * + * @param stockFinancial A股财务数据 + * @return 结果 + */ + public int updateStockFinancial(StockFinancial stockFinancial); + + /** + * 删除A股财务数据 + * + * @param id A股财务数据主键 + * @return 结果 + */ + public int deleteStockFinancialById(Long id); + + /** + * 批量删除A股财务数据 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteStockFinancialByIds(Long[] ids); +} diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StockIndexMapper.java b/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StockIndexMapper.java index 1eac586..372204e 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StockIndexMapper.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StockIndexMapper.java @@ -27,6 +27,22 @@ public interface StockIndexMapper */ public List selectStockIndexList(StockIndex stockIndex); + /** + * 查询指数成交量交易行情列表 + * + * @param stockIndex 指数交易行情 + * @return 指数交易行情集合 + */ + public List selectStockIndexTradeVolumeList(StockIndex stockIndex); + + /** + * 查询指数涨跌停板、历史新高新低交易行情列表 + * + * @param stockIndex 指数交易行情 + * @return 指数交易行情集合 + */ + public List selectStockIndexRecordsList(StockIndex stockIndex); + /** * 新增指数交易行情 * diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StocksMapper.java b/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StocksMapper.java index 9efba89..b9305f1 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StocksMapper.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StocksMapper.java @@ -45,6 +45,22 @@ public interface StocksMapper */ public List selectStocksListB(Stocks stocks); + /** + * 查询行情数据列表涨跌停板 + * + * @param stocks 行情数据 + * @return 行情数据集合 + */ + public List selectStrongStocksList(Stocks stocks); + + /** + * 查询行情数据列表涨跌停板 + * + * @param stocks 行情数据 + * @return 行情数据集合 + */ + public List selectLimitStocksList(Stocks stocks); + /** * 查询行情数据列表 * @@ -53,6 +69,15 @@ public interface StocksMapper */ public List selectStocksListSort(Stocks stocks); + /** + * 查询行情数据列表 + * + * @param stocks 行情数据 + * @return 行情数据集合 + */ + public List selectStocksListSortA(Stocks stocks); + + /** * 查询交易日期的板块内个股数量(东财2级) * @@ -69,6 +94,14 @@ public interface StocksMapper */ public int insertStocks(Stocks stocks); + /** + * 新增行情数据,辅助计算涨跌幅 + * + * @param stocks 行情数据 + * @return 结果 + */ + public int insertStocksTmp(Stocks stocks); + /** * 修改行情数据 * @@ -182,6 +215,14 @@ public interface StocksMapper */ public List selectStockHistory(Stocks stocks); + /** + * 查询个股历史数据 + * + * @param stocks 每日涨跌停板 + * @return 每日涨跌停板 + */ + public List selectStockIndexHistory(Stocks stocks); + /** * 查询个股阶段最高价 * @@ -190,4 +231,19 @@ public interface StocksMapper */ public List selectStocksForHigh(Stocks stocks); + /** + * 查询个股阶段最高价 + * + * @param stocks 查询个股阶段最高价 + * @return 个股列表 + */ + public List selectStocksDataForQuery(Stocks stocks); + + /** + * 查询个股阶段最高价 + * + * @param stocks 查询个股阶段最高价 + * @return 个股列表 + */ + public List selectStockIndexsDataForQuery(Stocks stocks); } diff --git a/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StocksNewRecordMapper.java b/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StocksNewRecordMapper.java index c97f40b..685a990 100644 --- a/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StocksNewRecordMapper.java +++ b/stock-system/src/main/java/com/ruoyi/stocksystem/mapper/StocksNewRecordMapper.java @@ -66,4 +66,12 @@ public interface StocksNewRecordMapper * @return 每日涨跌停板集合 */ public List selectGroupStocksNewRecord(StocksNewRecord stocksNewRecord); + + /** + * 查询每日涨跌停板列表 + * + * @param stocksNewRecord 每日涨跌停板 + * @return 每日涨跌停板集合 + */ + public List selectGroupStocksNewRecordAll(StocksNewRecord stocksNewRecord); } diff --git a/stock-system/src/main/resources/mapper/stocksystem/StockFinancialMapper.xml b/stock-system/src/main/resources/mapper/stocksystem/StockFinancialMapper.xml new file mode 100644 index 0000000..2c12bb9 --- /dev/null +++ b/stock-system/src/main/resources/mapper/stocksystem/StockFinancialMapper.xml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + select id, code, period, jlrtbzzl, jlrhbzzl, jzcsylroe, epsbasic, jlr, jbmgsy, mgjzc from stock_financial + + + + + + + + insert into stock_financial + + code, + period, + jlrtbzzl, + jlrhbzzl, + jzcsylroe, + epsbasic, + jlr, + jbmgsy, + mgjzc, + + + #{code}, + #{period}, + #{jlrtbzzl}, + #{jlrhbzzl}, + #{jzcsylroe}, + #{epsbasic}, + #{jlr}, + #{jbmgsy}, + #{mgjzc}, + + + + + update stock_financial + + code = #{code}, + period = #{period}, + jlrtbzzl = #{jlrtbzzl}, + jlrhbzzl = #{jlrhbzzl}, + jzcsylroe = #{jzcsylroe}, + epsbasic = #{epsbasic}, + jlr = #{jlr}, + jbmgsy = #{jbmgsy}, + mgjzc = #{mgjzc}, + + where id = #{id} + + + + delete from stock_financial where id = #{id} + + + + delete from stock_financial where id in + + #{id} + + + + + \ No newline at end of file diff --git a/stock-system/src/main/resources/mapper/stocksystem/StockIndexMapper.xml b/stock-system/src/main/resources/mapper/stocksystem/StockIndexMapper.xml index 6155749..4eea0c2 100644 --- a/stock-system/src/main/resources/mapper/stocksystem/StockIndexMapper.xml +++ b/stock-system/src/main/resources/mapper/stocksystem/StockIndexMapper.xml @@ -29,6 +29,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + @@ -163,4 +166,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + + + \ No newline at end of file diff --git a/stock-system/src/main/resources/mapper/stocksystem/StocksInTrendMapper.xml b/stock-system/src/main/resources/mapper/stocksystem/StocksInTrendMapper.xml index 32b3181..7ff7e11 100644 --- a/stock-system/src/main/resources/mapper/stocksystem/StocksInTrendMapper.xml +++ b/stock-system/src/main/resources/mapper/stocksystem/StocksInTrendMapper.xml @@ -19,6 +19,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + + + @@ -52,9 +56,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + + - + select trade_day , code,islimit, isdrop from stocks where trade_day BETWEEN #{stradeDay} and #{tradeDay} and islimit = #{islimit} and isdrop = #{isdrop} and trade_days > 30 ORDER BY code ,trade_day DESC; + + + + + + + + + + + + + + + + + + + + insert into stocks_tmp + + code, + trade_day, + differrange3, + differrange5, + differrange15, + differrange30, + + + #{code}, + #{tradeDay}, + #{differrange3}, + #{differrange5}, + #{differrange15}, + #{differrange30}, + + + + + + \ No newline at end of file diff --git a/stock-system/src/main/resources/mapper/stocksystem/StocksNewRecordMapper.xml b/stock-system/src/main/resources/mapper/stocksystem/StocksNewRecordMapper.xml index bd1c369..195089c 100644 --- a/stock-system/src/main/resources/mapper/stocksystem/StocksNewRecordMapper.xml +++ b/stock-system/src/main/resources/mapper/stocksystem/StocksNewRecordMapper.xml @@ -75,4 +75,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select sb.blemind2 as blemind2 ,COUNT(blemind2) as blemindsCount from stocks_new_record sl,stock_basis sb where sl.`code` = sb.`code` and sl.trade_day = #{tradeDay} and sl.isHigh=#{isHigh} and sl.isLow=#{isLow} GROUP BY blemind2 ORDER BY blemindsCount DESC limit 10; + + \ No newline at end of file