first commit

This commit is contained in:
Ray
2026-02-19 03:37:37 +08:00
commit ccfd8c79a4
2813 changed files with 453657 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">
<bean id="exchangeApplyOrderService"
class="project.exchange.internal.ExchangeApplyOrderServiceImpl" >
<property name="hibernateTemplate" ref="hibernateTemplate" />
<property name="pagedQueryDao" ref="pagedDao" />
<property name="sysparaService" ref="sysparaService" />
<property name="itemService" ref="itemService" />
<property name="moneyLogService" ref="moneyLogService" />
<property name="walletService" ref="walletService" />
<property name="userDataService" ref="userDataService" />
<property name="dataService" ref="dataService" />
</bean>
<bean id="walletExtendCostUSDTService"
class="project.exchange.internal.WalletExtendCostUSDTServiceImpl" >
<property name="hibernateTemplate" ref="hibernateTemplate" />
</bean>
</beans>

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">
<bean id="adminExchangeApplyOrderService"
class="project.exchange.internal.AdminExchangeApplyOrderServiceImpl">
<property name="hibernateTemplate" ref="hibernateTemplate" />
<property name="pagedQueryDao" ref="pagedDao" />
<property name="userRecomService" ref="userRecomService" />
</bean>
<bean id="exchangeApplyOrderService"
class="project.exchange.internal.ExchangeApplyOrderServiceImpl" >
<property name="hibernateTemplate" ref="hibernateTemplate" />
<property name="pagedQueryDao" ref="pagedDao" />
<property name="sysparaService" ref="sysparaService" />
<property name="partyService" ref="partyService" />
<property name="itemService" ref="itemService" />
<property name="moneyLogService" ref="moneyLogService" />
<property name="walletService" ref="walletService" />
<property name="userDataService" ref="userDataService" />
<property name="dataService" ref="dataService" />
</bean>
</beans>

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd ">
<bean id="exchangeApplyOrderService"
class="project.exchange.internal.ExchangeApplyOrderServiceImpl" >
<property name="hibernateTemplate" ref="hibernateTemplate" />
<property name="pagedQueryDao" ref="pagedDao" />
<property name="sysparaService" ref="sysparaService" />
<property name="partyService" ref="partyService" />
<property name="itemService" ref="itemService" />
<property name="moneyLogService" ref="moneyLogService" />
<property name="walletService" ref="walletService" />
<property name="userDataService" ref="userDataService" />
<property name="dataService" ref="dataService" />
</bean>
<bean id="exchangeApplyOrderHandleJob"
class="project.exchange.job.ExchangeApplyOrderHandleJob" >
<property name="exchangeApplyOrderService" ref="exchangeApplyOrderService" />
<property name="dataService" ref="dataService" />
</bean>
</beans>

View File

@@ -0,0 +1,13 @@
admin
<!-- exchange -->
<value>adminExchangeApplyOrderService</value>
<value>exchangeApplyOrderService</value>
api
<!-- exchange -->
<value>exchangeApplyOrderService</value>
<value>walletExtendCostUSDTService</value>

View File

@@ -0,0 +1,15 @@
admin
<action name="adminExchangeApplyOrderAction"
class="project.exchange.web.AdminExchangeApplyOrderAction">
<result name="list">/exchange_order_list.jsp</result>
<!-- <result name="result_make" type="json"> -->
<!-- <param name="root">result_make</param> -->
<!-- </result> -->
</action>
api
<action name="exchangeapplyorder"
class="project.exchange.web.ExchangeApplyOrderAction">
</action>

View File

@@ -0,0 +1,32 @@
DROP TABLE IF EXISTS `T_EXCHANGE_APPLY_ORDER`;
CREATE TABLE `T_EXCHANGE_APPLY_ORDER` (
`UUID` varchar(32) NOT NULL COMMENT '主键',
`PARTY_ID` varchar(32) ,
`SYMBOL` varchar(32) COMMENT '代码',
`ORDER_NO` varchar(64) ,
`OFFSET`varchar(32),
`VOLUME` double ,
`PRICE` double ,
`ORDER_PRICE_TYPE`varchar(32),
`STATE` varchar(32) ,
`CREATE_TIME` datetime ,
`FEE` double ,
PRIMARY KEY (`UUID`),
KEY `INDEX_EXCHANGE_APPLY_ORDER_STATUS` (`STATE`,`CREATE_TIME`),
KEY `INDEX_EXCHANGE_APPLY_ORDER_ORDER_NO` (`ORDER_NO`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `T_WALLET_EXTEND_COSTUSDT`;
CREATE TABLE `T_WALLET_EXTEND_COSTUSDT` (
`UUID` varchar(32) NOT NULL COMMENT '主键',
`PARTY_ID` varchar(32) ,
`WALLETTYPE` varchar(32) ,
`VOLUME` double ,
`PRICE` double ,
PRIMARY KEY (`UUID`),
KEY `INDEX_WALLET_EXTEND_COSTUSDT_PARTY_ID` (`PARTY_ID`,`WALLETTYPE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

View File

@@ -0,0 +1,6 @@
INSERT INTO `T_SYSPARA` VALUES ('exchange_apply_order_buy_fee', 'exchange_apply_order_buy_fee', null, '0', '100', '2', '币币交易买入手续费');
INSERT INTO `T_SYSPARA` VALUES ('exchange_apply_order_sell_fee', 'exchange_apply_order_sell_fee', null, '0.01', '100', '2', '币币交易卖出手续费');
INSERT INTO `T_SYSPARA` VALUES ('exchange_order_open', 'exchange_order_open', null, 'true', '100', '2', '币币交易开关(true开启false关闭)');

View File

@@ -0,0 +1,10 @@
package project.exchange;
import kernel.web.Page;
public interface AdminContractApplyOrderService {
public Page pagedQuery(int pageNo, int pageSize, String state, String rolename, String loginPartyId);
public ExchangeApplyOrder get(String id);
}

View File

@@ -0,0 +1,10 @@
package project.exchange;
import kernel.web.Page;
public interface AdminExchangeApplyOrderService {
public Page pagedQuery(int pageNo, int pageSize, String state, String rolename, String loginPartyId,String name_para,String orderNo);
public ExchangeApplyOrder get(String id);
}

View File

@@ -0,0 +1,78 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="project.exchange.ExchangeApplyOrder" table="T_EXCHANGE_APPLY_ORDER">
<id name="id" type="java.lang.String">
<column name="UUID" />
<generator class="uuid.hex" />
</id>
<property name="partyId" type="java.lang.String">
<column name="PARTY_ID" />
</property>
<property name="relation_order_no" type="java.lang.String">
<column name="RELATION_ORDER_NO" />
</property>
<property name="order_no" type="java.lang.String">
<column name="ORDER_NO" />
</property>
<property name="symbol" type="java.lang.String">
<column name="SYMBOL" />
</property>
<property name="symbol_value" type="double">
<column name="SYMBOL_VALUE" />
</property>
<property name="offset" type="java.lang.String">
<column name="OFFSET" />
</property>
<property name="volume" type="double">
<column name="VOLUME" />
</property>
<property name="price" type="double">
<column name="PRICE" />
</property>
<property name="order_price_type" type="java.lang.String">
<column name="ORDER_PRICE_TYPE" />
</property>
<property name="state" type="java.lang.String">
<column name="STATE" />
</property>
<property name="create_time" type="timestamp">
<column name="CREATE_TIME" />
</property>
<property name="fee" type="double">
<column name="FEE" />
</property>
<property name="amount" type="double">
<column name="AMOUNT" />
</property>
<property name="wallet_fee" type="double">
<column name="WALLET_FEE" />
</property>
<property name="close_price" type="double">
<column name="CLOSE_PRICE" />
</property>
<property name="close_time" type="timestamp">
<column name="CLOSE_TIME" />
</property>
<property generated="never" name="is_trigger_order"
type="yes_no">
<column name="IS_TRIGGER_ORDER" />
</property>
<property name="trigger_price" type="double">
<column name="TRIGGER_PRICE" />
</property>
</class>
</hibernate-mapping>

View File

@@ -0,0 +1,259 @@
package project.exchange;
import java.io.Serializable;
import java.util.Date;
import kernel.bo.EntityObject;
/**
* 委托单
*/
public class ExchangeApplyOrder extends EntityObject {
private static final long serialVersionUID = -7263336511778693149L;
public final static String STATE_SUBMITTED = "submitted";
public final static String STATE_CREATED = "created";
public final static String STATE_CANCELED = "canceled";
/**
* 开仓
*/
public final static String OFFSET_OPEN = "open";
/**
* 平仓
*/
public final static String OFFSET_CLOSE = "close";
/**
* 限价单
*/
public final static String ORDER_PRICE_TYPE_LIMIT = "limit";
/**
* 对手价(市价)
*/
public final static String ORDER_PRICE_TYPE_OPPONENT = "opponent";
private Serializable partyId;
/**
* 订单 号
*/
private String relation_order_no;
/**
* 订单 号
*/
private String order_no;
private String symbol;
/**
* 币种数量
*/
private Double symbol_value;
/**
* "open":买入 "close":卖出
*/
private String offset;
/**
* 委托数量
*/
private Double volume;
/**
* 手续费
*/
private double fee;
/**
* 金额USDT计价
*/
private Double amount;
/**
* 手续费(USDT计价)
*/
private Double wallet_fee;
/**
* limit order的交易价格
*/
private Double price;
/**
* 订单报价类型。 "limit":限价 "opponent":对手价(市价)
*/
private String order_price_type;
/**
* 状态。submitted 已提交canceled 已撤销, created 委托完成
*/
private String state = "submitted";
/**
* 创建时间
*/
private Date create_time;
/**
* 成交时行情点位
*/
private Double close_price;
/**
* 成交时间
*/
private Date close_time;
/**
* 是否计划委托
*/
private boolean is_trigger_order = false;
/**
* 计划委托的触发价
*/
private Double trigger_price;
public Serializable getPartyId() {
return partyId;
}
public void setPartyId(Serializable partyId) {
this.partyId = partyId;
}
public String getOrder_no() {
return order_no;
}
public void setOrder_no(String order_no) {
this.order_no = order_no;
}
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public String getOffset() {
return offset;
}
public void setOffset(String offset) {
this.offset = offset;
}
public Double getVolume() {
return volume;
}
public void setVolume(Double volume) {
this.volume = volume;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public String getOrder_price_type() {
return order_price_type;
}
public void setOrder_price_type(String order_price_type) {
this.order_price_type = order_price_type;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public Date getCreate_time() {
return create_time;
}
public void setCreate_time(Date create_time) {
this.create_time = create_time;
}
public double getFee() {
return fee;
}
public void setFee(double fee) {
this.fee = fee;
}
public Double getAmount() {
return amount;
}
public void setAmount(Double amount) {
this.amount = amount;
}
public Double getWallet_fee() {
return wallet_fee;
}
public void setWallet_fee(Double wallet_fee) {
this.wallet_fee = wallet_fee;
}
public Double getClose_price() {
return close_price;
}
public void setClose_price(Double close_price) {
this.close_price = close_price;
}
public Date getClose_time() {
return close_time;
}
public void setClose_time(Date close_time) {
this.close_time = close_time;
}
public boolean isIs_trigger_order() {
return is_trigger_order;
}
public void setIs_trigger_order(boolean is_trigger_order) {
this.is_trigger_order = is_trigger_order;
}
public Double getTrigger_price() {
return trigger_price;
}
public void setTrigger_price(Double trigger_price) {
this.trigger_price = trigger_price;
}
public String getRelation_order_no() {
return relation_order_no;
}
public void setRelation_order_no(String relation_order_no) {
this.relation_order_no = relation_order_no;
}
public Double getSymbol_value() {
return symbol_value;
}
public void setSymbol_value(Double symbol_value) {
this.symbol_value = symbol_value;
}
}

View File

@@ -0,0 +1,60 @@
package project.exchange;
import java.util.List;
import java.util.Map;
import project.data.model.Realtime;
public interface ExchangeApplyOrderService {
/**
* 创建委托单
*/
public void saveCreate(ExchangeApplyOrder order);
/**
* 撤单
*
* @param order_no
*/
public void saveCancel(String partyId, String order_no);
/**
* 开仓
*/
public void saveOpen(ExchangeApplyOrder applyOrder, Realtime realtime);
/**
* 平仓,按金额进行平仓
*/
public void saveClose(ExchangeApplyOrder applyOrder, Realtime realtime);
public void update(ExchangeApplyOrder order);
public ExchangeApplyOrder findByOrderNo(String order_no);
public ExchangeApplyOrder findByOrderNoAndPartyId(String order_no, String partyId);
/**
* APP查询订单列表
*
* @param pageNo
* @param pageSize
* @param partyId
* @param type orders 当前委托单 hisorders 历史委托单
* @return
*/
public List<Map<String, Object>> getPaged(int pageNo, int pageSize, String partyId, String symbol, String type, String isAll);
/**
* 所有未处理状态的委托单
*/
public List<ExchangeApplyOrder> findSubmitted();
/**
* 批量取消委托单
*
* @param partyId
*/
public void saveCannelAllByPartyId(String partyId);
}

View File

@@ -0,0 +1,22 @@
package project.exchange;
import java.util.HashSet;
import java.util.Set;
public class ExchangeLock {
private static final Set<String> filter = new HashSet<String>();
public static boolean add(String order_no) {
if (!filter.add(order_no)) {
return false;
} else {
return true;
}
}
public static void remove(String order_no) {
filter.remove(order_no);
}
}

View File

@@ -0,0 +1,89 @@
package project.exchange;
import java.util.Date;
/**
* 兑换交易记录
*
*/
public class ExchangeRecord {
/**
*
*/
private String symbol = "usdt";
/**
*
*/
private String symbol_to = "usdt";
/**
* 金额
*/
private Double amount;
/**
* 金额
*/
private Double amount_to;
/**
* 创建时间
*/
private String create_time;
/**
* 状态。submitted 已提交canceled 已撤销, created 委托完成
*/
private String state = "submitted";
public String getSymbol() {
return symbol;
}
public void setSymbol(String symbol) {
this.symbol = symbol;
}
public String getSymbol_to() {
return symbol_to;
}
public void setSymbol_to(String symbol_to) {
this.symbol_to = symbol_to;
}
public Double getAmount() {
return amount;
}
public void setAmount(Double amount) {
this.amount = amount;
}
public Double getAmount_to() {
return amount_to;
}
public void setAmount_to(Double amount_to) {
this.amount_to = amount_to;
}
public String getCreate_time() {
return create_time;
}
public void setCreate_time(String create_time) {
this.create_time = create_time;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}

View File

@@ -0,0 +1,24 @@
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="project.exchange.WalletExtendCostUSDT" table="T_WALLET_EXTEND_COSTUSDT">
<id name="id" type="java.lang.String" >
<column name="UUID" />
<generator class="uuid.hex" />
</id>
<property name="partyId" type="java.lang.String" update="false">
<column name="PARTY_ID" />
</property>
<property name="wallettype" type="java.lang.String" update="false">
<column name="WALLETTYPE" />
</property>
<property name="volume" type="java.lang.Double">
<column name="VOLUME" />
</property>
<property name="price" type="java.lang.Double">
<column name="PRICE" />
</property>
</class>
</hibernate-mapping>

View File

@@ -0,0 +1,71 @@
package project.exchange;
import java.io.Serializable;
import kernel.bo.EntityObject;
public class WalletExtendCostUSDT extends EntityObject{
private static final long serialVersionUID = 3644783740625158698L;
private Serializable partyId;
/**
* 币种见Constants定义
*/
private String wallettype;
/**
* 数量
*/
private double volume;
/**
* 价格
*/
private double price;
public Serializable getPartyId() {
return partyId;
}
public void setPartyId(Serializable partyId) {
this.partyId = partyId;
}
public String getWallettype() {
return wallettype;
}
public void setWallettype(String wallettype) {
this.wallettype = wallettype;
}
public double getVolume() {
return volume;
}
public void setVolume(double volume) {
this.volume = volume;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}

View File

@@ -0,0 +1,11 @@
package project.exchange;
import java.io.Serializable;
public interface WalletExtendCostUSDTService {
public WalletExtendCostUSDT saveExtendByPara(Serializable partyId, String wallettype);
public void save(WalletExtendCostUSDT entity);
public void update(WalletExtendCostUSDT entity);
}

View File

@@ -0,0 +1,82 @@
package project.exchange.internal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import kernel.util.StringUtils;
import kernel.web.Page;
import kernel.web.PagedQueryDao;
import project.exchange.AdminExchangeApplyOrderService;
import project.exchange.ExchangeApplyOrder;
import project.party.recom.UserRecomService;
public class AdminExchangeApplyOrderServiceImpl extends HibernateDaoSupport implements AdminExchangeApplyOrderService {
private PagedQueryDao pagedQueryDao;
private UserRecomService userRecomService;
public Page pagedQuery(int pageNo, int pageSize, String state, String rolename, String loginPartyId,
String username, String orderNo) {
StringBuffer queryString = new StringBuffer(
"SELECT orders.UUID id,party.USERCODE usercode,party.ROLENAME rolename,orders.SYMBOL symbol,orders.ORDER_NO order_no,orders.OFFSET offset,"
+ "orders.VOLUME volume,orders.CREATE_TIME createTime,orders.CLOSE_TIME closeTime,"
+ "orders.STATE state,orders.ORDER_PRICE_TYPE order_price_type,orders.CLOSE_PRICE close_price,"
+ "orders.PRICE price,item.NAME itemname,orders.IS_TRIGGER_ORDER is_trigger_order,orders.TRIGGER_PRICE trigger_price,");
queryString.append(" party.USERNAME username, party_parent.USERNAME username_parent ");
queryString.append(
" FROM T_EXCHANGE_APPLY_ORDER orders LEFT JOIN PAT_PARTY party ON orders.PARTY_ID = party.UUID LEFT JOIN (SELECT DISTINCT(SYMBOL),NAME FROM T_ITEM) AS item ON orders.SYMBOL=item.SYMBOL ");
queryString.append("LEFT JOIN PAT_USER_RECOM user ON user.PARTY_ID = party.UUID ");
queryString.append("LEFT JOIN PAT_PARTY party_parent ON user.RECO_ID = party_parent.UUID ");
queryString.append(" WHERE 1 = 1 ");
Map parameters = new HashMap();
if (!StringUtils.isNullOrEmpty(loginPartyId)) {
List children = this.userRecomService.findChildren(loginPartyId);
if (children.size() == 0) {
return Page.EMPTY_PAGE;
}
queryString.append(" and orders.PARTY_ID in (:children) ");
parameters.put("children", children);
}
if (!StringUtils.isNullOrEmpty(state)) {
queryString.append(" and orders.STATE = :state ");
parameters.put("state", state);
}
if (!StringUtils.isNullOrEmpty(rolename)) {
queryString.append(" and party.ROLENAME = :rolename ");
parameters.put("rolename", rolename);
}
if (!StringUtils.isNullOrEmpty(orderNo)) {
queryString.append(" and orders.ORDER_NO = :orderNo ");
parameters.put("orderNo", orderNo);
}
if (!StringUtils.isNullOrEmpty(username)) {
queryString.append("AND (party.USERNAME like:username OR party.USERCODE like:username ) ");
parameters.put("username", "%" + username + "%");
}
queryString.append(" order by orders.CREATE_TIME desc ");
Page page = this.pagedQueryDao.pagedQuerySQL(pageNo, pageSize, queryString.toString(), parameters);
return page;
}
public ExchangeApplyOrder get(String id) {
return getHibernateTemplate().get(ExchangeApplyOrder.class, id);
}
public void setPagedQueryDao(PagedQueryDao pagedQueryDao) {
this.pagedQueryDao = pagedQueryDao;
}
public void setUserRecomService(UserRecomService userRecomService) {
this.userRecomService = userRecomService;
}
}

View File

@@ -0,0 +1,656 @@
package project.exchange.internal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import kernel.exception.BusinessException;
import kernel.util.Arith;
import kernel.util.DateUtils;
import kernel.util.StringUtils;
import kernel.web.Page;
import kernel.web.PagedQueryDao;
import project.Constants;
import project.data.DataService;
import project.data.model.Realtime;
import project.exchange.ExchangeApplyOrder;
import project.exchange.ExchangeApplyOrderService;
import project.exchange.ExchangeRecord;
import project.item.ItemService;
import project.item.model.Item;
import project.log.MoneyLog;
import project.log.MoneyLogService;
import project.party.PartyService;
import project.syspara.SysparaService;
import project.user.UserDataService;
import project.wallet.Wallet;
import project.wallet.WalletExtend;
import project.wallet.WalletService;
import util.DateUtil;
import util.RandomUtil;
public class ExchangeApplyOrderServiceImpl extends HibernateDaoSupport implements ExchangeApplyOrderService {
private SysparaService sysparaService;
private PartyService partyService;
private ItemService itemService;
private MoneyLogService moneyLogService;
private UserDataService userDataService;
private DataService dataService;
private WalletService walletService;
private PagedQueryDao pagedQueryDao;
@Override
public void saveCreate(ExchangeApplyOrder order) {
boolean order_open = this.sysparaService.find("exchange_order_open").getBoolean();
if (!order_open) {
throw new BusinessException("不在交易时段");
}
Item item = this.itemService.cacheBySymbol(order.getSymbol(), true);
if (item == null) {
throw new BusinessException("参数错误");
}
List<Realtime> realtimes = this.dataService.realtime(order.getSymbol());
double close = 1;
if (realtimes != null && realtimes.size() > 0) {
close = realtimes.get(0).getClose();
}
order.setClose_price(close);
if (ExchangeApplyOrder.OFFSET_OPEN.equals(order.getOffset())) {
this.open(order);
} else if (ExchangeApplyOrder.OFFSET_CLOSE.equals(order.getOffset())) {
this.close(order);
}
}
/**
* 开仓委托
*/
public void open(ExchangeApplyOrder order) {
order.setOrder_no(DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8));
order.setFee(Arith.mul(order.getVolume(), sysparaService.find("exchange_apply_order_buy_fee").getDouble()));
order.setCreate_time(new Date());
// 买入数量 - 手续费 = 到账
double sub = Arith.sub(order.getVolume(), order.getFee());
// 可以买的数量
double amount = Arith.div(sub, order.getClose_price(), 8);
order.setSymbol_value(amount);
Wallet wallet = this.walletService.saveWalletByPartyId(order.getPartyId());
double amount_before = wallet.getMoney();
// 如果是计划委托,则先不扣钱
if (order.isIs_trigger_order()) {
/*
* 保存资金日志
*/
MoneyLog moneylog_deposit = new MoneyLog();
moneylog_deposit.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog_deposit.setAmount_before(amount_before);
moneylog_deposit.setAmount(0);
moneylog_deposit.setAmount_after(amount_before);
moneylog_deposit.setLog("币币交易计划委托订单,订单号[" + order.getOrder_no() + "]");
moneylog_deposit.setPartyId(order.getPartyId());
moneylog_deposit.setWallettype(Constants.WALLET);
moneylog_deposit.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_OPEN);
moneyLogService.save(moneylog_deposit);
getHibernateTemplate().save(order);
}
if (!order.isIs_trigger_order()) {
if (wallet.getMoney() < order.getVolume()) {
throw new BusinessException("余额不足");
}
this.walletService.update(wallet.getPartyId().toString(), Arith.sub(0, order.getVolume()));
/*
* 保存资金日志
*/
MoneyLog moneylog_deposit = new MoneyLog();
moneylog_deposit.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog_deposit.setAmount_before(amount_before);
moneylog_deposit.setAmount(Arith.sub(0, order.getVolume()));
moneylog_deposit.setAmount_after(Arith.sub(amount_before, order.getVolume()));
moneylog_deposit.setLog("币币交易,订单号[" + order.getOrder_no() + "]");
moneylog_deposit.setPartyId(order.getPartyId());
moneylog_deposit.setWallettype(Constants.WALLET);
moneylog_deposit.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_OPEN);
moneyLogService.save(moneylog_deposit);
getHibernateTemplate().save(order);
this.userDataService.saveBuy(order);
}
}
/**
* 卖币
*/
public void close(ExchangeApplyOrder order) {
order.setOrder_no(DateUtil.getToday("yyMMddHHmmss") + RandomUtil.getRandomNum(8));
order.setCreate_time(new Date());
order.setFee(Arith.mul(order.getVolume(), sysparaService.find("exchange_apply_order_sell_fee").getDouble()));
double sub = Arith.sub(order.getVolume(), order.getFee());
double amount = Arith.mul(sub, order.getClose_price());
order.setSymbol_value(amount);
// .close
WalletExtend walletExtend = walletService.saveExtendByPara(order.getPartyId(), order.getSymbol());
double amount_before = walletExtend.getAmount();
// 如果是计划委托,则先不扣钱
if (order.isIs_trigger_order()) {
/*
* 保存资金日志
*/
MoneyLog moneylog = new MoneyLog();
moneylog.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog.setAmount_before(amount_before);
moneylog.setAmount(0);
moneylog.setAmount_after(amount_before);
moneylog.setLog("币币交易计划委托订单,订单号[" + order.getOrder_no() + "]");
moneylog.setPartyId(order.getPartyId());
moneylog.setWallettype(order.getSymbol());
moneylog.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_CLOSE);
moneyLogService.save(moneylog);
getHibernateTemplate().save(order);
}
if (!order.isIs_trigger_order()) {
if (order.getVolume() > walletExtend.getAmount()) {
throw new BusinessException("持有币种不足");
}
walletService.updateExtend(walletExtend.getPartyId().toString(), walletExtend.getWallettype(),
Arith.sub(0, order.getVolume()));
/*
* 保存资金日志
*/
MoneyLog moneylog = new MoneyLog();
moneylog.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog.setAmount_before(amount_before);
moneylog.setAmount(Arith.sub(0, order.getVolume()));
moneylog.setAmount_after(Arith.sub(amount_before, order.getVolume()));
moneylog.setLog("币币交易,订单号[" + order.getOrder_no() + "]");
moneylog.setPartyId(order.getPartyId());
moneylog.setWallettype(order.getSymbol());
moneylog.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_CLOSE);
moneyLogService.save(moneylog);
getHibernateTemplate().save(order);
this.userDataService.saveSell(order);
}
}
public void saveOpen(ExchangeApplyOrder order, Realtime realtime) {
double sub = Arith.sub(order.getVolume(), order.getFee());// 买入数量-手续费=到账
double amount = Arith.div(sub, realtime.getClose(), 8);// 可以买的数量
// order.setCreate_time(new Date());
order.setClose_time(new Date());
order.setClose_price(realtime.getClose());
WalletExtend walletExtend = walletService.saveExtendByPara(order.getPartyId(), order.getSymbol());
double amount_before = walletExtend.getAmount();
// walletExtend.setAmount(Arith.add(walletExtend.getAmount(), amount));
// this.walletService.update(walletExtend);
this.walletService.updateExtend(walletExtend.getPartyId().toString(), walletExtend.getWallettype(), amount);
/*
* 保存资金日志
*/
MoneyLog moneylog_deposit = new MoneyLog();
moneylog_deposit.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog_deposit.setAmount_before(amount_before);
moneylog_deposit.setAmount(amount);
moneylog_deposit.setAmount_after(Arith.add(amount_before, amount));
moneylog_deposit.setLog("委托单,订单号[" + order.getOrder_no() + "]");
moneylog_deposit.setPartyId(order.getPartyId());
moneylog_deposit.setWallettype(order.getSymbol());
moneylog_deposit.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_OPEN);
moneyLogService.save(moneylog_deposit);
order.setState(ExchangeApplyOrder.STATE_CREATED);
order.setAmount(order.getVolume());
order.setWallet_fee(order.getFee());
update(order);
}
public void saveClose(ExchangeApplyOrder order, Realtime realtime) {
double sub = Arith.sub(order.getVolume(), order.getFee());
double amount = Arith.mul(sub, realtime.getClose());
order.setClose_time(new Date());
order.setClose_price(realtime.getClose());
Wallet wallet = this.walletService.saveWalletByPartyId(order.getPartyId());
double amount_before = wallet.getMoney();
// wallet.setMoney(Arith.add(wallet.getMoney(), amount));
this.walletService.update(wallet.getPartyId().toString(), amount);
/*
* 保存资金日志
*/
MoneyLog moneylog_deposit = new MoneyLog();
moneylog_deposit.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog_deposit.setAmount_before(amount_before);
moneylog_deposit.setAmount(amount);
moneylog_deposit.setAmount_after(Arith.add(amount_before, amount));
moneylog_deposit.setLog("委托单,订单号[" + order.getOrder_no() + "]");
moneylog_deposit.setPartyId(order.getPartyId());
moneylog_deposit.setWallettype(Constants.WALLET);
moneylog_deposit.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_CLOSE);
moneyLogService.save(moneylog_deposit);
order.setAmount(amount);
order.setWallet_fee(Arith.mul(order.getFee(), realtime.getClose()));
order.setState(ExchangeApplyOrder.STATE_CREATED);
update(order);
}
@Override
public void saveCancel(String partyId, String order_no) {
ExchangeApplyOrder order = this.findByOrderNo(order_no);
if (order == null || !"submitted".equals(order.getState()) || !partyId.equals(order.getPartyId().toString())) {
return;
}
// 如果是计划委托则不返回余额
if (order.isIs_trigger_order()) {
if (ExchangeApplyOrder.OFFSET_OPEN.equals(order.getOffset())) {
Wallet wallet = this.walletService.saveWalletByPartyId(order.getPartyId());
double amount_before = wallet.getMoney();
MoneyLog moneylog = new MoneyLog();
moneylog.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog.setAmount_before(amount_before);
moneylog.setAmount(0);
moneylog.setAmount_after(amount_before);
moneylog.setLog("币币交易计划委托单撤单,订单号[" + order.getOrder_no() + "]");
moneylog.setPartyId(order.getPartyId());
moneylog.setWallettype(Constants.WALLET);
moneylog.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_CANCEL);
moneyLogService.save(moneylog);
} else if (ExchangeApplyOrder.OFFSET_CLOSE.equals(order.getOffset())) {
WalletExtend walletExtend = walletService.saveExtendByPara(order.getPartyId(), order.getSymbol());
double amount_before = walletExtend.getAmount();
/*
* 保存资金日志
*/
MoneyLog moneylog = new MoneyLog();
moneylog.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog.setAmount_before(amount_before);
moneylog.setAmount(0);
moneylog.setAmount_after(amount_before);
moneylog.setLog("币币交易计划委托单撤单,订单号[" + order.getOrder_no() + "]");
moneylog.setPartyId(order.getPartyId());
moneylog.setWallettype(order.getSymbol());
moneylog.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_CANCEL);
moneyLogService.save(moneylog);
}
order.setState(ExchangeApplyOrder.STATE_CANCELED);
}
if (!order.isIs_trigger_order()) {
if (ExchangeApplyOrder.OFFSET_OPEN.equals(order.getOffset())) {
Wallet wallet = this.walletService.saveWalletByPartyId(order.getPartyId());
double amount_before = wallet.getMoney();
// wallet.setMoney(Arith.add(wallet.getMoney(), order.getVolume()));
// walletService.update(wallet);
walletService.update(wallet.getPartyId().toString(), order.getVolume());
MoneyLog moneylog = new MoneyLog();
moneylog.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog.setAmount_before(amount_before);
moneylog.setAmount(order.getVolume());
moneylog.setAmount_after(Arith.add(amount_before, order.getVolume()));
moneylog.setLog("币币交易撤单,订单号[" + order.getOrder_no() + "]");
moneylog.setPartyId(order.getPartyId());
moneylog.setWallettype(Constants.WALLET);
moneylog.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_CANCEL);
moneyLogService.save(moneylog);
} else if (ExchangeApplyOrder.OFFSET_CLOSE.equals(order.getOffset())) {
WalletExtend walletExtend = walletService.saveExtendByPara(order.getPartyId(), order.getSymbol());
double amount_before = walletExtend.getAmount();
// walletExtend.setAmount(Arith.add(walletExtend.getAmount(), order.getVolume()));
// walletService.update(walletExtend);
walletService.updateExtend(walletExtend.getPartyId().toString(), walletExtend.getWallettype(),
order.getVolume());
/*
* 保存资金日志
*/
MoneyLog moneylog = new MoneyLog();
moneylog.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog.setAmount_before(amount_before);
moneylog.setAmount(order.getVolume());
moneylog.setAmount_after(Arith.add(amount_before, order.getVolume()));
moneylog.setLog("币币交易撤单,订单号[" + order.getOrder_no() + "]");
moneylog.setPartyId(order.getPartyId());
moneylog.setWallettype(order.getSymbol());
moneylog.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_CANCEL);
moneyLogService.save(moneylog);
}
order.setState(ExchangeApplyOrder.STATE_CANCELED);
}
update(order);
}
public void update(ExchangeApplyOrder order) {
this.getHibernateTemplate().update(order);
}
public ExchangeApplyOrder findByOrderNo(String order_no) {
StringBuffer queryString = new StringBuffer(" FROM ExchangeApplyOrder where order_no=?0");
List<ExchangeApplyOrder> list = (List<ExchangeApplyOrder>) getHibernateTemplate().find(queryString.toString(), new Object[] { order_no });
if (list.size() > 0) {
return list.get(0);
}
return null;
}
public ExchangeApplyOrder findByOrderNoAndPartyId(String order_no, String partyId) {
StringBuffer queryString = new StringBuffer(" FROM ExchangeApplyOrder where order_no=?0 AND partyId=?1");
List<ExchangeApplyOrder> list = (List<ExchangeApplyOrder>) getHibernateTemplate().find(queryString.toString(),
new Object[] { order_no, partyId });
if (list.size() > 0) {
return list.get(0);
}
return null;
}
@Override
public List<Map<String, Object>> getPaged(int pageNo, int pageSize, String partyId, String symbol, String type, String isAll) {
StringBuffer queryString = new StringBuffer("");
queryString.append(" FROM ");
queryString.append(" ExchangeApplyOrder ");
queryString.append(" where 1=1 ");
Map<String, Object> parameters = new HashMap();
queryString.append(" and partyId =:partyId");
parameters.put("partyId", partyId);
if (!StringUtils.isNullOrEmpty(symbol)) {
queryString.append(" and symbol =:symbol ");
parameters.put("symbol", symbol );
}
if (null != isAll) {
List<String> items = itemService.cacheGetAllSymbol();
queryString.append(" and symbol in(:symbol) ");
parameters.put("symbol", items);
}
if ("orders".equals(type)) {
queryString.append(" and order_price_type != 'opponent' ");
queryString.append(" AND state =:state ");
parameters.put("state", ExchangeApplyOrder.STATE_SUBMITTED);
} else if ("hisorders".equals(type)) {
queryString.append(" and order_price_type != 'opponent' ");
queryString.append(" and state in(:state) ");
parameters.put("state",
new String[] { ExchangeApplyOrder.STATE_CREATED, ExchangeApplyOrder.STATE_CANCELED });
}else if ("opponent".equals(type)) {
queryString.append(" and order_price_type = 'opponent' ");
queryString.append(" and state =:state ");
parameters.put("state", ExchangeApplyOrder.STATE_CREATED );
}
queryString.append(" order by create_time desc ");
Page page = this.pagedQueryDao.pagedQueryHql(pageNo, pageSize, queryString.toString(), parameters);
List<Map<String, Object>> data;
if (!StringUtils.isNullOrEmpty(symbol) || null != isAll) {
data = this.entrustBulidData(page.getElements());
}else {
data = this.bulidData(page.getElements());
}
return data;
}
private List<Map<String, Object>> entrustBulidData(List<ExchangeApplyOrder> list) {
List<Map<String, Object>> data = new ArrayList();
for (int i = 0; i < list.size(); i++) {
ExchangeApplyOrder order = list.get(i);
Map<String, Object> map = new HashMap<String, Object>();
map.put("order_no", order.getOrder_no());
map.put("name", itemService.cacheBySymbol(order.getSymbol(), false).getName());
map.put("symbol", order.getSymbol());
map.put("create_time", DateUtils.format(order.getCreate_time(), DateUtils.DF_yyyyMMddHHmmss));
map.put("volume", order.getVolume());
map.put("offset", order.getOffset());
map.put("price", order.getPrice());
map.put("order_price_type", order.getOrder_price_type());
map.put("state", order.getState());
map.put("fee", order.getFee());
// map.put("amount", Arith.mul(order.getVolume(), order.getUnit_amount()));
map.put("trigger_price", order.getTrigger_price());
map.put("is_trigger_order", order.isIs_trigger_order());
data.add(map);
}
return data;
}
private List<Map<String, Object>> bulidData(List<ExchangeApplyOrder> list) {
Map<String, ExchangeRecord> recordMap = new HashMap<>();
List<Map<String, Object>> data = new ArrayList();
for (int i = 0; i < list.size(); i++) {
ExchangeApplyOrder order = list.get(i);
ExchangeRecord record = new ExchangeRecord();
if (recordMap.containsKey(order.getRelation_order_no())) {
record = recordMap.get(order.getRelation_order_no());
}
record.setState(order.getState());
record.setCreate_time(DateUtils.format(order.getCreate_time(), DateUtils.DF_yyyyMMddHHmmss));
// 开仓 买入**币
if (ExchangeApplyOrder.OFFSET_CLOSE.equals(order.getOffset())) {
if (recordMap.containsKey(order.getRelation_order_no())) {
record.setSymbol(order.getSymbol());
record.setAmount(order.getVolume());
}else {
record.setSymbol(order.getSymbol());
record.setAmount(order.getVolume());
// 针对 **币 --兑换-- usdt
record.setAmount_to(order.getSymbol_value());
}
}
// 平仓 卖出**币
else if (ExchangeApplyOrder.OFFSET_OPEN.equals(order.getOffset())) {
// new BigDecimal(String.valueOf(value)).toPlainString()
if (recordMap.containsKey(order.getRelation_order_no())) {
record.setSymbol_to(order.getSymbol());
record.setAmount_to(order.getSymbol_value());
}else {
record.setSymbol_to(order.getSymbol());
record.setAmount(order.getVolume());
record.setAmount_to(order.getSymbol_value());
}
}
recordMap.put(order.getRelation_order_no(), record);
}
for (ExchangeRecord entry : recordMap.values()) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("symbol", entry.getSymbol());
map.put("symbol_to", entry.getSymbol_to());
map.put("amount", entry.getAmount());
map.put("amount_to", entry.getAmount_to());
map.put("create_time", entry.getCreate_time());
map.put("state", entry.getState());
data.add(map);
}
if (data.size() > 0) {
Collections.sort(data, new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
String time1 = String.valueOf(o1.get("create_time"));
String time2 = String.valueOf(o2.get("create_time"));
return time2.compareTo(time1);
}
});
return data;
}
return data;
}
@Override
public List<ExchangeApplyOrder> findSubmitted() {
StringBuffer queryString = new StringBuffer(" FROM ExchangeApplyOrder where state=?0");
return (List<ExchangeApplyOrder>) getHibernateTemplate().find(queryString.toString(), new Object[] { "submitted" });
}
/**
* 批量取消委托单
*
* @param partyId
*/
public void saveCannelAllByPartyId(String partyId) {
StringBuffer queryString = new StringBuffer(" FROM ExchangeApplyOrder where state=? and partyId=?");
List<ExchangeApplyOrder> list = (List<ExchangeApplyOrder>) getHibernateTemplate().find(queryString.toString(),
new Object[] { "submitted", partyId });
for (ExchangeApplyOrder order : list) {
saveCancel(order);
}
}
public void saveCancel(ExchangeApplyOrder order) {
if (order == null || !"submitted".equals(order.getState())) {
return;
}
if (ExchangeApplyOrder.OFFSET_OPEN.equals(order.getOffset())) {
Wallet wallet = this.walletService.saveWalletByPartyId(order.getPartyId());
double amount_before = wallet.getMoney();
// wallet.setMoney(Arith.add(wallet.getMoney(), order.getVolume()));
// walletService.update(wallet);
walletService.update(wallet.getPartyId().toString(), order.getVolume());
MoneyLog moneylog = new MoneyLog();
moneylog.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog.setAmount_before(amount_before);
moneylog.setAmount(order.getVolume());
moneylog.setAmount_after(Arith.add(amount_before, order.getVolume()));
moneylog.setLog("币币交易撤单,订单号[" + order.getOrder_no() + "]");
moneylog.setPartyId(order.getPartyId());
moneylog.setWallettype(Constants.WALLET);
moneylog.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_CANCEL);
moneyLogService.save(moneylog);
} else if (ExchangeApplyOrder.OFFSET_CLOSE.equals(order.getOffset())) {
WalletExtend walletExtend = walletService.saveExtendByPara(order.getPartyId(), order.getSymbol());
double amount_before = walletExtend.getAmount();
// walletExtend.setAmount(Arith.add(walletExtend.getAmount(), order.getVolume()));
// walletService.update(walletExtend);
walletService.updateExtend(walletExtend.getPartyId().toString(), walletExtend.getWallettype(),
order.getVolume());
/*
* 保存资金日志
*/
MoneyLog moneylog = new MoneyLog();
moneylog.setCategory(Constants.MONEYLOG_CATEGORY_EXCHANGE);
moneylog.setAmount_before(amount_before);
moneylog.setAmount(order.getVolume());
moneylog.setAmount_after(Arith.add(amount_before, order.getVolume()));
moneylog.setLog("币币交易撤单,订单号[" + order.getOrder_no() + "]");
moneylog.setPartyId(order.getPartyId());
moneylog.setWallettype(order.getSymbol());
moneylog.setContent_type(Constants.MONEYLOG_CONTENT_EXCHANGE_CANCEL);
moneyLogService.save(moneylog);
}
order.setState(ExchangeApplyOrder.STATE_CANCELED);
update(order);
}
public void setSysparaService(SysparaService sysparaService) {
this.sysparaService = sysparaService;
}
public void setPartyService(PartyService partyService) {
this.partyService = partyService;
}
public void setItemService(ItemService itemService) {
this.itemService = itemService;
}
public void setMoneyLogService(MoneyLogService moneyLogService) {
this.moneyLogService = moneyLogService;
}
public void setWalletService(WalletService walletService) {
this.walletService = walletService;
}
public void setPagedQueryDao(PagedQueryDao pagedQueryDao) {
this.pagedQueryDao = pagedQueryDao;
}
public void setUserDataService(UserDataService userDataService) {
this.userDataService = userDataService;
}
public void setDataService(DataService dataService) {
this.dataService = dataService;
}
}

View File

@@ -0,0 +1,39 @@
package project.exchange.internal;
import java.io.Serializable;
import java.util.List;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import project.exchange.WalletExtendCostUSDT;
import project.exchange.WalletExtendCostUSDTService;
public class WalletExtendCostUSDTServiceImpl extends HibernateDaoSupport implements WalletExtendCostUSDTService{
@Override
public WalletExtendCostUSDT saveExtendByPara(Serializable partyId, String wallettype) {
List list = getHibernateTemplate().find(" FROM WalletExtendCostUSDT WHERE partyId = ? and wallettype=?",
new Object[] { partyId, wallettype });
if (list.size() > 0) {
return (WalletExtendCostUSDT) list.get(0);
}
WalletExtendCostUSDT entity = new WalletExtendCostUSDT();
entity.setPartyId(partyId);
entity.setWallettype(wallettype);
save(entity);
return entity;
}
@Override
public void save(WalletExtendCostUSDT entity) {
getHibernateTemplate().save(entity);
}
@Override
public void update(WalletExtendCostUSDT entity) {
getHibernateTemplate().update(entity);
}
}

View File

@@ -0,0 +1,199 @@
package project.exchange.job;
import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import kernel.util.ThreadUtils;
import project.data.DataService;
import project.data.model.Realtime;
import project.exchange.ExchangeApplyOrder;
import project.exchange.ExchangeApplyOrderService;
import project.exchange.ExchangeLock;
/**
*
* 委托单进入市场
*/
public class ExchangeApplyOrderHandleJob implements Runnable {
private static Log logger = LogFactory.getLog(ExchangeApplyOrderHandleJob.class);
private ExchangeApplyOrderService exchangeApplyOrderService;
private DataService dataService;
public void run() {
/*
* 系统启动先暂停30秒
*/
ThreadUtils.sleep(1000 * 30);
while (true)
try {
List<ExchangeApplyOrder> list = this.exchangeApplyOrderService.findSubmitted();
for (int i = 0; i < list.size(); i++) {
ExchangeApplyOrder order = list.get(i);
List<Realtime> realtime_list = this.dataService.realtime(order.getSymbol());
Realtime realtime = null;
if (realtime_list.size() > 0) {
realtime = realtime_list.get(0);
} else {
continue;
}
//如果不是计划委托则按原代码执行
if(!order.isIs_trigger_order()) {
if ("limit".equals(order.getOrder_price_type())) {
/**
* 限价单
*/
if (ExchangeApplyOrder.OFFSET_OPEN.equals(order.getOffset())) {// 买入时 限制 低价买入
if (realtime.getClose() <= order.getPrice()) {
this.handle(order, realtime);
}
} else {// 卖出时 限制 高价卖出
if (realtime.getClose() >= order.getPrice()) {
this.handle(order, realtime);
}
}
} else {
/**
* 非限制,直接进入市 场
*/
this.handle(order, realtime);
}
}
//如果是计划委托单则
if(order.isIs_trigger_order()) {
//需要满足触发价条件
if (ExchangeApplyOrder.OFFSET_OPEN.equals(order.getOffset())) {// 买入时 限制 低价买入
if (realtime.getClose() <= order.getTrigger_price()) {
this.handleTrigger(order, realtime);
}
} else {// 卖出时 限制 高价卖出
if (realtime.getClose() >= order.getTrigger_price()) {
this.handleTrigger(order, realtime);
}
}
}
}
} catch (Exception e) {
logger.error("run fail", e);
} finally {
ThreadUtils.sleep(1000 * 1);
}
}
public void handle(ExchangeApplyOrder applyOrder, Realtime realtime) {
boolean lock = false;
try {
if (!ExchangeLock.add(applyOrder.getOrder_no())) {
return;
}
lock = true;
if ("open".equals(applyOrder.getOffset())) {
this.exchangeApplyOrderService.saveOpen(applyOrder, realtime);
} else if ("close".equals(applyOrder.getOffset())) {
/**
* 平仓
*/
this.exchangeApplyOrderService.saveClose(applyOrder, realtime);
}
} catch (Exception e) {
logger.error("error:", e);
} finally {
if (lock) {
ThreadUtils.sleep(100);
ExchangeLock.remove(applyOrder.getOrder_no());
}
}
}
public void handleTrigger(ExchangeApplyOrder applyOrder, Realtime realtime) {
boolean lock = false;
try {
if (!ExchangeLock.add(applyOrder.getOrder_no())) {
return;
}
lock = true;
if ("open".equals(applyOrder.getOffset())) {
ExchangeApplyOrder order = new ExchangeApplyOrder();
order.setPartyId(applyOrder.getPartyId());
order.setSymbol(applyOrder.getSymbol());
order.setOffset(applyOrder.getOffset());
order.setVolume(applyOrder.getVolume());
order.setPrice(applyOrder.getPrice());
order.setIs_trigger_order(false);
order.setTrigger_price(applyOrder.getTrigger_price());
order.setOrder_price_type(applyOrder.getOrder_price_type());
this.exchangeApplyOrderService.saveCreate(order);
applyOrder.setClose_time(new Date());
applyOrder.setState(ExchangeApplyOrder.STATE_CREATED);
this.exchangeApplyOrderService.update(applyOrder);
} else if ("close".equals(applyOrder.getOffset())) {
ExchangeApplyOrder order = new ExchangeApplyOrder();
order.setPartyId(applyOrder.getPartyId());
order.setSymbol(applyOrder.getSymbol());
order.setOffset(ExchangeApplyOrder.OFFSET_CLOSE);
order.setVolume(applyOrder.getVolume());
order.setPrice(applyOrder.getPrice());
order.setIs_trigger_order(false);
order.setTrigger_price(applyOrder.getTrigger_price());
order.setOrder_price_type(applyOrder.getOrder_price_type());
this.exchangeApplyOrderService.saveCreate(order);
/**
* 平仓
*/
applyOrder.setClose_time(new Date());
applyOrder.setState(ExchangeApplyOrder.STATE_CREATED);
this.exchangeApplyOrderService.update(applyOrder);
}
} catch (Exception e) {
logger.error("error:", e);
} finally {
if (lock) {
ThreadUtils.sleep(100);
ExchangeLock.remove(applyOrder.getOrder_no());
}
}
}
public void start(){
new Thread(this, "ExchangeApplyOrderHandleJob").start();
if (logger.isInfoEnabled())
logger.info("币币委托单处理线程启动!");
}
public void setDataService(DataService dataService) {
this.dataService = dataService;
}
public void setExchangeApplyOrderService(ExchangeApplyOrderService exchangeApplyOrderService) {
this.exchangeApplyOrderService = exchangeApplyOrderService;
}
}

View File

@@ -0,0 +1,8 @@
package project.exchange.job;
import project.data.model.Realtime;
import project.exchange.ExchangeApplyOrder;
public interface ExchangeApplyOrderHandleJobService {
public void handle(ExchangeApplyOrder applyOrder, Realtime realtime);
}

View File

@@ -0,0 +1,17 @@
package project.exchange.job;
import project.data.model.Realtime;
import project.exchange.ExchangeApplyOrder;
public class ExchangeApplyOrderHandleJobServiceImpl implements ExchangeApplyOrderHandleJobService{
private ExchangeApplyOrderHandleJob exchangeApplyOrderHandleJob;
public void handle(ExchangeApplyOrder applyOrder, Realtime realtime) {
exchangeApplyOrderHandleJob.handle(applyOrder, realtime);
}
public void setExchangeApplyOrderHandleJob(ExchangeApplyOrderHandleJob exchangeApplyOrderHandleJob) {
this.exchangeApplyOrderHandleJob = exchangeApplyOrderHandleJob;
}
}

View File

@@ -0,0 +1,192 @@
package project.web.admin;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.providers.encoding.PasswordEncoder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import kernel.exception.BusinessException;
import kernel.util.StringUtils;
import kernel.web.PageActionSupport;
import project.Constants;
import project.data.model.Realtime;
import project.exchange.AdminExchangeApplyOrderService;
import project.exchange.ExchangeApplyOrder;
import project.exchange.ExchangeApplyOrderService;
import project.exchange.job.ExchangeApplyOrderHandleJobService;
import project.log.LogService;
import project.party.PartyService;
import project.party.model.Party;
import security.SecUser;
import security.internal.SecUserService;
/**
* 管理后台
* 币币交易订单
*
*/
@RestController
public class AdminExchangeApplyOrderController extends PageActionSupport {
private static final Log logger = LogFactory.getLog(AdminExchangeApplyOrderController.class);
@Autowired
protected AdminExchangeApplyOrderService adminExchangeApplyOrderService;
@Autowired
protected ExchangeApplyOrderService exchangeApplyOrderService;
@Autowired
private ExchangeApplyOrderHandleJobService exchangeApplyOrderHandleJobService;
@Autowired
private PartyService partyService;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private LogService logService;
@Autowired
private SecUserService secUserService;
private Map<String, Object> session = new HashMap<String, Object>();
private final String action = "normal/adminExchangeApplyOrderAction!";
/**
* 币币交易订单 列表查询
*/
@RequestMapping(action + "list.action")
public ModelAndView list(HttpServletRequest request) {
String message = request.getParameter("message");
String error = request.getParameter("error");
String session_token = UUID.randomUUID().toString();
this.session.put("session_token", session_token);
this.checkAndSetPageNo(request.getParameter("pageNo"));
this.pageSize = 30;
String loginPartyId = getLoginPartyId();
String status_para = request.getParameter("status_para");
String rolename_para = request.getParameter("rolename_para");
String name_para = request.getParameter("name_para");
String order_no_para = request.getParameter("order_no_para");
this.page = this.adminExchangeApplyOrderService.pagedQuery(this.pageNo, this.pageSize, status_para,
rolename_para, loginPartyId, name_para, order_no_para);
ModelAndView model = new ModelAndView();
model.addObject("pageNo", this.pageNo);
model.addObject("pageSize", this.pageSize);
model.addObject("page", this.page);
model.addObject("status_para", status_para);
model.addObject("rolename_para", rolename_para);
model.addObject("name_para", name_para);
model.addObject("order_no_para", order_no_para);
model.addObject("message", message);
model.addObject("error", error);
model.setViewName("exchange_order_list");
return model;
}
/**
* 限价成交
*/
@RequestMapping(action + "success.action")
public ModelAndView success(HttpServletRequest request) {
String message = "";
String error = "";
ModelAndView model = new ModelAndView();
try {
String session_token = request.getParameter("session_token");
String safeword = request.getParameter("safeword");
String order_no = request.getParameter("order_no");
Object object = this.session.get("session_token");
this.session.remove("session_token");
if ((object == null) || (StringUtils.isNullOrEmpty(session_token))
|| (!session_token.equals((String) object))) {
model.setViewName("exchange_order_list");
}
SecUser sec = this.secUserService.findUserByLoginName(this.getUsername_login());
String sysSafeword = sec.getSafeword();
String safeword_md5 = passwordEncoder.encodePassword(safeword, getUsername_login());
if (!safeword_md5.equals(sysSafeword)) {
throw new BusinessException("资金密码错误");
}
ExchangeApplyOrder order = exchangeApplyOrderService.findByOrderNo(order_no);
if (order == null) {
throw new BusinessException("委托单不存在或请稍后再试");
}
if (ExchangeApplyOrder.STATE_CREATED.equals(order.getState()))
throw new BusinessException("委托已完成无法操作");
if (!"limit".equals(order.getOrder_price_type())) {
throw new BusinessException("委托并非限价单,无法限价成交");
}
Realtime realtime = new Realtime();
realtime.setClose(order.getPrice());
exchangeApplyOrderHandleJobService.handle(order, realtime);
Party party = partyService.cachePartyBy(order.getPartyId().toString(), true);
project.log.Log log = new project.log.Log();
log.setCategory(Constants.LOG_CATEGORY_OPERATION);
log.setExtra(order.getOrder_no());
log.setOperator(getUsername_login());
log.setUsername(party.getUsername());
log.setPartyId(order.getPartyId());
log.setLog("币币限价单,操作限价成交。订单号[" + order.getOrder_no() + "]。");
logService.saveSync(log);
message = "操作成功";
} catch (BusinessException e) {
error = e.getMessage();
} catch (Exception e) {
logger.error("error ", e);
error = "程序错误";
}
model.addObject("message", message);
model.addObject("error", error);
model.setViewName("redirect:/" + action + "list.action");
return model;
}
/**
* 平仓或撤单
*/
@RequestMapping(action + "close.action")
public ModelAndView close(HttpServletRequest request) {
String message = "";
String error = "";
try {
String order_no = request.getParameter("order_no");
ExchangeApplyOrder order = exchangeApplyOrderService.findByOrderNo(order_no);
if (ExchangeApplyOrder.STATE_CREATED.equals(order.getState())) {
throw new BusinessException("委托已完成无法撤销");
}
exchangeApplyOrderService.saveCancel(order.getPartyId().toString(), order_no);
message = "操作成功";
} catch (BusinessException e) {
error = e.getMessage();
} catch (Exception e) {
logger.error("error ", e);
error = "程序错误";
}
ModelAndView model = new ModelAndView();
model.addObject("message", message);
model.addObject("error", error);
model.setViewName("redirect:/" + action + "list.action");
return model;
}
}

View File

@@ -0,0 +1,794 @@
package project.web.api;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import kernel.exception.BusinessException;
import kernel.sessiontoken.SessionTokenService;
import kernel.util.Arith;
import kernel.util.DateUtils;
import kernel.util.StringUtils;
import kernel.util.ThreadUtils;
import kernel.web.BaseAction;
import kernel.web.ResultObject;
import project.data.DataService;
import project.data.model.Realtime;
import project.exchange.ExchangeApplyOrder;
import project.exchange.ExchangeApplyOrderService;
import project.exchange.ExchangeLock;
import project.item.ItemService;
import project.party.PartyService;
import project.party.model.Party;
import project.syspara.SysparaService;
import project.user.kyc.Kyc;
import project.user.kyc.KycService;
import project.wallet.Wallet;
import project.wallet.WalletExtend;
import project.wallet.WalletService;
/**
* 兑换
* 币币交易 低买高卖
*
*/
@RestController
@CrossOrigin
public class ExchangeApplyOrderController extends BaseAction {
private Logger logger = LogManager.getLogger(ExchangeApplyOrderController.class);
@Autowired
private ExchangeApplyOrderService exchangeApplyOrderService;
@Autowired
private SysparaService sysparaService;
@Autowired
private DataService dataService;
@Autowired
private PartyService partyService;
@Autowired
private SessionTokenService sessionTokenService;
@Autowired
private WalletService walletService;
@Autowired
private KycService kycService;
@Autowired
private ItemService itemService;
private final String action = "/api/exchangeapplyorder!";
/**
* 兑换币 如果是使用usdt兑换其他币种则直接执行正常买币open流程 如果是其他币种--》usdt 则是直接卖币流程
* 如果是其他币种到另一个币种,则需要先卖出,然后再买入
*
* 兑换接口
*/
@RequestMapping(action + "buy_and_sell.action")
public Object buy_and_sell(HttpServletRequest request) {
ResultObject resultObject = new ResultObject();
resultObject = readSecurityContextFromSession(resultObject);
if (!"0".equals(resultObject.getCode())) {
return resultObject;
}
String volume_temp = request.getParameter("volume");
if (StringUtils.isNullOrEmpty(volume_temp)
|| !StringUtils.isDouble(volume_temp) || Double.valueOf(volume_temp) <= 0) {
throw new BusinessException("请输入正确的货币数量");
}
double volume = Double.valueOf(volume_temp);
String symbol = request.getParameter("symbol");
String symbol_to = request.getParameter("symbol_to");
if (symbol.equals(symbol_to)) {
throw new BusinessException("请选择正确的币种");
}
String session_token = request.getParameter("session_token");
String partyId = this.getLoginPartyId();
boolean lock = false;
try {
if (!ExchangeLock.add(partyId)) {
logger.error("ExchangeLock{}", partyId);
System.out.println("ExchangeLock " + partyId);
throw new BusinessException(1, "请稍后再试");
}
lock = true;
Object object = this.sessionTokenService.cacheGet(session_token);
this.sessionTokenService.delete(session_token);
if ((object == null) || (!this.getLoginPartyId().equals((String) object))) {
logger.error("sessionToken{}", object);
System.out.println("sessionToken " + object);
resultObject.setCode("1");
resultObject.setMsg("请稍后再试");
return resultObject;
}
Party party = this.partyService.cachePartyBy(partyId, false);
if (!party.getEnabled()) {
resultObject.setCode("506");
resultObject.setMsg(error);
return resultObject;
}
symbol = symbol.toLowerCase();
symbol_to = symbol_to.toLowerCase();
String relation_order_no = UUID.randomUUID().toString();
// 如果是使用usdt兑换其他币种则直接执行正常买币open流程
if ("usdt".equals(symbol) || "usdt".equals(symbol_to)) {
ExchangeApplyOrder order = new ExchangeApplyOrder();
order.setPartyId(partyId);
order.setVolume(volume);
order.setOrder_price_type("opponent");
order.setRelation_order_no(relation_order_no);
if ("usdt".equals(symbol)) {
order.setSymbol(symbol_to);
order.setOffset(ExchangeApplyOrder.OFFSET_OPEN);
}
// 兑换功能 目前仅有 第三方币种 --> usdt
else if ("usdt".equals(symbol_to)) {
order.setSymbol(symbol);
order.setOffset(ExchangeApplyOrder.OFFSET_CLOSE);
}
this.exchangeApplyOrderService.saveCreate(order);
}
else {
// 非usdt则需要进行一次卖出再买入
ExchangeApplyOrder order_sell = new ExchangeApplyOrder();
order_sell.setPartyId(partyId);
order_sell.setSymbol(symbol);
order_sell.setOffset(ExchangeApplyOrder.OFFSET_CLOSE);
order_sell.setVolume(volume);
order_sell.setOrder_price_type("opponent");
order_sell.setRelation_order_no(relation_order_no);
this.exchangeApplyOrderService.saveCreate(order_sell);
List<Realtime> realtimes = this.dataService.realtime(symbol);
double close = 1;
if (realtimes != null && realtimes.size() > 0) {
close = realtimes.get(0).getClose();
}
double sub = Arith.sub(volume,
Arith.mul(volume, sysparaService.find("exchange_apply_order_sell_fee").getDouble()));
double amount = Arith.mul(sub, close);
ThreadUtils.sleep(1000);
// 再买入币种
ExchangeApplyOrder order_buy = new ExchangeApplyOrder();
order_buy.setPartyId(partyId);
order_buy.setSymbol(symbol_to);
order_buy.setOffset(ExchangeApplyOrder.OFFSET_OPEN);
order_buy.setVolume(amount);
order_buy.setRelation_order_no(relation_order_no);
order_buy.setOrder_price_type("opponent");
this.exchangeApplyOrderService.saveCreate(order_buy);
}
} catch (BusinessException e) {
resultObject.setCode("1");
resultObject.setMsg(e.getMessage());
} catch (Exception e) {
resultObject.setCode("1");
resultObject.setMsg("程序错误");
logger.error("error:", e.fillInStackTrace());
} finally {
if (lock) {
ThreadUtils.sleep(100);
ExchangeLock.remove(partyId);
}
}
return resultObject;
}
/**
* 首次进入页面传递session_token
*/
@RequestMapping(action + "view.action")
public Object view() {
ResultObject resultObject = new ResultObject();
resultObject = readSecurityContextFromSession(resultObject);
if (!"0".equals(resultObject.getCode())) {
return resultObject;
}
try {
String partyId = getLoginPartyId();
if (!StringUtils.isNullOrEmpty(partyId)) {
Map<String, Object> session = new HashMap<String, Object>();
String session_token = sessionTokenService.savePut(partyId);
session.put("session_token", session_token);
System.out.println("兑换设置session_token: " + session_token);
resultObject.setData(session);
}
} catch (BusinessException e) {
resultObject.setCode("1");
resultObject.setMsg(e.getMessage());
} catch (Throwable t) {
resultObject.setCode("1");
resultObject.setMsg("程序错误");
logger.error("error:", t);
}
return resultObject;
}
/**
* 兑换汇率
*/
@RequestMapping(action + "buy_and_sell_fee.action")
public Object buy_and_sell_fee(HttpServletRequest request) {
ResultObject resultObject = new ResultObject();
try {
// 需兑换币种
String symbol = request.getParameter("symbol");
// 兑换后的币种
String symbol_to = request.getParameter("symbol_to");
if (symbol.equals(symbol_to)) {
throw new BusinessException("请选择正确的币种");
}
// 委托数量
String volume_temp = request.getParameter("volume");
if (StringUtils.isNullOrEmpty(volume_temp)
|| !StringUtils.isDouble(volume_temp) || Double.valueOf(volume_temp) < 0) {
throw new BusinessException("请输入正确的兑换数量");
}
Map<String, Object> data = new HashMap<String, Object>();
symbol = symbol.toLowerCase();
symbol_to = symbol_to.toLowerCase();
double buy_fee = Double.valueOf(sysparaService.find("exchange_apply_order_buy_fee").getValue());
double sell_fee = Double.valueOf(sysparaService.find("exchange_apply_order_sell_fee").getValue());
double volume = Double.valueOf(volume_temp);
if ("usdt".equals(symbol) || "usdt".equals(symbol_to)) {
if ("usdt".equals(symbol)) {
// 如果是使用Usdt 则计算收益
List<Realtime> realtime_list = this.dataService.realtime(symbol_to);
Realtime realtime = null;
if (realtime_list.size() > 0) {
realtime = realtime_list.get(0);
} else {
throw new BusinessException("系统错误,请稍后重试");
}
double symbol_to_price = realtime.getClose();
// usdt除以的数量
data.put("get_rate", Arith.div(1, symbol_to_price));
// 实际兑换数量= 兑换数量-手续费数量
double fact_volume = Arith.sub(volume, Arith.mul(volume, buy_fee));
// 实际价值 = 实际兑换数量 * 被兑换品种价格
double fact_price = Arith.mul(fact_volume, 1);
// 实际获取数量 = 实际价值 / 将要兑换的品种的价值
data.put("get_volume", Arith.div(fact_price, symbol_to_price));
}
if ("usdt".equals(symbol_to)) {
/**
* 如果是转成Usdt 则计算收益
*/
List<Realtime> realtime_list = this.dataService.realtime(symbol);
Realtime realtime = null;
if (realtime_list.size() > 0) {
realtime = realtime_list.get(0);
} else {
throw new BusinessException("系统错误,请稍后重试");
}
double symbol_price = realtime.getClose();
// 对应usdt数量
data.put("get_rate", Arith.div(symbol_price, 1));
// 实际兑换数量= 兑换数量-手续费数量
double fact_volume = Arith.sub(volume, Arith.mul(volume, sell_fee));
// 实际价值 = 实际兑换数量 * 被兑换品种价格
double fact_price = Arith.mul(Arith.div(symbol_price, 1), fact_volume);
// 实际获取数量 = 实际价值 / 将要兑换的品种的价值
data.put("get_volume", Arith.div(fact_price, 1));
}
} else {
double symbol_price = 0;
double symbol_to_price = 0;
// 获取币种最新价格
List<Realtime> realtime_list = this.dataService.realtime(symbol);
Realtime realtime = null;
if (realtime_list.size() > 0) {
realtime = realtime_list.get(0);
symbol_price = realtime.getClose();
} else {
throw new BusinessException("系统错误,请稍后重试");
}
// 获取币种最新价格
List<Realtime> realtime_list_to = this.dataService.realtime(symbol_to);
Realtime realtime_to = null;
if (realtime_list_to.size() > 0) {
realtime_to = realtime_list_to.get(0);
symbol_to_price = realtime_to.getClose();
} else {
throw new BusinessException("系统错误,请稍后重试");
}
if (symbol_to_price == 0) {
symbol_to_price = 1;
}
if (symbol_price == 0) {
symbol_price = 1;
}
data.put("get_rate", Arith.div(symbol_price, symbol_to_price));
// 总手续费比例
double all_fee = Arith.add(buy_fee, sell_fee);
// 实际兑换数量= 兑换数量-手续费数量
double fact_volume = Arith.sub(volume, Arith.mul(volume, all_fee));
// 实际价值 = 实际兑换数量 * 被兑换品种价格
double fact_price = Arith.mul(fact_volume, symbol_price);
// 实际获取数量 = 实际价值 / 将要兑换的品种的价值
data.put("get_volume", Arith.div(fact_price, symbol_to_price));
}
resultObject.setData(data);
} catch (BusinessException e) {
resultObject.setCode("1");
resultObject.setMsg(e.getMessage());
} catch (Exception e) {
resultObject.setCode("1");
resultObject.setMsg("程序错误");
logger.error("error:", e.fillInStackTrace());
}
return resultObject;
}
/**
* 兑换记录
* 委托单记录
*
*/
@RequestMapping(action + "list.action")
public Object list(HttpServletRequest request) {
ResultObject resultObject = new ResultObject();
resultObject = readSecurityContextFromSession(resultObject);
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
if (!"0".equals(resultObject.getCode())) {
resultObject.setData(data);
return resultObject;
}
String symbol = request.getParameter("symbol");
String type = request.getParameter("type");
String isAll = request.getParameter("isAll");
try {
String page_no = request.getParameter("page_no");
int pageNo = Integer.valueOf(page_no);
data = this.exchangeApplyOrderService.getPaged(pageNo, 10, this.getLoginPartyId(), symbol, type, isAll);
resultObject.setData(data);
} catch (Exception e) {
resultObject.setCode("1");
resultObject.setMsg("程序错误");
logger.error("error:", e.fillInStackTrace());
}
return resultObject;
}
/**
* 币币交易-买入
* 开仓页面参数
*/
@RequestMapping(action + "openview.action")
public Object openview() {
ResultObject resultObject = new ResultObject();
try {
Map<String, Object> data = new HashMap<String, Object>();
String partyId = this.getLoginPartyId();
if (!StringUtils.isNullOrEmpty(partyId)) {
Wallet wallet = walletService.saveWalletByPartyId(this.getLoginPartyId());
// 账户剩余资金
DecimalFormat df = new DecimalFormat("#.##");
df.setRoundingMode(RoundingMode.FLOOR);// 向下取整
data.put("volume", df.format(wallet.getMoney()));
String session_token = sessionTokenService.savePut(partyId);
data.put("session_token", session_token);
data.put("fee", sysparaService.find("exchange_apply_order_buy_fee").getValue());
}
resultObject.setData(data);
} catch (BusinessException e) {
resultObject.setCode("1");
resultObject.setMsg(e.getMessage());
} catch (Exception e) {
resultObject.setCode("1");
resultObject.setMsg("程序错误");
logger.error("error:", e);
}
return resultObject;
}
/**
* 币币交易-卖出
* 平仓页面参数
*/
@RequestMapping(action + "closeview.action")
public Object closeview(HttpServletRequest request) {
ResultObject resultObject = new ResultObject();
try {
Map<String, Object> data = new HashMap<String, Object>();
String partyId = this.getLoginPartyId();
String symbol = request.getParameter("symbol");
if (!StringUtils.isNullOrEmpty(partyId)) {
WalletExtend walletExtend = walletService.saveExtendByPara(partyId, symbol);
data.put("volume", null == walletExtend ? 0
: new BigDecimal(String.valueOf(walletExtend.getAmount())).toPlainString());
String session_token = sessionTokenService.savePut(partyId);
data.put("session_token", session_token);
data.put("fee", sysparaService.find("exchange_apply_order_sell_fee").getValue());
}
resultObject.setData(data);
} catch (BusinessException e) {
resultObject.setCode("1");
resultObject.setMsg(e.getMessage());
} catch (Exception e) {
resultObject.setCode("1");
resultObject.setMsg("程序错误");
logger.error("error:", e.fillInStackTrace());
}
return resultObject;
}
/**
* 币币交易-买入
*
*/
@RequestMapping(action + "open.action")
public Object open(HttpServletRequest request) {
ResultObject resultObject = new ResultObject();
resultObject = readSecurityContextFromSession(resultObject);
if (!"0".equals(resultObject.getCode())) {
return resultObject;
}
// 委托数量
String volume = request.getParameter("volume");
String session_token = request.getParameter("session_token");
String symbol = request.getParameter("symbol");
// limit order的交易价格
String price = request.getParameter("price");
// 计划委托 是之前火币那边拷贝学过来的一个功能 只是只有一个盘在用,暂时注释不用
// 是否计划委托
String is_trigger_order = request.getParameter("is_trigger_order");
// 计划委托的触发价
String trigger_price = request.getParameter("trigger_price");
// 订单报价类型。 "limit":限价 "opponent":对手价(市价)
String order_price_type = request.getParameter("order_price_type");
String partyId = this.getLoginPartyId();
boolean lock = false;
try {
if (StringUtils.isNullOrEmpty(volume)
|| !StringUtils.isDouble(volume)
|| Double.valueOf(volume) <= 0) {
throw new BusinessException("请输入正确的货币数量");
}
if (!ExchangeLock.add(partyId)) {
throw new BusinessException(1, "请稍后再试");
}
lock = true;
Object object = this.sessionTokenService.cacheGet(session_token);
this.sessionTokenService.delete(session_token);
if ((object == null) || (!this.getLoginPartyId().equals((String) object))) {
resultObject.setCode("1");
resultObject.setMsg("请稍后再试");
return resultObject;
}
Party party = this.partyService.cachePartyBy(partyId, false);
if (!party.getEnabled()) {
resultObject.setCode("506");
resultObject.setMsg(error);
return resultObject;
}
Kyc party_kyc = kycService.get(party.getId().toString());
if (!(party_kyc.getStatus() == 2) && "true".equals(sysparaService.find("exchange_by_kyc").getValue())) {
throw new BusinessException(401, "无权限");
}
List<Realtime> realtimes = this.dataService.realtime(symbol);
double close = 1;
if (realtimes != null) {
close = realtimes.get(0).getClose();
} else {
throw new BusinessException("参数错误");
}
ExchangeApplyOrder order = new ExchangeApplyOrder();
order.setPartyId(partyId);
order.setSymbol(symbol);
order.setOffset(ExchangeApplyOrder.OFFSET_OPEN);
order.setVolume(Double.valueOf(volume));
order.setPrice(StringUtils.isNullOrEmpty(price) ? 0 : Double.valueOf(price));
order.setIs_trigger_order(StringUtils.isNullOrEmpty(is_trigger_order) ? false : Boolean.valueOf(is_trigger_order));
order.setTrigger_price(StringUtils.isNullOrEmpty(trigger_price) ? 0 : Double.valueOf(trigger_price));
order.setOrder_price_type(order_price_type);
order.setRelation_order_no(UUID.randomUUID().toString());
order.setClose_price(close);
// 限价单 && limit order的交易价格 为空
if ("limit".equals(order.getOrder_price_type()) && order.getPrice() == null) {
order.setPrice(close);
}
exchangeApplyOrderService.saveCreate(order);
} catch (BusinessException e) {
resultObject.setCode("1");
resultObject.setMsg(e.getMessage());
} catch (Exception e) {
resultObject.setCode("1");
resultObject.setMsg("程序错误");
logger.error("error:", e.fillInStackTrace());
} finally {
if (lock) {
ThreadUtils.sleep(100);
ExchangeLock.remove(partyId);
}
}
return resultObject;
}
/**
* 币币交易-卖出
*/
@RequestMapping(action + "close.action")
public Object close(HttpServletRequest request) {
ResultObject resultObject = new ResultObject();
resultObject = readSecurityContextFromSession(resultObject);
if (!"0".equals(resultObject.getCode())) {
return resultObject;
}
// 委托数量
String volume = request.getParameter("volume");
String session_token = request.getParameter("session_token");
String symbol = request.getParameter("symbol");
// limit order的交易价格
String price = request.getParameter("price");
// 计划委托 是之前火币那边拷贝学过来的一个功能 只是只有一个盘在用,暂时注释不用
// 是否计划委托
String is_trigger_order = request.getParameter("is_trigger_order");
// 计划委托的触发价
String trigger_price = request.getParameter("trigger_price");
// 订单报价类型。 "limit":限价 "opponent":市价
String order_price_type = request.getParameter("order_price_type");
String partyId = this.getLoginPartyId();
boolean lock = false;
try {
if (StringUtils.isNullOrEmpty(volume)
|| !StringUtils.isDouble(volume)
|| Double.valueOf(volume) <= 0) {
throw new BusinessException("请输入正确的货币数量");
}
if (!ExchangeLock.add(partyId)) {
throw new BusinessException(1, "请稍后再试");
}
lock = true;
Object object = this.sessionTokenService.cacheGet(session_token);
this.sessionTokenService.delete(session_token);
if ((object == null) || (!this.getLoginPartyId().equals((String) object))) {
resultObject.setCode("1");
resultObject.setMsg("请稍后再试");
return resultObject;
}
Party party = this.partyService.cachePartyBy(partyId, false);
if (!party.getEnabled()) {
resultObject.setCode("506");
resultObject.setMsg(error);
return resultObject;
}
List<Realtime> realtimes = this.dataService.realtime(symbol);
double close = 1;
if (realtimes != null) {
close = realtimes.get(0).getClose();
} else {
throw new BusinessException("参数错误");
}
ExchangeApplyOrder order = new ExchangeApplyOrder();
order.setPartyId(partyId);
order.setSymbol(symbol);
order.setOffset(ExchangeApplyOrder.OFFSET_CLOSE);
order.setVolume(Double.valueOf(volume));
order.setPrice(StringUtils.isNullOrEmpty(price) ? 0 : Double.valueOf(price));
order.setIs_trigger_order(StringUtils.isNullOrEmpty(is_trigger_order) ? false : Boolean.valueOf(is_trigger_order));
order.setTrigger_price(StringUtils.isNullOrEmpty(trigger_price) ? 0 : Double.valueOf(trigger_price));
order.setOrder_price_type(order_price_type);
order.setRelation_order_no(UUID.randomUUID().toString());
order.setClose_price(close);
// 限价单 && limit order的交易价格 为空
if ("limit".equals(order.getOrder_price_type()) && order.getPrice() == null) {
order.setPrice(close);
}
this.exchangeApplyOrderService.saveCreate(order);
} catch (BusinessException e) {
resultObject.setCode("1");
resultObject.setMsg(e.getMessage());
} catch (Exception e) {
resultObject.setCode("1");
resultObject.setMsg("程序错误");
logger.error("error:", e.fillInStackTrace());
} finally {
if (lock) {
ThreadUtils.sleep(100);
ExchangeLock.remove(partyId);
}
}
return resultObject;
}
/**
* 撤单
*/
@RequestMapping(action + "cancel.action")
public Object cancel(HttpServletRequest request) {
ResultObject resultObject = new ResultObject();
resultObject = readSecurityContextFromSession(resultObject);
if (!"0".equals(resultObject.getCode())) {
return resultObject;
}
try {
String order_no = request.getParameter("order_no");
CancelDelayThread lockDelayThread = new CancelDelayThread(this.getLoginPartyId(), order_no,
exchangeApplyOrderService);
Thread t = new Thread(lockDelayThread);
t.start();
} catch (BusinessException e) {
resultObject.setCode("1");
resultObject.setMsg(e.getMessage());
} catch (Exception e) {
resultObject.setCode("1");
resultObject.setMsg("程序错误");
logger.error("error:", e);
}
return resultObject;
}
/**
* 新线程处理,直接拿到订单锁处理完成后退出
*
*/
public class CancelDelayThread implements Runnable {
private String partyId;
private String order_no;
private ExchangeApplyOrderService exchangeApplyOrderService;
public void run() {
try {
while (true) {
if (ExchangeLock.add(order_no)) {
this.exchangeApplyOrderService.saveCancel(partyId, order_no);
/**
* 处理完退出
*/
break;
}
ThreadUtils.sleep(100);
}
} catch (Exception e) {
logger.error("error:", e);
} finally {
ThreadUtils.sleep(100);
ExchangeLock.remove(order_no);
}
}
public CancelDelayThread(String partyId, String order_no, ExchangeApplyOrderService exchangeApplyOrderService) {
this.partyId = partyId;
this.order_no = order_no;
this.exchangeApplyOrderService = exchangeApplyOrderService;
}
}
/**
* 详情接口
*/
@RequestMapping(action + "get.action")
public Object get(HttpServletRequest request) {
ResultObject resultObject = new ResultObject();
resultObject = readSecurityContextFromSession(resultObject);
if (!"0".equals(resultObject.getCode())) {
return resultObject;
}
try {
String order_no = request.getParameter("order_no");
ExchangeApplyOrder order = this.exchangeApplyOrderService.findByOrderNoAndPartyId(order_no,
this.getLoginPartyId());
resultObject.setData(bulidData(order));
} catch (Exception e) {
resultObject.setCode("1");
resultObject.setMsg("程序错误");
logger.error("error:", e);
}
return resultObject;
}
private Map<String, Object> bulidData(ExchangeApplyOrder order) {
DecimalFormat df = new DecimalFormat("#.##");
Map<String, Object> map = new HashMap<String, Object>();
map.put("order_no", order.getOrder_no());
map.put("name", itemService.cacheBySymbol(order.getSymbol(), false).getName());
map.put("symbol", order.getSymbol());
map.put("create_time", DateUtils.format(order.getCreate_time(), DateUtils.DF_yyyyMMddHHmmss));
map.put("volume", order.getVolume());
map.put("offset", order.getOffset());
map.put("price", order.getPrice());
map.put("order_price_type", order.getOrder_price_type());
map.put("state", order.getState());
map.put("fee", order.getFee());
map.put("amount", order.getAmount());
map.put("close_price", order.getClose_price());
map.put("close_time", DateUtils.format(order.getClose_time(), DateUtils.DF_yyyyMMddHHmmss));
map.put("trigger_price", order.getTrigger_price());
map.put("is_trigger_order", order.isIs_trigger_order());
return map;
}
}