Commit ca45897c authored by lilei's avatar lilei

波段王service

parent 68a3eb22
......@@ -103,4 +103,6 @@ public class CommonConfig {
private String highStockPriceTask;
@Value("${nacos.config.chiefStockPriceTask}")
private String chiefStockPriceTask;
@Value("${nacos.config.kingStockPriceTask}")
private String kingStockPriceTask;
}
......@@ -109,6 +109,7 @@ public class MybatisConfiguration {
mapperLocations.add("classpath*:mybatis/mapper/report/*.xml");
mapperLocations.add("classpath*:mybatis/mapper/high/*.xml");
mapperLocations.add("classpath*:mybatis/mapper/chief/*.xml");
mapperLocations.add("classpath*:mybatis/mapper/king/*.xml");
List<Resource> resources = new ArrayList();
if (!CollectionUtils.isEmpty(mapperLocations)) {
for (String mapperLocation : mapperLocations) {
......
package com.zfxftech.telmarket.common.pojo.request.king;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @Description
* @Author jianghua
* @Date 2021/9/27 13:51
*/
@Data
@ApiModel(value = "批量卖出指令", description = "从客户端,交易指令封装的表单数据封装在此entity中")
public class KingBatchSellingOrderBO {
@NotNull
@ApiModelProperty(value = "股票代码集合", name = "code", required = true)
private List<String> code;
@NotNull
@ApiModelProperty(value = "示范盘id", name = "marketId", required = true)
private Long marketId;
}
package com.zfxftech.telmarket.common.pojo.request.king;
import com.zfxftech.telmarket.common.pojo.request.PageBO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Description TODO
* @Author Dell
* @Date 2021/12/25 18:58
*/
@Data
@ApiModel(value = "查询收集统计页面数据", description = "从客户端,查询收集统计数据传入的数据封装在此entity中")
public class KingPagePositionTradeInfoRecordGroupByBatchBO extends PageBO {
@ApiModelProperty(value = "股票代码", name = "code", required = false)
private String code;
@ApiModelProperty(value = "交易状态", name = "tradeStatus", required = false)
private Long tradeStatus;
@ApiModelProperty(value = "是否一对多过滤", name = "filterOneMore", required = false)
private Boolean filterOneMore;
@ApiModelProperty(value = "产品类型", name = "productType", required = false)
private String productType;
@ApiModelProperty(value = "产品id", name = "productId", required = false)
private Long productId;
@ApiModelProperty(value = "收益率下限", name = "profitLowerLimit", required = false)
private String profitLowerLimit;
@ApiModelProperty(value = "收益率上限", name = "profitUpperLimit", required = false)
private String profitUpperLimit;
@ApiModelProperty(value = "买入时间开始", name = "profitLowerLimit", required = false)
private Long buyingTimeLowerLimit;
@ApiModelProperty(value = "买入时间结束", name = "profitLowerLimit", required = false)
private Long buyingTimeUpperLimit;
@ApiModelProperty(value = "卖出时间开始", name = "profitLowerLimit", required = false)
private Long sellingTimeLowerLimit;
@ApiModelProperty(value = "卖出时间结束", name = "profitLowerLimit", required = false)
private Long sellingTimeUpperLimit;
@ApiModelProperty(value = "排序 格式:排序字段:ASC", name = "orderBy", required = false)
private String orderBy;
@ApiModelProperty(value = "公司id", name = "companyId", required = false)
private Integer companyId;
@ApiModelProperty(value = "委托方向", name = "trustSourceId", required = false)
private Integer trustSourceId;
@ApiModelProperty(value = "行业", name = "industry", required = false)
private String industry;
}
package com.zfxftech.telmarket.common.pojo.request.king;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/15 15:07
*/
@ApiModel(value = "模拟盘详情查询表单", description = "从客户端,模拟盘详情查询传入的数据封装在此entity中")
@Data
public class KingQueryCustomerMarketDetailsBO {
@NotNull
@ApiModelProperty(value = "模拟盘id", name = "marketId", required = true)
private Long marketId;
@NotBlank
@ApiModelProperty(value = "模拟盘类型 实盘:real 示范:simulated", name = "type", required = true)
private String type;
}
package com.zfxftech.telmarket.common.pojo.request.king;
import com.zfxftech.telmarket.common.pojo.request.PageBO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "查询产品列表", description = "从客户端,查询产品列表传入的数据封装在此entity中")
public class KingQueryProductBO extends PageBO {
@ApiModelProperty(value = "产品类型", name = "productType", required = false)
private String productType;
@ApiModelProperty(value = "产品id", name = "productId", required = false)
private String productId;
@ApiModelProperty(value = "风险等级", name = "riskLevel", required = false)
private String riskLevel;
@ApiModelProperty(value = "分析师", name = "analyst", required = false)
private Long analyst;
@ApiModelProperty(value = "产品经理", name = "productManager", required = false)
private Long productManager;
@ApiModelProperty(value = "所属公司", name = "companyId", required = false)
private Integer companyId;
// @ApiModelProperty(value = "初始本金", name = "initialPrincipal", required = false)
// private String initialPrincipal;
@ApiModelProperty(value = "开始时间", name = "startCreateTime", example = "1626739300000", required = false)
private Long startCreateTime;
@ApiModelProperty(value = "结束时间", name = "endExpiredTime", example = "1626739300000", required = false)
private Long endCreateTime;
@ApiModelProperty(value = "公众号", name = "weChatId", example = "19", required = false)
private Long weChatId;
@ApiModelProperty(value = "排序(格式:排序字段:排序规则) 支持的字段:created_time、initial_funding、modify_time, 序:desc降序 asc升序", name = "sort", example = "created_time:desc", required = false)
private String orderBy;
private String uid;
}
package com.zfxftech.telmarket.common.pojo.request.king;
import com.zfxftech.telmarket.common.pojo.request.PageBO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel(value = "查询股票录入记录", description = "从客户端,查询股票录入记录的数据封装在此entity中")
public class KingQueryStockInputLogBO extends PageBO {
@ApiModelProperty(value = "客户id", name = "description", required = false)
private String customerId;
@ApiModelProperty(value = "产品类型", name = "productType", example = "6050350b758289001f6bb543", required = false)
private String productType;
@ApiModelProperty(value = "产品id", name = "productId", example = "6051c185338354001cc327cf", required = false)
private String productId;
@ApiModelProperty(value = "股票代码", name = "code", example = "000001", required = false)
private String code;
@ApiModelProperty(value = "交易方向", name = "startExpiredTime", example = "1626739100000", required = false)
private Integer operation;
@ApiModelProperty(value = "交易时间上限", name = "tradingTimeUpperLimit", example = "1626739100000", required = false)
private Long tradingTimeUpperLimit;
@ApiModelProperty(value = "交易时间下限", name = "tradingTimeLowerLimit", example = "1626739300000", required = false)
private Long tradingTimeLowerLimit;
@ApiModelProperty(value = "示范盘Id", name = "description", required = false)
private String marketId;
@NotBlank
@ApiModelProperty(value = "实盘|示范", name = "marketType", required = true)
private String marketType;
private Integer companyId;
}
package com.zfxftech.telmarket.common.pojo.request.king;
import com.zfxftech.telmarket.common.pojo.request.PageBO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/23 15:45
*/
@ApiModel(value = "个股盈亏列表表单", description = "个股盈亏列表表单")
@Data
public class KingQueryStockProfitLogBO extends PageBO {
@NotNull
@ApiModelProperty(value = "模拟盘id", name = "marketId", required = true)
private Long marketId;
}
package com.zfxftech.telmarket.common.pojo.request.king;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @Description TODO
* @Author jianghua
* @Date 2021/8/31 17:34
*/
@Data
@ApiModel(value = "保存产品", description = "从客户端,保存产品传入的数据封装在此entity中")
public class KingSaveProductBO {
@ApiModelProperty(value = "产品id", name = "id", required = false)
private Long id;
@NotNull(message = "客戶名称不能为空")
@ApiModelProperty(value = "产品名称", name = "productName", required = true)
private String productName;
@NotNull(message = "产品类型不能为空")
@ApiModelProperty(value = "产品类型", name = "productType", required = true)
private String productType;
@NotNull(message = "所属分公司不能为空")
@ApiModelProperty(value = "所属分公司,格式:1,2,3", name = "companyId", required = true)
private Long companyId;
// @NotNull(message = "交易风格不能为空")
@ApiModelProperty(value = "交易风格", name = "tradeStyle", required = false)
private Long tradeStyle;
@ApiModelProperty(value = "风险等级,暂时只有跟投有产品", name = "riskLevel", required = false)
private String riskLevel;
// @ApiModelProperty(value = "初始本金", name = "initialPrincipal", required = false)
// private String initialPrincipal;
@ApiModelProperty(value = "卖出股票消息通知 0 未勾选 1勾选", name = "sellMessage", required = false)
private String sellMessage;
@ApiModelProperty(value = "买入消息股票通知 0 未勾选 1勾选", name = "buyMessage", required = false)
private String buyMessage;
// @ApiModelProperty(value = "每日统计发送通知 0 未勾选 1勾选", name = "dayStatisticsSend", required = false)
// private String dayStatisticsSend;
@ApiModelProperty(value = "产品经理", name = "productManagerList", required = false)
private String productManagerList;
@NotNull(message = "公众号不能为空")
@ApiModelProperty(value = "公众号Id", name = "weChatId", required = true)
private Long weChatId;
@ApiModelProperty(value = "分析师", name = "analyst", required = true)
private Long analyst;
@ApiModelProperty(value = "备注", name = "remark", required = false)
private String remark;
}
package com.zfxftech.telmarket.common.pojo.request.king;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @Description 系统常量字典表
* @Author jianghua
* @Date 2021/9/27 13:51
*/
@Data
@ApiModel(value = "卖出指令", description = "从客户端,交易指令封装的表单数据封装在此entity中")
public class KingSellingOrderBO {
@NotBlank
@ApiModelProperty(value = "股票代码", name = "code", required = true)
private String code;
@NotNull
@ApiModelProperty(value = "是否是现价卖出,是:true,否:false", name = "type", required = true)
private boolean isPresent;
@ApiModelProperty(value = "价格,若是现价当前值为空", name = "type", required = false)
private String price;
@NotBlank
@ApiModelProperty(value = "卖出仓位", name = "position", example = "0.333", required = true)
private String position;
@NotNull
@ApiModelProperty(value = "用户和产品关联id", name = "relationId", required = true)
private List<Long> relationId;
@NotBlank
@ApiModelProperty(value = "卖出理由", name = "reason", required = true)
private String reason;
private boolean followAccountLink;
private String followAccountName;
}
package com.zfxftech.telmarket.common.pojo.request.king;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @Description
* @Author jianghua
* @Date 2021/9/27 13:51
*/
@Data
@ApiModel(value = "原价清零", description = "从客户端,交易指令封装的表单数据封装在此entity中")
public class KingSendClearOrderBO {
@NotNull
@ApiModelProperty(value = "股票代码集合", name = "code", required = true)
private List<String> code;
@NotNull
@ApiModelProperty(value = "示范盘id", name = "marketId", required = true)
private Long marketId;
}
package com.zfxftech.telmarket.common.pojo.request.king;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* @Description 系统常量字典表
* @Author jianghua
* @Date 2021/9/27 13:51
*/
@Data
@ApiModel(value = "", description = "从客户端,交易指令封装的表单数据封装在此entity中")
public class KingTradeOrderBO {
@NotBlank
@ApiModelProperty(value = "股票代码", name = "code", required = true)
private String code;
@ApiModelProperty(value = "风险等级", name = "riskLevel", required = false)
private String riskLevel;
@NotNull
@ApiModelProperty(value = "是否是现价买入,是:true,否:false", name = "isPresent", required = true)
private boolean isPresent;
@ApiModelProperty(value = "价格,若是现价当前值为空", name = "type", required = false)
private String price;
@NotBlank
@ApiModelProperty(value = "买入仓位", name = "position", example = "0.333", required = true)
private String position;
@NotNull
@ApiModelProperty(value = "用户和产品关联id", name = "relationId", required = true)
private List<Long> relationId;
@NotBlank
@ApiModelProperty(value = "买入理由", name = "reason", required = true)
private String reason;
@ApiModelProperty(value = "止盈位", name = "interferenceStopPosition", required = false)
private String interferenceStopPosition;
@ApiModelProperty(value = "止损位", name = "stopLossPosition", required = false)
private String stopLossPosition;
@ApiModelProperty(value = "买入股票数量,录入上海数据使用,以后删除", name = "buyStockToSyncDataCount", required = false)
private Long buyStockToSyncDataCount;
private boolean followAccountLink;
private String followAccountName;
}
package com.zfxftech.telmarket.common.pojo.vo.king;
import lombok.Data;
import org.apache.commons.lang3.tuple.Pair;
import java.util.List;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/17 15:10
*/
@Data
public class KingMarketDetailsVO {
/**
* 姓名
*/
private String name;
/**
* 昵称
*/
private String nickName;
/**
* 投资风格
*/
private String investmentStyle;
/**
* 公司
*/
private String company;
/**
* 账户限制
*/
private String accountLimit;
/**
* 产品名称
*/
private String productName;
/**
* 产品类型
*/
private String productType;
/**
* 产品开始时间
*/
private Long productStartTime;
/**
* 产品结束时间
*/
private Long productEndTime;
/**
* 总价格
*/
private String totalPrice;
/**
* 总股票价值
*/
private String totalStocksPrice;
/**
* 可用资金
*/
private String availableFunding;
/**
* 当前仓位
*/
private String position;
/**
* 交易股票数
*/
private Integer stockCount;
/**
* 盈利股票数
*/
private Integer profitStockCount;
/**
* 持仓信息
*/
List<KingStockVO> stocksInfo;
/**
* 行业占比
*/
List<Pair<String, String>> industryProportion;
/**
* 产品类型(中文)
*/
private String productTypeDesc;
/**
* 总盈亏比例
*/
private String totalProfitRate;
/**
* 总盈亏
*/
private String totalProfit;
/**
* 产品经理
*/
private String pmUserName;
/**
* 销售关系名称
*/
private String teamRelationNames;
/**
* 客户id
*/
private Long customerId;
/**
* 是否问题客户 1=问题客户
*/
private String isProblem;
}
package com.zfxftech.telmarket.common.pojo.vo.king;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class KingProductStrategyVO {
private Integer id;
private String productName;
}
package com.zfxftech.telmarket.common.pojo.vo.king;
import lombok.Data;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/23 15:46
*/
@Data
public class KingStockProfitLogVO {
private Long buyingTime;
private Long sellingTime;
private String code;
private String name;
private String stockDesc;
private String profitPrice;
private String profitRatio;
private Integer holdingDays;
/**
* 买入途径
*/
private String buyingRoute;
/**
* 卖出途径
*/
private String sellingRoute;
}
package com.zfxftech.telmarket.common.pojo.vo.king;
import lombok.Data;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/17 15:27
*/
@Data
public class KingStockVO {
/**
* 代码
*/
private String code;
/**
* 名称
*/
private String name;
/**
* 来源
*/
private String channel;
/**
* 产品类型
*/
private String businessType;
/**
* 购入时间
*/
private Long buyTime;
/**
* 持仓数量
*/
private Long count;
/**
* 可用数量
*/
private Long availableCount;
/**
* 成本价格
*/
private String cost;
/**
* 最新价格
*/
private String currentPrice;
/**
* 当前市值
*/
private String marketValue;
/**
* 盈亏比例
*/
private String profitRate;
/**
* 浮动盈亏
*/
private String dynamicProfit;
}
package com.zfxftech.telmarket.common.pojo.vo.king;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/15 14:29
*/
@ApiModel(value = "交易指令交易失败返回实体类", description = "交易指令交易失败返回实体类")
@Data
public class KingTradeOrderVO {
/**
* 客户姓名
*/
private String customerName;
/**
* 错误码
*/
private Integer errorCode;
private Long customerId;
}
package com.zfxftech.telmarket.service.business.king;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zfxftech.telmarket.common.pojo.dao.king.KingAccountProductRelation;
import com.zfxftech.telmarket.common.pojo.dto.king.KingProductCustomerFansDto;
import java.util.List;
public interface KingAccountProductRelationService extends IService<KingAccountProductRelation> {
List<KingAccountProductRelation> queryAll();
//通过用户id批量查询用户的产品信息
List<KingAccountProductRelation> queryAccountProductRelationByMemberIds(List<Long> memberIds);
//通过用户id 产品id 批量查询用户的产品信息
List<KingAccountProductRelation> getMarkId(Long memberIds, List<Long> productList);
//批量查询用户的产品
List<KingAccountProductRelation> queryAccountProductRelationByMemberId(Long memberId);
//根据粉丝id查询用户的产品
List<KingAccountProductRelation> queryAccountProductRelationByFansId(Long fansId);
void updateAccountProductRelation(KingAccountProductRelation accountProductRelation, Long memberId, Long productId);
void updateAccountProductRelation(KingAccountProductRelation accountProductRelation);
void batchUpdateAccountProductRelation(List<KingAccountProductRelation> accountProductRelations);
void addAccountProductRelation(KingAccountProductRelation accountProductRelation);
//查询用户的指定产品
KingAccountProductRelation queryAccountProductRelationByMemberIdAndProductId(Long memberId, Long productId);
/**
* @param marketId
* @param type (实盘:real 示范:simulated)
* @return
*/
KingAccountProductRelation queryAccountProductRelationByMarketInfo(Long marketId, String type);
//通过id批量查询产品和用户的关联关系
List<KingAccountProductRelation> queryAccountProductRelationByIds(List<Long> relationIds);
//通过虚拟帐号批量查询产品和用户的关联关系
List<KingAccountProductRelation> queryAccountProductRelationBySimulatedIds(List<Long> simulatedIdsIds);
void checkProductIsExpire();
//根据产品id获取对应的客户userId 1表是只要客户的userId 2 表示只要分析师的userId 3.表示全都要
List<Long> getUserId(Long productId, Integer type);
//根据产品id获取客户id
List<Long> getCustomerIds(Long productId);
List<KingProductCustomerFansDto> getProductUserList(Long productId);
List<KingAccountProductRelation> getRelationByProductIds(List<Long> ids);
void updateList(List<KingAccountProductRelation> list);
}
package com.zfxftech.telmarket.service.business.king;
import com.zfxftech.telmarket.common.pojo.dao.Quote;
import com.zfxftech.telmarket.common.pojo.dao.StocksCode;
import com.zfxftech.telmarket.common.pojo.dao.king.KingStockPosition;
import org.apache.commons.lang3.tuple.Pair;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
public interface KingFinanceCalculateService {
/**
* 计算股价均值
*
* @param totalPrice
* @param count
* @return
*/
BigDecimal calculateAverageStockPrice(BigDecimal totalPrice, Long count);
/**
* 计算股价均值
*
* @param count1 新买入股数
* @param price1 新买入股票成交价
* @param count2 原先总股数
* @param price2 原先股票平均成交价
* @return
*/
BigDecimal calculateAverageStockPrice(Long count1, BigDecimal price1, Long count2, BigDecimal price2);
/**
* 计算总资产(股票+可用资金)
*
* @param availableFund 可用资金
* @param stockPositions 股票持仓
* @param stockCodeAndPriceMapping 股票代码-股票映射关系
* @return
*/
BigDecimal calculateTotalAssets(BigDecimal availableFund, List<KingStockPosition> stockPositions, Map<String, Quote> stockCodeAndPriceMapping);
/**
* 计算股票总市值(当前价格)
*
* @param stockPositions
* @param stockCodeAndPriceMapping
* @return
*/
BigDecimal calculateTotalAssets(List<KingStockPosition> stockPositions, Map<String, Quote> stockCodeAndPriceMapping);
/**
* 计算股票总市值(成本价格)
*
* @param stockPositions
* @return
*/
BigDecimal calculateTotalAssets(List<KingStockPosition> stockPositions);
/**
* 计算可买入股票价格
*
* @param totalFund 资金
* @param price 价格
* @return
*/
Long calculateBuyStockCount(BigDecimal totalFund, BigDecimal price);
/**
* 计算总价
*
* @param count 股数
* @param price 股票价格
* @return
*/
BigDecimal calculateTotalPrice(Long count, BigDecimal price);
/**
* 计算股票站总股票市值的占比
*
* @param totalValue 股票总值
* @param count 股数
* @param price 价格
* @return
*/
BigDecimal calculateIndustryShare(BigDecimal totalValue, Long count, BigDecimal price);
/**
* 计算收益率(盈亏比例)
*
* @param value1 减数
* @param value2 被减数
* @return
*/
BigDecimal calculateProfitRate(BigDecimal value1, BigDecimal value2);
/**
* 计算收益率(盈亏比例)
*
* @param value1 减数
* @param value2 被减数
* @return
*/
BigDecimal calculateProfitRate2(BigDecimal value1, BigDecimal value2);
/**
* 计算单个股票的涨跌幅
* 最新价格
* 收盘价格
* 涨跌幅=(现价-上一个交易日收盘价)/上一个交易日收盘价*100%
*
* @return
*/
BigDecimal riseDownRange(BigDecimal now, BigDecimal close);
/**
* 计算单个股票的盈亏比例
* 最新价格
* 成本价格
* 盈亏比例=(现价-成本价)/成本价×100%
*
* @return
*/
BigDecimal profitLossRatio(BigDecimal now, BigDecimal cost);
/**
* 计算收益
*
* @param value1 分子
* @param value2 分母
* @return
*/
BigDecimal calculateProfit(BigDecimal value1, BigDecimal value2);
/**
* @param price 价格
* @param range 范围
* @return
*/
Pair<String, String> calculatePriceRange(String price, String range);
/**
* @param stocksCode 根据股票计算涨跌幅
* @return
*/
Pair<BigDecimal, BigDecimal> calculatePriceLimit(StocksCode stocksCode);
}
package com.zfxftech.telmarket.service.business.king;
import com.zfxftech.telmarket.common.pojo.dao.king.KingFrozenRecord;
import java.util.List;
/**
* @Description TODO
* @Author Dell
* @Date 2021/12/21 14:30
*/
public interface KingFrozenRecordService {
/**
* marketId和股票代码获取股票
*
* @param marketId
* @param code
* @return
*/
KingFrozenRecord getStockByMarketIdAndCode(Long marketId, String code);
/**
* 通过股票和marketId集合批量查询冻结股票
*
* @param marketIds
* @param code
* @return
*/
List<KingFrozenRecord> getStockByMarketIdsAndCode(List<Long> marketIds, String code);
/**
* 通过股票和marketId集合批量查询冻结股票
*
* @param marketIds
* @param codes
* @return
*/
List<KingFrozenRecord> getStockByMarketIdsAndCode(List<Long> marketIds, List<String> codes);
/**
* 通过marketId查询当前账户下的所有冻结股票
*
* @param marketId
* @return
*/
List<KingFrozenRecord> getStockByMarketId(Long marketId);
/**
* 获取冻结资金
*
* @param marketId
* @return
*/
KingFrozenRecord getFrozenFundByMarketId(Long marketId);
/**
* 插入冻结股票
*
* @param marketId 盘
* @param code 股票代码
* @param count 股票数量
*/
void insertFrozenStock(Long marketId, String code, String count);
/**
* 插入冻结资金
*
* @param marketId 盘id
* @param fund 资金
*/
void insertFrozenFund(Long marketId, String fund);
/**
* 清除冻结记录
*/
void clearFrozenRecords();
/**
* 清除冻结记录为同步数据使用
*/
void clearFrozenRecordsForSynData();
}
package com.zfxftech.telmarket.service.business.king;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zfxftech.telmarket.common.pojo.dao.king.KingMarketProfitLog;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/19 9:44
*/
public interface KingMarketProfitLogService extends IService<KingMarketProfitLog> {
}
package com.zfxftech.telmarket.service.business.king;
import com.zfxftech.telmarket.common.bean.CommonPage;
import com.zfxftech.telmarket.common.enums.StockInputLogTrustSource;
import com.zfxftech.telmarket.common.pojo.dao.king.KingPositionTradeInfoRecord;
import com.zfxftech.telmarket.common.pojo.dao.king.KingPositionTradeInfoRecord4Page;
import com.zfxftech.telmarket.common.pojo.dao.king.KingStockPosition;
import com.zfxftech.telmarket.common.pojo.request.king.KingPagePositionTradeInfoRecordGroupByBatchBO;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
public interface KingPositionTradeInfoRecordService {
/**
* 分页查询交易记录,批次分组
*
* @param pagePositionTradeInfoRecordGroupByBatchBO
* @return
*/
@Deprecated
List pagePositionTradeInfoRecordGroupByBatch(KingPagePositionTradeInfoRecordGroupByBatchBO pagePositionTradeInfoRecordGroupByBatchBO);
/**
* 历史收益统计
*
* @param pagePositionTradeInfoRecordGroupByBatchBO
* @return
*/
Map<String, Object> positionTradeInfoRecordCount(KingPagePositionTradeInfoRecordGroupByBatchBO pagePositionTradeInfoRecordGroupByBatchBO);
/**
* 历史收益统计-详细数据
*
* @param pagePositionTradeInfoRecordGroupByBatchBO
* @return
*/
CommonPage<KingPositionTradeInfoRecord4Page> positionTradeInfoRecordCountDetail(KingPagePositionTradeInfoRecordGroupByBatchBO pagePositionTradeInfoRecordGroupByBatchBO);
/**
* 持仓id获取交易记录
*
* @param positionIds
* @return
*/
List<KingPositionTradeInfoRecord> listByPositionIds(List<Long> positionIds);
/**
* 批量修改交易记录
*
* @param list
*/
void updateBatchPositionTradeInfoRecord(List<KingPositionTradeInfoRecord> list);
/**
* 批量插入交易记录
*
* @param list
*/
void addBatch(List<KingPositionTradeInfoRecord> list);
/**
* @param positionIds 持仓id
* @param action 动作,买入、减仓、加仓、清仓
* @param positionMapping
* @param batch 批次
* @param sellingPrice 清仓时候的卖出价格,买入、减仓、加仓均不传
* @param status 只有在示有实无的时候才传
* @param trustSource 委托方向
* @param trustSourceName 委托方向描述
*/
void updateData(List<Long> positionIds, Integer action, Map<Long, KingStockPosition> positionMapping, Long batch, BigDecimal sellingPrice, Integer status, Integer entrustWay, StockInputLogTrustSource trustSource, String trustSourceName);
List<KingPositionTradeInfoRecord> getPositionTradeInfoRecordByPositionId(String code, Long positionId);
int updatePositionTradeInfoRecord(KingPositionTradeInfoRecord positionTradeInfoRecord);
}
package com.zfxftech.telmarket.service.business.king;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zfxftech.telmarket.common.bean.MapIntgerVo;
import com.zfxftech.telmarket.common.pojo.dao.king.KingProduct;
import com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin;
import com.zfxftech.telmarket.common.pojo.request.PageProportionBO;
import com.zfxftech.telmarket.common.pojo.request.king.KingQueryProductBO;
import com.zfxftech.telmarket.common.pojo.request.king.KingSaveProductBO;
import com.zfxftech.telmarket.common.pojo.vo.king.KingProductStrategyVO;
import java.util.List;
/**
* 产品服务类接口
*
* @author jianghua
* @version 1.0
* @date 2021-08-24 15:55
*/
public interface KingProductService extends IService<KingProduct> {
void saveProduct(KingSaveProductBO saveProductBO, UsAdmin usAdmin);
List<KingProduct> queryProductByIds(List<Long> id);
KingProduct queryProductById(Long id);
List<KingProduct> queryAll();
List<KingProduct> queryListForAuthority();
List<KingProduct> pageProduct(KingQueryProductBO queryProductBO);
List<KingProduct> getListForDataSource();
void operationSubstituteAnalyst(Long productId, Long analyst, String operation);
List<KingProduct> queryProductByType(String type);
/**
* 获取私人定制产品名称未删除
*
* @return
*/
List<KingProductStrategyVO> getAllFollowAccount();
List<MapIntgerVo> getProductName(PageProportionBO pageProportionBO);
List<UsAdmin> getProductUserByRoleIds(Long productId, List<Long> roleIds);
}
package com.zfxftech.telmarket.service.business.king;
import com.zfxftech.telmarket.common.pojo.dao.king.KingStockInputLog;
import com.zfxftech.telmarket.common.pojo.request.king.KingQueryStockInputLogBO;
import java.util.List;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/3 9:34
*/
public interface KingStockInputLogService {
List<KingStockInputLog> pageStockInputLogs(KingQueryStockInputLogBO queryStockInputLogBO);
/**
* 新增股票
*
* @param stockInputLog
*/
void addStockInputLog(KingStockInputLog stockInputLog);
void addStockInputLog2(KingStockInputLog stockInputLog);
void addStockInputLogs(List<KingStockInputLog> stockInputLogs);
void updateStockInputLog(KingStockInputLog stockInputLog);
List<KingStockInputLog> queryStockInputLogs(long customerId, long productId, String code);
/**
* 通过持仓id获取交易日志
*
* @param stockPositionId
* @param operation
* @return
*/
List<KingStockInputLog> queryStockInputLogs(long stockPositionId, Integer operation);
/**
* 获取最近一次交易的记录
*
* @param stockPositionId
* @param operation
* @return
*/
KingStockInputLog queryOldestStockInputLog(long stockPositionId, Integer operation);
/**
* 获取当日的操作记录
*
* @param marketIds
* @return
*/
List<KingStockInputLog> queryByMarketIdsAndToday(List<Long> marketIds);
/**
* 获取前一日的操作记录
*
* @param marketType 根据类型查询前一天的操作记录
* @return
*/
List<KingStockInputLog> queryPreToday(String marketType, String operation);
List<KingStockInputLog> all();
void updateAA(KingStockInputLog stockInputLog);
}
package com.zfxftech.telmarket.service.business.king;
import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zfxftech.telmarket.common.enums.StockInputLogTrustSource;
import com.zfxftech.telmarket.common.pojo.dao.MemberBase;
import com.zfxftech.telmarket.common.pojo.dao.Quote;
import com.zfxftech.telmarket.common.pojo.dao.king.KingAccountProductRelation;
import com.zfxftech.telmarket.common.pojo.dao.king.KingMemberStockPage;
import com.zfxftech.telmarket.common.pojo.dao.king.KingStockPosition;
import com.zfxftech.telmarket.common.pojo.dao.king.KingTradingStrategyParam;
import com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin;
import com.zfxftech.telmarket.common.pojo.dto.remind.FullStockPositionTask;
import com.zfxftech.telmarket.common.pojo.dto.remind.StockPositionTask;
import com.zfxftech.telmarket.common.pojo.request.QueryCustomerPositionBO;
import com.zfxftech.telmarket.common.pojo.request.king.*;
import com.zfxftech.telmarket.common.pojo.request.statistics.CurrDayRiseDownDataBO;
import com.zfxftech.telmarket.common.pojo.request.statistics.CurrDayRiseDownGroupDataVO;
import com.zfxftech.telmarket.common.pojo.request.statistics.RealTimeCodeQueryDataBO;
import com.zfxftech.telmarket.common.pojo.request.statistics.RealTimeCodeQueryGroupDataVO;
import com.zfxftech.telmarket.common.pojo.vo.king.KingMarketDetailsVO;
import com.zfxftech.telmarket.common.pojo.vo.king.KingStockVO;
import com.zfxftech.telmarket.common.pojo.vo.king.KingTradeOrderVO;
import org.apache.commons.lang3.tuple.Pair;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/3 9:34
*/
public interface KingStockPositionService extends IService<KingStockPosition> {
/**
* 获取所有的股票持仓
*
* @return
*/
List<KingStockPosition> getAll();
/**
* 实盘新增股票
*
* @param stockPosition
* @return
*/
KingStockPosition saveStockPosition(KingStockPosition stockPosition);
int updateStockPosition(KingStockPosition stockPosition);
int bactchUpdateStockPosition(List<KingStockPosition> stockPositions);
void del(Long id);
/**
* 示范盘添加股票
*
* @param stockPosition
* @return
*/
Pair<KingStockPosition, Boolean> saveStockPosition4Demonstration(KingStockPosition stockPosition, String interferenceStopPosition, String stopLossPosition);
KingStockPosition queryStockPosition(Long marketId, String code);
List<KingStockPosition> queryStockPosition(List<Long> marketIds, String codes);
List<KingStockPosition> queryStockPositionByCode(String code);
List<KingStockPosition> queryStockPosition(Long marketId, List<String> codes);
List<KingStockPosition> queryStockPositionsContainIsDeleted(Long marketId);
//根据marketId 批量查出股票持仓
List<KingStockPosition> queryStockPositions(List<Long> allMarketIds);
List<KingTradeOrderVO> sendTradeOrder(KingTradeOrderBO tradeOrderBO, UsAdmin usAdmin);
List<KingTradeOrderVO> sendSellingOrder(KingSellingOrderBO sellingOrderBO, UsAdmin usAdmin);
/**
* 止盈止损
*
* @param sellingOrderBO
* @param usAdmin
* @return
*/
List<KingTradeOrderVO> sendSellingOrderTask(KingSellingOrderBO sellingOrderBO, UsAdmin usAdmin, StockInputLogTrustSource stockInputLogTrustSource);
//定时任务自动卖出,当天示范账户买入一只股票后,到第二天24点前客户未录入实盘账户
void autoSellingOrder();
List<KingMemberStockPage> pageCustomerPositionList(QueryCustomerPositionBO customerPositionBO);
/**
* 查询模拟盘详情
*
* @param customerMarketDetailsBO
* @return
*/
KingMarketDetailsVO queryMarketDetails(KingQueryCustomerMarketDetailsBO customerMarketDetailsBO);
List<KingStockPosition> queryStockPositions(Long marketId);
KingStockPosition queryStockPosition(Long id);
/**
* 重算持仓
*
* @param stockPosition
*/
void recalculateStockPosition(KingStockPosition stockPosition);
/**
* 动态清零
*
* @param sendClearOrderBO
* @param usAdmin
* @return
*/
List<String> sendClearOrder(KingSendClearOrderBO sendClearOrderBO, UsAdmin usAdmin);
/**
* 批量卖出
*
* @param sellingOrderBO
* @param usAdmin
* @return
*/
List<String> sendSellingOrderOfBatch(KingBatchSellingOrderBO sellingOrderBO, UsAdmin usAdmin);
public KingTradingStrategyParam createTradingStrategyParam(String pushTime, String reason, KingAccountProductRelation accountProductRelation, String interferenceStopPosition, String stopLossPosition);
/**
* 清仓卖出
*
* @param
* @param usAdmin
* @return
*/
boolean selling(KingAccountProductRelation accountProductRelation, KingStockPosition stockPosition, String position, BigDecimal currentPrice, KingTradingStrategyParam tradingStrategyParam, UsAdmin usAdmin, Boolean isPresent, StockInputLogTrustSource trustSource);
KingMarketDetailsVO createMarketDetailsVO(MemberBase memberBase, List<KingStockPosition> stockPositions, BigDecimal funding, KingAccountProductRelation accountProductRelation, Long marketId);
KingMarketDetailsVO createMarketDetailsVOTask(List<KingStockPosition> stockPositions, BigDecimal funding, KingAccountProductRelation accountProductRelation);
KingStockVO createStockVO(KingStockPosition stockPosition, Map<String, Quote> codeAndQuoteMapping);
/**
* 根据产品id获取股票信息
*
* @param id
* @return
*/
List<KingStockPosition> getCode(Long id);
List<StockPositionTask> getStockPositionTask(Long productId);
/**
* 获取持仓 获取一只股票
*
* @param productId 产品id
* @param userId 用户id
* @param code 股票 code
* @return
*/
KingStockPosition getPosition(Long productId, Long userId, String code);
/**
* 获取持仓 获取多只股票 获取
*
* @param productId 产品id
* @param userId 用户id
* @return
*/
List<KingStockPosition> getPositionList(Long productId, Long userId, String stockCode, BigDecimal stopProfit, BigDecimal stopLoss);
List<FullStockPositionTask> getFullStockPositionTask();
/**
* 同步今日涨跌幅到昨日涨跌幅
*/
void syncYdayRiseDownRange(DateTime dateTime);
CurrDayRiseDownGroupDataVO getCurrDayRiseDownData(CurrDayRiseDownDataBO currDayRiseDownDataBO);
RealTimeCodeQueryGroupDataVO getRealTimeCodeQueryData(RealTimeCodeQueryDataBO realTimeCodeQueryDataBO);
}
package com.zfxftech.telmarket.service.business.king;
import com.zfxftech.telmarket.common.bean.CommonPage;
import com.zfxftech.telmarket.common.pojo.dao.king.KingStockProfitLog;
import com.zfxftech.telmarket.common.pojo.request.king.KingQueryStockProfitLogBO;
import com.zfxftech.telmarket.common.pojo.vo.king.KingStockProfitLogVO;
import java.util.List;
public interface KingStockProfitLogService {
/**
* 插入记录
*
* @param stockProfitLog
*/
void add(KingStockProfitLog stockProfitLog);
CommonPage<KingStockProfitLogVO> queryStockProfitLogs4page(KingQueryStockProfitLogBO queryStockProfitLogBO);
List<KingStockProfitLog> queryStockProfitLogs(Long marketId);
List<KingStockProfitLog> queryStockProfitLogsSort(KingQueryStockProfitLogBO queryStockProfitLogsSort);
List<KingStockProfitLog> queryStockProfitLogs(List<Long> positionIds);
}
package com.zfxftech.telmarket.service.impl.business.king;
import com.zfxftech.telmarket.common.pojo.dao.Quote;
import com.zfxftech.telmarket.common.pojo.dao.StocksCode;
import com.zfxftech.telmarket.common.pojo.dao.king.KingStockPosition;
import com.zfxftech.telmarket.common.util.BigDecimalUtil;
import com.zfxftech.telmarket.service.business.king.KingFinanceCalculateService;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static com.zfxftech.telmarket.common.constant.AdminConstant.CompareTypeEnum.LESS;
import static com.zfxftech.telmarket.common.constant.AdminConstant.NumberEnum.*;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/10 17:* 金融计算类
*/
@Service
public class KingFinanceCalculateServiceImpl implements KingFinanceCalculateService {
@Override
public BigDecimal calculateAverageStockPrice(BigDecimal totalPrice, Long count) {
return BigDecimalUtil.div(totalPrice, new BigDecimal(count), 4);
}
@Override
public BigDecimal calculateAverageStockPrice(Long count1, BigDecimal price1, Long count2, BigDecimal price2) {
BigDecimal mul1 = BigDecimalUtil.mul(new BigDecimal(count1), price1);
BigDecimal mul2 = BigDecimalUtil.mul(new BigDecimal(count2), price2);
BigDecimal totalCost = BigDecimalUtil.add(mul1, mul2);
BigDecimal totalCount = BigDecimalUtil.add(new BigDecimal(count1), new BigDecimal(count2));
if (BigDecimalUtil.compare(totalCount, new BigDecimal("0"), 0)) {
return price1;
}
return BigDecimalUtil.div(totalCost, totalCount, 4);
}
@Override
public BigDecimal calculateTotalAssets(BigDecimal availableFund, List<KingStockPosition> stockPositions, Map<String, Quote> stockCodeAndQuoteMapping) {
if (CollectionUtils.isEmpty(stockPositions)) {
return availableFund;
}
BigDecimal totalStock = calculateTotalAssets(stockPositions, stockCodeAndQuoteMapping);
BigDecimal totalAssets = BigDecimalUtil.add(availableFund, totalStock);
return totalAssets;
}
@Override
public BigDecimal calculateTotalAssets(List<KingStockPosition> stockPositions, Map<String, Quote> stockCodeAndPriceMapping) {
BigDecimal totalAssets = new BigDecimal(ZERO.getCode());
for (KingStockPosition temStockPosition : stockPositions) {
Long count = temStockPosition.getCount();
String code = temStockPosition.getCode();
Quote quote = stockCodeAndPriceMapping.get(code);
String price = BigDecimalUtil.compare(quote.getNow(), new BigDecimal("0"), 0) ? quote.getClose().toString() : quote.getNow().toString();
totalAssets = BigDecimalUtil.add(BigDecimalUtil.mul(String.valueOf(count), price), totalAssets);
}
return totalAssets;
}
@Override
public BigDecimal calculateTotalAssets(List<KingStockPosition> stockPositions) {
BigDecimal totalAssets = new BigDecimal(ZERO.getCode());
for (KingStockPosition stockPosition : stockPositions) {
Long count = stockPosition.getCount();
BigDecimal cost = stockPosition.getCost();
totalAssets = BigDecimalUtil.add(BigDecimalUtil.mul(new BigDecimal(count), cost), totalAssets);
}
return totalAssets;
}
@Override
public Long calculateBuyStockCount(BigDecimal totalFund, BigDecimal price) {
BigDecimal total = BigDecimalUtil.div(totalFund, price, ZERO.getCode());
if (BigDecimalUtil.compare(total, new BigDecimal(HUNDRED.getCode().toString()), LESS.getCode())) {
return 0L;
}
total = BigDecimalUtil.roundToHundreds(total);
//除以100
return total.longValue();
}
@Override
public BigDecimal calculateTotalPrice(Long count, BigDecimal price) {
return BigDecimalUtil.mul(new BigDecimal(count), price);
}
@Override
public BigDecimal calculateIndustryShare(BigDecimal totalValue, Long count, BigDecimal price) {
//计算股票市值
BigDecimal value = BigDecimalUtil.mul(new BigDecimal(count), price);
return BigDecimalUtil.div(value, totalValue);
}
@Override
public BigDecimal calculateProfitRate(BigDecimal value1, BigDecimal value2) {
if (Objects.equals(value1, value2)) {
return new BigDecimal(ZERO.getCode());
}
BigDecimal value = BigDecimalUtil.div(value1, value2);
return BigDecimalUtil.sub(value.toString(), ONE.getCode().toString());
}
@Override
public BigDecimal calculateProfitRate2(BigDecimal value1, BigDecimal value2) {
if (Objects.equals(value1, value2)) {
return new BigDecimal(ZERO.getCode());
}
BigDecimal profitRate = BigDecimalUtil.div(
BigDecimalUtil.sub(
value1,
value2
),
value2);
return profitRate;
}
@Override
public BigDecimal riseDownRange(BigDecimal now, BigDecimal close) {
return BigDecimalUtil.div(BigDecimalUtil.sub(now, close), close);
}
@Override
public BigDecimal profitLossRatio(BigDecimal now, BigDecimal cost) {
return BigDecimalUtil.div(BigDecimalUtil.sub(now, cost), cost);
}
@Override
public BigDecimal calculateProfit(BigDecimal value1, BigDecimal value2) {
return BigDecimalUtil.sub(value1, value2);
}
@Override
public Pair<String, String> calculatePriceRange(String price, String range) {
BigDecimal upperLimit = BigDecimalUtil.mul(price, BigDecimalUtil.add("1", range).toString());
BigDecimal lowerLimit = BigDecimalUtil.mul(price, BigDecimalUtil.sub("1", range).toString());
ImmutablePair<String, String> rangePair = new ImmutablePair(BigDecimalUtil.keepDecimal(lowerLimit).toPlainString(), BigDecimalUtil.keepDecimal(upperLimit).toPlainString());
return rangePair;
}
@Override
public Pair<BigDecimal, BigDecimal> calculatePriceLimit(StocksCode stocksCode) {
//300 688 浮动20%
String code = stocksCode.getSymbol();
BigDecimal up;
BigDecimal low;
if (stocksCode.getName().contains("ST") || stocksCode.getName().contains("st")) {
low = BigDecimalUtil.mul(stocksCode.getRecentClosingPrice(), new BigDecimal("0.95"));
up = BigDecimalUtil.mul(stocksCode.getRecentClosingPrice(), new BigDecimal("1.05"));
} else if (code.startsWith("300") || code.startsWith("688")) {
low = BigDecimalUtil.mul(stocksCode.getRecentClosingPrice(), new BigDecimal("0.8"));
up = BigDecimalUtil.mul(stocksCode.getRecentClosingPrice(), new BigDecimal("1.2"));
} else {
//其他 浮动10%
low = BigDecimalUtil.mul(stocksCode.getRecentClosingPrice(), new BigDecimal("0.9"));
up = BigDecimalUtil.mul(stocksCode.getRecentClosingPrice(), new BigDecimal("1.1"));
}
Pair<BigDecimal, BigDecimal> pair = new ImmutablePair(BigDecimalUtil.keepDecimal(low), BigDecimalUtil.keepDecimal(up));
return pair;
}
}
package com.zfxftech.telmarket.service.impl.business.king;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zfxftech.telmarket.common.pojo.dao.king.KingFrozenRecord;
import com.zfxftech.telmarket.common.util.BigDecimalUtil;
import com.zfxftech.telmarket.common.util.DateUtil;
import com.zfxftech.telmarket.mapper.business.king.KingFrozenRecordMapper;
import com.zfxftech.telmarket.service.business.king.KingFrozenRecordService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
import static com.zfxftech.telmarket.common.constant.AdminConstant.FrozenEnum.FUND;
import static com.zfxftech.telmarket.common.constant.AdminConstant.FrozenEnum.STOCK;
/**
* @Description TODO
* @Author Dell
* @Date 2021/12/21 14:35
* 冻结记录相关
*/
@Service
public class KingFrozenRecordServiceImpl extends ServiceImpl<KingFrozenRecordMapper, KingFrozenRecord> implements KingFrozenRecordService {
@Value("${frozenRecord.clearHour}")
private Integer clearHour;
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public KingFrozenRecord getStockByMarketIdAndCode(Long marketId, String code) {
QueryWrapper<KingFrozenRecord> queryWrapper = new QueryWrapper();
queryWrapper.eq("market_id", marketId);
queryWrapper.eq("code", code);
queryWrapper.eq("frozen_target", STOCK.getDesc());
return getOne(queryWrapper);
}
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public List<KingFrozenRecord> getStockByMarketIdsAndCode(List<Long> marketIds, String code) {
QueryWrapper<KingFrozenRecord> queryWrapper = new QueryWrapper();
queryWrapper.in("market_id", marketIds);
queryWrapper.eq("code", code);
queryWrapper.eq("frozen_target", STOCK.getDesc());
return list(queryWrapper);
}
@Override
public List<KingFrozenRecord> getStockByMarketIdsAndCode(List<Long> marketIds, List<String> codes) {
QueryWrapper<KingFrozenRecord> queryWrapper = new QueryWrapper();
queryWrapper.in("market_id", marketIds);
queryWrapper.in("code", codes);
queryWrapper.eq("frozen_target", STOCK.getDesc());
return list(queryWrapper);
}
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public List<KingFrozenRecord> getStockByMarketId(Long marketId) {
QueryWrapper<KingFrozenRecord> queryWrapper = new QueryWrapper();
queryWrapper.in("market_id", marketId);
queryWrapper.eq("frozen_target", STOCK.getDesc());
return list(queryWrapper);
}
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public KingFrozenRecord getFrozenFundByMarketId(Long marketId) {
QueryWrapper<KingFrozenRecord> queryWrapper = new QueryWrapper();
queryWrapper.eq("market_id", marketId);
queryWrapper.eq("frozen_target", FUND.getDesc());
return getOne(queryWrapper);
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void insertFrozenStock(Long marketId, String code, String count) {
//查询当前用户今天是否已经冻结过股票
KingFrozenRecord byMarketIdAndCode = getStockByMarketIdAndCode(marketId, code);
if (byMarketIdAndCode != null) {
BigDecimal count1 = byMarketIdAndCode.getCount();
byMarketIdAndCode.setCount(BigDecimalUtil.add(count1, new BigDecimal(count)));
//zw318 当天多次买入都冻结
updateById(byMarketIdAndCode);
} else {
KingFrozenRecord frozenStock = createFrozenStock(code, count, marketId);
save(frozenStock);
}
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void insertFrozenFund(Long marketId, String fund) {
//查询当前用户今天是否已经冻结过资金
KingFrozenRecord byMarketIdAndCode = getFrozenFundByMarketId(marketId);
if (byMarketIdAndCode != null) {
BigDecimal count1 = byMarketIdAndCode.getCount();
byMarketIdAndCode.setCount(BigDecimalUtil.add(count1, new BigDecimal(fund)));
} else {
KingFrozenRecord frozenFund = createFrozenFund(fund, marketId);
save(frozenFund);
}
}
@Override
public void clearFrozenRecords() {
//获取当前时间要大于5点后执行
Integer hour = DateUtil.getCurrentHour();
//大于指定时间才能进行冻结股票记录的清理
if (hour < clearHour) {
return;
}
List<KingFrozenRecord> list = list();
List<Long> ids = list.stream().map(KingFrozenRecord::getId).collect(Collectors.toList());
removeByIds(ids);
}
@Override
public void clearFrozenRecordsForSynData() {
List<KingFrozenRecord> list = list();
List<Long> ids = list.stream().map(KingFrozenRecord::getId).collect(Collectors.toList());
removeByIds(ids);
}
/**
* 创建冻结股票对象
*
* @param code
* @param count
* @param marketId
* @return
*/
private KingFrozenRecord createFrozenStock(String code, String count, Long marketId) {
KingFrozenRecord frozenRecord = new KingFrozenRecord();
frozenRecord.setCode(code);
frozenRecord.setCount(new BigDecimal(count));
frozenRecord.setFrozenTarget(STOCK.getDesc());
frozenRecord.setMarketId(marketId);
return frozenRecord;
}
/**
* 创建冻结资金对象
*
* @param count
* @param marketId
* @return
*/
private KingFrozenRecord createFrozenFund(String count, Long marketId) {
KingFrozenRecord frozenRecord = new KingFrozenRecord();
frozenRecord.setCount(new BigDecimal(count));
frozenRecord.setFrozenTarget(FUND.getDesc());
frozenRecord.setMarketId(marketId);
return frozenRecord;
}
}
package com.zfxftech.telmarket.service.impl.business.king;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zfxftech.telmarket.common.pojo.dao.king.KingMarketProfitLog;
import com.zfxftech.telmarket.mapper.business.king.KingMarketProfitLogMapper;
import com.zfxftech.telmarket.service.business.king.KingMarketProfitLogService;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/19 9:47
*/
@Service
@Log4j2
public class KingMarketProfitLogServiceImpl extends ServiceImpl<KingMarketProfitLogMapper, KingMarketProfitLog> implements KingMarketProfitLogService {
}
package com.zfxftech.telmarket.service.impl.business.king;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zfxftech.telmarket.common.bean.CommonPage;
import com.zfxftech.telmarket.common.pojo.dao.Quote;
import com.zfxftech.telmarket.common.pojo.dao.StockProfitLog;
import com.zfxftech.telmarket.common.pojo.dao.king.KingStockProfitLog;
import com.zfxftech.telmarket.common.pojo.request.king.KingQueryStockProfitLogBO;
import com.zfxftech.telmarket.common.pojo.vo.king.KingStockProfitLogVO;
import com.zfxftech.telmarket.common.util.LambdaOrderUtil;
import com.zfxftech.telmarket.mapper.business.king.KingStockProfitLogMapper;
import com.zfxftech.telmarket.service.business.StockCodeService;
import com.zfxftech.telmarket.service.business.king.KingStockProfitLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 个股收益分析
*
* @author jianghua
* @version 1.0
* @date 2021-08-24 15:55
*/
@Service
public class KingStockProfitLogServiceImpl extends ServiceImpl<KingStockProfitLogMapper, KingStockProfitLog> implements KingStockProfitLogService {
@Autowired
private StockCodeService stockCodeService;
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void add(KingStockProfitLog stockProfitLog) {
save(stockProfitLog);
}
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public CommonPage<KingStockProfitLogVO> queryStockProfitLogs4page(KingQueryStockProfitLogBO queryStockProfitLogBO) {
PageHelper.startPage(queryStockProfitLogBO.getPageNo(), queryStockProfitLogBO.getPageSize());
List<KingStockProfitLog> stockProfitLogs = queryStockProfitLogsSort(queryStockProfitLogBO);
PageInfo<KingStockProfitLog> pageInfo = new PageInfo<KingStockProfitLog>(stockProfitLogs);
CommonPage<KingStockProfitLogVO> commonPage = new CommonPage();
commonPage.setTotalPage(pageInfo.getPages());
commonPage.setPageNum(pageInfo.getPageNum());
commonPage.setPageSize(pageInfo.getPageSize());
commonPage.setTotal(pageInfo.getTotal());
List<String> codes = stockProfitLogs.stream().map(KingStockProfitLog::getCode).collect(Collectors.toList());
Map<String, Quote> codeAndPriceMapping = stockCodeService.batchQueryStockPrice(codes);
for (KingStockProfitLog stockProfitLog : stockProfitLogs) {
String code = stockProfitLog.getCode();
if (codeAndPriceMapping.containsKey(code)) {
Quote quote = codeAndPriceMapping.get(code);
stockProfitLog.setName(quote.getName());
}
}
commonPage.setList(createStockProfitLogVO(stockProfitLogs));
// List<String> codes = stockProfitLogs.stream().map(StockProfitLog::getCode).collect(Collectors.toList());
// //批量获取股票当前价格
// Map<String, Quote> codeAndPriceMapping = stockCodeService.batchQueryStockPrice(codes);
// for (StockProfitLog stockProfitLog : stockProfitLogs) {
// String code = stockProfitLog.getCode();
// if (codeAndPriceMapping.containsKey(code)) {
// Quote quote = codeAndPriceMapping.get(code);
// stockProfitLog.setName(quote.getName());
// }
// }
return commonPage;
}
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public List<KingStockProfitLog> queryStockProfitLogs(Long marketId) {
LambdaQueryWrapper<KingStockProfitLog> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper
.and(i -> i.eq(KingStockProfitLog::getCode, "601005").gt(KingStockProfitLog::getCreatedTime, "2022-04-17 23:59:59").lt(KingStockProfitLog::getCreatedTime, "2022-04-01 00:00:00"))
.or(i -> i.ne(KingStockProfitLog::getCode, "601005"))
.and(i -> i.eq(KingStockProfitLog::getMarketId, marketId));
// QueryWrapper<StockProfitLog> queryWrapper = new QueryWrapper();
// queryWrapper.eq("market_id", marketId);
return list(queryWrapper);
}
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public List<KingStockProfitLog> queryStockProfitLogsSort(KingQueryStockProfitLogBO queryStockProfitLogBO) {
LambdaQueryWrapper<KingStockProfitLog> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper
.and(i -> i.eq(KingStockProfitLog::getCode, "601005").gt(KingStockProfitLog::getCreatedTime, "2022-04-17 23:59:59").lt(KingStockProfitLog::getCreatedTime, "2022-04-01 00:00:00"))
.or(i -> i.ne(KingStockProfitLog::getCode, "601005"))
.and(i -> i.eq(KingStockProfitLog::getMarketId, queryStockProfitLogBO.getMarketId()));
//.orderBy(true,queryStockProfitLogBO.getSortBoolean(), StringUtils.isEmpty(queryStockProfitLogBO.getBuyingTimeSortName()) ? StockProfitLog::getSellingTime : StockProfitLog::getBuyingTime);
LambdaOrderUtil.setOrderBy(
queryStockProfitLogBO.getOrderBy(),
queryWrapper,
StockProfitLog.class);
// QueryWrapper<StockProfitLog> queryWrapper = new QueryWrapper();
// queryWrapper.eq("market_id", marketId);
return list(queryWrapper);
}
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public List<KingStockProfitLog> queryStockProfitLogs(List<Long> positionIds) {
QueryWrapper<KingStockProfitLog> queryWrapper = new QueryWrapper();
queryWrapper.in("position_id", positionIds);
return list(queryWrapper);
}
private List<KingStockProfitLogVO> createStockProfitLogVO(List<KingStockProfitLog> stockProfitLogs) {
List<KingStockProfitLogVO> stockProfitLogVOS = new ArrayList<>();
for (KingStockProfitLog stockProfitLog : stockProfitLogs) {
KingStockProfitLogVO stockProfitLogVO = new KingStockProfitLogVO();
stockProfitLogVO.setBuyingTime(stockProfitLog.getBuyingTime().getTime());
stockProfitLogVO.setSellingTime(stockProfitLog.getSellingTime().getTime());
stockProfitLogVO.setCode(stockProfitLog.getCode());
stockProfitLogVO.setHoldingDays(stockProfitLog.getHoldingDays());
stockProfitLogVO.setProfitPrice(stockProfitLog.getProfitPrice().toPlainString());
stockProfitLogVO.setProfitRatio(stockProfitLog.getProfitRatio().toPlainString());
stockProfitLogVO.setName(stockProfitLog.getName());
stockProfitLogVO.setBuyingRoute("未使用");
stockProfitLogVO.setSellingRoute("未使用");
stockProfitLogVOS.add(stockProfitLogVO);
}
return stockProfitLogVOS;
}
}
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