fix协议封装挑战-DbFailExecuteThreadHandler

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()+"]");
	}
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hxpjava1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值