GEOneStationRule.java 8.58 KB
package com.sitech.ismp.coll.busi.e2e.rule;

import java.util.Date;
import java.util.List;
import java.util.Map;

import com.sitech.ismp.coll.busi.e2e.E2EConstant;
import com.sitech.ismp.coll.busi.e2e.dao.TbE2eCaOrderDao;
import com.sitech.ismp.coll.busi.e2e.dao.TbE2eIbpOrderDao;
import com.sitech.ismp.coll.busi.e2e.dao.TbE2eKxOrderDao;
import com.sitech.ismp.coll.busi.e2e.dao.TbE2eOneStopCrmOrderDao;
import com.sitech.ismp.coll.busi.e2e.dao.TbE2eOneStopOrderDao;
import com.sitech.ismp.coll.busi.e2e.dao.TbE2eOneStopOrderExceptDao;
import com.sitech.ismp.coll.busi.e2e.domain.TbE2eCaOrder;
import com.sitech.ismp.coll.busi.e2e.domain.TbE2eFile2dbFinishTag;
import com.sitech.ismp.coll.busi.e2e.domain.TbE2eIbpOrder;
import com.sitech.ismp.coll.busi.e2e.domain.TbE2eOneStopCrmOrder;
import com.sitech.ismp.coll.busi.e2e.domain.TbE2eOneStopKxOrder;
import com.sitech.ismp.coll.busi.e2e.domain.TbE2eOneStopOrder;
import com.sitech.ismp.coll.busi.e2e.domain.TbE2eOneStopOrderExcept;
import com.sitech.ismp.coll.busi.e2e.domain.TbE2eProcessFinishTag;
import com.sitech.util.Formater;
import com.sitech.util.JSONUtil;

/**
 * 政企一站式服务监控规则
 * 
 * @author LINXC
 */
public class GEOneStationRule extends AnalysisRule {
	private TbE2eOneStopOrderExceptDao exceptDao;

	public GEOneStationRule(Map<String, String> params) {
		super(params);
		exceptDao = new TbE2eOneStopOrderExceptDao(params);
	}

	/**入口*/
	protected void excute() {
		//取同一时间内CRM系统侧、IBP系统侧、客保系统侧、客响系统侧已经传送好FTP文件,并且未被分析处理过的标记列表
		List<TbE2eFile2dbFinishTag> tagList = fileFinishTagdao
				.selectTbE2eFile2dbFinishTagForOneStop(E2EConstant.FILE_TYPE_ONESTOP_CRM_ORDER, ZQYZS);
		if(mark(tagList)){
			for(TbE2eFile2dbFinishTag tag : tagList){
				Date fileTime = tag.getFILE_TIME();
				process(fileTime);
			}
		}
	}

