fix协议封装挑战-BusinessMessageRejectMessageHandler

package cs.mina.client.handler;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

import org.apache.log4j.Logger;
import org.apache.mina.core.session.IoSession;
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.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.MessageMap;
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.NewOrderSingleMsg;
import cs.mina.codec.msg.OrderCancelReplaceRequestMsg;
import cs.service.IAdminService;
import cs.service.IAnnounceService;
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 csulog.CSULog;

/*
 *@author(huangxiaoping)
 *@date 2013-12-2
 */
public class BusinessMessageRejectMessageHandler implements
		ClientMessageHandler {
	private static final Logger logger=Logger.getLogger(BusinessMessageRejectMessageHandler.class);
	private static final CSULog csuLog=CSULog.getInstance();
	@Override
	public void doHandler(IoSession session, BaseMsg message) {
		DataSourceTransactionManager txManager=(DataSourceTransactionManager)ApplicationContextUtil.getApplicationContext().getBean("transactionManager");
		DefaultTransactionDefinition def = new DefaultTransactionDefinition();
		def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
		TransactionStatus status = txManager.getTransaction(def);
		try {
			BusinessMessageRejectMsg msg=(BusinessMessageRejectMsg)message;
			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));
			//BaseMsg baseMsg=MessageMap.getMessageBySeqNum(msg.getRefSeqNum().getTagValue());
			
			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)){
				//NewOrderSingleMsg orderMsg=(NewOrderSingleMsg)baseMsg;
				//String side=orderMsg.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+"]");
				}
				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()+"]");
			
			txManager.commit(status);
		} catch (Exception e) {
			txManager.rollback(status);
			DbFail fail=new DbFail();
			fail.setMsg(message);
			DbFailModule.getInstance().addFail(fail);
			
			csuLog.log_ERROR("执行报告发生异常,回滚事务,将执行报告放入错误重新执行线程");
			logger.error("执行数据库错误", e);
		}
	}

}

  • 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、付费专栏及课程。

余额充值