package com.chinacreator.videoalliance.order.service; import com.chinacreator.common.exception.BusinessException; import com.chinacreator.common.util.URLUtil; import com.chinacreator.videoalliance.common.dao.DictionaryDao; import com.chinacreator.videoalliance.order.bean.*; import com.chinacreator.videoalliance.order.dao.*; import com.chinacreator.videoalliance.order.util.JsonUtil; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.commons.lang.time.DateFormatUtils; import org.apache.commons.lang.time.DateUtils; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.sql.SQLException; import java.text.ParseException; import java.util.*; @Component public class EcbService { private static Logger log = Logger.getLogger(EcbService.class); @Autowired private ECBConfigDao ecbConfigDao; @Autowired private DictionaryDao dictionaryDao; @Autowired private EcbOrderWhiteDao ecbOrderWhiteDao; @Autowired private SPDao spDao; @Autowired private EcbProductDao ecbProductDao; @Autowired private EcbDiscntDao ecbDiscntDao; public String query(String userid, String cpid, String spid, String province) throws Exception { String brand = ""; //用户品牌 ECBBean bean = this.ecbConfigDao.findByCP(cpid, spid, province); bean = null; if ((bean != null) && (bean.getStatus() == 0)) { String result = null; try { result = URLUtil.get( this.dictionaryDao.getValue("ecbUrl") + "?userid=" + userid + "&cpid=" + cpid + "&spid=" + spid, NumberUtils.toInt(this.dictionaryDao.getValue("ecbTimeout"))); } catch (Exception e) { e.printStackTrace(); } if (result != null) { Map map = JsonUtil.jsonToMap(result); if ((!map.get("resultCode").toString().equals("0")) && (!map.get("resultCode").toString().equals("10003"))) { String errorInfo = "用户三户查询结果异常"; throw new BusinessException((String)map.get("resultCode"), errorInfo, new String[0]); } //判断是否4G用户 if(map.get("brand") != null && !"".equals(map.get("brand"))){ brand = map.get("brand").toString(); } if(StringUtils.isNotEmpty(bean.getLimit()) && map.get("pacakge") != null && StringUtils.isNotEmpty(map.get("pacakge").toString())) { String[] strLimt = bean.getLimit().split("\\|\\|"); if(strLimt != null && strLimt.length>0) { for (String string : strLimt) { if(map.get("pacakge").toString().contains(string.replaceAll("\\*", ""))) { if(this.ecbOrderWhiteDao.queryEcbJoinWhite(cpid,spid,province,userid)){ }else{ throw new BusinessException("10004","三户套餐限制"); } } } } } } } return brand; } public String order(String userid, String cpid, String spid, EcbProductInfo ecbProductInfo) throws Exception { String resultCode = "0"; String errorInfo = ""; int temp = 0; long begintime = System.currentTimeMillis(); try { EcbProductInfo info = null; if (ecbProductInfo != null) { info = ecbProductInfo; } else { EcbResponseBean ecbResponseBean = queryPorduct(userid, cpid, spid, "0", null, spid.equals("1150") ? "1" :"0"); info = (EcbProductInfo)ecbResponseBean.getUserProductInfo().getProductInfos().get(0); ecbProductInfo = info; } if ((StringUtils.isEmpty(info.getDiscntStartDate())) || (NumberUtils.toLong(info.getDiscntStartDate()) < NumberUtils.toLong(DateFormatUtils.format(new Date(), "yyyyMMddHHmmss")))) { info.setDiscntStartDate(DateFormatUtils.format(new Date(), "yyyyMMddHHmmss")); } temp = 1; ecb(info, "0", userid, cpid, spid); } catch (Exception e) { log.error("订购失败", e); if ((e instanceof BusinessException)) { resultCode = ((BusinessException)e).getCode(); errorInfo = ((BusinessException)e).getMessage(); } else { resultCode = "8000"; errorInfo = "系统忙!"; } SPInfo spInfo = this.spDao.findById(spid); if (spInfo.getErrorhandle() == 1) throw e; } finally { saveLog(userid, resultCode, "0", errorInfo, cpid, spid, temp+"", (System.currentTimeMillis() - begintime)+""); } return resultCode; } public String order(String userid, String cpid, String spid) throws Exception { return order(userid, cpid, spid, null); } public String cancelOrder(String userid, String cpid, String spid, String ordertime, EcbProductInfo productInfo) throws Exception { String resultCode = "0"; String errorInfo = ""; int temp = 0; long begintime = System.currentTimeMillis(); try { EcbProductInfo info = null; if (productInfo != null) { info = productInfo; } else { EcbResponseBean ecbResponseBean = queryPorduct(userid, cpid, spid, "1", null, spid.equals("1150") ? "1" :"0"); info = (EcbProductInfo)ecbResponseBean.getUserProductInfo().getProductInfos().get(0); if ((StringUtils.isEmpty(info.getDiscntCode())) && (StringUtils.isEmpty(info.getPackageCode())) && (StringUtils.isEmpty(info.getProductId()))) { EcbProductInfo ecbProductInfo = this.ecbProductDao.queryEcbProductByUser(userid); if (ecbProductInfo == null) { throw new BusinessException("9032", "ecb退订失败,本地无资费信息", new String[0]); } productInfo = info; } if ((info.getDiscntOrderState() != null) && (info.getDiscntOrderState().equals("2"))) { throw new BusinessException("9031", "ecb禁止用户退订", new String[0]); } } if ((StringUtils.isEmpty(info.getDiscntStartDate())) || (NumberUtils.toLong(info.getDiscntStartDate()) < NumberUtils.toLong(DateFormatUtils.format(new Date(), "yyyyMMddHHmmss")))) { info.setDiscntStartDate(DateFormatUtils.format(new Date(), "yyyyMMddHHmmss")); } info.setDiscntEndDate(getLastDay(DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"))); temp = 1; ecb(info, "1", userid, cpid, spid); } catch (Exception e) { log.error("退订失败", e); if ((e instanceof BusinessException)) { resultCode = ((BusinessException)e).getCode(); errorInfo = ((BusinessException)e).getMessage(); } else { resultCode = "8000"; errorInfo = "系统忙!"; } if (this.spDao.findById(spid).getErrorhandle() == 1) throw e; } finally { saveLog(userid, resultCode, "1", errorInfo, cpid, spid, temp+"", (System.currentTimeMillis() - begintime)+""); } return resultCode; } public String cancelOrder(String userid, String cpid, String spid, String ordertime) throws Exception { return cancelOrder(userid, cpid, spid, ordertime, null); } public void ecb(EcbProductInfo info, String type, String userid, String cpid, String spid) throws Exception { String url =dictionaryDao.getValue("ecbOrderUrl")+ "?userid=" + userid + "&cpid=" + cpid + "&spid=" + spid + "&productId=" + info.getProductId() + "&packageCode=" + info.getPackageCode() + "&discntCode=" + info.getDiscntCode() + "&type=" + type + "&starttime=" + info.getDiscntStartDate() + "&endtime=" + info.getDiscntEndDate(); if (NumberUtils.toLong(info.getDiscntStartDate()) > NumberUtils.toLong(DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"))) { url = url + "&startEnable=1"; } String resultstr = URLUtil.get(url, NumberUtils.toInt(this.dictionaryDao.getValue("ecbTimeout"))); log.info("order/cancelresultstr====" + resultstr); Map resultMap = JsonUtil.jsonToMap(resultstr); if (!((String)resultMap.get("resultCode")).equals("0")) throw new BusinessException((String)resultMap.get("resultCode"), (String)resultMap.get("errorInfo"), new String[0]); } public String ecbxml(EcbProductInfo info, String type, String userid, String cpid, String spid) throws Exception { String url = dictionaryDao.getValue("ecbOrderUrl")+"?userid=" + userid + "&cpid=" + cpid + "&spid=" + spid + "&productId=" + info.getProductId() + "&packageCode=" + info.getPackageCode() + "&discntCode=" + info.getDiscntCode() + "&type=" + type + "&starttime=" + info.getDiscntStartDate() + "&endtime=" + info.getDiscntEndDate() + "&needxml=0"; if (NumberUtils.toLong(info.getDiscntStartDate()) > NumberUtils.toLong(DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"))) { url = url + "&startEnable=1"; } String resultstr = URLUtil.get(url, NumberUtils.toInt(this.dictionaryDao.getValue("ecbTimeout"))); return resultstr; } public EcbResponseBean queryPorduct(String userid, String cpid, String spid, String type, String channel, String distinctType) throws Exception { String result = URLUtil.get(dictionaryDao.getValue("ecbProductUrl")+"?userid=" + userid + "&cpid=" + cpid + "&spid=" + spid, NumberUtils.toInt(this.dictionaryDao.getValue("ecbTimeout"))); log.info("result====" + userid + ":" + result); EcbResponseBean infos = (EcbResponseBean)JsonUtil.jsonToBean(result, EcbResponseBean.class); log.info("infos====" + userid + ":" + JsonUtil.objectToJson(infos)); if ((!infos.getResultCode().equals("0")) && ((!type.equals("1")) || (!infos.getCode().equals("8888")))) { throw new BusinessException(infos.getResultCode(), infos.getErrorInfo(), new String[0]); } if (infos.getUserProductInfo() == null) { throw new BusinessException("9036", "无产品信息", new String[0]); } if ((infos.getUserProductInfo().getProductInfos() == null) || (infos.getUserProductInfo().getProductInfos().size() == 0)) { throw new BusinessException("9034", "资费信息信息不全", new String[0]); } List infoList = null; if ((StringUtils.isNotEmpty(channel)) && (channel.equals("H5_ko"))){ DiscntInfo discntInfo = ecbDiscntDao.queryByUserid(userid, distinctType, 0); if(discntInfo != null){ infoList = new ArrayList(); EcbProductInfo channelEcbProductInfo = new EcbProductInfo(); channelEcbProductInfo.setDiscntCode(discntInfo.getDiscntid()); channelEcbProductInfo.setDiscntStartDate(discntInfo.getOrdertime()); channelEcbProductInfo.setDiscntEndDate(discntInfo.getEndtime()); channelEcbProductInfo.setDiscntOrderState("3"); channelEcbProductInfo.setDiscntValue(discntInfo.getDiscnttype()); channelEcbProductInfo.setDiscntFee(discntInfo.getDiscntfee()); infoList.add(channelEcbProductInfo ); }else{ infoList = choseProductForSpecial(infos.getUserProductInfo().getProductInfos(), distinctType); } } else if ((StringUtils.isNotEmpty(channel)) && (channel.equals("H5_verify"))){ infoList = choseProductTest(infos.getUserProductInfo().getProductInfos(), distinctType); }else { infoList = choseProduct(infos.getUserProductInfo().getProductInfos(), distinctType); } log.info("infoList====" + userid + ":" + JsonUtil.objectToJson(infoList)); infos.getUserProductInfo().setProductInfos(infoList); if ((infoList == null) || (infoList.size() == 0)) { throw new BusinessException("9035", "未查询出用户资费信息", new String[0]); } return infos; } public EcbResponseBean queryPorductXML(String userid, String cpid, String spid, String type) throws Exception { String url = dictionaryDao.getValue("ecbProductUrl")+"?userid=" + userid + "&cpid=" + cpid + "&spid=" + spid + "&needxml=0"; String result = URLUtil.get(url, NumberUtils.toInt(this.dictionaryDao.getValue("ecbTimeout"))); EcbResponseBean infos = (EcbResponseBean)JsonUtil.jsonToBean(result, EcbResponseBean.class); return infos; } public EcbResponseBean queryPorduct(String userid, String cpid, String type, String channel, String distinctType) throws Exception { return queryPorduct(userid, cpid, "", type, channel, distinctType); } public List choseProductForSpecial(List infos, String discntType) throws ParseException { List returnBeans = new ArrayList(); List sdInfos = new ArrayList(); List infiniteInfos = new ArrayList(); for (EcbProductInfo ecbProductInfo : infos) { if ((StringUtils.isEmpty(ecbProductInfo.getDiscntValue())) || (ecbProductInfo.getDiscntValue().equals("0"))) sdInfos.add(ecbProductInfo); else { infiniteInfos.add(ecbProductInfo); } } if ((StringUtils.isEmpty(discntType)) || (discntType.equals("0"))) { EcbProductInfo info = choseProductForSpecialRule(sdInfos); if (info != null) returnBeans.add(info); } else if (discntType.equals("1")) { EcbProductInfo info = choseProductForSpecialRule(infiniteInfos); if (info != null) returnBeans.add(info); } else { EcbProductInfo info1 = choseProductForSpecialRule(sdInfos); if (info1 != null) { returnBeans.add(info1); } EcbProductInfo info2 = choseProductForSpecialRule(infiniteInfos); if (info2 != null) { returnBeans.add(info2); } } return returnBeans; } public EcbProductInfo choseProductForSpecialRule(List infos) throws ParseException { EcbProductInfo returnBean = null; System.out.println("infos size"+infos.size()); for (EcbProductInfo ecbProductInfo : infos) { String discntstartime = ecbProductInfo.getDiscntStartDate(); String discntendtime = ecbProductInfo.getDiscntEndDate(); if ((StringUtils.isEmpty(discntstartime)) || (StringUtils.isEmpty(discntendtime))) { continue; } discntstartime = format(discntstartime); discntendtime = format(discntendtime); if (ecbProductInfo.getDiscntOrderState().equals("3")) { ecbProductInfo.setDiscntStartDate(discntstartime); ecbProductInfo.setDiscntEndDate(discntendtime); if (returnBean == null) { returnBean = ecbProductInfo; }else if ((StringUtils.isEmpty(returnBean.getDiscntFee())) && (StringUtils.isNotEmpty(ecbProductInfo.getDiscntFee())) && (ecbProductInfo.getDiscntFee().equals("0"))) { returnBean = ecbProductInfo; } else if (NumberUtils.toInt(returnBean.getDiscntFee()) > NumberUtils.toInt(ecbProductInfo.getDiscntFee())) { returnBean = ecbProductInfo; } else { if (NumberUtils.toInt(returnBean.getDiscntFee()) != NumberUtils.toInt(ecbProductInfo.getDiscntFee())) { continue; } if (daysBetween(DateUtils.parseDate(ecbProductInfo.getDiscntStartDate().substring(0, 8), new String[] { "yyyyMMdd" }), DateUtils.parseDate(ecbProductInfo.getDiscntEndDate().substring(0, 8), new String[] { "yyyyMMdd" })) <= daysBetween(DateUtils.parseDate(returnBean.getDiscntStartDate().substring(0, 8), new String[] { "yyyyMMdd" }), DateUtils.parseDate(returnBean.getDiscntEndDate().substring(0, 8), new String[] { "yyyyMMdd" }))) continue; returnBean = ecbProductInfo; } } } if (returnBean != null) { if ((StringUtils.isEmpty(returnBean.getDiscntValue())) || (returnBean.getDiscntValue().equals("0"))) returnBean.setSpid("1040"); else if (returnBean.getDiscntValue().equals("1")) { returnBean.setSpid("1150"); } } return returnBean; } public static int daysBetween(Date smdate, Date bdate) throws ParseException { Calendar cal = Calendar.getInstance(); cal.setTime(smdate); long time1 = cal.getTimeInMillis(); cal.setTime(bdate); long time2 = cal.getTimeInMillis(); long between_days = (time2 - time1) / 86400000L; return Integer.parseInt(String.valueOf(between_days)); } public List choseProduct(List infos) { return choseProduct(infos, "0"); } public List choseWxcsProduct(List infos) { return choseProduct(infos, "1"); } public List choseProductTest(List infos, String discntType) { List returnBeans = new ArrayList(); List sdInfos = new ArrayList(); List infiniteInfos = new ArrayList(); for (EcbProductInfo ecbProductInfo : infos) { if ((StringUtils.isEmpty(ecbProductInfo.getDiscntValue())) || (ecbProductInfo.getDiscntValue().equals("0"))) sdInfos.add(ecbProductInfo); else { infiniteInfos.add(ecbProductInfo); } } if ((StringUtils.isEmpty(discntType)) || (discntType.equals("0"))) { EcbProductInfo info = choseProductRuleTest(sdInfos); if (info != null) returnBeans.add(info); } else if (discntType.equals("1")) { EcbProductInfo info = choseProductRuleTest(infiniteInfos); if (info != null) returnBeans.add(info); } else { EcbProductInfo info1 = choseProductRuleTest(sdInfos); if (info1 != null) { returnBeans.add(info1); } EcbProductInfo info2 = choseProductRuleTest(infiniteInfos); if (info2 != null) { returnBeans.add(info2); } } return returnBeans; } public List choseProduct(List infos, String discntType) { List returnBeans = new ArrayList(); List sdInfos = new ArrayList(); List infiniteInfos = new ArrayList(); for (EcbProductInfo ecbProductInfo : infos) { if ((StringUtils.isEmpty(ecbProductInfo.getDiscntValue())) || (ecbProductInfo.getDiscntValue().equals("0"))) sdInfos.add(ecbProductInfo); else { infiniteInfos.add(ecbProductInfo); } } if ((StringUtils.isEmpty(discntType)) || (discntType.equals("0"))) { EcbProductInfo info = choseProductRule(sdInfos); EcbProductInfo info2 = choseProductRule(infiniteInfos); if (info == null && info2 != null && info2.getDiscntOrderState().equals("2")){ returnBeans.add(info2); }else if(info != null && (!info.getDiscntOrderState().equals("1") || !info.getDiscntOrderState().equals("2")) && info2 != null && info2.getDiscntOrderState().equals("2")){ returnBeans.add(info2); }else{ if(info != null){ returnBeans.add(info); } } } else if (discntType.equals("1")) { EcbProductInfo info = choseProductRule(infiniteInfos); if (info != null){ returnBeans.add(info); } } else { EcbProductInfo info1 = choseProductRule(sdInfos); if (info1 != null) { returnBeans.add(info1); } EcbProductInfo info2 = choseProductRule(infiniteInfos); if (info2 != null) { returnBeans.add(info2); } } System.out.println("returnBeans:" + returnBeans.size()); return returnBeans; } public EcbProductInfo choseProductRuleTest(List infos) { EcbProductInfo returnBean = null; for (EcbProductInfo ecbProductInfo : infos) { String discntstartime = ecbProductInfo.getDiscntStartDate(); String discntendtime = ecbProductInfo.getDiscntEndDate(); if ((StringUtils.isEmpty(discntstartime)) || (StringUtils.isEmpty(discntendtime))) { discntstartime = DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"); discntendtime = "20170930235959"; } discntstartime = format(discntstartime); discntendtime = format(discntendtime); if (NumberUtils.toLong(discntstartime) > NumberUtils.toLong(getStartdateTest())) continue; if (NumberUtils.toLong(discntendtime) >= NumberUtils.toLong(getStartdateTest())) { ecbProductInfo.setDiscntStartDate(discntstartime); ecbProductInfo.setDiscntEndDate(discntendtime); if (returnBean == null) { returnBean = ecbProductInfo; } else if (NumberUtils.toInt(returnBean.getDiscntFee()) > NumberUtils.toInt(ecbProductInfo.getDiscntFee())) { returnBean = ecbProductInfo; } else { if ((NumberUtils.toInt(returnBean.getDiscntFee()) != NumberUtils.toInt(ecbProductInfo.getDiscntFee())) || (NumberUtils.toLong(discntendtime) <= NumberUtils.toLong(returnBean.getDiscntEndDate()))) continue; returnBean = ecbProductInfo; } } } if (returnBean != null) { if ((StringUtils.isEmpty(returnBean.getDiscntValue())) || (returnBean.getDiscntValue().equals("0"))) returnBean.setSpid("1040"); else if (returnBean.getDiscntValue().equals("1")) { returnBean.setSpid("1150"); } if (StringUtils.isEmpty(returnBean.getDiscntEndDate())) { returnBean.setDiscntEndDate("20170930235959"); } } System.out.println("testchose:" + JsonUtil.objectToJson(returnBean)); return returnBean; } public EcbProductInfo choseProductRule(List infos) { EcbProductInfo returnBean = null; for (EcbProductInfo ecbProductInfo : infos) { String discntstartime = ecbProductInfo.getDiscntStartDate(); String discntendtime = ecbProductInfo.getDiscntEndDate(); if ((StringUtils.isEmpty(discntstartime)) || (StringUtils.isEmpty(discntendtime))) { discntstartime = DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"); discntendtime = "20181231235959"; } discntstartime = format(discntstartime); discntendtime = format(discntendtime); if (NumberUtils.toLong(discntstartime) > NumberUtils.toLong(getStartdate())) continue; if (NumberUtils.toLong(discntendtime) >= NumberUtils.toLong(DateFormatUtils.format(new Date(), "yyyyMMddHHmmss"))) { ecbProductInfo.setDiscntStartDate(discntstartime); ecbProductInfo.setDiscntEndDate(discntendtime); if (returnBean == null) { returnBean = ecbProductInfo; } else if (NumberUtils.toInt(returnBean.getDiscntFee()) > NumberUtils.toInt(ecbProductInfo.getDiscntFee())) { returnBean = ecbProductInfo; } else { if ((NumberUtils.toInt(returnBean.getDiscntFee()) != NumberUtils.toInt(ecbProductInfo.getDiscntFee())) || (NumberUtils.toLong(discntendtime) < NumberUtils.toLong(returnBean.getDiscntEndDate()))) { continue; }else{ returnBean = ecbProductInfo; } } } } if (returnBean != null) { if ((StringUtils.isEmpty(returnBean.getDiscntValue())) || (returnBean.getDiscntValue().equals("0"))) returnBean.setSpid("1040"); else if (returnBean.getDiscntValue().equals("1")) { returnBean.setSpid("1150"); } if (StringUtils.isEmpty(returnBean.getDiscntEndDate())) { returnBean.setDiscntEndDate("20181231235959"); } } return returnBean; } public void saveLog(String userid, String resultCode, String type, String errorInfo, String cpid, String spid, String handle, String times) { EcbLogBean info = new EcbLogBean(); info.setTimes(times); info.setCpid(cpid); info.setSpid(spid); info.setUserid(userid); info.setResultCode(resultCode); info.setErrorInfo(errorInfo); info.setType(type); info.setHandle(handle); try { this.ecbProductDao.saveLogDao(info); } catch (SQLException e) { e.printStackTrace(); } } public static String getLastDay(String timeStr) throws ParseException { Calendar calendar = Calendar.getInstance(); if (!StringUtils.isEmpty(timeStr)) { calendar.setTime(DateUtils.parseDate(timeStr, new String[] { "yyyyMMddHHmmss" })); } calendar.set(5, calendar.getActualMaximum(5)); return DateFormatUtils.format(calendar, "yyyyMMdd") + "235959"; } public static String format(String numstr) { int size = 14; int neednum = 0; if (numstr.length() < 14) { neednum = size - numstr.length(); StringBuffer strb = new StringBuffer(); for (int i = 0; i < neednum; i++) { strb.append("0"); } return numstr + strb; } return numstr; } public static String getStartdate() { return DateFormatUtils.format(DateUtils.addMinutes(new Date(), 5), "yyyyMMddHHmmss"); } public static String getStartdateTest() { return DateFormatUtils.format(DateUtils.addMonths(new Date(), 1), "yyyyMMddHHmmss"); } public static void main(String[] args) throws Exception { String url = "http://114.255.201.238:8070/ecb/trans.do?userid=15607633608&cpid=changshi&spid=1050&productId=26674&packageCode=26674&discntCode=33051&type=1&starttime=20170918150909&endtime=20370930235959&startEnable=0&lproductId=26677&lpackageCode=26677&ldiscntCode=33054<ype=0&lstarttime=20171030000000&lendtime=20370101000000&lstartEnable=1"; String resultstr = URLUtil.get(url, 30000); System.out.println(resultstr); } }