Commit 9e68c8c7 authored by lilei's avatar lilei

高端定制定时任务

parent 1be9e686
package com.zfxftech.telmarket.common.pojo.dto.high;
import com.zfxftech.telmarket.common.pojo.dao.FansFollowRecord;
import java.util.Date;
public class HighProductCustomerFansDto {
private Long customerId;
private String customerName;
private Long productId;
private String productName;
private Long tpFansId;
private String tpFansOpenId;
private String tpFansUnionidId;
private Integer wid;
private Integer status;
private Date createdTime;
private Date expireDate;
public Date getExpireDate() {
return expireDate;
}
public void setExpireDate(Date expireDate) {
this.expireDate = expireDate;
}
public Date getCreatedTime() {
return createdTime;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
public FansFollowRecord buildFansObj() {
FansFollowRecord fans = new FansFollowRecord();
fans.setWid(wid.longValue());
fans.setId(tpFansId);
fans.setOpenId(tpFansOpenId);
fans.setUnionId(tpFansUnionidId);
fans.setStatus(status);
return fans;
}
public Long getCustomerId() {
return customerId;
}
public void setCustomerId(Long customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public Long getProductId() {
return productId;
}
public void setProductId(Long productId) {
this.productId = productId;
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName;
}
public Long getTpFansId() {
return tpFansId;
}
public void setTpFansId(Long tpFansId) {
this.tpFansId = tpFansId;
}
public String getTpFansOpenId() {
return tpFansOpenId;
}
public void setTpFansOpenId(String tpFansOpenId) {
this.tpFansOpenId = tpFansOpenId;
}
public String getTpFansUnionidId() {
return tpFansUnionidId;
}
public void setTpFansUnionidId(String tpFansUnionidId) {
this.tpFansUnionidId = tpFansUnionidId;
}
public Integer getWid() {
return wid;
}
public void setWid(Integer wid) {
this.wid = wid;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
}
package com.zfxftech.telmarket.common.pojo.request.high;
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 HighBatchSellingOrderBO {
@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.high;
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 HighPagePositionTradeInfoRecordGroupByBatchBO 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.high;
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 HighQueryCustomerMarketDetailsBO {
@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.high;
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 HighQueryProductBO 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.high;
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 HighQueryStockInputLogBO 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.high;
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 HighQueryStockProfitLogBO extends PageBO {
@NotNull
@ApiModelProperty(value = "模拟盘id", name = "marketId", required = true)
private Long marketId;
}
package com.zfxftech.telmarket.common.pojo.request.high;
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 HighSaveProductBO {
@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.high;
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 HighSellingOrderBO {
@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.high;
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 HighSendClearOrderBO {
@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.high;
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 HighTradeOrderBO {
@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.high;
import com.zfxftech.telmarket.common.pojo.vo.StockVO;
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 HighMarketDetailsVO {
/**
* 姓名
*/
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<HighStockVO> 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.high;
import lombok.Data;
import lombok.ToString;
@Data
@ToString
public class HighProductStrategyVO {
private Integer id;
private String productName;
}
package com.zfxftech.telmarket.common.pojo.vo.high;
import lombok.Data;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/23 15:46
*/
@Data
public class HighStockProfitLogVO {
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.high;
import lombok.Data;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/17 15:27
*/
@Data
public class HighStockVO {
/**
* 代码
*/
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.high;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/15 14:29
*/
@ApiModel(value = "交易指令交易失败返回实体类", description = "交易指令交易失败返回实体类")
@Data
public class HighTradeOrderVO {
/**
* 客户姓名
*/
private String customerName;
/**
* 错误码
*/
private Integer errorCode;
private Long customerId;
}
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zfxftech.telmarket.common.pojo.dao.asset.AssetAccountProductRelation;
import com.zfxftech.telmarket.common.pojo.dao.high.HighAccountProductRelation;
import com.zfxftech.telmarket.common.pojo.dto.ProductCustomerFansDto;
import com.zfxftech.telmarket.common.pojo.dto.high.HighProductCustomerFansDto;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
......@@ -34,6 +35,6 @@ public interface HighAccountProductRelationMapper extends BaseMapper<HighAccount
" left join us_member_base as u on pr.customer_id=u.id" +
" left join high_product as p on pr.product_id = p.id" +
" where pr.product_id= #{productId} and pr.status>0 and f.id is not null")
List<ProductCustomerFansDto> queryProductUserList(Long productId);
List<HighProductCustomerFansDto> queryProductUserList(Long productId);
}
\ No newline at end of file
......@@ -3,6 +3,7 @@ package com.zfxftech.telmarket.mapper.business.high;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zfxftech.telmarket.common.pojo.dao.asset.AssetProduct;
import com.zfxftech.telmarket.common.pojo.dao.high.HighProduct;
import org.springframework.stereotype.Repository;
......@@ -12,6 +13,6 @@ import org.springframework.stereotype.Repository;
* @date 2021-08-24 15:55
*/
@Repository
public interface HighProductMapper extends BaseMapper<AssetProduct> {
public interface HighProductMapper extends BaseMapper<HighProduct> {
}
package com.zfxftech.telmarket.service.business.high;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zfxftech.telmarket.common.pojo.dao.AccountProductRelation;
import com.zfxftech.telmarket.common.pojo.dao.high.HighAccountProductRelation;
import com.zfxftech.telmarket.common.pojo.dto.ProductCustomerFansDto;
import com.zfxftech.telmarket.common.pojo.dto.high.HighProductCustomerFansDto;
import java.util.List;
public interface HighAccountProductRelationService extends IService<HighAccountProductRelation> {
List<HighAccountProductRelation> queryAll();
//通过用户id批量查询用户的产品信息
List<HighAccountProductRelation> queryAccountProductRelationByMemberIds(List<Long> memberIds);
//通过用户id 产品id 批量查询用户的产品信息
List<HighAccountProductRelation> getMarkId(Long memberIds, List<Long> productList);
//批量查询用户的产品
List<HighAccountProductRelation> queryAccountProductRelationByMemberId(Long memberId);
//根据粉丝id查询用户的产品
List<HighAccountProductRelation> queryAccountProductRelationByFansId(Long fansId);
void updateAccountProductRelation(HighAccountProductRelation accountProductRelation, Long memberId, Long productId);
void updateAccountProductRelation(HighAccountProductRelation accountProductRelation);
void batchUpdateAccountProductRelation(List<HighAccountProductRelation> accountProductRelations);
void addAccountProductRelation(HighAccountProductRelation accountProductRelation);
//查询用户的指定产品
HighAccountProductRelation queryAccountProductRelationByMemberIdAndProductId(Long memberId, Long productId);
/**
* @param marketId
* @param type (实盘:real 示范:simulated)
* @return
*/
HighAccountProductRelation queryAccountProductRelationByMarketInfo(Long marketId, String type);
//通过id批量查询产品和用户的关联关系
List<HighAccountProductRelation> queryAccountProductRelationByIds(List<Long> relationIds);
//通过虚拟帐号批量查询产品和用户的关联关系
List<HighAccountProductRelation> 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<HighProductCustomerFansDto> getProductUserList(Long productId);
List<HighAccountProductRelation> getRelationByProductIds(List<Long> ids);
void updateList(List<HighAccountProductRelation> list);
}
package com.zfxftech.telmarket.service.business.high;
import com.zfxftech.telmarket.common.pojo.dao.Quote;
import com.zfxftech.telmarket.common.pojo.dao.StockPosition;
import com.zfxftech.telmarket.common.pojo.dao.StocksCode;
import com.zfxftech.telmarket.common.pojo.dao.high.HighStockPosition;
import org.apache.commons.lang3.tuple.Pair;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
public interface HighFinanceCalculateService {
/**
* 计算股价均值
*
* @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<HighStockPosition> stockPositions, Map<String, Quote> stockCodeAndPriceMapping);
/**
* 计算股票总市值(当前价格)
*
* @param stockPositions
* @param stockCodeAndPriceMapping
* @return
*/
BigDecimal calculateTotalAssets(List<HighStockPosition> stockPositions, Map<String, Quote> stockCodeAndPriceMapping);
/**
* 计算股票总市值(成本价格)
*
* @param stockPositions
* @return
*/
BigDecimal calculateTotalAssets(List<HighStockPosition> 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.high;
import com.zfxftech.telmarket.common.pojo.dao.FrozenRecord;
import com.zfxftech.telmarket.common.pojo.dao.high.HighFrozenRecord;
import java.util.List;
/**
* @Description TODO
* @Author Dell
* @Date 2021/12/21 14:30
*/
public interface HighFrozenRecordService {
/**
* marketId和股票代码获取股票
*
* @param marketId
* @param code
* @return
*/
HighFrozenRecord getStockByMarketIdAndCode(Long marketId, String code);
/**
* 通过股票和marketId集合批量查询冻结股票
*
* @param marketIds
* @param code
* @return
*/
List<HighFrozenRecord> getStockByMarketIdsAndCode(List<Long> marketIds, String code);
/**
* 通过股票和marketId集合批量查询冻结股票
*
* @param marketIds
* @param codes
* @return
*/
List<HighFrozenRecord> getStockByMarketIdsAndCode(List<Long> marketIds, List<String> codes);
/**
* 通过marketId查询当前账户下的所有冻结股票
*
* @param marketId
* @return
*/
List<HighFrozenRecord> getStockByMarketId(Long marketId);
/**
* 获取冻结资金
*
* @param marketId
* @return
*/
HighFrozenRecord 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.high;
import com.zfxftech.telmarket.common.bean.CommonPage;
import com.zfxftech.telmarket.common.enums.StockInputLogTrustSource;
import com.zfxftech.telmarket.common.pojo.dao.PositionTradeInfoRecord;
import com.zfxftech.telmarket.common.pojo.dao.PositionTradeInfoRecord4Page;
import com.zfxftech.telmarket.common.pojo.dao.StockPosition;
import com.zfxftech.telmarket.common.pojo.dao.high.HighPositionTradeInfoRecord;
import com.zfxftech.telmarket.common.pojo.dao.high.HighPositionTradeInfoRecord4Page;
import com.zfxftech.telmarket.common.pojo.dao.high.HighStockPosition;
import com.zfxftech.telmarket.common.pojo.request.PagePositionTradeInfoRecordGroupByBatchBO;
import com.zfxftech.telmarket.common.pojo.request.high.HighPagePositionTradeInfoRecordGroupByBatchBO;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
public interface HighPositionTradeInfoRecordService {
/**
* 分页查询交易记录,批次分组
*
* @param pagePositionTradeInfoRecordGroupByBatchBO
* @return
*/
@Deprecated
List pagePositionTradeInfoRecordGroupByBatch(HighPagePositionTradeInfoRecordGroupByBatchBO pagePositionTradeInfoRecordGroupByBatchBO);
/**
* 历史收益统计
*
* @param pagePositionTradeInfoRecordGroupByBatchBO
* @return
*/
Map<String, Object> positionTradeInfoRecordCount(HighPagePositionTradeInfoRecordGroupByBatchBO pagePositionTradeInfoRecordGroupByBatchBO);
/**
* 历史收益统计-详细数据
*
* @param pagePositionTradeInfoRecordGroupByBatchBO
* @return
*/
CommonPage<HighPositionTradeInfoRecord4Page> positionTradeInfoRecordCountDetail(HighPagePositionTradeInfoRecordGroupByBatchBO pagePositionTradeInfoRecordGroupByBatchBO);
/**
持仓id获取交易记录
*
* @param positionIds
* @return
*/
List<HighPositionTradeInfoRecord> listByPositionIds(List<Long> positionIds);
/**
* 批量修改交易记录
*
* @param list
*/
void updateBatchPositionTradeInfoRecord(List<HighPositionTradeInfoRecord> list);
/**
* 批量插入交易记录
*
* @param list
*/
void addBatch(List<HighPositionTradeInfoRecord> 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, HighStockPosition> positionMapping, Long batch, BigDecimal sellingPrice, Integer status, Integer entrustWay, StockInputLogTrustSource trustSource, String trustSourceName);
List<HighPositionTradeInfoRecord> getPositionTradeInfoRecordByPositionId(String code,Long positionId);
int updatePositionTradeInfoRecord(HighPositionTradeInfoRecord positionTradeInfoRecord);
}
package com.zfxftech.telmarket.service.business.high;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zfxftech.telmarket.common.bean.MapIntgerVo;
import com.zfxftech.telmarket.common.pojo.dao.Product;
import com.zfxftech.telmarket.common.pojo.dao.high.HighProduct;
import com.zfxftech.telmarket.common.pojo.dao.permission.UsAdmin;
import com.zfxftech.telmarket.common.pojo.request.PageProportionBO;
import com.zfxftech.telmarket.common.pojo.request.QueryProductBO;
import com.zfxftech.telmarket.common.pojo.request.SaveProductBO;
import com.zfxftech.telmarket.common.pojo.request.high.HighQueryProductBO;
import com.zfxftech.telmarket.common.pojo.request.high.HighSaveProductBO;
import com.zfxftech.telmarket.common.pojo.vo.ProductStrategyVO;
import com.zfxftech.telmarket.common.pojo.vo.high.HighProductStrategyVO;
import java.util.List;
/**
* 产品服务类接口
*
* @author jianghua
* @version 1.0
* @date 2021-08-24 15:55
*/
public interface HighProductService extends IService<HighProduct> {
void saveProduct(HighSaveProductBO saveProductBO, UsAdmin usAdmin);
List<HighProduct> queryProductByIds(List<Long> id);
HighProduct queryProductById(Long id);
List<HighProduct> queryAll();
List<HighProduct> queryListForAuthority();
List<HighProduct> pageProduct(HighQueryProductBO queryProductBO);
List<HighProduct> getListForDataSource();
void operationSubstituteAnalyst(Long productId, Long analyst, String operation);
List<HighProduct> queryProductByType(String type);
/**
* 获取私人定制产品名称未删除
* @return
*/
List<HighProductStrategyVO> getAllFollowAccount();
List<MapIntgerVo> getProductName(PageProportionBO pageProportionBO);
List<UsAdmin> getProductUserByRoleIds(Long productId,List<Long> roleIds);
}
package com.zfxftech.telmarket.service.business.high;
import com.zfxftech.telmarket.common.pojo.dao.StockInputLog;
import com.zfxftech.telmarket.common.pojo.dao.high.HighStockInputLog;
import com.zfxftech.telmarket.common.pojo.request.QueryStockInputLogBO;
import com.zfxftech.telmarket.common.pojo.request.high.HighQueryStockInputLogBO;
import java.util.List;
/**
* @Description TODO
* @Author Dell
* @Date 2021/11/3 9:34
*/
public interface HighStockInputLogService {
List<HighStockInputLog> pageStockInputLogs(HighQueryStockInputLogBO queryStockInputLogBO);
/**
* 新增股票
*
* @param stockInputLog
*/
void addStockInputLog(HighStockInputLog stockInputLog);
void addStockInputLog2(HighStockInputLog stockInputLog);
void addStockInputLogs(List<HighStockInputLog> stockInputLogs);
void updateStockInputLog(HighStockInputLog stockInputLog);
List<HighStockInputLog> queryStockInputLogs(long customerId, long productId, String code);
/**
* 通过持仓id获取交易日志
*
* @param stockPositionId
* @param operation
* @return
*/
List<HighStockInputLog> queryStockInputLogs(long stockPositionId, Integer operation);
/**
* 获取最近一次交易的记录
*
* @param stockPositionId
* @param operation
* @return
*/
HighStockInputLog queryOldestStockInputLog(long stockPositionId, Integer operation);
/**
* 获取当日的操作记录
*
* @param marketIds
* @return
*/
List<HighStockInputLog> queryByMarketIdsAndToday(List<Long> marketIds);
/**
* 获取前一日的操作记录
*
* @param marketType 根据类型查询前一天的操作记录
* @return
*/
List<HighStockInputLog> queryPreToday(String marketType,String operation);
List<HighStockInputLog> all();
void updateAA(HighStockInputLog stockInputLog);
}
package com.zfxftech.telmarket.service.business.high;
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.*;
import com.zfxftech.telmarket.common.pojo.dao.high.HighAccountProductRelation;
import com.zfxftech.telmarket.common.pojo.dao.high.HighMemberStockPage;
import com.zfxftech.telmarket.common.pojo.dao.high.HighStockPosition;
import com.zfxftech.telmarket.common.pojo.dao.high.HighTradingStrategyParam;
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.*;
import com.zfxftech.telmarket.common.pojo.request.high.*;
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.MarketDetailsVO;
import com.zfxftech.telmarket.common.pojo.vo.StockVO;
import com.zfxftech.telmarket.common.pojo.vo.TradeOrderVO;
import com.zfxftech.telmarket.common.pojo.vo.high.HighMarketDetailsVO;
import com.zfxftech.telmarket.common.pojo.vo.high.HighStockVO;
import com.zfxftech.telmarket.common.pojo.vo.high.HighTradeOrderVO;
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 HighStockPositionService extends IService<HighStockPosition> {
/**
* 获取所有的股票持仓
*
* @return
*/
List<HighStockPosition> getAll();
/**
* 实盘新增股票
*
* @param stockPosition
* @return
*/
HighStockPosition saveStockPosition(HighStockPosition stockPosition);
int updateStockPosition(HighStockPosition stockPosition);
int bactchUpdateStockPosition(List<HighStockPosition> stockPositions);
void del(Long id);
/**
* 示范盘添加股票
*
* @param stockPosition
* @return
*/
Pair<HighStockPosition, Boolean> saveStockPosition4Demonstration(HighStockPosition stockPosition,String interferenceStopPosition ,String stopLossPosition);
HighStockPosition queryStockPosition(Long marketId, String code);
List<HighStockPosition> queryStockPosition(List<Long> marketIds, String codes);
List<HighStockPosition> queryStockPositionByCode(String code);
List<HighStockPosition> queryStockPosition(Long marketId, List<String> codes);
List<HighStockPosition> queryStockPositionsContainIsDeleted(Long marketId);
//根据marketId 批量查出股票持仓
List<HighStockPosition> queryStockPositions(List<Long> allMarketIds);
List<HighTradeOrderVO> sendTradeOrder(HighTradeOrderBO tradeOrderBO, UsAdmin usAdmin);
List<HighTradeOrderVO> sendSellingOrder(HighSellingOrderBO sellingOrderBO, UsAdmin usAdmin);
/**
* 止盈止损
* @param sellingOrderBO
* @param usAdmin
* @return
*/
List<HighTradeOrderVO> sendSellingOrderTask(HighSellingOrderBO sellingOrderBO, UsAdmin usAdmin,StockInputLogTrustSource stockInputLogTrustSource);
//定时任务自动卖出,当天示范账户买入一只股票后,到第二天24点前客户未录入实盘账户
void autoSellingOrder();
List<HighMemberStockPage> pageCustomerPositionList(QueryCustomerPositionBO customerPositionBO);
/**
* 查询模拟盘详情
*
* @param customerMarketDetailsBO
* @return
*/
HighMarketDetailsVO queryMarketDetails(HighQueryCustomerMarketDetailsBO customerMarketDetailsBO);
List<HighStockPosition> queryStockPositions(Long marketId);
HighStockPosition queryStockPosition(Long id);
/**
* 重算持仓
*
* @param stockPosition
*/
void recalculateStockPosition(HighStockPosition stockPosition);
/**
* 动态清零
*
* @param sendClearOrderBO
* @param usAdmin
* @return
*/
List<String> sendClearOrder(HighSendClearOrderBO sendClearOrderBO, UsAdmin usAdmin);
/**
* 批量卖出
*
* @param sellingOrderBO
* @param usAdmin
* @return
*/
List<String> sendSellingOrderOfBatch(HighBatchSellingOrderBO sellingOrderBO, UsAdmin usAdmin);
public HighTradingStrategyParam createTradingStrategyParam(String pushTime, String reason, HighAccountProductRelation accountProductRelation,String interferenceStopPosition,String stopLossPosition);
/**
* 清仓卖出
*
* @param
* @param usAdmin
* @return
*/
boolean selling(HighAccountProductRelation accountProductRelation, HighStockPosition stockPosition, String position, BigDecimal currentPrice, HighTradingStrategyParam tradingStrategyParam, UsAdmin usAdmin, Boolean isPresent, StockInputLogTrustSource trustSource);
HighMarketDetailsVO createMarketDetailsVO(MemberBase memberBase, List<HighStockPosition> stockPositions, BigDecimal funding, HighAccountProductRelation accountProductRelation, Long marketId);
HighMarketDetailsVO createMarketDetailsVOTask( List<HighStockPosition> stockPositions, BigDecimal funding, HighAccountProductRelation accountProductRelation);
HighStockVO createStockVO(HighStockPosition stockPosition, Map<String, Quote> codeAndQuoteMapping);
/**
* 根据产品id获取股票信息
*
* @param id
* @return
*/
List<HighStockPosition> getCode(Long id);
List<StockPositionTask> getStockPositionTask( Long productId);
/**
* 获取持仓 获取一只股票
*
* @param productId 产品id
* @param userId 用户id
* @param code 股票 code
* @return
*/
HighStockPosition getPosition(Long productId, Long userId, String code);
/**
* 获取持仓 获取多只股票 获取
*
* @param productId 产品id
* @param userId 用户id
* @return
*/
List<HighStockPosition> 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.high;
import com.zfxftech.telmarket.common.bean.CommonPage;
import com.zfxftech.telmarket.common.pojo.dao.StockProfitLog;
import com.zfxftech.telmarket.common.pojo.dao.high.HighStockProfitLog;
import com.zfxftech.telmarket.common.pojo.request.QueryStockProfitLogBO;
import com.zfxftech.telmarket.common.pojo.request.high.HighQueryStockProfitLogBO;
import com.zfxftech.telmarket.common.pojo.vo.StockProfitLogVO;
import com.zfxftech.telmarket.common.pojo.vo.high.HighStockProfitLogVO;
import java.util.List;
public interface HighStockProfitLogService {
/**
* 插入记录
*
* @param stockProfitLog
*/
void add(HighStockProfitLog stockProfitLog);
CommonPage<HighStockProfitLogVO> queryStockProfitLogs4page(HighQueryStockProfitLogBO queryStockProfitLogBO);
List<HighStockProfitLog> queryStockProfitLogs(Long marketId);
List<HighStockProfitLog> queryStockProfitLogsSort(HighQueryStockProfitLogBO queryStockProfitLogsSort);
List<HighStockProfitLog> queryStockProfitLogs(List<Long> positionIds);
}
package com.zfxftech.telmarket.service.impl.business.high;
import com.zfxftech.telmarket.common.pojo.dao.Quote;
import com.zfxftech.telmarket.common.pojo.dao.StockPosition;
import com.zfxftech.telmarket.common.pojo.dao.StocksCode;
import com.zfxftech.telmarket.common.pojo.dao.high.HighStockPosition;
import com.zfxftech.telmarket.common.util.BigDecimalUtil;
import com.zfxftech.telmarket.service.business.FinanceCalculateService;
import com.zfxftech.telmarket.service.business.high.HighFinanceCalculateService;
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 HighFinanceCalculateServiceImpl implements HighFinanceCalculateService {
@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<HighStockPosition> 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<HighStockPosition> stockPositions, Map<String, Quote> stockCodeAndPriceMapping) {
BigDecimal totalAssets = new BigDecimal(ZERO.getCode());
for (HighStockPosition 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<HighStockPosition> stockPositions) {
BigDecimal totalAssets = new BigDecimal(ZERO.getCode());
for (HighStockPosition 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.high;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zfxftech.telmarket.common.pojo.dao.FrozenRecord;
import com.zfxftech.telmarket.common.pojo.dao.high.HighFrozenRecord;
import com.zfxftech.telmarket.common.util.BigDecimalUtil;
import com.zfxftech.telmarket.common.util.DateUtil;
import com.zfxftech.telmarket.mapper.business.FrozenRecordMapper;
import com.zfxftech.telmarket.mapper.business.high.HighFrozenRecordMapper;
import com.zfxftech.telmarket.service.business.FrozenRecordService;
import com.zfxftech.telmarket.service.business.high.HighFrozenRecordService;
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 HighFrozenRecordServiceImpl extends ServiceImpl<HighFrozenRecordMapper, HighFrozenRecord> implements HighFrozenRecordService {
@Value("${frozenRecord.clearHour}")
private Integer clearHour;
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public HighFrozenRecord getStockByMarketIdAndCode(Long marketId, String code) {
QueryWrapper<HighFrozenRecord> 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<HighFrozenRecord> getStockByMarketIdsAndCode(List<Long> marketIds, String code) {
QueryWrapper<HighFrozenRecord> queryWrapper = new QueryWrapper();
queryWrapper.in("market_id", marketIds);
queryWrapper.eq("code", code);
queryWrapper.eq("frozen_target", STOCK.getDesc());
return list(queryWrapper);
}
@Override
public List<HighFrozenRecord> getStockByMarketIdsAndCode(List<Long> marketIds, List<String> codes) {
QueryWrapper<HighFrozenRecord> 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<HighFrozenRecord> getStockByMarketId(Long marketId) {
QueryWrapper<HighFrozenRecord> queryWrapper = new QueryWrapper();
queryWrapper.in("market_id", marketId);
queryWrapper.eq("frozen_target", STOCK.getDesc());
return list(queryWrapper);
}
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public HighFrozenRecord getFrozenFundByMarketId(Long marketId) {
QueryWrapper<HighFrozenRecord> 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) {
//查询当前用户今天是否已经冻结过股票
HighFrozenRecord byMarketIdAndCode = getStockByMarketIdAndCode(marketId, code);
if (byMarketIdAndCode != null) {
BigDecimal count1 = byMarketIdAndCode.getCount();
byMarketIdAndCode.setCount(BigDecimalUtil.add(count1, new BigDecimal(count)));
//zw318 当天多次买入都冻结
updateById(byMarketIdAndCode);
} else {
HighFrozenRecord frozenStock = createFrozenStock(code, count, marketId);
save(frozenStock);
}
}
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void insertFrozenFund(Long marketId, String fund) {
//查询当前用户今天是否已经冻结过资金
HighFrozenRecord byMarketIdAndCode = getFrozenFundByMarketId(marketId);
if (byMarketIdAndCode != null) {
BigDecimal count1 = byMarketIdAndCode.getCount();
byMarketIdAndCode.setCount(BigDecimalUtil.add(count1, new BigDecimal(fund)));
} else {
HighFrozenRecord frozenFund = createFrozenFund(fund, marketId);
save(frozenFund);
}
}
@Override
public void clearFrozenRecords() {
//获取当前时间要大于5点后执行
Integer hour = DateUtil.getCurrentHour();
//大于指定时间才能进行冻结股票记录的清理
if (hour < clearHour) {
return;
}
List<HighFrozenRecord> list = list();
List<Long> ids = list.stream().map(HighFrozenRecord::getId).collect(Collectors.toList());
removeByIds(ids);
}
@Override
public void clearFrozenRecordsForSynData() {
List<HighFrozenRecord> list = list();
List<Long> ids = list.stream().map(HighFrozenRecord::getId).collect(Collectors.toList());
removeByIds(ids);
}
/**
* 创建冻结股票对象
*
* @param code
* @param count
* @param marketId
* @return
*/
private HighFrozenRecord createFrozenStock(String code, String count, Long marketId) {
HighFrozenRecord frozenRecord = new HighFrozenRecord();
frozenRecord.setCode(code);
frozenRecord.setCount(new BigDecimal(count));
frozenRecord.setFrozenTarget(STOCK.getDesc());
frozenRecord.setMarketId(marketId);
return frozenRecord;
}
/**
* 创建冻结资金对象
*
* @param count
* @param marketId
* @return
*/
private HighFrozenRecord createFrozenFund(String count, Long marketId) {
HighFrozenRecord frozenRecord = new HighFrozenRecord();
frozenRecord.setCount(new BigDecimal(count));
frozenRecord.setFrozenTarget(FUND.getDesc());
frozenRecord.setMarketId(marketId);
return frozenRecord;
}
}
package com.zfxftech.telmarket.service.impl.business.high;
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.high.HighStockProfitLog;
import com.zfxftech.telmarket.common.pojo.request.QueryStockProfitLogBO;
import com.zfxftech.telmarket.common.pojo.request.high.HighQueryStockProfitLogBO;
import com.zfxftech.telmarket.common.pojo.vo.StockProfitLogVO;
import com.zfxftech.telmarket.common.pojo.vo.high.HighStockProfitLogVO;
import com.zfxftech.telmarket.common.util.LambdaOrderUtil;
import com.zfxftech.telmarket.mapper.business.StockProfitLogMapper;
import com.zfxftech.telmarket.mapper.business.high.HighStockProfitLogMapper;
import com.zfxftech.telmarket.service.business.StockCodeService;
import com.zfxftech.telmarket.service.business.StockProfitLogService;
import com.zfxftech.telmarket.service.business.high.HighStockProfitLogService;
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 HighStockProfitLogServiceImpl extends ServiceImpl<HighStockProfitLogMapper, HighStockProfitLog> implements HighStockProfitLogService {
@Autowired
private StockCodeService stockCodeService;
@Transactional(propagation = Propagation.REQUIRED)
@Override
public void add(HighStockProfitLog stockProfitLog) {
save(stockProfitLog);
}
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public CommonPage<HighStockProfitLogVO> queryStockProfitLogs4page(HighQueryStockProfitLogBO queryStockProfitLogBO) {
PageHelper.startPage(queryStockProfitLogBO.getPageNo(), queryStockProfitLogBO.getPageSize());
List<HighStockProfitLog> stockProfitLogs = queryStockProfitLogsSort(queryStockProfitLogBO);
PageInfo<HighStockProfitLog> pageInfo = new PageInfo<HighStockProfitLog>(stockProfitLogs);
CommonPage<HighStockProfitLogVO> 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(HighStockProfitLog::getCode).collect(Collectors.toList());
Map<String, Quote> codeAndPriceMapping = stockCodeService.batchQueryStockPrice(codes);
for (HighStockProfitLog 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<HighStockProfitLog> queryStockProfitLogs(Long marketId) {
LambdaQueryWrapper<HighStockProfitLog> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper
.and(i->i.eq(HighStockProfitLog::getCode,"601005").gt(HighStockProfitLog::getCreatedTime,"2022-04-17 23:59:59").lt(HighStockProfitLog::getCreatedTime,"2022-04-01 00:00:00"))
.or(i->i.ne(HighStockProfitLog::getCode,"601005"))
.and(i->i.eq(HighStockProfitLog::getMarketId,marketId));
// QueryWrapper<StockProfitLog> queryWrapper = new QueryWrapper();
// queryWrapper.eq("market_id", marketId);
return list(queryWrapper);
}
@Transactional(propagation = Propagation.SUPPORTS)
@Override
public List<HighStockProfitLog> queryStockProfitLogsSort(HighQueryStockProfitLogBO queryStockProfitLogBO) {
LambdaQueryWrapper<HighStockProfitLog> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper
.and(i->i.eq(HighStockProfitLog::getCode,"601005").gt(HighStockProfitLog::getCreatedTime,"2022-04-17 23:59:59").lt(HighStockProfitLog::getCreatedTime,"2022-04-01 00:00:00"))
.or(i->i.ne(HighStockProfitLog::getCode,"601005"))
.and(i->i.eq(HighStockProfitLog::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<HighStockProfitLog> queryStockProfitLogs(List<Long> positionIds) {
QueryWrapper<HighStockProfitLog> queryWrapper = new QueryWrapper();
queryWrapper.in("position_id", positionIds);
return list(queryWrapper);
}
private List<HighStockProfitLogVO> createStockProfitLogVO(List<HighStockProfitLog> stockProfitLogs) {
List<HighStockProfitLogVO> stockProfitLogVOS = new ArrayList<>();
for (HighStockProfitLog stockProfitLog : stockProfitLogs) {
HighStockProfitLogVO stockProfitLogVO = new HighStockProfitLogVO();
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