增加消息推送功能接口
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/kafka_service_impl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/kafka_service_impl.kt
index 7e35c90..ac2689f 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/kafka_service_impl.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/kafka_service_impl.kt
@@ -8,6 +8,7 @@
 import com.supwisdom.dlpay.mobile.dao.MsgDao
 import com.supwisdom.dlpay.mobile.domain.TBMsg
 import com.supwisdom.dlpay.mobile.service.MobileApiService
+import com.supwisdom.dlpay.portal.bean.SendMsgBean
 import mu.KotlinLogging
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.kafka.core.KafkaTemplate
@@ -29,15 +30,21 @@
     val topic = "jpush-messages"
 
     @Async("kafkaSendMessageAsyncTask")
-    override fun sendJpushMessage(userid: String, title: String, content: String, refno: String, extras: MutableMap<String, String>, tenantId: String?) {
-        val musers = mobileApiService.findByUseridAndStatus(userid, TradeDict.STATUS_NORMAL)
+    override fun sendJpushMessage(bean: SendMsgBean, title: String, content: String, extras: MutableMap<String, String>, tenantId: String?) {
+        val sendMsg = msgDao.findBySourceAndRefno(bean.source, bean.refno)
+        // 已推送直接返回
+        if (sendMsg != null) {
+            return
+        }
+        val musers = mobileApiService.findByUseridAndStatus(bean.userid, TradeDict.STATUS_NORMAL)
         var msg = TBMsg().apply {
             this.content = content
             this.title = title
-            this.refno = refno
-            this.userid = userid
+            this.userid = bean.userid
+            this.cardno = bean.cardno
+            this.source = bean.source
             this.lastupdate = DateUtil.getNow()
-            this.refno = refno
+            this.refno = bean.refno
             this.extras = gson.toJson(extras)
         }
         if (musers == null || musers.isEmpty()) {
@@ -60,7 +67,7 @@
             message.title = msg.title
             message.platform = platform
             message.retries = 3
-            extras["refno"] = refno
+            extras["refno"] = bean.refno
             message.custom = gson.toJson(extras)
             message.expiretime = DateUtil.getNewTime(DateUtil.getNow(), 300)
             message.gids = it.uid
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/kafka_service.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/kafka_service.kt
index 66d3f20..2301427 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/kafka_service.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/kafka_service.kt
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.api.service
 
 import com.supwisdom.dlpay.mobile.dao.MsgDao
+import com.supwisdom.dlpay.portal.bean.SendMsgBean
 import mu.KotlinLogging
 import org.apache.kafka.clients.consumer.ConsumerRecord
 import org.springframework.beans.factory.annotation.Autowired
@@ -8,7 +9,7 @@
 import org.springframework.stereotype.Component
 
 interface KafkaSendMsgService {
-    fun sendJpushMessage(userid: String, title: String, content: String, refno: String, extras: MutableMap<String, String>, tenantId: String?)
+    fun sendJpushMessage(bean: SendMsgBean, title: String, content: String, extras: MutableMap<String, String>, tenantId: String?)
 }
 
 @Component
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
index b9c716f..401b4a0 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -22,6 +22,7 @@
 import com.supwisdom.dlpay.mobile.service.MobileApiService
 import com.supwisdom.dlpay.paysdk.proxy.UserProxy
 import com.supwisdom.dlpay.portal.bean.FeedbackSearchBean
+import com.supwisdom.dlpay.portal.bean.SendMsgBean
 import com.supwisdom.dlpay.portal.bean.UserSecurityRequestBean
 import com.supwisdom.dlpay.portal.domain.TBFeedback
 import com.supwisdom.dlpay.portal.service.*
@@ -78,6 +79,8 @@
     lateinit var medicalService: MedicalService
     @Autowired
     lateinit var secretSecurityService: SecretSecurityService
+    @Autowired
+    lateinit var msgService: MsgService
     val logger = KotlinLogging.logger { }
 
     @RequestMapping("/time")
@@ -606,6 +609,27 @@
         }
     }
 
+    /**
+     * 子系统调用手机推送接口
+     */
+    @RequestMapping(value = ["/template/sendmsg"], method = [RequestMethod.POST])
+    fun sendMsg(@RequestBody bean: SendMsgBean): JsonResult? {
+        return try {
+            val userInfo = userProxy.querybycardno(QueryUserParam().apply {
+                this.citizencardno = bean.cardno
+            })
+            if (userInfo.retcode != 0) {
+                logger.error { "获取市民卡号为${bean.cardno}的用户信息失败,错误信息:${userInfo.retmsg}" }
+                return JsonResult.error("获取用户信息失败")
+            }
+            bean.userid = userInfo.userid
+            msgService.sendMsg(bean)
+            return JsonResult.ok()
+        } catch (e: Exception) {
+            logger.error { e.message }
+            JsonResult.error(e.message)
+        }
+    }
 }
 
 
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt
index 27f63ad..c3c38d8 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/dao/ApiDao.kt
@@ -9,4 +9,6 @@
 interface PagesDao : JpaRepository<TBPages, String>
 
 @Repository
