车载应用黑名单策略和接口定义
diff --git a/build.gradle b/build.gradle
index 761f8b5..4cbb0ed 100644
--- a/build.gradle
+++ b/build.gradle
@@ -56,7 +56,7 @@
     compile group: 'org.apache.poi', name: 'poi-ooxml', version: '3.10.1'
     compile group: 'org.apache.poi', name: 'poi-ooxml-schemas', version: '3.10.1'
     compile group: 'org.apache.poi', name: 'poi-scratchpad', version: '3.10.1'
-    compile 'com.supwisdom:payapi-sdk:1.0.9-1-gb3cd8c8'
+    compile 'com.supwisdom:payapi-sdk:1.0.11'
     compile group: 'org.springframework.security.oauth', name: 'spring-security-oauth2', version: '2.3.4.RELEASE'
 
 
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusApiResp.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusApiResp.java
new file mode 100644
index 0000000..4956990
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusApiResp.java
@@ -0,0 +1,27 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusApiResp {
+  private String retcode;
+  private String retmsg;
+
+  public String getRetcode() {
+    return retcode;
+  }
+
+  public void setRetcode(String retcode) {
+    this.retcode = retcode;
+  }
+
+  public String getRetmsg() {
+    return retmsg;
+  }
+
+  public void setRetmsg(String retmsg) {
+    this.retmsg = retmsg;
+  }
+
+  @Override
+  public String toString() {
+    return "retcode=[" + retcode + "],retmsg=[" + retmsg + "]";
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusBlacklistReq.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusBlacklistReq.java
new file mode 100644
index 0000000..0d0d544
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusBlacklistReq.java
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusBlacklistReq extends BusDevBaseReq {
+  private String devphyid;
+  private String cardverno;
+  private Integer maxcount;
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+
+  public Integer getMaxcount() {
+    return maxcount;
+  }
+
+  public void setMaxcount(Integer maxcount) {
+    this.maxcount = maxcount;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusBlacklistResp.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusBlacklistResp.java
new file mode 100644
index 0000000..096bea2
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusBlacklistResp.java
@@ -0,0 +1,33 @@
+package com.supwisdom.dlpay.bus.bean;
+
+import java.util.List;
+
+public class BusBlacklistResp extends BusApiResp {
+  private String cardverno;
+  private int count;
+  private List<BusCardverBean> blkdata;
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+
+  public int getCount() {
+    return count;
+  }
+
+  public void setCount(int count) {
+    this.count = count;
+  }
+
+  public List<BusCardverBean> getBlkdata() {
+    return blkdata;
+  }
+
+  public void setBlkdata(List<BusCardverBean> blkdata) {
+    this.blkdata = blkdata;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusCardverBean.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusCardverBean.java
new file mode 100644
index 0000000..4289bfa
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusCardverBean.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusCardverBean {
+  private String cardno;
+  private String flag;  // 1/0
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  public String getFlag() {
+    return flag;
+  }
+
+  public void setFlag(String flag) {
+    this.flag = flag;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusDevBaseReq.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusDevBaseReq.java
new file mode 100644
index 0000000..88cf2f7
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusDevBaseReq.java
@@ -0,0 +1,52 @@
+package com.supwisdom.dlpay.bus.bean;
+
+/**
+ * 参数需签名时备用
+ * */
+public class BusDevBaseReq {
+  private String app_id;
+  private String term_id;
+  private String timestamp;
+  private String sign_method;
+  private String sign;
+
+  public String getApp_id() {
+    return app_id;
+  }
+
+  public void setApp_id(String app_id) {
+    this.app_id = app_id;
+  }
+
+  public String getTerm_id() {
+    return term_id;
+  }
+
+  public void setTerm_id(String term_id) {
+    this.term_id = term_id;
+  }
+
+  public String getTimestamp() {
+    return timestamp;
+  }
+
+  public void setTimestamp(String timestamp) {
+    this.timestamp = timestamp;
+  }
+
+  public String getSign_method() {
+    return sign_method;
+  }
+
+  public void setSign_method(String sign_method) {
+    this.sign_method = sign_method;
+  }
+
+  public String getSign() {
+    return sign;
+  }
+
+  public void setSign(String sign) {
+    this.sign = sign;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusDevLoginReq.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusDevLoginReq.java
new file mode 100644
index 0000000..7399af0
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusDevLoginReq.java
@@ -0,0 +1,49 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusDevLoginReq extends BusDevBaseReq {
+  private String devphyid;
+  private String termdate;
+  private String termtime;
+  private Integer paragroupid;
+  private String cardverno;
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public String getTermdate() {
+    return termdate;
+  }
+
+  public void setTermdate(String termdate) {
+    this.termdate = termdate;
+  }
+
+  public String getTermtime() {
+    return termtime;
+  }
+
+  public void setTermtime(String termtime) {
+    this.termtime = termtime;
+  }
+
+  public Integer getParagroupid() {
+    return paragroupid;
+  }
+
+  public void setParagroupid(Integer paragroupid) {
+    this.paragroupid = paragroupid;
+  }
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusDevLoginResp.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusDevLoginResp.java
new file mode 100644
index 0000000..f6b1a61
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusDevLoginResp.java
@@ -0,0 +1,58 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusDevLoginResp extends BusApiResp {
+  private Integer paragroupid;
+  private Integer paraverno;
+  private Integer termseqno;
+  private String cardverno;
+  private String systime;
+  private String shopname;
+
+  public Integer getParagroupid() {
+    return paragroupid;
+  }
+
+  public void setParagroupid(Integer paragroupid) {
+    this.paragroupid = paragroupid;
+  }
+
+  public Integer getParaverno() {
+    return paraverno;
+  }
+
+  public void setParaverno(Integer paraverno) {
+    this.paraverno = paraverno;
+  }
+
+  public Integer getTermseqno() {
+    return termseqno;
+  }
+
+  public void setTermseqno(Integer termseqno) {
+    this.termseqno = termseqno;
+  }
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+
+  public String getSystime() {
+    return systime;
+  }
+
+  public void setSystime(String systime) {
+    this.systime = systime;
+  }
+
+  public String getShopname() {
+    return shopname;
+  }
+
+  public void setShopname(String shopname) {
+    this.shopname = shopname;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusDtlUploadResp.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusDtlUploadResp.java
new file mode 100644
index 0000000..1fdbb15
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusDtlUploadResp.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusDtlUploadResp extends BusApiResp {
+  private Integer termseqno;
+
+  public Integer getTermseqno() {
+    return termseqno;
+  }
+
+  public void setTermseqno(Integer termseqno) {
+    this.termseqno = termseqno;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusHeartBeatReq.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusHeartBeatReq.java
new file mode 100644
index 0000000..7b50f05
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusHeartBeatReq.java
@@ -0,0 +1,22 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusHeartBeatReq extends BusDevBaseReq {
+  private String devphyid;
+  private String cardverno;
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusHeartBeatResp.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusHeartBeatResp.java
new file mode 100644
index 0000000..64a66ae
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusHeartBeatResp.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusHeartBeatResp extends BusApiResp {
+  private Integer paragroupid;
+  private Integer paraverno;
+  private String cardverno;
+  private String systime;
+
+  public Integer getParagroupid() {
+    return paragroupid;
+  }
+
+  public void setParagroupid(Integer paragroupid) {
+    this.paragroupid = paragroupid;
+  }
+
+  public Integer getParaverno() {
+    return paraverno;
+  }
+
+  public void setParaverno(Integer paraverno) {
+    this.paraverno = paraverno;
+  }
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+
+  public String getSystime() {
+    return systime;
+  }
+
+  public void setSystime(String systime) {
+    this.systime = systime;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusSysparaReq.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusSysparaReq.java
new file mode 100644
index 0000000..718c1dd
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusSysparaReq.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusSysparaReq extends BusDevBaseReq{
+  private String devphyid;
+  private String termdate;
+  private String termtime;
+  private Integer paragroupid;
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public String getTermdate() {
+    return termdate;
+  }
+
+  public void setTermdate(String termdate) {
+    this.termdate = termdate;
+  }
+
+  public String getTermtime() {
+    return termtime;
+  }
+
+  public void setTermtime(String termtime) {
+    this.termtime = termtime;
+  }
+
+  public Integer getParagroupid() {
+    return paragroupid;
+  }
+
+  public void setParagroupid(Integer paragroupid) {
+    this.paragroupid = paragroupid;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusSysparaResp.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusSysparaResp.java
new file mode 100644
index 0000000..151de10
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusSysparaResp.java
@@ -0,0 +1,35 @@
+package com.supwisdom.dlpay.bus.bean;
+
+import com.supwisdom.dlpay.api.bean.DevparaBean;
+
+import java.util.ArrayList;
+
+public class BusSysparaResp extends BusApiResp {
+  private Integer paragroupid;
+  private Integer paraverno;
+  private ArrayList<DevparaBean> syspara;
+
+  public Integer getParagroupid() {
+    return paragroupid;
+  }
+
+  public void setParagroupid(Integer paragroupid) {
+    this.paragroupid = paragroupid;
+  }
+
+  public Integer getParaverno() {
+    return paraverno;
+  }
+
+  public void setParaverno(Integer paraverno) {
+    this.paraverno = paraverno;
+  }
+
+  public ArrayList<DevparaBean> getSyspara() {
+    return syspara;
+  }
+
+  public void setSyspara(ArrayList<DevparaBean> syspara) {
+    this.syspara = syspara;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/bean/BusdtlUploadReq.java b/src/main/java/com/supwisdom/dlpay/bus/bean/BusdtlUploadReq.java
new file mode 100644
index 0000000..41b3ee3
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/bean/BusdtlUploadReq.java
@@ -0,0 +1,94 @@
+package com.supwisdom.dlpay.bus.bean;
+
+public class BusdtlUploadReq extends BusDevBaseReq {
+  private String devphyid;
+  private Integer termseqno;
+  private String transdate;
+  private String transtime;
+  private Integer amount;
+  private String cardno;
+  private String cardphyid;
+  private Integer extraamt;
+  private String managefeetype;
+  private String status; //success/fail
+
+  public String getDevphyid() {
+    return devphyid;
+  }
+
+  public void setDevphyid(String devphyid) {
+    this.devphyid = devphyid;
+  }
+
+  public Integer getTermseqno() {
+    return termseqno;
+  }
+
+  public void setTermseqno(Integer termseqno) {
+    this.termseqno = termseqno;
+  }
+
+  public String getTransdate() {
+    return transdate;
+  }
+
+  public void setTransdate(String transdate) {
+    this.transdate = transdate;
+  }
+
+  public String getTranstime() {
+    return transtime;
+  }
+
+  public void setTranstime(String transtime) {
+    this.transtime = transtime;
+  }
+
+  public Integer getAmount() {
+    return amount;
+  }
+
+  public void setAmount(Integer amount) {
+    this.amount = amount;
+  }
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  public String getCardphyid() {
+    return cardphyid;
+  }
+
+  public void setCardphyid(String cardphyid) {
+    this.cardphyid = cardphyid;
+  }
+
+  public Integer getExtraamt() {
+    return extraamt;
+  }
+
+  public void setExtraamt(Integer extraamt) {
+    this.extraamt = extraamt;
+  }
+
+  public String getManagefeetype() {
+    return managefeetype;
+  }
+
+  public void setManagefeetype(String managefeetype) {
+    this.managefeetype = managefeetype;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/controller/BusConsumeController.java b/src/main/java/com/supwisdom/dlpay/bus/controller/BusConsumeController.java
new file mode 100644
index 0000000..f178ce2
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/controller/BusConsumeController.java
@@ -0,0 +1,46 @@
+package com.supwisdom.dlpay.bus.controller;
+
+import com.supwisdom.dlpay.bus.bean.*;
+import com.supwisdom.dlpay.bus.service.BusConsumeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/bus")
+public class BusConsumeController {
+  @Autowired
+  private BusConsumeService busConsumeService;
+
+  @PostMapping("/login")
+  public BusDevLoginResp busLogin(@ModelAttribute BusDevLoginReq req) {
+    return new BusDevLoginResp();
+  }
+
+  @PostMapping("/heartbeat")
+  public BusHeartBeatResp heartBeat(@ModelAttribute BusHeartBeatReq req) {
+    return new BusHeartBeatResp();
+  }
+
+  @PostMapping("/updatesyspara")
+  public BusSysparaResp updateSyspara(@ModelAttribute BusSysparaReq req){
+    return new BusSysparaResp();
+  }
+
+  @PostMapping("/blacklistbitmap")
+  public String downloadBlacklistbitmap(){
+    return "";
+  }
+
+  @PostMapping("/downloadblacklist")
+  public BusBlacklistResp downloadBlacklist(@ModelAttribute BusBlacklistReq req){
+    return new BusBlacklistResp();
+  }
+
+  @PostMapping("/busdtlupload")
+  public BusDtlUploadResp uploadBusdtl(@ModelAttribute BusdtlUploadReq req){
+    return new BusDtlUploadResp();
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/dao/CitizenCardDao.java b/src/main/java/com/supwisdom/dlpay/bus/dao/CitizenCardDao.java
new file mode 100644
index 0000000..500d35b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/dao/CitizenCardDao.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.bus.dao;
+
+import com.supwisdom.dlpay.bus.domain.TCitizenCard;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface CitizenCardDao extends JpaRepository<TCitizenCard, String> {
+  TCitizenCard findByCardno(String cardno);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/dao/CitizenCardverDao.java b/src/main/java/com/supwisdom/dlpay/bus/dao/CitizenCardverDao.java
new file mode 100644
index 0000000..bd65241
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/dao/CitizenCardverDao.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.bus.dao;
+
+import com.supwisdom.dlpay.bus.domain.TCitizenCardver;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@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);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/domain/TCitizenCard.java b/src/main/java/com/supwisdom/dlpay/bus/domain/TCitizenCard.java
new file mode 100644
index 0000000..ede535e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/domain/TCitizenCard.java
@@ -0,0 +1,204 @@
+package com.supwisdom.dlpay.bus.domain;
+
+import com.supwisdom.dlpay.api.bean.CitizenCardInfo;
+
+import javax.persistence.*;
+import java.sql.Timestamp;
+
+@Entity
+@Table(name = "TB_CITIZEN_CARD",
+    indexes = {@Index(name = "IDX_CITIZEN_CARD_BANKCARDNO", columnList = "BANKCARDNO")})
+public class TCitizenCard {
+  @Id
+  @Column(name = "CARDNO", nullable = false, length = 20)
+  private String cardno;
+
+  @Column(name = "CARDPHYID", length = 20)
+  private String cardphyid;
+
+  @Column(name = "EXPIREDATE", length = 20)
+  private String expiredate;
+
+  @Column(name = "STATUS", nullable = false, length = 20)
+  private String status;
+
+  @Column(name = "TRANS_STATUS", nullable = false, length = 20)
+  private String transStatus;
+
+  @Column(name = "PAYERID", length = 31)
+  private String payerid;
+
+  @Column(name = "USERNAME", length = 200)
+  private String username;
+
+  @Column(name = "SEX", length = 10)
+  private String sex;
+
+  @Column(name = "IDTYPE", length = 60)
+  private String idtype;
+
+  @Column(name = "IDNO", length = 30)
+  private String idno;
+
+  @Column(name = "PHONE", length = 30)
+  private String phone;
+
+  @Column(name = "BANKCARDNO", length = 32)
+  private String bankcardno;
+
+  @Column(name = "CARDVERNO", length = 32)
+  private String cardverno;
+
+  @Version
+  @Column(name = "LASTSAVED")
+  private Timestamp lastsaved;
+
+  public TCitizenCard() {
+  }
+
+  public TCitizenCard(String cardno, String cardphyid, String expiredate, String status, String transStatus, String payerid, String username, String sex, String idtype, String idno, String phone, String bankcardno, String cardverno, Timestamp lastsaved) {
+    this.cardno = cardno;
+    this.cardphyid = cardphyid;
+    this.expiredate = expiredate;
+    this.status = status;
+    this.transStatus = transStatus;
+    this.payerid = payerid;
+    this.username = username;
+    this.sex = sex;
+    this.idtype = idtype;
+    this.idno = idno;
+    this.phone = phone;
+    this.bankcardno = bankcardno;
+    this.cardverno = cardverno;
+    this.lastsaved = lastsaved;
+  }
+
+  public TCitizenCard(CitizenCardInfo cardInfo, String cardverno, Timestamp lastsaved) {
+    this.cardno = cardInfo.getCardno();
+    this.cardphyid = cardInfo.getCardphyid();
+    this.expiredate = cardInfo.getExpiredate();
+    this.status = cardInfo.getCardstatus();
+    this.transStatus = cardInfo.getTransstatus();
+    this.payerid = cardInfo.getUserid();
+    this.username = cardInfo.getUsername();
+    this.sex = cardInfo.getSex();
+    this.idtype = cardInfo.getIdtype();
+    this.idno = cardInfo.getIdno();
+    this.phone = cardInfo.getPhone();
+    this.bankcardno = cardInfo.getBankcardno();
+    this.cardverno = cardverno;
+    this.lastsaved = lastsaved;
+  }
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  public String getCardphyid() {
+    return cardphyid;
+  }
+
+  public void setCardphyid(String cardphyid) {
+    this.cardphyid = cardphyid;
+  }
+
+  public String getExpiredate() {
+    return expiredate;
+  }
+
+  public void setExpiredate(String expiredate) {
+    this.expiredate = expiredate;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public String getTransStatus() {
+    return transStatus;
+  }
+
+  public void setTransStatus(String transStatus) {
+    this.transStatus = transStatus;
+  }
+
+  public String getPayerid() {
+    return payerid;
+  }
+
+  public void setPayerid(String payerid) {
+    this.payerid = payerid;
+  }
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public String getSex() {
+    return sex;
+  }
+
+  public void setSex(String sex) {
+    this.sex = sex;
+  }
+
+  public String getIdtype() {
+    return idtype;
+  }
+
+  public void setIdtype(String idtype) {
+    this.idtype = idtype;
+  }
+
+  public String getIdno() {
+    return idno;
+  }
+
+  public void setIdno(String idno) {
+    this.idno = idno;
+  }
+
+  public String getPhone() {
+    return phone;
+  }
+
+  public void setPhone(String phone) {
+    this.phone = phone;
+  }
+
+  public String getBankcardno() {
+    return bankcardno;
+  }
+
+  public void setBankcardno(String bankcardno) {
+    this.bankcardno = bankcardno;
+  }
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+
+  public Timestamp getLastsaved() {
+    return lastsaved;
+  }
+
+  public void setLastsaved(Timestamp lastsaved) {
+    this.lastsaved = lastsaved;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/domain/TCitizenCardver.java b/src/main/java/com/supwisdom/dlpay/bus/domain/TCitizenCardver.java
new file mode 100644
index 0000000..6358aa4
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/domain/TCitizenCardver.java
@@ -0,0 +1,108 @@
+package com.supwisdom.dlpay.bus.domain;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_CITIZEN_CARDVER",
+    indexes = {@Index(name = "idx_citizen_cardver_cardno", columnList = "cardno")})
+public class TCitizenCardver {
+  @Id
+  @Column(name = "CARDVERNO", nullable = false, length = 20)
+  private String cardverno;
+
+  @Column(name = "ACCDATE", length = 8)
+  private String accdate;
+
+  @Column(name = "CARDNO", nullable = false, length = 20)
+  private String cardno;
+
+  @Column(name = "CARDPHYID", length = 20)
+  private String cardphyid;
+
+  @Column(name = "PAYERID", length = 32)
+  private String payerid;
+
+  @Column(name = "CARDVERTYPE", length = 20)
+  private String cardvertype;
+
+  @Column(name = "ADDDELFLAG", nullable = false, length = 1)
+  private Integer adddelflag; //1-需要下发,0-不需要下发
+
+  @Column(name = "STATUS", nullable = false, length = 20)
+  private String status;
+
+  @Column(name = "LASTSAVED", length = 14)
+  private String lastsaved;
+
+  public String getCardverno() {
+    return cardverno;
+  }
+
+  public void setCardverno(String cardverno) {
+    this.cardverno = cardverno;
+  }
+
+  public String getAccdate() {
+    return accdate;
+  }
+
+  public void setAccdate(String accdate) {
+    this.accdate = accdate;
+  }
+
+  public String getCardno() {
+    return cardno;
+  }
+
+  public void setCardno(String cardno) {
+    this.cardno = cardno;
+  }
+
+  public String getCardphyid() {
+    return cardphyid;
+  }
+
+  public void setCardphyid(String cardphyid) {
+    this.cardphyid = cardphyid;
+  }
+
+  public String getPayerid() {
+    return payerid;
+  }
+
+  public void setPayerid(String payerid) {
+    this.payerid = payerid;
+  }
+
+  public String getCardvertype() {
+    return cardvertype;
+  }
+
+  public void setCardvertype(String cardvertype) {
+    this.cardvertype = cardvertype;
+  }
+
+  public Integer getAdddelflag() {
+    return adddelflag;
+  }
+
+  public void setAdddelflag(Integer adddelflag) {
+    this.adddelflag = adddelflag;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+
+  public String getLastsaved() {
+    return lastsaved;
+  }
+
+  public void setLastsaved(String lastsaved) {
+    this.lastsaved = lastsaved;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/service/BusConsumeService.java b/src/main/java/com/supwisdom/dlpay/bus/service/BusConsumeService.java
new file mode 100644
index 0000000..289ba99
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/service/BusConsumeService.java
@@ -0,0 +1,4 @@
+package com.supwisdom.dlpay.bus.service;
+
+public interface BusConsumeService {
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/service/CitizenCardService.java b/src/main/java/com/supwisdom/dlpay/bus/service/CitizenCardService.java
new file mode 100644
index 0000000..af0063e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/service/CitizenCardService.java
@@ -0,0 +1,20 @@
+package com.supwisdom.dlpay.bus.service;
+
+import com.supwisdom.dlpay.api.bean.CitizenCardInfo;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface CitizenCardService {
+  @Transactional(rollbackFor = Exception.class)
+  String getPayapiCardSynctime();
+
+  @Transactional(rollbackFor = Exception.class, readOnly = true)
+  String getPayapiSignkey();
+
+  @Transactional(rollbackFor = Exception.class)
+  boolean doFirstSyncCard(List<CitizenCardInfo> cards)throws Exception;
+
+  @Transactional(rollbackFor = Exception.class)
+  void doSyncSingleCitizencard(CitizenCardInfo cardInfo) throws Exception;
+}
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
new file mode 100644
index 0000000..a3541d2
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/service/impl/BusConsumeServiceImpl.java
@@ -0,0 +1,9 @@
+package com.supwisdom.dlpay.bus.service.impl;
+
+import com.supwisdom.dlpay.bus.service.BusConsumeService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class BusConsumeServiceImpl implements BusConsumeService {
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/service/impl/CitizenCardServiceImpl.java b/src/main/java/com/supwisdom/dlpay/bus/service/impl/CitizenCardServiceImpl.java
new file mode 100644
index 0000000..dc8d0b8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/service/impl/CitizenCardServiceImpl.java
@@ -0,0 +1,288 @@
+package com.supwisdom.dlpay.bus.service.impl;
+
+import com.supwisdom.dlpay.api.bean.CitizenCardInfo;
+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.CitizenCardService;
+import com.supwisdom.dlpay.bus.util.BusConstant;
+import com.supwisdom.dlpay.bus.util.BusException;
+import com.supwisdom.dlpay.framework.dao.SysparaDao;
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+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.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.SysparaUtil;
+import org.apache.commons.lang.math.NumberUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class CitizenCardServiceImpl implements CitizenCardService {
+  @Autowired
+  private SysparaDao sysparaDao;
+  @Autowired
+  private SystemUtilService systemUtilService;
+  @Autowired
+  private CitizenCardDao citizenCardDao;
+  @Autowired
+  private CitizenCardverDao citizenCardverDao;
+
+  @Override
+  public String getPayapiCardSynctime() {
+    TSyspara syspara = sysparaDao.findByParaidWithLockNowait(BusConstant.SYSPARAID_CARDSYNCTIME);
+    if (null == syspara) {
+      syspara = new TSyspara();
+      syspara.setParaid(BusConstant.SYSPARAID_CARDSYNCTIME);
+      syspara.setParaval(BusConstant.PAYAPI_CARDSYNC_DEFAULTTIME);
+      syspara.setParaname("跟核心平台同步卡信息的最后时间");
+      syspara.setValueType(SysparaUtil.SYSPARA_VALUETYPE_STRING);
+      syspara.setEditflag(0);
+      syspara.setDisplayflag("y");
+      syspara.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
+      sysparaDao.save(syspara);
+    }
+    return syspara.getParaval();
+  }
+
+  @Override
+  public String getPayapiSignkey() {
+    return BusConstant.PAYAPI_CONNECT_SIGNKEY;
+  }
+
+  private String createCardverno(String hostdate, int index) {
+    return String.format("%s%08d", hostdate.substring(2), index); //191225 00000001
+  }
+
+  @Override
+  public boolean doFirstSyncCard(List<CitizenCardInfo> cards) throws Exception {
+    TSyspara synctime = sysparaDao.findByParaidWithLockNowait(BusConstant.SYSPARAID_CARDSYNCTIME);
+    TSyspara maxcardver = sysparaDao.findByParaidWithLockNowait(BusConstant.SYSPARAID_MAXCARDVERNO);
+    TSyspara maxBlackCardver = sysparaDao.findByParaidWithLockNowait(BusConstant.SYSPARAID_MAXBLACKCARDVERNO);
+    if (null == maxcardver || null == maxBlackCardver) {
+      throw new BusException("卡版本号全局参数为空");
+    }
+    SystemDateTime dt = systemUtilService.getSysdatetime();
+    int count = 0;
+    String cardverno = BusConstant.CARDVERNO_DEFAULT;
+    String blackverno = BusConstant.CARDVERNO_DEFAULT;
+    String cardsynctime = BusConstant.PAYAPI_CARDSYNC_DEFAULTTIME;
+    List<TCitizenCard> citizenCards = new ArrayList<>(0);
+    List<TCitizenCardver> citizenCardvers = new ArrayList<>(0);
+    for (CitizenCardInfo bean : cards) {
+      cardsynctime = bean.getUpdtime(); //updtime 升序排最后一条
+      cardverno = createCardverno(dt.getHostdate(), ++count);
+
+      TCitizenCard card = new TCitizenCard(bean, cardverno, systemUtilService.getSysdatetime().getSysdate());
+      citizenCards.add(card);
+
+      TCitizenCardver cardver = new TCitizenCardver();
+      cardver.setCardverno(card.getCardverno());
+      cardver.setAccdate(dt.getHostdate());
+      cardver.setCardno(card.getCardno());
+      cardver.setCardphyid(card.getCardphyid());
+      cardver.setPayerid(card.getPayerid());
+      if (BusConstant.STATUS_CARDVER_CLOSED.equals(card.getStatus()) || BusConstant.STATUS_CARDVER_CLOSED.equals(card.getTransStatus())) {
+        //注销
+        cardver.setCardvertype(BusConstant.CARDVERTYPE_CLOSED); //注销
+        cardver.setAdddelflag(BusConstant.ADDDELFLAG_DOWNLOAD); //下发黑名单
+        blackverno = card.getCardverno();
+      } else if (BusConstant.STATUS_CARDVER_NORMAL.equals(card.getStatus()) && BusConstant.STATUS_CARDVER_NORMAL.equals(card.getTransStatus())) {
+        cardver.setCardvertype(BusConstant.CARDVERTYPE_REGISTER); //注册
+        cardver.setAdddelflag(BusConstant.ADDDELFLAG_NONE); //不下发黑名单
+      } else {
+        cardver.setCardvertype(BusConstant.CARDVERTYPE_FREEZE); //卡状态异常
+        cardver.setAdddelflag(BusConstant.ADDDELFLAG_DOWNLOAD); //下发黑名单
+        blackverno = card.getCardverno();
+      }
+      cardver.setStatus(BusConstant.STATUS_CARDVER_NORMAL);
+      cardver.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
+      citizenCardvers.add(cardver);
+    }
+
+    citizenCardDao.saveAll(citizenCards); //批量插入
+    citizenCardverDao.saveAll(citizenCardvers); //批量插入
+
+    maxcardver.setParaval(cardverno);
+    sysparaDao.save(maxcardver); //当前系统版本号
+    maxBlackCardver.setParaval(blackverno);
+    sysparaDao.save(maxBlackCardver); //当前黑名单版本号
+    synctime.setParaval(cardsynctime);
+    sysparaDao.save(synctime); //当前同步时间
+    return true;
+  }
+
+  private String doSwithCardverno(String cardverno) throws Exception {
+    String hostdate = systemUtilService.getSysdatetime().getHostdate();
+    if (StringUtil.isEmpty(cardverno) || BusConstant.CARDVERNO_DEFAULT.equals(cardverno)) {
+      return createCardverno(hostdate, 1);
+    }
+
+    if (cardverno.trim().length() != BusConstant.CARDVERNO_LENGTH) {
+      throw new BusException("******************* 卡版本号[" + cardverno + "]非14位数!!!******************* ");
+    }
+    String verdate = "20" + cardverno.substring(0, 6);
+    if (!DateUtil.checkDatetimeValid(verdate, "yyyyMMdd")) {
+      throw new BusException("******************* 卡版本号[" + cardverno + "]非法,前六位非日期格式 ******************* ");
+    } else if (DateUtil.compareDatetime(verdate, hostdate, "yyyyMMdd") > 0) {
+      throw new BusException("******************* 卡版本号[" + cardverno + "]非法,前六位日期比当前日期大 ******************* ");
+    } else if (!NumberUtils.isDigits(cardverno.substring(6))) {
+      throw new BusException("******************* 卡版本号[" + cardverno + "]非法,后八位非数字!!! ******************* ");
+    }
+    if (hostdate.equals(verdate)) {
+      int suffix = Integer.valueOf(cardverno.substring(6));
+      return createCardverno(hostdate, suffix + 1);
+    } else {
+      return createCardverno(hostdate, 1); //跨天从1开始
+    }
+  }
+
+
+  @Override
+  public void doSyncSingleCitizencard(CitizenCardInfo cardInfo) throws Exception {
+    TSyspara synctime = sysparaDao.findByParaidWithLockNowait(BusConstant.SYSPARAID_CARDSYNCTIME); //非等待锁
+    TSyspara maxcardver = sysparaDao.findByParaidWithLockNowait(BusConstant.SYSPARAID_MAXCARDVERNO); //非等待锁
+    String cardverno = null;
+
+    SystemDateTime dt = systemUtilService.getSysdatetime();
+    TCitizenCard card = citizenCardDao.findByCardno(cardInfo.getCardno());
+    if (null != card) {
+      cardverno = doSwithCardverno(maxcardver.getParaval());
+      card = new TCitizenCard(cardInfo, cardverno, dt.getSysdate());
+      citizenCardDao.save(card);
+
+      TCitizenCardver cardver = new TCitizenCardver();
+      cardver.setCardverno(card.getCardverno());
+      cardver.setAccdate(dt.getHostdate());
+      cardver.setCardno(card.getCardno());
+      cardver.setCardphyid(card.getCardphyid());
+      cardver.setPayerid(card.getPayerid());
+      if (BusConstant.STATUS_CARDVER_CLOSED.equals(card.getStatus()) || BusConstant.STATUS_CARDVER_CLOSED.equals(card.getTransStatus())) {
+        //注销
+        cardver.setCardvertype(BusConstant.CARDVERTYPE_CLOSED); //注销
+        cardver.setAdddelflag(BusConstant.ADDDELFLAG_DOWNLOAD); //下发黑名单
+      } else if (BusConstant.STATUS_CARDVER_NORMAL.equals(card.getStatus()) && BusConstant.STATUS_CARDVER_NORMAL.equals(card.getTransStatus())) {
+        cardver.setCardvertype(BusConstant.CARDVERTYPE_REGISTER); //注册
+        cardver.setAdddelflag(BusConstant.ADDDELFLAG_NONE); //不下发黑名单
+      } else {
+        cardver.setCardvertype(BusConstant.CARDVERTYPE_FREEZE); //卡状态异常
+        cardver.setAdddelflag(BusConstant.ADDDELFLAG_DOWNLOAD); //下发黑名单
+      }
+      cardver.setStatus(BusConstant.STATUS_CARDVER_NORMAL);
+      cardver.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
+      citizenCardverDao.save(cardver);
+    } else {
+      boolean updFlag = false;
+      if (null != cardInfo.getCardphyid() && !cardInfo.getCardphyid().equals(card.getCardphyid())) {
+        card.setCardphyid(cardInfo.getCardphyid());
+        updFlag = true;
+      }
+      if (null != cardInfo.getExpiredate() && !cardInfo.getExpiredate().equals(card.getExpiredate())) {
+        card.setExpiredate(cardInfo.getExpiredate());
+        updFlag = true;
+      }
+      if (null != cardInfo.getUserid() && !cardInfo.getUserid().equals(card.getPayerid())) {
+        card.setPayerid(cardInfo.getUserid());
+        updFlag = true;
+      }
+      if (null != cardInfo.getUsername() && !cardInfo.getUsername().equals(card.getUsername())) {
+        card.setUsername(cardInfo.getUsername());
+        updFlag = true;
+      }
+      if (null != cardInfo.getSex() && !cardInfo.getSex().equals(card.getSex())) {
+        card.setSex(cardInfo.getSex());
+        updFlag = true;
+      }
+      if (null != cardInfo.getIdtype() && !cardInfo.getIdtype().equals(card.getIdtype())) {
+        card.setIdtype(cardInfo.getIdtype());
+        updFlag = true;
+      }
+      if (null != cardInfo.getIdno() && !cardInfo.getIdno().equals(card.getIdno())) {
+        card.setIdno(cardInfo.getIdno());
+        updFlag = true;
+      }
+      if (null != cardInfo.getPhone() && !cardInfo.getPhone().equals(card.getPhone())) {
+        card.setPhone(cardInfo.getPhone());
+        updFlag = true;
+      }
+      if (null != card.getBankcardno() && !card.getBankcardno().equals(card.getBankcardno())) {
+        card.setBankcardno(cardInfo.getBankcardno());
+        updFlag = true;
+      }
+
+      if (!card.getStatus().equals(cardInfo.getCardstatus()) || !card.getTransStatus().equals(cardInfo.getTransstatus())) {
+        //卡状态有变化
+        updFlag = true;
+        card.setStatus(cardInfo.getCardstatus());
+        card.setTransStatus(cardInfo.getTransstatus());
+
+        TCitizenCardver cardver = null;
+        if (BusConstant.STATUS_CARDVER_CLOSED.equals(cardInfo.getCardstatus()) || BusConstant.STATUS_CARDVER_CLOSED.equals(cardInfo.getTransstatus())) {
+          if (!BusConstant.STATUS_CARDVER_CLOSED.equals(card.getStatus()) && !BusConstant.STATUS_CARDVER_CLOSED.equals(card.getTransStatus())) {
+            //卡状态改为注销
+            cardverno = doSwithCardverno(maxcardver.getParaval());
+            card.setCardverno(cardverno);
+            cardver = new TCitizenCardver();
+            cardver.setCardverno(cardverno);
+            cardver.setCardvertype(BusConstant.CARDVERTYPE_CLOSED); //注销
+            cardver.setAdddelflag(BusConstant.ADDDELFLAG_DOWNLOAD); //下发黑名单
+            citizenCardverDao.doClosedHistoryRecords(BusConstant.CARDVERTYPE_REGISTER, card.getCardno(), cardverno); //注册记录置为无效
+          }
+        } else if (BusConstant.STATUS_CARDVER_NORMAL.equals(card.getStatus()) && BusConstant.STATUS_CARDVER_NORMAL.equals(card.getTransStatus())) {
+          if (!BusConstant.STATUS_CARDVER_NORMAL.equals(card.getStatus()) || !BusConstant.STATUS_CARDVER_NORMAL.equals(card.getStatus())) {
+            //卡状态由异常变正常
+            cardverno = doSwithCardverno(maxcardver.getParaval());
+            card.setCardverno(cardverno);
+            cardver = new TCitizenCardver();
+            cardver.setCardverno(cardverno);
+            cardver.setCardvertype(BusConstant.CARDVERTYPE_UNFREEZE); //变为正常
+            cardver.setAdddelflag(BusConstant.ADDDELFLAG_DOWNLOAD); //下发黑名单
+            citizenCardverDao.doClosedHistoryRecords(BusConstant.CARDVERTYPE_FREEZE, card.getCardno(), cardverno); //冻结记录置为无效
+            citizenCardverDao.doClosedHistoryRecords(BusConstant.CARDVERTYPE_CLOSED, card.getCardno(), cardverno); //注销记录置为无效
+          }
+        } else {
+          if (BusConstant.STATUS_CARDVER_NORMAL.equals(card.getStatus()) && BusConstant.STATUS_CARDVER_NORMAL.equals(card.getStatus())) {
+            //卡状态由正常变异常
+            cardverno = doSwithCardverno(maxcardver.getParaval());
+            card.setCardverno(cardverno);
+            cardver = new TCitizenCardver();
+            cardver.setCardverno(cardverno);
+            cardver.setCardvertype(BusConstant.CARDVERTYPE_FREEZE); //变为异常
+            cardver.setAdddelflag(BusConstant.ADDDELFLAG_DOWNLOAD); //下发黑名单
+            citizenCardverDao.doClosedHistoryRecords(BusConstant.CARDVERTYPE_UNFREEZE, card.getCardno(), cardverno); //解冻记录置为无效
+          }
+        }
+
+        if (null != cardver) {
+          cardver.setAccdate(dt.getHostdate());
+          cardver.setCardno(card.getCardno());
+          cardver.setCardphyid(card.getCardphyid());
+          cardver.setPayerid(card.getPayerid());
+          cardver.setStatus(BusConstant.STATUS_CARDVER_NORMAL);
+          cardver.setLastsaved(systemUtilService.getSysdatetime().getHostdatetime());
+          citizenCardverDao.save(cardver);
+          sysparaDao.updateSysparaValue(cardver.getCardverno(), BusConstant.SYSPARAID_MAXBLACKCARDVERNO); //更新系统黑名单版本号
+        }
+      }
+
+      if (updFlag) {
+        citizenCardDao.save(card); //更新卡表
+      }
+    }
+
+    if (null != cardverno) {
+      maxcardver.setParaval(cardverno);
+      sysparaDao.save(maxcardver);  //系统的卡版本号
+    }
+
+    synctime.setParaval(cardInfo.getUpdtime());
+    sysparaDao.save(synctime); //更新同步时间
+  }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/task/CitizenCardSyncTask.java b/src/main/java/com/supwisdom/dlpay/bus/task/CitizenCardSyncTask.java
new file mode 100644
index 0000000..cb8030d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/task/CitizenCardSyncTask.java
@@ -0,0 +1,79 @@
+package com.supwisdom.dlpay.bus.task;
+
+import com.supwisdom.dlpay.api.bean.CardsResponse;
+import com.supwisdom.dlpay.api.bean.CitizenCardInfo;
+import com.supwisdom.dlpay.api.bean.QueryCardsParam;
+import com.supwisdom.dlpay.bus.service.CitizenCardService;
+import com.supwisdom.dlpay.bus.util.BusConstant;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.paysdk.proxy.UserProxy;
+import net.javacrumbs.shedlock.core.SchedulerLock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+/**
+ * 跟核心平台获取市民卡信息和实时生成黑名单
+ */
+@Component
+public class CitizenCardSyncTask {
+  private static final Logger logger = LoggerFactory.getLogger(CitizenCardSyncTask.class);
+
+  @Autowired
+  private CitizenCardService citizenCardService;
+  @Autowired
+  private SystemUtilService systemUtilService;
+  @Autowired
+  private UserProxy userProxy;
+
+
+  @Scheduled(cron = "${busapp.cardsync.cron}")
+  @SchedulerLock(name = "BusappCardSyncTask", lockAtMostForString = "PT10M")
+  public void doCitizenCardSyncTask() {
+    try {
+      long t1 = System.currentTimeMillis();
+      logger.info("跟核心平台同步市民卡信息任务开始");
+
+      String lastsynctime = citizenCardService.getPayapiCardSynctime(); //上次同步时间
+      String currenttime = systemUtilService.getSysdatetime().getHostdatetime();
+
+      doSyncCitizenCard(lastsynctime, currenttime);
+
+      long t2 = System.currentTimeMillis();
+      logger.info("跟核心平台同步市民卡信息任务结束,耗时 " + (t2 - t1) + " ms");
+    } catch (Exception ex) {
+      logger.error("跟核心平台同步市民卡信息任务报错!!!");
+      ex.printStackTrace();
+    }
+  }
+
+  private void doSyncCitizenCard(String begintime, String endtime) throws Exception {
+    QueryCardsParam param = new QueryCardsParam();
+    param.setStarttime(begintime);
+    param.setEndtime(endtime);
+    param.setVersion(BusConstant.PAYAPI_CONNECT_VERSION);
+    param.setTenantid(BusConstant.PAYAPI_CONNECT_TENANTID);
+    param.setSign_type(BusConstant.PAYAPI_CONNECT_SIGNTYPE);
+    param.generalSign(citizenCardService.getPayapiSignkey());
+    CardsResponse response = userProxy.querycards(param);
+    if (null == response || null == response.getCards() || response.getCards().size() <= 0) return;
+
+    if(BusConstant.PAYAPI_CARDSYNC_DEFAULTTIME.equals(begintime)) {
+      //第一次全量同步
+      boolean ret = citizenCardService.doFirstSyncCard(response.getCards());
+      if (ret) {
+        logger.info("初次同步数据成功,共插入" + response.getCards().size() + "条数据");
+      } else {
+        logger.error("初次同步数据失败!!!");
+      }
+    } else {
+      //增量同步
+      for (CitizenCardInfo cardInfo : response.getCards()) {
+        citizenCardService.doSyncSingleCitizencard(cardInfo);
+      }
+    }
+  }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/util/BusConstant.java b/src/main/java/com/supwisdom/dlpay/bus/util/BusConstant.java
new file mode 100644
index 0000000..8bd7bea
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/util/BusConstant.java
@@ -0,0 +1,33 @@
+package com.supwisdom.dlpay.bus.util;
+
+public class BusConstant {
+  public final static String PAYAPI_CONNECT_VERSION="1.0";
+  public final static String PAYAPI_CONNECT_SIGNTYPE="MD5";
+  public final static String PAYAPI_CONNECT_TENANTID="tenantid";
+  public final static String PAYAPI_CONNECT_SIGNKEY="c9ae5b4fe5014b5b9eb19e1a0797a3a3";
+
+  public final static String PAYAPI_CARDSYNC_DEFAULTTIME = "00000000000000"; //yyyyMMddhhmmss
+
+  public final static int CARDVERNO_LENGTH = 14;
+  public final static String CARDVERNO_DEFAULT = "00000000000000"; //yyMMdd+8位递增数
+
+
+  public final static String STATUS_CARDVER_NORMAL="normal";
+  public final static String STATUS_CARDVER_CLOSED="closed";
+
+  public final static String PAYAPI_CARDSYNC_ONCECOUNT="payapi.cardsync.oncecount";
+  public final static int PAYAPI_CARDSYNC_ONCECOUNT_DEFAULT = 20000;
+
+
+  public final static String CARDVERTYPE_REGISTER = "register"; //注册
+  public final static String CARDVERTYPE_CLOSED = "closed"; //注销
+  public final static String CARDVERTYPE_FREEZE = "frozen"; //状态挂失、冻结、未启用等都会冻结卡,下载黑名单
+  public final static String CARDVERTYPE_UNFREEZE = "unfrozen"; //卡状态正常时解冻
+
+  public final static int ADDDELFLAG_DOWNLOAD = 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; //全局参数,卡同步时间
+}
diff --git a/src/main/java/com/supwisdom/dlpay/bus/util/BusException.java b/src/main/java/com/supwisdom/dlpay/bus/util/BusException.java
new file mode 100644
index 0000000..5ce5f5a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/bus/util/BusException.java
@@ -0,0 +1,7 @@
+package com.supwisdom.dlpay.bus.util;
+
+public class BusException extends Exception {
+  public BusException(String message) {
+    super(message);
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/SysparaDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/SysparaDao.java
index b4f5da3..cd65fdf 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/SysparaDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/SysparaDao.java
@@ -20,5 +20,9 @@
   @Query(value = "from TSyspara where paraid=?1 ")
   TSyspara findByParaidWithLockNowait(int paraid);
 
+  @Modifying
+  @Query(value = "update tb_syspara set paraval=?1 where paraid=?2 ", nativeQuery = true)
+  void updateSysparaValue(String value, int paraid);
+
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java b/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java
index baaa274..49cb2a5 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/data/SystemDateTime.java
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.framework.data;
 
+import java.sql.Timestamp;
 import java.util.Date;
 
 public interface SystemDateTime {
@@ -9,5 +10,5 @@
 
   String getHostdatetime();
 
-  Date getSysdate();
+  Timestamp getSysdate();
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
index 7a70969..386c5d1 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
@@ -35,35 +35,6 @@
 
   private static final Logger logger = LoggerFactory.getLogger(SystemUtilServiceImpl.class);
 
-  public static class SystemDateTimeImpl implements SystemDateTime {
-    private Date now;
-    private static final SimpleDateFormat sdft = new SimpleDateFormat("yyyyMMddHHmmss");
-
-    public SystemDateTimeImpl(Date now) {
-      this.now = now;
-    }
-
-    @Override
-    public String getHostdate() {
-      return sdft.format(this.now).substring(0, 8);
-    }
-
-    @Override
-    public String getHosttime() {
-      return sdft.format(this.now).substring(8, 14);
-    }
-
-    @Override
-    public String getHostdatetime() {
-      return sdft.format(this.now);
-    }
-
-    @Override
-    public Date getSysdate() {
-      return this.now;
-    }
-  }
-
   /**
    * 获取oracle数据库时间
    */