/**
  * 新增/修改(第三方调用,会同时维护经销商购买的服务表)
  *
  * @param dealerBuySerLog refrenceId 经销商购买的服务表的主键(由第三方调用者提供) dealerBuyServiceId
  *     经销商购买的服务的主键(由第三方调用者提供,若记录不存在:新增、记录已存在:修改) dealerId 经销商编号(必填) dealerName 经销商名称 serviceId
  *     服务编号(必填) servicerCate 服务类别(读字典:字典编码 servicerCate)(必填) buyNum 购买数量(必填) buyMoney 购买的金额(必填)
  *     chargType 购买类型(1:续期、2:增加数量)(必填) beginTime 服务开始时间 endTime 服务结束时间
  * @author 周光暖
  */
 @Override
 public DealerBuyService saveByClient(DealerBuySerLog dealerBuySerLog) throws BusinessException {
   DealerBuyService dealerBuyService = builtDealerBuyService(dealerBuySerLog);
   // 判断服务是否存在
   if (!webServiceItemsService.isExist(
       dealerBuySerLog.getServiceId(),
       dealerBuySerLog.getServicerCate(),
       dealerBuySerLog.getChargType())) {
     throw new BusinessException(ClientConst.PARAMERROR.code, "网站服务不存在");
   }
   DealerBuyService dbDealerBuyService =
       this.findBy(dealerBuySerLog.getDealerId(), dealerBuySerLog.getServiceId());
   if (null == dbDealerBuyService) {
     dealerBuyService.setRefrenceId(SerialnoUtils.buildPrimaryKey());
     dealerBuyService.setCreateTime(CalendarUtils.getCurrentLong());
     this.handChargType(dealerBuyService, null);
     this.insertSelective(dealerBuyService);
   } else {
     dealerBuyService.setRefrenceId(dbDealerBuyService.getRefrenceId());
     this.handChargType(dealerBuyService, dbDealerBuyService);
     dealerBuyService.setBuyMoney(
         dealerBuyService.getBuyMoney().add(dbDealerBuyService.getBuyMoney()));
     this.updateByPrimaryKeySelective(dealerBuyService);
   }
   dealerBuySerLog.setBuyTime(dealerBuyService.getBuyTime());
   dealerBuySerLog.setEndTime(dealerBuyService.getEndTime());
   dealerBuySerLogService.createDealerBuySerLog(dealerBuySerLog);
   return dealerBuyService;
 }
 /**
  * 处理不同的支付类型
  *
  * @param dealerBuyService
  * @param oldDealerBuyService
  * @author 周光暖
  */
 private void handChargType(
     DealerBuyService dealerBuyService, DealerBuyService oldDealerBuyService) {
   short chargType = dealerBuyService.getChargType();
   if (DealerConstant.DealerBuySerLog.CHARGE_TYPE_RENEW == chargType) // 续期
   {
     WebServiceItems webServiceItems =
         webServiceItemsService.selectByPrimaryKey(dealerBuyService.getServiceId());
     if (null == webServiceItems) {
       throw new IllegalArgumentException("网站服务不存在");
     }
     Long beginTime = dealerBuyService.getBeginTime();
     Long endTime = 0L;
     Double buyNum = 1D;
     if (webServiceItems.getRefrenceId().equals("S005")) {
       buyNum = 30D * 2D;
       endTime = new DateTime(beginTime).plusDays(buyNum.intValue()).toDate().getTime();
     } else {
       endTime = new DateTime(beginTime).plusYears(buyNum.intValue()).toDate().getTime();
     }
     if (webServiceItems.getPrice() != BigDecimal.ZERO) {
       buyNum = dealerBuyService.getBuyMoney().divide(webServiceItems.getPrice(), 2).doubleValue();
       if (buyNum.intValue() < 1) {
         throw new IllegalArgumentException("购买数量不能小于1");
       }
       endTime = new DateTime(beginTime).plusYears(buyNum.intValue()).toDate().getTime();
     }
     if (null == beginTime) {
       throw new IllegalArgumentException("服务开始时间不能为空");
     }
     if (null != oldDealerBuyService) {
       Long oldEndTime =
           null == oldDealerBuyService.getEndTime() ? 0l : oldDealerBuyService.getEndTime();
       if (com.zttx.web.utils.CalendarUtils.getCurrentLong() < oldEndTime) // 服务未过期
       {
         endTime = new DateTime(oldEndTime).plusYears(buyNum.intValue()).toDate().getTime();
         beginTime = oldDealerBuyService.getBeginTime();
       } else {
         endTime =
             new DateTime(com.zttx.web.utils.CalendarUtils.getCurrentLong())
                 .plusYears(buyNum.intValue())
                 .toDate()
                 .getTime();
         beginTime = oldDealerBuyService.getBeginTime();
       }
     }
     dealerBuyService.setEndTime(endTime);
     dealerBuyService.setBeginTime(beginTime);
   } else if (DealerConstant.DealerBuySerLog.CHARGE_TYPE_RAISE == chargType) // 增加数量
   {
     dealerBuyService.setBeginTime(null);
     dealerBuyService.setEndTime(null);
   }
 }