	/**业务处理*/
	private void process(Date fileTime) {
		//CRM
		TbE2eOneStopCrmOrderDao crmOrderDao = new TbE2eOneStopCrmOrderDao(params);
		//客保
		TbE2eCaOrderDao caOrderDao = new TbE2eCaOrderDao(params);
		//客响
		TbE2eKxOrderDao kxOrderDao = new TbE2eKxOrderDao(params);
		//IBP
		TbE2eIbpOrderDao ibpOrderDao = new TbE2eIbpOrderDao(params);
		//
		TbE2eOneStopOrderDao orderDao = new TbE2eOneStopOrderDao(params);
		//取出本批次要处理的CRM数据
		List<TbE2eOneStopCrmOrder> crmOrderList = crmOrderDao.selectTbE2eOneStopCrmOrder(fileTime);
		if (crmOrderList == null || crmOrderList.size() == 0) {
			return;
		} 
		for(TbE2eOneStopCrmOrder crmOrder : crmOrderList){
			String crmId = crmOrder.getCRM_ORDER_ID();
			String p6Id = crmOrder.getP6_ID();
			TbE2eOneStopOrder order = new TbE2eOneStopOrder();
			//封装CRM数据
			packingCrmData(order, crmOrder);
			//拼接客保数据
			List<TbE2eCaOrder> caOrderList = caOrderDao.selectTbE2eCaOrderForOneStop(fileTime, crmId, p6Id);
			if (caOrderList != null && caOrderList.size() != 0) {
				TbE2eCaOrder caOrder = caOrderList.get(0);
				packingCaData(order, caOrder);
			}
			//拼接客响数据
			List<TbE2eOneStopKxOrder> kxOrderList = kxOrderDao.selectTbE2eOneStopKxOrder(fileTime, crmId, p6Id);
			if (kxOrderList != null && kxOrderList.size() != 0) {
				TbE2eOneStopKxOrder kxOrder = kxOrderList.get(0);
				packingKxData(order, kxOrder);
			}
			//拼接综资数据(从IBP中获取)
			List<TbE2eIbpOrder> ibpOrderList = ibpOrderDao.selectTbE2eIbpOrderForOneStop(crmId, p6Id);
			if (ibpOrderList != null && ibpOrderList.size() != 0) {
				TbE2eIbpOrder ibpOrder = ibpOrderList.get(0);
				packingZzData(order, ibpOrder);
			}

			
			//处理工单在客响系统是否超时
			if (order.getCUST_RESP_IN_DT() != null) {
				dealKxTimeOut(order);
			}
			
			if (isExit(orderDao, order)) {
				//已存在该数据。更新
				orderDao.editTbE2eOneStopOrder(order);
			} else {
				//插入数据
				orderDao.addTbE2eOneStopOrder(order);
			}
			//该条数据已完工的处理
			if (isFinished(order)) {
				if (order.getITEM_ID() != null && !order.getITEM_ID().equals("")) {
					if (isItemFinished(orderDao, order)) {
						//所属的项目号下其他数据是否已完工
						orderDao.moveTbE2eOneStopOrderToHistoryByItemId(order);
						orderDao.delTbE2eOneStopOrderByItemId(order);
					}
				} else {
					orderDao.moveTbE2eOneStopOrderToHistory(order);
					orderDao.delTbE2eOneStopOrder(order);
				}
			}
		}
	}
	
	/**封装CRM数据*/
	private void packingCrmData(TbE2eOneStopOrder order, TbE2eOneStopCrmOrder crmOrder) {
		order.setITEM_ID(crmOrder.getITEM_ID());
		order.setCONTRACT_ID_MAIN(crmOrder.getCONTRACT_ID_MAIN());
		order.setCONTRACT_ID_MINOR(crmOrder.getCONTRACT_ID_MINOR());
		order.setORIGINATE_BUREAU(dealOriginateBureau(crmOrder.getCONTRACT_ID_MAIN()));
		order.setCRM_ORDER_ID(crmOrder.getCRM_ORDER_ID());
		order.setCRM_ROW_NUM(crmOrder.getCRM_ROW_NUM());
		order.setDEVICE_NUM(crmOrder.getDEVICE_NUM());
		order.setCRM_SUBMIT_DT(crmOrder.getORDER_SUBMIT_TIME());
		order.setPAY_DT(crmOrder.getPAY_DT());
		order.setCRM_ROW_STATUS(crmOrder.getCRM_ROW_STATUS());
	}
	
	/**封装客保数据*/
	private void packingCaData(TbE2eOneStopOrder order, TbE2eCaOrder caOrder) {
		order.setKB_IN_DT(caOrder.getCA_CREATE_TIME());
		order.setKB_OUT_DT(caOrder.getRETURN2IBP_FIN_TIME());
		order.setKB_BOOKING_DT(caOrder.getSUBSCRIBE_START_TIME());
		order.setKB_DEAL_BUREAU(caOrder.getDISTICT_BUREAU());
		order.setKB_REFUSE_REASON(caOrder.getREFUSE_REASON());
		order.setKB_IS_TIMEOUT(caOrder.getIS_TIMEOUT());
		order.setKB_TIMEOUT_REASON(caOrder.getTIMEOUT_REASON());
		order.setKB_END_DT(caOrder.getRETURN2IBP_FIN_TIME());
	}
	
