大理线下签约同步接口定义
diff --git a/payapi/sql/update-210106.sql b/payapi/sql/update-210106.sql
index 803b182..45a6a77 100644
--- a/payapi/sql/update-210106.sql
+++ b/payapi/sql/update-210106.sql
@@ -30,3 +30,10 @@
 INSERT INTO "tb_transcode" ("transcode_id", "transcode", "transname", "tenantid")
 VALUES (4, 3050, '农商行网关快捷支付', '{tenantid}');
 commit;
+
+
+INSERT INTO "public"."tb_sourcetype_config"("id", "config_name", "config_value", "configid", "globalflag", "sourcetype", "tenantid") VALUES ('26', '农商行网关支付商户号', NULL, 'ynrcc.netpay.Mer_Id', 'f', 'ynrccpay', '{tenantid}');
+INSERT INTO "public"."tb_sourcetype_config"("id", "config_name", "config_value", "configid", "globalflag", "sourcetype", "tenantid") VALUES ('27', '农商行网关支付商户名', NULL, 'ynrcc.netpay.Mer_IdName', 'f', 'ynrccpay', '{tenantid}');
+INSERT INTO "public"."tb_sourcetype_config"("id", "config_name", "config_value", "configid", "globalflag", "sourcetype", "tenantid") VALUES ('28', '农商行网关支付回调地址', NULL, 'ynrcc.netpay.MerURL', 'f', 'ynrccpay', '{tenantid}');
+INSERT INTO "public"."tb_sourcetype_config"("id", "config_name", "config_value", "configid", "globalflag", "sourcetype", "tenantid") VALUES ('25', '农商行网关支付地址', 'https://ebank.ynrcc.com/pweb/%s?LoginType=C&_locale=zh_CN&BankId=9999', 'ynrcc.netpay.URL', 't', 'ynrccpay', '{tenantid}');
+commit;
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
index 21edbe8..5c3163c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -5,6 +5,8 @@
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.util.DesUtil
+import java.util.*
+import kotlin.collections.ArrayList
 
 class DaliDatasyncParam {
     var app_id: String = ""
@@ -85,4 +87,59 @@
     var errmsg: String = ""
 }
 
+/**
+ * 农商行推送线下签约数据报文
+ * */
+class YnrccSendSignInfoParam {
+    var appId: String = ""
+    var bankCardNo: String = ""
+    var idType: String = ""
+    var idNo: String = ""
+    var phone: String = ""
+    var signStatus: String = ""
+    var timestamp: String = ""
+    var signType: String = ""
+    var sign: String = ""
+
+    fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(appId)) {
+            throw RequestParamCheckException("请求参数错误[应用ID为空]")
+        }
+        if(StringUtil.isEmpty(bankCardNo)){
+            throw RequestParamCheckException("请求参数错误[银行卡号为空]")
+        }
+        if (StringUtil.isEmpty(idType)) {
+            throw RequestParamCheckException("请求参数错误[证件类型为空]")
+        }
+        if (StringUtil.isEmpty(idNo)) {
+            throw RequestParamCheckException("请求参数错误[证件号码为空]")
+        }
+        if (StringUtil.isEmpty(phone)) {
+            throw RequestParamCheckException("请求参数错误[手机号为空]")
+        }
+        if (StringUtil.isEmpty(phone)) {
+            throw RequestParamCheckException("请求参数错误[手机号为空]")
+        }
+        if(!listOf("Y","N").contains(signStatus)){
+            throw RequestParamCheckException("请求参数错误[签约状态(Y/N)]")
+        }
+        if (!DateUtil.checkDatetimeValid(timestamp, DateUtil.DATETIME_FMT)) {
+            throw RequestParamCheckException("请求参数错误[时间戳]")
+        }
+        if (StringUtil.isEmpty(signType)
+            || !"HmacSHA256".equals(signType, true)) {
+            throw RequestParamCheckException("请求参数错误[签名算法]")
+        }
+        if (StringUtil.isEmpty(sign)) {
+            throw RequestParamCheckException("请求参数错误[签名为空]")
+        }
+        return true
+    }
+
+    fun checkSign(key: String): Boolean {
+        val signData ="appId=$appId&bankCardNo=$bankCardNo&idType=$idType&idNo=$idNo&phone=$phone&signStatus=$signStatus&timestamp=$timestamp"
+        return sign.equals(HmacUtil.HMACSHA256(signData, key), true)
+    }
+}
+
 
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt
index ee0d97a..d017f6e 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/dali_datasync_api_controller.kt
@@ -4,6 +4,7 @@
 import com.supwisdom.dlpay.api.bean.DaliDatasyncDetail
 import com.supwisdom.dlpay.api.bean.DaliDatasyncErrorDetail
 import com.supwisdom.dlpay.api.bean.DaliDatasyncParam
+import com.supwisdom.dlpay.api.bean.YnrccSendSignInfoParam
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException
 import com.supwisdom.dlpay.api.service.DaliDatasyncService
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
@@ -247,5 +248,39 @@
         }
     }
 
+    /**
+     * ============================================================================
+     * 大理卡管系统推送市民卡信息同步接口
+     * ============================================================================
+     * */
+    @PostMapping("/signsync")
+    fun daliDatasync(@RequestBody param: YnrccSendSignInfoParam): ResponseEntity<Any> {
+        try{
+            if (TenantContext.getTenantSchema() == null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID) //fixme: tenantid设置
+            param.checkParam()
+            val appid = systemUtilService.getSysparaValue(2022)
+            val appkey = systemUtilService.getSysparaValue(2023)
+            if (StringUtil.isEmpty(appid) || StringUtil.isEmpty(appkey)) {
+                return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(1000, "系统参数未配置"))
+            } else if (appid != param.appId) {
+                throw RequestParamCheckException("请求参数错误[应用ID错误]")
+            }
+            if (!param.checkSign(appkey)) {
+                return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(2002, "签名错误"))
+            }
+
+            return  ResponseEntity.ok(mapOf("retcode" to "0000", "retmsg" to "SUCCESS"))
+        }catch (ex: RequestParamCheckException) {
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(2001, ex.message ?: "请求参数错误"))
+        }catch (e:Exception){
+            e.printStackTrace()
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .fail(4000, "系统业务处理异常"))
+        }
+
+    }
 
 }