diff --git a/src/main/java/com/supwisdom/dlpay/bus/dao/CitizenCardverDao.java b/src/main/java/com/supwisdom/dlpay/bus/dao/CitizenCardverDao.java
index bd65241..f512c0a 100644
--- a/src/main/java/com/supwisdom/dlpay/bus/dao/CitizenCardverDao.java
+++ b/src/main/java/com/supwisdom/dlpay/bus/dao/CitizenCardverDao.java
@@ -6,9 +6,14 @@
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
+
 @Repository
 public interface CitizenCardverDao extends JpaRepository<TCitizenCardver, String> {
   @Modifying
   @Query(value = "update tb_citizen_cardver set status='closed' where status='normal' and cardvertype=?1 and cardno=?2 and cardverno<?3 ", nativeQuery = true)
   void doClosedHistoryRecords(String cardvertype, String cardno, String cardverno);
+
+  @Query(value = "from TCitizenCardver where cardverno>?1 and adddelflag<>0")
+  List<TCitizenCardver> findAllBlacklist(String cardverno);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/bus/service/BusConsumeService.java b/src/main/java/com/supwisdom/dlpay/bus/service/BusConsumeService.java
index 289ba99..5da2be4 100644
--- a/src/main/java/com/supwisdom/dlpay/bus/service/BusConsumeService.java
+++ b/src/main/java/com/supwisdom/dlpay/bus/service/BusConsumeService.java
@@ -1,4 +1,17 @@
 package com.supwisdom.dlpay.bus.service;
 
+import com.supwisdom.dlpay.bus.bean.*;
+
 public interface BusConsumeService {
+    BusDevLoginResp doLogin(BusDevLoginReq req);
+
+    BusSysparaResp doGetDevpara(BusSysparaReq req);
+
+    BusBlacklistResp doGetBlacklist(BusBlacklistReq req);
+
+    BusHeartBeatResp busHeartBeat(BusHeartBeatReq req);
+
+    BusDtlUploadResp saveOfflineDtl(BusdtlUploadReq req);
+
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/bus/service/impl/BusConsumeServiceImpl.java b/src/main/java/com/supwisdom/dlpay/bus/service/impl/BusConsumeServiceImpl.java
index a3541d2..f9104e9 100644
--- a/src/main/java/com/supwisdom/dlpay/bus/service/impl/BusConsumeServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/bus/service/impl/BusConsumeServiceImpl.java
@@ -1,9 +1,321 @@
 package com.supwisdom.dlpay.bus.service.impl;
 
+import com.supwisdom.dlpay.api.bean.DevparaBean;
+import com.supwisdom.dlpay.api.service.impl.PosPayServiceImpl;
+import com.supwisdom.dlpay.api.util.ErrorCode;
+import com.supwisdom.dlpay.bus.bean.*;
+import com.supwisdom.dlpay.bus.dao.CitizenCardDao;
+import com.supwisdom.dlpay.bus.dao.CitizenCardverDao;
+import com.supwisdom.dlpay.bus.domain.TCitizenCard;
+import com.supwisdom.dlpay.bus.domain.TCitizenCardver;
 import com.supwisdom.dlpay.bus.service.BusConsumeService;
+import com.supwisdom.dlpay.bus.service.CitizenCardService;
+import com.supwisdom.dlpay.bus.util.BusConstant;
+import com.supwisdom.dlpay.framework.dao.BusinessparaDao;
+import com.supwisdom.dlpay.framework.dao.SysparaDao;
+import com.supwisdom.dlpay.framework.domain.TShopSettlement;
+import com.supwisdom.dlpay.framework.domain.TSyspara;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.paysdk.proxy.CitizenCardPayProxy;
+import com.supwisdom.dlpay.paysdk.proxy.TransactionProxy;
+import com.supwisdom.dlpay.paysdk.proxy.UserProxy;
+import com.supwisdom.dlpay.restaurant.dao.*;
+import com.supwisdom.dlpay.restaurant.domain.*;
+import com.supwisdom.dlpay.restaurant.service.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
+
 @Service
 public class BusConsumeServiceImpl implements BusConsumeService {
 
+    private static final Logger logger = LoggerFactory.getLogger(PosPayServiceImpl.class);
+
+
+    @Autowired
+    private DeviceService deviceService;
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @Autowired
+    private TransDtlService transDtlService;
+    @Autowired
+    private OfflineTransDtlService offlineTransDtlService;
+    @Autowired
+    private SysparaDao sysparaDao;
+    @Autowired
+    private MealTypeDao mealTypeDao;
+    @Autowired
+    private DevparaBindDao devparaBindDao;
+    @Autowired
+    private DeviceParamService deviceParamService;
+    @Autowired
+    private ShopSettlementService shopSettlementService;
+    @Autowired
+    private BusinessparaDao businessparaDao;
+    @Autowired
+    private DeviceDiscountRuleService deviceDiscountRuleService;
+    @Autowired
+    private CitizenCardPayProxy citizenCardPayProxy;
+    @Autowired
+    private TransactionProxy transactionProxy;
+    @Autowired
+    private CitizenCardService cardService;
+    @Autowired
+    private UserProxy userProxy;
+    @Autowired
+    private CustomerDao customerDao;
+    @Autowired
+    private CitizenCardDao cardDao;
+    @Autowired
+    private CitizenCardverDao cardverDao;
+
+
+    @Override
+    public BusDevLoginResp doLogin(BusDevLoginReq req) {
+        BusDevLoginResp resp = new BusDevLoginResp();
+        String sysdt = DateUtil.getNow();
+
+        TDevice tDevice = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        BusApiResp apiResp = checkDevice(resp, tDevice);
+        if (!ErrorCode.ERRIF_OK.equals(apiResp.getRetcode())) {
+            resp.setRetcode(apiResp.getRetcode());
+            resp.setRetmsg(apiResp.getRetmsg());
+            return resp;
+        }
+        List<TShopSettlement> shoplist = shopSettlementService.getShopByShopid(tDevice.getShopid());
+        if (shoplist.size() < 1) {
+            resp.setRetcode(ErrorCode.ERRIF_POS_NOSHOP);
+            resp.setRetmsg("设备未绑定商户");
+            return resp;
+        }
+
+        TDevparaGroup group = null;
+        TDevparaBind bind = deviceParamService.getDevparaBindByDeviceid(tDevice.getId());
+        if (null == bind) {
+            group = deviceParamService.getDefaultDevparaGroup();
+        } else {
+            group = deviceParamService.getDevparaGroupByGroupid(bind.getGroupid());
+        }
+
+        tDevice.setRunstatus(1);
+        tDevice.setLastlogintime(sysdt);
+        deviceService.saveDevice(tDevice);
+        if (group.getGlobalflag() == false) {
+            if (null == bind) {
+                bind = new TDevparaBind();
+                bind.setDeviceid(tDevice.getId());
+            }
+            bind.setGroupid(group.getGroupid());
+            bind.setLastsaved(sysdt);
+            devparaBindDao.save(bind);
+        }
+
+        Integer onlineseqno = transDtlService.getMaxSeqnoToday(tDevice.getId(), req.getTermdate());
+        resp.setCardverno(req.getCardverno());
+        resp.setTermseqno(onlineseqno + 1);
+        resp.setShopname(shoplist.get(0).getShopname());
+        resp.setParagroupid(group.getGroupid());
+        resp.setSystime(sysdt);
+        resp.setParaverno(group.getVerno().intValue());
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        return resp;
+    }
+
+    @Override
+    public BusSysparaResp doGetDevpara(BusSysparaReq req) {
+        BusSysparaResp resp = new BusSysparaResp();
+        TDevparaGroup group = deviceParamService.getDevparaGroupByGroupid(req.getParagroupid());
+        if (null == group) {
+            resp.setRetcode(ErrorCode.ERRIF_POS_NOFUNC);
+            resp.setRetmsg("未找到" + req.getDevphyid() + "参数组");
+            return resp;
+        }
+        List<TDevpara> tDevparas = deviceParamService.getDevparaInfo(req.getParagroupid());
+
+        ArrayList<DevparaBean> sysParas = new ArrayList<DevparaBean>();
+        for (TDevpara t : tDevparas) {
+            DevparaBean sysPara = new DevparaBean();
+            sysPara.setParaname(t.getParaname());
+            sysPara.setParaval(t.getParaval());
+            sysParas.add(sysPara);
+        }
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("下载成功");
+        resp.setParaverno(group.getVerno().intValue());
+        resp.setParagroupid(group.getGroupid());
+        resp.setSyspara(sysParas);
+        return resp;
+    }
+
+    @Override
+    public BusBlacklistResp doGetBlacklist(BusBlacklistReq req) {
+        BusBlacklistResp resp = new BusBlacklistResp();
+        TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        BusApiResp apiResp = checkDevice(resp, device);
+        if (!ErrorCode.ERRIF_OK.equals(apiResp.getRetcode())) {
+            resp.setRetcode(apiResp.getRetcode());
+            resp.setRetmsg(apiResp.getRetmsg());
+            return resp;
+        }
+        device.setCardverno(req.getCardverno());
+        deviceService.saveDevice(device);
+        List<BusCardverBean> cardverFlags = new ArrayList<>();
+        TSyspara maxcardver = sysparaDao.findByParaidWithLockNowait(BusConstant.SYSPARAID_MAXCARDVERNO); //非等待锁
+
+        String maxCardverno = maxcardver.getParaval();
+        Integer count = req.getMaxcount();
+        List<TCitizenCardver> blacklist;
+        blacklist = cardverDao.findAllBlacklist(req.getCardverno());
+
+        if (null == blacklist || blacklist.size() < 1) {
+            resp.setCardverno(maxCardverno);
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            resp.setRetmsg("下载成功");
+            resp.setCount(0);
+            resp.setBlkdata(cardverFlags);
+            return resp;
+        }
+
+        if (blacklist.size() < count) {
+            count = blacklist.size();
+        }
+        for (int i = 0; i < count; i++) {
+            TCitizenCardver cardver = blacklist.get(i);
+            BusCardverBean cardverFlag = new BusCardverBean();
+            cardverFlag.setCardno(cardver.getCardno());
+            cardverFlag.setFlag(cardver.getAdddelflag().toString());
+
+            cardverFlags.add(cardverFlag);
+        }
+
+
+        resp.setCardverno(maxCardverno);
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("下载成功");
+        resp.setCount(count);
+        resp.setBlkdata(cardverFlags);
+        return resp;
+    }
+
+    @Override
+    public BusHeartBeatResp busHeartBeat(BusHeartBeatReq req) {
+        BusHeartBeatResp resp = new BusHeartBeatResp();
+        TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        BusApiResp apiResp = checkDevice(resp, device);
+        if (!ErrorCode.ERRIF_OK.equals(apiResp.getRetcode())) {
+            resp.setRetcode(apiResp.getRetcode());
+            resp.setRetmsg(apiResp.getRetmsg());
+            return resp;
+        }
+
+        String datetime = DateUtil.getNow("yyyyMMddHHmmss");
+
+        device.setCardverno(req.getCardverno());
+        device.setLastbeattime(datetime);
+        device.setBeatstatus(1);
+        deviceService.saveDevice(device);
+
+        TDevparaGroup group = deviceParamService.getDefaultDevparaGroup();
+        if (group == null) {
+            resp.setRetcode(ErrorCode.ERRIF_OTHER);
+            resp.setRetmsg("未配置默认参数");
+            return resp;
+        }
+
+
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("心跳成功");
+        resp.setSystime(datetime);
+        resp.setParaverno(group.getVerno().intValue());
+        resp.setParagroupid(group.getGroupid());
+        resp.setCardverno(req.getCardverno());
+        return resp;
+
+    }
+
+    @Override
+    public BusDtlUploadResp saveOfflineDtl(BusdtlUploadReq req) {
+        BusDtlUploadResp resp = new BusDtlUploadResp();
+        TOfflineTransDtl transDtl = new TOfflineTransDtl();
+        transDtl.setTransdate(req.getTransdate());
+        transDtl.setTranstime(req.getTranstime());
+        transDtl.setBillno(systemUtilService.getRefno());
+        transDtl.setCardno(req.getCardno());
+        transDtl.setRevflag(0);
+        transDtl.setTermsqlno(req.getTermseqno());
+        String err = "";
+        TDevice device = deviceService.getDeviceByDevphyid(req.getDevphyid());
+        if (null == device) {
+            err += "设备物理ID不存在;";
+        }
+        if (1 != device.getState()) {
+            err += "设备状态错误;";
+        }
+        if (!BusConstant.STATUS_NORMAL.equals(device.getCheckstatus())) {
+            err += "设备审核未通过;";
+        }
+        if (!"".equals(err)) {
+            transDtl.setAttr1(err);
+            offlineTransDtlService.saveOfflineTransdtl(transDtl);
+            resp.setRetmsg("保存成功");
+            resp.setRetcode(ErrorCode.ERRIF_OK);
+            return resp;
+        }
+        Double amount = req.getAmount() / 100.0;
+
+        String cardno;
+
+        cardno = req.getCardno();
+
+        TCitizenCard tCard = cardDao.findByCardno(cardno);
+        if (null == tCard) {
+            err += "卡号[" + req.getCardno() + "]不存在;";
+        } else {
+            transDtl.setCustname(tCard.getUsername());
+        }
+        transDtl.setAmount(amount);
+
+        if (device.getState() != 1) {
+            err += "设备状态错误;";
+        } else {
+            transDtl.setTermid(device.getId());
+            transDtl.setShopid(device.getShopid());
+        }
+
+        transDtl.setStatus(BusConstant.STATUS_INIT);
+        transDtl.setAttr1(err);
+        transDtl.setTransmode(BusConstant.TRANSMODE_BUS);
+        offlineTransDtlService.saveOfflineTransdtl(transDtl);
+
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        resp.setRetmsg("保存成功");
+        resp.setTermseqno(req.getTermseqno());
+        return resp;
+    }
+
+
+    private BusApiResp checkDevice(BusApiResp resp, TDevice device) {
+        if (null == device) {
+            resp.setRetcode(ErrorCode.E_DB_QRY);
+            resp.setRetmsg("设备物理ID不存在");
+            return resp;
+        }
+        if (device.getState() != 1) {
+            resp.setRetcode(ErrorCode.ERRIF_OTHER);
+            resp.setRetmsg("设备状态错误");
+            return resp;
+        }
+        if (!BusConstant.STATUS_CARDVER_NORMAL.equals(device.getCheckstatus())) {
+            resp.setRetcode(ErrorCode.ERRIF_OTHER);
+            resp.setRetmsg("设备审核未通过");
+            return resp;
+        }
+        resp.setRetcode(ErrorCode.ERRIF_OK);
+        return resp;
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/bus/util/BusConstant.java b/src/main/java/com/supwisdom/dlpay/bus/util/BusConstant.java
index 504ad12..c826a47 100644
--- a/src/main/java/com/supwisdom/dlpay/bus/util/BusConstant.java
+++ b/src/main/java/com/supwisdom/dlpay/bus/util/BusConstant.java
@@ -24,11 +24,18 @@
   public final static String CARDVERTYPE_FREEZE = "frozen"; //状态挂失、冻结、未启用等都会冻结卡，下载黑名单
   public final static String CARDVERTYPE_UNFREEZE = "unfrozen"; //卡状态正常时解冻
 
-  public final static int ADDDELFLAG_DELETE = 2; //下发删除
-  public final static int ADDDELFLAG_ADD = 1; //下发新增
+
+  public final static int ADDDELFLAG_DELETE = 2; //刪除
+  public final static int ADDDELFLAG_ADD = 1; //增加
   public final static int ADDDELFLAG_NONE = 0; //不需要下发
 
   public final static int SYSPARAID_MAXCARDVERNO = 10; //全局参数，最大版本号
   public final static int SYSPARAID_MAXBLACKCARDVERNO = 11; //全局参数，最大黑名单版本号
   public final static int SYSPARAID_CARDSYNCTIME = 21; //全局参数，卡同步时间
+
+  public final static String STATUS_NORMAL="normal";
+  public final static String STATUS_INIT="init";
+
+  public final static String TRANSMODE_BUS="bus";
+
 }
