@Override
  public Page<Device> queryDeviceByCon(
      String batchNo, String devSn, String devKsn, int startIndex, int pageSize) throws Exception {

    if (StringUtils.isBlank(batchNo) && StringUtils.isBlank(devSn) && StringUtils.isBlank(devKsn)) {
      return null;
    }

    List<Object> params = new ArrayList<Object>();
    StringBuilder sb = new StringBuilder();

    sb.append("from " + Device.class.getName() + " dev");

    sb.append(" where 1=1");

    if (StringUtils.isNotBlank(batchNo)) {
      sb.append(" and dev.batchNo like ?");
      params.add("%" + batchNo + "%");
    }

    if (StringUtils.isNotBlank(devSn)) {
      sb.append(" and dev.devSn like ?");
      params.add("%" + devSn + "%");
    }

    if (StringUtils.isNotBlank(devKsn)) {
      sb.append(" and dev.devKsn like ?");
      params.add("%" + devKsn + "%");
    }

    sb.append(" order by dev.devId asc");

    return find(sb.toString(), startIndex, pageSize, params.toArray(new Object[params.size()]));
  }
 @Override
 public boolean updatePayPwd(Long usrId, String loginPasswd, String newPayPwd) {
   boolean updateSuccess = false;
   MrchUsr mrchUsr = mrchUsrService.findById(usrId);
   if (mrchUsr == null || (!mrchUsr.isUsrState())) {
     logger.info("用户[" + usrId + "]不存在或者用户被禁用");
     throw new AppRTException(AppExCode.MRCH_USR_UNAVAILABLE, "用户不存在或者用户被禁用!");
   }
   if (StringUtils.isBlank(mrchUsr.getPayPwd())) {
     throw new AppRTException(
         AppExCode.PAY_PWD_NOT_EXIST, "mrchUsr[" + usrId + "] payPwd not exitst");
   }
   if (mrchUsr.getUsrPwd().equals(loginPasswd)) {
     mrchUsr.setPayPwd(newPayPwd);
     mrchUsrService.updateMrchUsr(mrchUsr);
     updateSuccess = true;
   } else {
     throw new AppRTException(AppExCode.MRCH_USR_PWD_ERROR, "修改支付密码失败,登录密码有误!");
   }
   return updateSuccess;
 }
  @Override
  public PayInfoResponse pay(PayInfoRequest request) {
    Long usrId = request.getUsrId();
    Assert.notNull(usrId, "usrId should not be null!");
    // 支付密码校验
    MrchUsr mrchUsr = mrchUsrService.findById(usrId);
    if (mrchUsr == null || (!mrchUsr.isUsrState())) {
      throw new AppRTException(
          AppExCode.MRCH_USR_UNAVAILABLE, "mrchUsr[" + usrId + "] not exist or disable!");
    }
    if (StringUtils.isBlank(mrchUsr.getPayPwd())) {
      throw new AppRTException(
          AppExCode.PAY_PWD_NOT_EXIST, "mrchUsr[" + usrId + "] payPwd not exitst");
    }
    if (!mrchUsr.getPayPwd().equalsIgnoreCase(request.getPayPwd())) {
      throw new AppRTException(AppExCode.PAY_PWD_ERROR, "payPwd error");
    }
    // 商户、门店校验
    Merchant merchant = merchantService.findMerchantByMrchNo(request.getMrchNo());
    if (merchant == null || !merchant.isAvailable()) {
      throw new AppRTException(
          AppExCode.MERCHANT_NOT_AVAILABLE, "merchant not exist!" + request.getMrchNo());
    }

    Store store = null;
    if (StringUtils.isNotBlank(request.getStoreNo())) {
      store = storeService.findByStoreNo(request.getStoreNo());
      if (store == null || !store.isAvailable()) {
        throw new AppRTException(
            AppExCode.STORE_NOT_AVAILABLE, "store not exist!" + request.getStoreNo());
      }
    }
    /** 交易流水是否重复* */
    String upSno = request.getTransToken();
    PayCCPC tempPayCCPC = payCCPCService.findPayCCPCByUpSno(upSno);
    if (tempPayCCPC != null) {
      logger.error("payCCPC[upSno:" + upSno + "] exist!!!");
      throw new AppRTException(AppExCode.TRADE_EXIST, "payCCPC[upSno:" + upSno + "] exist");
    }

    // 设置常用联系人 如果不存在则新增
    if (request.getIsFavoriteBnyAcc() != null) {
      if (request.getIsFavoriteBnyAcc()) {
        CCPCAccount temp =
            cCPCAccountService.findCCPCAccount(mrchUsr.getUsrLogin(), request.getBnyAccNo());
        if (temp == null) {
          CCPCAccount ccpcAccount = new CCPCAccount();
          ccpcAccount.setMrchNo(request.getMrchNo());
          ccpcAccount.setUsrLogin(mrchUsr.getUsrLogin());
          ccpcAccount.setRmtAccNo(request.getRmtAccNo());
          ccpcAccount.setBnyAccNo(request.getBnyAccNo());
          ccpcAccount.setBnyAccName(request.getBnyAccName());
          ccpcAccount.setBnyBankName(request.getBnyBankName());
          CCPCBank ccpcBank = ccpcBankService.findCCPCBankByBankName(request.getBnyBankName());
          ccpcAccount.setAbbrName(ccpcBank == null ? "DEFAULT" : ccpcBank.getAbbrName());
          cCPCAccountService.addCCPCAccount(ccpcAccount);
        }
      }
    }

    /** 构造支付流水* */
    String payNo = payNoGenerator.generate();
    Coordinate location = request.getLocation();

    /** 保存电子签名* */
    // 电子签名格式 payNo-transType.png
    boolean isSaveRmtEsignSuccess = false;
    boolean isSaveBnyEsignSuccess = false;
    if (request.getIsNeedBillInfo() != null && request.getIsNeedBillInfo()) {
      String rmtElecSignDataFileName =
          payNo + "-rmt" + "." + XPOSPClientUtils.ESIGNATURE_PICTURE_SUFFIX;
      String bnyElecSignDataFileName =
          payNo + "-bny" + "." + XPOSPClientUtils.ESIGNATURE_PICTURE_SUFFIX;
      isSaveRmtEsignSuccess =
          XPOSPClientUtils.saveElecsignPic(
              rmtElecSignDataFileName,
              request.getMrchNo(),
              request.getStoreNo(),
              request.getRmtElecsignData());
      isSaveBnyEsignSuccess =
          XPOSPClientUtils.saveElecsignPic(
              bnyElecSignDataFileName,
              request.getMrchNo(),
              request.getStoreNo(),
              request.getBnyElecsignData());
      request.setRmtElecsignData(null); // 由于电子签名数据量大,保存成功后清空
      request.setBnyElecsignData(null); // 由于电子签名数据量大,保存成功后清空
    }

    PayCCPC payCCPC = new PayCCPC();
    payCCPC.setPayNo(payNo);
    payCCPC.setMrchNo(request.getMrchNo());
    payCCPC.setMrchName(merchant.getMrchName());
    payCCPC.setStoreNo(request.getStoreNo());
    payCCPC.setStoreName(store == null ? null : store.getStoreName());
    payCCPC.setOperatorName(mrchUsr.getUsrName());
    payCCPC.setUpSno(upSno);
    payCCPC.setImei(request.getImei());
    payCCPC.setLatitude(location == null ? null : location.getLatitude());
    payCCPC.setLongitude(location == null ? null : location.getLongitude());
    payCCPC.setRmtAccNo(request.getRmtAccNo());
    payCCPC.setRmtBankName(request.getRmtBankName());
    payCCPC.setBnyAccNo(request.getBnyAccNo());
    payCCPC.setBnyAccName(request.getBnyAccName());
    payCCPC.setBnyBankName(request.getBnyBankName());
    payCCPC.setIsNeedBillInfo(
        request.getIsNeedBillInfo() == null ? false : request.getIsNeedBillInfo());
    payCCPC.setNotifyMobile(request.getNotifyMobile());
    payCCPC.setRmtElecsignStatus(
        isSaveRmtEsignSuccess ? Const.VLDSTATE_VALID : Const.VLDSTATE_INVALID);
    payCCPC.setBnyElecsignStatus(
        isSaveBnyEsignSuccess ? Const.VLDSTATE_VALID : Const.VLDSTATE_INVALID);
    payCCPC.setCnaps(request.getCnaps());
    payCCPC.setBnyAmt(request.getBnyAmt());
    payCCPC.setBnyRealAmt(request.getBnyAmt());
    payCCPC.setRemitStatus(CCPCConfig.REMIT_STATUS_CCPC_PROCESSING);
    payCCPC.setUsrLogin(mrchUsr.getUsrLogin());
    payCCPC.setRemark(request.getRemark());
    payCCPCService.addPayCCPC(payCCPC);
    // 对外付款
    payCCPC = remitProcess.pay(payCCPC);
    PayInfoResponse response = payCCPCToPayInfoResponse(payCCPC);
    return response;
  }