Commit 65ae7326 authored by liucx's avatar liucx

完善

parent 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("成功");
}
}
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;
}
}
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);
}
}
}
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);
}
}
}
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;
}
}
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);
}
}
}
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("今天非交易日,退出自动卖出股票");
}
}
}
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);
}
}
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);
}
}
}
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;
}
}
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);
}
}
}
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);
// }
}
}
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);
}
}
}
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);
}
}
}
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;
}
}
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);
}
}
}
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;
}
}
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);
}
}
}
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("股票买卖撮合任务开关状态为关闭,股票撮合任务不启动");
}
}
}
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);
}
}
//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;
// }
//
//
//}
//
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);
}
}
}
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);
}
}
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++;
}
}
}
}
......@@ -2,7 +2,7 @@ server:
port: 8081
spring:
application:
name: invest-admin
name: stockPrice-task
cloud:
nacos:
config:
......@@ -14,4 +14,4 @@ spring:
discovery:
group: APP_GROUP
server-addr: 47.93.96.150:8848
service: invest-admin
\ No newline at end of file
service: stockPrice-task
\ No newline at end of file
......@@ -2,7 +2,7 @@ server:
port: 8383
spring:
application:
name: invest-admin
name: stockPrice-task
cloud:
nacos:
config:
......@@ -14,4 +14,4 @@ spring:
discovery:
group: APP_GROUP
server-addr: 172.17.188.83:8848
service: invest-admin
\ No newline at end of file
service: stockPrice-task
\ No newline at end of file
......@@ -2,7 +2,7 @@ server:
port: 8083
spring:
application:
name: invest-admin
name: stockPrice-task
cloud:
nacos:
config:
......@@ -14,5 +14,5 @@ spring:
discovery:
group: APP_GROUP
server-addr: 172.17.188.83:8848
service: invest-admin
service: stockPrice-task
......@@ -8,7 +8,7 @@
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义后,可以使“${}”来使用变量。 -->
<property name="log.path" value="/opt/logs/newinvest" />
<property name="log.path" value="/opt/logs/pricetack" />
<!--0. 日志格式和颜色渲染 -->
<!-- 彩色日志依赖的渲染类 -->
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment