添加消息推送
diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 7c2ec22..408a43a 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -35,7 +35,7 @@
 
 #============== kafka ===================
 # 指定kafka 代理地址,可以多个
-# spring.kafka.bootstrap-servers=192.168.153.135:9092
+spring.kafka.bootstrap-servers=172.28.201.101:29092
 #=============== provider  =======================
 spring.kafka.producer.retries=3
 # 每次批量发送消息的数量
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/KafkaXgMessage.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/KafkaXgMessage.java
new file mode 100644
index 0000000..9bc836a
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/KafkaXgMessage.java
@@ -0,0 +1,133 @@
+package com.supwisdom.dlpay.api.bean;
+
+public class KafkaXgMessage {
+
+  private String title;//提醒标题
+  private String content;//提醒消息内容
+  private String gids;//gid发送列表,逗号隔开
+  private Boolean alltarget;//是否平台全发送
+  private String platform;//android,ios
+  private int type;//TYPE_NOTIFICATION = 1,TYPE_MESSAGE = 2
+
+  private String url;//跳转url
+  private String expiretime;//过期时间
+  private Boolean callback;//是否回调返回
+  private String msg_type;//提醒类型 字典 epay_pos_scan_code_pay、
+  private String refno;//流水参考号
+  private int retries;//最多重试次数
+  private String amount;//消费金额,元,小数点后两位
+  private String custom; //扩展参数,原样传递
+
+
+  public String getTitle() {
+    return title;
+  }
+
+  public void setTitle(String title) {
+    this.title = title;
+  }
+
+  public String getContent() {
+    return content;
+  }
+
+  public void setContent(String content) {
+    this.content = content;
+  }
+
+  public String getGids() {
+    return gids;
+  }
+
+  public void setGids(String gids) {
+    this.gids = gids;
+  }
+
+  public Boolean getAlltarget() {
+    return alltarget;
+  }
+
+  public void setAlltarget(Boolean alltarget) {
+    this.alltarget = alltarget;
+  }
+
+  public String getPlatform() {
+    return platform;
+  }
+
+  public void setPlatform(String platform) {
+    this.platform = platform;
+  }
+
+  public int getType() {
+    return type;
+  }
+
+  public void setType(int type) {
+    this.type = type;
+  }
+
+  public String getUrl() {
+    return url;
+  }
+
+  public void setUrl(String url) {
+    this.url = url;
+  }
+
+  public String getExpiretime() {
+    return expiretime;
+  }
+
+  public void setExpiretime(String expiretime) {
+    this.expiretime = expiretime;
+  }
+
+  public Boolean getCallback() {
+    return callback;
+  }
+
+  public void setCallback(Boolean callback) {
+    this.callback = callback;
+  }
+
+  public String getMsg_type() {
+    return msg_type;
+  }
+
+  public void setMsg_type(String msg_type) {
+    this.msg_type = msg_type;
+  }
+
+  public String getRefno() {
+    return refno;
+  }
+
+  public void setRefno(String refno) {
+    this.refno = refno;
+  }
+
+  public int getRetries() {
+    return retries;
+  }
+
+  public void setRetries(int retries) {
+    this.retries = retries;
+  }
+
+  public String getAmount() {
+    return amount;
+  }
+
+  public void setAmount(String amount) {
+    this.amount = amount;
+  }
+
+  public String getCustom() {
+    return custom;
+  }
+
+  public void setCustom(String custom) {
+    this.custom = custom;
+  }
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
index 5b109df..eb74c4c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_service_impl.kt
@@ -5,6 +5,7 @@
 import com.supwisdom.dlpay.api.domain.*
 import com.supwisdom.dlpay.api.repositories.AccountService
 import com.supwisdom.dlpay.api.service.AccountUtilServcie
+import com.supwisdom.dlpay.api.service.KafkaSendMsgService
 import com.supwisdom.dlpay.api.service.SourceTypeService
 import com.supwisdom.dlpay.api.service.TransactionService
 import com.supwisdom.dlpay.exception.TransactionCheckException
@@ -38,6 +39,10 @@
     @Autowired
     private lateinit var sourceTypeService: SourceTypeService
 
+    @Autowired
+    private lateinit var kafkaSendMsgService: KafkaSendMsgService
+
+
     /// 公共函数部分
     private fun preCheck(builder: TransactionBuilder) {
         builder.preCheck()
@@ -386,6 +391,9 @@
 
         transaction.endTime = systemUtilService.sysdatetime.sysdate
         transactionMainDao.save(transaction)
+        if(transaction.person&&!transaction.personDtl.userid.isNullOrEmpty()){
+            kafkaSendMsgService.sendJpushMessage(transaction.personDtl.userid,"交易提醒","你有一笔${transaction.personDtl.amount}元的支出,点击查看详情",transaction.refno, mutableMapOf(),transaction.tenantid)
+        }
         return transaction
     }
 
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/kafka_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/kafka_service.kt
index 6c9ce1a..d9bd0a8 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/kafka_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/kafka_service.kt
@@ -1,20 +1,70 @@
 package com.supwisdom.dlpay.api.service
 
+import com.google.gson.Gson
+import com.supwisdom.dlpay.api.bean.KafkaXgMessage
+import com.supwisdom.dlpay.framework.util.DateUtil
+import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.mobile.dao.MsgDao
+import com.supwisdom.dlpay.mobile.domain.TBMsg
+import com.supwisdom.dlpay.mobile.service.MobileApiService
 import mu.KotlinLogging
 import org.springframework.stereotype.Component
 import org.springframework.kafka.core.KafkaTemplate
 import org.springframework.beans.factory.annotation.Autowired
-
+import org.springframework.scheduling.annotation.Async
 
 
 @Component
-class KafkaSendMsgService{
+class KafkaSendMsgService {
     val logger = KotlinLogging.logger { }
-
     @Autowired
     private lateinit var kafkaTemplate: KafkaTemplate<String, String>
-    fun sendMessage(topic:String,msg: String) {
-        logger.debug { "$topic,$msg" }
-        kafkaTemplate.send(topic, msg)
+    @Autowired
+    private lateinit var msgDao: MsgDao
+    @Autowired
+    private lateinit var mobileApiService: MobileApiService
+    val gson = Gson()
+
+    val topic = "jpush-messages"
+
+    @Async("kafkaSendMsgService")
+    fun sendJpushMessage(userid: String, title: String, content: String, refno: String, extras: MutableMap<String, String>, tenantId: String?) {
+        val musers = mobileApiService.findByUseridAndStatus(userid, TradeDict.STATUS_NORMAL)
+        var msg = TBMsg().apply {
+            this.content = content
+            this.title = title
+            this.refno = refno
+            this.userid = userid
+            this.lastupdate = DateUtil.getNow()
+            this.refno = refno
+            this.extras = gson.toJson(extras)
+        }
+        if (musers == null || musers.isEmpty()) {
+            msg.pushresult = "没有手机用户,消息未推送"
+            msgDao.save(msg)
+            return
+        }
+        var uids = ""
+        musers.forEach {
+            uids += "${it.uid},"
+            var platform = "android"
+            if ("ios".equals(it.lastloginplatform, true)) {
+                platform = "ios"
+            }
+            val message = KafkaXgMessage()
+            message.alltarget = false
+            message.callback = true
+            message.content = msg.content
+            message.title = msg.title
+            message.platform = platform
+            message.retries = 3
+            extras["refno"] = refno
+            message.custom = gson.toJson(extras)
+            message.expiretime = DateUtil.getNewTime(DateUtil.getNow(), 300)
+            message.gids = it.uid
+            kafkaTemplate.send(topic, refno, gson.toJson(message))
+        }
+        msg.pusheduids = uids
+        msgDao.save(msg)
     }
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
index b8ea4fc..16f1742 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
@@ -43,7 +43,8 @@
     lateinit var userService: UserService
 
     override fun onAuthenticationSuccess(request: HttpServletRequest, response: HttpServletResponse, authentication: Authentication) {
-        logger.error(request.getParameter("platform"))
+        val platform = request.getParameter("platform")
+        logger.error(platform)
         val temp = authentication.principal as TBMobileUser
         val user = mobileApiService.findUserByPhone(temp.phone)
         val exp = systemUtilService.getSysparaValueAsInt(SysparaUtil.MOBILE_LOGIN_EXPIRE_IN_SECONDS,60*60*24*3)
@@ -72,6 +73,7 @@
                 user.loginpwderrortime = null
             }
             user.lastlogin = DateUtil.getNow()
+            user.lastloginplatform = platform
             user.jti = jwt.jti
             mobileApiService.saveUser(user)
             var payseted = false
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
index 9d78020..824ebc1 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -135,6 +135,9 @@
             }
             user.status = TradeDict.STATUS_NORMAL
             user.registerplatform = platform
+            if(!user.registerplatform.isNullOrEmpty()){
+                user.lastloginplatform = user.registerplatform!!.split(",")[1]
+            }
             user.devuid = uuid
             user = mobileApiService.saveUser(user)
             val newCode = RandomUtils.getRandomString(30)
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt
index 8146652..27f63ad 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt
@@ -1,8 +1,12 @@
 package com.supwisdom.dlpay.mobile.dao
 
+import com.supwisdom.dlpay.mobile.domain.TBMsg
 import com.supwisdom.dlpay.mobile.domain.TBPages
 import org.springframework.data.jpa.repository.JpaRepository
 import org.springframework.stereotype.Repository
 
 @Repository
-interface PagesDao : JpaRepository<TBPages,String>
\ No newline at end of file
+interface PagesDao : JpaRepository<TBPages, String>
+
+@Repository
+interface MsgDao : JpaRepository<TBMsg, String>
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/MobileUserDao.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/MobileUserDao.kt
index 76ad4c6..47540f4 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/MobileUserDao.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/MobileUserDao.kt
@@ -7,6 +7,8 @@
 @Repository
 interface MobileUserDao : JpaRepository<TBMobileUser, String> {
     fun findByPhone(phone: String): TBMobileUser?
+
+    fun findByUseridAndStatus(userid:String,status:String):List<TBMobileUser>?
 }
 
 
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
index 276d8d0..afee39c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
@@ -167,6 +167,8 @@
     @Column(name = "secertkey", length = 64)
     var secertkey: String? = null
 
+    @Column(name = "tenantid", length = 32)
+    var tenantid:String? = null
 
     fun checkLoginpwdtime():Int{
         if (this.loginpwderror >= 5 && (System.currentTimeMillis() - this.loginpwderrortime!!) < 1000 * 60 * 30) {
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMsg.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMsg.kt
new file mode 100644
index 0000000..53ec2f0
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMsg.kt
@@ -0,0 +1,41 @@
+package com.supwisdom.dlpay.mobile.domain
+
+import org.hibernate.annotations.GenericGenerator
+import javax.persistence.*
+
+@Entity
+@Table(name = "TB_MSG")
+class TBMsg{
+    @Id
+    @GenericGenerator(name = "idGenerator", strategy = "uuid")
+    @GeneratedValue(generator = "idGenerator")
+    @Column(name = "msgid", nullable = false, length = 32)
+    var msgid: String = ""
+
+    @Column(name = "userid", length = 32)
+    var userid:String = ""
+
+    @Column(name = "title", length = 100)
+    var title: String? = null
+
+    @Column(name = "refno", length = 32)
+    var refno: String? = null
+
+    @Column(name = "content", length = 400)
+    var content: String? = null
+
+    @Column(name = "lastupdate", length = 14)
+    var lastupdate: String? = null
+
+    @Column(name = "extras", length = 1000)
+    var extras: String? = null
+
+    @Column(name = "pushresult", length = 500)
+    var pushresult: String? = null
+
+    @Column(name = "pusheduids", length = 400)
+    var pusheduids:String? = ""
+
+    @Column(name = "tenantid", length = 32)
+    var tenantid:String? = null
+}
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBPages.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBPages.kt
index cbe892b..6c9b74a 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBPages.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBPages.kt
@@ -20,4 +20,7 @@
 
     @Column(name = "lastupdate", length = 14)
     var lastupdate: String? = null
+
+    @Column(name = "tenantid", length = 32)
+    var tenantid:String? = null
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt
index 0311352..3baacb3 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt
@@ -23,4 +23,6 @@
     fun saveCard(card:TCard):TCard
 
     fun sendSms(phone:String,code:String):BaseResp
+
+    fun findByUseridAndStatus(userid:String,status:String):List<TBMobileUser>?
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileApiServiceImpl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileApiServiceImpl.kt
index cc1bc47..9412111 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileApiServiceImpl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileApiServiceImpl.kt
@@ -149,4 +149,8 @@
             resp
         }
     }
+
+    override fun findByUseridAndStatus(userid: String, status: String): List<TBMobileUser>? {
+        return mobileUserDao.findByUseridAndStatus(userid,status)
+    }
 }
\ No newline at end of file