-interface MsgDao : JpaRepository<TBMsg, String>
\ No newline at end of file
+interface MsgDao : JpaRepository<TBMsg, String> {
+    fun findBySourceAndRefno(source: String, refno: String): TBMsg?
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMsg.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMsg.kt
index 53ec2f0..ad2d372 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMsg.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMsg.kt
@@ -4,7 +4,7 @@
 import javax.persistence.*
 
 @Entity
-@Table(name = "TB_MSG")
+@Table(name = "TB_MSG",indexes = [Index(name="msg_idx",columnList = "source,refno",unique = true)])
 class TBMsg{
     @Id
     @GenericGenerator(name = "idGenerator", strategy = "uuid")
@@ -15,9 +15,15 @@
     @Column(name = "userid", length = 32)
     var userid:String = ""
 
+    @Column(name = "cardno", length = 32)
+    var cardno:String = ""
+
     @Column(name = "title", length = 100)
     var title: String? = null
 
+    @Column(name = "source", length = 20)
+    var source: String? = null
+
     @Column(name = "refno", length = 32)
     var refno: String? = null
 
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt
index a970849..6670dca 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.portal
 
 import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.bean.QueryUserParam
 import com.supwisdom.dlpay.api.service.UploadPicService
 import com.supwisdom.dlpay.framework.core.JwtConfig
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
@@ -242,17 +243,6 @@
         }
     }
 
-    @RequestMapping(value = ["/template/sendmsg"], method = [RequestMethod.POST])
-    fun sendMsg(@RequestBody bean: SendMsgBean): JsonResult? {
-        return try {
-            msgService.sendMsg(bean)
-            return JsonResult.ok()
-        } catch (e: Exception) {
-            logger.error { e.message }
-            JsonResult.error(e.message)
-        }
-    }
-
     @RequestMapping(value = ["/article/uploadpic"], method = [RequestMethod.POST])
     fun uploadPic(request: MultipartHttpServletRequest): JsonResult? {
         val map = uploadPicService.uploadPic(request)
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/SendMsgBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/SendMsgBean.kt
index de40251..2346bc8 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/SendMsgBean.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/SendMsgBean.kt
@@ -2,7 +2,9 @@
 
 class SendMsgBean {
     var templateid: String = ""
-    var userid: String = ""
+    var cardno: String = ""
     var refno: String = ""
+    var source: String = ""
+    var userid: String = ""
     var data: Map<String,String> = HashMap()
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/MsgServiceImpl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/MsgServiceImpl.kt
index 50af7e3..60c2c8b 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/MsgServiceImpl.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/MsgServiceImpl.kt
@@ -50,8 +50,8 @@
                     throw RuntimeException("未设置参数<${param}>的值")
                 }
             }
-            kafkaSendMsgService.sendJpushMessage(bean.userid,template.title,content,bean.refno,mutableMapOf(),"")
-        }else {
+            kafkaSendMsgService.sendJpushMessage(bean, template.title, content, mutableMapOf(), "")
+        } else {
             throw RuntimeException("未找到id为:<${bean.templateid}>的模板,请确认模板id")
         }
     }