	/**封装客响数据*/
	private void packingKxData(TbE2eOneStopOrder order, TbE2eOneStopKxOrder kxOrder) {
		order.setCUST_RESP_IN_DT(kxOrder.getORDER_RECEIVE_DT());
		order.setCUST_RESP_OUT_DT(kxOrder.getORDER_FINISH_DT());
		order.setCUST_RESP_IS_HAD_RES(kxOrder.getIS_HAD_RESOURCE());
		order.setCUST_RESP_ACCEPT_BUREAU(kxOrder.getACCEPT_BUREAU());
	}
	
	/**处理工单在客响是否超时*/
	private void dealKxTimeOut(TbE2eOneStopOrder order) {
		//UNIT_ID = KBP_CLASS:主合同号-CRM订单号-CRM行项目号-分合同号
		String uContractIdMain = Formater.neatenunitid(order.getCONTRACT_ID_MAIN());
		String uCrmOrderId = Formater.neatenunitid(order.getCRM_ORDER_ID());
		String uCrmRowId = Formater.neatenunitid(order.getCRM_ROW_NUM());
		String uContractIdMinor = Formater.neatenunitid(order.getCONTRACT_ID_MINOR());
		String unitId = kbpClass + ":" + productType + "-" + uContractIdMain + "-"
			+ uCrmOrderId + "-" + uCrmRowId + "-" + uContractIdMinor;
		String kpiId = "PM-02-00-000-01";
		double beginDt = order.getCUST_RESP_IN_DT().getTime();
		double endDt = 0;
		if (order.getCUST_RESP_OUT_DT() != null) {
			endDt = order.getCUST_RESP_OUT_DT().getTime();
		} else {
			endDt = new Date().getTime();
		}
		String kpiValue = Double.toString((endDt - beginDt) / (60 * 60 * 1000));
		kpiValue = Formater.formatDecimalKpivalue(kpiValue);
		logger.info(unitId + "\t" + kpiId + "\t" +  kpiValue);	
		TbE2eOneStopOrderExcept except = new TbE2eOneStopOrderExcept(order, unitId, kpiId, kpiValue);
		String extEventInfo = JSONUtil.toJSON(except);
		if(kpiToEvent(unitId, kpiId, kpiValue,1, extEventInfo)){
			order.setCUST_RESP_IS_TIMEOUT("1");
			exceptDao.addTbE2eOneStopOrderExcept(except);
		}
	}
	
	/**封装综资数据(从IBP中取)*/
	private void packingZzData(TbE2eOneStopOrder order, TbE2eIbpOrder ibpOrder) {
		order.setZONGZI_IN_DT(ibpOrder.getIBP_SEND_OUTSYS_TIME());
		order.setP6_ID(ibpOrder.getP6_ID());
	}
	
	/**处理发起局*/
	private String dealOriginateBureau(String contractIdMain) {
		if (contractIdMain != null && !contractIdMain.equals("")) {
			return contractIdMain.split("-")[1];
		}
		return "";
	}
	
	/**工单是否已完成*/
	private boolean isFinished(TbE2eOneStopOrder order) {
		String rowStatus = order.getCRM_ROW_STATUS();
		return rowStatus != null && rowStatus.equals("完成");
	}
	
	private boolean isItemFinished(TbE2eOneStopOrderDao orderDao, TbE2eOneStopOrder order) {
		return orderDao.selectTbE2eOneStopOrderToNotFinish(order).size() == 0;
	}
	
	/**是否存在同样的工单数据*/
	private boolean isExit(TbE2eOneStopOrderDao orderDao, TbE2eOneStopOrder order) {
		return orderDao.selectTbE2eOneStopOrder(order).size() > 0;
	}

	/**
	 * 为已经分析过的文件打标记
	 */
	private boolean mark(List<TbE2eFile2dbFinishTag> tagList) {
		if (tagList == null || tagList.size() == 0) {
			logger.info("没有新的CRM订单,退出.");
			return false;
		}

		for (TbE2eFile2dbFinishTag tag : tagList) {
			TbE2eProcessFinishTag processTag = new TbE2eProcessFinishTag(tag, ZQYZS);
			processTagDao.insertTbE2eProcessFinishTag(processTag);
		}
		return true;
	}
}