fix协议封装挑战-DbFailExecuteThreadHandler

xiaoxiao2021-02-28  81

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()+"]"); } }
转载请注明原文地址: https://www.6miu.com/read-52111.html

最新回复(0)