Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
S
stockPriceTack
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
刘长帅
stockPriceTack
Commits
65ae7326
Commit
65ae7326
authored
May 30, 2022
by
liucx
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完善
parent
a5f02bc0
Show whitespace changes
Inline
Side-by-side
Showing
28 changed files
with
7 additions
and
6441 deletions
+7
-6441
TimedTaskController.java
...java/com/zfxftech/telmarket/task/TimedTaskController.java
+0
-377
AssetChangeRemindTask.java
...h/telmarket/task/followAccount/AssetChangeRemindTask.java
+0
-855
AssetPersonalPositionTask.java
...lmarket/task/followAccount/AssetPersonalPositionTask.java
+0
-166
AssetProductCheckFullStopTask.java
...ket/task/followAccount/AssetProductCheckFullStopTask.java
+0
-202
ChangeRemindProfitLossRationTask.java
.../task/followAccount/ChangeRemindProfitLossRationTask.java
+0
-833
ChangeRemindTask.java
...xftech/telmarket/task/followAccount/ChangeRemindTask.java
+0
-980
FollowAccountAutoSellStockTask.java
...et/task/followAccount/FollowAccountAutoSellStockTask.java
+0
-43
FollowAccountBuyInTwoStockRiskTask.java
...ask/followAccount/FollowAccountBuyInTwoStockRiskTask.java
+0
-79
FollowAccountFreeCountTask.java
...market/task/followAccount/FollowAccountFreeCountTask.java
+0
-49
FollowAccountStatisticsTask.java
...arket/task/followAccount/FollowAccountStatisticsTask.java
+0
-138
FollowAccountUserStatusTask.java
...arket/task/followAccount/FollowAccountUserStatusTask.java
+0
-44
PersonalAccountPositionTask.java
...arket/task/followAccount/PersonalAccountPositionTask.java
+0
-130
PersonalPositionTask.java
...ch/telmarket/task/followAccount/PersonalPositionTask.java
+0
-211
PersonalReportTask.java
...tech/telmarket/task/followAccount/PersonalReportTask.java
+0
-47
ProductCheckFullStopTask.java
...elmarket/task/followAccount/ProductCheckFullStopTask.java
+0
-207
SmarkPersonalPositionTask.java
...lmarket/task/followAccount/SmarkPersonalPositionTask.java
+0
-114
SmartChangeRemindTask.java
...h/telmarket/task/followAccount/SmartChangeRemindTask.java
+0
-862
SmartProductCheckFullStopTask.java
...ket/task/followAccount/SmartProductCheckFullStopTask.java
+0
-201
StockMatchTask.java
...zfxftech/telmarket/task/followAccount/StockMatchTask.java
+0
-209
StockPoolDetailsTask.java
...ch/telmarket/task/followAccount/StockPoolDetailsTask.java
+0
-210
StockPriceRealTimeTask.java
.../telmarket/task/followAccount/StockPriceRealTimeTask.java
+0
-129
PersonReportTask.java
.../com/zfxftech/telmarket/task/report/PersonReportTask.java
+0
-53
StockPositionTask.java
...tech/telmarket/task/stock/position/StockPositionTask.java
+0
-77
WechatOperTask.java
...va/com/zfxftech/telmarket/task/wechat/WechatOperTask.java
+0
-218
bootstrap-dev.yml
src/main/resources/bootstrap-dev.yml
+2
-2
bootstrap-pro.yml
src/main/resources/bootstrap-pro.yml
+2
-2
bootstrap-test.yml
src/main/resources/bootstrap-test.yml
+2
-2
logback-spring.xml
src/main/resources/logback-spring.xml
+1
-1
No files found.
src/main/java/com/zfxftech/telmarket/task/TimedTaskController.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
;
import
com.alibaba.fastjson.JSONObject
;
import
com.zfxftech.telmarket.common.annotation.tokenAnnotation.JwtPassAnnotation
;
import
com.zfxftech.telmarket.common.bean.CommonResult
;
import
com.zfxftech.telmarket.common.pojo.dao.ScheduledTaskExecRecord
;
import
com.zfxftech.telmarket.common.pojo.dao.StockBody
;
import
com.zfxftech.telmarket.common.pojo.dao.StocksCode
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.common.util.HttpUtils
;
import
com.zfxftech.telmarket.service.business.*
;
import
com.zfxftech.telmarket.service.business.asset.AssetAccountProductRelationService
;
import
com.zfxftech.telmarket.service.business.asset.AssetFrozenRecordService
;
import
com.zfxftech.telmarket.service.business.asset.AssetMarketProfitLogService
;
import
com.zfxftech.telmarket.service.business.personal.SendFromPositionLogService
;
import
com.zfxftech.telmarket.service.business.smart.SmartAccountProductRelationService
;
import
com.zfxftech.telmarket.service.business.smart.SmartFrozenRecordService
;
import
com.zfxftech.telmarket.service.business.smart.SmartMarketProfitLogService
;
import
com.zfxftech.telmarket.service.redis.RedisService
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.io.IOException
;
import
java.util.Date
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
ResponseConstant
.
SUCCESS_CODE
;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/30 13:16
*/
@Api
(
value
=
"定时任务相关接口"
,
tags
=
{
"定时任务相关接口"
})
@RestController
@RequestMapping
(
"/admin/timedTask/"
)
public
class
TimedTaskController
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
TimedTaskController
.
class
);
@Autowired
private
WorkDayService
workDayService
;
@Autowired
private
MarketProfitLogService
marketProfitLogService
;
@Autowired
private
SmartMarketProfitLogService
smartMarketProfitLogService
;
@Autowired
private
AssetMarketProfitLogService
assetMarketProfitLogService
;
@Autowired
private
StockCodeService
stockCodeService
;
@Autowired
private
FrozenRecordService
frozenRecordService
;
@Autowired
private
AssetFrozenRecordService
assetFrozenRecordService
;
@Autowired
private
SmartFrozenRecordService
smartFrozenRecordService
;
@Autowired
private
AccountProductRelationService
accountProductRelationService
;
@Autowired
private
AssetAccountProductRelationService
assetAccountProductRelationService
;
@Autowired
private
SmartAccountProductRelationService
smartAccountProductRelationService
;
@Autowired
private
QuoteService
quoteService
;
@Autowired
private
StockPositionService
stockPositionService
;
@Autowired
private
ScheduledTaskExecRecordService
scheduledTaskExecRecordService
;
@Autowired
private
SendFromPositionLogService
sendFromPositionLogService
;
@Autowired
@Qualifier
(
"redisServiceNoWrapper"
)
private
RedisService
redisService
;
@Value
(
"${synStockFromBj.query.url}"
)
private
String
STOCK_URL
;
@Value
(
"${synQuotaFromBj.query.url}"
)
private
String
Quota_URL
;
@ApiOperation
(
value
=
"保存下个月的工作日"
,
notes
=
"保存下个月的工作日 "
,
httpMethod
=
"GET"
)
@GetMapping
(
"/saveNextMonthWorkDay"
)
public
CommonResult
saveNextMonthWorkDay
()
{
workDayService
.
saveWorkDay
();
return
CommonResult
.
success
(
"更新工作日成功"
);
}
//---
@ApiOperation
(
value
=
"生成所有示范盘当天收益快照"
,
notes
=
"生成所有示范盘当天收益快照"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 2 21 * * ?"
)
public
CommonResult
generateDemonstrationMarketStatisticsData
()
{
ScheduledTaskExecRecord
scheduledTaskExecRecord
=
new
ScheduledTaskExecRecord
();
scheduledTaskExecRecord
.
setExecTime
(
new
Date
());
scheduledTaskExecRecord
.
setTaskKey
(
"生成所有示范盘当天收益快照"
);
try
{
marketProfitLogService
.
generateTodayMarketProfitLog
();
scheduledTaskExecRecord
.
setResult
(
"success"
);
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
}
catch
(
Exception
e
){
scheduledTaskExecRecord
.
setResult
(
"error"
+
JSONObject
.
toJSONString
(
e
));
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
}
return
CommonResult
.
success
(
"成功"
);
}
@ApiOperation
(
value
=
"生成智能跟投所有示范盘当天收益快照"
,
notes
=
"生成智能跟投所有示范盘当天收益快照"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 5 21 * * ?"
)
public
CommonResult
smartGenerateDemonstrationMarketStatisticsData
()
{
ScheduledTaskExecRecord
scheduledTaskExecRecord
=
new
ScheduledTaskExecRecord
();
scheduledTaskExecRecord
.
setExecTime
(
new
Date
());
scheduledTaskExecRecord
.
setTaskKey
(
"生成所有示范盘当天收益快照"
);
try
{
smartMarketProfitLogService
.
generateTodayMarketProfitLog
();
scheduledTaskExecRecord
.
setResult
(
"success"
);
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
}
catch
(
Exception
e
)
{
scheduledTaskExecRecord
.
setResult
(
"error"
+
JSONObject
.
toJSONString
(
e
));
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
}
return
CommonResult
.
success
(
"成功"
);
}
@ApiOperation
(
value
=
"Asset生成所有示范盘当天收益快照"
,
notes
=
"Asset生成所有示范盘当天收益快照"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 5 21 * * ?"
)
public
CommonResult
assetgenerateDemonstrationMarketStatisticsData
()
{
ScheduledTaskExecRecord
scheduledTaskExecRecord
=
new
ScheduledTaskExecRecord
();
scheduledTaskExecRecord
.
setExecTime
(
new
Date
());
scheduledTaskExecRecord
.
setTaskKey
(
"生成所有示范盘当天收益快照"
);
try
{
assetMarketProfitLogService
.
generateTodayMarketProfitLog
();
scheduledTaskExecRecord
.
setResult
(
"success"
);
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
}
catch
(
Exception
e
)
{
scheduledTaskExecRecord
.
setResult
(
"error"
+
JSONObject
.
toJSONString
(
e
));
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
}
return
CommonResult
.
success
(
"成功"
);
}
//--
@ApiOperation
(
value
=
"清除今日冻结股票"
,
notes
=
"清除今日冻结股票"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 5 17 * * ?"
)
public
CommonResult
clearFrozenRecords
()
{
ScheduledTaskExecRecord
scheduledTaskExecRecord
=
new
ScheduledTaskExecRecord
();
scheduledTaskExecRecord
.
setExecTime
(
new
Date
());
scheduledTaskExecRecord
.
setTaskKey
(
"清除今日冻结股票"
);
try
{
frozenRecordService
.
clearFrozenRecords
();
scheduledTaskExecRecord
.
setResult
(
"success"
);
}
catch
(
Exception
e
){
scheduledTaskExecRecord
.
setResult
(
JSONObject
.
toJSONString
(
e
));
}
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
return
CommonResult
.
success
(
"成功"
);
}
@ApiOperation
(
value
=
"清除今日智能跟投冻结股票"
,
notes
=
"清除今日智能跟投冻结股票"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 5 17 * * ?"
)
public
CommonResult
smartClearFrozenRecords
()
{
ScheduledTaskExecRecord
scheduledTaskExecRecord
=
new
ScheduledTaskExecRecord
();
scheduledTaskExecRecord
.
setExecTime
(
new
Date
());
scheduledTaskExecRecord
.
setTaskKey
(
"清除今日冻结股票"
);
try
{
smartFrozenRecordService
.
clearFrozenRecords
();
scheduledTaskExecRecord
.
setResult
(
"success"
);
}
catch
(
Exception
e
){
scheduledTaskExecRecord
.
setResult
(
JSONObject
.
toJSONString
(
e
));
}
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
return
CommonResult
.
success
(
"成功"
);
}
@ApiOperation
(
value
=
"asset清除今日冻结股票"
,
notes
=
"asset清除今日冻结股票"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 5 17 * * ?"
)
public
CommonResult
assetClearFrozenRecords
()
{
ScheduledTaskExecRecord
scheduledTaskExecRecord
=
new
ScheduledTaskExecRecord
();
scheduledTaskExecRecord
.
setExecTime
(
new
Date
());
scheduledTaskExecRecord
.
setTaskKey
(
"清除今日冻结股票"
);
try
{
assetFrozenRecordService
.
clearFrozenRecords
();
scheduledTaskExecRecord
.
setResult
(
"success"
);
}
catch
(
Exception
e
){
scheduledTaskExecRecord
.
setResult
(
JSONObject
.
toJSONString
(
e
));
}
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
return
CommonResult
.
success
(
"成功"
);
}
// @ApiOperation(value = "检查今日是否是工作日", notes = "检查今日是否是工作日", httpMethod = "GET")
// @Scheduled(cron = "0 0 1 * * ?")
// public CommonResult checkToadyIsWorkDay() {
// String today = DateUtil.getToday();
// workDayService.checkDateIsWorkDay(today);
// return CommonResult.success("成功");
// }
//---
@ApiOperation
(
value
=
"检查产品是否到期产品到期"
,
notes
=
"检查产品是否到期产品到期"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 0 1 * * ?"
)
public
CommonResult
checkProductIsExpire
()
{
accountProductRelationService
.
checkProductIsExpire
();
return
CommonResult
.
success
(
"成功"
);
}
@ApiOperation
(
value
=
"smart检查产品是否到期产品到期"
,
notes
=
"检查产品是否到期产品到期"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 0 1 * * ?"
)
public
CommonResult
smartCheckProductIsExpire
()
{
smartAccountProductRelationService
.
checkProductIsExpire
();
return
CommonResult
.
success
(
"成功"
);
}
@ApiOperation
(
value
=
"asset检查产品是否到期产品到期"
,
notes
=
"asset检查产品是否到期产品到期"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 0 1 * * ?"
)
public
CommonResult
assetCheckProductIsExpire
()
{
assetAccountProductRelationService
.
checkProductIsExpire
();
return
CommonResult
.
success
(
"成功"
);
}
@ApiOperation
(
value
=
"从北京同步股票数据"
,
notes
=
"从北京同步股票数据"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 10,12,14,16,21,25,29 9 * * 1-5"
)
public
CommonResult
synStockInfoFromBJ
()
throws
IOException
{
ScheduledTaskExecRecord
scheduledTaskExecRecord
=
new
ScheduledTaskExecRecord
();
scheduledTaskExecRecord
.
setExecTime
(
new
Date
());
scheduledTaskExecRecord
.
setTaskKey
(
"从北京同步股票数据"
);
Map
<
String
,
String
>
params
=
new
HashMap
<>();
try
{
String
result
=
HttpUtils
.
httpGetMethod
(
STOCK_URL
,
params
);
StockBody
body
=
JSONObject
.
parseObject
(
result
,
StockBody
.
class
);
if
(
body
.
getCode
()
==
SUCCESS_CODE
)
{
List
<
StocksCode
>
stocksCodeList
=
body
.
getData
();
if
(
stocksCodeList
!=
null
&&
stocksCodeList
.
size
()
>
0
)
{
stockCodeService
.
synchronizeStockInfoFromBJ
(
stocksCodeList
);
}
else
{
logger
.
info
(
"从北京同步股票 没有数据!!!"
+
DateUtil
.
getNow
());
}
scheduledTaskExecRecord
.
setResult
(
"success"
);
}
else
{
scheduledTaskExecRecord
.
setResult
(
"error"
+
JSONObject
.
toJSONString
(
body
));
}
}
catch
(
Exception
e
){
scheduledTaskExecRecord
.
setResult
(
JSONObject
.
toJSONString
(
e
));
}
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
return
CommonResult
.
success
(
"成功"
);
}
@ApiOperation
(
value
=
"从北京同步股票行情"
,
notes
=
"从北京同步股票行情"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0/1 * 9-15 * * 1-5"
)
public
void
synQuotesFromBJ
(){
quoteService
.
synQuotesFromBJ
();
}
@ApiOperation
(
value
=
"收盘 清除今日冻结股票 5秒扫一次 ,老数据同步,完成之后干掉"
,
notes
=
"清除今日冻结股票"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"5 * 6-23 * * ?"
)
public
CommonResult
clearFrozenRecordsForSynData
()
{
//不是交易日才走
if
(!
DateUtil
.
isTradeDay
()){
try
{
frozenRecordService
.
clearFrozenRecordsForSynData
();
}
catch
(
Exception
e
){
}
}
return
CommonResult
.
success
(
"成功"
);
}
@ApiOperation
(
value
=
"发送报表提醒"
,
notes
=
"发送报表提醒"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 05 16 * * ? "
)
@GetMapping
(
"sendReport"
)
@JwtPassAnnotation
public
CommonResult
sendReportForms
()
throws
IOException
{
ScheduledTaskExecRecord
scheduledTaskExecRecord
=
new
ScheduledTaskExecRecord
();
scheduledTaskExecRecord
.
setExecTime
(
new
Date
());
scheduledTaskExecRecord
.
setTaskKey
(
"发送资管报表"
);
try
{
assetAccountProductRelationService
.
sendReportForms
();
scheduledTaskExecRecord
.
setResult
(
"success"
);
}
catch
(
Exception
e
)
{
scheduledTaskExecRecord
.
setResult
(
JSONObject
.
toJSONString
(
e
));
}
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
return
CommonResult
.
success
(
"成功"
);
}
@ApiOperation
(
value
=
"生成报表数据"
,
notes
=
"生成报表数据"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 9 * * * ? "
)
public
CommonResult
createReportForms
()
throws
IOException
{
ScheduledTaskExecRecord
scheduledTaskExecRecord
=
new
ScheduledTaskExecRecord
();
scheduledTaskExecRecord
.
setExecTime
(
new
Date
());
scheduledTaskExecRecord
.
setTaskKey
(
"生成报表数据"
);
try
{
if
(
DateUtil
.
reportFormsisTradeDayAndAfter_HoursTime
())
{
assetAccountProductRelationService
.
createReportForms
();
}
scheduledTaskExecRecord
.
setResult
(
"success"
);
}
catch
(
Exception
e
)
{
scheduledTaskExecRecord
.
setResult
(
JSONObject
.
toJSONString
(
e
));
}
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
return
CommonResult
.
success
(
"成功"
);
}
//私人定制 Personal
@ApiOperation
(
value
=
"发送报表提醒"
,
notes
=
"发送报表提醒"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 05 16 * * ? "
)
@GetMapping
(
"sendPersonalReport"
)
@JwtPassAnnotation
public
CommonResult
sendPersonalReportForms
()
throws
IOException
{
ScheduledTaskExecRecord
scheduledTaskExecRecord
=
new
ScheduledTaskExecRecord
();
scheduledTaskExecRecord
.
setExecTime
(
new
Date
());
scheduledTaskExecRecord
.
setTaskKey
(
"发送资管报表"
);
try
{
sendFromPositionLogService
.
sendReportForms
();
scheduledTaskExecRecord
.
setResult
(
"success"
);
}
catch
(
Exception
e
)
{
scheduledTaskExecRecord
.
setResult
(
JSONObject
.
toJSONString
(
e
));
}
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
return
CommonResult
.
success
(
"成功"
);
}
@ApiOperation
(
value
=
"生成报表数据"
,
notes
=
"生成报表数据"
,
httpMethod
=
"GET"
)
@Scheduled
(
cron
=
"0 9 * * * ? "
)
public
CommonResult
createPersonalReportForms
()
throws
IOException
{
ScheduledTaskExecRecord
scheduledTaskExecRecord
=
new
ScheduledTaskExecRecord
();
scheduledTaskExecRecord
.
setExecTime
(
new
Date
());
scheduledTaskExecRecord
.
setTaskKey
(
"生成报表数据"
);
try
{
if
(
DateUtil
.
isTradeDayAndAfter_HoursTime
())
{
sendFromPositionLogService
.
createReportForms
();
}
scheduledTaskExecRecord
.
setResult
(
"success"
);
}
catch
(
Exception
e
)
{
scheduledTaskExecRecord
.
setResult
(
JSONObject
.
toJSONString
(
e
));
}
scheduledTaskExecRecordService
.
addScheduledTaskExecRecord
(
scheduledTaskExecRecord
);
return
CommonResult
.
success
(
"成功"
);
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/AssetChangeRemindTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.alibaba.druid.util.StringUtils
;
import
com.github.pagehelper.util.StringUtil
;
import
com.zfxf.tools.wechat.helper.api.TemplateKeyWordBuilder
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.constant.AdminConstant
;
import
com.zfxftech.telmarket.common.constant.RedisKeyMessageConstant
;
import
com.zfxftech.telmarket.common.constant.webhook.MonitoringEnum
;
import
com.zfxftech.telmarket.common.enums.remind.InformTypeEnums
;
import
com.zfxftech.telmarket.common.enums.remind.TransactionRemindEnums
;
import
com.zfxftech.telmarket.common.enums.wx.TemplateUserType
;
import
com.zfxftech.telmarket.common.pojo.dao.*
;
import
com.zfxftech.telmarket.common.pojo.dao.asset.AssetProduct
;
import
com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin
;
import
com.zfxftech.telmarket.common.pojo.dao.remind.RemindCommonTask
;
import
com.zfxftech.telmarket.common.pojo.dao.remind.RemindRole
;
import
com.zfxftech.telmarket.common.pojo.dao.remind.WebHookCommonTask
;
import
com.zfxftech.telmarket.common.pojo.dao.webhook.ChatbotSend
;
import
com.zfxftech.telmarket.common.pojo.dto.remind.StockPositionTask
;
import
com.zfxftech.telmarket.common.pojo.vo.StockBatchVo
;
import
com.zfxftech.telmarket.common.pojo.vo.remind.TasckChangeRemindVo
;
import
com.zfxftech.telmarket.common.util.BigDecimalUtil
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.common.util.RedisUtil
;
import
com.zfxftech.telmarket.common.util.SnowflakeIdWorker
;
import
com.zfxftech.telmarket.service.UsAdminService
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.business.UsMemberBaseService
;
import
com.zfxftech.telmarket.service.business.WeChatTemplateMessageService
;
import
com.zfxftech.telmarket.service.business.asset.AssetAccountProductRelationService
;
import
com.zfxftech.telmarket.service.business.asset.AssetFinanceCalculateService
;
import
com.zfxftech.telmarket.service.business.asset.AssetProductService
;
import
com.zfxftech.telmarket.service.business.asset.AssetStockPositionService
;
import
com.zfxftech.telmarket.service.business.webhook.ChatbotSendService
;
import
com.zfxftech.telmarket.service.remind.RemindRoleService
;
import
com.zfxftech.telmarket.service.remind.RemindService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.tuple.Pair
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.ObjectUtils
;
import
javax.annotation.Resource
;
import
java.math.BigDecimal
;
import
java.text.DecimalFormat
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicReference
;
import
java.util.stream.Collectors
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
GREATER
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
LESS
;
/**
* Create time: 2022/1/26
*/
@Slf4j
@Component
@Order
(
value
=
1
)
/**
* 资管
*/
public
class
AssetChangeRemindTask
implements
ApplicationRunner
{
@Resource
RemindService
remindService
;
@Resource
RemindRoleService
remindRoleService
;
@Resource
StockCodeService
stockCodeService
;
@Autowired
private
AssetStockPositionService
assetStockPositionService
;
@Resource
AssetFinanceCalculateService
assetFinanceCalculateService
;
@Resource
RedisUtil
redisUtil
;
@Resource
WeChatTemplateMessageService
weChatTemplateMessageService
;
@Resource
UsAdminService
usAdminService
;
@Resource
AssetProductService
assetProductService
;
@Autowired
private
CommonConfig
commonConfig
;
@Autowired
private
ChatbotSendService
chatbotSendService
;
@Autowired
private
UsMemberBaseService
usMemberBaseService
;
@Autowired
AssetAccountProductRelationService
assetAccountProductRelationService
;
private
static
DecimalFormat
df2
=
new
DecimalFormat
(
"0.00%"
);
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"开始资管正式环境日志输出"
);
// commonConfig.setChangeRemindTaskSwitch("run");
log
.
info
(
"开始启动资管异动提醒配置更新开关状态:"
+
commonConfig
.
getChangeRemindTaskSwitchAsset
());
if
(
commonConfig
.
getChangeRemindTaskSwitchAsset
()
!=
null
&&
commonConfig
.
getChangeRemindTaskSwitchAsset
().
equals
(
"run"
))
{
//分页查询异动配置列表
ExecutorService
PersonalexecutorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorServicePersonal
=
Executors
.
newFixedThreadPool
(
100
);
CompletableFuture
.
runAsync
(()
->
{
while
(
true
)
{
if
(
DateUtil
.
isTradeDayForChangeRemind
())
{
AtomicReference
<
Integer
>
pageNo
=
new
AtomicReference
<>(
1
);
Integer
pageSize
=
100
;
Date
startTime
=
new
Date
();
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
List
<
StockPositionTask
>
positionList
=
assetStockPositionService
.
getStockPositionTask
(
null
);
if
(!
ObjectUtils
.
isEmpty
(
positionList
)
&&
positionList
.
size
()
>
0
)
{
log
.
info
(
"资管提醒数据大小:{}"
,
positionList
.
size
());
Integer
pageTOtl
=
positionList
.
size
()
%
pageSize
==
0
?
positionList
.
size
()
/
pageSize
:
positionList
.
size
()
/
pageSize
+
1
;
for
(
Integer
i
=
0
;
i
<
pageTOtl
;
i
++)
{
List
<
StockPositionTask
>
positionListPage
=
this
.
page
(
positionList
,
pageNo
.
get
(),
pageSize
);
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
for
(
StockPositionTask
stockPosition
:
positionListPage
)
{
this
.
assetCheckPriceFollowAccount
(
stockPosition
);
}
return
" "
;
},
executorServicePersonal
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
error
(
"资管错误消息:{}"
,
ex
);
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
pageNo
.
set
(
pageNo
.
get
()
+
1
);
}
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
combinedFuture
.
get
();
log
.
info
(
"资管异动提醒--------主线程开始阻塞,消息发送完成--------"
);
log
.
info
(
"资管异动提醒,本次共计算"
+
(
ObjectUtils
.
isEmpty
(
positionList
)
==
true
?
0
:
positionList
.
size
())
+
"异动提醒数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
catch
(
Exception
e
)
{
log
.
error
(
"资管错误信息:{}"
,
e
);
e
.
printStackTrace
();
}
try
{
Thread
.
sleep
(
20000
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
else
{
try
{
Thread
.
sleep
(
8000
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
}
},
PersonalexecutorService
);
}
}
public
List
<
StockPositionTask
>
page
(
List
<
StockPositionTask
>
list
,
Integer
pageNo
,
Integer
pageSize
)
{
if
(
CollectionUtils
.
isEmpty
(
list
))
{
return
list
;
}
List
<
StockPositionTask
>
resultList
=
new
ArrayList
();
// 所有dataList数据中的第几条
int
currIdx
=
pageNo
>
1
?
(
pageNo
-
1
)
*
pageSize
:
0
;
for
(
int
i
=
0
;
i
<
pageSize
&&
i
<
list
.
size
()
-
currIdx
;
i
++)
{
resultList
.
add
(
list
.
get
(
currIdx
+
i
));
}
return
resultList
;
}
//资管
public
void
assetCheckPriceFollowAccount
(
StockPositionTask
stockPosition
)
{
Date
startTime
=
new
Date
();
try
{
//获取code
log
.
info
(
"持仓数据:{}"
,
stockPosition
);
//涨跌幅
if
(
String
.
valueOf
(
TransactionRemindEnums
.
RiseAndFall
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
log
.
info
(
"异动提醒数据:涨跌幅:组装数据:耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
AssetProduct
product
=
assetProductService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
RiseAndFall
.
getCode
().
toString
());
log
.
info
(
"异动提醒数据:涨跌幅:组装数据:结束时间:耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
this
.
riseAndFall
(
remindCommonTask
,
product
,
memberBase
);
}
//收益率
if
(
String
.
valueOf
(
TransactionRemindEnums
.
PROFITRATE
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
AssetProduct
product
=
assetProductService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
PROFITRATE
.
getCode
().
toString
());
log
.
info
(
"异动提醒数据:收益率:组装数据:耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
this
.
profitrate
(
remindCommonTask
,
product
,
memberBase
);
log
.
info
(
"异动提醒数据:收益率:组装数据:结束时间:耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
//涨停
if
(
String
.
valueOf
(
TransactionRemindEnums
.
UPLIMIT
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
AssetProduct
product
=
assetProductService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
UPLIMIT
.
getCode
().
toString
());
this
.
uplimit
(
remindCommonTask
,
product
,
memberBase
);
}
if
(
String
.
valueOf
(
TransactionRemindEnums
.
LOWLIMIT
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
AssetProduct
product
=
assetProductService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
LOWLIMIT
.
getCode
().
toString
());
this
.
lowLimit
(
remindCommonTask
,
product
,
memberBase
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"异动提醒消息出错"
,
e
);
}
}
public
RemindCommonTask
assembleRemindCommonTask
(
StockPositionTask
stockPosition
)
{
//获取code
log
.
info
(
"持仓数据:{}"
,
stockPosition
);
//判断是否删除
Quote
quote
=
stockCodeService
.
getStockQuote
(
stockPosition
.
getCode
());
log
.
info
(
"异动提醒资管股票代码:{},名称:{},价格:{},股票价格:{},"
,
quote
.
getCode
(),
quote
.
getName
(),
stockPosition
.
getCost
(),
quote
.
getNow
());
//判断异动是否删除
AssetProduct
product
=
assetProductService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
null
;
}
List
<
Integer
>
roleIdList
=
new
ArrayList
<>();
//查询 角色
List
<
RemindRole
>
list
=
remindRoleService
.
selectByRemindId
(
stockPosition
.
getRemindId
());
if
(
ObjectUtil
.
isNotEmpty
(
list
))
{
roleIdList
=
list
.
stream
().
map
(
RemindRole:
:
getRoleId
).
collect
(
Collectors
.
toList
());
}
if
(!
ObjectUtils
.
isEmpty
(
roleIdList
)
&&
((
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
ANALYST
.
getCode
()))
||
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
.
getCode
()))
||
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_MANAGER
.
getCode
()))))
{
List
<
Long
>
adminListId
=
new
ArrayList
<>();
if
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
ANALYST
.
getCode
()))
{
//分析师
UsAdmin
usAdmin
=
usAdminService
.
getAdminByUserId
(
String
.
valueOf
(
product
.
getAnalyst
()));
if
(
ObjectUtil
.
isNotEmpty
(
usAdmin
)
&&
ObjectUtil
.
isNotEmpty
(
usAdmin
.
getId
()))
{
adminListId
.
add
(
usAdmin
.
getId
());
}
}
if
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
.
getCode
()))
{
//获取公司下所有的主管 //获取销售总监userid
List
<
SelectionBox2
>
listManager
=
usAdminService
.
getUserListByRoleCompanyId
(
product
.
getCompanyId
().
intValue
(),
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
);
if
(
ObjectUtil
.
isNotEmpty
(
listManager
)
&&
listManager
.
size
()
>
0
)
{
adminListId
.
addAll
(
listManager
.
stream
().
map
(
SelectionBox2:
:
getId
).
collect
(
Collectors
.
toList
()));
}
}
if
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SUPERADMIN
.
getCode
()))
{
//超级管理员
List
<
SelectionBox2
>
listManager
=
usAdminService
.
getUserListByRole
(
AdminConstant
.
AuthorityTypeEnum
.
SUPERADMIN
);
if
(
ObjectUtil
.
isNotEmpty
(
listManager
)
&&
listManager
.
size
()
>
0
)
{
adminListId
.
addAll
(
listManager
.
stream
().
map
(
SelectionBox2:
:
getId
).
collect
(
Collectors
.
toList
()));
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
null
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
null
;
}
RemindCommonTask
remindCommonTask
=
new
RemindCommonTask
();
//收益率
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
.
getProfitLossRatio
()))
{
remindCommonTask
.
setProfitLossRatio
(
stockPosition
.
getProfitLossRatio
());
}
//成交价格
remindCommonTask
.
setRiseDownRange
(
stockPosition
.
getRiseDownRange
());
//阈值
TasckChangeRemindVo
tasckChangeRemindVo
=
remindService
.
tasckSelectById
(
stockPosition
.
getRemindId
());
if
(
ObjectUtil
.
isEmpty
(
tasckChangeRemindVo
))
{
return
null
;
}
remindCommonTask
.
setProportion
(
tasckChangeRemindVo
.
getProportion
());
remindCommonTask
.
setWebHookUrl
(
tasckChangeRemindVo
.
getWebHookUrl
());
//持仓时间
remindCommonTask
.
setCreateTime
(
stockPosition
.
getCreatedTime
());
remindCommonTask
.
setMemberId
(
memberBase
.
getId
());
remindCommonTask
.
setMemberName
(
memberBase
.
getName
());
remindCommonTask
.
setRemindId
(
stockPosition
.
getRemindId
());
remindCommonTask
.
setStockProductName
(
product
.
getProductName
());
remindCommonTask
.
setCode
(
stockPosition
.
getCode
());
remindCommonTask
.
setStockName
(
stockPosition
.
getName
());
remindCommonTask
.
setHyperlinkState
(
stockPosition
.
getHyperlinkState
());
remindCommonTask
.
setSendCustomerState
(
stockPosition
.
getSendCustomerState
());
remindCommonTask
.
setTpFansId
(
stockPosition
.
getTpFansId
());
remindCommonTask
.
setStockName
(
stockPosition
.
getName
());
remindCommonTask
.
setClose
(
quote
.
getClose
());
remindCommonTask
.
setNow
(
quote
.
getNow
());
//产品类型
remindCommonTask
.
setProductType
(
AdminConstant
.
MemberProductTypeEnum
.
ASSET_TYPE
.
getCode
());
remindCommonTask
.
setAdminIdList
(
adminListId
);
return
remindCommonTask
;
}
return
null
;
}
/**
* 组装数据
*/
private
void
sendWbeHooks
(
WebHookCommonTask
webHookCommonTask
,
MemberBase
memberBase
)
{
log
.
info
(
"推送企业消息参数:{}"
,
webHookCommonTask
);
ChatbotSend
chatbotSend
=
new
ChatbotSend
();
chatbotSend
.
setCustomerId
(
webHookCommonTask
.
getCustomerId
().
intValue
());
if
(
ObjectUtil
.
isNotEmpty
(
memberBase
)
&&
StringUtil
.
isNotEmpty
(
memberBase
.
getName
()))
{
chatbotSend
.
setCustomerName
(
memberBase
.
getName
());
}
if
(
ObjectUtil
.
isNotEmpty
(
webHookCommonTask
)
&&
ObjectUtil
.
isNotEmpty
(
webHookCommonTask
.
getTpFansId
()))
{
chatbotSend
.
setTpFansId
(
webHookCommonTask
.
getTpFansId
());
}
//股票代码
chatbotSend
.
setStockCode
(
webHookCommonTask
.
getCode
());
chatbotSend
.
setStockName
(
webHookCommonTask
.
getStockName
());
chatbotSend
.
setMemberProductTypeEnumCode
(
webHookCommonTask
.
getProductType
());
chatbotSend
.
setTodayYields
(
webHookCommonTask
.
getTodayYields
());
chatbotSend
.
setRemindUrl
(
webHookCommonTask
.
getWebHookUrl
());
chatbotSend
.
setRemindId
(
webHookCommonTask
.
getRemindId
().
intValue
());
chatbotSend
.
setMonitoringType
(
MonitoringEnum
.
STOCKMONITORING
.
getCode
());
chatbotSend
.
setBuyToday
(
DateUtil
.
isOnToday
(
webHookCommonTask
.
getCreateTime
())
==
true
?
1
:
2
);
chatbotSend
.
setProductType
(
webHookCommonTask
.
getProductType
());
chatbotSendService
.
send
(
chatbotSend
);
}
/**
* 涨跌幅
*/
@Async
public
void
riseAndFall
(
RemindCommonTask
remindCommonTask
,
AssetProduct
product
,
MemberBase
memberBase
)
{
log
.
info
(
"涨幅数据参数:{}"
,
remindCommonTask
);
try
{
String
cole
=
null
;
String
variate
=
null
;
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getAdminIdList
())
||
remindCommonTask
.
getAdminIdList
().
size
()
<=
0
)
{
return
;
}
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getRiseDownRange
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getRiseDownRange
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
()))
{
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
remindCommonTask
.
getProductType
()
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
synchronized
(
this
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
remindCommonTask
.
getProductType
()
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
continue
;
}
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
remindCommonTask
.
getProductType
()
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"rose"
,
12L
,
TimeUnit
.
HOURS
);
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#FF0000"
;
variate
=
"涨"
+
df2
.
format
(
remindCommonTask
.
getRiseDownRange
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"涨"
+
df2
.
format
(
remindCommonTask
.
getProportion
()));
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
}
if
(
BigDecimalUtil
.
le
(
remindCommonTask
.
getRiseDownRange
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getRiseDownRange
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
()))
{
cole
=
"#0000FF"
;
variate
=
"跌"
+
df2
.
format
(
remindCommonTask
.
getRiseDownRange
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"跌"
+
df2
.
format
(
remindCommonTask
.
getRiseDownRange
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
synchronized
(
this
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
continue
;
}
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"fall"
,
12L
,
TimeUnit
.
HOURS
);
}
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
}
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
!
StringUtils
.
isEmpty
(
variate
)
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】"
+
variate
;
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
this
.
snedCustomer
(
remindCommonTask
,
product
,
datas
,
memberBase
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//循环发送数据用户id
log
.
info
(
"资管涨跌幅异动提醒:发送日志:{},数据:{},类型:{},路径:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
,
jumpUrl
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"涨幅数据错信息:{}"
,
e
);
}
}
private
TemplateKeyWordBuilder
getTemplateKeyWordBuilder
(
String
cole
,
String
remark
)
{
return
TemplateKeyWordBuilder
.
create
()
.
addFirst
(
DateUtil
.
getMonthDayStr
())
.
addKeyWord
(
"【个股异动监控】"
)
.
addKeyWord
(
DateUtil
.
getNow
())
.
addRemark
(
remark
,
cole
);
}
@Async
public
void
profitrate
(
RemindCommonTask
remindCommonTask
,
AssetProduct
product
,
MemberBase
memberBase
)
{
try
{
// 收益率是持有股票 的盈亏比例
log
.
info
(
"异动提醒收益率盈亏比例参数:{},产品:{},客户:{}"
,
remindCommonTask
,
product
,
memberBase
);
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
ObjectUtils
.
isEmpty
(
remindCommonTask
.
getProfitLossRatio
()))
{
return
;
}
String
cole
=
null
;
String
variate
=
null
;
log
.
info
(
"资管收益率日志输出div:{},productRoleTask.getProportion():{}"
,
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
());
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
))
&&
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProfitLossRatio
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
()))
{
List
<
Long
>
longList
=
new
ArrayList
<>();
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uprightYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uprightYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uprightYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"uprightYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#FF0000"
;
variate
=
"收益率到达"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"收益率到达"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
());
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】"
+
variate
;
// 客户姓名】【产品名称】的收益率到达+8%,请及时查看
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
this
.
snedCustomer
(
remindCommonTask
,
product
,
datas
,
memberBase
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
log
.
info
(
"资管收益率异动提醒:发送日志:{},数据:{},类型:{},路径:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
,
jumpUrl
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
if
(
BigDecimalUtil
.
le
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
))
&&
BigDecimalUtil
.
le
(
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProfitLossRatio
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
()))
{
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
List
<
Long
>
longList
=
new
ArrayList
<>();
for
(
Long
aLong
:
adminListId
)
{
String
redisKey
=
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"loadYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
();
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
redisUtil
.
set
(
redisKey
,
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#0000FF"
;
variate
=
"收益率跌"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"收益率跌"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
());
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】"
+
variate
;
// 客户姓名】【产品名称】的收益率到达+8%,请及时查看
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
this
.
snedCustomer
(
remindCommonTask
,
product
,
datas
,
memberBase
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
log
.
info
(
"资管收益率异动提醒:发送日志:{},数据:{},类型:{},路径:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
,
jumpUrl
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"盈亏比例错误信息:{}"
,
e
);
}
}
private
WebHookCommonTask
changeTask
(
RemindCommonTask
remindCommonTask
)
{
WebHookCommonTask
webHookCommonTask
=
new
WebHookCommonTask
();
//产品类型
webHookCommonTask
.
setProductType
(
remindCommonTask
.
getProductType
());
//客户id
webHookCommonTask
.
setCustomerId
(
remindCommonTask
.
getMemberId
());
//异动类型
webHookCommonTask
.
setChangeType
(
remindCommonTask
.
getChangeType
());
//异动id
webHookCommonTask
.
setRemindId
(
remindCommonTask
.
getRemindId
());
//股票名称
webHookCommonTask
.
setStockName
(
remindCommonTask
.
getStockName
());
//股票代码
webHookCommonTask
.
setCode
(
remindCommonTask
.
getCode
());
//持仓时间
webHookCommonTask
.
setCreateTime
(
remindCommonTask
.
getCreateTime
());
//当日涨幅
webHookCommonTask
.
setTodayYields
(
remindCommonTask
.
getTodayYields
());
//推送地址
webHookCommonTask
.
setWebHookUrl
(
remindCommonTask
.
getWebHookUrl
());
return
webHookCommonTask
;
}
/**
* 发送客户
*/
public
String
snedCustomer
(
RemindCommonTask
remindCommonTask
,
AssetProduct
product
,
TemplateKeyWordBuilder
datas
,
MemberBase
memberBase
)
{
log
.
info
(
"发送客户参数:{},产品:{},描述:{},用户信息:{}"
,
remindCommonTask
,
product
,
datas
,
memberBase
);
StockBatchVo
stockBatchVo
=
stockCodeService
.
stockIndustryDetails
(
remindCommonTask
.
getCode
());
if
(
ObjectUtil
.
isEmpty
(
stockBatchVo
)
||
StringUtil
.
isEmpty
(
stockBatchVo
.
getReason
()))
{
return
null
;
}
String
jumpUrl
=
null
;
try
{
if
(!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getSendCustomerState
())
&&
remindCommonTask
.
getSendCustomerState
()
>
0
)
{
if
(
StringUtil
.
isNotEmpty
(
memberBase
.
getName
())
&&
!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getTpFansId
()))
{
jumpUrl
=
this
.
getJumpUrl
(
remindCommonTask
);
log
.
info
(
"发送客户消息:{},类型:{},fansId:{},地址:{},Data:{}"
,
memberBase
.
getName
(),
TemplateUserType
.
USER
,
remindCommonTask
.
getTpFansId
(),
datas
);
weChatTemplateMessageService
.
pushToFans
(
memberBase
.
getName
(),
TemplateUserType
.
USER
,
remindCommonTask
.
getTpFansId
(),
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
if
(
StringUtil
.
isNotEmpty
(
memberBase
.
getName
())
&&
!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getTpFansId
()))
{
log
.
info
(
"发送客户消息:{},类型:{},fansId:{},地址:{},Data:{}"
,
memberBase
.
getName
(),
TemplateUserType
.
USER
,
remindCommonTask
.
getTpFansId
(),
datas
);
weChatTemplateMessageService
.
pushToFans
(
memberBase
.
getName
(),
TemplateUserType
.
USER
,
remindCommonTask
.
getTpFansId
(),
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"发送客户错误信息:{},参数信息"
,
e
,
remindCommonTask
);
}
return
jumpUrl
;
}
/**
* 涨停
*/
@Async
public
void
uplimit
(
RemindCommonTask
remindCommonTask
,
AssetProduct
product
,
MemberBase
memberBase
)
{
try
{
StocksCode
stocksCode
=
new
StocksCode
();
stocksCode
.
setSymbol
(
remindCommonTask
.
getCode
());
stocksCode
.
setName
(
remindCommonTask
.
getStockProductName
());
//昨日收盘价
stocksCode
.
setRecentClosingPrice
(
remindCommonTask
.
getClose
());
Pair
<
BigDecimal
,
BigDecimal
>
pair
=
assetFinanceCalculateService
.
calculatePriceLimit
(
stocksCode
);
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
BigDecimalUtil
.
compare
(
pair
.
getRight
(),
remindCommonTask
.
getNow
(),
0
))
{
List
<
Long
>
longList
=
new
ArrayList
<>();
for
(
Long
aLong
:
adminListId
)
{
String
redisKey
=
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uplimit:"
+
"memberBase:"
+
remindCommonTask
.
getMemberId
()
+
"productType:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
();
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
redisUtil
.
set
(
redisKey
,
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
String
cole
=
null
;
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
)))
{
cole
=
"#FF0000"
;
}
else
{
cole
=
"#0000FF"
;
}
//【客户姓名】【产品名称】的【股票名称/股票代码】涨停,请及时查看!
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
()))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】涨停,请及时查看!"
;
//推送企业群消息
remindCommonTask
.
setTodayYields
(
"涨停"
);
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
this
.
snedCustomer
(
remindCommonTask
,
product
,
datas
,
memberBase
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//发送公众号
log
.
info
(
"异动提醒:发送日志:{},数据:{},类型:{},路径:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
,
jumpUrl
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"涨停错误信息:{},参数信息"
,
e
,
remindCommonTask
);
}
}
/**
* 跌停
*/
@Async
public
void
lowLimit
(
RemindCommonTask
remindCommonTask
,
AssetProduct
product
,
MemberBase
memberBase
)
{
try
{
StocksCode
stocksCode
=
new
StocksCode
();
stocksCode
.
setSymbol
(
remindCommonTask
.
getCode
());
stocksCode
.
setName
(
remindCommonTask
.
getStockName
());
//昨日收盘价
stocksCode
.
setRecentClosingPrice
(
remindCommonTask
.
getClose
());
Pair
<
BigDecimal
,
BigDecimal
>
pair
=
assetFinanceCalculateService
.
calculatePriceLimit
(
stocksCode
);
if
(
BigDecimalUtil
.
compare
(
pair
.
getLeft
(),
remindCommonTask
.
getNow
(),
0
))
{
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
List
<
Long
>
longList
=
new
ArrayList
<>();
for
(
Long
aLong
:
adminListId
)
{
String
redisKey
=
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"lowlimit:"
+
"memberBase:"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
();
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
redisUtil
.
set
(
redisKey
,
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
String
cole
=
null
;
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
)))
{
cole
=
"#FF0000"
;
}
else
{
cole
=
"#0000FF"
;
}
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
()))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】跌停,请及时查看!"
;
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
remindCommonTask
.
setTodayYields
(
"跌停"
);
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
this
.
snedCustomer
(
remindCommonTask
,
product
,
datas
,
memberBase
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//发送公众号
log
.
info
(
"异动提醒:发送日志:{},数据:{},类型:{},路径:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
,
jumpUrl
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"跌停错误信息:{},参数信息"
,
e
,
remindCommonTask
);
}
}
public
String
getJumpUrl
(
RemindCommonTask
remindCommonTask
)
{
if
(!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getSendCustomerState
())
&&
remindCommonTask
.
getSendCustomerState
()
>
0
)
{
//发送公众号
String
jumpUrl
=
null
;
Long
redisId
=
SnowflakeIdWorker
.
nextId
();
if
(!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getHyperlinkState
())
&&
remindCommonTask
.
getHyperlinkState
()
>
0
)
{
jumpUrl
=
commonConfig
.
getCustomeUrlr
()
+
"?id="
+
redisId
;
}
redisUtil
.
set
(
RedisKeyMessageConstant
.
REDIS_SEND_CM_KEY
+
redisId
,
remindCommonTask
.
getCode
());
return
jumpUrl
;
}
return
null
;
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/AssetPersonalPositionTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.pojo.dao.Quote
;
import
com.zfxftech.telmarket.common.pojo.dao.asset.AssetStockPosition
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.business.asset.AssetFinanceCalculateService
;
import
com.zfxftech.telmarket.service.business.asset.AssetStockPositionService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
/**
* @version V1.0
* @title: PersonalPositionTask
* @description:
* @author: zw
* @date: 2022/3/12:33 下午
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
AssetPersonalPositionTask
implements
ApplicationRunner
{
@Resource
private
AssetStockPositionService
stockPositionService
;
@Resource
private
StockCodeService
stockCodeService
;
@Resource
private
AssetFinanceCalculateService
assetFinanceCalculateService
;
@Resource
CommonConfig
commonConfig
;
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"资管======"
+
commonConfig
.
getPersonalPositionTaskSwitch
());
log
.
info
(
"资管 bool======"
+
commonConfig
.
getPersonalPositionTaskSwitch
().
equals
(
"run"
));
if
(
commonConfig
.
getPersonalPositionTaskSwitch
()
!=
null
&&
commonConfig
.
getPersonalPositionTaskSwitch
().
equals
(
"run"
))
{
log
.
info
(
"资管更新持仓盈亏比例 当日涨跌幅 开始启动"
);
ExecutorService
executorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorService1
=
Executors
.
newFixedThreadPool
(
200
);
CompletableFuture
.
runAsync
(()
->
{
while
(
true
)
{
Date
startTime
=
new
Date
();
int
size
=
0
;
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
if
(
DateUtil
.
isTradeDayForCal
())
{
List
<
AssetStockPosition
>
faList
=
stockPositionService
.
getAll
();
size
=
faList
.
size
();
if
(
null
!=
faList
&&
faList
.
size
()
>
0
)
{
int
len
=
20
;
//限制条数
int
count
=
(
size
+
len
-
1
)
/
len
;
//分批数
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
List
<
AssetStockPosition
>
listPage
=
faList
.
subList
(
i
*
len
,
((
i
+
1
)
*
len
>
size
?
size
:
(
i
+
1
)
*
len
));
//为私人订制开启一个独立线程进行异步计算
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
List
<
AssetStockPosition
>
tempList
=
new
ArrayList
<>();
for
(
AssetStockPosition
stockPosition
:
listPage
){
try
{
AssetStockPosition
tempStockPosition
=
new
AssetStockPosition
();
Quote
quote
=
stockCodeService
.
getStockQuote
(
stockPosition
.
getCode
());
//开始计算和更新盈亏比例涨跌幅
//盈亏比例
tempStockPosition
.
setProfitLossRatio
(
assetFinanceCalculateService
.
profitLossRatio
(
quote
.
getNow
(),
stockPosition
.
getCost
()));
tempStockPosition
.
setRiseDownRange
(
assetFinanceCalculateService
.
riseDownRange
(
quote
.
getNow
(),
quote
.
getClose
()));
tempStockPosition
.
setId
(
stockPosition
.
getId
());
// //查询是否是示范盘
// AssetAccountProductRelation istrue = accountProductRelationService.queryAccountProductRelationByMarketInfo(stockPosition.getMarketId(), AdminConstant.MarketTypeEnum.SIMULATED.getCode());
// if (!ObjectUtils.isEmpty(istrue)) {
// //获取股票当前价格
// String pushTime = DateUtil.getNow();
// // TradingStrategyParam tradingStrategyParam = stockPositionService.createTradingStrategyParam(pushTime, "清仓", istrue, "", "");
// if (!StringUtils.isEmpty(stockPosition.getStopProfit()) && stockPosition.getStopProfit().contains("%")) {
// stockPosition.setStopProfit(String.valueOf(BigDecimalUtil.div(StringUtils.trim(stockPosition.getStopProfit().replace("%", " ")), HUNDRED.getCode().toString())));
// }
//
// if (!StringUtils.isEmpty(stockPosition.getStopLoss()) && stockPosition.getStopLoss().contains("%")) {
// stockPosition.setStopLoss(String.valueOf(BigDecimalUtil.div(StringUtils.trim(stockPosition.getStopLoss().replace("%", " ")), HUNDRED.getCode().toString())));
// }
// //止盈
// if (!ObjectUtils.isEmpty(stockPosition) && !ObjectUtils.isEmpty(stockPosition.getIsStopProfit())&& !ObjectUtils.isEmpty(stockPosition.getStopProfit())
// && String.valueOf(stockPosition.getIsStopProfit()).equals("1")
// && BigDecimalUtil.ge(tempStockPosition.getProfitLossRatio(), new BigDecimal( stockPosition.getStopProfit()))
// && BigDecimalUtil.compare(quote.getNow(), quote.getHigh(),LESS.getCode())
// ) {
//// tradingStrategyParam.setReason("获利止盈!");
// //清仓操作
//// stockPositionService.selling(istrue, stockPosition, ALL_POSITION, quote.getNow(), tradingStrategyParam, usAdmin, false, StockInputLogTrustSource.AUTO_ZHIYING);
//
// AssetSellingOrderBO sellingOrderBO = new AssetSellingOrderBO();
// sellingOrderBO.setCode(stockPosition.getCode());
// sellingOrderBO.setPosition("1");
// sellingOrderBO.setReason("获利止盈!");
// List listId= new ArrayList();
// listId.add(istrue.getId());
// sellingOrderBO.setRelationId(listId);
// stockPositionService.sendSellingOrder(sellingOrderBO,usAdmin);
//
// }
// //止损
// if (!ObjectUtils.isEmpty(stockPosition) && !ObjectUtils.isEmpty(stockPosition.getStopLoss())&& !ObjectUtils.isEmpty(stockPosition.getIsStopLoss())
// &&String.valueOf(stockPosition.getIsStopLoss()).equals("1")
// && BigDecimalUtil.le(tempStockPosition.getProfitLossRatio(),new BigDecimal( stockPosition.getStopLoss()))
// ) {
//
// AssetSellingOrderBO sellingOrderBO = new AssetSellingOrderBO();
// sellingOrderBO.setCode(stockPosition.getCode());
// sellingOrderBO.setPosition("1");
// sellingOrderBO.setReason("清仓止损!");
// List listId= new ArrayList();
// listId.add(istrue.getId());
// sellingOrderBO.setRelationId(listId);
// stockPositionService.sendSellingOrder(sellingOrderBO,usAdmin);
//// //清仓操作
//// tradingStrategyParam.setReason("清仓止损!");
//// //清仓操作
//// stockPositionService.selling(istrue, stockPosition, ALL_POSITION, quote.getNow(), tradingStrategyParam, usAdmin, false,StockInputLogTrustSource.AUTO_ZHISUN);
// }
// }
tempList
.
add
(
tempStockPosition
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
log
.
error
(
"资管更新持仓盈亏比例当日涨跌幅更新线程出错"
,
e
);
}
}
stockPositionService
.
bactchUpdateStockPosition
(
tempList
);
return
""
;
},
executorService1
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
info
(
"出错啦"
,
ex
);
System
.
out
.
println
(
ex
.
getMessage
());
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
}
}
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
//log.info("全部跟投账户开始更新数据--------主线程开始阻塞,等待更新全部完成--------");
combinedFuture
.
get
();
log
.
info
(
"私人定制更新持仓盈亏比例当日涨跌幅计算完成,本次共计算"
+
size
+
"个持仓数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
Thread
.
sleep
(
6000
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
}
}
},
executorService
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/AssetProductCheckFullStopTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.constant.AdminConstant
;
import
com.zfxftech.telmarket.common.enums.StockInputLogTrustSource
;
import
com.zfxftech.telmarket.common.enums.followAccount.FollowAccountConfigRuleTypeEnum
;
import
com.zfxftech.telmarket.common.pojo.dao.Quote
;
import
com.zfxftech.telmarket.common.pojo.dao.asset.AssetAccountProductRelation
;
import
com.zfxftech.telmarket.common.pojo.dao.asset.AssetStockPosition
;
import
com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin
;
import
com.zfxftech.telmarket.common.pojo.request.asset.AssetSellingOrderBO
;
import
com.zfxftech.telmarket.common.pojo.vo.asset.AssetProductConfigRuleTaskVo
;
import
com.zfxftech.telmarket.common.util.BigDecimalUtil
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.common.util.followAccount.RedisUtilNew
;
import
com.zfxftech.telmarket.service.UsAdminService
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.business.asset.AssetAccountProductRelationService
;
import
com.zfxftech.telmarket.service.business.asset.AssetProductStockRiskService
;
import
com.zfxftech.telmarket.service.business.asset.AssetStockPositionService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
javax.annotation.Resource
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicReference
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
LESS
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
MarketTypeEnum
.
SIMULATED
;
/**
* 自动止盈止损
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
AssetProductCheckFullStopTask
implements
ApplicationRunner
{
@Autowired
AssetProductStockRiskService
productStockRiskService
;
@Autowired
AssetAccountProductRelationService
accountProductRelationService
;
@Resource
AssetStockPositionService
stockPositionService
;
@Autowired
private
StockCodeService
stockCodeService
;
@Autowired
private
UsAdminService
usAdminService
;
@Autowired
private
CommonConfig
commonConfig
;
@Autowired
private
RedisUtilNew
redisUtilNew
;
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"开始启动资管更新开关状态:"
+
commonConfig
.
getProductCheckFullStopTaskSwitchAsset
());
if
(
commonConfig
.
getProductCheckFullStopTaskSwitchAsset
()
!=
null
&&
commonConfig
.
getProductCheckFullStopTaskSwitchAsset
().
equals
(
"run"
))
{
log
.
info
(
"开始资管自动止盈止损"
);
//分页查询异动配置列表
ExecutorService
executorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorService1
=
Executors
.
newFixedThreadPool
(
40
);
CompletableFuture
.
runAsync
(()
->
{
UsAdmin
usAdmin
=
usAdminService
.
getAdminByUserId
(
AdminConstant
.
AuthorityTypeEnum
.
SUPERADMIN
.
getCode
().
toString
());
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
while
(
true
)
{
if
(
DateUtil
.
stopProfitIsTradeDay
())
{
AtomicReference
<
Integer
>
pageNo
=
new
AtomicReference
<>(
1
);
Integer
pageSize
=
200
;
Date
startTime
=
new
Date
();
List
<
AssetProductConfigRuleTaskVo
>
list
=
productStockRiskService
.
getListProductConfigTask
(
pageNo
.
get
(),
pageSize
);
//获取所有的资管的止盈止损配置
if
(!
ObjectUtils
.
isEmpty
(
list
))
{
pageNo
.
set
(
pageNo
.
get
()
+
1
);
for
(
AssetProductConfigRuleTaskVo
productConfigRuleTaskVo
:
list
)
{
//开始遍历产品id
for
(
Integer
productId
:
productConfigRuleTaskVo
.
getProductIdList
())
{
//获取产品下面的股票
List
<
AssetStockPosition
>
fansDtoList
=
stockPositionService
.
getPositionList
(
productId
.
longValue
(),
null
,
null
,
null
,
null
);
for
(
AssetStockPosition
stockPosition
:
fansDtoList
)
{
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
//查询是否是示范盘
//获取股票当前价格
Quote
quote
=
stockCodeService
.
queryStockPrice
(
stockPosition
.
getCode
());
//止盈
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
)
&&
!
ObjectUtils
.
isEmpty
(
productConfigRuleTaskVo
.
getType
())
&&
productConfigRuleTaskVo
.
getType
().
equals
(
FollowAccountConfigRuleTypeEnum
.
TAKE_PROFIT
.
getCode
())
&&
BigDecimalUtil
.
ge
(
stockPosition
.
getProfitLossRatio
(),
productConfigRuleTaskVo
.
getYields
())
&&
BigDecimalUtil
.
compare
(
quote
.
getNow
(),
quote
.
getHigh
(),
LESS
.
getCode
())
)
{
String
key
=
"ASSETFULLSTOP"
+
stockPosition
.
getCustomerId
()
+
"stop"
+
productConfigRuleTaskVo
.
getId
()
+
"productId"
+
stockPosition
.
getProductId
()
+
"code"
+
stockPosition
.
getCode
();
String
istrueStop
=
redisUtilNew
.
get
(
key
);
if
(
ObjectUtils
.
isEmpty
(
istrueStop
))
{
redisUtilNew
.
set
(
key
,
"Oversold"
,
12L
,
TimeUnit
.
HOURS
);
AssetAccountProductRelation
istrue
=
accountProductRelationService
.
queryAccountProductRelationByMarketInfo
(
stockPosition
.
getMarketId
(),
SIMULATED
.
getCode
());
if
(
ObjectUtils
.
isEmpty
(
istrue
))
{
return
""
;
}
//清仓操作
AssetSellingOrderBO
sellingOrderBO
=
new
AssetSellingOrderBO
();
sellingOrderBO
.
setCode
(
stockPosition
.
getCode
());
sellingOrderBO
.
setPosition
(
"1"
);
sellingOrderBO
.
setReason
(
"获利止盈!"
);
List
listId
=
new
ArrayList
();
listId
.
add
(
istrue
.
getId
());
sellingOrderBO
.
setPrice
(
String
.
valueOf
(
quote
.
getNow
()));
sellingOrderBO
.
setRelationId
(
listId
);
stockPositionService
.
sendSellingOrderTask
(
sellingOrderBO
,
usAdmin
,
StockInputLogTrustSource
.
AUTO_ZHIYING
);
}
}
//止损
else
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
)
&&
!
ObjectUtils
.
isEmpty
(
productConfigRuleTaskVo
.
getType
())
&&
productConfigRuleTaskVo
.
getType
().
equals
(
FollowAccountConfigRuleTypeEnum
.
STOP_LOSS
.
getCode
())
&&
BigDecimalUtil
.
le
(
stockPosition
.
getProfitLossRatio
(),
productConfigRuleTaskVo
.
getYields
())
)
{
String
key
=
"ASSETFULLSTOP"
+
stockPosition
.
getCustomerId
()
+
"stop"
+
productConfigRuleTaskVo
.
getId
()
+
"productId"
+
stockPosition
.
getProductId
()
+
"code"
+
stockPosition
.
getCode
();
String
istrueStop
=
redisUtilNew
.
get
(
key
);
if
(
ObjectUtils
.
isEmpty
(
istrueStop
))
{
redisUtilNew
.
set
(
key
,
"Oversold"
,
12L
,
TimeUnit
.
HOURS
);
AssetAccountProductRelation
istrue
=
accountProductRelationService
.
queryAccountProductRelationByMarketInfo
(
stockPosition
.
getMarketId
(),
SIMULATED
.
getCode
());
if
(
ObjectUtils
.
isEmpty
(
istrue
))
{
return
""
;
}
//清仓操作
AssetSellingOrderBO
sellingOrderBO
=
new
AssetSellingOrderBO
();
sellingOrderBO
.
setCode
(
stockPosition
.
getCode
());
sellingOrderBO
.
setPosition
(
"1"
);
sellingOrderBO
.
setReason
(
"清仓止损!"
);
List
listId
=
new
ArrayList
();
listId
.
add
(
istrue
.
getId
());
sellingOrderBO
.
setPrice
(
String
.
valueOf
(
quote
.
getNow
()));
sellingOrderBO
.
setRelationId
(
listId
);
stockPositionService
.
sendSellingOrderTask
(
sellingOrderBO
,
usAdmin
,
StockInputLogTrustSource
.
AUTO_ZHISUN
);
//推送消息
}
}
return
""
;
},
executorService1
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
info
(
"出错啦"
,
ex
);
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
}
}
}
}
else
{
pageNo
.
set
(
1
);
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
combinedFuture
.
get
();
log
.
info
(
"开始资管自动止盈止损------主线程开始阻塞,消息发送完成--------"
);
log
.
info
(
"开始资管自动止盈止损,本次共计算"
+
(
ObjectUtils
.
isEmpty
(
list
)
==
true
?
0
:
list
.
size
())
+
"开始资管自动止盈止损数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
try
{
Thread
.
sleep
(
3000
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
}
}
else
{
try
{
Thread
.
sleep
(
30000
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
}
}
}
},
executorService
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/ChangeRemindProfitLossRationTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.alibaba.druid.util.StringUtils
;
import
com.github.pagehelper.util.StringUtil
;
import
com.zfxf.tools.wechat.helper.api.TemplateKeyWordBuilder
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.constant.AdminConstant
;
import
com.zfxftech.telmarket.common.constant.RedisKeyMessageConstant
;
import
com.zfxftech.telmarket.common.constant.webhook.MonitoringEnum
;
import
com.zfxftech.telmarket.common.enums.remind.InformTypeEnums
;
import
com.zfxftech.telmarket.common.enums.remind.TransactionRemindEnums
;
import
com.zfxftech.telmarket.common.enums.wx.TemplateUserType
;
import
com.zfxftech.telmarket.common.pojo.dao.*
;
import
com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin
;
import
com.zfxftech.telmarket.common.pojo.dao.remind.RemindCommonTask
;
import
com.zfxftech.telmarket.common.pojo.dao.remind.RemindRole
;
import
com.zfxftech.telmarket.common.pojo.dao.remind.WebHookCommonTask
;
import
com.zfxftech.telmarket.common.pojo.dao.webhook.ChatbotSend
;
import
com.zfxftech.telmarket.common.pojo.dto.remind.StockPositionTask
;
import
com.zfxftech.telmarket.common.pojo.vo.StockBatchVo
;
import
com.zfxftech.telmarket.common.pojo.vo.remind.TasckChangeRemindVo
;
import
com.zfxftech.telmarket.common.util.BigDecimalUtil
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.common.util.RedisUtil
;
import
com.zfxftech.telmarket.common.util.SnowflakeIdWorker
;
import
com.zfxftech.telmarket.service.UsAdminService
;
import
com.zfxftech.telmarket.service.business.*
;
import
com.zfxftech.telmarket.service.business.webhook.ChatbotSendService
;
import
com.zfxftech.telmarket.service.remind.RemindRoleService
;
import
com.zfxftech.telmarket.service.remind.RemindService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.tuple.Pair
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.ObjectUtils
;
import
javax.annotation.Resource
;
import
java.math.BigDecimal
;
import
java.text.DecimalFormat
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicReference
;
import
java.util.stream.Collectors
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
GREATER
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
LESS
;
/**
* Create time: 2022/1/26
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
ChangeRemindProfitLossRationTask
implements
ApplicationRunner
{
@Resource
RemindService
remindService
;
@Resource
RemindRoleService
remindRoleService
;
@Resource
StockCodeService
stockCodeService
;
@Resource
private
StockPositionService
stockPositionService
;
@Resource
FinanceCalculateService
financeCalculateService
;
@Resource
RedisUtil
redisUtil
;
@Resource
WeChatTemplateMessageService
weChatTemplateMessageService
;
@Resource
UsAdminService
usAdminService
;
@Resource
ProductService
productService
;
@Autowired
private
CommonConfig
commonConfig
;
@Autowired
AccountProductRelationService
accountProductRelationService
;
@Autowired
private
ChatbotSendService
chatbotSendService
;
@Autowired
private
UsMemberBaseService
usMemberBaseService
;
private
static
DecimalFormat
df2
=
new
DecimalFormat
(
"0.00%"
);
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"私人订制正式环境日志输出"
);
// commonConfig.setChangeRemindTaskSwitch("run");
log
.
info
(
"开始启动异动提醒配置更新开关状态:"
+
commonConfig
.
getChangeRemindTaskSwitch
());
if
(
commonConfig
.
getChangeRemindTaskSwitch
()
!=
null
&&
commonConfig
.
getChangeRemindTaskSwitch
().
equals
(
"run"
))
{
//分页查询异动配置列表
ExecutorService
PersonalexecutorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorServicePersonal
=
Executors
.
newFixedThreadPool
(
100
);
CompletableFuture
.
runAsync
(()
->
{
while
(
true
)
{
if
(
DateUtil
.
isTradeDayForChangeRemind
())
{
AtomicReference
<
Integer
>
pageNo
=
new
AtomicReference
<>(
1
);
Integer
pageSize
=
100
;
Date
startTime
=
new
Date
();
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
List
<
StockPositionTask
>
positionList
=
stockPositionService
.
getStockPositionTask
(
null
);
log
.
info
(
"提醒数据大小:{}"
,
positionList
.
size
());
if
(!
ObjectUtils
.
isEmpty
(
positionList
)
&&
positionList
.
size
()
>
0
)
{
Integer
pageTOtl
=
positionList
.
size
()
%
pageSize
==
0
?
positionList
.
size
()
/
pageSize
:
positionList
.
size
()
/
pageSize
+
1
;
for
(
Integer
i
=
0
;
i
<
pageTOtl
;
i
++)
{
List
<
StockPositionTask
>
positionListPage
=
this
.
page
(
positionList
,
pageNo
.
get
(),
pageSize
);
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
for
(
StockPositionTask
stockPosition
:
positionListPage
)
{
this
.
checkPriceFollowAccount
(
stockPosition
);
}
return
" "
;
},
executorServicePersonal
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
error
(
"私人订制错误消息:{}"
,
ex
);
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
pageNo
.
set
(
pageNo
.
get
()
+
1
);
}
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
combinedFuture
.
get
();
log
.
info
(
"私人订制异动提醒--------主线程开始阻塞,消息发送完成--------"
);
log
.
info
(
"私人订制异动提醒,本次共计算"
+
(
ObjectUtils
.
isEmpty
(
positionList
)
==
true
?
0
:
positionList
.
size
())
+
"异动提醒数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
catch
(
Exception
e
)
{
log
.
error
(
"私人订制错误信息:{}"
,
e
);
e
.
printStackTrace
();
}
try
{
Thread
.
sleep
(
20000
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
else
{
try
{
Thread
.
sleep
(
8000
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
}
},
PersonalexecutorService
);
}
}
public
List
<
StockPositionTask
>
page
(
List
<
StockPositionTask
>
list
,
Integer
pageNo
,
Integer
pageSize
)
{
if
(
CollectionUtils
.
isEmpty
(
list
))
{
return
list
;
}
List
<
StockPositionTask
>
resultList
=
new
ArrayList
();
// 所有dataList数据中的第几条
int
currIdx
=
pageNo
>
1
?
(
pageNo
-
1
)
*
pageSize
:
0
;
for
(
int
i
=
0
;
i
<
pageSize
&&
i
<
list
.
size
()
-
currIdx
;
i
++)
{
resultList
.
add
(
list
.
get
(
currIdx
+
i
));
}
return
resultList
;
}
private
TemplateKeyWordBuilder
getTemplateKeyWordBuilder
(
String
cole
,
String
remark
)
{
return
TemplateKeyWordBuilder
.
create
()
.
addFirst
(
DateUtil
.
getMonthDayStr
())
.
addKeyWord
(
"【个股异动监控】"
)
.
addKeyWord
(
DateUtil
.
getNow
())
.
addRemark
(
remark
,
cole
);
}
//私人订制
public
void
checkPriceFollowAccount
(
StockPositionTask
stockPosition
)
{
Date
startTime
=
new
Date
();
try
{
//涨跌幅
if
(
String
.
valueOf
(
TransactionRemindEnums
.
RiseAndFall
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
log
.
info
(
"组装数据后涨跌幅参数数据:{}"
,
remindCommonTask
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
Product
product
=
productService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
log
.
info
(
"获取客户信息:{},用户id"
,
memberBase
,
stockPosition
.
getCustomerId
());
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
RiseAndFall
.
getCode
().
toString
());
this
.
riseAndFall
(
remindCommonTask
,
product
,
memberBase
);
}
//收益率
if
(
String
.
valueOf
(
TransactionRemindEnums
.
PROFITRATE
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
Product
product
=
productService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
PROFITRATE
.
getCode
().
toString
());
this
.
profitrate
(
remindCommonTask
,
product
,
memberBase
);
}
//涨停
if
(
String
.
valueOf
(
TransactionRemindEnums
.
UPLIMIT
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
Product
product
=
productService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
UPLIMIT
.
getCode
().
toString
());
this
.
uplimit
(
remindCommonTask
,
product
,
memberBase
);
}
if
(
String
.
valueOf
(
TransactionRemindEnums
.
LOWLIMIT
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
Product
product
=
productService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
LOWLIMIT
.
getCode
().
toString
());
this
.
lowLimit
(
remindCommonTask
,
product
,
memberBase
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"异动提醒消息出错"
,
e
);
}
}
public
RemindCommonTask
assembleRemindCommonTask
(
StockPositionTask
stockPosition
)
{
//获取code
//判断是否删除
Quote
quote
=
stockCodeService
.
getStockQuote
(
stockPosition
.
getCode
());
log
.
info
(
"异动提醒私人订制股票代码:{},名称:{},价格:{},股票价格:{},"
,
quote
.
getCode
(),
quote
.
getName
(),
stockPosition
.
getCost
(),
quote
.
getNow
());
//判断异动是否删除
Product
product
=
productService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
null
;
}
List
<
Integer
>
roleIdList
=
new
ArrayList
<>();
//查询 角色
List
<
RemindRole
>
list
=
remindRoleService
.
selectByRemindId
(
stockPosition
.
getRemindId
());
if
(
ObjectUtil
.
isNotEmpty
(
list
))
{
roleIdList
=
list
.
stream
().
map
(
RemindRole:
:
getRoleId
).
collect
(
Collectors
.
toList
());
}
if
(!
ObjectUtils
.
isEmpty
(
roleIdList
)
&&
((
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
ANALYST
.
getCode
()))
||
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
.
getCode
()))
||
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_MANAGER
.
getCode
()))))
{
List
<
Long
>
adminListId
=
new
ArrayList
<>();
if
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
ANALYST
.
getCode
()))
{
//分析师
UsAdmin
usAdmin
=
usAdminService
.
getAdminByUserId
(
String
.
valueOf
(
product
.
getAnalyst
()));
if
(
ObjectUtil
.
isNotEmpty
(
usAdmin
)
&&
ObjectUtil
.
isNotEmpty
(
usAdmin
.
getId
()))
{
adminListId
.
add
(
usAdmin
.
getId
());
}
}
if
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
.
getCode
()))
{
//获取公司下所有的主管 //获取销售总监userid
List
<
SelectionBox2
>
listManager
=
usAdminService
.
getUserListByRoleCompanyId
(
product
.
getCompanyId
().
intValue
(),
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
);
if
(
ObjectUtil
.
isNotEmpty
(
listManager
)
&&
listManager
.
size
()
>
0
)
{
adminListId
.
addAll
(
listManager
.
stream
().
map
(
SelectionBox2:
:
getId
).
collect
(
Collectors
.
toList
()));
}
}
if
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SUPERADMIN
.
getCode
()))
{
//超级管理员
List
<
SelectionBox2
>
listManager
=
usAdminService
.
getUserListByRole
(
AdminConstant
.
AuthorityTypeEnum
.
SUPERADMIN
);
if
(
ObjectUtil
.
isNotEmpty
(
listManager
)
&&
listManager
.
size
()
>
0
)
{
adminListId
.
addAll
(
listManager
.
stream
().
map
(
SelectionBox2:
:
getId
).
collect
(
Collectors
.
toList
()));
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
null
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
log
.
info
(
"获取客户信息:{},用户id"
,
memberBase
,
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
null
;
}
RemindCommonTask
remindCommonTask
=
new
RemindCommonTask
();
//收益率
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
.
getProfitLossRatio
()))
{
remindCommonTask
.
setProfitLossRatio
(
stockPosition
.
getProfitLossRatio
());
}
//成交价格
remindCommonTask
.
setRiseDownRange
(
stockPosition
.
getRiseDownRange
());
//阈值
TasckChangeRemindVo
tasckChangeRemindVo
=
remindService
.
tasckSelectById
(
stockPosition
.
getRemindId
());
if
(
ObjectUtil
.
isEmpty
(
tasckChangeRemindVo
))
{
return
null
;
}
remindCommonTask
.
setProportion
(
tasckChangeRemindVo
.
getProportion
());
remindCommonTask
.
setWebHookUrl
(
tasckChangeRemindVo
.
getWebHookUrl
());
//持仓时间
remindCommonTask
.
setCreateTime
(
stockPosition
.
getCreatedTime
());
remindCommonTask
.
setMemberId
(
memberBase
.
getId
());
remindCommonTask
.
setMemberName
(
memberBase
.
getName
());
remindCommonTask
.
setRemindId
(
stockPosition
.
getRemindId
());
remindCommonTask
.
setStockProductName
(
product
.
getProductName
());
remindCommonTask
.
setCode
(
stockPosition
.
getCode
());
remindCommonTask
.
setStockName
(
stockPosition
.
getName
());
remindCommonTask
.
setHyperlinkState
(
stockPosition
.
getHyperlinkState
());
remindCommonTask
.
setSendCustomerState
(
stockPosition
.
getSendCustomerState
());
remindCommonTask
.
setTpFansId
(
stockPosition
.
getTpFansId
());
remindCommonTask
.
setStockName
(
stockPosition
.
getName
());
remindCommonTask
.
setClose
(
quote
.
getClose
());
remindCommonTask
.
setNow
(
quote
.
getNow
());
//产品类型
remindCommonTask
.
setProductType
(
AdminConstant
.
MemberProductTypeEnum
.
PREMIUM
.
getCode
());
remindCommonTask
.
setAdminIdList
(
adminListId
);
return
remindCommonTask
;
}
return
null
;
}
/**
* 组装数据
*/
private
void
sendWbeHooks
(
WebHookCommonTask
webHookCommonTask
,
MemberBase
memberBase
)
{
log
.
info
(
"推送企业消息参数:{}"
,
webHookCommonTask
);
ChatbotSend
chatbotSend
=
new
ChatbotSend
();
chatbotSend
.
setCustomerId
(
webHookCommonTask
.
getCustomerId
().
intValue
());
if
(
ObjectUtil
.
isNotEmpty
(
memberBase
)
&&
StringUtil
.
isNotEmpty
(
memberBase
.
getName
()))
{
chatbotSend
.
setCustomerName
(
memberBase
.
getName
());
}
if
(
ObjectUtil
.
isNotEmpty
(
webHookCommonTask
)
&&
ObjectUtil
.
isNotEmpty
(
webHookCommonTask
.
getTpFansId
()))
{
chatbotSend
.
setTpFansId
(
webHookCommonTask
.
getTpFansId
());
}
//股票代码
chatbotSend
.
setStockCode
(
webHookCommonTask
.
getCode
());
chatbotSend
.
setStockName
(
webHookCommonTask
.
getStockName
());
chatbotSend
.
setMemberProductTypeEnumCode
(
webHookCommonTask
.
getProductType
());
chatbotSend
.
setTodayYields
(
webHookCommonTask
.
getTodayYields
());
chatbotSend
.
setRemindUrl
(
webHookCommonTask
.
getWebHookUrl
());
chatbotSend
.
setRemindId
(
webHookCommonTask
.
getRemindId
().
intValue
());
chatbotSend
.
setMonitoringType
(
MonitoringEnum
.
STOCKMONITORING
.
getCode
());
chatbotSend
.
setBuyToday
(
DateUtil
.
isOnToday
(
webHookCommonTask
.
getCreateTime
())
==
true
?
1
:
2
);
chatbotSend
.
setProductType
(
webHookCommonTask
.
getProductType
());
chatbotSendService
.
send
(
chatbotSend
);
}
/**
* 涨跌幅
*/
public
void
riseAndFall
(
RemindCommonTask
remindCommonTask
,
Product
product
,
MemberBase
memberBase
)
{
log
.
info
(
"涨幅数据参数发送:{},产品:{},用户信息:{}"
,
remindCommonTask
,
product
,
memberBase
);
try
{
String
cole
=
null
;
String
variate
=
null
;
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getAdminIdList
())
||
remindCommonTask
.
getAdminIdList
().
size
()
<=
0
)
{
return
;
}
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getRiseDownRange
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getRiseDownRange
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
()))
{
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
remindCommonTask
.
getProductType
()
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
synchronized
(
this
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
remindCommonTask
.
getProductType
()
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
continue
;
}
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
remindCommonTask
.
getProductType
()
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"rose"
,
12L
,
TimeUnit
.
HOURS
);
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#FF0000"
;
variate
=
"涨"
+
df2
.
format
(
remindCommonTask
.
getRiseDownRange
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"涨"
+
df2
.
format
(
remindCommonTask
.
getRiseDownRange
()));
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
}
log
.
info
(
"涨幅客户异动数据参数:{}"
,
remindCommonTask
);
if
(
BigDecimalUtil
.
le
(
remindCommonTask
.
getRiseDownRange
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getRiseDownRange
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
()))
{
cole
=
"#0000FF"
;
variate
=
"跌"
+
df2
.
format
(
remindCommonTask
.
getRiseDownRange
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"跌"
+
df2
.
format
(
remindCommonTask
.
getRiseDownRange
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
synchronized
(
this
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
continue
;
}
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"fall"
,
12L
,
TimeUnit
.
HOURS
);
}
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
}
log
.
info
(
"发送公众号涨幅异动数据参数:{}"
,
remindCommonTask
);
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
!
StringUtils
.
isEmpty
(
variate
)
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】"
+
variate
;
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
null
;
log
.
info
(
"发送客户数据:{}"
,
remindCommonTask
);
if
(!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getSendCustomerState
())
&&
remindCommonTask
.
getSendCustomerState
()
>
0
)
{
StockBatchVo
stockBatchVo
=
stockCodeService
.
stockIndustryDetails
(
remindCommonTask
.
getCode
());
if
(
ObjectUtil
.
isEmpty
(
stockBatchVo
)
||
StringUtil
.
isEmpty
(
stockBatchVo
.
getReason
()))
{
return
;
}
jumpUrl
=
this
.
snedCustomer
(
remindCommonTask
,
product
,
datas
,
memberBase
);
}
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//循环发送数据用户id
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"涨幅数据错信息:{}"
,
e
);
}
}
public
void
profitrate
(
RemindCommonTask
remindCommonTask
,
Product
product
,
MemberBase
memberBase
)
{
try
{
// 收益率是持有股票 的盈亏比例
log
.
info
(
"异动提醒收益率盈亏比例参数:{},产品:{},客户:{}"
,
remindCommonTask
,
product
,
memberBase
);
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
ObjectUtils
.
isEmpty
(
remindCommonTask
.
getProfitLossRatio
()))
{
return
;
}
String
cole
=
null
;
String
variate
=
null
;
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
))
&&
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProfitLossRatio
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
()))
{
List
<
Long
>
longList
=
new
ArrayList
<>();
for
(
Long
aLong
:
adminListId
)
{
String
redisKey
=
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uprightYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
();
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
redisUtil
.
set
(
redisKey
,
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#FF0000"
;
variate
=
"收益率到达"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"收益率到达"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
df2
.
format
(
remindCommonTask
.
getProportion
());
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】"
+
variate
;
// 客户姓名】【产品名称】的收益率到达+8%,请及时查看
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
null
;
// this.snedCustomer(remindCommonTask, product, datas, memberBase);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
if
(
BigDecimalUtil
.
le
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
))
&&
BigDecimalUtil
.
le
(
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProfitLossRatio
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
()))
{
List
<
Long
>
longList
=
new
ArrayList
<>();
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
String
redisKey
=
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"loadYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
();
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
redisUtil
.
set
(
redisKey
,
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#0000FF"
;
variate
=
"收益率跌"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"收益率跌"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
df2
.
format
(
remindCommonTask
.
getProportion
());
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】"
+
variate
;
// 客户姓名】【产品名称】的收益率到达+8%,请及时查看
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
null
;
// this.snedCustomer(remindCommonTask, product, datas, memberBase);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"盈亏比例错误信息:{}"
,
e
);
}
}
private
WebHookCommonTask
changeTask
(
RemindCommonTask
remindCommonTask
)
{
WebHookCommonTask
webHookCommonTask
=
new
WebHookCommonTask
();
//产品类型
webHookCommonTask
.
setProductType
(
remindCommonTask
.
getProductType
());
//客户id
webHookCommonTask
.
setCustomerId
(
remindCommonTask
.
getMemberId
());
//异动类型
webHookCommonTask
.
setChangeType
(
remindCommonTask
.
getChangeType
());
//异动id
webHookCommonTask
.
setRemindId
(
remindCommonTask
.
getRemindId
());
//股票名称
webHookCommonTask
.
setStockName
(
remindCommonTask
.
getStockName
());
//股票代码
webHookCommonTask
.
setCode
(
remindCommonTask
.
getCode
());
//持仓时间
webHookCommonTask
.
setCreateTime
(
remindCommonTask
.
getCreateTime
());
//当日涨幅
webHookCommonTask
.
setTodayYields
(
remindCommonTask
.
getTodayYields
());
//推送地址
webHookCommonTask
.
setWebHookUrl
(
remindCommonTask
.
getWebHookUrl
());
//粉丝id
webHookCommonTask
.
setTpFansId
(
remindCommonTask
.
getTpFansId
());
return
webHookCommonTask
;
}
/**
* 涨停
*/
public
void
uplimit
(
RemindCommonTask
remindCommonTask
,
Product
product
,
MemberBase
memberBase
)
{
try
{
StocksCode
stocksCode
=
new
StocksCode
();
stocksCode
.
setSymbol
(
remindCommonTask
.
getCode
());
stocksCode
.
setName
(
remindCommonTask
.
getStockProductName
());
//昨日收盘价
stocksCode
.
setRecentClosingPrice
(
remindCommonTask
.
getClose
());
Pair
<
BigDecimal
,
BigDecimal
>
pair
=
financeCalculateService
.
calculatePriceLimit
(
stocksCode
);
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
BigDecimalUtil
.
compare
(
pair
.
getRight
(),
remindCommonTask
.
getNow
(),
0
))
{
List
<
Long
>
longList
=
new
ArrayList
<>();
for
(
Long
aLong
:
adminListId
)
{
String
redisKey
=
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uplimit:"
+
"memberBase:"
+
remindCommonTask
.
getMemberId
()
+
"productType:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
();
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
redisUtil
.
set
(
redisKey
,
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
String
cole
=
null
;
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
)))
{
cole
=
"#FF0000"
;
}
else
{
cole
=
"#0000FF"
;
}
//【客户姓名】【产品名称】的【股票名称/股票代码】涨停,请及时查看!
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
()))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】涨停,请及时查看!"
;
//推送企业群消息
remindCommonTask
.
setTodayYields
(
"涨停"
);
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
null
;
// this.snedCustomer(remindCommonTask, product, datas, memberBase);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//发送公众号
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"涨停错误信息:{},参数信息"
,
e
,
remindCommonTask
);
}
}
/**
* 跌停
*/
public
void
lowLimit
(
RemindCommonTask
remindCommonTask
,
Product
product
,
MemberBase
memberBase
)
{
try
{
StocksCode
stocksCode
=
new
StocksCode
();
stocksCode
.
setSymbol
(
remindCommonTask
.
getCode
());
stocksCode
.
setName
(
remindCommonTask
.
getStockName
());
//昨日收盘价
stocksCode
.
setRecentClosingPrice
(
remindCommonTask
.
getClose
());
Pair
<
BigDecimal
,
BigDecimal
>
pair
=
financeCalculateService
.
calculatePriceLimit
(
stocksCode
);
if
(
BigDecimalUtil
.
compare
(
pair
.
getLeft
(),
remindCommonTask
.
getNow
(),
0
))
{
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
List
<
Long
>
longList
=
new
ArrayList
<>();
for
(
Long
aLong
:
adminListId
)
{
String
redisKey
=
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"lowlimit:"
+
"memberBase:"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
();
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
redisUtil
.
set
(
redisKey
,
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
String
cole
=
null
;
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
)))
{
cole
=
"#FF0000"
;
}
else
{
cole
=
"#0000FF"
;
}
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
()))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】跌停,请及时查看!"
;
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
remindCommonTask
.
setTodayYields
(
"跌停"
);
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
null
;
// this.snedCustomer(remindCommonTask, product, datas, memberBase);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//发送公众号
log
.
info
(
"异动提醒:发送日志:{},数据:{},类型:{},路径:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
,
jumpUrl
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"跌停错误信息:{},参数信息"
,
e
,
remindCommonTask
);
}
}
/**
* 发送客户
*/
public
String
snedCustomer
(
RemindCommonTask
remindCommonTask
,
Product
product
,
TemplateKeyWordBuilder
datas
,
MemberBase
memberBase
)
{
log
.
info
(
"发送客户参数:{},产品:{},描述:{},用户信息:{}"
,
remindCommonTask
,
product
,
datas
,
memberBase
);
String
jumpUrl
=
null
;
try
{
if
(!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getSendCustomerState
())
&&
remindCommonTask
.
getSendCustomerState
()
>
0
&&
StringUtil
.
isNotEmpty
(
memberBase
.
getName
())
&&
!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getTpFansId
()))
{
jumpUrl
=
this
.
getJumpUrl
(
remindCommonTask
);
log
.
info
(
"发送客户消息:{},类型:{},fansId:{},地址:{},Data:{}"
,
memberBase
.
getName
(),
TemplateUserType
.
USER
,
remindCommonTask
.
getTpFansId
(),
datas
);
weChatTemplateMessageService
.
pushToFans
(
memberBase
.
getName
(),
TemplateUserType
.
USER
,
remindCommonTask
.
getTpFansId
(),
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"发送客户错误信息:{},参数信息"
,
e
,
remindCommonTask
);
}
return
jumpUrl
;
}
public
String
getJumpUrl
(
RemindCommonTask
remindCommonTask
)
{
if
(!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getSendCustomerState
())
&&
remindCommonTask
.
getSendCustomerState
()
>
0
)
{
//发送公众号
String
jumpUrl
=
null
;
Long
redisId
=
SnowflakeIdWorker
.
nextId
();
if
(!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getHyperlinkState
())
&&
remindCommonTask
.
getHyperlinkState
()
>
0
)
{
jumpUrl
=
commonConfig
.
getCustomeUrlr
()
+
"?id="
+
redisId
;
}
redisUtil
.
set
(
RedisKeyMessageConstant
.
REDIS_SEND_CM_KEY
+
redisId
,
remindCommonTask
.
getCode
());
return
jumpUrl
;
}
return
null
;
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/ChangeRemindTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.alibaba.druid.util.StringUtils
;
import
com.github.pagehelper.util.StringUtil
;
import
com.zfxf.tools.wechat.helper.api.TemplateKeyWordBuilder
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.constant.AdminConstant
;
import
com.zfxftech.telmarket.common.constant.webhook.MonitoringEnum
;
import
com.zfxftech.telmarket.common.enums.remind.InformTypeEnums
;
import
com.zfxftech.telmarket.common.enums.remind.TransactionRemindEnums
;
import
com.zfxftech.telmarket.common.pojo.dao.*
;
import
com.zfxftech.telmarket.common.pojo.dao.asset.AssetProduct
;
import
com.zfxftech.telmarket.common.pojo.dao.followAccount.FollowAccountPositionInfo
;
import
com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin
;
import
com.zfxftech.telmarket.common.pojo.dao.remind.*
;
import
com.zfxftech.telmarket.common.pojo.dao.smart.SmartProduct
;
import
com.zfxftech.telmarket.common.pojo.dao.webhook.ChatbotSend
;
import
com.zfxftech.telmarket.common.pojo.vo.followAccount.FollowAccountVo
;
import
com.zfxftech.telmarket.common.util.BigDecimalUtil
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.common.util.RedisUtil
;
import
com.zfxftech.telmarket.service.UsAdminService
;
import
com.zfxftech.telmarket.service.business.*
;
import
com.zfxftech.telmarket.service.business.asset.AssetProductService
;
import
com.zfxftech.telmarket.service.business.smart.SmartProductService
;
import
com.zfxftech.telmarket.service.business.webhook.ChatbotSendService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountPositionInfoService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountService
;
import
com.zfxftech.telmarket.service.remind.RemindProductService
;
import
com.zfxftech.telmarket.service.remind.RemindRoleService
;
import
com.zfxftech.telmarket.service.remind.RemindService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.tuple.Pair
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
javax.annotation.Resource
;
import
java.math.BigDecimal
;
import
java.text.DecimalFormat
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicReference
;
import
java.util.stream.Collectors
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
GREATER
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
LESS
;
/**
* 跟投
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
ChangeRemindTask
implements
ApplicationRunner
{
@Resource
RemindService
remindService
;
@Resource
RemindProductService
remindProductService
;
@Resource
RemindRoleService
remindRoleService
;
@Resource
StockCodeService
stockCodeService
;
@Resource
FollowAccountPositionInfoService
followAccountPositionInfoService
;
@Resource
private
StockPositionService
stockPositionService
;
@Resource
FinanceCalculateService
financeCalculateService
;
@Resource
RedisUtil
redisUtil
;
@Resource
WeChatTemplateMessageService
weChatTemplateMessageService
;
@Resource
UsAdminService
usAdminService
;
@Resource
FollowAccountService
followAccountService
;
@Resource
ProductService
productService
;
@Autowired
private
CommonConfig
commonConfig
;
@Autowired
AccountProductRelationService
accountProductRelationService
;
@Autowired
private
ChatbotSendService
chatbotSendService
;
@Autowired
private
UsMemberBaseService
usMemberBaseService
;
@Autowired
private
AssetProductService
assetProductService
;
@Autowired
private
SmartProductService
smartProductService
;
private
static
DecimalFormat
df2
=
new
DecimalFormat
(
"0.00%"
);
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"开始正式环境日志输出"
);
// commonConfig.setChangeRemindTaskSwitch("run");
log
.
info
(
"开始启动异动提醒配置更新开关状态:"
+
commonConfig
.
getChangeRemindTaskSwitch
());
if
(
commonConfig
.
getChangeRemindTaskSwitch
()
!=
null
&&
commonConfig
.
getChangeRemindTaskSwitch
().
equals
(
"run"
))
{
//分页查询异动配置列表
ExecutorService
executorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorService1
=
Executors
.
newFixedThreadPool
(
20
);
CompletableFuture
.
runAsync
(()
->
{
while
(
true
)
{
if
(
DateUtil
.
isTradeDay
())
{
AtomicReference
<
Integer
>
pageNo
=
new
AtomicReference
<>(
1
);
Integer
pageSize
=
200
;
Date
startTime
=
new
Date
();
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
List
<
RemindProductRoleTask
>
list
=
remindService
.
getTaskRemindList
(
pageNo
.
get
(),
pageSize
);
if
(!
ObjectUtils
.
isEmpty
(
list
))
{
pageNo
.
set
(
pageNo
.
get
()
+
1
);
//根据
//私人订制
for
(
RemindProductRoleTask
productRoleTask
:
list
)
{
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
try
{
//跟投账户
if
(
productRoleTask
.
getProductType
().
equals
(
AdminConstant
.
MemberProductTypeEnum
.
FOLLOW_UP
.
getCode
()))
{
//根据产品id获取对应股票
List
<
FollowAccountPositionInfo
>
infoList
=
followAccountPositionInfoService
.
getFollowAccountPositionInfoByFollowAccountId
(
productRoleTask
.
getProductId
().
intValue
());
//根据股票获取对应的发送对象
if
(!
ObjectUtils
.
isEmpty
(
infoList
))
{
this
.
checkPrice
(
productRoleTask
,
infoList
);
}
}
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
log
.
error
(
"异动提醒数据出错"
,
e
);
}
return
""
;
},
executorService1
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
info
(
"出错啦"
,
ex
);
System
.
out
.
println
(
ex
.
getMessage
());
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
}
}
else
{
pageNo
.
set
(
1
);
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
combinedFuture
.
get
();
log
.
info
(
"异地提醒--------主线程开始阻塞,消息发送完成--------"
);
log
.
info
(
"移动提醒,本次共计算"
+
(
ObjectUtils
.
isEmpty
(
list
)
==
true
?
0
:
list
.
size
())
+
"异动提醒数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
try
{
Thread
.
sleep
(
8000
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
},
executorService
);
}
}
//跟投账户
public
void
checkPrice
(
RemindProductRoleTask
productRoleTask
,
List
<
FollowAccountPositionInfo
>
list
)
{
for
(
FollowAccountPositionInfo
followAccountPositionInfo
:
list
)
{
List
<
Integer
>
roleIdList
=
new
ArrayList
<>();
//查询 角色
List
<
RemindRole
>
roleList
=
remindRoleService
.
selectByRemindId
(
productRoleTask
.
getId
());
if
(
ObjectUtil
.
isNotEmpty
(
list
))
{
roleIdList
=
roleList
.
stream
().
map
(
RemindRole:
:
getRoleId
).
collect
(
Collectors
.
toList
());
}
if
((!
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
ANALYST
.
getCode
()))
||
(!
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_MANAGER
.
getCode
())))
{
continue
;
}
try
{
String
analystName
=
null
;
Long
adminId
=
null
;
FollowAccountVo
followAccountVo
=
followAccountService
.
getFollowAccountById
(
followAccountPositionInfo
.
getFollowAccountId
());
String
productName
=
null
;
if
(!
ObjectUtils
.
isEmpty
(
followAccountVo
)
&&
StringUtil
.
isNotEmpty
(
followAccountVo
.
getProductName
()))
{
productName
=
followAccountVo
.
getProductName
();
}
//获取分析师
if
(
ObjectUtil
.
isNotEmpty
(
followAccountVo
.
getAnalyst
()))
{
//获取分析师id
UsAdmin
usAdmin
=
usAdminService
.
getAdminByUserId
(
String
.
valueOf
(
followAccountVo
.
getAnalyst
()));
if
(!
ObjectUtils
.
isEmpty
(
usAdmin
)
&&
StringUtil
.
isNotEmpty
(
usAdmin
.
getNickName
()))
{
analystName
=
usAdmin
.
getNickName
();
adminId
=
usAdmin
.
getId
();
//涨跌幅
if
(
String
.
valueOf
(
TransactionRemindEnums
.
RiseAndFall
.
getCode
()).
equals
(
String
.
valueOf
(
productRoleTask
.
getChangeType
())))
{
Quote
quote
=
stockCodeService
.
getStockQuote
(
followAccountPositionInfo
.
getCode
());
//缓存redis设置时间为12小时
if
(
quote
.
getNow
().
subtract
(
quote
.
getClose
()).
divide
(
quote
.
getClose
(),
4
,
BigDecimal
.
ROUND_HALF_DOWN
).
compareTo
(
productRoleTask
.
getProportion
())
==
1
)
{
//发送公众号
String
cole
=
null
;
String
variate
=
null
;
DecimalFormat
df2
=
new
DecimalFormat
(
"0.00%"
);
if
(
BigDecimalUtil
.
compare
(
productRoleTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
())
&&
BigDecimalUtil
.
ge
(
followAccountPositionInfo
.
getTodayYields
(),
productRoleTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
followAccountPositionInfo
.
getTodayYields
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
()))
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"rose"
)))
{
continue
;
}
cole
=
"#FF0000"
;
variate
=
"涨"
+
df2
.
format
(
productRoleTask
.
getProportion
())
+
","
+
"请及时查看"
;
if
(
StringUtil
.
isNotEmpty
(
analystName
)
&&
StringUtil
.
isNotEmpty
(
productName
)
&&
StringUtil
.
isNotEmpty
(
followAccountPositionInfo
.
getName
())
&&
StringUtil
.
isNotEmpty
(
followAccountPositionInfo
.
getCode
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
analystName
+
"】"
+
" "
+
"【"
+
productName
+
"】"
+
"的"
+
"【"
+
followAccountPositionInfo
.
getName
()
+
"/"
+
followAccountPositionInfo
.
getCode
()
+
"】"
+
variate
;
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
log
.
info
(
"异动提醒:发送日志:{}"
,
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
weChatTemplateMessageService
.
pushToAdminUser
(
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
redisUtil
.
set
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"rose"
,
"rose"
,
12L
,
TimeUnit
.
HOURS
);
}
}
if
(
BigDecimalUtil
.
compare
(
productRoleTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
())
&&
BigDecimalUtil
.
le
(
followAccountPositionInfo
.
getTodayYields
(),
productRoleTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
followAccountPositionInfo
.
getTodayYields
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
()))
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
)))
{
continue
;
}
cole
=
"#0000FF"
;
variate
=
"跌"
+
df2
.
format
(
productRoleTask
.
getProportion
())
+
","
+
"请及时查看"
;
if
(
StringUtil
.
isNotEmpty
(
analystName
)
&&
StringUtil
.
isNotEmpty
(
productName
)
&&
StringUtil
.
isNotEmpty
(
followAccountPositionInfo
.
getName
())
&&
StringUtil
.
isNotEmpty
(
followAccountPositionInfo
.
getCode
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
analystName
+
"】"
+
" "
+
"【"
+
productName
+
"】"
+
"的"
+
"【"
+
followAccountPositionInfo
.
getName
()
+
"/"
+
followAccountPositionInfo
.
getCode
()
+
"】"
+
variate
;
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
log
.
info
(
"异动提醒:发送日志:{}"
,
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
weChatTemplateMessageService
.
pushToAdminUser
(
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
redisUtil
.
set
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
,
"fall"
,
12L
,
TimeUnit
.
HOURS
);
}
}
}
}
//收益率
if
(
String
.
valueOf
(
TransactionRemindEnums
.
PROFITRATE
.
getCode
()).
equals
(
String
.
valueOf
(
productRoleTask
.
getChangeType
())))
{
// 正收益率
if
(
ObjectUtil
.
isNotNull
(
followAccountPositionInfo
.
getYields
())
&&
BigDecimalUtil
.
ge
(
followAccountPositionInfo
.
getYields
(),
productRoleTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
followAccountPositionInfo
.
getYields
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
()))
{
//进入发送消息
String
cole
=
null
;
String
variate
=
null
;
DecimalFormat
df2
=
new
DecimalFormat
(
"0.00%"
);
if
(
BigDecimalUtil
.
ge
(
productRoleTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
)))
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uprightYield"
)))
{
continue
;
}
cole
=
"#FF0000"
;
variate
=
"的收益率到达"
+
df2
.
format
(
productRoleTask
.
getProportion
())
+
","
+
"请及时查看"
;
}
df2
.
format
(
productRoleTask
.
getProportion
());
if
(
StringUtil
.
isNotEmpty
(
analystName
)
&&
StringUtil
.
isNotEmpty
(
productName
)
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
analystName
+
"】"
+
" "
+
"【"
+
productName
+
"】"
+
variate
;
// 客户姓名】【产品名称】的收益率到达+8%,请及时查看
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
log
.
info
(
"异动提醒:发送日志:{}"
,
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
weChatTemplateMessageService
.
pushToAdminUser
(
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
redisUtil
.
set
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uprightYield"
,
"uprightYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
//负收益
if
(!
ObjectUtils
.
isEmpty
(
followAccountPositionInfo
.
getYields
())
&&
BigDecimalUtil
.
le
(
followAccountPositionInfo
.
getYields
(),
productRoleTask
.
getProportion
())
&&
BigDecimalUtil
.
le
(
productRoleTask
.
getProportion
(),
new
BigDecimal
(
0
))
&&
BigDecimalUtil
.
compare
(
followAccountPositionInfo
.
getYields
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
()))
{
//进入发送消息
String
cole
=
null
;
String
variate
=
null
;
DecimalFormat
df2
=
new
DecimalFormat
(
"0.00%"
);
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"loadYield"
)))
{
continue
;
}
cole
=
"#FF0000"
;
variate
=
"收益率跌"
+
df2
.
format
(
productRoleTask
.
getProportion
())
+
","
+
"请及时查看"
;
df2
.
format
(
productRoleTask
.
getProportion
());
if
(
StringUtil
.
isNotEmpty
(
analystName
)
&&
StringUtil
.
isNotEmpty
(
productName
)
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
analystName
+
"】"
+
" "
+
"【"
+
productName
+
"】"
+
"的"
+
"【"
+
followAccountPositionInfo
.
getName
()
+
"/"
+
followAccountPositionInfo
.
getCode
()
+
"】"
+
variate
;
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
log
.
info
(
"异动提醒:发送日志:{}"
,
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
weChatTemplateMessageService
.
pushToAdminUser
(
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
redisUtil
.
set
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"loadYield"
,
"fall"
,
12L
,
TimeUnit
.
HOURS
);
}
}
}
Quote
quote
=
stockCodeService
.
queryStockPrice
(
followAccountPositionInfo
.
getCode
());
//涨停
if
(
String
.
valueOf
(
TransactionRemindEnums
.
UPLIMIT
.
getCode
()).
equals
(
String
.
valueOf
(
productRoleTask
.
getChangeType
())))
{
StocksCode
stocksCode
=
new
StocksCode
();
stocksCode
.
setSymbol
(
followAccountPositionInfo
.
getCode
());
stocksCode
.
setName
(
quote
.
getName
());
//昨日收盘价
stocksCode
.
setRecentClosingPrice
(
quote
.
getClose
());
Pair
<
BigDecimal
,
BigDecimal
>
pair
=
financeCalculateService
.
calculatePriceLimit
(
stocksCode
);
if
(
BigDecimalUtil
.
compare
(
pair
.
getRight
(),
quote
.
getNow
(),
0
))
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
UPLIMIT
.
getCode
()
+
"uplimit"
)))
{
continue
;
}
String
cole
=
null
;
if
(
BigDecimalUtil
.
ge
(
productRoleTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
)))
{
cole
=
"#FF0000"
;
}
else
{
cole
=
"#0000FF"
;
}
//【客户姓名】【产品名称】的【股票名称/股票代码】涨停,请及时查看!
if
(
StringUtil
.
isNotEmpty
(
analystName
)
&&
StringUtil
.
isNotEmpty
(
productName
)
&&
StringUtil
.
isNotEmpty
(
followAccountPositionInfo
.
getCode
()))
{
String
remark
=
"【"
+
analystName
+
"】"
+
" "
+
"【"
+
productName
+
"】"
+
"的"
+
"【"
+
followAccountPositionInfo
.
getName
()
+
"/"
+
followAccountPositionInfo
.
getCode
()
+
"】涨停,请及时查看!"
;
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
log
.
info
(
"异动提醒:发送日志:{}"
,
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
weChatTemplateMessageService
.
pushToAdminUser
(
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
redisUtil
.
set
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
UPLIMIT
.
getCode
()
+
"uplimit"
,
"uplimit"
,
12L
,
TimeUnit
.
HOURS
);
}
}
}
if
(
String
.
valueOf
(
TransactionRemindEnums
.
LOWLIMIT
.
getCode
()).
equals
(
String
.
valueOf
(
productRoleTask
.
getChangeType
())))
{
StocksCode
stocksCode
=
new
StocksCode
();
stocksCode
.
setSymbol
(
followAccountPositionInfo
.
getCode
());
stocksCode
.
setName
(
quote
.
getName
());
//昨日收盘价
stocksCode
.
setRecentClosingPrice
(
quote
.
getClose
());
Pair
<
BigDecimal
,
BigDecimal
>
pair
=
financeCalculateService
.
calculatePriceLimit
(
stocksCode
);
if
(
BigDecimalUtil
.
compare
(
pair
.
getLeft
(),
quote
.
getNow
(),
0
))
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
LOWLIMIT
.
getCode
()
+
"lowlimit"
)))
{
continue
;
}
String
cole
=
null
;
if
(
BigDecimalUtil
.
ge
(
productRoleTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
)))
{
cole
=
"#FF0000"
;
}
else
{
cole
=
"#0000FF"
;
}
//【客户姓名】【产品名称】的【股票名称/股票代码】跌停,请及时查看!
if
(
StringUtil
.
isNotEmpty
(
analystName
)
&&
StringUtil
.
isNotEmpty
(
productName
)
&&
StringUtil
.
isNotEmpty
(
followAccountPositionInfo
.
getCode
()))
{
String
remark
=
"【"
+
analystName
+
"】"
+
" "
+
"【"
+
productName
+
"】"
+
"的"
+
"【"
+
followAccountPositionInfo
.
getName
()
+
"/"
+
followAccountPositionInfo
.
getCode
()
+
"】跌停,请及时查看!"
;
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
log
.
info
(
"异动提醒:发送日志:{}"
,
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
weChatTemplateMessageService
.
pushToAdminUser
(
adminId
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
redisUtil
.
set
(
"followaccount:"
+
followAccountPositionInfo
.
getCode
()
+
"userId:"
+
adminId
+
"type:"
+
TransactionRemindEnums
.
LOWLIMIT
.
getCode
()
+
"lowlimit"
,
"lowlimit"
,
12L
,
TimeUnit
.
HOURS
);
}
}
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"跟投账户异动提醒错误信息:{}"
,
e
);
}
}
}
private
TemplateKeyWordBuilder
getTemplateKeyWordBuilder
(
String
cole
,
String
remark
)
{
return
TemplateKeyWordBuilder
.
create
()
.
addFirst
(
DateUtil
.
getMonthDayStr
())
.
addKeyWord
(
"【个股异动监控】"
)
.
addKeyWord
(
DateUtil
.
getNow
())
.
addRemark
(
remark
,
cole
);
}
//私人订制
public
void
checkPriceFollowAccount
(
RemindProductRoleTask
productRoleTask
,
Product
product
)
{
//获取code
List
<
StockPosition
>
positionList
=
stockPositionService
.
getCode
(
product
.
getId
());
log
.
info
(
"持仓数据大小:{},产品id:{}"
,
positionList
==
null
?
0
:
positionList
.
size
(),
product
.
getId
());
if
(
ObjectUtil
.
isEmpty
(
positionList
)
||
positionList
.
size
()
<=
0
)
{
return
;
}
// ExecutorService executorService1 = Executors.newFixedThreadPool(9);
for
(
StockPosition
stockPosition
:
positionList
)
{
// CompletableFuture cf = CompletableFuture.supplyAsync(() -> {
Quote
quote
=
stockCodeService
.
getStockQuote
(
stockPosition
.
getCode
());
log
.
info
(
"异动提醒私人订制股票代码:{},名称:{},价格:{},股票价格:{},"
,
quote
.
getCode
(),
quote
.
getName
(),
stockPosition
.
getCost
(),
quote
.
getNow
());
AccountProductRelation
istrue
=
accountProductRelationService
.
queryAccountProductRelationByMarketInfo
(
stockPosition
.
getMarketId
(),
AdminConstant
.
MarketTypeEnum
.
SIMULATED
.
getCode
());
if
(!
ObjectUtils
.
isEmpty
(
istrue
)
&&
ObjectUtil
.
isNotEmpty
(
stockPosition
.
getCount
())
&&
stockPosition
.
getCount
()
>
0
)
{
List
<
Integer
>
roleIdList
=
new
ArrayList
<>();
//查询 角色
List
<
RemindRole
>
list
=
remindRoleService
.
selectByRemindId
(
productRoleTask
.
getId
());
if
(
ObjectUtil
.
isNotEmpty
(
list
))
{
roleIdList
=
list
.
stream
().
map
(
RemindRole:
:
getRoleId
).
collect
(
Collectors
.
toList
());
}
if
(!
ObjectUtils
.
isEmpty
(
roleIdList
)
&&
((
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
ANALYST
.
getCode
()))
||
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
.
getCode
()))
||
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_MANAGER
.
getCode
()))))
{
List
<
Long
>
adminListId
=
new
ArrayList
<>();
if
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
ANALYST
.
getCode
()))
{
//分析师
UsAdmin
usAdmin
=
usAdminService
.
getAdminByUserId
(
String
.
valueOf
(
product
.
getAnalyst
()));
if
(
ObjectUtil
.
isNotEmpty
(
usAdmin
)
&&
ObjectUtil
.
isNotEmpty
(
usAdmin
.
getId
()))
{
adminListId
.
add
(
usAdmin
.
getId
());
}
}
if
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
.
getCode
()))
{
//获取公司下所有的主管 //获取销售总监userid
List
<
SelectionBox2
>
listManager
=
usAdminService
.
getUserListByRoleAndCompanyId
(
product
.
getCompanyId
().
intValue
(),
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
);
if
(
ObjectUtil
.
isNotEmpty
(
listManager
)
&&
listManager
.
size
()
>
0
)
{
adminListId
.
addAll
(
listManager
.
stream
().
map
(
SelectionBox2:
:
getId
).
collect
(
Collectors
.
toList
()));
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
continue
;
// return " ";
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
continue
;
// return " ";
}
RemindCommonTask
remindCommonTask
=
new
RemindCommonTask
();
//收益率
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
.
getProfitLossRatio
()))
{
remindCommonTask
.
setProfitLossRatio
(
stockPosition
.
getProfitLossRatio
());
}
//成交价格
remindCommonTask
.
setRiseDownRange
(
stockPosition
.
getRiseDownRange
());
//阈值
remindCommonTask
.
setProportion
(
productRoleTask
.
getProportion
());
remindCommonTask
.
setWebHookUrl
(
productRoleTask
.
getWebHookUrl
());
//持仓时间
remindCommonTask
.
setCreateTime
(
stockPosition
.
getCreatedTime
());
remindCommonTask
.
setMemberId
(
memberBase
.
getId
());
remindCommonTask
.
setMemberName
(
memberBase
.
getName
());
remindCommonTask
.
setRemindId
(
productRoleTask
.
getId
());
remindCommonTask
.
setStockProductName
(
product
.
getProductName
());
remindCommonTask
.
setCode
(
stockPosition
.
getCode
());
remindCommonTask
.
setStockName
(
stockPosition
.
getName
());
remindCommonTask
.
setClose
(
quote
.
getClose
());
remindCommonTask
.
setNow
(
quote
.
getNow
());
//产品类型
remindCommonTask
.
setProductType
(
AdminConstant
.
MemberProductTypeEnum
.
PREMIUM
.
getCode
());
remindCommonTask
.
setAdminIdList
(
adminListId
);
//涨跌幅
if
(
String
.
valueOf
(
TransactionRemindEnums
.
RiseAndFall
.
getCode
()).
equals
(
String
.
valueOf
(
productRoleTask
.
getChangeType
())))
{
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
RiseAndFall
.
getCode
().
toString
());
this
.
riseAndFall
(
remindCommonTask
);
}
//收益率
if
(
String
.
valueOf
(
TransactionRemindEnums
.
PROFITRATE
.
getCode
()).
equals
(
String
.
valueOf
(
productRoleTask
.
getChangeType
())))
{
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
PROFITRATE
.
getCode
().
toString
());
this
.
profitrate
(
remindCommonTask
);
}
//涨停
if
(
String
.
valueOf
(
TransactionRemindEnums
.
UPLIMIT
.
getCode
()).
equals
(
String
.
valueOf
(
productRoleTask
.
getChangeType
())))
{
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
UPLIMIT
.
getCode
().
toString
());
this
.
uplimit
(
remindCommonTask
);
}
if
(
String
.
valueOf
(
TransactionRemindEnums
.
LOWLIMIT
.
getCode
()).
equals
(
String
.
valueOf
(
productRoleTask
.
getChangeType
())))
{
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
LOWLIMIT
.
getCode
().
toString
());
this
.
lowLimit
(
remindCommonTask
);
}
}
}
// return "";
// }, executorService1).handle((result, ex) -> {
// if (null != ex) {
// log.info("出错啦", ex);
// System.out.println(ex.getMessage());
// return 0;
// } else {
// return result;
// }
// });
}
}
/**
* 组装数据
*/
private
void
sendWbeHooks
(
WebHookCommonTask
webHookCommonTask
)
{
log
.
info
(
"推送企业消息参数:{}"
,
webHookCommonTask
);
ChatbotSend
chatbotSend
=
new
ChatbotSend
();
chatbotSend
.
setCustomerId
(
webHookCommonTask
.
getCustomerId
().
intValue
());
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
webHookCommonTask
.
getCustomerId
());
if
(
ObjectUtil
.
isNotEmpty
(
memberBase
)
&&
StringUtil
.
isNotEmpty
(
memberBase
.
getName
()))
{
chatbotSend
.
setCustomerName
(
memberBase
.
getName
());
}
//股票代码
chatbotSend
.
setStockCode
(
webHookCommonTask
.
getCode
());
chatbotSend
.
setStockName
(
webHookCommonTask
.
getStockName
());
chatbotSend
.
setMemberProductTypeEnumCode
(
webHookCommonTask
.
getProductType
());
chatbotSend
.
setTodayYields
(
webHookCommonTask
.
getTodayYields
());
chatbotSend
.
setRemindUrl
(
webHookCommonTask
.
getWebHookUrl
());
chatbotSend
.
setRemindId
(
webHookCommonTask
.
getRemindId
().
intValue
());
chatbotSend
.
setMonitoringType
(
MonitoringEnum
.
STOCKMONITORING
.
getCode
());
chatbotSend
.
setBuyToday
(
DateUtil
.
isOnToday
(
webHookCommonTask
.
getCreateTime
())
==
true
?
1
:
2
);
chatbotSend
.
setProductType
(
webHookCommonTask
.
getProductType
());
chatbotSendService
.
send
(
chatbotSend
);
}
/**
* 修改项目名称
*/
@Scheduled
(
cron
=
"0 0/5 * * * ?"
)
private
void
changeProductName
()
{
log
.
info
(
"修改项目名称开始:"
);
Integer
pageSize
=
100
;
AtomicReference
<
Integer
>
pageNo
=
new
AtomicReference
<>(
1
);
Boolean
change
=
true
;
while
(
change
)
{
List
<
RemindProduct
>
list
=
remindProductService
.
getTaskRemindList
(
pageNo
.
get
(),
pageSize
);
if
(
ObjectUtil
.
isNotEmpty
(
list
))
{
pageNo
.
set
(
pageNo
.
get
()
+
1
);
for
(
RemindProduct
remindProduct
:
list
)
{
try
{
//跟投账户
if
(
remindProduct
.
getProductType
().
equals
(
AdminConstant
.
MemberProductTypeEnum
.
FOLLOW_UP
.
getCode
()))
{
FollowAccountVo
followAccountVo
=
followAccountService
.
getFollowAccountById
(
remindProduct
.
getProductId
().
intValue
());
if
(
ObjectUtil
.
isNotEmpty
(
followAccountVo
)
&&
StringUtil
.
isNotEmpty
(
followAccountVo
.
getProductName
())
&&
(
StringUtil
.
isNotEmpty
(
remindProduct
.
getProductName
())
||
!
followAccountVo
.
getProductName
().
equals
(
remindProduct
.
getProductName
())))
{
//更改项目名称
remindProduct
.
setProductName
(
followAccountVo
.
getProductName
());
remindProductService
.
updateByPrimaryKeySelective
(
remindProduct
);
}
}
//私人定制
if
(
remindProduct
.
getProductType
().
equals
(
AdminConstant
.
MemberProductTypeEnum
.
PREMIUM
.
getCode
()))
{
Product
product
=
productService
.
queryProductById
(
remindProduct
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isNotEmpty
(
product
)
&&
StringUtil
.
isNotEmpty
(
product
.
getProductName
())
&&
(
StringUtil
.
isEmpty
(
remindProduct
.
getProductName
())
||
!
product
.
getProductName
().
equals
(
remindProduct
.
getProductName
())))
{
//更改项目名称
remindProduct
.
setProductName
(
product
.
getProductName
());
remindProductService
.
updateByPrimaryKeySelective
(
remindProduct
);
}
}
//私人定制
if
(
remindProduct
.
getProductType
().
equals
(
AdminConstant
.
MemberProductTypeEnum
.
ASSET_TYPE
.
getCode
()))
{
AssetProduct
product
=
assetProductService
.
queryProductById
(
remindProduct
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isNotEmpty
(
product
)
&&
StringUtil
.
isNotEmpty
(
product
.
getProductName
())
&&
(
StringUtil
.
isEmpty
(
remindProduct
.
getProductName
())
||
!
product
.
getProductName
().
equals
(
remindProduct
.
getProductName
())))
{
//更改项目名称
remindProduct
.
setProductName
(
product
.
getProductName
());
remindProductService
.
updateByPrimaryKeySelective
(
remindProduct
);
}
}
//私人定制
if
(
remindProduct
.
getProductType
().
equals
(
AdminConstant
.
MemberProductTypeEnum
.
SMART_TYPE
.
getCode
()))
{
SmartProduct
product
=
smartProductService
.
queryProductById
(
remindProduct
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isNotEmpty
(
product
)
&&
StringUtil
.
isNotEmpty
(
product
.
getProductName
())
&&
(
StringUtil
.
isEmpty
(
remindProduct
.
getProductName
())
||
!
product
.
getProductName
().
equals
(
remindProduct
.
getProductName
())))
{
//更改项目名称
remindProduct
.
setProductName
(
product
.
getProductName
());
remindProductService
.
updateByPrimaryKeySelective
(
remindProduct
);
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"更新项目名称异常:{}"
,
e
);
}
}
}
else
{
change
=
false
;
}
}
}
/**
* 涨跌幅
*/
private
void
riseAndFall
(
RemindCommonTask
remindCommonTask
)
{
log
.
info
(
"涨幅数据参数:{}"
,
remindCommonTask
);
try
{
String
cole
=
null
;
String
variate
=
null
;
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getAdminIdList
())
||
remindCommonTask
.
getAdminIdList
().
size
()
<=
0
)
{
return
;
}
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getRiseDownRange
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getRiseDownRange
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
()))
{
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
remindCommonTask
.
getProductType
()
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
remindCommonTask
.
getProductType
()
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"rose"
,
12L
,
TimeUnit
.
HOURS
);
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#FF0000"
;
variate
=
"涨"
+
df2
.
format
(
remindCommonTask
.
getProportion
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"涨"
+
df2
.
format
(
remindCommonTask
.
getProportion
()));
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
));
}
}
if
(
BigDecimalUtil
.
le
(
remindCommonTask
.
getRiseDownRange
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getRiseDownRange
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
()))
{
cole
=
"#0000FF"
;
variate
=
"跌"
+
df2
.
format
(
remindCommonTask
.
getProportion
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"跌"
+
df2
.
format
(
remindCommonTask
.
getProportion
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
));
}
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"fall"
,
12L
,
TimeUnit
.
HOURS
);
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
}
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
!
StringUtils
.
isEmpty
(
variate
)
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】"
+
variate
;
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//循环发送数据用户id
log
.
info
(
"私人订制涨跌幅异动提醒:发送日志:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"涨幅数据错信息:{}"
,
e
);
}
}
public
void
profitrate
(
RemindCommonTask
remindCommonTask
)
{
try
{
// 收益率是持有股票 的盈亏比例
log
.
info
(
"异动提醒收益率盈亏比例参数:{}"
,
remindCommonTask
);
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
ObjectUtils
.
isEmpty
(
remindCommonTask
.
getProfitLossRatio
()))
{
return
;
}
String
cole
=
null
;
String
variate
=
null
;
log
.
info
(
"私人订制收益率日志输出div:{},productRoleTask.getProportion():{}"
,
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
());
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
))
&&
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProfitLossRatio
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
()))
{
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uprightYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
else
{
synchronized
(
this
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uprightYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
continue
;
}
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uprightYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"uprightYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#FF0000"
;
variate
=
"收益率到达"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"收益率到达"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
));
}
}
if
(
BigDecimalUtil
.
le
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
))
&&
BigDecimalUtil
.
le
(
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProfitLossRatio
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
()))
{
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"loadYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
else
{
synchronized
(
this
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"loadYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
continue
;
}
log
.
info
(
"收益率跌日志输出div:{},productRoleTask.getProportion():{}"
,
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
());
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uprightYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#0000FF"
;
variate
=
"收益率跌"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"收益率跌"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
));
}
}
df2
.
format
(
remindCommonTask
.
getProportion
());
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】"
+
variate
;
// 客户姓名】【产品名称】的收益率到达+8%,请及时查看
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
log
.
info
(
"私人订制收益率异动提醒:发送日志:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"盈亏比例错误信息:{}"
,
e
);
}
}
private
WebHookCommonTask
changeTask
(
RemindCommonTask
remindCommonTask
)
{
WebHookCommonTask
webHookCommonTask
=
new
WebHookCommonTask
();
//产品类型
webHookCommonTask
.
setProductType
(
remindCommonTask
.
getProductType
());
//客户id
webHookCommonTask
.
setCustomerId
(
remindCommonTask
.
getMemberId
());
//异动类型
webHookCommonTask
.
setChangeType
(
remindCommonTask
.
getChangeType
());
//异动id
webHookCommonTask
.
setRemindId
(
remindCommonTask
.
getRemindId
());
//股票名称
webHookCommonTask
.
setStockName
(
remindCommonTask
.
getStockName
());
//股票代码
webHookCommonTask
.
setCode
(
remindCommonTask
.
getCode
());
//持仓时间
webHookCommonTask
.
setCreateTime
(
remindCommonTask
.
getCreateTime
());
//当日涨幅
webHookCommonTask
.
setTodayYields
(
remindCommonTask
.
getTodayYields
());
//推送地址
webHookCommonTask
.
setWebHookUrl
(
remindCommonTask
.
getWebHookUrl
());
return
webHookCommonTask
;
}
/**
* 涨停
*/
public
void
uplimit
(
RemindCommonTask
remindCommonTask
)
{
try
{
StocksCode
stocksCode
=
new
StocksCode
();
stocksCode
.
setSymbol
(
remindCommonTask
.
getCode
());
stocksCode
.
setName
(
remindCommonTask
.
getStockProductName
());
//昨日收盘价
stocksCode
.
setRecentClosingPrice
(
remindCommonTask
.
getClose
());
Pair
<
BigDecimal
,
BigDecimal
>
pair
=
financeCalculateService
.
calculatePriceLimit
(
stocksCode
);
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
BigDecimalUtil
.
compare
(
pair
.
getRight
(),
remindCommonTask
.
getNow
(),
0
))
{
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uplimit:"
+
"memberBase:"
+
remindCommonTask
.
getMemberId
()
+
"productType:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uplimit:"
+
"memberBase:"
+
remindCommonTask
.
getMemberId
()
+
"productType:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"uplimit"
,
12L
,
TimeUnit
.
HOURS
);
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
String
cole
=
null
;
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
)))
{
cole
=
"#FF0000"
;
}
else
{
cole
=
"#0000FF"
;
}
//【客户姓名】【产品名称】的【股票名称/股票代码】涨停,请及时查看!
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
()))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】涨停,请及时查看!"
;
//推送企业群消息
remindCommonTask
.
setTodayYields
(
"涨停"
);
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
));
}
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//发送公众号
log
.
info
(
"异动提醒:发送日志:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"涨停错误信息:{},参数信息"
,
e
,
remindCommonTask
);
}
}
/**
* 跌停
*/
public
void
lowLimit
(
RemindCommonTask
remindCommonTask
)
{
try
{
StocksCode
stocksCode
=
new
StocksCode
();
stocksCode
.
setSymbol
(
remindCommonTask
.
getCode
());
stocksCode
.
setName
(
remindCommonTask
.
getStockName
());
//昨日收盘价
stocksCode
.
setRecentClosingPrice
(
remindCommonTask
.
getClose
());
Pair
<
BigDecimal
,
BigDecimal
>
pair
=
financeCalculateService
.
calculatePriceLimit
(
stocksCode
);
if
(
BigDecimalUtil
.
compare
(
pair
.
getLeft
(),
remindCommonTask
.
getNow
(),
0
))
{
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"lowlimit:"
+
"memberBase:"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"lowlimit:"
+
"memberBase:"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"lowlimit"
,
12L
,
TimeUnit
.
HOURS
);
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
String
cole
=
null
;
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
)))
{
cole
=
"#FF0000"
;
}
else
{
cole
=
"#0000FF"
;
}
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
()))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】跌停,请及时查看!"
;
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
remindCommonTask
.
setTodayYields
(
"跌停"
);
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
));
}
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//发送公众号
log
.
info
(
"异动提醒:发送日志:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"跌停错误信息:{},参数信息"
,
e
,
remindCommonTask
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/FollowAccountAutoSellStockTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.pojo.dao.followAccount.FollowAccount
;
import
com.zfxftech.telmarket.common.pojo.dao.followAccount.FollowAccountPositionInfo
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountPositionInfoService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountStockDealService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.scheduling.annotation.EnableScheduling
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.Date
;
import
java.util.List
;
/**
* Create time: 2022/2/3
*/
@EnableScheduling
@Component
@Slf4j
public
class
FollowAccountAutoSellStockTask
{
@Resource
FollowAccountPositionInfoService
followAccountPositionInfoService
;
@Scheduled
(
cron
=
"0 50 14 * * ?"
)
private
void
followAccountYieldsRecordRunTask
()
{
if
(
DateUtil
.
isTradeDay
()){
log
.
info
(
"开始自动卖出40个交易日前买入且依然在持仓的的股票"
);
Date
startTime
=
new
Date
();
followAccountPositionInfoService
.
autoSellStockBy40TradeDay
();
log
.
info
(
"完成自动卖出"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
else
{
log
.
info
(
"今天非交易日,退出自动卖出股票"
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/FollowAccountBuyInTwoStockRiskTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxf.tools.wechat.helper.api.TemplateKeyWordBuilder
;
import
com.zfxftech.telmarket.common.enums.remind.InformTypeEnums
;
import
com.zfxftech.telmarket.common.pojo.dao.followAccount.FollowAccount
;
import
com.zfxftech.telmarket.common.pojo.dao.followAccount.FollowAccountStockOrder
;
import
com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.service.UsAdminService
;
import
com.zfxftech.telmarket.service.business.WeChatTemplateMessageService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountStockDealService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountYieldsRecordService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.scheduling.annotation.EnableScheduling
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.math.BigDecimal
;
import
java.util.Date
;
import
java.util.List
;
/**
* Create time: 2022/2/3
*/
@EnableScheduling
@Component
@Slf4j
public
class
FollowAccountBuyInTwoStockRiskTask
{
@Resource
FollowAccountService
followAccountService
;
@Resource
FollowAccountStockDealService
followAccountStockDealService
;
@Resource
UsAdminService
usAdminService
;
@Resource
WeChatTemplateMessageService
weChatTemplateMessageService
;
@Scheduled
(
cron
=
"0 0 9 * * ?"
)
private
void
followAccountYieldsRecordRunTask
()
{
if
(
DateUtil
.
isLastTradeDayOfMonth
()){
log
.
info
(
"今天是本月最后一个交易日:开始计算跟投账户本月是否买入至少两只股票"
);
Date
startTime
=
new
Date
();
List
<
FollowAccount
>
list
=
followAccountService
.
getAllFollowAccount
();
for
(
FollowAccount
followAccount
:
list
){
if
(!
followAccountStockDealService
.
ifBugTowStockMonthly
(
followAccount
.
getId
())){
log
.
info
(
"跟投账户【"
+
followAccount
.
getProductName
()+
"】当月购买股票数量不足两只"
);
sendMsg
(
followAccount
);
}
}
log
.
info
(
"完成计算跟投账户本月是否买入至少两只股票 耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
else
{
log
.
info
(
"今天非本月最后一个交易日,退出计算"
);
}
}
private
void
sendMsg
(
FollowAccount
faLoad
){
UsAdmin
admin
=
usAdminService
.
getAdminByUserId
(
faLoad
.
getAnalyst
()
+
""
);
TemplateKeyWordBuilder
templateKeyWordBuilder
=
TemplateKeyWordBuilder
.
create
();
templateKeyWordBuilder
.
addFirst
(
"【"
+
"跟投账户提醒"
+
"】"
);
templateKeyWordBuilder
.
addKeyWord
(
DateUtil
.
getNow
());
String
stockInfo
=
"【 "
+
faLoad
.
getProductName
()
+
"】 本月买入交易不足2次,请及时操作交易! "
;
templateKeyWordBuilder
.
addKeyWord
(
stockInfo
,
"#FF3030"
);
templateKeyWordBuilder
.
addRemark
(
"投资建议仅供参考,据此操作风险自担!投资有风险,入市须谨慎!中方信富资格证书编号:zx0121。如有疑问请联系客服:4008888115。"
);
weChatTemplateMessageService
.
pushToAdminUser
(
admin
,
templateKeyWordBuilder
,
InformTypeEnums
.
TRADINGSTRATEGIES
);
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/FollowAccountFreeCountTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.pojo.dao.followAccount.FollowAccount
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountPositionInfoService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountYieldsRecordService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.scheduling.annotation.EnableScheduling
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.Date
;
import
java.util.List
;
/**
* Create time: 2022/2/3
*/
@EnableScheduling
@Component
@Slf4j
public
class
FollowAccountFreeCountTask
{
@Resource
FollowAccountService
followAccountService
;
@Resource
FollowAccountYieldsRecordService
followAccountYieldsRecordService
;
@Resource
FollowAccountPositionInfoService
followAccountPositionInfoService
;
@Scheduled
(
cron
=
"0 10 9 ? * MON-FRI"
)
private
void
followAccountYieldsRecordRunTask
()
{
try
{
log
.
info
(
"开始计算更新持仓可用股数"
);
Date
startTime
=
new
Date
();
followAccountPositionInfoService
.
updateFollowAccountPositionFreeCountByDay
();
log
.
info
(
"持仓可用股数更新完成 共耗时:"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
()));
}
catch
(
Exception
e
){
log
.
error
(
"持仓可用股数更新失败"
,
e
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/FollowAccountStatisticsTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.enums.followAccount.FollowAccountCommonStatusEnum
;
import
com.zfxftech.telmarket.common.enums.followAccount.FollowAccountConfigRuleTypeEnum
;
import
com.zfxftech.telmarket.common.enums.followAccount.FollowAccountOrderDirectionEnum
;
import
com.zfxftech.telmarket.common.enums.followAccount.FollowAccountOrderTypeEnum
;
import
com.zfxftech.telmarket.common.pojo.dao.Quote
;
import
com.zfxftech.telmarket.common.pojo.dao.followAccount.*
;
import
com.zfxftech.telmarket.common.pojo.dto.followAccount.FollowAccountDto
;
import
com.zfxftech.telmarket.common.pojo.request.followAccount.FollowAccountStockOrderReq
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.common.util.followAccount.FollowAccountLockUtil
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.followAccount.*
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
org.springframework.transaction.annotation.Isolation
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.web.bind.annotation.RestControllerAdvice
;
import
javax.annotation.Resource
;
import
java.math.BigDecimal
;
import
java.util.*
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
/**
* Create time: 2022/1/26
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
FollowAccountStatisticsTask
implements
ApplicationRunner
{
@Autowired
private
CommonConfig
commonConfig
;
@Resource
StockCodeService
stockCodeService
;
@Resource
FollowAccountService
followAccountService
;
@Resource
FollowAccountLockUtil
followAccountLockUtil
;
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"跟投账户整体数据更新开关状态:"
+
commonConfig
.
getFollowAccountStatisticsTaskSwitch
());
ExecutorService
executorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorService1
=
Executors
.
newFixedThreadPool
(
200
);
CompletableFuture
.
runAsync
(()
->
{
while
(
true
)
{
if
(
commonConfig
.
getFollowAccountStatisticsTaskSwitch
()
!=
null
&&
commonConfig
.
getFollowAccountStatisticsTaskSwitch
().
equals
(
"run"
))
{
log
.
info
(
"跟投账户整体数据更新任务开始启动"
);
Date
startTime
=
new
Date
();
int
size
=
0
;
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
if
(
DateUtil
.
isTradeDay
())
{
//List<CompletableFuture> cfList = new ArrayList();
List
<
FollowAccount
>
faList
=
new
ArrayList
<>();
try
{
faList
=
followAccountService
.
getAllFollowAccountByTask
();
size
=
faList
.
size
();
}
catch
(
Exception
e
){
log
.
error
(
"获取全部跟投账户数据准备进行计算出错"
,
e
);
e
.
printStackTrace
();
}
//开始循环跟投账户并计算
try
{
for
(
FollowAccount
followAccount
:
faList
)
{
//为每个跟投账户开启一个独立线程进行异步计算
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
//开始计算和更新持仓信息
try
{
//List<FollowAccountPositionInfo> infoList = positionInfoService.getFollowAccountPositionInfoByFollowAccountId(followAccount.getId());
followAccountService
.
followAccountPositionInfoStatisticsList
(
followAccount
);
}
catch
(
Exception
e
)
{
log
.
error
(
"跟投账户整体数据更新线程出错"
,
e
);
followAccountLockUtil
.
backLock
(
followAccount
.
getId
());
}
return
""
;
},
executorService1
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
info
(
"出错啦"
,
ex
);
System
.
out
.
println
(
ex
.
getMessage
());
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
}
}
catch
(
Exception
e
){
log
.
error
(
"跟投账户发生未知错误"
,
e
);
}
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
//log.info("全部跟投账户开始更新数据--------主线程开始阻塞,等待更新全部完成--------");
combinedFuture
.
get
();
log
.
info
(
"跟投账户数据计算完成,本次共计算"
+
size
+
"个跟投账户数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
catch
(
Exception
e
)
{
log
.
error
(
"跟投账户整体数据更新线程出错"
,
e
);
e
.
printStackTrace
();
}
}
else
{
//log.info("跟投账户整体数据更新任务开关状态为关闭,任务不启动");
}
try
{
Thread
.
sleep
(
5000
);
}
catch
(
Exception
e
){}
}
},
executorService
);
}
FollowAccountPositionInfo
getFollowAccountPositionInfoStatistics
(
FollowAccountPositionInfo
infoLoad
){
BigDecimal
price
=
stockCodeService
.
getStockQuote
(
infoLoad
.
getCode
()
+
""
).
getNow
();
BigDecimal
currentAmount
=
price
.
multiply
(
new
BigDecimal
(
infoLoad
.
getCount
()));
infoLoad
.
setCurrentAmount
(
currentAmount
);
infoLoad
.
setCurrentPrice
(
price
);
infoLoad
.
setYieldsAmount
(
currentAmount
.
subtract
(
infoLoad
.
getCostPrice
().
multiply
(
infoLoad
.
getCostPrice
())));
infoLoad
.
setYields
((
price
.
subtract
(
infoLoad
.
getCostPrice
())).
divide
(
infoLoad
.
getCostPrice
(),
4
,
BigDecimal
.
ROUND_HALF_DOWN
));
return
infoLoad
;
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/FollowAccountUserStatusTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.enums.followAccount.FollowAccountUserStatusEnum
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountPositionInfoService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountUserService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountYieldsRecordService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.scheduling.annotation.EnableScheduling
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.Date
;
/**
* Create time: 2022/2/3
*/
@EnableScheduling
@Component
@Slf4j
public
class
FollowAccountUserStatusTask
{
@Resource
FollowAccountUserService
followAccountUserService
;
@Scheduled
(
cron
=
"0 15 9 * * MON-FRI"
)
private
void
followAccountYieldsRecordRunTask
()
{
try
{
log
.
info
(
"开始启动更新跟投账户用户状态任务"
);
Date
startTime
=
new
Date
();
followAccountUserService
.
updateFollowAccountUserStatus
();
log
.
info
(
"更新跟投账户用户状态任务完成 共耗时:"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
()));
}
catch
(
Exception
e
){
log
.
error
(
"更新跟投账户用户状态任务"
,
e
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/PersonalAccountPositionTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.service.business.AccountProductRelationService
;
import
com.zfxftech.telmarket.service.business.FinanceCalculateService
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.business.StockPositionService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
/**
* @version V1.0
* @title: PersonalAccountPositionTask
* @description:
* @author: zw
* @date: 2022/4/11:07 下午
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
PersonalAccountPositionTask
implements
ApplicationRunner
{
@Resource
CommonConfig
commonConfig
;
@Resource
AccountProductRelationService
accountProductRelationService
;
@Resource
private
StockPositionService
stockPositionService
;
@Resource
private
FinanceCalculateService
financeCalculateService
;
@Resource
private
StockCodeService
stockCodeService
;
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
// if(commonConfig.getPersonalAccountPositionTaskSwitch() != null && commonConfig.getPersonalAccountPositionTaskSwitch().equals("run")) {
// log.info("计算私人定制==账户==更新账户盈亏比例 开始启动");
// ExecutorService executorService = Executors.newSingleThreadExecutor();
// ExecutorService executorService1 = Executors.newFixedThreadPool(200);
// CompletableFuture.runAsync(() -> {
// while(true) {
// Date startTime = new Date();
// int size = 0;
// List<CompletableFuture<String>> futureList = new ArrayList<>();
//// if (DateUtil.isTradeDay()) {
// //查询所有账户
// List<AccountProductRelation> accountList = accountProductRelationService.queryAll();
// //查询所有持仓
// List<StockPosition> stockPositions = stockPositionService.getAll();
// //查询所有股票
// Set<String> simulatedCodes = stockPositions.stream().map(StockPosition::getCode).collect(Collectors.toSet());
// Map<String, Quote> simulatedAndQuoteMapping = stockCodeService.batchQueryStockPrice(new ArrayList<>(simulatedCodes));
// //整理账户下所有持仓
// Map<Long, List<StockPosition>> marketIdAndStockPositionsMapping = new HashMap<>();
// for (StockPosition stockPosition : stockPositions) {
// Long marketId = stockPosition.getMarketId();
// if (marketIdAndStockPositionsMapping.containsKey(marketId)) {
// List<StockPosition> temStockPositions = marketIdAndStockPositionsMapping.get(marketId);
// temStockPositions.add(stockPosition);
// } else {
// List<StockPosition> stockPositionList = new ArrayList<>();
// stockPositionList.add(stockPosition);
// marketIdAndStockPositionsMapping.put(marketId, stockPositionList);
// }
// }
// size = accountList.size();
// if (null != accountList && accountList.size() > 0) {
// int len = 200;//限制条数
// int count = (size + len - 1) / len;//分批数
// for (int i = 0; i < count; i++) {
// List<AccountProductRelation> listPage = accountList.subList(i * len, ((i + 1) * len > size ? size : (i + 1) * len));
// //为私人订制开启一个独立线程进行异步计算
// CompletableFuture cf = CompletableFuture.supplyAsync(() -> {
// List<AccountProductRelation> tempList = new ArrayList<>();
// for (AccountProductRelation accountProductRelation : listPage){
// AccountProductRelation tempAccount = new AccountProductRelation();
// try {
// //持仓个数
// List<StockPosition> temStockPositions = marketIdAndStockPositionsMapping.get(accountProductRelation.getSimulatedMarketId());
// //总市值
// BigDecimal simulatedStocksTotalPrice = financeCalculateService.calculateTotalAssets(temStockPositions, simulatedAndQuoteMapping);
// //总资产=可用资金+总市值
// BigDecimal simulatedTotalPrice = BigDecimalUtil.add(accountProductRelation.getSimulatedFunding(),simulatedStocksTotalPrice);
// //盈亏比例
// BigDecimal simulatedTotalProfit = financeCalculateService.calculateProfitRate(simulatedTotalPrice, accountProductRelation.getInitialFunding());
// //持仓比例=总市值/总资产
// BigDecimal position = BigDecimalUtil.div(simulatedStocksTotalPrice, simulatedTotalPrice);
// tempAccount.setId(accountProductRelation.getId());
// tempAccount.setSimulatedTotalPrice(simulatedTotalPrice);
// tempAccount.setSimulatedTotalProfit(simulatedTotalProfit);
// tempAccount.setSimulatedProportion(position);
// tempList.add(tempAccount);
// }catch (Exception e){
// e.printStackTrace();
// log.error("计算私人定制==账户==更新持仓盈亏比例更新线程出错",e);
// }
// }
// accountProductRelationService.batchUpdateAccountProductRelation(tempList);
// return "";
// },executorService1).handle((result, ex) -> {
// if (null != ex) {
// log.info("出错啦",ex);
// System.out.println(ex.getMessage());
// return 0;
// } else {
// return result;
// }
// });
// futureList.add(cf);
// }
// }
//// }
// try {
// CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]));
// combinedFuture.get();
// log.info("计算私人定制==账户==更新持仓盈亏比例计算完成,本次共计算" + size + "个持仓数据。耗时" + DateUtil.calculateTimeGapSecond(startTime,new Date()) + "秒");
// Thread.sleep(3000);
// }catch (Exception e){
// e.printStackTrace();
// }
// }
// },executorService);
// }
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/PersonalPositionTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.constant.AdminConstant
;
import
com.zfxftech.telmarket.common.pojo.dao.AccountProductRelation
;
import
com.zfxftech.telmarket.common.pojo.dao.Quote
;
import
com.zfxftech.telmarket.common.pojo.dao.StockPosition
;
import
com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin
;
import
com.zfxftech.telmarket.common.pojo.request.SellingOrderBO
;
import
com.zfxftech.telmarket.common.util.BigDecimalUtil
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.service.UsAdminService
;
import
com.zfxftech.telmarket.service.business.AccountProductRelationService
;
import
com.zfxftech.telmarket.service.business.FinanceCalculateService
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.business.StockPositionService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
javax.annotation.Resource
;
import
java.math.BigDecimal
;
import
java.util.*
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.stream.Collectors
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
LESS
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
NumberEnum
.
HUNDRED
;
/**
* @version V1.0
* @title: PersonalPositionTask
* @description:
* @author: zw
* @date: 2022/3/12:33 下午
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
PersonalPositionTask
implements
ApplicationRunner
{
@Resource
private
StockPositionService
stockPositionService
;
@Resource
private
StockCodeService
stockCodeService
;
@Resource
private
FinanceCalculateService
financeCalculateService
;
@Resource
CommonConfig
commonConfig
;
@Resource
AccountProductRelationService
accountProductRelationService
;
@Resource
UsAdminService
usAdminService
;
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"私人定制======"
+
commonConfig
.
getPersonalPositionTaskSwitch
());
log
.
info
(
"私人定制 bool======"
+
commonConfig
.
getPersonalPositionTaskSwitch
().
equals
(
"run"
));
if
(
commonConfig
.
getPersonalPositionTaskSwitch
()
!=
null
&&
commonConfig
.
getPersonalPositionTaskSwitch
().
equals
(
"run"
))
{
log
.
info
(
"私人定制==个股==更新持仓盈亏比例 当日涨跌幅 开始启动"
);
ExecutorService
executorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorService1
=
Executors
.
newFixedThreadPool
(
200
);
CompletableFuture
.
runAsync
(()
->
{
while
(
true
)
{
UsAdmin
usAdmin
=
usAdminService
.
getAdminByUserId
(
AdminConstant
.
AuthorityTypeEnum
.
SUPERADMIN
.
getCode
().
toString
());
Date
startTime
=
new
Date
();
int
size
=
0
;
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
if
(
DateUtil
.
isTradeDayForCal
())
{
List
<
StockPosition
>
faList
=
stockPositionService
.
getAll
();
Set
<
String
>
codeSet
=
faList
.
stream
().
map
(
x
->
x
.
getCode
()).
collect
(
Collectors
.
toSet
());
Map
<
String
,
Quote
>
codeAndQuoteMapping
=
stockCodeService
.
batchQueryStockPrice
(
new
ArrayList
<>(
codeSet
));
Map
<
Long
,
List
<
StockPosition
>>
marketIdAndStockPositionListMapping
=
new
HashMap
<>();
for
(
StockPosition
temStockPosition
:
faList
)
{
Long
temMarketId
=
temStockPosition
.
getMarketId
();
if
(
marketIdAndStockPositionListMapping
.
containsKey
(
temMarketId
))
{
List
<
StockPosition
>
temList
=
marketIdAndStockPositionListMapping
.
get
(
temMarketId
);
temList
.
add
(
temStockPosition
);
}
else
{
List
<
StockPosition
>
temList
=
new
ArrayList
<>();
temList
.
add
(
temStockPosition
);
marketIdAndStockPositionListMapping
.
put
(
temMarketId
,
temList
);
}
}
size
=
faList
.
size
();
if
(
null
!=
faList
&&
faList
.
size
()
>
0
)
{
int
len
=
30
;
//限制条数
int
count
=
(
size
+
len
-
1
)
/
len
;
//分批数
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
List
<
StockPosition
>
listPage
=
faList
.
subList
(
i
*
len
,
((
i
+
1
)
*
len
>
size
?
size
:
(
i
+
1
)
*
len
));
//为私人订制开启一个独立线程进行异步计算
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
List
<
StockPosition
>
tempList
=
new
ArrayList
<>();
for
(
StockPosition
stockPosition
:
listPage
){
try
{
StockPosition
tempStockPosition
=
new
StockPosition
();
Quote
quote
=
codeAndQuoteMapping
.
get
(
stockPosition
.
getCode
());
tempStockPosition
.
setId
(
stockPosition
.
getId
());
//查询是否是示范盘
AccountProductRelation
istrue
=
accountProductRelationService
.
queryAccountProductRelationByMarketInfo
(
stockPosition
.
getMarketId
(),
AdminConstant
.
MarketTypeEnum
.
SIMULATED
.
getCode
());
BigDecimal
totalAssets
=
new
BigDecimal
(
0
);
if
(!
ObjectUtils
.
isEmpty
(
istrue
)
&&
!
ObjectUtils
.
isEmpty
(
istrue
.
getSimulatedMarketId
())&&
!
ObjectUtils
.
isEmpty
(
marketIdAndStockPositionListMapping
)){
List
<
StockPosition
>
temStockPositions
=
marketIdAndStockPositionListMapping
.
get
(
istrue
.
getSimulatedMarketId
());
//算出总市值
totalAssets
=
financeCalculateService
.
calculateTotalAssets
(
istrue
.
getSimulatedFunding
(),
temStockPositions
,
codeAndQuoteMapping
);
//股票仓位
tempStockPosition
.
setStockPosition
(
financeCalculateService
.
calculateIndustryShare
(
totalAssets
,
stockPosition
.
getCount
(),
codeAndQuoteMapping
.
get
(
stockPosition
.
getCode
()).
getNow
()));
}
//盈亏比例
tempStockPosition
.
setProfitLossRatio
(
financeCalculateService
.
profitLossRatio
(
quote
.
getNow
(),
stockPosition
.
getCost
()));
//开始计算和更新盈亏比例涨跌幅
tempStockPosition
.
setRiseDownRange
(
financeCalculateService
.
riseDownRange
(
quote
.
getNow
(),
quote
.
getClose
()));
// if (!ObjectUtils.isEmpty(istrue)) {
// //获取股票当前价格
// String pushTime = DateUtil.getNow();
// // TradingStrategyParam tradingStrategyParam = stockPositionService.createTradingStrategyParam(pushTime, "清仓", istrue, "", "");
// if (!StringUtils.isEmpty(stockPosition.getStopProfit()) && stockPosition.getStopProfit().contains("%")) {
// stockPosition.setStopProfit(String.valueOf(BigDecimalUtil.div(StringUtils.trim(stockPosition.getStopProfit().replace("%", " ")), HUNDRED.getCode().toString())));
// }
//
// if (!StringUtils.isEmpty(stockPosition.getStopLoss()) && stockPosition.getStopLoss().contains("%")) {
// stockPosition.setStopLoss(String.valueOf(BigDecimalUtil.div(StringUtils.trim(stockPosition.getStopLoss().replace("%", " ")), HUNDRED.getCode().toString())));
// }
// //止盈
// if (!ObjectUtils.isEmpty(stockPosition) && !ObjectUtils.isEmpty(stockPosition.getIsStopProfit())&& !ObjectUtils.isEmpty(stockPosition.getStopProfit())
// && String.valueOf(stockPosition.getIsStopProfit()).equals("1")
// && BigDecimalUtil.ge(tempStockPosition.getProfitLossRatio(), new BigDecimal( stockPosition.getStopProfit()))
// && BigDecimalUtil.compare(quote.getNow(), quote.getHigh(),LESS.getCode())
//
// ) {
//// tradingStrategyParam.setReason("获利止盈!");
// //清仓操作
//// stockPositionService.selling(istrue, stockPosition, ALL_POSITION, quote.getNow(), tradingStrategyParam, usAdmin, false, StockInputLogTrustSource.AUTO_ZHIYING);
//
// SellingOrderBO sellingOrderBO = new SellingOrderBO();
// sellingOrderBO.setCode(stockPosition.getCode());
// sellingOrderBO.setPosition("1");
// sellingOrderBO.setReason("获利止盈!");
// sellingOrderBO.setPrice(String.valueOf(quote.getNow()));
// List listId= new ArrayList();
// listId.add(istrue.getId());
// sellingOrderBO.setRelationId(listId);
// stockPositionService.sendSellingOrder(sellingOrderBO,usAdmin);
//
// }
// //止损
// if (!ObjectUtils.isEmpty(stockPosition) && !ObjectUtils.isEmpty(stockPosition.getStopLoss())&& !ObjectUtils.isEmpty(stockPosition.getIsStopLoss())
// &&String.valueOf(stockPosition.getIsStopLoss()).equals("1")
// && BigDecimalUtil.le(tempStockPosition.getProfitLossRatio(),new BigDecimal( stockPosition.getStopLoss()))
// ) {
//
// SellingOrderBO sellingOrderBO = new SellingOrderBO();
// sellingOrderBO.setCode(stockPosition.getCode());
// sellingOrderBO.setPosition("1");
// sellingOrderBO.setReason("清仓止损!");
// List listId= new ArrayList();
// listId.add(istrue.getId());
// sellingOrderBO.setPrice(String.valueOf(quote.getNow()));
// sellingOrderBO.setRelationId(listId);
// stockPositionService.sendSellingOrder(sellingOrderBO,usAdmin);
//// //清仓操作
//// tradingStrategyParam.setReason("清仓止损!");
//// //清仓操作
//// stockPositionService.selling(istrue, stockPosition, ALL_POSITION, quote.getNow(), tradingStrategyParam, usAdmin, false,StockInputLogTrustSource.AUTO_ZHISUN);
// }
// }
tempList
.
add
(
tempStockPosition
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
log
.
error
(
"私人定制更新持仓盈亏比例当日涨跌幅更新线程出错"
,
e
);
}
}
stockPositionService
.
bactchUpdateStockPosition
(
tempList
);
return
""
;
},
executorService1
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
info
(
"私人定制更新持仓盈亏比例线程出错"
,
ex
);
System
.
out
.
println
(
ex
.
getMessage
());
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
}
}
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
//log.info("全部跟投账户开始更新数据--------主线程开始阻塞,等待更新全部完成--------");
combinedFuture
.
get
();
log
.
info
(
"私人定制更新持仓盈亏比例当日涨跌幅计算完成,本次共计算"
+
size
+
"个持仓数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
Thread
.
sleep
(
3000
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
}
}
},
executorService
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/PersonalReportTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountPositionInfoService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountYieldsRecordService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.scheduling.annotation.EnableScheduling
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.Date
;
/**
* Create time: 2022/2/3
*/
@EnableScheduling
@Component
@Slf4j
public
class
PersonalReportTask
{
@Resource
FollowAccountService
followAccountService
;
@Resource
FollowAccountYieldsRecordService
followAccountYieldsRecordService
;
@Resource
FollowAccountPositionInfoService
followAccountPositionInfoService
;
@Scheduled
(
cron
=
"0 15 15 * * MON-FRI"
)
private
void
followAccountYieldsRecordRunTask
()
{
try
{
log
.
info
(
"开始计算更新持仓可用股数"
);
Date
startTime
=
new
Date
();
followAccountPositionInfoService
.
updateFollowAccountPositionFreeCountByDay
();
log
.
info
(
"持仓可用股数更新完成 共耗时:"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
()));
}
catch
(
Exception
e
){
log
.
error
(
"持仓可用股数更新失败"
,
e
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/ProductCheckFullStopTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.constant.AdminConstant
;
import
com.zfxftech.telmarket.common.enums.StockInputLogTrustSource
;
import
com.zfxftech.telmarket.common.enums.followAccount.FollowAccountConfigRuleTypeEnum
;
import
com.zfxftech.telmarket.common.pojo.dao.AccountProductRelation
;
import
com.zfxftech.telmarket.common.pojo.dao.Quote
;
import
com.zfxftech.telmarket.common.pojo.dao.StockPosition
;
import
com.zfxftech.telmarket.common.pojo.dao.TradingStrategyParam
;
import
com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin
;
import
com.zfxftech.telmarket.common.pojo.dto.remind.FullStockPositionTask
;
import
com.zfxftech.telmarket.common.pojo.request.SellingOrderBO
;
import
com.zfxftech.telmarket.common.pojo.vo.ProductConfigRuleTaskVo
;
import
com.zfxftech.telmarket.common.util.BigDecimalUtil
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.service.UsAdminService
;
import
com.zfxftech.telmarket.service.business.AccountProductRelationService
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.business.StockPositionService
;
import
com.zfxftech.telmarket.service.product.ProductStockRiskService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.ObjectUtils
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.atomic.AtomicReference
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
LESS
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
MarketTypeEnum
.
SIMULATED
;
/**
* 自动止盈止损
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
ProductCheckFullStopTask
implements
ApplicationRunner
{
@Autowired
ProductStockRiskService
productStockRiskService
;
@Autowired
AccountProductRelationService
accountProductRelationService
;
@Autowired
StockPositionService
stockPositionService
;
@Autowired
private
StockCodeService
stockCodeService
;
@Autowired
private
UsAdminService
usAdminService
;
@Autowired
private
CommonConfig
commonConfig
;
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"开始启动私人订制自动止盈止损更新开关状态:"
+
commonConfig
.
getProductCheckFullStopTaskSwitch
());
if
(
commonConfig
.
getProductCheckFullStopTaskSwitch
()
!=
null
&&
commonConfig
.
getProductCheckFullStopTaskSwitch
().
equals
(
"run"
))
{
//分页查询异动配置列表
ExecutorService
executorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorService1
=
Executors
.
newFixedThreadPool
(
40
);
CompletableFuture
.
runAsync
(()
->
{
UsAdmin
usAdmin
=
usAdminService
.
getAdminByUserId
(
AdminConstant
.
AuthorityTypeEnum
.
SUPERADMIN
.
getCode
().
toString
());
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
while
(
true
)
{
if
(
DateUtil
.
stopProfitIsTradeDay
())
{
AtomicReference
<
Integer
>
pageNo
=
new
AtomicReference
<>(
1
);
Integer
pageSize
=
200
;
Date
startTime
=
new
Date
();
List
<
ProductConfigRuleTaskVo
>
list
=
productStockRiskService
.
getListProductConfigTask
(
pageNo
.
get
(),
pageSize
);
//获取所有的私人订制的止盈止损配置
if
(!
ObjectUtils
.
isEmpty
(
list
))
{
pageNo
.
set
(
pageNo
.
get
()
+
1
);
for
(
ProductConfigRuleTaskVo
productConfigRuleTaskVo
:
list
)
{
//开始遍历产品id
for
(
Integer
productId
:
productConfigRuleTaskVo
.
getProductIdList
())
{
//获取产品下面的股票
List
<
StockPosition
>
fansDtoList
=
stockPositionService
.
getPositionList
(
productId
.
longValue
(),
null
,
null
,
null
,
null
);
for
(
StockPosition
stockPosition
:
fansDtoList
)
{
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
//截至时间
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
.
getCreatedTime
())
&&
!
ObjectUtils
.
isEmpty
(
productConfigRuleTaskVo
.
getAbortDate
())
&&
(
DateUtil
.
compareTo
(
productConfigRuleTaskVo
.
getAbortDate
(),
stockPosition
.
getCreatedTime
())
==
1
||
DateUtil
.
compareTo
(
productConfigRuleTaskVo
.
getAbortDate
(),
stockPosition
.
getCreatedTime
())
==
0
))
{
return
""
;
}
//获取股票当前价格
Quote
quote
=
stockCodeService
.
queryStockPrice
(
stockPosition
.
getCode
());
//止盈
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
)
&&
!
ObjectUtils
.
isEmpty
(
productConfigRuleTaskVo
.
getType
())
&&
productConfigRuleTaskVo
.
getType
().
equals
(
FollowAccountConfigRuleTypeEnum
.
TAKE_PROFIT
.
getCode
())
&&
BigDecimalUtil
.
ge
(
stockPosition
.
getProfitLossRatio
(),
productConfigRuleTaskVo
.
getYields
())
&&
BigDecimalUtil
.
compare
(
quote
.
getNow
(),
quote
.
getHigh
(),
LESS
.
getCode
())
)
{
//查询是否是示范盘
AccountProductRelation
istrue
=
accountProductRelationService
.
queryAccountProductRelationByMarketInfo
(
stockPosition
.
getMarketId
(),
SIMULATED
.
getCode
());
if
(
ObjectUtils
.
isEmpty
(
istrue
))
{
return
""
;
}
SellingOrderBO
sellingOrderBO
=
new
SellingOrderBO
();
sellingOrderBO
.
setCode
(
stockPosition
.
getCode
());
sellingOrderBO
.
setPosition
(
"1"
);
sellingOrderBO
.
setReason
(
"获利止盈!"
);
List
listId
=
new
ArrayList
();
listId
.
add
(
istrue
.
getId
());
sellingOrderBO
.
setPrice
(
String
.
valueOf
(
quote
.
getNow
()));
sellingOrderBO
.
setRelationId
(
listId
);
stockPositionService
.
sendSellingOrderTask
(
sellingOrderBO
,
usAdmin
,
StockInputLogTrustSource
.
AUTO_ZHIYING
);
// redisUtil.set("code:" + stockPosition.getCode() + "userId:" + stockPosition.getCustomerId() + "type:" + productConfigRuleTaskVo.getType() +"productId"+ productConfigRuleTaskVo.getId(), "rose", 12L, TimeUnit.HOURS);
}
//止损
else
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
)
&&
!
ObjectUtils
.
isEmpty
(
productConfigRuleTaskVo
.
getType
())
&&
productConfigRuleTaskVo
.
getType
().
equals
(
FollowAccountConfigRuleTypeEnum
.
STOP_LOSS
.
getCode
())
&&
BigDecimalUtil
.
le
(
stockPosition
.
getProfitLossRatio
(),
productConfigRuleTaskVo
.
getYields
())
)
{
//查询是否是示范盘
AccountProductRelation
istrue
=
accountProductRelationService
.
queryAccountProductRelationByMarketInfo
(
stockPosition
.
getMarketId
(),
SIMULATED
.
getCode
());
if
(
ObjectUtils
.
isEmpty
(
istrue
))
{
return
""
;
}
SellingOrderBO
sellingOrderBO
=
new
SellingOrderBO
();
sellingOrderBO
.
setCode
(
stockPosition
.
getCode
());
sellingOrderBO
.
setPosition
(
"1"
);
sellingOrderBO
.
setReason
(
"清仓止损!"
);
List
listId
=
new
ArrayList
();
listId
.
add
(
istrue
.
getId
());
sellingOrderBO
.
setPrice
(
String
.
valueOf
(
quote
.
getNow
()));
sellingOrderBO
.
setRelationId
(
listId
);
//addRemark
stockPositionService
.
sendSellingOrderTask
(
sellingOrderBO
,
usAdmin
,
StockInputLogTrustSource
.
AUTO_ZHISUN
);
//推送消息
}
return
""
;
},
executorService1
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
info
(
"出错啦"
,
ex
);
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
}
}
}
}
else
{
pageNo
.
set
(
1
);
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
combinedFuture
.
get
();
log
.
info
(
"开始私人订制自动止盈止损------主线程开始阻塞,消息发送完成--------"
);
log
.
info
(
"开始私人订制自动止盈止损,本次共计算"
+
(
ObjectUtils
.
isEmpty
(
list
)
==
true
?
0
:
list
.
size
())
+
"开始私人订制自动止盈止损数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
try
{
Thread
.
sleep
(
6000
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
}
}
else
{
try
{
Thread
.
sleep
(
12000
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
}
}
}
},
executorService
);
}
}
public
List
<
FullStockPositionTask
>
page
(
List
<
FullStockPositionTask
>
list
,
Integer
pageNo
,
Integer
pageSize
)
{
if
(
CollectionUtils
.
isEmpty
(
list
))
{
return
list
;
}
List
<
FullStockPositionTask
>
resultList
=
new
ArrayList
();
// 所有dataList数据中的第几条
int
currIdx
=
pageNo
>
1
?
(
pageNo
-
1
)
*
pageSize
:
0
;
for
(
int
i
=
0
;
i
<
pageSize
&&
i
<
list
.
size
()
-
currIdx
;
i
++)
{
resultList
.
add
(
list
.
get
(
currIdx
+
i
));
}
return
resultList
;
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/SmarkPersonalPositionTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.pojo.dao.Quote
;
import
com.zfxftech.telmarket.common.pojo.dao.smart.SmartStockPosition
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.business.smart.SmartFinanceCalculateService
;
import
com.zfxftech.telmarket.service.business.smart.SmartStockPositionService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
/**
* @version V1.0
* @title: PersonalPositionTask
* @description:
* @author: zw
* @date: 2022/3/12:33 下午
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
SmarkPersonalPositionTask
implements
ApplicationRunner
{
@Resource
private
SmartStockPositionService
smartStockPositionService
;
@Resource
private
StockCodeService
stockCodeService
;
@Resource
private
SmartFinanceCalculateService
smartFinanceCalculateService
;
@Resource
CommonConfig
commonConfig
;
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"智能跟投======"
+
commonConfig
.
getPersonalPositionTaskSwitch
());
log
.
info
(
"智能跟投 bool======"
+
commonConfig
.
getPersonalPositionTaskSwitch
().
equals
(
"run"
));
if
(
commonConfig
.
getPersonalPositionTaskSwitch
()
!=
null
&&
commonConfig
.
getPersonalPositionTaskSwitch
().
equals
(
"run"
))
{
log
.
info
(
"智能跟投更新持仓盈亏比例 当日涨跌幅 开始启动"
);
ExecutorService
executorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorService1
=
Executors
.
newFixedThreadPool
(
200
);
CompletableFuture
.
runAsync
(()
->
{
while
(
true
)
{
Date
startTime
=
new
Date
();
int
size
=
0
;
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
if
(
DateUtil
.
isTradeDayForCal
())
{
List
<
SmartStockPosition
>
faList
=
smartStockPositionService
.
getAll
();
size
=
faList
.
size
();
if
(
null
!=
faList
&&
faList
.
size
()
>
0
)
{
int
len
=
20
;
//限制条数
int
count
=
(
size
+
len
-
1
)
/
len
;
//分批数
for
(
int
i
=
0
;
i
<
count
;
i
++)
{
List
<
SmartStockPosition
>
listPage
=
faList
.
subList
(
i
*
len
,
((
i
+
1
)
*
len
>
size
?
size
:
(
i
+
1
)
*
len
));
//为私人订制开启一个独立线程进行异步计算
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
List
<
SmartStockPosition
>
tempList
=
new
ArrayList
<>();
for
(
SmartStockPosition
stockPosition
:
listPage
){
try
{
SmartStockPosition
tempStockPosition
=
new
SmartStockPosition
();
Quote
quote
=
stockCodeService
.
getStockQuote
(
stockPosition
.
getCode
());
//开始计算和更新盈亏比例涨跌幅
//盈亏比例
tempStockPosition
.
setProfitLossRatio
(
smartFinanceCalculateService
.
profitLossRatio
(
quote
.
getNow
(),
stockPosition
.
getCost
()));
tempStockPosition
.
setRiseDownRange
(
smartFinanceCalculateService
.
riseDownRange
(
quote
.
getNow
(),
quote
.
getClose
()));
tempStockPosition
.
setId
(
stockPosition
.
getId
());
tempList
.
add
(
tempStockPosition
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
log
.
error
(
"智能跟投更新持仓盈亏比例当日涨跌幅更新线程出错"
,
e
);
}
}
smartStockPositionService
.
bactchUpdateStockPosition
(
tempList
);
return
""
;
},
executorService1
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
info
(
"出错啦"
,
ex
);
System
.
out
.
println
(
ex
.
getMessage
());
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
}
}
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
//log.info("全部跟投账户开始更新数据--------主线程开始阻塞,等待更新全部完成--------");
combinedFuture
.
get
();
log
.
info
(
"智能跟投定制更新持仓盈亏比例当日涨跌幅计算完成,本次共计算"
+
size
+
"个持仓数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
Thread
.
sleep
(
5000
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
}
}
},
executorService
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/SmartChangeRemindTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.alibaba.druid.util.StringUtils
;
import
com.github.pagehelper.util.StringUtil
;
import
com.zfxf.tools.wechat.helper.api.TemplateKeyWordBuilder
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.constant.AdminConstant
;
import
com.zfxftech.telmarket.common.constant.RedisKeyMessageConstant
;
import
com.zfxftech.telmarket.common.constant.webhook.MonitoringEnum
;
import
com.zfxftech.telmarket.common.enums.remind.InformTypeEnums
;
import
com.zfxftech.telmarket.common.enums.remind.TransactionRemindEnums
;
import
com.zfxftech.telmarket.common.enums.wx.TemplateUserType
;
import
com.zfxftech.telmarket.common.pojo.dao.*
;
import
com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin
;
import
com.zfxftech.telmarket.common.pojo.dao.remind.RemindCommonTask
;
import
com.zfxftech.telmarket.common.pojo.dao.remind.RemindRole
;
import
com.zfxftech.telmarket.common.pojo.dao.remind.WebHookCommonTask
;
import
com.zfxftech.telmarket.common.pojo.dao.smart.SmartProduct
;
import
com.zfxftech.telmarket.common.pojo.dao.webhook.ChatbotSend
;
import
com.zfxftech.telmarket.common.pojo.dto.remind.StockPositionTask
;
import
com.zfxftech.telmarket.common.pojo.vo.StockBatchVo
;
import
com.zfxftech.telmarket.common.pojo.vo.remind.TasckChangeRemindVo
;
import
com.zfxftech.telmarket.common.util.BigDecimalUtil
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.common.util.RedisUtil
;
import
com.zfxftech.telmarket.common.util.SnowflakeIdWorker
;
import
com.zfxftech.telmarket.service.UsAdminService
;
import
com.zfxftech.telmarket.service.business.FinanceCalculateService
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.business.UsMemberBaseService
;
import
com.zfxftech.telmarket.service.business.WeChatTemplateMessageService
;
import
com.zfxftech.telmarket.service.business.asset.AssetAccountProductRelationService
;
import
com.zfxftech.telmarket.service.business.smart.SmartAccountProductRelationService
;
import
com.zfxftech.telmarket.service.business.smart.SmartProductService
;
import
com.zfxftech.telmarket.service.business.smart.SmartStockPositionService
;
import
com.zfxftech.telmarket.service.business.webhook.ChatbotSendService
;
import
com.zfxftech.telmarket.service.remind.RemindRoleService
;
import
com.zfxftech.telmarket.service.remind.RemindService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.tuple.Pair
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.scheduling.annotation.Async
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.CollectionUtils
;
import
org.springframework.util.ObjectUtils
;
import
javax.annotation.Resource
;
import
java.math.BigDecimal
;
import
java.text.DecimalFormat
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicReference
;
import
java.util.stream.Collectors
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
GREATER
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
LESS
;
/**
* Create time: 2022/1/26
*/
@Slf4j
@Component
@Order
(
value
=
1
)
/**
* 只能跟投
*/
public
class
SmartChangeRemindTask
implements
ApplicationRunner
{
@Resource
RemindService
remindService
;
@Resource
RemindRoleService
remindRoleService
;
@Resource
StockCodeService
stockCodeService
;
@Resource
private
SmartStockPositionService
smartStockPositionService
;
@Resource
FinanceCalculateService
financeCalculateService
;
@Resource
RedisUtil
redisUtil
;
@Resource
WeChatTemplateMessageService
weChatTemplateMessageService
;
@Resource
UsAdminService
usAdminService
;
@Resource
SmartProductService
smartProductService
;
@Autowired
private
CommonConfig
commonConfig
;
@Autowired
SmartAccountProductRelationService
smartAccountProductRelationService
;
@Autowired
private
ChatbotSendService
chatbotSendService
;
@Autowired
private
UsMemberBaseService
usMemberBaseService
;
@Autowired
AssetAccountProductRelationService
assetAccountProductRelationService
;
private
static
DecimalFormat
df2
=
new
DecimalFormat
(
"0.00%"
);
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"开始智能跟投正式环境日志输出"
);
// commonConfig.setChangeRemindTaskSwitch("run");
log
.
info
(
"开始启动智能跟投异动提醒配置更新开关状态:"
+
commonConfig
.
getChangeRemindTaskSwitchSmart
());
if
(
commonConfig
.
getChangeRemindTaskSwitchSmart
()
!=
null
&&
commonConfig
.
getChangeRemindTaskSwitchSmart
().
equals
(
"run"
))
{
//分页查询异动配置列表
ExecutorService
PersonalexecutorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorServicePersonal
=
Executors
.
newFixedThreadPool
(
100
);
CompletableFuture
.
runAsync
(()
->
{
while
(
true
)
{
if
(
DateUtil
.
isTradeDayForChangeRemind
())
{
AtomicReference
<
Integer
>
pageNo
=
new
AtomicReference
<>(
1
);
Integer
pageSize
=
100
;
Date
startTime
=
new
Date
();
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
List
<
StockPositionTask
>
positionList
=
smartStockPositionService
.
getStockPositionTask
(
null
);
log
.
info
(
"智能跟投提醒数据大小:{}"
,
positionList
.
size
());
if
(!
ObjectUtils
.
isEmpty
(
positionList
)
&&
positionList
.
size
()
>
0
)
{
Integer
pageTOtl
=
positionList
.
size
()
%
pageSize
==
0
?
positionList
.
size
()
/
pageSize
:
positionList
.
size
()
/
pageSize
+
1
;
for
(
Integer
i
=
0
;
i
<
pageTOtl
;
i
++)
{
List
<
StockPositionTask
>
positionListPage
=
this
.
page
(
positionList
,
pageNo
.
get
(),
pageSize
);
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
for
(
StockPositionTask
stockPosition
:
positionListPage
)
{
this
.
smartCheckPriceFollowAccount
(
stockPosition
);
}
return
" "
;
},
executorServicePersonal
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
error
(
"智能跟投错误消息:{}"
,
ex
);
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
pageNo
.
set
(
pageNo
.
get
()
+
1
);
}
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
combinedFuture
.
get
();
log
.
info
(
"智能跟投异动提醒--------主线程开始阻塞,消息发送完成--------"
);
log
.
info
(
"智能跟投异动提醒,本次共计算"
+
(
ObjectUtils
.
isEmpty
(
positionList
)
==
true
?
0
:
positionList
.
size
())
+
"异动提醒数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
catch
(
Exception
e
)
{
log
.
error
(
"智能跟投错误信息:{}"
,
e
);
e
.
printStackTrace
();
}
try
{
Thread
.
sleep
(
20000
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
else
{
try
{
Thread
.
sleep
(
8000
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
}
},
PersonalexecutorService
);
}
}
public
List
<
StockPositionTask
>
page
(
List
<
StockPositionTask
>
list
,
Integer
pageNo
,
Integer
pageSize
)
{
if
(
CollectionUtils
.
isEmpty
(
list
))
{
return
list
;
}
List
<
StockPositionTask
>
resultList
=
new
ArrayList
();
// 所有dataList数据中的第几条
int
currIdx
=
pageNo
>
1
?
(
pageNo
-
1
)
*
pageSize
:
0
;
for
(
int
i
=
0
;
i
<
pageSize
&&
i
<
list
.
size
()
-
currIdx
;
i
++)
{
resultList
.
add
(
list
.
get
(
currIdx
+
i
));
}
return
resultList
;
}
//智能跟投
public
void
smartCheckPriceFollowAccount
(
StockPositionTask
stockPosition
)
{
Date
startTime
=
new
Date
();
try
{
//获取code
log
.
info
(
"持仓数据:{}"
,
stockPosition
);
//涨跌幅
if
(
String
.
valueOf
(
TransactionRemindEnums
.
RiseAndFall
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
log
.
info
(
"异动提醒数据:涨跌幅:组装数据:耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
SmartProduct
product
=
smartProductService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
RiseAndFall
.
getCode
().
toString
());
log
.
info
(
"异动提醒数据:涨跌幅:组装数据:结束时间:耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
this
.
riseAndFall
(
remindCommonTask
,
product
,
memberBase
);
}
//收益率
if
(
String
.
valueOf
(
TransactionRemindEnums
.
PROFITRATE
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
SmartProduct
product
=
smartProductService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
PROFITRATE
.
getCode
().
toString
());
log
.
info
(
"异动提醒数据:收益率:组装数据:耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
this
.
profitrate
(
remindCommonTask
,
product
,
memberBase
);
log
.
info
(
"异动提醒数据:收益率:组装数据:结束时间:耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
//涨停
if
(
String
.
valueOf
(
TransactionRemindEnums
.
UPLIMIT
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
SmartProduct
product
=
smartProductService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
UPLIMIT
.
getCode
().
toString
());
this
.
uplimit
(
remindCommonTask
,
product
,
memberBase
);
}
if
(
String
.
valueOf
(
TransactionRemindEnums
.
LOWLIMIT
.
getCode
()).
equals
(
String
.
valueOf
(
stockPosition
.
getChangeType
())))
{
RemindCommonTask
remindCommonTask
=
this
.
assembleRemindCommonTask
(
stockPosition
);
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
))
{
return
;
}
SmartProduct
product
=
smartProductService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
;
}
remindCommonTask
.
setChangeType
(
TransactionRemindEnums
.
LOWLIMIT
.
getCode
().
toString
());
this
.
lowLimit
(
remindCommonTask
,
product
,
memberBase
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"异动提醒消息出错"
,
e
);
}
}
public
RemindCommonTask
assembleRemindCommonTask
(
StockPositionTask
stockPosition
)
{
//获取code
log
.
info
(
"持仓数据:{}"
,
stockPosition
);
//判断是否删除
Quote
quote
=
stockCodeService
.
getStockQuote
(
stockPosition
.
getCode
());
log
.
info
(
"异动提醒智能跟投股票代码:{},名称:{},价格:{},股票价格:{},"
,
quote
.
getCode
(),
quote
.
getName
(),
stockPosition
.
getCost
(),
quote
.
getNow
());
//判断异动是否删除
SmartProduct
product
=
smartProductService
.
queryProductById
(
stockPosition
.
getProductId
().
longValue
());
if
(
ObjectUtil
.
isEmpty
(
product
)
||
ObjectUtil
.
isEmpty
(
product
.
getId
()))
{
return
null
;
}
List
<
Integer
>
roleIdList
=
new
ArrayList
<>();
//查询 角色
List
<
RemindRole
>
list
=
remindRoleService
.
selectByRemindId
(
stockPosition
.
getRemindId
());
if
(
ObjectUtil
.
isNotEmpty
(
list
))
{
roleIdList
=
list
.
stream
().
map
(
RemindRole:
:
getRoleId
).
collect
(
Collectors
.
toList
());
}
if
(!
ObjectUtils
.
isEmpty
(
roleIdList
)
&&
((
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
ANALYST
.
getCode
()))
||
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
.
getCode
()))
||
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_MANAGER
.
getCode
()))))
{
List
<
Long
>
adminListId
=
new
ArrayList
<>();
if
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
ANALYST
.
getCode
()))
{
//分析师
UsAdmin
usAdmin
=
usAdminService
.
getAdminByUserId
(
String
.
valueOf
(
product
.
getAnalyst
()));
if
(
ObjectUtil
.
isNotEmpty
(
usAdmin
)
&&
ObjectUtil
.
isNotEmpty
(
usAdmin
.
getId
()))
{
adminListId
.
add
(
usAdmin
.
getId
());
}
}
if
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
.
getCode
()))
{
//获取公司下所有的主管 //获取销售总监userid
List
<
SelectionBox2
>
listManager
=
usAdminService
.
getUserListByRoleCompanyId
(
product
.
getCompanyId
().
intValue
(),
AdminConstant
.
AuthorityTypeEnum
.
SALES_DIRECTOR
);
if
(
ObjectUtil
.
isNotEmpty
(
listManager
)
&&
listManager
.
size
()
>
0
)
{
adminListId
.
addAll
(
listManager
.
stream
().
map
(
SelectionBox2:
:
getId
).
collect
(
Collectors
.
toList
()));
}
}
if
(
roleIdList
.
contains
(
AdminConstant
.
AuthorityTypeEnum
.
SUPERADMIN
.
getCode
()))
{
//超级管理员
List
<
SelectionBox2
>
listManager
=
usAdminService
.
getUserListByRole
(
AdminConstant
.
AuthorityTypeEnum
.
SUPERADMIN
);
if
(
ObjectUtil
.
isNotEmpty
(
listManager
)
&&
listManager
.
size
()
>
0
)
{
adminListId
.
addAll
(
listManager
.
stream
().
map
(
SelectionBox2:
:
getId
).
collect
(
Collectors
.
toList
()));
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
null
;
}
//查询客户
MemberBase
memberBase
=
usMemberBaseService
.
queryUsMemberBaseById
(
stockPosition
.
getCustomerId
());
//获取客户信息
if
(
ObjectUtils
.
isEmpty
(
memberBase
))
{
return
null
;
}
RemindCommonTask
remindCommonTask
=
new
RemindCommonTask
();
//收益率
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
.
getProfitLossRatio
()))
{
remindCommonTask
.
setProfitLossRatio
(
stockPosition
.
getProfitLossRatio
());
}
//成交价格
remindCommonTask
.
setRiseDownRange
(
stockPosition
.
getRiseDownRange
());
//阈值
TasckChangeRemindVo
tasckChangeRemindVo
=
remindService
.
tasckSelectById
(
stockPosition
.
getRemindId
());
if
(
ObjectUtil
.
isEmpty
(
tasckChangeRemindVo
))
{
return
null
;
}
remindCommonTask
.
setProportion
(
tasckChangeRemindVo
.
getProportion
());
remindCommonTask
.
setWebHookUrl
(
tasckChangeRemindVo
.
getWebHookUrl
());
//持仓时间
remindCommonTask
.
setCreateTime
(
stockPosition
.
getCreatedTime
());
remindCommonTask
.
setMemberId
(
memberBase
.
getId
());
remindCommonTask
.
setMemberName
(
memberBase
.
getName
());
remindCommonTask
.
setRemindId
(
stockPosition
.
getRemindId
());
remindCommonTask
.
setStockProductName
(
product
.
getProductName
());
remindCommonTask
.
setCode
(
stockPosition
.
getCode
());
remindCommonTask
.
setStockName
(
stockPosition
.
getName
());
remindCommonTask
.
setHyperlinkState
(
stockPosition
.
getHyperlinkState
());
remindCommonTask
.
setSendCustomerState
(
stockPosition
.
getSendCustomerState
());
remindCommonTask
.
setTpFansId
(
stockPosition
.
getTpFansId
());
remindCommonTask
.
setStockName
(
stockPosition
.
getName
());
remindCommonTask
.
setClose
(
quote
.
getClose
());
remindCommonTask
.
setNow
(
quote
.
getNow
());
//产品类型
remindCommonTask
.
setProductType
(
AdminConstant
.
MemberProductTypeEnum
.
SMART_TYPE
.
getCode
());
remindCommonTask
.
setAdminIdList
(
adminListId
);
return
remindCommonTask
;
}
return
null
;
}
/**
* 组装数据
*/
private
void
sendWbeHooks
(
WebHookCommonTask
webHookCommonTask
,
MemberBase
memberBase
)
{
log
.
info
(
"推送企业消息参数:{}"
,
webHookCommonTask
);
ChatbotSend
chatbotSend
=
new
ChatbotSend
();
chatbotSend
.
setCustomerId
(
webHookCommonTask
.
getCustomerId
().
intValue
());
if
(
ObjectUtil
.
isNotEmpty
(
memberBase
)
&&
StringUtil
.
isNotEmpty
(
memberBase
.
getName
()))
{
chatbotSend
.
setCustomerName
(
memberBase
.
getName
());
}
if
(
ObjectUtil
.
isNotEmpty
(
webHookCommonTask
)
&&
ObjectUtil
.
isNotEmpty
(
webHookCommonTask
.
getTpFansId
()))
{
chatbotSend
.
setTpFansId
(
webHookCommonTask
.
getTpFansId
());
}
//股票代码
chatbotSend
.
setStockCode
(
webHookCommonTask
.
getCode
());
chatbotSend
.
setStockName
(
webHookCommonTask
.
getStockName
());
chatbotSend
.
setMemberProductTypeEnumCode
(
webHookCommonTask
.
getProductType
());
chatbotSend
.
setTodayYields
(
webHookCommonTask
.
getTodayYields
());
chatbotSend
.
setRemindUrl
(
webHookCommonTask
.
getWebHookUrl
());
chatbotSend
.
setRemindId
(
webHookCommonTask
.
getRemindId
().
intValue
());
chatbotSend
.
setMonitoringType
(
MonitoringEnum
.
STOCKMONITORING
.
getCode
());
chatbotSend
.
setBuyToday
(
DateUtil
.
isOnToday
(
webHookCommonTask
.
getCreateTime
())
==
true
?
1
:
2
);
chatbotSend
.
setProductType
(
webHookCommonTask
.
getProductType
());
chatbotSendService
.
send
(
chatbotSend
);
}
/**
* 涨跌幅
*/
@Async
public
void
riseAndFall
(
RemindCommonTask
remindCommonTask
,
SmartProduct
product
,
MemberBase
memberBase
)
{
log
.
info
(
"涨幅数据参数:{}"
,
remindCommonTask
);
try
{
String
cole
=
null
;
String
variate
=
null
;
if
(
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getAdminIdList
())
||
remindCommonTask
.
getAdminIdList
().
size
()
<=
0
)
{
return
;
}
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getRiseDownRange
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getRiseDownRange
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
()))
{
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
remindCommonTask
.
getProductType
()
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
synchronized
(
this
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
remindCommonTask
.
getProductType
()
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
continue
;
}
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
remindCommonTask
.
getProductType
()
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"rose"
,
12L
,
TimeUnit
.
HOURS
);
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#FF0000"
;
variate
=
"涨"
+
df2
.
format
(
remindCommonTask
.
getRiseDownRange
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"涨"
+
df2
.
format
(
remindCommonTask
.
getRiseDownRange
()));
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
}
if
(
BigDecimalUtil
.
le
(
remindCommonTask
.
getRiseDownRange
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getRiseDownRange
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
()))
{
cole
=
"#0000FF"
;
variate
=
"跌"
+
df2
.
format
(
remindCommonTask
.
getRiseDownRange
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"跌"
+
df2
.
format
(
remindCommonTask
.
getRiseDownRange
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
adminListId
.
remove
(
aLong
);
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
break
;
}
}
synchronized
(
this
)
{
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
())))
{
continue
;
}
redisUtil
.
set
(
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
RiseAndFall
.
getCode
()
+
"fall"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
(),
"fall"
,
12L
,
TimeUnit
.
HOURS
);
}
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
}
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
!
StringUtils
.
isEmpty
(
variate
)
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】"
+
variate
;
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
this
.
snedCustomer
(
remindCommonTask
,
product
,
datas
,
memberBase
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//循环发送数据用户id
log
.
info
(
"智能跟投涨跌幅异动提醒:发送日志:{},数据:{},类型:{},路径:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
,
jumpUrl
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"涨幅数据错信息:{}"
,
e
);
}
}
private
TemplateKeyWordBuilder
getTemplateKeyWordBuilder
(
String
cole
,
String
remark
)
{
return
TemplateKeyWordBuilder
.
create
()
.
addFirst
(
DateUtil
.
getMonthDayStr
())
.
addKeyWord
(
"【个股异动监控】"
)
.
addKeyWord
(
DateUtil
.
getNow
())
.
addRemark
(
remark
,
cole
);
}
@Async
public
void
profitrate
(
RemindCommonTask
remindCommonTask
,
SmartProduct
product
,
MemberBase
memberBase
)
{
try
{
// 收益率是持有股票 的盈亏比例
log
.
info
(
"异动提醒收益率盈亏比例参数:{},产品:{},客户:{}"
,
remindCommonTask
,
product
,
memberBase
);
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
ObjectUtils
.
isEmpty
(
remindCommonTask
.
getProfitLossRatio
()))
{
return
;
}
String
cole
=
null
;
String
variate
=
null
;
log
.
info
(
"智能跟投收益率日志输出div:{},productRoleTask.getProportion():{}"
,
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
());
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
))
&&
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProfitLossRatio
(),
BigDecimal
.
valueOf
(
0
),
GREATER
.
getCode
()))
{
List
<
Long
>
longList
=
new
ArrayList
<>();
for
(
Long
aLong
:
adminListId
)
{
String
redisKey
=
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uprightYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
();
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
redisUtil
.
set
(
redisKey
,
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#FF0000"
;
variate
=
"收益率到达"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"收益率到达"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
df2
.
format
(
remindCommonTask
.
getProportion
());
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】"
+
variate
;
// 客户姓名】【产品名称】的收益率到达+8%,请及时查看
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
this
.
snedCustomer
(
remindCommonTask
,
product
,
datas
,
memberBase
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
log
.
info
(
"智能跟投收益率异动提醒:发送日志:{},数据:{},类型:{},路径:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
,
jumpUrl
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
if
(
BigDecimalUtil
.
le
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
))
&&
BigDecimalUtil
.
le
(
remindCommonTask
.
getProfitLossRatio
(),
remindCommonTask
.
getProportion
())
&&
BigDecimalUtil
.
compare
(
remindCommonTask
.
getProfitLossRatio
(),
BigDecimal
.
valueOf
(
0
),
LESS
.
getCode
()))
{
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
List
<
Long
>
longList
=
new
ArrayList
<>();
for
(
Long
aLong
:
adminListId
)
{
String
redisKey
=
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"smartLoadYield"
+
"memberBase"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
();
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
redisUtil
.
set
(
redisKey
,
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
cole
=
"#0000FF"
;
variate
=
"收益率跌"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
())
+
","
+
"请及时查看"
;
remindCommonTask
.
setTodayYields
(
"收益率跌"
+
df2
.
format
(
remindCommonTask
.
getProfitLossRatio
()));
//推送企业群消息
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
df2
.
format
(
remindCommonTask
.
getProportion
());
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
variate
))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】"
+
variate
;
// 客户姓名】【产品名称】的收益率到达+8%,请及时查看
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
this
.
snedCustomer
(
remindCommonTask
,
product
,
datas
,
memberBase
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
log
.
info
(
"智能跟投收益率异动提醒:发送日志:{},数据:{},类型:{},路径:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
,
jumpUrl
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"盈亏比例错误信息:{}"
,
e
);
}
}
private
WebHookCommonTask
changeTask
(
RemindCommonTask
remindCommonTask
)
{
WebHookCommonTask
webHookCommonTask
=
new
WebHookCommonTask
();
//产品类型
webHookCommonTask
.
setProductType
(
remindCommonTask
.
getProductType
());
//客户id
webHookCommonTask
.
setCustomerId
(
remindCommonTask
.
getMemberId
());
//异动类型
webHookCommonTask
.
setChangeType
(
remindCommonTask
.
getChangeType
());
//异动id
webHookCommonTask
.
setRemindId
(
remindCommonTask
.
getRemindId
());
//股票名称
webHookCommonTask
.
setStockName
(
remindCommonTask
.
getStockName
());
//股票代码
webHookCommonTask
.
setCode
(
remindCommonTask
.
getCode
());
//持仓时间
webHookCommonTask
.
setCreateTime
(
remindCommonTask
.
getCreateTime
());
//当日涨幅
webHookCommonTask
.
setTodayYields
(
remindCommonTask
.
getTodayYields
());
//推送地址
webHookCommonTask
.
setWebHookUrl
(
remindCommonTask
.
getWebHookUrl
());
return
webHookCommonTask
;
}
/**
* 发送客户
*/
public
String
snedCustomer
(
RemindCommonTask
remindCommonTask
,
SmartProduct
product
,
TemplateKeyWordBuilder
datas
,
MemberBase
memberBase
)
{
log
.
info
(
"发送客户参数:{},产品:{},描述:{},用户信息:{}"
,
remindCommonTask
,
product
,
datas
,
memberBase
);
StockBatchVo
stockBatchVo
=
stockCodeService
.
stockIndustryDetails
(
remindCommonTask
.
getCode
());
if
(
ObjectUtil
.
isEmpty
(
stockBatchVo
)
||
StringUtil
.
isEmpty
(
stockBatchVo
.
getReason
()))
{
return
null
;
}
String
jumpUrl
=
null
;
try
{
if
(!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getSendCustomerState
())
&&
remindCommonTask
.
getSendCustomerState
()
>
0
)
{
if
(
StringUtil
.
isNotEmpty
(
memberBase
.
getName
())
&&
!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getTpFansId
()))
{
jumpUrl
=
this
.
getJumpUrl
(
remindCommonTask
);
log
.
info
(
"发送客户消息:{},类型:{},fansId:{},地址:{},Data:{}"
,
memberBase
.
getName
(),
TemplateUserType
.
USER
,
remindCommonTask
.
getTpFansId
(),
datas
);
weChatTemplateMessageService
.
pushToFans
(
memberBase
.
getName
(),
TemplateUserType
.
USER
,
remindCommonTask
.
getTpFansId
(),
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
if
(
StringUtil
.
isNotEmpty
(
memberBase
.
getName
())
&&
!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getTpFansId
()))
{
log
.
info
(
"发送客户消息:{},类型:{},fansId:{},地址:{},Data:{}"
,
memberBase
.
getName
(),
TemplateUserType
.
USER
,
remindCommonTask
.
getTpFansId
(),
datas
);
weChatTemplateMessageService
.
pushToFans
(
memberBase
.
getName
(),
TemplateUserType
.
USER
,
remindCommonTask
.
getTpFansId
(),
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"发送客户错误信息:{},参数信息"
,
e
,
remindCommonTask
);
}
return
jumpUrl
;
}
/**
* 涨停
*/
@Async
public
void
uplimit
(
RemindCommonTask
remindCommonTask
,
SmartProduct
product
,
MemberBase
memberBase
)
{
try
{
StocksCode
stocksCode
=
new
StocksCode
();
stocksCode
.
setSymbol
(
remindCommonTask
.
getCode
());
stocksCode
.
setName
(
remindCommonTask
.
getStockProductName
());
//昨日收盘价
stocksCode
.
setRecentClosingPrice
(
remindCommonTask
.
getClose
());
Pair
<
BigDecimal
,
BigDecimal
>
pair
=
financeCalculateService
.
calculatePriceLimit
(
stocksCode
);
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
if
(
BigDecimalUtil
.
compare
(
pair
.
getRight
(),
remindCommonTask
.
getNow
(),
0
))
{
List
<
Long
>
longList
=
new
ArrayList
<>();
for
(
Long
aLong
:
adminListId
)
{
String
redisKey
=
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"uplimit:"
+
"memberBase:"
+
remindCommonTask
.
getMemberId
()
+
"productType:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
();
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
redisUtil
.
set
(
redisKey
,
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
String
cole
=
null
;
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
)))
{
cole
=
"#FF0000"
;
}
else
{
cole
=
"#0000FF"
;
}
//【客户姓名】【产品名称】的【股票名称/股票代码】涨停,请及时查看!
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
()))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】涨停,请及时查看!"
;
//推送企业群消息
remindCommonTask
.
setTodayYields
(
"涨停"
);
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
this
.
snedCustomer
(
remindCommonTask
,
product
,
datas
,
memberBase
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//发送公众号
log
.
info
(
"异动提醒:发送日志:{},数据:{},类型:{},路径:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
,
jumpUrl
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"涨停错误信息:{},参数信息"
,
e
,
remindCommonTask
);
}
}
/**
* 跌停
*/
@Async
public
void
lowLimit
(
RemindCommonTask
remindCommonTask
,
SmartProduct
product
,
MemberBase
memberBase
)
{
try
{
StocksCode
stocksCode
=
new
StocksCode
();
stocksCode
.
setSymbol
(
remindCommonTask
.
getCode
());
stocksCode
.
setName
(
remindCommonTask
.
getStockName
());
//昨日收盘价
stocksCode
.
setRecentClosingPrice
(
remindCommonTask
.
getClose
());
Pair
<
BigDecimal
,
BigDecimal
>
pair
=
financeCalculateService
.
calculatePriceLimit
(
stocksCode
);
if
(
BigDecimalUtil
.
compare
(
pair
.
getLeft
(),
remindCommonTask
.
getNow
(),
0
))
{
List
<
Long
>
adminListId
=
remindCommonTask
.
getAdminIdList
();
List
<
Long
>
longList
=
new
ArrayList
<>();
for
(
Long
aLong
:
adminListId
)
{
String
redisKey
=
"stock:"
+
remindCommonTask
.
getCode
()
+
"userId:"
+
aLong
+
"type:"
+
TransactionRemindEnums
.
PROFITRATE
.
getCode
()
+
"lowlimit:"
+
"memberBase:"
+
remindCommonTask
.
getMemberId
()
+
"product:"
+
remindCommonTask
.
getProductType
()
+
"remindId:"
+
remindCommonTask
.
getRemindId
();
if
(
StringUtil
.
isNotEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
longList
.
add
(
aLong
);
}
if
(
StringUtil
.
isEmpty
((
String
)
redisUtil
.
get
(
redisKey
)))
{
redisUtil
.
set
(
redisKey
,
"loadYield"
,
12L
,
TimeUnit
.
HOURS
);
}
}
for
(
Long
aLong
:
longList
)
{
adminListId
.
remove
(
aLong
);
}
if
(
ObjectUtil
.
isEmpty
(
adminListId
)
||
adminListId
.
size
()
<=
0
)
{
return
;
}
String
cole
=
null
;
if
(
BigDecimalUtil
.
ge
(
remindCommonTask
.
getProportion
(),
BigDecimal
.
valueOf
(
0
)))
{
cole
=
"#FF0000"
;
}
else
{
cole
=
"#0000FF"
;
}
if
(
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getMemberName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockProductName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getStockName
())
&&
StringUtil
.
isNotEmpty
(
remindCommonTask
.
getCode
()))
{
String
remark
=
"【"
+
remindCommonTask
.
getMemberName
()
+
"】"
+
" "
+
"【"
+
remindCommonTask
.
getStockProductName
()
+
"】"
+
"的"
+
"【"
+
remindCommonTask
.
getStockName
()
+
"/"
+
remindCommonTask
.
getCode
()
+
"】跌停,请及时查看!"
;
if
(
ObjectUtil
.
isNotEmpty
(
remindCommonTask
.
getWebHookUrl
()))
{
remindCommonTask
.
setTodayYields
(
"跌停"
);
this
.
sendWbeHooks
(
this
.
changeTask
(
remindCommonTask
),
memberBase
);
}
//发送公众号
TemplateKeyWordBuilder
datas
=
getTemplateKeyWordBuilder
(
cole
,
remark
);
//发送客户
String
jumpUrl
=
this
.
snedCustomer
(
remindCommonTask
,
product
,
datas
,
memberBase
);
if
(
ObjectUtil
.
isNotEmpty
(
adminListId
)
&&
adminListId
.
size
()
>
0
)
{
for
(
Long
aLong
:
adminListId
)
{
//发送公众号
log
.
info
(
"异动提醒:发送日志:{},数据:{},类型:{},路径:{}"
,
aLong
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
,
jumpUrl
);
weChatTemplateMessageService
.
pushToAdminUser
(
aLong
,
jumpUrl
,
datas
,
InformTypeEnums
.
MESSAGEREMIND
);
}
}
}
}
}
catch
(
Exception
e
)
{
log
.
info
(
"跌停错误信息:{},参数信息"
,
e
,
remindCommonTask
);
}
}
public
String
getJumpUrl
(
RemindCommonTask
remindCommonTask
)
{
if
(!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getSendCustomerState
())
&&
remindCommonTask
.
getSendCustomerState
()
>
0
)
{
//发送公众号
String
jumpUrl
=
null
;
Long
redisId
=
SnowflakeIdWorker
.
nextId
();
if
(!
ObjectUtil
.
isEmpty
(
remindCommonTask
.
getHyperlinkState
())
&&
remindCommonTask
.
getHyperlinkState
()
>
0
)
{
jumpUrl
=
commonConfig
.
getCustomeUrlr
()
+
"?id="
+
redisId
;
}
redisUtil
.
set
(
RedisKeyMessageConstant
.
REDIS_SEND_CM_KEY
+
redisId
,
remindCommonTask
.
getCode
());
return
jumpUrl
;
}
return
null
;
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/SmartProductCheckFullStopTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.constant.AdminConstant
;
import
com.zfxftech.telmarket.common.enums.StockInputLogTrustSource
;
import
com.zfxftech.telmarket.common.enums.followAccount.FollowAccountConfigRuleTypeEnum
;
import
com.zfxftech.telmarket.common.pojo.dao.Quote
;
import
com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin
;
import
com.zfxftech.telmarket.common.pojo.dao.smart.SmartAccountProductRelation
;
import
com.zfxftech.telmarket.common.pojo.dao.smart.SmartStockPosition
;
import
com.zfxftech.telmarket.common.pojo.request.smart.SmartSellingOrderBO
;
import
com.zfxftech.telmarket.common.pojo.vo.smart.SmartProductConfigRuleTaskVo
;
import
com.zfxftech.telmarket.common.util.BigDecimalUtil
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.common.util.followAccount.RedisUtilNew
;
import
com.zfxftech.telmarket.service.UsAdminService
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.business.smart.SmartAccountProductRelationService
;
import
com.zfxftech.telmarket.service.business.smart.SmartProductStockRiskService
;
import
com.zfxftech.telmarket.service.business.smart.SmartStockPositionService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
javax.annotation.Resource
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.TimeUnit
;
import
java.util.concurrent.atomic.AtomicReference
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
CompareTypeEnum
.
LESS
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
MarketTypeEnum
.
SIMULATED
;
/**
* 自动止盈止损
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
SmartProductCheckFullStopTask
implements
ApplicationRunner
{
@Autowired
SmartProductStockRiskService
productStockRiskService
;
@Autowired
SmartAccountProductRelationService
accountProductRelationService
;
@Resource
SmartStockPositionService
stockPositionService
;
@Autowired
private
StockCodeService
stockCodeService
;
@Autowired
private
UsAdminService
usAdminService
;
@Autowired
private
CommonConfig
commonConfig
;
@Autowired
private
RedisUtilNew
redisUtilNew
;
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"开始启智能跟投管更新开关状态:"
+
commonConfig
.
getProductCheckFullStopTaskSwitchSmart
());
if
(
commonConfig
.
getProductCheckFullStopTaskSwitchSmart
()
!=
null
&&
commonConfig
.
getProductCheckFullStopTaskSwitchSmart
().
equals
(
"run"
))
{
log
.
info
(
"开始智能跟投自动止盈止损"
);
//分页查询异动配置列表
ExecutorService
executorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorService1
=
Executors
.
newFixedThreadPool
(
40
);
CompletableFuture
.
runAsync
(()
->
{
UsAdmin
usAdmin
=
usAdminService
.
getAdminByUserId
(
AdminConstant
.
AuthorityTypeEnum
.
SUPERADMIN
.
getCode
().
toString
());
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
while
(
true
)
{
if
(
DateUtil
.
stopProfitIsTradeDay
())
{
AtomicReference
<
Integer
>
pageNo
=
new
AtomicReference
<>(
1
);
Integer
pageSize
=
200
;
Date
startTime
=
new
Date
();
List
<
SmartProductConfigRuleTaskVo
>
list
=
productStockRiskService
.
getListProductConfigTask
(
pageNo
.
get
(),
pageSize
);
//获取所有的智能跟投的止盈止损配置
if
(!
ObjectUtils
.
isEmpty
(
list
))
{
pageNo
.
set
(
pageNo
.
get
()
+
1
);
for
(
SmartProductConfigRuleTaskVo
productConfigRuleTaskVo
:
list
)
{
//开始遍历产品id
for
(
Integer
productId
:
productConfigRuleTaskVo
.
getProductIdList
())
{
//获取产品下面的股票
List
<
SmartStockPosition
>
fansDtoList
=
stockPositionService
.
getPositionList
(
productId
.
longValue
(),
null
,
null
,
null
,
null
);
for
(
SmartStockPosition
stockPosition
:
fansDtoList
)
{
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
//获取股票当前价格
Quote
quote
=
stockCodeService
.
queryStockPrice
(
stockPosition
.
getCode
());
//止盈
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
)
&&
!
ObjectUtils
.
isEmpty
(
productConfigRuleTaskVo
.
getType
())
&&
productConfigRuleTaskVo
.
getType
().
equals
(
FollowAccountConfigRuleTypeEnum
.
TAKE_PROFIT
.
getCode
())
&&
BigDecimalUtil
.
ge
(
stockPosition
.
getProfitLossRatio
(),
productConfigRuleTaskVo
.
getYields
())
&&
BigDecimalUtil
.
compare
(
quote
.
getNow
(),
quote
.
getHigh
(),
LESS
.
getCode
())
)
{
String
key
=
"SMARTFULLSTOP"
+
stockPosition
.
getCustomerId
()
+
"stop"
+
productConfigRuleTaskVo
.
getId
()
+
"productId"
+
stockPosition
.
getProductId
()
+
"code"
+
stockPosition
.
getCode
();
String
istrueStop
=
redisUtilNew
.
get
(
key
);
if
(
ObjectUtils
.
isEmpty
(
istrueStop
))
{
redisUtilNew
.
set
(
key
,
"Oversold"
,
12L
,
TimeUnit
.
HOURS
);
//查询是否是示范盘
SmartAccountProductRelation
istrue
=
accountProductRelationService
.
queryAccountProductRelationByMarketInfo
(
stockPosition
.
getMarketId
(),
SIMULATED
.
getCode
());
if
(
ObjectUtils
.
isEmpty
(
istrue
))
{
return
""
;
}
SmartSellingOrderBO
sellingOrderBO
=
new
SmartSellingOrderBO
();
sellingOrderBO
.
setCode
(
stockPosition
.
getCode
());
sellingOrderBO
.
setPosition
(
"1"
);
sellingOrderBO
.
setReason
(
"获利止盈!"
);
List
listId
=
new
ArrayList
();
listId
.
add
(
istrue
.
getId
());
sellingOrderBO
.
setPrice
(
String
.
valueOf
(
quote
.
getNow
()));
sellingOrderBO
.
setRelationId
(
listId
);
stockPositionService
.
sendSellingOrderTask
(
sellingOrderBO
,
usAdmin
,
StockInputLogTrustSource
.
AUTO_ZHIYING
);
}
}
//止损
else
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
)
&&
!
ObjectUtils
.
isEmpty
(
productConfigRuleTaskVo
.
getType
())
&&
productConfigRuleTaskVo
.
getType
().
equals
(
FollowAccountConfigRuleTypeEnum
.
STOP_LOSS
.
getCode
())
&&
BigDecimalUtil
.
le
(
stockPosition
.
getProfitLossRatio
(),
productConfigRuleTaskVo
.
getYields
())
)
{
String
key
=
"SMARTFULLSTOP"
+
stockPosition
.
getCustomerId
()
+
"stop"
+
productConfigRuleTaskVo
.
getId
()
+
"productId"
+
stockPosition
.
getProductId
()
+
"code"
+
stockPosition
.
getCode
();
String
istrueStop
=
redisUtilNew
.
get
(
key
);
if
(
ObjectUtils
.
isEmpty
(
istrueStop
))
{
redisUtilNew
.
set
(
key
,
"Oversold"
,
12L
,
TimeUnit
.
HOURS
);
//查询是否是示范盘
SmartAccountProductRelation
istrue
=
accountProductRelationService
.
queryAccountProductRelationByMarketInfo
(
stockPosition
.
getMarketId
(),
SIMULATED
.
getCode
());
if
(
ObjectUtils
.
isEmpty
(
istrue
))
{
return
""
;
}
SmartSellingOrderBO
sellingOrderBO
=
new
SmartSellingOrderBO
();
sellingOrderBO
.
setCode
(
stockPosition
.
getCode
());
sellingOrderBO
.
setPosition
(
"1"
);
sellingOrderBO
.
setReason
(
"清仓止损!"
);
List
listId
=
new
ArrayList
();
listId
.
add
(
istrue
.
getId
());
sellingOrderBO
.
setPrice
(
String
.
valueOf
(
quote
.
getNow
()));
sellingOrderBO
.
setRelationId
(
listId
);
stockPositionService
.
sendSellingOrderTask
(
sellingOrderBO
,
usAdmin
,
StockInputLogTrustSource
.
AUTO_ZHISUN
);
}
}
return
""
;
},
executorService1
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
info
(
"出错啦"
,
ex
);
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
}
}
}
}
else
{
pageNo
.
set
(
1
);
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
combinedFuture
.
get
();
log
.
info
(
"开始智能跟投自动止盈止损------主线程开始阻塞,消息发送完成--------"
);
log
.
info
(
"开始智能跟投自动止盈止损,本次共计算"
+
(
ObjectUtils
.
isEmpty
(
list
)
==
true
?
0
:
list
.
size
())
+
"开始智能跟投自动止盈止损数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
try
{
Thread
.
sleep
(
6000
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
try
{
Thread
.
sleep
(
6000
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
},
executorService
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/StockMatchTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.enums.followAccount.FollowAccountDealAddOrRemoveEnum
;
import
com.zfxftech.telmarket.common.enums.followAccount.FollowAccountOrderDirectionEnum
;
import
com.zfxftech.telmarket.common.enums.followAccount.FollowAccountOrderTypeEnum
;
import
com.zfxftech.telmarket.common.pojo.dao.Quote
;
import
com.zfxftech.telmarket.common.pojo.dao.followAccount.FollowAccountStockOrder
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.common.util.followAccount.FollowAccountLockUtil
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountStockDealService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountStockOrderService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.math.BigDecimal
;
import
java.util.*
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
/**
* Create time: 2022/1/26
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
StockMatchTask
implements
ApplicationRunner
{
@Autowired
CommonConfig
commonConfig
;
@Resource
StockCodeService
stockCodeService
;
@Resource
FollowAccountLockUtil
followAccountLockUtil
;
@Resource
FollowAccountStockDealService
followAccountStockDealService
;
@Resource
FollowAccountStockOrderService
followAccountStockOrderService
;
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
if
(
commonConfig
.
getFollowAccountStockMatchTaskSwitch
()
!=
null
&&
commonConfig
.
getFollowAccountStockMatchTaskSwitch
().
equals
(
"run"
))
{
log
.
info
(
"股票买卖撮合任务开始启动"
);
List
<
FollowAccountStockOrder
>
loadList
=
followAccountStockOrderService
.
queryAllProcessingFollowAccountStockOrder
();
for
(
FollowAccountStockOrder
followAccountStockOrder
:
loadList
)
{
StockMatchStaticInfo
.
addOrRemoveStockOrder
(
followAccountStockOrder
,
FollowAccountDealAddOrRemoveEnum
.
ADD
.
getCode
());
}
ExecutorService
executorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorService1
=
Executors
.
newFixedThreadPool
(
200
);
CompletableFuture
.
runAsync
(()
->
{
try
{
while
(
true
)
{
Date
startTime
=
new
Date
();
if
(
DateUtil
.
isTradeDay
())
{
//if(DateUtil.isTradeDayAndAfterNoon()){
log
.
info
(
"股票撮合开始执行"
);
boolean
matchSuccess
=
false
;
int
i
=
0
;
//Map<String, Quote> stockCurrentMap = stockCodeService.batchQueryStockPrice(StockMatchStaticInfo.getStockCodeList());
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
//开始循环撮合
//Map<Integer, FollowAccountStockOrder> orders = StockMatchStaticInfo.getStockOrder();
List
<
FollowAccountStockOrder
>
orders
=
followAccountStockOrderService
.
queryAllProcessingFollowAccountStockOrder
();
for
(
FollowAccountStockOrder
order
:
orders
)
{
//FollowAccountStockOrder order = StockMatchStaticInfo.getStockOrder().get(id);
Quote
quote
=
stockCodeService
.
getStockQuote
(
order
.
getCode
());
if
(
quote
==
null
){
log
.
info
(
"获取股票对象为空,股票:"
+
order
.
getCode
());
continue
;
}
//买入
if
(
order
.
getDirection
()
==
FollowAccountOrderDirectionEnum
.
BUY
.
getCode
())
{
//市价买入
if
(
order
.
getType
()
==
FollowAccountOrderTypeEnum
.
MARKET
.
getCode
())
{
//非涨停股
if
(
quote
.
getBid1
().
compareTo
(
new
BigDecimal
(
0
))
!=
0
)
{
//跌停股,按照卖1买入
if
(
quote
.
getAsk1
().
compareTo
(
new
BigDecimal
(
0
))
==
0
)
{
order
.
setDealPrice
(
quote
.
getBid1
());
}
//非跌停股,按照卖5买入 2022-4-7改为按照卖1买入
else
{
order
.
setDealPrice
(
quote
.
getBid1
());
}
}
//涨停股,按涨停价买入
else
{
order
.
setDealPrice
(
quote
.
getAsk1
());
}
matchSuccess
=
true
;
}
//限价买入
else
{
//非涨停股,比较卖1和限价判断是否买入
if
(
quote
.
getBid1
().
compareTo
(
new
BigDecimal
(
0
))
!=
0
)
{
if
(
order
.
getPrice
().
compareTo
(
quote
.
getBid1
())
>
-
1
)
{
order
.
setDealPrice
(
quote
.
getBid1
());
matchSuccess
=
true
;
}
}
//涨停股,比较买1和限价判断是否买入
else
{
if
(
order
.
getPrice
().
compareTo
(
quote
.
getAsk1
())
>
-
1
)
{
order
.
setDealPrice
(
quote
.
getAsk1
());
matchSuccess
=
true
;
}
}
}
if
(
order
.
getDealPrice
()
!=
null
&&
order
.
getDealPrice
().
compareTo
(
new
BigDecimal
(
0
))
==
0
)
log
.
error
(
"出现股价撮合错误,撮合成功但成成交价格0,股票:"
+
order
.
getCode
()
+
"订单"
+
order
.
getId
());
if
(
order
==
null
||
order
.
getDealPrice
()
==
null
||
order
.
getDealPrice
().
compareTo
(
new
BigDecimal
(
0
))
==
0
)
{
continue
;
}
if
(
matchSuccess
&&
(
order
.
getDealPrice
().
compareTo
(
new
BigDecimal
(
0
))
==
1
))
{
i
++;
FollowAccountStockOrder
finalOrder
=
order
;
CompletableFuture
<
String
>
future1
=
CompletableFuture
.
supplyAsync
(()
->
{
try
{
log
.
info
(
"撮合订单"
+
finalOrder
.
getId
()
+
"成功,股票代码:"
+
finalOrder
.
getCode
()
+
" 开始执行异步成交线程"
);
followAccountStockDealService
.
addFollowAccountDeal
(
finalOrder
);
log
.
info
(
"撮合订单"
+
finalOrder
.
getId
()
+
"成功,股票代码:"
+
finalOrder
.
getCode
()
+
" 异步线程执行完成"
);
}
catch
(
Exception
e
)
{
followAccountLockUtil
.
backLock
(
finalOrder
.
getFollowAccountId
());
log
.
error
(
"撮合错误异常,order:"
+
order
.
getId
(),
e
);
e
.
printStackTrace
();
}
return
""
;
},
executorService1
);
futureList
.
add
(
future1
);
}
}
//卖出
else
{
//限价卖出
if
(
order
.
getType
()
==
FollowAccountOrderTypeEnum
.
LIMITED
.
getCode
())
{
//涨停股
if
(
quote
.
getBid1
().
compareTo
(
new
BigDecimal
(
0
))
==
0
)
{
order
.
setPrice
(
quote
.
getAsk1
());
matchSuccess
=
true
;
}
else
{
order
.
setPrice
(
quote
.
getBid1
());
matchSuccess
=
true
;
}
}
//市价卖出
else
{
order
.
setPrice
(
quote
.
getAsk1
());
matchSuccess
=
true
;
}
if
(
matchSuccess
)
{
i
++;
FollowAccountStockOrder
finalOrder
=
order
;
CompletableFuture
<
String
>
future1
=
CompletableFuture
.
supplyAsync
(()
->
{
try
{
followAccountStockDealService
.
sellFollowAccountDeal
(
finalOrder
,
finalOrder
.
isAutoSell
(),
finalOrder
.
getAutoType
());
log
.
info
(
"撮合订单"
+
finalOrder
.
getId
()
+
"完成,股票代码:"
+
finalOrder
.
getCode
());
}
catch
(
Exception
e
)
{
followAccountLockUtil
.
backLock
(
finalOrder
.
getFollowAccountId
());
log
.
error
(
"撮合错误异常,order:"
+
order
.
getId
(),
e
);
e
.
printStackTrace
();
}
return
""
;
},
executorService1
);
futureList
.
add
(
future1
);
}
}
}
if
(
futureList
.
size
()
>
0
)
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
log
.
info
(
"全部委托中的订单开始进行撮合--------主线程开始阻塞,等待撮合全部完成--------"
);
try
{
combinedFuture
.
get
();
}
catch
(
Exception
e
)
{
log
.
error
(
"系统未知异常1"
,
e
);
}
log
.
info
(
"撮合完成,共尝试撮合股票"
+
i
+
"支,共耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
i
=
0
;
}
try
{
Thread
.
sleep
(
1000
);
}
catch
(
Exception
e
)
{
log
.
error
(
"系统未知异常2"
,
e
);
}
}
}
catch
(
Exception
e
){
e
.
printStackTrace
();
log
.
error
(
"撮合股票出现异常"
,
e
);
}
},
executorService
);
}
else
{
log
.
info
(
"股票买卖撮合任务开关状态为关闭,股票撮合任务不启动"
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/StockPoolDetailsTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
followAccount
;
import
com.zfxftech.telmarket.common.config.CommonConfig
;
import
com.zfxftech.telmarket.common.constant.AdminConstant
;
import
com.zfxftech.telmarket.common.enums.StockInputLogTrustSource
;
import
com.zfxftech.telmarket.common.pojo.dao.*
;
import
com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin
;
import
com.zfxftech.telmarket.common.pojo.request.SellingOrderBO
;
import
com.zfxftech.telmarket.common.util.BigDecimalUtil
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.service.UsAdminService
;
import
com.zfxftech.telmarket.service.business.AccountProductRelationService
;
import
com.zfxftech.telmarket.service.business.StockCodeService
;
import
com.zfxftech.telmarket.service.business.StockPoolDetailsService
;
import
com.zfxftech.telmarket.service.business.StockPositionService
;
import
com.zfxftech.telmarket.service.product.ProductStockRiskService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.ApplicationArguments
;
import
org.springframework.boot.ApplicationRunner
;
import
org.springframework.core.annotation.Order
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.ObjectUtils
;
import
java.math.BigDecimal
;
import
java.util.ArrayList
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.concurrent.CompletableFuture
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.atomic.AtomicReference
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
MarketTypeEnum
.
SIMULATED
;
import
static
com
.
zfxftech
.
telmarket
.
common
.
constant
.
AdminConstant
.
NumberEnum
.
HUNDRED
;
/**
* 自动止盈止损
*/
@Slf4j
@Component
@Order
(
value
=
1
)
public
class
StockPoolDetailsTask
implements
ApplicationRunner
{
@Autowired
ProductStockRiskService
productStockRiskService
;
@Autowired
AccountProductRelationService
accountProductRelationService
;
@Autowired
StockPositionService
stockPositionService
;
@Autowired
private
StockCodeService
stockCodeService
;
@Autowired
private
UsAdminService
usAdminService
;
@Autowired
private
CommonConfig
commonConfig
;
@Autowired
private
StockPoolDetailsService
stockPoolDetailsService
;
@Override
public
void
run
(
ApplicationArguments
args
)
throws
Exception
{
log
.
info
(
"开始启动股票池更新开关状态:"
+
commonConfig
.
getProductCheckFullStopTaskSwitch
());
//分页查询异动配置列表
ExecutorService
executorService
=
Executors
.
newSingleThreadExecutor
();
ExecutorService
executorService1
=
Executors
.
newFixedThreadPool
(
40
);
CompletableFuture
.
runAsync
(()
->
{
while
(
true
)
{
if
(
DateUtil
.
stopProfitIsTradeDay
())
{
UsAdmin
usAdmin
=
usAdminService
.
getAdminByUserId
(
AdminConstant
.
AuthorityTypeEnum
.
SUPERADMIN
.
getCode
().
toString
());
AtomicReference
<
Integer
>
pageNo
=
new
AtomicReference
<>(
1
);
Integer
pageSize
=
200
;
if
(
commonConfig
.
getProductCheckFullStopTaskSwitch
()
!=
null
&&
commonConfig
.
getProductCheckFullStopTaskSwitch
().
equals
(
"run"
))
{
Date
startTime
=
new
Date
();
//获取所有的股票池的止盈止损配置
List
<
CompletableFuture
<
String
>>
futureList
=
new
ArrayList
<>();
List
<
StockPoolDetails
>
list
=
stockPoolDetailsService
.
getStockPoolListTask
(
pageNo
.
get
(),
pageSize
);
if
(!
ObjectUtils
.
isEmpty
(
list
))
{
pageNo
.
set
(
pageNo
.
get
()
+
1
);
for
(
StockPoolDetails
stockPoolDetails
:
list
)
{
if
((
ObjectUtils
.
isEmpty
(
stockPoolDetails
.
getIsStopLoss
())
&&
ObjectUtils
.
isEmpty
(
stockPoolDetails
.
getIsStopProfit
()))
||
(
stockPoolDetails
.
getIsStopLoss
().
equals
(
0
)
&&
stockPoolDetails
.
getIsStopProfit
().
equals
(
0
)))
{
continue
;
}
BigDecimal
stopProfit
=
null
;
BigDecimal
stopLoss
=
null
;
if
(!
StringUtils
.
isEmpty
(
stockPoolDetails
.
getStopProfit
()))
{
if
(
stockPoolDetails
.
getStopProfit
().
contains
(
"%"
))
{
stopProfit
=
BigDecimalUtil
.
div
(
StringUtils
.
trim
(
stockPoolDetails
.
getStopProfit
().
replace
(
"%"
,
" "
)),
HUNDRED
.
getCode
().
toString
());
}
else
{
stopProfit
=
new
BigDecimal
(
stockPoolDetails
.
getStopProfit
());
}
}
if
(!
StringUtils
.
isEmpty
(
stockPoolDetails
.
getStopLoss
()))
{
if
(
stockPoolDetails
.
getStopLoss
().
contains
(
"%"
))
{
stopLoss
=
BigDecimalUtil
.
div
(
StringUtils
.
trim
(
stockPoolDetails
.
getStopLoss
().
replace
(
"%"
,
" "
)),
HUNDRED
.
getCode
().
toString
());
}
else
{
stopLoss
=
new
BigDecimal
(
stockPoolDetails
.
getStopLoss
());
}
}
List
<
StockPosition
>
fansDtoList
=
stockPositionService
.
getPositionList
(
null
,
null
,
stockPoolDetails
.
getStockCode
(),
stopProfit
,
stopLoss
);
for
(
StockPosition
stockPosition
:
fansDtoList
)
{
CompletableFuture
cf
=
CompletableFuture
.
supplyAsync
(()
->
{
//查询是否是示范盘
AccountProductRelation
istrue
=
accountProductRelationService
.
queryAccountProductRelationByMarketInfo
(
stockPosition
.
getMarketId
(),
SIMULATED
.
getCode
());
if
(!
ObjectUtils
.
isEmpty
(
istrue
))
{
if
(!
StringUtils
.
isEmpty
(
stockPoolDetails
.
getStopProfit
())
&&
stockPoolDetails
.
getStopProfit
().
contains
(
"%"
))
{
stockPoolDetails
.
setStopProfit
(
String
.
valueOf
(
BigDecimalUtil
.
div
(
StringUtils
.
trim
(
stockPoolDetails
.
getStopProfit
().
replace
(
"%"
,
" "
)),
HUNDRED
.
getCode
().
toString
())));
}
if
(!
StringUtils
.
isEmpty
(
stockPoolDetails
.
getStopLoss
())
&&
stockPoolDetails
.
getStopLoss
().
contains
(
"%"
))
{
stockPoolDetails
.
setStopLoss
(
String
.
valueOf
(
BigDecimalUtil
.
div
(
StringUtils
.
trim
(
stockPoolDetails
.
getStopLoss
().
replace
(
"%"
,
" "
)),
HUNDRED
.
getCode
().
toString
())));
}
//获取股票当前价格
Quote
quote
=
stockCodeService
.
queryStockPrice
(
stockPosition
.
getCode
());
String
pushTime
=
DateUtil
.
getNow
();
TradingStrategyParam
tradingStrategyParam
=
stockPositionService
.
createTradingStrategyParam
(
pushTime
,
"清仓"
,
istrue
,
""
,
""
);
//止盈
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
)
&&
!
ObjectUtils
.
isEmpty
(
stockPoolDetails
.
getIsStopProfit
())
&&
!
ObjectUtils
.
isEmpty
(
stockPoolDetails
.
getStopProfit
())
&&
String
.
valueOf
(
stockPoolDetails
.
getIsStopProfit
()).
equals
(
"1"
)
&&
BigDecimalUtil
.
ge
(
stockPosition
.
getProfitLossRatio
(),
new
BigDecimal
(
stockPoolDetails
.
getStopProfit
()))
)
{
//tradingStrategyParam.setReason("获利止盈");
//清仓操作
// stockPositionService.selling(istrue, stockPosition, ALL_POSITION, quote.getNow(), tradingStrategyParam, usAdmin, false, StockInputLogTrustSource.AUTO_ZHIYING);
SellingOrderBO
sellingOrderBO
=
new
SellingOrderBO
();
sellingOrderBO
.
setCode
(
stockPosition
.
getCode
());
sellingOrderBO
.
setPosition
(
"1"
);
sellingOrderBO
.
setReason
(
"获利止盈"
);
List
listId
=
new
ArrayList
();
listId
.
add
(
istrue
.
getId
());
sellingOrderBO
.
setRelationId
(
listId
);
sellingOrderBO
.
setPrice
(
String
.
valueOf
(
quote
.
getNow
()));
stockPositionService
.
sendSellingOrderTask
(
sellingOrderBO
,
usAdmin
,
StockInputLogTrustSource
.
AUTO_ZHIYING
);
}
//止损
if
(!
ObjectUtils
.
isEmpty
(
stockPosition
)
&&
!
ObjectUtils
.
isEmpty
(
stockPoolDetails
.
getStopLoss
())
&&
!
ObjectUtils
.
isEmpty
(
stockPoolDetails
.
getIsStopLoss
())
&&
String
.
valueOf
(
stockPoolDetails
.
getIsStopLoss
()).
equals
(
"1"
)
&&
BigDecimalUtil
.
le
(
stockPosition
.
getProfitLossRatio
(),
new
BigDecimal
(
stockPoolDetails
.
getStopLoss
()))
)
{
//清仓操作
// tradingStrategyParam.setReason("清仓止损");
// //清仓操作
// stockPositionService.selling(istrue, stockPosition, ALL_POSITION, quote.getNow(), tradingStrategyParam, usAdmin, false, StockInputLogTrustSource.AUTO_ZHISUN);
SellingOrderBO
sellingOrderBO
=
new
SellingOrderBO
();
sellingOrderBO
.
setCode
(
stockPosition
.
getCode
());
sellingOrderBO
.
setPosition
(
"1"
);
sellingOrderBO
.
setReason
(
"清仓止损"
);
List
listId
=
new
ArrayList
();
listId
.
add
(
istrue
.
getId
());
sellingOrderBO
.
setPrice
(
String
.
valueOf
(
quote
.
getNow
()));
sellingOrderBO
.
setRelationId
(
listId
);
stockPositionService
.
sendSellingOrderTask
(
sellingOrderBO
,
usAdmin
,
StockInputLogTrustSource
.
AUTO_ZHISUN
);
//推送消息
}
}
return
""
;
},
executorService1
).
handle
((
result
,
ex
)
->
{
if
(
null
!=
ex
)
{
log
.
info
(
"出错啦"
,
ex
);
return
0
;
}
else
{
return
result
;
}
});
futureList
.
add
(
cf
);
}
}
}
else
{
pageNo
.
set
(
1
);
}
try
{
CompletableFuture
<
Void
>
combinedFuture
=
CompletableFuture
.
allOf
(
futureList
.
toArray
(
new
CompletableFuture
[
0
]));
combinedFuture
.
get
();
log
.
info
(
"开始股票池自动止盈止损------主线程开始阻塞,消息发送完成--------"
);
log
.
info
(
"开始股票池自动止盈止损,本次共计算"
+
(
ObjectUtils
.
isEmpty
(
list
)
==
true
?
0
:
list
.
size
())
+
"开始股票池自动止盈止损数据。耗时"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
())
+
"秒"
);
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
}
}
try
{
Thread
.
sleep
(
8000
);
}
catch
(
Exception
e
){
e
.
printStackTrace
();
}
}
},
executorService
);
}
}
src/main/java/com/zfxftech/telmarket/task/followAccount/StockPriceRealTimeTask.java
deleted
100644 → 0
View file @
a5f02bc0
//package com.zfxftech.telmarket.task.followAccount;
//
//import com.zfxftech.telmarket.common.pojo.dao.Quote;
//import com.zfxftech.telmarket.common.pojo.dao.StocksCode;
//import com.zfxftech.telmarket.common.util.DateUtil;
//import com.zfxftech.telmarket.service.business.StockCodeService;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.ApplicationArguments;
//import org.springframework.boot.ApplicationRunner;
//import org.springframework.core.annotation.Order;
//import org.springframework.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//import org.springframework.util.ObjectUtils;
//
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.CompletableFuture;
//import java.util.concurrent.ExecutorService;
//import java.util.concurrent.Executors;
//import java.util.concurrent.atomic.AtomicReference;
//import java.util.stream.Collectors;
//
///**
// * Create time: 2022/1/26
// */
//@Slf4j
//@Component
//@Order(value = 1)
///**
// * 更新股票价格 股票更新价格 stocks_code
// */
//public class StockPriceRealTimeTask implements ApplicationRunner {
//
// @Autowired
// private StockCodeService stockCodeService;
//
//
// @Override
// public void run(ApplicationArguments args) throws Exception {
// log.info("股票更新价格正式环境日志输出");
// ExecutorService PersonalexecutorService = Executors.newSingleThreadExecutor();
// ExecutorService executorServicePersonal = Executors.newFixedThreadPool(80);
// CompletableFuture.runAsync(() -> {
// while (true) {
// //if (DateUtil.stopProfitIsTradeDay()) {
// if (true) {
// AtomicReference<Integer> pageNo = new AtomicReference<>(1);
// Integer pageSize = 200;
// Date startTime = new Date();
// List<CompletableFuture<String>> futureList = new ArrayList<>();
// List<StocksCode> stocksCodeList = stockCodeService.selectAllStockCode();
// log.info("股票更新价格数据大小:{}",stocksCodeList.size());
// if (!ObjectUtils.isEmpty(stocksCodeList) && stocksCodeList.size() > 0) {
// Integer pageTOtl = stocksCodeList.size() % pageSize == 0 ? stocksCodeList.size() / pageSize : stocksCodeList.size() / pageSize + 1;
// for (Integer i = 0; i < pageTOtl; i++) {
//
// List<StocksCode> positionListPage = this.page(stocksCodeList, pageNo.get(), pageSize);
// CompletableFuture cf = CompletableFuture.supplyAsync(() -> {
// List<String> codes = positionListPage.stream().map(StocksCode::getSymbol).collect(Collectors.toList());
//
// Map<String, Quote> quoteMap = stockCodeService.batchQueryStockPrice(codes);
//
// for (StocksCode stocksCode : positionListPage) {
// Quote quote = quoteMap.get(stocksCode.getSymbol());
// stocksCode.setCurrentPrice(quote.getNow());
// }
// //批量更新
// stockCodeService.batchUpdateCurrentPrice(positionListPage);
// return " ";
// }, executorServicePersonal).handle((result, ex) -> {
// if (null != ex) {
// log.error("股票更新价格错误消息:{}", ex);
// return 0;
// } else {
// return result;
// }
// });
// futureList.add(cf);
// pageNo.set(pageNo.get() + 1);
// }
// }
// try {
// CompletableFuture<Void> combinedFuture = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]));
// combinedFuture.get();
// log.info("股票更新价格提醒,本次共计算" + (ObjectUtils.isEmpty(stocksCodeList) == true ? 0 : stocksCodeList.size()) + "股票更新价格数据。耗时" + DateUtil.calculateTimeGapSecond(startTime, new Date()) + "秒");
// } catch (Exception e) {
// log.error("股票更新价格错误信息:{}",e);
// e.printStackTrace();
// }
// try {
// Thread.sleep(100000);
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// }else{
// try {
// Thread.sleep(80000);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
//
//
//
// }
//
// }, PersonalexecutorService);
// }
//
// public List<StocksCode> page(List<StocksCode> list, Integer pageNo, Integer pageSize) {
// if (CollectionUtils.isEmpty(list)) {
// return list;
// }
// List<StocksCode> resultList = new ArrayList();
// // 所有dataList数据中的第几条
// int currIdx = pageNo > 1 ? (pageNo - 1) * pageSize : 0;
// for (int i = 0; i < pageSize && i < list.size() - currIdx; i++) {
// resultList.add(list.get(currIdx + i));
// }
// return resultList;
// }
//
//
//}
//
src/main/java/com/zfxftech/telmarket/task/report/PersonReportTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
report
;
import
com.zfxftech.telmarket.common.pojo.dao.report.ReportData
;
import
com.zfxftech.telmarket.common.util.DateUtil
;
import
com.zfxftech.telmarket.service.business.AccountProductRelationService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountPositionInfoService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountService
;
import
com.zfxftech.telmarket.service.followAccount.FollowAccountYieldsRecordService
;
import
com.zfxftech.telmarket.service.report.PersonalReportService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.EnableScheduling
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.Date
;
/**
* Create time: 2022/2/3
*/
@EnableScheduling
@Component
@Slf4j
public
class
PersonReportTask
{
@Autowired
PersonalReportService
personalReportService
;
@Autowired
AccountProductRelationService
accountProductRelationService
;
@Scheduled
(
cron
=
"0 3 15 * * MON-FRI"
)
private
void
followAccountYieldsRecordRunTask
()
{
try
{
log
.
info
(
"开始生成私人订制日报表"
);
Date
startTime
=
new
Date
();
personalReportService
.
personReportTask1
();
log
.
info
(
"私人订制日报表1生成完成 共耗时:"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
()));
personalReportService
.
personReportTask2
();
personalReportService
.
personReportTask3
();
personalReportService
.
personReportTask4
();
log
.
info
(
"私人订制日报表全部生成完成 共耗时:"
+
DateUtil
.
calculateTimeGapSecond
(
startTime
,
new
Date
()));
}
catch
(
Exception
e
){
log
.
error
(
"私人订制日报表生成失败"
,
e
);
}
}
}
src/main/java/com/zfxftech/telmarket/task/stock/position/StockPositionTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
stock
.
position
;
import
cn.hutool.core.date.DateTime
;
import
com.zfxf.tools.utils.DateTimeUtil
;
import
com.zfxftech.telmarket.service.business.StockPositionService
;
import
com.zfxftech.telmarket.service.business.asset.AssetStockPositionService
;
import
com.zfxftech.telmarket.service.business.smart.SmartStockPositionService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
@Slf4j
@Component
public
class
StockPositionTask
{
@Autowired
private
StockPositionService
stockPositionService
;
@Autowired
private
AssetStockPositionService
assetStockPositionService
;
@Autowired
private
SmartStockPositionService
smartStockPositionService
;
/**
* 同步今天涨跌幅到昨日涨跌幅字段中
* */
@Scheduled
(
cron
=
"0 30 22,23 * * ?"
)
public
void
syncYdayRiseDownRange
()
{
String
date
=
DateTimeUtil
.
today
();
log
.
info
(
"同步[{}]昨日涨跌幅开始"
,
date
);
stockPositionService
.
syncYdayRiseDownRange
(
DateTime
.
now
()
);
log
.
info
(
"同步[{}]昨日涨跌幅结束"
,
date
);
log
.
info
(
"同步Asset[{}]昨日涨跌幅开始"
,
date
);
assetStockPositionService
.
syncYdayRiseDownRange
(
DateTime
.
now
()
);
log
.
info
(
"同步Asset[{}]昨日涨跌幅结束"
,
date
);
log
.
info
(
"同步Smart[{}]昨日涨跌幅开始"
,
date
);
smartStockPositionService
.
syncYdayRiseDownRange
(
DateTime
.
now
()
);
log
.
info
(
"同步Smart[{}]昨日涨跌幅结束"
,
date
);
}
/**
* 同步今天涨跌幅到昨日涨跌幅字段中
* */
//@Scheduled(cron = "0 5,30 18,22,23 * * ?")
public
void
syncYdayRiseDownRangeForAsset
()
{
String
date
=
DateTimeUtil
.
today
();
log
.
info
(
"同步Asset[{}]昨日涨跌幅开始"
,
date
);
assetStockPositionService
.
syncYdayRiseDownRange
(
DateTime
.
now
()
);
log
.
info
(
"同步Asset[{}]昨日涨跌幅结束"
,
date
);
}
/**
* 同步今天涨跌幅到昨日涨跌幅字段中
* */
//@Scheduled(cron = "0 5,32 22,23 * * ?")
public
void
syncYdayRiseDownRangeForSmart
()
{
String
date
=
DateTimeUtil
.
today
();
log
.
info
(
"同步Smart[{}]昨日涨跌幅开始"
,
date
);
smartStockPositionService
.
syncYdayRiseDownRange
(
DateTime
.
now
()
);
log
.
info
(
"同步Smart[{}]昨日涨跌幅结束"
,
date
);
}
}
src/main/java/com/zfxftech/telmarket/task/wechat/WechatOperTask.java
deleted
100644 → 0
View file @
a5f02bc0
package
com
.
zfxftech
.
telmarket
.
task
.
wechat
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.json.JSONObject
;
import
cn.hutool.json.JSONUtil
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.google.common.collect.Maps
;
import
com.zfxf.tools.utils.AssertUtil
;
import
com.zfxf.tools.utils.DateTimeUtil
;
import
com.zfxf.tools.wechat.callback.handler.TemplateSendMsgEventHandler
;
import
com.zfxf.tools.wechat.domain.api.template.TemplateInfoDTO
;
import
com.zfxf.tools.wechat.domain.callback.MessageContextDTO
;
import
com.zfxf.tools.wechat.domain.callback.event.TemplateSendEventMsg
;
import
com.zfxf.tools.wechat.helper.api.TemplateHelper
;
import
com.zfxf.tools.wechat.helper.api.UserInfoHelper
;
import
com.zfxftech.telmarket.common.bean.CommonResult
;
import
com.zfxftech.telmarket.common.bean.EnvConfig
;
import
com.zfxftech.telmarket.common.config.AppOfficialAccountConfig
;
import
com.zfxftech.telmarket.common.constant.RedisKeyMessageConstant
;
import
com.zfxftech.telmarket.common.enums.wx.GetTokenStatus
;
import
com.zfxftech.telmarket.common.enums.wx.TemplateResultStatus
;
import
com.zfxftech.telmarket.common.pojo.dao.WeChatOfficialAccount
;
import
com.zfxftech.telmarket.common.pojo.dao.WeChatTemplateRelation
;
import
com.zfxftech.telmarket.common.pojo.dto.redis.HandlerFansInfoDTO
;
import
com.zfxftech.telmarket.common.pojo.dto.redis.RedisQueueMessageBody
;
import
com.zfxftech.telmarket.service.business.FansFollowRecordService
;
import
com.zfxftech.telmarket.service.business.WeChatOfficialAccountService
;
import
com.zfxftech.telmarket.service.business.WeChatTemplateRelationService
;
import
com.zfxftech.telmarket.service.redis.RedisService
;
import
com.zfxftech.telmarket.service.wx.HandlerTempMsgInfoService
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.dao.QueryTimeoutException
;
import
org.springframework.scheduling.annotation.EnableScheduling
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
javax.annotation.Resource
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
@Slf4j
@Component
public
class
WechatOperTask
{
@Resource
private
WeChatOfficialAccountService
weChatOfficialAccountService
;
@Resource
private
WeChatTemplateRelationService
weChatTemplateRelationService
;
@Resource
private
FansFollowRecordService
fansFollowRecordService
;
@Resource
private
EnvConfig
envConfig
;
@Autowired
@Qualifier
(
"redisServiceNoWrapper"
)
private
RedisService
redisService
;
@Resource
private
AppOfficialAccountConfig
appOfficialAccountConfig
;
@Resource
private
TemplateSendMsgEventHandler
templateSendMsgEventHandler
;
@ApiOperation
(
value
=
"刷新WechatToken"
,
notes
=
"刷新WechatToken"
)
//@Scheduled(cron = "*/1 * * * * ?")
//@Scheduled(cron = "*/5 * * * * ?")
public
void
refreshWechatToken
()
{
}
@ApiOperation
(
value
=
"定时更新微信模板"
,
notes
=
"定时更新微信模板"
)
@Scheduled
(
cron
=
"0 */30 * * * ?"
)
//@Scheduled(cron = "*/5 * * * * ?")
public
void
updateAllTemplate
()
{
log
.
info
(
">>>>定时更新微信模板<<<"
);
List
<
WeChatOfficialAccount
>
list
=
weChatOfficialAccountService
.
list
(
new
LambdaQueryWrapper
<
WeChatOfficialAccount
>().
eq
(
WeChatOfficialAccount:
:
getGetToken
,
GetTokenStatus
.
GET
.
getCode
()
)
);
if
(
list
!=
null
&&
list
.
size
()>
0
){
log
.
info
(
"待同步微信模板 app数:{}"
,
list
.
size
());
list
.
forEach
(
app
->{
try
{
if
(
envConfig
.
isUseWechatApi
())
{
weChatTemplateRelationService
.
syncWechatAllTemplate
(
app
);
}
}
catch
(
Exception
e
){
log
.
error
(
"Appid="
+
app
.
getAppId
()+
"更新模板失败"
,
e
);
}
});
}
}
@ApiOperation
(
value
=
"同步微信所有用户信息"
,
notes
=
"同步微信所有用户信息"
)
//@Scheduled(cron = "0 0 1 * * ?")
@Scheduled
(
cron
=
"0 0 1,7,12,21 * * ?"
)
public
void
syncWechatUserInfo
()
{
List
<
WeChatOfficialAccount
>
list
=
weChatOfficialAccountService
.
list
(
new
LambdaQueryWrapper
<
WeChatOfficialAccount
>().
eq
(
WeChatOfficialAccount:
:
getGetToken
,
GetTokenStatus
.
GET
.
getCode
()
)
);
if
(
list
!=
null
&&
list
.
size
()>
0
){
list
.
forEach
(
app
->{
try
{
if
(
appOfficialAccountConfig
.
getSyncUserInfo
())
{
UserInfoHelper
.
getAllUserInfo
(
app
.
getAppId
());
}
}
catch
(
Exception
e
){
log
.
error
(
"Appid="
+
app
.
getAppId
()+
"同步用户信息失败"
,
e
);
}
});
}
}
/**
* djx
* 处理粉丝信息
*/
@Scheduled
(
initialDelay
=
1000
,
fixedRate
=
1000
)
//@Scheduled(cron = "1 * * * * ?")
public
void
handlerFansInfo
()
{
int
count
=
1
;
while
(
count
<=
50
)
{
try
{
Object
infoMsg
=
redisService
.
rightPopMessage
(
RedisKeyMessageConstant
.
RedisHandlerFansInfoKey
);
if
(
infoMsg
!=
null
)
{
if
(
count
==
1
||
count
%
10
==
0
){
log
.
info
(
"定时处理粉丝信息>>>"
);
}
RedisQueueMessageBody
pushRedisParamVO
=
JSONUtil
.
toBean
(
infoMsg
.
toString
(),
RedisQueueMessageBody
.
class
);
String
jsonValue
=
pushRedisParamVO
.
getBusParam
();
//log.info(jsonValue);
HandlerFansInfoDTO
handlerFansInfoDTO
=
JSONUtil
.
toBean
(
jsonValue
,
HandlerFansInfoDTO
.
class
);
fansFollowRecordService
.
addOrUpdateUserInfo
(
handlerFansInfoDTO
.
getAccount
(),
handlerFansInfoDTO
.
getUser
()
);
//判断是否推送成功,不成功重复三次推送
// if (!result && pushRedisParamVO.getPushCounter() < 3) {
// pushRedisParamVO.appendCounter();
// template.opsForList().leftPush(
// Constants.DOUNIU_PUSH_TEMP_MSG_TOPIC,
// JSON.toJSONString(pushRedisParamVO)
// );
// }
}
else
{
break
;
}
}
catch
(
Exception
e
){
if
(
!(
e
instanceof
QueryTimeoutException
))
{
log
.
error
(
"定时处理粉丝信息异常"
,
e
);
}
}
finally
{
count
++;
}
}
}
/**
* djx
* 定时处理微信模板回调信息
*/
@Scheduled
(
initialDelay
=
1000
,
fixedRate
=
1000
)
public
void
handlerTempMsgInfo
()
{
int
count
=
1
;
while
(
count
<=
50
)
{
try
{
Object
infoMsg
=
redisService
.
rightPopMessage
(
RedisKeyMessageConstant
.
RedisHandlerCBKInfoKey
);
if
(
infoMsg
!=
null
)
{
if
(
count
==
1
||
count
%
10
==
0
){
log
.
info
(
"定时处理微信模板回调信息>>>"
);
}
MessageContextDTO
messageContext
=
JSONUtil
.
toBean
(
infoMsg
.
toString
(),
MessageContextDTO
.
class
);
Object
messageObj
=
messageContext
.
getMessage
();
if
(
messageObj
==
null
){
log
.
error
(
"微信回调消息存在错误:{}"
,
infoMsg
);
continue
;
}
JSONObject
jsonValue
=
(
JSONObject
)
messageObj
;
log
.
info
(
jsonValue
.
toString
());
Map
<
String
,
String
>
data
=
Maps
.
newHashMap
();
data
.
put
(
"Event"
,
jsonValue
.
containsKey
(
"event"
)?
jsonValue
.
get
(
"event"
).
toString
():
""
);
data
.
put
(
"MsgID"
,
jsonValue
.
containsKey
(
"msgId"
)?
jsonValue
.
get
(
"msgId"
).
toString
():
""
);
data
.
put
(
"Status"
,
jsonValue
.
containsKey
(
"status"
)?
jsonValue
.
get
(
"status"
).
toString
():
""
);
data
.
put
(
"CreateTime"
,
jsonValue
.
containsKey
(
"createTime"
)?
jsonValue
.
get
(
"createTime"
).
toString
():
"0"
);
data
.
put
(
"MsgType"
,
jsonValue
.
containsKey
(
"msgType"
)?
jsonValue
.
get
(
"msgType"
).
toString
():
""
);
data
.
put
(
"ToUserName"
,
jsonValue
.
containsKey
(
"toUserName"
)?
jsonValue
.
get
(
"toUserName"
).
toString
():
""
);
data
.
put
(
"FromUserName"
,
jsonValue
.
containsKey
(
"fromUserName"
)?
jsonValue
.
get
(
"fromUserName"
).
toString
():
""
);
TemplateSendEventMsg
handlerMsgInfoDTO
=
new
TemplateSendEventMsg
(
data
);
MessageContextDTO
<
TemplateSendEventMsg
>
target
=
new
MessageContextDTO
<>();
BeanUtils
.
copyProperties
(
messageContext
,
target
);
target
.
setMessage
(
handlerMsgInfoDTO
);
templateSendMsgEventHandler
.
handler
(
target
);
}
else
{
break
;
}
}
catch
(
Exception
e
){
if
(
!(
e
instanceof
QueryTimeoutException
))
{
log
.
error
(
"定时处理微信模板回调信息"
,
e
);
}
}
finally
{
count
++;
}
}
}
}
src/main/resources/bootstrap-dev.yml
View file @
65ae7326
...
@@ -2,7 +2,7 @@ server:
...
@@ -2,7 +2,7 @@ server:
port
:
8081
port
:
8081
spring
:
spring
:
application
:
application
:
name
:
invest-admin
name
:
stockPrice-task
cloud
:
cloud
:
nacos
:
nacos
:
config
:
config
:
...
@@ -14,4 +14,4 @@ spring:
...
@@ -14,4 +14,4 @@ spring:
discovery
:
discovery
:
group
:
APP_GROUP
group
:
APP_GROUP
server-addr
:
47.93.96.150:8848
server-addr
:
47.93.96.150:8848
service
:
invest-admin
service
:
stockPrice-task
\ No newline at end of file
\ No newline at end of file
src/main/resources/bootstrap-pro.yml
View file @
65ae7326
...
@@ -2,7 +2,7 @@ server:
...
@@ -2,7 +2,7 @@ server:
port
:
8383
port
:
8383
spring
:
spring
:
application
:
application
:
name
:
invest-admin
name
:
stockPrice-task
cloud
:
cloud
:
nacos
:
nacos
:
config
:
config
:
...
@@ -14,4 +14,4 @@ spring:
...
@@ -14,4 +14,4 @@ spring:
discovery
:
discovery
:
group
:
APP_GROUP
group
:
APP_GROUP
server-addr
:
172.17.188.83:8848
server-addr
:
172.17.188.83:8848
service
:
invest-admin
service
:
stockPrice-task
\ No newline at end of file
\ No newline at end of file
src/main/resources/bootstrap-test.yml
View file @
65ae7326
...
@@ -2,7 +2,7 @@ server:
...
@@ -2,7 +2,7 @@ server:
port
:
8083
port
:
8083
spring
:
spring
:
application
:
application
:
name
:
invest-admin
name
:
stockPrice-task
cloud
:
cloud
:
nacos
:
nacos
:
config
:
config
:
...
@@ -14,5 +14,5 @@ spring:
...
@@ -14,5 +14,5 @@ spring:
discovery
:
discovery
:
group
:
APP_GROUP
group
:
APP_GROUP
server-addr
:
172.17.188.83:8848
server-addr
:
172.17.188.83:8848
service
:
invest-admin
service
:
stockPrice-task
src/main/resources/logback-spring.xml
View file @
65ae7326
...
@@ -8,7 +8,7 @@
...
@@ -8,7 +8,7 @@
<contextName>
logback
</contextName>
<contextName>
logback
</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
<property
name=
"log.path"
value=
"/opt/logs/
newinvest
"
/>
<property
name=
"log.path"
value=
"/opt/logs/
pricetack
"
/>
<!--0. 日志格式和颜色渲染 -->
<!--0. 日志格式和颜色渲染 -->
<!-- 彩色日志依赖的渲染类 -->
<!-- 彩色日志依赖的渲染类 -->
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment