package cs.mina.client.handler;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import org.apache.log4j.Logger;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import cs.base.IBaseService;
import cs.entity.Admin;
import cs.entity.Announce;
import cs.entity.DealRecord;
import cs.entity.FreezeRecord;
import cs.entity.FundLog;
import cs.entity.Member;
import cs.entity.Order;
import cs.entity.Product;
import cs.entity.StockHold;
import cs.mina.ExecIDSet;
import cs.mina.OrderIdAndDatabaseIdMap;
import cs.mina.OrderState;
import cs.mina.SeqNumAndDatabaseIdMap;
import cs.mina.codec.msg.BaseMsg;
import cs.mina.codec.msg.BusinessMessageRejectMsg;
import cs.mina.codec.msg.ExecutionReportMsg;
import cs.mina.codec.msg.MsgType;
import cs.mina.codec.msg.OrderCancelRejectMsg;
import cs.mina.codec.msg.RejectMsg;
import cs.service.IAdminService;
import cs.service.IAnnounceService;
import cs.service.IDealRecordService;
import cs.service.IFreezeRecordService;
import cs.service.IFundLogService;
import cs.service.IMemberService;
import cs.service.IOrderService;
import cs.service.IProductService;
import cs.service.IStockHoldService;
import cs.util.ApplicationContextUtil;
import cs.util.Constant;
import cs.util.FileOPUtil;
import csulog.CSULog;
/*
*@author(huangxiaoping)
*@date 2014-1-11
*/
public class DbFailExecuteThreadHandler extends Thread {
private static final Logger logger=Logger.getLogger(DbFailExecuteThreadHandler.class);
private static final CSULog csuLog=CSULog.getInstance();
private BlockingQueue<DbFail> failQueue;
public DbFailExecuteThreadHandler(BlockingQueue<DbFail> failQueue){
this.failQueue=failQueue;
}
@Override
public void run() {
while(true){
DbFail fail=null;
try{
fail=failQueue.take();
DataSourceTransactionManager txManager=(DataSourceTransactionManager)ApplicationContextUtil.getApplicationContext().getBean("transactionManager");
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = txManager.getTransaction(def);
try{
BaseMsg msg=fail.getMsg();
if(msg instanceof ExecutionReportMsg){
doExecutionReportMsgHandler(msg);
FileOPUtil.removeDbFail(fail);
}else if(msg instanceof BusinessMessageRejectMsg){
doBusinessMessageRejectMsgHandler(msg);
FileOPUtil.removeDbFail(fail);
}else if(msg instanceof OrderCancelRejectMsg){
doOrderCancelRejectMsgHandler(msg);
FileOPUtil.removeDbFail(fail);
}else if(msg instanceof RejectMsg){
doRejectMsgHandler(msg);
FileOPUtil.removeDbFail(fail);
}else{
csuLog.log_ERROR("错误恢复-错误恢复-不支持的错误恢复消息");
}
txManager.commit(status);
}catch(Exception e){
txManager.rollback(status);
throw e;
}
}catch(Exception e){
logger.error("数据库执行失败反复执行线程被中断", e);
try {
if(fail!=null){
failQueue.put(fail);
}
Thread.sleep(30000);//休息30秒
} catch (InterruptedException e1) {
logger.error("数据库执行失败反复执行队列被中断", e1);
}
}
}
}
private void doExecutionReportMsgHandler(BaseMsg msg)throws Exception{
ExecutionReportMsg report=(ExecutionReportMsg)msg;
csuLog.log_INFO("错误恢复-收到执行报告[msgType=8],[msgStr="+report.encode()+"]");
if(ExecIDSet.isExist(report.getExecID().getTagValue())){
csuLog.log_WARNING("错误恢复-此执行报告已经处理过,不再重复处理[execId="+report.getExecID().getTagValue()+"],[msgStr="+report.encode()+"]");
return;
}else{
ExecIDSet.put(report.getExecID().getTagValue());//保存执行报告id
}
//获取service
IAnnounceService announceServiceImpl=(IAnnounceService)ApplicationContextUtil.getApplicationContext().getBean("announceServiceImpl");
IOrderService orderServiceImpl=(IOrderService)ApplicationContextUtil.getApplicationContext().getBean("orderServiceImpl");
IAdminService adminServiceImpl=(IAdminService)ApplicationContextUtil.getApplicationContext().getBean("adminServiceImpl");
IDealRecordService dealRecordServiceImpl=(IDealRecordService)ApplicationContextUtil.getApplicationContext().getBean("dealRecordServiceImpl");
IMemberService memberServiceImpl=(IMemberService)ApplicationContextUtil.getApplicationContext().getBean("memberServiceImpl");
IFundLogService fundLogServiceImpl=(IFundLogService)ApplicationContextUtil.getApplicationContext().getBean("fundLogServiceImpl");
IProductService productServiceImpl=(IProductService)ApplicationContextUtil.getApplicationContext().getBean("productServiceImpl");
IStockHoldService stockHoldServiceImpl=(IStockHoldService)ApplicationContextUtil.getApplicationContext().getBean("stockHoldServiceImpl");
IFreezeRecordService freezeRecordServiceImpl=(IFreezeRecordService)ApplicationContextUtil.getApplicationContext().getBean("freezeRecordServiceImpl");
Order order=new Order();
//获取订单数据库id
order.setId(Long.parseLong(OrderIdAndDatabaseIdMap.get(report.getClOrdID().getTagValue())));
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMdd-HH:mm:ss.SSS");
order=((IBaseService<Order>)orderServiceImpl).get(order);
Product product =productServiceImpl.findByCode(order.getProduct().getCode());
StockHold stockHold=stockHoldServiceImpl.getByProductIdAndUserId(product.getId(), order.getMember().getId());
order.setState(report.getOrdStatus().getTagValue());
order.setServerOrderId(report.getOrderID().getTagValue());
String side=report.getSide().getTagValue();
switch(report.getExecType().getTagValue().toCharArray()[0]){
case '1'://PARTIAL_FILL
case '2'://FILL
case 'F'://Trade (partial fill or fill)
order.setAlreadyTrans(Integer.parseInt(report.getCumQty().getTagValue()));
DealRecord dealRecord=new DealRecord();
dealRecord.setOrder(order);
dealRecord.setPrice(Double.parseDouble(report.getLastPx().getTagValue()));
dealRecord.setQuantity(Integer.parseInt(report.getLastQty().getTagValue()));
if(report.getTransactTime().getTagValue()!=null){
dealRecord.setDealTime(sdf.parse(report.getTransactTime().getTagValue()));
}
((IBaseService<DealRecord>)dealRecordServiceImpl).add(dealRecord);
csuLog.log_INFO("错误恢复-新增成交记录[lgid="+order.getMember().getLgid()+"],[orderId="+order.getId()+"],[amt="+dealRecord.getQuantity()+"],[price="+order.getPrice()+"]");
order.setWaitTrans(Integer.parseInt(report.getLeavesQty().getTagValue()));
if(side.equals(Constant.FIX_SIDE_BUY+"")){
if(Integer.parseInt(report.getLeavesQty().getTagValue())==0){
FreezeRecord freezeRecord=freezeRecordServiceImpl.getByOrderIdAndUserId(order.getId(), order.getMember().getId());
List<DealRecord> dealList=dealRecordServiceImpl.findByOrder(order);
double money=0;
for(int i=0;i<dealList.size();i++){
DealRecord deal=dealList.get(i);
money+=deal.getPrice()*deal.getQuantity();
}
Member member=order.getMember();
csuLog.log_INFO("错误恢复-修改前用户余额和冻结总资金[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceTotal="+member.getBalance()+"],[freezeTotal="+member.getAmtFrozen()+"]");
member.setBalance(member.getBalance()+freezeRecord.getAmt()-money);
member.setAmtFrozen(member.getAmtFrozen()-freezeRecord.getAmt());
((IBaseService<Member>)memberServiceImpl).modify(member);
csuLog.log_INFO("错误恢复-修改后用户余额和冻结总资金[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceAmt="+(freezeRecord.getAmt()-money)+"],[balanceTotal="+member.getBalance()+"],[freezeAmt="+(-freezeRecord.getAmt())+"],[freezeTotal="+member.getAmtFrozen()+"]");
((IBaseService<FreezeRecord>)freezeRecordServiceImpl).delete(freezeRecord);
csuLog.log_INFO("错误恢复-删除资金冻结[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+freezeRecord.getAmt()+"]");
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(freezeRecord.getAmt()-money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("买成交[id="+order.getId()+"]费用差价收益");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+(freezeRecord.getAmt()-money)+"],[balance="+fundLog.getBalance()+"]");
if(stockHold==null){
stockHold=new StockHold();
stockHold.setAmt(order.getQuantity());
stockHold.setProduct(product);
stockHold.setUser(order.getMember());
((IBaseService<StockHold>)stockHoldServiceImpl).add(stockHold);
}else{
stockHold.setAmt(stockHold.getAmt()+order.getQuantity());
((IBaseService<StockHold>)stockHoldServiceImpl).modify(stockHold);
}
csuLog.log_INFO("错误恢复-修改持股数量[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[product="+product.getName()+"],[amt="+stockHold.getAmt()+"]");
}
}else if(side.equals(Constant.FIX_SIDE_SELL+"")){
if(Integer.parseInt(report.getLeavesQty().getTagValue())==0){
List<DealRecord> dealList=dealRecordServiceImpl.findByOrder(order);
double money=0;
for(int i=0;i<dealList.size();i++){
DealRecord deal=dealList.get(i);
money+=deal.getPrice()*deal.getQuantity();
}
Member member=memberServiceImpl.getMemberByLgid(order.getMember());
csuLog.log_INFO("错误恢复-修改前用户余额和冻结总资金[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceTotal="+member.getBalance()+"],[freezeTotal="+member.getAmtFrozen()+"]");
member.setBalance(member.getBalance()+money);
((IBaseService<Member>)memberServiceImpl).modify(member);
csuLog.log_INFO("错误恢复-修改后用户余额和冻结总资金[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceAmt="+money+"],[balanceTotal="+member.getBalance()+"],[freezeTotal="+member.getAmtFrozen()+"]");
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("卖单成交[id="+order.getId()+"]收益");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+money+"],[balance="+fundLog.getBalance()+"]");
}
}else{
csuLog.log_ERROR("错误恢复-ExecutionReportMessageHandler逻辑side错误[side="+side+"]");
}
break;
case 'H'://Trade Cancel
case '3'://Done for day
case '4'://Canceled
case '7'://Stopped
case 'C'://Expired
if(side.equals(Constant.FIX_SIDE_BUY+"")){
FreezeRecord freezeRecord=freezeRecordServiceImpl.getByOrderIdAndUserId(order.getId(), order.getMember().getId());
if(order.getQuantity()>order.getWaitTrans()){
List<DealRecord> dealList=dealRecordServiceImpl.findByOrder(order);
double money=0;
for(int i=0;i<dealList.size();i++){
DealRecord deal=dealList.get(i);
money+=deal.getPrice()*deal.getQuantity();
}
Member member=order.getMember();
csuLog.log_INFO("错误恢复-修改前用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balance="+member.getBalance()+"],[freeze="+member.getAmtFrozen()+"]");
member.setAmtFrozen(member.getAmtFrozen()-freezeRecord.getAmt());
money=freezeRecord.getAmt()-money;
member.setBalance(member.getBalance()+money);
((IBaseService<Member>)memberServiceImpl).modify(member);
csuLog.log_INFO("错误恢复-修改后用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceTotal="+member.getBalance()+"][balanceAmt="+money+"],[freezeTotal="+member.getAmtFrozen()+"],[freezeAmt="+(-freezeRecord.getAmt())+"]");
((IBaseService<FreezeRecord>)freezeRecordServiceImpl).delete(freezeRecord);
csuLog.log_INFO("错误恢复-删除资金冻结[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+freezeRecord.getAmt()+"]");
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("订单结束[id="+order.getId()+"]退回");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[order="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]");
if(stockHold==null){
stockHold=new StockHold();
stockHold.setAmt(order.getQuantity()-order.getWaitTrans());
stockHold.setProduct(product);
stockHold.setUser(order.getMember());
((IBaseService<StockHold>)stockHoldServiceImpl).add(stockHold);
}else{
stockHold.setAmt(stockHold.getAmt()+order.getQuantity()-order.getWaitTrans());
((IBaseService<StockHold>)stockHoldServiceImpl).modify(stockHold);
}
csuLog.log_INFO("错误恢复-修改持股数量[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[product="+product.getName()+"],[amt="+stockHold.getAmt()+"]");
}else{
double money=0;
money+=order.getPrice()*order.getWaitTrans();
Member member=memberServiceImpl.getMemberByLgid(order.getMember());
csuLog.log_INFO("错误恢复-修改前用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balance="+member.getBalance()+"],[freeze="+member.getAmtFrozen()+"]");
member.setBalance(member.getBalance()+money);
member.setAmtFrozen(member.getAmtFrozen()-freezeRecord.getAmt());
((IBaseService<Member>)memberServiceImpl).modify(member);
csuLog.log_INFO("错误恢复-修改后用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceTotal="+member.getBalance()+"][balanceAmt="+money+"],[freezeTotal="+member.getAmtFrozen()+"],[freezeAmt="+(-freezeRecord.getAmt())+"]");
((IBaseService<FreezeRecord>)freezeRecordServiceImpl).delete(freezeRecord);
csuLog.log_INFO("错误恢复-删除资金冻结[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+freezeRecord.getAmt()+"]");
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("订单结束[id="+order.getId()+"]退回");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[order="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]");
}
}else if(side.equals(Constant.FIX_SIDE_SELL+"")){
if(order.getQuantity()>order.getWaitTrans()){
if(stockHold==null){
stockHold=new StockHold();
stockHold.setAmt(order.getQuantity()-order.getWaitTrans());
stockHold.setProduct(product);
stockHold.setUser(order.getMember());
((IBaseService<StockHold>)stockHoldServiceImpl).add(stockHold);
}else{
stockHold.setAmt(stockHold.getAmt()+order.getQuantity()-order.getWaitTrans());
((IBaseService<StockHold>)stockHoldServiceImpl).modify(stockHold);
}
csuLog.log_INFO("错误恢复-修改持股数量[lgid="+order.getMember().getLgid()+"],[orderId="+order.getId()+"],[product="+product.getName()+"],[amt="+stockHold.getAmt()+"]");
List<DealRecord> dealList=dealRecordServiceImpl.findByOrder(order);
double money=0;
for(int i=0;i<dealList.size();i++){
DealRecord deal=dealList.get(i);
money+=deal.getPrice()*deal.getQuantity();
}
Member member=order.getMember();
csuLog.log_INFO("错误恢复-修改前用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balance="+member.getBalance()+"],[freeze="+member.getAmtFrozen()+"]");
member.setBalance(member.getBalance()+money);
((IBaseService<Member>)memberServiceImpl).modify(member);
csuLog.log_INFO("错误恢复-修改后用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceTotal="+member.getBalance()+"][balanceAmt="+money+"],[freezeTotal="+member.getAmtFrozen()+"]");
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("订单结束[id="+order.getId()+"]退回及收益");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[order="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]");
}else{
stockHold.setAmt(stockHold.getAmt()+order.getQuantity());
((IBaseService<StockHold>)stockHoldServiceImpl).modify(stockHold);
csuLog.log_INFO("错误恢复-修改持股数量[lgid="+order.getMember().getLgid()+"],[orderId="+order.getId()+"],[product="+product.getName()+"],[amt="+stockHold.getAmt()+"]");
}
}else{
csuLog.log_ERROR("错误恢复-ExecutionReportMessageHandler逻辑side错误[side="+side+"]");
}
break;
case '5':
csuLog.log_INFO("错误恢复-收到修改成功执行报告,没执行资金和持股变动操作");
break;
case '8'://Rejected
FreezeRecord freezeRecord=freezeRecordServiceImpl.getByOrderIdAndUserId(order.getId(), order.getMember().getId());
if(side.equals(Constant.FIX_SIDE_BUY+"")){
if(order.getState().equals(OrderState.ADD_SUBMIT)){
double money=0;
money+=order.getPrice()*order.getWaitTrans();
Member member=memberServiceImpl.getMemberByLgid(order.getMember());
csuLog.log_INFO("错误恢复-修改前用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balance="+member.getBalance()+"],[freeze="+member.getAmtFrozen()+"]");
member.setBalance(member.getBalance()+money);
member.setAmtFrozen(member.getAmtFrozen()-freezeRecord.getAmt());
((IBaseService<Member>)memberServiceImpl).modify(member);
csuLog.log_INFO("错误恢复-修改后用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceTotal="+member.getBalance()+"][balanceAmt="+money+"],[freezeTotal="+member.getAmtFrozen()+"],[freezeAmt="+(-freezeRecord.getAmt())+"]");
((IBaseService<FreezeRecord>)freezeRecordServiceImpl).delete(freezeRecord);
csuLog.log_INFO("错误恢复-删除资金冻结[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+freezeRecord.getAmt()+"]");
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("订单被拒[id="+order.getId()+"]退回资金");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[order="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]");
}else{
String orderState=report.getOrdStatus().getTagValue();
double money=0;
if(!order.getLastState().equals(orderState)){
csuLog.log_ERROR("错误恢复-本地订单状态和服务器订单状态不一样");
}
if(order.getState().equals(OrderState.REPLACE_SUBMIT)){
order.setState(order.getLastState());
money+=order.getWaitTrans()*order.getPrice()-order.getLastAmt()*order.getLastPrice();
Member member=memberServiceImpl.getMemberByLgid(order.getMember());
csuLog.log_INFO("错误恢复-修改前用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balance="+member.getBalance()+"],[freeze="+member.getAmtFrozen()+"]");
member.setBalance(member.getBalance()+money);
member.setAmtFrozen(member.getAmtFrozen()-money);
((IBaseService<Member>)memberServiceImpl).modify(member);
csuLog.log_INFO("错误恢复-修改后用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceTotal="+member.getBalance()+"][balanceAmt="+money+"],[freezeTotal="+member.getAmtFrozen()+"],[freezeAmt="+(-money)+"]");
freezeRecord.setAmt(freezeRecord.getAmt()-money);
((IBaseService<FreezeRecord>)freezeRecordServiceImpl).modify(freezeRecord);
csuLog.log_INFO("错误恢复-修改资金冻结[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+(-money)+"],[freezeTotal="+freezeRecord.getAmt()+"]");
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("修改订单被拒[id="+order.getId()+"]退回");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[order="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]");
}else if(order.getState().equals(OrderState.CANCLE_SUBMIT)){
order.setState(order.getLastState());
/*money+=-order.getLastAmt()*order.getLastPrice();
Member member=memberServiceImpl.getMemberByLgid(order.getMember());
member.setBalance(member.getBalance()+money);
((IBaseService<Member>)memberServiceImpl).modify(member);
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("取消订单被拒[id="+order.getId()+"]退回");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);*/
}
}
}else if(side.equals(Constant.FIX_SIDE_SELL+"")){
if(order.getState().equals(OrderState.ADD_SUBMIT)){
stockHold.setAmt(stockHold.getAmt()+order.getQuantity());
((IBaseService<StockHold>)stockHoldServiceImpl).modify(stockHold);
csuLog.log_INFO("错误恢复-修改持股数量[lgid="+order.getMember().getLgid()+"],[orderId="+order.getId()+"],[product="+order.getProduct().getName()+"],[amt="+order.getQuantity()+"],[total="+stockHold.getAmt()+"]");
}else{
String orderState=report.getOrdStatus().getTagValue();
double money=0;
if(!order.getLastState().equals(orderState)){
csuLog.log_ERROR("错误恢复-本地订单状态和服务器订单状态不一样");
}
if(order.getState().equals(OrderState.REPLACE_SUBMIT)){
order.setState(order.getLastState());
int amount=order.getWaitTrans()-order.getLastAmt();
stockHold.setAmt(stockHold.getAmt()+amount);
((IBaseService<StockHold>)stockHoldServiceImpl).modify(stockHold);
csuLog.log_INFO("错误恢复-修改持股数量[lgid="+order.getMember().getLgid()+"],[orderId="+order.getId()+"],[product="+order.getProduct().getName()+"],[amt="+amount+"],[total="+stockHold.getAmt()+"]");
}else if(order.getState().equals(OrderState.CANCLE_SUBMIT)){
order.setState(order.getLastState());
}
}
}else{
csuLog.log_ERROR("错误恢复-ExecutionReportMessageHandler逻辑side错误[side="+side+"]");
}
}
((IBaseService<Order>)orderServiceImpl).modify(order);
Announce announce=new Announce();
announce.setBeginTime(new Date());
announce.setUpdateTime(new Date());
Admin admin=new Admin();
admin.setLgid("admin");
admin=adminServiceImpl.getAdminByLgid(admin);
announce.setPromulgator(admin);
announce.setMember(order.getMember());
announce.setAlert(Announce.ALERT_VIEW);
announce.setTitle("收到执行报告");
switch(report.getExecType().getTagValue().toCharArray()[0]){
case 0:
announce.setContent("订单提交成功(New)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 1:
announce.setContent("订单部分成交(Part Filled)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 2:
announce.setContent("订单全部成交(Filled)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 3:
announce.setContent("订单当天成交(DoneForDay)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 4:
announce.setContent("订单被取消成功(Canceled)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 5:
announce.setContent("订单修改成功(Replaced)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 6:
announce.setContent("订单在取消队列中(PendingCancel)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 7:
announce.setContent("订单已停止(Stopped)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 8:
announce.setContent("订单被拒绝(Rejected)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 9:
announce.setContent("订单被挂起(Suspended)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'A':
announce.setContent("订单在新建队列中(PendingNew)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'B':
announce.setContent("订单被计算(Calculated)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'C':
announce.setContent("订单已过期(Expired)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'D':
announce.setContent("主动发送(Restated)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'E':
announce.setContent("订单在修改队列中(PendingReplace)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'F':
announce.setContent("订单部分或全部成交(Trade)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'G':
announce.setContent("成交修改(TradeCorrect)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'H':
announce.setContent("成交撤销(TradeCancel)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'I':
announce.setContent("订单状态(OrderStatus)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'J':
announce.setContent("交易在清理中(Trade in a Clearing Hold)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'K':
announce.setContent("交易被释放用来清除(Trade has been released to Clearing)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
case 'L':
announce.setContent("被系统触发或激活(Triggered or Activated by System)[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
default:
announce.setContent("收到执行报告[OrderId="+order.getId()+"],[orderStatus="+report.getOrdStatus().getTagValue()+"],[side="+report.getSide().getTagValue()+"]");
break;
}
Calendar ca=new GregorianCalendar();
ca.setTime(new Date());
ca.add(GregorianCalendar.MONTH, 1);
announce.setEndTime(ca.getTime());//结束时间为发布起一个月
announce.setDestType(Announce.DEST_TYPE_MEMBER);
announceServiceImpl.addAnnounce(announce);
csuLog.log_INFO("错误恢复-发送通知给用户[lgid="+order.getMember().getLgid()+"],[orderId="+order.getId()+"],[title="+announce.getTitle()+"],[content="+announce.getContent()+"]");
}
private void doBusinessMessageRejectMsgHandler(BaseMsg basemsg)throws Exception{
BusinessMessageRejectMsg msg=(BusinessMessageRejectMsg)basemsg;
csuLog.log_INFO("错误恢复-收到业务消息被拒消息[msgType=j],[refMsgType="+msg.getRefMsgType().getTagValue()+"],[refSeqNum="+msg.getRefSeqNum().getTagValue()+"],[reason="+msg.getBusinessRejectReason().getTagValue()+"]");
//获取service
IAnnounceService announceServiceImpl=(IAnnounceService)ApplicationContextUtil.getApplicationContext().getBean("announceServiceImpl");
IOrderService orderServiceImpl=(IOrderService)ApplicationContextUtil.getApplicationContext().getBean("orderServiceImpl");
IAdminService adminServiceImpl=(IAdminService)ApplicationContextUtil.getApplicationContext().getBean("adminServiceImpl");
IMemberService memberServiceImpl=(IMemberService)ApplicationContextUtil.getApplicationContext().getBean("memberServiceImpl");
IFundLogService fundLogServiceImpl=(IFundLogService)ApplicationContextUtil.getApplicationContext().getBean("fundLogServiceImpl");
IProductService productServiceImpl=(IProductService)ApplicationContextUtil.getApplicationContext().getBean("productServiceImpl");
IStockHoldService stockHoldServiceImpl=(IStockHoldService)ApplicationContextUtil.getApplicationContext().getBean("stockHoldServiceImpl");
IFreezeRecordService freezeRecordServiceImpl=(IFreezeRecordService)ApplicationContextUtil.getApplicationContext().getBean("freezeRecordServiceImpl");
String dbid=SeqNumAndDatabaseIdMap.get(msg.getRefSeqNum().getTagValue());
Order order=new Order();
order.setId(Integer.parseInt(dbid));
order=((IBaseService<Order>)orderServiceImpl).get(order);
Member member=order.getMember();
Product product =productServiceImpl.findByCode(order.getProduct().getCode());
StockHold stockHold=stockHoldServiceImpl.getByProductIdAndUserId(product.getId(), member.getId());
if(msg.getRefMsgType().getTagValue().equals(MsgType.NEW_ORDER_SINGLE)){
String transType=order.getTransType();
String side="";
if(transType.equals(Order.TRANSTYPE_BUY)){
side="1";
}else if(transType.equals(Order.TRANSTYPE_SELL)){
side="2";
}else{
csuLog.log_ERROR("错误恢复-BusinessMessageRejectMessageHandler逻辑transType错误[tt="+transType+"]");
}
order.setState(Constant.ORDER_STATUS_REJECT);
if(side.equals(Constant.FIX_SIDE_BUY+"")){
csuLog.log_INFO("错误恢复-修改前的用户总冻结资金和余额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[freezeAmt="+member.getAmtFrozen()+"],[balanceAmt="+member.getBalance()+"]");
member.setBalance(member.getBalance()+order.getPrice()*order.getWaitTrans());
FreezeRecord freezeRecord=freezeRecordServiceImpl.getByOrderIdAndUserId(order.getId(), member.getId());
member.setAmtFrozen(member.getAmtFrozen()-freezeRecord.getAmt());
((IBaseService<Member>)memberServiceImpl).modify(member);//修改用户冻结资金
csuLog.log_INFO("错误恢复-修改后用户总冻结资金和余额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[freezeAmt="+member.getAmtFrozen()+"],[balanceAmt="+member.getBalance()+"]");
((IBaseService<FreezeRecord>)freezeRecordServiceImpl).delete(freezeRecord);//删除冻结资金
csuLog.log_INFO("错误恢复-删除冻结资金记录[lgid="+freezeRecord.getUser().getLgid()+"],[orderId="+order.getId()+"],[id="+freezeRecord.getId()+"],[orderId="+freezeRecord.getOrder().getId()+"],[amt="+freezeRecord.getAmt()+"]");
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(order.getPrice()*order.getWaitTrans());
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("订单新增业务层被拒[id="+order.getId()+"]退回资金");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]");
}else if(side.equals(Constant.FIX_SIDE_SELL+"")){
stockHold.setAmt(stockHold.getAmt()+order.getQuantity());
((IBaseService<StockHold>)stockHoldServiceImpl).modify(stockHold);
csuLog.log_INFO("错误恢复-修改持股变动[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[product="+order.getProduct().getName()+"],[amt="+order.getQuantity()+"],[total="+stockHold.getAmt()+"]");
}else{
csuLog.log_ERROR("错误恢复-BusinessMessageRejectMessageHandler逻辑side错误[side="+side+"]");
}
}else if(msg.getRefMsgType().getTagValue().equals(MsgType.ORDER_CANCEL_REQUEST)){
order.setState(order.getLastState());
}else if(msg.getRefMsgType().getTagValue().equals(MsgType.ORDER_CANCEL_REPLACE_REQUEST)){
//OrderCancelReplaceRequestMsg crMsg=(OrderCancelReplaceRequestMsg)baseMsg;
order.setState(order.getLastState());
order.setPrice(order.getLastPrice());
order.setQuantity(order.getQuantity()+order.getLastAmt()-order.getWaitTrans());
order.setWaitTrans(order.getLastAmt());
//String side=crMsg.getSide().getTagValue();
String transType=order.getTransType();
String side="";
if(transType.equals(Order.TRANSTYPE_BUY)){
side="1";
}else if(transType.equals(Order.TRANSTYPE_SELL)){
side="2";
}else{
csuLog.log_ERROR("错误恢复-BusinessMessageRejectMessageHandler逻辑transType错误[tt="+transType+"]");
}
if(side.equals(Constant.FIX_SIDE_BUY+"")){
csuLog.log_INFO("错误恢复-修改前的用户总冻结资金和余额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[freezeAmt="+member.getAmtFrozen()+"],[balanceAmt="+member.getBalance()+"]");
double money=order.getPrice()*order.getWaitTrans()-order.getLastAmt()*order.getLastPrice();
member.setBalance(member.getBalance()+money);
FreezeRecord freezeRecord=freezeRecordServiceImpl.getByOrderIdAndUserId(order.getId(), member.getId());
member.setAmtFrozen(member.getAmtFrozen()-money);
((IBaseService<Member>)memberServiceImpl).modify(member);//修改用户冻结资金
csuLog.log_INFO("错误恢复-修改后用户总冻结资金和余额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[freezeAmt="+member.getAmtFrozen()+"],[balanceAmt="+member.getBalance()+"]");
freezeRecord.setAmt(freezeRecord.getAmt()-money);
((IBaseService<FreezeRecord>)freezeRecordServiceImpl).modify(freezeRecord);
csuLog.log_INFO("错误恢复-修改资金冻结[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+(-money)+"],[leaveTotal="+freezeRecord.getAmt()+"]");
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("订单修改业务层被拒[id="+order.getId()+"]回退到前一个状态");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]");
}else if(side.equals(Constant.FIX_SIDE_SELL+"")){
stockHold.setAmt(stockHold.getAmt()+(order.getWaitTrans()-order.getLastAmt()));
((IBaseService<StockHold>)stockHoldServiceImpl).modify(stockHold);
csuLog.log_INFO("错误恢复-修改持股变动[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[product="+order.getProduct().getName()+"],[amt="+(order.getWaitTrans()-order.getLastAmt())+"],[total="+stockHold.getAmt()+"]");
}else{
csuLog.log_ERROR("错误恢复-BusinessMessageRejectMessageHandler逻辑side错误[side="+side+"]");
}
}else{
csuLog.log_ERROR("错误恢复-不支持的消息原类型");
}
((IBaseService<Order>)orderServiceImpl).modify(order);
Announce announce=new Announce();
announce.setBeginTime(new Date());
announce.setUpdateTime(new Date());
Admin admin=new Admin();
admin.setLgid("admin");
admin=adminServiceImpl.getAdminByLgid(admin);
announce.setPromulgator(admin);
announce.setMember(order.getMember());
announce.setAlert(Announce.ALERT_VIEW);
announce.setTitle("订单被拒");
switch(Integer.parseInt(msg.getBusinessRejectReason().getTagValue())){
case 0:
announce.setContent("原因:其他(Other)");
break;
case 1:
announce.setContent("原因:未知id(Unknown ID)");
break;
case 2:
announce.setContent("原因:未知证券(Unknown Security)");
break;
case 3:
announce.setContent("原因:不支持的消息类型(Unsupported Message Type)");
break;
case 4:
announce.setContent("原因:应用程序不可用(Application not available)");
break;
case 5:
announce.setContent("原因:条件必须字段丢失(Conditionally required field missing)");
break;
case 6:
announce.setContent("原因:没有授权(Not Authorized)");
break;
case 7:
announce.setContent("原因:分发到公司当前时间不可用(DeliverTo firm not available at this time)");
break;
case 18:
announce.setContent("原因:无效的价格增长(Invalid price increment)");
break;
default:
announce.setContent("原因:其他(Other)");
break;
}
Calendar ca=new GregorianCalendar();
ca.setTime(new Date());
ca.add(GregorianCalendar.MONTH, 1);
announce.setEndTime(ca.getTime());//结束时间为发布起一个月
announce.setDestType(Announce.DEST_TYPE_MEMBER);
announceServiceImpl.addAnnounce(announce);
csuLog.log_INFO("错误恢复-发送用户通知[lgid="+order.getMember().getLgid()+"],[orderId="+order.getId()+"],[title="+announce.getTitle()+"],[content="+announce.getContent()+"]");
}
private void doOrderCancelRejectMsgHandler(BaseMsg message)throws Exception{
OrderCancelRejectMsg msg=(OrderCancelRejectMsg)message;//转化
//获取service
IAnnounceService announceServiceImpl=(IAnnounceService)ApplicationContextUtil.getApplicationContext().getBean("announceServiceImpl");
IOrderService orderServiceImpl=(IOrderService)ApplicationContextUtil.getApplicationContext().getBean("orderServiceImpl");
IAdminService adminServiceImpl=(IAdminService)ApplicationContextUtil.getApplicationContext().getBean("adminServiceImpl");
IMemberService memberServiceImpl=(IMemberService)ApplicationContextUtil.getApplicationContext().getBean("memberServiceImpl");
IFundLogService fundLogServiceImpl=(IFundLogService)ApplicationContextUtil.getApplicationContext().getBean("fundLogServiceImpl");
IFreezeRecordService freezeRecordServiceImpl=(IFreezeRecordService)ApplicationContextUtil.getApplicationContext().getBean("freezeRecordServiceImpl");
IStockHoldService stockHoldServiceImpl=(IStockHoldService)ApplicationContextUtil.getApplicationContext().getBean("stockHoldServiceImpl");
String orgClOrd=msg.getOrigClOrdID().getTagValue();//得到原先请求的客户端订单号
String dbId=OrderIdAndDatabaseIdMap.get(orgClOrd);//获取数据库订单id
Order order=new Order();
order.setId(Long.parseLong(dbId));
order=((IBaseService<Order>)orderServiceImpl).get(order);
String cxlRejResponseTo=msg.getCxlRejResponseTo().getTagValue();
Member member=order.getMember();
String transType=order.getTransType();
if(transType.equals(Order.TRANSTYPE_BUY)){
if(cxlRejResponseTo.equals("1")){//Order cancel request
order.setState(order.getLastState());
}else if(cxlRejResponseTo.equals("2")){//Order cancel/replace request
double money=order.getPrice()*order.getWaitTrans()-order.getLastAmt()*order.getLastPrice();
order.setState(order.getLastState());
order.setPrice(order.getLastPrice());
order.setQuantity(order.getQuantity()+order.getLastAmt()-order.getWaitTrans());
order.setWaitTrans(order.getLastAmt());
csuLog.log_INFO("错误恢复-修改前用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balance="+member.getBalance()+"],[freeze="+member.getAmtFrozen()+"]");
member.setBalance(member.getBalance()+money);
member.setAmtFrozen(member.getAmtFrozen()-money);
((IBaseService<Member>)memberServiceImpl).modify(member);
csuLog.log_INFO("错误恢复-修改后用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceTotal="+member.getBalance()+"][balanceAmt="+money+"],[freezeTotal="+member.getAmtFrozen()+"],[freezeAmt="+(-money)+"]");
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("订单修改被拒[id="+order.getId()+"]回退到前一个状态");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[order="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]");
//资金冻结变动
FreezeRecord freezeRecord=freezeRecordServiceImpl.getByOrderIdAndUserId(order.getId(), order.getMember().getId());
freezeRecord.setAmt(freezeRecord.getAmt()-money);
((IBaseService<FreezeRecord>)freezeRecordServiceImpl).modify(freezeRecord);
csuLog.log_INFO("错误恢复-修改资金冻结[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+(-money)+"],[freezeTotal="+freezeRecord.getAmt()+"]");
}else{
csuLog.log_ERROR("错误恢复-cxlRejResponseTo错误[cxlRejResponseTo="+cxlRejResponseTo+"]");
}
}else if(transType.equals(Order.TRANSTYPE_SELL)){
if(cxlRejResponseTo.equals("1")){//Order cancel request
order.setState(order.getLastState());
}else if(cxlRejResponseTo.equals("2")){//Order cancel/replace request
order.setState(order.getLastState());
order.setPrice(order.getLastPrice());
order.setQuantity(order.getQuantity()+order.getLastAmt()-order.getWaitTrans());
order.setWaitTrans(order.getLastAmt());
StockHold stockHold=stockHoldServiceImpl.getByProductIdAndUserId(order.getProduct().getId(),order.getMember().getId());
if(stockHold==null){
csuLog.log_ERROR("错误恢复-OrderCancelRejectMessageHandler内部错误,stockHold为null");
}else{
stockHold.setAmt(stockHold.getAmt()+order.getWaitTrans()-order.getLastAmt());
((IBaseService<StockHold>)stockHoldServiceImpl).modify(stockHold);
}
csuLog.log_INFO("错误恢复-用户持股数变动[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+(order.getWaitTrans()-order.getLastAmt())+"],[total="+stockHold.getAmt()+"]");
}else{
csuLog.log_ERROR("错误恢复-cxlRejResponseTo错误[cxlRejResponseTo="+cxlRejResponseTo+"]");
}
}else{
csuLog.log_ERROR("错误恢复-OrderCancelRejectMessageHandler逻辑transType错误[tt="+transType+"]");
}
((IBaseService<Order>)orderServiceImpl).modify(order);
Announce announce=new Announce();
announce.setBeginTime(new Date());
announce.setUpdateTime(new Date());
Admin admin=new Admin();
admin.setLgid("admin");
admin=adminServiceImpl.getAdminByLgid(admin);
announce.setPromulgator(admin);
announce.setMember(order.getMember());
announce.setAlert(Announce.ALERT_VIEW);
if(msg.getCxlRejReason().getTagValue()!=null){
switch(Integer.parseInt(msg.getCxlRejReason().getTagValue())){
case 0:
announce.setContent("原因:撤单太晚(Too late to cancel)");
break;
case 1:
announce.setContent("原因:未知订单(Unknown order)");
break;
case 2:
announce.setContent("原因:自选原因(Broker / Exchange Option)");
break;
case 3:
announce.setContent("原因:正在撤消(Order already in Pending Cancel or Pending Replace status)");
break;
case 4:
announce.setContent("原因:不能群组撤单(Unable to process Order Mass Cancel Request)");
break;
case 5:
announce.setContent("原因:订单时间不匹配(OrigOrdModTime (586) did not match last TransactTime (60) of order)");
break;
case 6:
announce.setContent("原因:收到重复单(Duplicate ClOrdID (11) received)");
break;
case 7:
announce.setContent("原因:价格超过当前价(Price exceeds current price)");
break;
case 8:
announce.setContent("原因:价格超过价格范围(Price exceeds current price band)");
break;
default:
announce.setContent("原因:其他(Other)");
break;
}
}else{
announce.setContent("原因:其他(Other)");
}
csuLog.log_INFO("错误恢复-取消或修改订单被拒[resean="+announce.getContent()+"]");
announce.setTitle("取消或修改订单被拒");
Calendar ca=new GregorianCalendar();
ca.setTime(new Date());
ca.add(GregorianCalendar.MONTH, 1);
announce.setEndTime(ca.getTime());//结束时间为发布起一个月
announce.setDestType(Announce.DEST_TYPE_MEMBER);
announceServiceImpl.addAnnounce(announce);
csuLog.log_INFO("错误恢复-发送通知给用户[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[title="+announce.getTitle()+"],[content="+announce.getContent()+"]");
}
private void doRejectMsgHandler(BaseMsg message)throws Exception{
RejectMsg msg=(RejectMsg)message;
if(msg.getSessionRejectReason().getTagValue()!=null){
switch(Integer.parseInt(msg.getSessionRejectReason().getTagValue())){
case 0:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Invalid Tag Number],[text="+msg.getText().getTagValue()+"]");
break;
case 1:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Required Tag Missing],[text="+msg.getText().getTagValue()+"]");
break;
case 2:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Tag not defined for this message type],[text="+msg.getText().getTagValue()+"]");
break;
case 3:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Undefined tag],[text="+msg.getText().getTagValue()+"]");
break;
case 4:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Tag specified without a value],[text="+msg.getText().getTagValue()+"]");
break;
case 5:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Value is incorrect (out of range) for this tag],[text="+msg.getText().getTagValue()+"]");
break;
case 6:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Incorrect data format for value],[text="+msg.getText().getTagValue()+"]");
break;
case 7:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Decryption problem],[text="+msg.getText().getTagValue()+"]");
break;
case 8:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Signature problem],[text="+msg.getText().getTagValue()+"]");
break;
case 9:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=CompID problem],[text="+msg.getText().getTagValue()+"]");
break;
case 10:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=SendingTime Accuracy Problem],[text="+msg.getText().getTagValue()+"]");
break;
case 11:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Invalid MsgType],[text="+msg.getText().getTagValue()+"]");
break;
case 12:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=XML Validation Error],[text="+msg.getText().getTagValue()+"]");
break;
case 13:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Tag appears more than once],[text="+msg.getText().getTagValue()+"]");
break;
case 14:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Tag specified out of required order],[text="+msg.getText().getTagValue()+"]");
break;
case 15:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Repeating group fields out of order],[text="+msg.getText().getTagValue()+"]");
break;
case 16:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Incorrect NumInGroup count for repeating group],[text="+msg.getText().getTagValue()+"]");
break;
case 17:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Non Data value includes field delimiter (<SOH> character)],[text="+msg.getText().getTagValue()+"]");
break;
case 18:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Invalid/Unsupported Application Version],[text="+msg.getText().getTagValue()+"]");
break;
default:
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Other],[text="+msg.getText().getTagValue()+"]");
break;
}
}else{
csuLog.log_INFO("错误恢复-消息会话层被拒[RefSeqNum="+msg.getRefSeqNum().getTagValue()+"],[RefMsgType="+msg.getRefMsgType().getTagValue()+"],[reason=Other],[text="+msg.getText().getTagValue()+"]");
}
IAnnounceService announceServiceImpl=(IAnnounceService)ApplicationContextUtil.getApplicationContext().getBean("announceServiceImpl");
IOrderService orderServiceImpl=(IOrderService)ApplicationContextUtil.getApplicationContext().getBean("orderServiceImpl");
IAdminService adminServiceImpl=(IAdminService)ApplicationContextUtil.getApplicationContext().getBean("adminServiceImpl");
String dbid=SeqNumAndDatabaseIdMap.get(msg.getRefSeqNum().getTagValue());
IMemberService memberServiceImpl=(IMemberService)ApplicationContextUtil.getApplicationContext().getBean("memberServiceImpl");
IFundLogService fundLogServiceImpl=(IFundLogService)ApplicationContextUtil.getApplicationContext().getBean("fundLogServiceImpl");
IFreezeRecordService freezeRecordServiceImpl=(IFreezeRecordService)ApplicationContextUtil.getApplicationContext().getBean("freezeRecordServiceImpl");
IStockHoldService stockHoldServiceImpl=(IStockHoldService)ApplicationContextUtil.getApplicationContext().getBean("stockHoldServiceImpl");
Order order=new Order();
order.setId(Integer.parseInt(dbid));
order=((IBaseService<Order>)orderServiceImpl).get(order);
Member member=order.getMember();
if(msg.getRefMsgType().getTagValue().equals("D")){//NewOrderSingle
try {
if(order.getTransType().equals(Order.TRANSTYPE_BUY)){
if(order.getState().equals(Constant.ORDER_STATUS_CREATE_NOT_SUBMIT)){
csuLog.log_INFO("错误恢复-修改前用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balance="+member.getBalance()+"],[freeze="+member.getAmtFrozen()+"]");
double money=order.getPrice()*order.getWaitTrans();
member.setBalance(member.getBalance()+money);
member.setAmtFrozen(member.getAmtFrozen()-money);
((IBaseService<Member>)memberServiceImpl).modify(member);
csuLog.log_INFO("错误恢复-修改后用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceTotal="+member.getBalance()+"][balanceAmt="+money+"],[freezeTotal="+member.getAmtFrozen()+"],[freezeAmt="+(-money)+"]");
FundLog fundLog=new FundLog();
fundLog.setAmount(money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("订单下单会话层被拒[id="+order.getId()+"]删除订单");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[order="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]");
((IBaseService<Order>)orderServiceImpl).delete(order);
csuLog.log_INFO("错误恢复-删除被拒订单[lgid="+member.getLgid()+"],[orderId="+order.getId()+"]");
FreezeRecord freezeRecord=freezeRecordServiceImpl.getByOrderIdAndUserId(order.getId(), order.getMember().getId());
((IBaseService<FreezeRecord>)freezeRecordServiceImpl).delete(freezeRecord);
csuLog.log_INFO("错误恢复-删除资金冻结[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+freezeRecord.getAmt()+"]");
}else{
csuLog.log_ERROR("错误恢复-订单状态错误应该为"+Constant.ORDER_STATUS_CREATE_NOT_SUBMIT+"实际为"+order.getState());
}
}else if(order.getTransType().equals(Order.TRANSTYPE_SELL)){
if(order.getState().equals(Constant.ORDER_STATUS_CREATE_NOT_SUBMIT)){
((IBaseService<Order>)orderServiceImpl).delete(order);
csuLog.log_INFO("错误恢复-删除被拒订单[lgid="+member.getLgid()+"],[orderId="+order.getId()+"]");
StockHold stockHold=stockHoldServiceImpl.getByProductIdAndUserId(order.getProduct().getId(), order.getMember().getId());
if(stockHold==null){
csuLog.log_ERROR("错误恢复-StockHold为空[orderId="+order.getId()+"],[productName="+order.getProduct().getName()+"],[lgid="+order.getMember().getLgid()+"]");
}else{
stockHold.setAmt(stockHold.getAmt()+order.getQuantity());
((IBaseService<StockHold>)stockHoldServiceImpl).modify(stockHold);
}
csuLog.log_INFO("错误恢复-修改持股数量[lgid="+order.getMember().getLgid()+"],[orderId="+order.getId()+"],[product="+order.getProduct().getName()+"],[amt="+order.getQuantity()+"],[total="+stockHold.getAmt()+"]");
}else{
csuLog.log_ERROR("错误恢复-订单状态错误应该为"+Constant.ORDER_STATUS_CREATE_NOT_SUBMIT+"实际为"+order.getState());
}
}else{
csuLog.log_ERROR("错误恢复-RejectMessageHandler内部错误,TransType错误[tt="+order.getTransType()+"]");
}
}catch(Exception e){
logger.error("执行数据库错误", e);
}
}else if(msg.getRefMsgType().getTagValue().equals("F")){//OrderCancelRequest
order.setState(order.getLastState());
try {
((IBaseService<Order>)orderServiceImpl).modify(order);
} catch (Exception e) {
logger.error("执行数据库错误", e);
}
}else if(msg.getRefMsgType().getTagValue().equals("G")){//OrderCancelReplaceRequest
if(order.getTransType().equals(Order.TRANSTYPE_BUY)){
double money=order.getPrice()*order.getWaitTrans()-order.getLastAmt()*order.getLastPrice();
order.setState(order.getLastState());
order.setPrice(order.getLastPrice());
order.setQuantity(order.getQuantity()+order.getLastAmt()-order.getWaitTrans());
order.setWaitTrans(order.getLastAmt());
csuLog.log_INFO("错误恢复-修改前用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balance="+member.getBalance()+"],[freeze="+member.getAmtFrozen()+"]");
member.setBalance(member.getBalance()+money);
member.setAmtFrozen(member.getAmtFrozen()-money);
try {
((IBaseService<Member>)memberServiceImpl).modify(member);
csuLog.log_INFO("错误恢复-修改后用户资金余额和冻结总额[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[balanceTotal="+member.getBalance()+"][balanceAmt="+money+"],[freezeTotal="+member.getAmtFrozen()+"],[freezeAmt="+(-money)+"]");
FreezeRecord freezeRecord=freezeRecordServiceImpl.getByOrderIdAndUserId(order.getId(), order.getMember().getId());
freezeRecord.setAmt(freezeRecord.getAmt()-money);
((IBaseService<FreezeRecord>)freezeRecordServiceImpl).modify(freezeRecord);
csuLog.log_INFO("错误恢复-修改资金冻结[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+(-money)+"],[freezeTotal="+freezeRecord.getAmt()+"]");
} catch (Exception e) {
logger.error("执行数据库错误", e);
}
//记录资金明细
FundLog fundLog=new FundLog();
fundLog.setAmount(money);
fundLog.setBalance(member.getBalance());
fundLog.setIp("127.0.0.1");
fundLog.setLaType(FundLog.LATYPE_TD_TAD);
fundLog.setLog("订单修改会话层被拒[id="+order.getId()+"]回退到前一个状态");
fundLog.setLpType(FundLog.LATYPE_TD_TDD);
fundLog.setMember(member);
fundLog.setTime(new Date());
try {
((IBaseService<FundLog>)fundLogServiceImpl).add(fundLog);
csuLog.log_INFO("错误恢复-新增资金明细[lgid="+member.getLgid()+"],[order="+order.getId()+"],[amt="+fundLog.getAmount()+"],[balance="+fundLog.getBalance()+"]");
((IBaseService<Order>)orderServiceImpl).modify(order);
} catch (Exception e) {
logger.error("执行数据库错误", e);
}
}else if(order.getTransType().equals(Order.TRANSTYPE_SELL)){
order.setState(order.getLastState());
order.setPrice(order.getLastPrice());
order.setQuantity(order.getQuantity()+order.getLastAmt()-order.getWaitTrans());
order.setWaitTrans(order.getLastAmt());
try {
((IBaseService<Order>)orderServiceImpl).modify(order);
StockHold stockHold=stockHoldServiceImpl.getByProductIdAndUserId(order.getProduct().getId(), order.getMember().getId());
if(stockHold==null){
csuLog.log_ERROR("错误恢复-StockHold为空[orderId="+order.getId()+"],[productName="+order.getProduct().getName()+"],[lgid="+order.getMember().getLgid()+"]");
}else{
stockHold.setAmt(stockHold.getAmt()+order.getWaitTrans()-order.getLastAmt());
((IBaseService<StockHold>)stockHoldServiceImpl).modify(stockHold);
}
csuLog.log_INFO("错误恢复-用户持股数变动[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[amt="+(order.getWaitTrans()-order.getLastAmt())+"],[total="+stockHold.getAmt()+"]");
} catch (Exception e) {
logger.error("执行数据库错误", e);
}
}else{
csuLog.log_ERROR("错误恢复-RejectMessageHandler内部错误,TransType错误[tt="+order.getTransType()+"]");
}
}
Announce announce=new Announce();
announce.setBeginTime(new Date());
announce.setUpdateTime(new Date());
Admin admin=new Admin();
admin.setLgid("admin");
admin=adminServiceImpl.getAdminByLgid(admin);
announce.setPromulgator(admin);
announce.setMember(order.getMember());
announce.setAlert(Announce.ALERT_VIEW);
announce.setTitle("操作失败");
announce.setContent("消息错误,操作失败");
Calendar ca=new GregorianCalendar();
ca.setTime(new Date());
ca.add(GregorianCalendar.MONTH, 1);
announce.setEndTime(ca.getTime());//结束时间为发布起一个月
announce.setDestType(Announce.DEST_TYPE_MEMBER);
announceServiceImpl.addAnnounce(announce);
csuLog.log_INFO("错误恢复-向用户发送通知[lgid="+member.getLgid()+"],[orderId="+order.getId()+"],[title="+announce.getTitle()+"],[content="+announce.getContent()+"]");
}
}
fix协议封装挑战-DbFailExecuteThreadHandler
最新推荐文章于 2020-05-13 10:33:03 发布