增加从payapi获取数据接口
diff --git a/backend/build.gradle b/backend/build.gradle
index dd3c0ca..45c52ba 100644
--- a/backend/build.gradle
+++ b/backend/build.gradle
@@ -73,6 +73,10 @@
     compile group: 'com.sun.jersey.contribs', name: 'jersey-multipart', version: '1.19.3'
     compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.9.1'
     compile group: 'log4j', name: 'log4j', version: '1.2.17'
+
+    compile group: 'com.supwisdom', name: 'payapi-sdk', version: '1.0.25-4-g8c3fe54'
+    
+    implementation 'org.hamcrest:hamcrest:2.1'
 }
 
 dependencyManagement {
@@ -86,4 +90,15 @@
 }
 compileTestKotlin {
     kotlinOptions.jvmTarget = "1.8"
+}
+
+repositories {
+    mavenCentral()
+    maven {
+        url "http://ykt-nx.supwisdom.com/repository/ecard-repo/"
+        credentials {
+            username 'ecard'
+            password 'Ecard4SUP'
+        }
+    }
 }
\ No newline at end of file
diff --git a/backend/src/main/java/com/supwisdom/dlpay/api/bean/ApiResponse.java b/backend/src/main/java/com/supwisdom/dlpay/api/util/ApiResponse.java
similarity index 92%
rename from backend/src/main/java/com/supwisdom/dlpay/api/bean/ApiResponse.java
rename to backend/src/main/java/com/supwisdom/dlpay/api/util/ApiResponse.java
index e4cbca1..b8cba78 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/api/bean/ApiResponse.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/api/util/ApiResponse.java
@@ -1,4 +1,4 @@
-package com.supwisdom.dlpay.api.bean;
+package com.supwisdom.dlpay.api.util;
 
 public class ApiResponse {
   private Integer retcode;
diff --git a/backend/src/main/java/com/supwisdom/dlpay/api/util/PointTaskCode.java b/backend/src/main/java/com/supwisdom/dlpay/api/util/PointTaskCode.java
new file mode 100644
index 0000000..05cddb7
--- /dev/null
+++ b/backend/src/main/java/com/supwisdom/dlpay/api/util/PointTaskCode.java
@@ -0,0 +1,49 @@
+package com.supwisdom.dlpay.api.util;
+
+public enum PointTaskCode {
+  /**
+   * 签到
+   */
+  SIGN_IN("signin", 4),
+  /**
+   * 认证
+   */
+  AUTH("auth",7),
+  /**
+   * 消费
+   */
+  CONSUME("consume",8),
+  /**
+   * 兑换
+   */
+  EXCHANGE("exchange",9);
+
+  private String code;
+  private Integer taskid;
+
+  PointTaskCode(String code, Integer taskid) {
+    this.code = code;
+    this.taskid = taskid;
+  }
+
+  public String getCode() {
+    return code;
+  }
+
+  public void setCode(String code) {
+    this.code = code;
+  }
+
+  public Integer getTaskid() {
+    return taskid;
+  }
+
+  public void setTaskid(Integer taskid) {
+    this.taskid = taskid;
+  }
+
+  @Override
+  public String toString() {
+    return code;
+  }
+}
diff --git a/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/FeedbackRepositoryImpl.java b/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/FeedbackRepositoryImpl.java
index 131fb49..0487f6c 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/FeedbackRepositoryImpl.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/portal/dao/impl/FeedbackRepositoryImpl.java
@@ -14,8 +14,8 @@
   @NotNull
   @Override
   public Pagination getFeedbackList(@NotNull FeedbackSearchBean bean) {
-    StringBuilder sql = new StringBuilder("select f.*,p.name username from tb_feedback f left join tb_person p on f.userid = p.userid where 1=1 ");
-    String username = bean.getUsername();
+    StringBuilder sql = new StringBuilder("select f.*,m.phone username from tb_feedback f left join tb_mobile_user m on f.mobileid = m.uid where 1=1 ");
+    String phone = bean.getPhone();
     String title = bean.getTitle();
     String startdate = bean.getStartdate();
     String enddate = bean.getEnddate();
@@ -23,8 +23,8 @@
     String mobileid = bean.getMobileid();
     int pageno = bean.getPageno();
     int pagesize = bean.getPagesize();
-    if (!StringUtil.isEmpty(username)) {
-      sql.append(" and p.name like :username");
+    if (!StringUtil.isEmpty(phone)) {
+      sql.append(" and m.loginid =:phone");
     }
     if (!StringUtil.isEmpty(title)) {
       sql.append(" and f.title like :title");
@@ -43,8 +43,8 @@
     }
     sql.append(" order by f.fbtime desc");
     Finder f = Finder.create(sql.toString());
-    if (!StringUtil.isEmpty(username)) {
-      f.setParameter("username", "%" + username.trim() + "%");
+    if (!StringUtil.isEmpty(phone)) {
+      f.setParameter("phone", phone.trim());
     }
     if (!StringUtil.isEmpty(title)) {
       f.setParameter("title", "%" + title.trim() + "%");
diff --git a/backend/src/main/java/com/supwisdom/dlpay/portal/util/PayApiInit.java b/backend/src/main/java/com/supwisdom/dlpay/portal/util/PayApiInit.java
new file mode 100644
index 0000000..b1917c8
--- /dev/null
+++ b/backend/src/main/java/com/supwisdom/dlpay/portal/util/PayApiInit.java
@@ -0,0 +1,46 @@
+package com.supwisdom.dlpay.portal.util;
+
+import com.supwisdom.dlpay.api.bean.ApiVersionResponse;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
+import com.supwisdom.dlpay.paysdk.proxy.ApiCommonProxy;
+import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.notNullValue;
+
+@Component
+@EnableFeignClients(basePackages = "com.supwisdom.dlpay.paysdk")
+@ComponentScan(basePackages = {"com.supwisdom.dlpay.paysdk"})
+public class PayApiInit {
+  @Autowired
+  private SystemUtilService systemUtilService;
+
+  private String appid;
+
+  private String secret;
+
+  @Autowired
+  private ApiLoginProxy apiLoginProxy;
+
+  @Autowired
+  private ApiCommonProxy apiCommonProxy;
+
+  @PostConstruct
+  public void login() {
+    appid = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_PORTAL_APPID);
+    secret = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_PORTAL_SECRET);
+    ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
+    helper.login(appid, secret);
+    System.out.println("向支付中心登录成功");
+    ApiVersionResponse version = apiCommonProxy.apiVersion();
+    assertThat("get version error " + version.getException(),
+        version.getVersion(), notNullValue());
+  }
+}
diff --git a/backend/src/main/java/com/supwisdom/dlpay/portal/util/PortalConstant.java b/backend/src/main/java/com/supwisdom/dlpay/portal/util/PortalConstant.java
index 4a6de31..490b5d6 100644
--- a/backend/src/main/java/com/supwisdom/dlpay/portal/util/PortalConstant.java
+++ b/backend/src/main/java/com/supwisdom/dlpay/portal/util/PortalConstant.java
@@ -10,10 +10,16 @@
   public static final String SYSPARA_IMAGE_URLASSIGN = "imageserver.url.assign";
   public static final String SYSPARA_IMAGE_URLPUSH = "imageserver.url.push";
   public static final String SYSPARA_ARTICLE_CURRENTNO = "article.currentno";
+  public static final String SYSPARA_PORTAL_APPID = "portal.appid";
+  public static final String SYSPARA_PORTAL_SECRET = "portal.secret";
 
   public static final String ARTICLE_STATUS_SAVE = "save";
   public static final String ARTICLE_STATUS_PASS = "pass";
   public static final String ARTICLE_STATUS_RELEASED = "released";
   public static final String ARTICLE_STATUS_REVIEW = "review";
   public static final String ARTICLE_STATUS_REJECT = "reject";
+
+  public static final String POINTTASK_STATUS_UNDONE = "undone";
+  public static final String POINTTASK_STATUS_DONE = "done";
+  public static final String POINTTASK_STATUS_RECEIVED = "received";
 }
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
new file mode 100644
index 0000000..ee5c14c
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_task.kt
@@ -0,0 +1,25 @@
+package com.supwisdom.dlpay.api
+
+import com.supwisdom.dlpay.paysdk.ApiLoginHelper
+import com.supwisdom.dlpay.paysdk.proxy.ApiLoginProxy
+import mu.KotlinLogging
+import net.javacrumbs.shedlock.core.SchedulerLock
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.scheduling.annotation.Scheduled
+import org.springframework.stereotype.Component
+
+@Component
+class RefreshJwtSchedulerTask {
+
+    private val logger = KotlinLogging.logger { }
+
+    @Autowired
+    private lateinit var apiLoginProxy: ApiLoginProxy
+
+    @Scheduled(cron = "0 */20 * * * ?")
+    @SchedulerLock(name = "refreshJwt", lockAtMostForString = "PT10M")
+    fun refreshJwt() {
+        val loginHelper = ApiLoginHelper(apiLoginProxy)
+        loginHelper.refresh()
+    }
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/qrcode_srvice_impl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/qrcode_srvice_impl.kt
index 761a5b0..66dea84 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/qrcode_srvice_impl.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/qrcode_srvice_impl.kt
@@ -1,7 +1,7 @@
 package com.supwisdom.dlpay.api.service.impl
 
 import com.google.gson.Gson
-import com.supwisdom.dlpay.api.bean.ApiResponse
+import com.supwisdom.dlpay.api.util.ApiResponse
 import com.supwisdom.dlpay.api.service.QRCodeService
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.MD5
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
index 243364b..a731ac1 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
@@ -1,5 +1,7 @@
 package com.supwisdom.dlpay.api.service.impl
 
+import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.bean.UserTaskParam
 import com.supwisdom.dlpay.api.dao.AccountDao
 import com.supwisdom.dlpay.api.dao.PersonDao
 import com.supwisdom.dlpay.api.dao.PersondtlDao
@@ -9,8 +11,17 @@
 import com.supwisdom.dlpay.api.domain.TPersondtl
 import com.supwisdom.dlpay.api.domain.TPointsAccount
 import com.supwisdom.dlpay.api.service.UserService
+import com.supwisdom.dlpay.api.util.PointTaskCode
 import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.*
+import com.supwisdom.dlpay.mobile.dao.MobileUserDao
+import com.supwisdom.dlpay.mobile.domain.TBMobileUser
+import com.supwisdom.dlpay.mobile.exception.PortalBusinessException
+import com.supwisdom.dlpay.paysdk.proxy.UserProxy
+import com.supwisdom.dlpay.portal.bean.PointTaskBean
+import com.supwisdom.dlpay.portal.util.PortalConstant
+import mu.KotlinLogging
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.data.domain.PageRequest
 import org.springframework.data.domain.Sort
@@ -29,6 +40,13 @@
     private lateinit var pointsAccountDao: PointsAccountDao
     @Autowired
     private lateinit var persondtlDao: PersondtlDao
+    @Autowired
+    private lateinit var systemUtilService: SystemUtilService
+    @Autowired
+    private lateinit var mobileUserDao:MobileUserDao
+    @Autowired
+    private lateinit var userProxy: UserProxy
+    val logger = KotlinLogging.logger { }
 
     override fun findAccountByUserid(userid: String, subjno: String?): TAccount? {
         return if (!StringUtil.isEmpty(subjno)) {
@@ -76,4 +94,107 @@
         }
         return result
     }
+
+    override fun completePointTask(user: TBMobileUser, taskcode:String):JsonResult {
+        return if (taskcode == PointTaskCode.SIGN_IN.code) {
+            signInPointTask(user)
+        }else{
+            JsonResult.error(400,"未知的任务CODE")
+        }
+    }
+
+    fun signInPointTask(user: TBMobileUser):JsonResult{
+        val lastTime = user.lastsignintime
+        val hostDateTime = systemUtilService.sysdatetime.hostdatetime
+        if (!lastTime.isNullOrEmpty()) {
+            val lastDate = lastTime.substring(0,8)
+            val hostDate = hostDateTime.substring(0,8)
+            if (lastDate < hostDate) {
+                user.lastsignintime = hostDateTime
+                mobileUserDao.save(user)
+            } else {
+                return JsonResult.error(500,"签到时间异常")
+            }
+        }else{
+            user.lastsignintime = hostDateTime
+            mobileUserDao.save(user)
+        }
+        val taskResponse = userProxy.userTask(UserTaskParam().apply {
+            this.userid = user.userid
+            this.taskid = PointTaskCode.SIGN_IN.taskid.toString()
+        })
+        if (taskResponse.retcode != 0) {
+            logger.error { "用户签到积分任务异常:${taskResponse.retmsg}" }
+            throw PortalBusinessException(taskResponse.retmsg)
+        }
+        return JsonResult.ok()
+    }
+
+    fun querySignInTaskStatus(user: TBMobileUser,list:ArrayList<PointTaskBean>,bean:PointTaskBean){
+        bean.taskcode = PointTaskCode.SIGN_IN.code
+        val lastTime = user.lastsignintime
+        if (!lastTime.isNullOrEmpty()) {
+            val lastDate = lastTime.substring(0,8)
+            val hostDate = systemUtilService.sysdatetime.hostdate
+            if (lastDate < hostDate) {
+                bean.status = PortalConstant.POINTTASK_STATUS_UNDONE
+            } else {
+                bean.status = PortalConstant.POINTTASK_STATUS_RECEIVED
+            }
+        } else {
+            bean.status = PortalConstant.POINTTASK_STATUS_UNDONE
+        }
+        list.add(bean)
+    }
+
+    fun queryAuthTaskStatus(user: TBMobileUser,list:ArrayList<PointTaskBean>,bean:PointTaskBean){
+        bean.taskcode = PointTaskCode.AUTH.code
+        bean.status = PortalConstant.POINTTASK_STATUS_DONE
+        list.add(bean)
+    }
+
+    fun queryConsumeTaskStatus(user: TBMobileUser,list:ArrayList<PointTaskBean>,bean:PointTaskBean){
+        bean.taskcode = PointTaskCode.CONSUME.code
+        bean.status = PortalConstant.POINTTASK_STATUS_DONE
+        list.add(bean)
+    }
+
+    fun queryExchangeTaskStatus(user: TBMobileUser,list:ArrayList<PointTaskBean>,bean:PointTaskBean){
+        bean.taskcode = PointTaskCode.EXCHANGE.code
+        bean.status = PortalConstant.POINTTASK_STATUS_DONE
+        list.add(bean)
+    }
+
+    override fun queryPointTaskStatus(user: TBMobileUser): List<PointTaskBean>? {
+        val result = ArrayList<PointTaskBean>()
+        val taskResponse = userProxy.tPointsTaskNoPage
+        if (taskResponse["retcode"] != 0) {
+            logger.error { "查询积分任务异常" }
+            throw PortalBusinessException("查询积分任务异常")
+        }
+        @Suppress("UNCHECKED_CAST")
+        val data = taskResponse["data"] as ArrayList<LinkedHashMap<String,Any>>
+        data.forEach {
+            val taskid =  it["taskid"] as Int
+            val bean = PointTaskBean().apply {
+                this.points = it["taskpoints"] as Int
+                this.taskname = it["taskname"] as String
+            }
+            when (taskid) {
+                PointTaskCode.SIGN_IN.taskid -> {
+                    querySignInTaskStatus(user,result,bean)
+                }
+                PointTaskCode.AUTH.taskid -> {
+                    queryAuthTaskStatus(user,result,bean)
+                }
+                PointTaskCode.CONSUME.taskid -> {
+                    queryConsumeTaskStatus(user,result,bean)
+                }
+                PointTaskCode.EXCHANGE.taskid -> {
+                    queryExchangeTaskStatus(user,result,bean)
+                }
+            }
+        }
+        return result
+    }
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/qrcode_service.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/qrcode_service.kt
index f379574..6367c88 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/qrcode_service.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/qrcode_service.kt
@@ -1,6 +1,6 @@
 package com.supwisdom.dlpay.api.service
 
-import com.supwisdom.dlpay.api.bean.ApiResponse
+import com.supwisdom.dlpay.api.util.ApiResponse
 
 interface QRCodeService {
     fun encodeCode(uid: String): ApiResponse
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
index 810a2f7..a2eeb15 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
@@ -1,7 +1,10 @@
 package com.supwisdom.dlpay.api.service
 
+import com.supwisdom.dlpay.api.bean.JsonResult
 import com.supwisdom.dlpay.api.domain.*
 import com.supwisdom.dlpay.framework.util.PageResult
+import com.supwisdom.dlpay.mobile.domain.TBMobileUser
+import com.supwisdom.dlpay.portal.bean.PointTaskBean
 import org.springframework.transaction.annotation.Propagation
 import org.springframework.transaction.annotation.Transactional
 
@@ -26,4 +29,10 @@
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
     fun findDtlMonthCountByUserid(userid:String, month :String) : Map<String,Any>?
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
+    fun completePointTask(user:TBMobileUser,taskcode:String):JsonResult
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+    fun queryPointTaskStatus(user:TBMobileUser) : List<PointTaskBean>?
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
index 1aad98a..4cd7ccc 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
@@ -2,6 +2,8 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper
 import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.bean.QueryCardInfo
+import com.supwisdom.dlpay.api.bean.QueryCardParam
 import com.supwisdom.dlpay.api.service.UserService
 import com.supwisdom.dlpay.framework.core.JwtConfig
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
@@ -13,7 +15,9 @@
 import com.supwisdom.dlpay.mobile.domain.TBMobileUser
 import com.supwisdom.dlpay.mobile.exception.UserLoginFailException
 import com.supwisdom.dlpay.mobile.service.MobileApiService
+import com.supwisdom.dlpay.paysdk.proxy.UserProxy
 import com.supwisdom.dlpay.portal.util.PortalConstant
+import com.supwisdom.dlpay.util.ConstantUtil
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.HttpStatus
 import org.springframework.security.authentication.BadCredentialsException
@@ -42,6 +46,8 @@
     lateinit var systemUtilService: SystemUtilService
     @Autowired
     lateinit var userService: UserService
+    @Autowired
+    lateinit var userProxy: UserProxy
 
     override fun onAuthenticationSuccess(request: HttpServletRequest, response: HttpServletResponse, authentication: Authentication) {
         val platform = request.getParameter("platform")
@@ -84,8 +90,20 @@
             var name = ""
             var signed=""
             if (!user.userid.isNullOrEmpty()) {
-                val person = userService.findOnePersonByUserid(user.userid!!)
-                var card = mobileApiService.findCardByUserid(user.userid!!)
+                val personResponse = userProxy.queryPerson(user.userid)
+                if (personResponse.retcode != 0) {
+                    logger.error { "查询用户[${user.userid}]信息失败:${personResponse.retmsg}" }
+                    throw UserLoginFailException("查询用户失败")
+                }
+                val person = personResponse.person
+                val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+                    this.userid = user.userid
+                    this.cardtype = ConstantUtil.CARDTYPE_BANKCARD
+                })
+                var card:QueryCardInfo?=null
+                if (cardResponse.retcode == 0) {
+                    card = cardResponse.card
+                }
                 name = person.name
                 if(card!=null&&card.signed){
                     signed = TradeDict.STATUS_YES
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 b3149a1..64665f8 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -2,7 +2,7 @@
 
 import com.supwisdom.dlpay.agent.citizencard.YnrccUtil
 import com.supwisdom.dlpay.agent.service.CitizencardPayService
-import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.bean.*
 import com.supwisdom.dlpay.api.service.QRCodeService
 import com.supwisdom.dlpay.api.service.UploadPicService
 import com.supwisdom.dlpay.api.service.UserService
@@ -19,6 +19,7 @@
 import com.supwisdom.dlpay.mobile.domain.TBMobileUser
 import com.supwisdom.dlpay.mobile.exception.PortalBusinessException
 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.domain.TBFeedback
 import com.supwisdom.dlpay.portal.service.ArticleService
@@ -66,6 +67,8 @@
     lateinit var columnService: ColumnService
     @Autowired
     lateinit var articleService: ArticleService
+    @Autowired
+    lateinit var userProxy: UserProxy
     val logger = KotlinLogging.logger { }
 
     @RequestMapping("/time")
@@ -237,9 +240,15 @@
         }
         var signed = ""
         if (!user.userid.isNullOrEmpty()) {
-            val card = mobileApiService.findCardByUserid(user.userid!!)
-            if (card != null && card.signed) {
-                signed = TradeDict.STATUS_YES
+            val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+                this.userid = user.userid
+                this.cardtype = ConstantUtil.CARDTYPE_BANKCARD
+            })
+            if (cardResponse.retcode == 0) {
+                val card = cardResponse.card
+                if (card.signed) {
+                    signed = TradeDict.STATUS_YES
+                }
             }
         }
         return JsonResult.ok("OK").put("token", token.jwtToken)
@@ -345,6 +354,8 @@
     lateinit var uploadPicService: UploadPicService
     @Autowired
     lateinit var feedbackService: FeedbackService
+    @Autowired
+    lateinit var userProxy: UserProxy
     val logger = KotlinLogging.logger { }
 
     @RequestMapping("/idtypes")
@@ -452,9 +463,13 @@
             redisTemplate.delete(user.phone!!)
             if (!personid.isNullOrEmpty()) {
                 //绑定用户
-                val person = userService.findOnePersonByUserid(personid)
+                val personResponse = userProxy.queryPerson(personid)
+                if (personResponse.retcode != 0) {
+                    logger.error { "查询用户[${personid}]信息失败:${personResponse.retmsg}" }
+                    return JsonResult.error("查询用户信息失败,请稍后重试")
+                }
                 user.bindtime = DateUtil.getNow()
-                user.userid = person.userid
+                user.userid = personResponse.person.userid
                 mobileApiService.saveUser(user)
             }
             return JsonResult.ok("OK").put("randcode", newCode)!!
@@ -475,12 +490,24 @@
             return JsonResult.error("手机号不存在,请注册")
         }
         val phone = user.phone!!
-        val card = mobileApiService.findCardByNo(cardno)
-                ?: return JsonResult.error("银行卡号有误")
+        val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+            this.cardno = cardno
+            this.cardtype = ConstantUtil.CARDTYPE_BANKCARD
+        })
+        if (cardResponse.retcode != 0) {
+            logger.error { "查询卡片[${cardno}]信息失败:${cardResponse.retmsg}" }
+            return JsonResult.error("银行卡号有误")
+        }
+        val card = cardResponse.card
         if (card.userid.isNullOrEmpty() || card.status != TradeDict.STATUS_NORMAL) {
             return JsonResult.error("银行卡号信息有误")
         }
-        val person = userService.findOnePersonByUserid(card.userid)
+        val personResponse = userProxy.queryPerson(card.userid)
+        if (personResponse.retcode != 0) {
+            logger.error { "查询用户[${card.userid}]信息失败:${personResponse.retmsg}" }
+            return JsonResult.error("查询用户信息失败,请稍后重试")
+        }
+        val person = personResponse.person
         if (person.name != name) {
             return JsonResult.error("绑定信息有误[姓名]")
         }
@@ -502,7 +529,11 @@
             signed = TradeDict.STATUS_YES
             if (!card.signed) {
                 card.signed = true
-                mobileApiService.saveCard(card)
+                val response = userProxy.updateCardSign(card.cardno, true)
+                if (response.retcode != 0) {
+                    logger.error { "更新卡片签约状态失败:${response.retmsg}" }
+                    return JsonResult.error("绑卡失败,请稍后重试")
+                }
             }
             user.signedtime = DateUtil.getNow();
             mobileApiService.saveUser(user)
@@ -541,10 +572,22 @@
         if (user.phone.isNullOrEmpty()) {
             return JsonResult.error("手机号不存在,请注册")
         }
-        var card = mobileApiService.findCardByUserid(user.userid!!)
-                ?: return JsonResult.error("卡片不存在,请重新绑定")
+        val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+            this.userid = user.userid
+            this.cardtype = ConstantUtil.CARDTYPE_BANKCARD
+        })
+        if (cardResponse.retcode != 0) {
+            logger.error { "查询用户[${user.userid}]卡片信息失败:${cardResponse.retmsg}" }
+            return JsonResult.error("卡片不存在,请重新绑定")
+        }
+        val card = cardResponse.card
         //call sign api
-        val person = userService.findOnePersonByUserid(card.userid)
+        val personResponse = userProxy.queryPerson(card.userid)
+        if (personResponse.retcode != 0) {
+            logger.error { "查询用户[${card.userid}]信息失败:${personResponse.retmsg}" }
+            return JsonResult.error("查询用户信息失败,请稍后重试")
+        }
+        val person = personResponse.person
         var signed = ""
         //call api
         var resp = citizencardPayService.bindCard(card.cardno, person.name, person.idtype, person.idno, user.phone!!)
@@ -556,7 +599,11 @@
             signed = TradeDict.STATUS_YES
             if (!card.signed) {
                 card.signed = true
-                mobileApiService.saveCard(card)
+                val response = userProxy.updateCardSign(card.cardno, true)
+                if (response.retcode != 0) {
+                    logger.error { "更新卡片签约状态失败:${response.retmsg}" }
+                    return JsonResult.error("绑卡失败,请稍后重试")
+                }
             }
             user.signedtime = DateUtil.getNow();
             mobileApiService.saveUser(user)
@@ -649,8 +696,15 @@
                     ?: return JsonResult.error("用户不存在,请注册")
             var signed = ""
             if (!user.userid.isNullOrEmpty()) {
-                var card = mobileApiService.findCardByUserid(user.userid!!)
-                        ?: return JsonResult.error(-1, "卡片不存在,请重新绑定")
+                val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+                    this.userid = user.userid
+                    this.cardtype = ConstantUtil.CARDTYPE_BANKCARD
+                })
+                if (cardResponse.retcode != 0) {
+                    logger.error { "查询用户[${user.userid}]卡片信息失败:${cardResponse.retmsg}" }
+                    return JsonResult.error(-1,"卡片不存在,请重新绑定")
+                }
+                val card = cardResponse.card
                 if (card.signed) {
                     signed = TradeDict.STATUS_YES
                 }
@@ -676,10 +730,22 @@
         }
         var signed: String
         if (!user.userid.isNullOrEmpty()) {
-            var card = mobileApiService.findCardByUserid(user.userid!!)
-                    ?: return JsonResult.error("卡片不存在,请重新绑定")
+            val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+                this.userid = user.userid
+                this.cardtype = ConstantUtil.CARDTYPE_BANKCARD
+            })
+            if (cardResponse.retcode != 0) {
+                logger.error { "查询用户[${user.userid}]卡片信息失败:${cardResponse.retmsg}" }
+                return JsonResult.error("卡片不存在,请重新绑定")
+            }
+            val card = cardResponse.card
+            val personResponse = userProxy.queryPerson(card.userid)
+            if (personResponse.retcode != 0) {
+                logger.error { "查询用户[${card.userid}]信息失败:${personResponse.retmsg}" }
+                return JsonResult.error("查询用户信息失败,请稍后重试")
+            }
+            val person = personResponse.person
             //call sign api
-            val person = userService.findOnePersonByUserid(card.userid)
             val captcha = agree//此处为验证码,暂由此参数代替
             var resp = citizencardPayService.signCard(card.cardno, person.name, person.idtype, person.idno, user.phone!!, YnrccUtil.TRANSTYPE_SIGNCARD, captcha)
             if (resp.code != "0000") {
@@ -687,7 +753,11 @@
             }
             card.signed = true
             user.signedtime = DateUtil.getNow()
-            mobileApiService.saveCard(card)
+            val response = userProxy.updateCardSign(card.cardno, true)
+            if (response.retcode != 0) {
+                logger.error { "更新卡片签约状态失败:${response.retmsg}" }
+                return JsonResult.error("签约银行协议失败,请稍后重试")
+            }
             mobileApiService.saveUser(user)
             signed = TradeDict.STATUS_YES
         } else {
@@ -734,8 +804,20 @@
         if (!user.paypwd.isNullOrEmpty()) {
             payseted = true
         }
-        val person = userService.findOnePersonByUserid(user.userid!!)
-        val card = mobileApiService.findCardByUserid(user.userid!!)
+        val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+            this.userid = user.userid
+            this.cardtype = ConstantUtil.CARDTYPE_BANKCARD
+        })
+        var card:QueryCardInfo? = null
+        if (cardResponse.retcode == 0) {
+            card = cardResponse.card
+        }
+        val personResponse = userProxy.queryPerson(user.userid)
+        if (personResponse.retcode != 0) {
+            logger.error { "查询用户[${user.userid}]信息失败:${personResponse.retmsg}" }
+            return JsonResult.error("查询用户信息失败,请稍后重试")
+        }
+        val person = personResponse.person
         var needrebind = false
         var signed = ""
         if (card == null) {
@@ -795,9 +877,18 @@
             }
 
         }
-
         val name = person.name
-        val page = userService.findPersondtlByUserid(user.userid!!, no, month)
+        val queryDtlInfo = userProxy.queryPersonDtl(QueryPersonDtlParam().apply {
+            this.month = month
+            this.userid = user.userid
+            this.pageno = no
+            this.pagesize = 10
+        })
+        if (queryDtlInfo["retcode"] != 0) {
+            logger.error { "查询用户[${user.userid}]月份[${month}]的流水失败:${queryDtlInfo["retmsg"]}" }
+            return JsonResult.error("查询流水失败,请稍后重试")
+        }
+        val page = queryDtlInfo["data"]
         return JsonResult.ok("OK").put("page", page)
                 ?.put("today", today)
                 ?.put("yesterday", yester)
@@ -825,8 +916,12 @@
         if (user.userid.isNullOrEmpty()) {
             return JsonResult.ok("OK")
         }
-        val data = userService.findDtlMonthCountByUserid(user.userid!!, month)
-        return JsonResult.ok().put("data", data)
+        val billCount = userProxy.billCount(user.userid!!, month)
+        if (billCount["retcode"] != 0) {
+            logger.error { "查询用户[${user.userid}]月份[${month}]的统计流水失败:${billCount["retmsg"]}" }
+            return JsonResult.error("查询流水失败,请稍后重试")
+        }
+        return JsonResult.ok().put("data", billCount["data"])
     }
 
     /**
@@ -896,9 +991,21 @@
         if (user.userid.isNullOrEmpty()) {
             return JsonResult.error(-1, "银行卡未绑定,请先绑定")
         }
-        val person = userService.findOnePersonByUserid(user.userid!!)
-        val card = mobileApiService.findCardByUserid(user.userid!!)
-                ?: return JsonResult.error(-1, "银行卡未绑定,请先绑定")
+        val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+            this.userid = user.userid
+            this.cardtype = ConstantUtil.CARDTYPE_BANKCARD
+        })
+        if (cardResponse.retcode != 0) {
+            logger.error { "查询用户[${user.userid}]卡片信息失败:${cardResponse.retmsg}" }
+            return JsonResult.error(-1, "银行卡未绑定,请先绑定")
+        }
+        val card = cardResponse.card
+        val personResponse = userProxy.queryPerson(user.userid)
+        if (personResponse.retcode!= 0) {
+            logger.error { "查询用户[${user.userid}]信息失败:${personResponse.retmsg}" }
+            return JsonResult.error("查询用户信息失败,请稍后重试")
+        }
+        val person = personResponse.person
         var status = ""
         //normal/loss/frozen/locked
         when (card.transStatus) {
@@ -938,13 +1045,24 @@
                 if (it) mobileApiService.saveUser(user)
             }
         }
-        var card = mobileApiService.findCardByUserid(user.userid!!)
-                ?: return JsonResult.error(-1, "银行卡未绑定,请先绑定")
+        val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+            this.userid = user.userid
+            this.cardtype = ConstantUtil.CARDTYPE_BANKCARD
+        })
+        if (cardResponse.retcode != 0) {
+            logger.error { "查询用户[${user.userid}]卡片信息失败:${cardResponse.retmsg}" }
+            return JsonResult.error(-1, "银行卡未绑定,请先绑定")
+        }
+        val card = cardResponse.card
         if (card.transStatus != TradeDict.STATUS_NORMAL) {
             return JsonResult.error("卡状态非正常,不能挂失")
         }
         card.transStatus = TradeDict.STATUS_LOST
-        mobileApiService.saveCard(card)
+        val response = userProxy.updateCardTransStatus(card.cardno, TradeDict.STATUS_LOST)
+        if (response.retcode != 0) {
+            logger.error { "更新卡片交易状态失败:${response.retmsg}" }
+            return JsonResult.error("挂失失败,请稍后重试")
+        }
         return JsonResult.ok("ok")
     }
 
@@ -976,17 +1094,33 @@
                 ?: return JsonResult.error("用户不存在,请注册")
         var signed: String
         if (!user.userid.isNullOrEmpty()) {
-            var card = mobileApiService.findCardByUserid(user.userid!!)
-                    ?: return JsonResult.error("银行卡不存在,不能解除代扣协议")
+            val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+                this.userid = user.userid
+                this.cardtype = ConstantUtil.CARDTYPE_BANKCARD
+            })
+            if (cardResponse.retcode != 0) {
+                logger.error { "查询用户[${user.userid}]卡片信息失败:${cardResponse.retmsg}" }
+                return JsonResult.error(-1, "银行卡不存在,不能解除代扣协议")
+            }
+            val card = cardResponse.card
             //call sign api
-            val person = userService.findOnePersonByUserid(card.userid)
+            val personResponse = userProxy.queryPerson(card.userid)
+            if (personResponse.retcode != 0) {
+                logger.error { "查询用户[${card.userid}]信息失败:${personResponse.retmsg}" }
+                return JsonResult.error("查询用户信息失败,请稍后重试")
+            }
+            val person = personResponse.person
             val captcha = ""//此处为验证码,暂由此参数代替
             var resp = citizencardPayService.signCard(card.cardno, person.name, person.idtype, person.idno, user.phone!!, YnrccUtil.TRANSTYPE_UNSIGNCARD, captcha)
             if (resp.code != "0000") {
                 return JsonResult.error(resp.message)
             }
             card.signed = false
-            mobileApiService.saveCard(card)
+            val response = userProxy.updateCardSign(card.cardno, false)
+            if (response.retcode != 0) {
+                logger.error { "更新卡片签约状态失败:${response.retmsg}" }
+                return JsonResult.error("解除银行协议失败,请稍后重试")
+            }
             signed = TradeDict.STATUS_NO
         } else {
             return JsonResult.error("未绑定银行卡,不能解除代扣协议")
@@ -1023,11 +1157,22 @@
                 if (it) mobileApiService.saveUser(user)
             }
         }
-        var card = mobileApiService.findCardByUserid(user.userid!!)
-                ?: return JsonResult.error(-1, "银行卡未绑定,无需解绑")
+        val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+            this.userid = user.userid
+            this.cardtype = ConstantUtil.CARDTYPE_BANKCARD
+        })
+        if (cardResponse.retcode != 0) {
+            logger.error { "查询用户[${user.userid}]卡片信息失败:${cardResponse.retmsg}" }
+            return JsonResult.error(-1, "银行卡未绑定,无需解绑")
+        }
+        val card = cardResponse.card
         card.signed = false
         user.userid = null
-        mobileApiService.saveCard(card)
+        val response = userProxy.updateCardSign(card.cardno, false)
+        if (response.retcode != 0) {
+            logger.error { "更新卡片签约状态失败:${response.retmsg}" }
+            return JsonResult.error("解除绑定失败,请稍后重试")
+        }
         mobileApiService.saveUser(user)
         return JsonResult.ok("OK")
                 ?.put("signed", TradeDict.STATUS_NO)!!
@@ -1114,4 +1259,136 @@
                 ?: return JsonResult.error("未找到该条留言")
         return JsonResult.ok().put("data",feedback)
     }
+
+    /**
+     * 查询用户总积分
+     */
+    @Suppress("UNCHECKED_CAST")
+    @RequestMapping(value = ["/point/total"],method = [RequestMethod.GET])
+    fun getTotalPoint():JsonResult?{
+        val p = SecurityContextHolder.getContext().authentication
+        val user = (mobileApiService.findUserById(p.name)
+                ?: return JsonResult.error("用户不存在,请注册"))
+        if (!user.userid.isNullOrEmpty()) {
+            val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+                this.userid = user.userid
+                this.cardtype = ConstantUtil.CARDTYPE_CITIZENCARD
+            })
+            if (cardResponse.retcode != 0) {
+                return JsonResult.ok().put("data",0)
+            }
+            val card = cardResponse.card
+            val personResponse = userProxy.queryPerson(card.userid)
+            if (personResponse.retcode != 0) {
+                return JsonResult.ok().put("data",0)
+            }
+            val person = personResponse.person
+            val pointResponse = userProxy.getUserPoints(UserPointsParam().apply {
+                this.pageNo = 1
+                this.pageSize = 1
+                this.name = person.name
+                this.idno = card.cardno
+            })
+            if (pointResponse["retcode"] != 0) {
+                logger.error { "查询用户[${user.userid}]积分失败" }
+                return JsonResult.error("查询积分失败")
+            }
+            val page = pointResponse["page"] as LinkedHashMap<String,Any>
+            val data = page["data"] as ArrayList<LinkedHashMap<String,Any>>
+            if (data.isNotEmpty()) {
+                val pointsMain = data[0]["tPointsMain"] as LinkedHashMap<String,Any>
+                return JsonResult.ok().put("data",pointsMain["points"])
+            }
+            return JsonResult.ok().put("data",0)
+        }else{
+            return JsonResult.ok().put("data",0)
+        }
+    }
+
+    /**
+     * 查询用户积分流水
+     */
+    @RequestMapping(value = ["/point/flow"],method = [RequestMethod.GET])
+    fun getTotalPoint(pageno:Int,pagesize:Int):JsonResult?{
+        val p = SecurityContextHolder.getContext().authentication
+        val user = (mobileApiService.findUserById(p.name)
+                ?: return JsonResult.error("用户不存在,请注册"))
+        val emptyResult = PageResult<Any>().apply {
+            this.count = 0
+        }
+        if (!user.userid.isNullOrEmpty()) {
+            val cardResponse = userProxy.queryCard(QueryCardParam().apply {
+                this.userid = user.userid
+                this.cardtype = ConstantUtil.CARDTYPE_CITIZENCARD
+            })
+            if (cardResponse.retcode != 0) {
+                return JsonResult.ok().put("data",emptyResult)
+            }
+            val card = cardResponse.card
+            val personResponse = userProxy.queryPerson(card.userid)
+            if (personResponse.retcode != 0) {
+                return JsonResult.ok().put("data",emptyResult)
+            }
+            val person = personResponse.person
+            val pointResponse = userProxy.getUserPoints(UserPointsParam().apply {
+                this.pageNo = pageno
+                this.pageSize = pagesize
+                this.name = person.name
+                this.idno = card.cardno
+            })
+            if (pointResponse["retcode"] != 0) {
+                logger.error { "查询用户[${user.userid}]积分流水失败" }
+                return JsonResult.error("查询积分流水失败")
+            }
+            return JsonResult.ok().put("data",pointResponse["page"])
+        }else{
+            return JsonResult.ok().put("data",emptyResult)
+        }
+    }
+
+    /**
+     * 完成积分任务
+     */
+    @RequestMapping(value = ["/point/task/{taskcode}"],method = [RequestMethod.POST])
+    fun completePointTask(@PathVariable taskcode:String):JsonResult?{
+        try {
+            val p = SecurityContextHolder.getContext().authentication
+            val user = (mobileApiService.findUserById(p.name)
+                    ?: return JsonResult.error("用户不存在,请注册"))
+            if (!user.userid.isNullOrEmpty()) {
+                val personResponse = userProxy.queryPerson(user.userid)
+                if (personResponse.retcode != 0) {
+                    logger.error { "查询用户[${user.userid}]信息失败:${personResponse.retmsg}" }
+                    return JsonResult.error("查询用户信息失败,请稍后重试")
+                }
+                return userService.completePointTask(user,taskcode)
+            } else {
+                return JsonResult.error("未绑定银行卡,不能获取积分")
+            }
+        } catch (e: Exception) {
+            if (e is PortalBusinessException) {
+                return JsonResult.error(e.message)
+            }
+            return JsonResult.error("服务器繁忙,请稍后重试")
+        }
+    }
+
+    /**
+     * 查询积分状态
+     */
+    @RequestMapping(value = ["/point/taskstatus"],method = [RequestMethod.GET])
+    fun completePointTask():JsonResult?{
+        try {
+            val p = SecurityContextHolder.getContext().authentication
+            val user = (mobileApiService.findUserById(p.name)
+                    ?: return JsonResult.error("用户不存在,请注册"))
+            val result = userService.queryPointTaskStatus(user)
+            return JsonResult.ok().put("data",result)
+        } catch (e: Exception) {
+            if (e is PortalBusinessException) {
+                return JsonResult.error(e.message)
+            }
+            return JsonResult.error("服务器繁忙,请稍后重试")
+        }
+    }
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
index 339e607..7f84e2c 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
@@ -178,6 +178,9 @@
     @Column(name = "phone", length = 15)
     var phone: String? = null
 
+    @Column(name = "lastsignintime", length = 14)
+    var lastsignintime: String? = null
+
     fun checkLoginpwdtime():Int{
         if (this.loginpwderror >= 5 && (System.currentTimeMillis() - this.loginpwderrortime!!) < 1000 * 60 * 30) {
             return -1
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 8860dc1..a7ef28b 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/PortalApi.kt
@@ -75,7 +75,7 @@
             val p = SecurityContextHolder.getContext().authentication
             val oper = operatorDetailService.findByOperid(p.name)
             val data = HashMap<String, String>()
-            val url = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGESERVER_URL)
+            val url = systemUtilService.getBusinessValue(PortalConstant.SYSPARA_IMAGE_URLPUSH)
             data["name"] = oper.opername
             data["roles"] = "admin"
             data["url"] = url
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/FeedbackSearchBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/FeedbackSearchBean.kt
index d15c56b..07826b9 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/FeedbackSearchBean.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/FeedbackSearchBean.kt
@@ -1,7 +1,7 @@
 package com.supwisdom.dlpay.portal.bean
 
 class FeedbackSearchBean {
-    var username: String = ""
+    var phone: String = ""
     var title: String = ""
     var startdate: String = ""
     var enddate: String = ""
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/PointTaskBean.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/PointTaskBean.kt
new file mode 100644
index 0000000..357865e
--- /dev/null
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/bean/PointTaskBean.kt
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.portal.bean
+
+import com.supwisdom.dlpay.portal.util.PortalConstant.POINTTASK_STATUS_RECEIVED
+
+class PointTaskBean {
+    var taskcode: String = ""
+    var status: String = POINTTASK_STATUS_RECEIVED
+    var points: Int = 0
+    var taskname: String = ""
+}
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ResourceDao.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ResourceDao.kt
index 4d79afe..d66dd64 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ResourceDao.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/dao/ResourceDao.kt
@@ -8,9 +8,9 @@
 @Repository
 interface ResourceDao : JpaRepository<TBResource, String> {
 
-    @Query("select t2 from TRoleResource t1,TBResource t2 where t1.resid = t2.resid and t2.isleaf = '0' and t1.roleid=?1 order by t2.ordernum")
+    @Query("select t2 from TRoleResource t1,TBResource t2 where t1.resid = t2.resid and t2.isleaf = '0' and t1.roleid=?1 and showflag='1' order by t2.ordernum")
     fun findRootListByRole(roleId: String): List<TBResource>
 
-    @Query("select t2 from TRoleResource t1,TBResource t2 where t1.resid = t2.resid and t2.isleaf = '1' and t1.roleid=?1 and t2.parentid=?2 order by t2.ordernum")
+    @Query("select t2 from TRoleResource t1,TBResource t2 where t1.resid = t2.resid and t2.isleaf = '1' and t1.roleid=?1 and showflag='1' and t2.parentid=?2 order by t2.ordernum")
     fun findChildrenByRoleAndParent(roleId: String, parentId: String): List<TBResource>
 }
\ No newline at end of file
diff --git a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/FeedbackServiceImpl.kt b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/FeedbackServiceImpl.kt
index dfa359d..b4f5e70 100644
--- a/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/FeedbackServiceImpl.kt
+++ b/backend/src/main/kotlin/com/supwisdom/dlpay/portal/service/Impl/FeedbackServiceImpl.kt
@@ -37,12 +37,7 @@
         val list = page.list as List<TBFeedback>
         list.forEach {
             it.pictures = annexDao.getByFbid(it.fbid)
-            if (it.userid.isNullOrEmpty()) {
-                val mobileUser = mobileUserService.getByUid(it.mobileid)
-                if (mobileUser != null) {
-                    it.username = "用户" + mobileUser.phone!!.substring(7)
-                }
-            }
+            it.username = "用户" + it.username.substring(7)
         }
         return page
     }
diff --git a/backend/src/main/resources/data-postgresql.sql b/backend/src/main/resources/data-postgresql.sql
index 562254a..1a98333 100644
--- a/backend/src/main/resources/data-postgresql.sql
+++ b/backend/src/main/resources/data-postgresql.sql
@@ -5,5 +5,42 @@
 INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('imageserver.url.image', 'http://ykt.supwisdom.com:9119/touchorder/dcpic', '{tenentid}');
 INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('imageserver.url.push', 'http://ykt.supwisdom.com:8777', '{tenentid}');
 
+INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('sms.addserial', '', '{tenantid}');
+INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('sms.priority', '1', '{tenantid}');
+INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('sms.ecname', '大理市信息化发展有限责任公司', '{tenantid}');
+INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('sms.sign', 'Yuns9bbB5', '{tenantid}');
+INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('sms.tempid', '755a16cc9c0649acbb3f3b0415a49a46', '{tenantid}');
+INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('sms.account', 'dlapp', '{tenantid}');
+INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('sms.url', 'http://112.35.4.197:15000', '{tenantid}');
+INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('sms.pwd', 'kingstar#2019', '{tenantid}');
+INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('article.currentno', '1', '{tenentid}');
+INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('portal.appid', '700001', '{tenentid}');
+INSERT INTO "tb_businesspara"("parakey", "paraval", "tenantid") VALUES ('portal.secret', '5f788ce433ec44f299351cdf7f137e81', '{tenentid}');
+
+INSERT INTO "tb_column"("columnid", "isleaf", "name", "needreview", "parentid", "code", "ispublic", "publishable", "ordernum") VALUES ('2c9cab947451988c017451a737b10000', '0', '线上活动', '0', '', 'OnlineActivities', '1', '1', 12);
+INSERT INTO "tb_column"("columnid", "isleaf", "name", "needreview", "parentid", "code", "ispublic", "publishable", "ordernum") VALUES ('2c9cab947451988c017451b280870001', '0', '线下活动', '0', '', 'OfflineActivities', '1', '1', 13);
+INSERT INTO "tb_column"("columnid", "isleaf", "name", "needreview", "parentid", "code", "ispublic", "publishable", "ordernum") VALUES ('2c9cab947428d6fe017428d8c2610000', '0', '热门活动', '0', NULL, 'PopularActivities', '1', '1', 1);
+
+INSERT INTO "tb_resource"("resid", "isleaf", "ordernum", "parentid", "resname", "respath", "showflag", "icon") VALUES ('f066939ecbf64da3a54fa93d56e4391b', '0', 1, NULL, '系统中心', '#', '1', 'el-icon-s-home');
+INSERT INTO "tb_resource"("resid", "isleaf", "ordernum", "parentid", "resname", "respath", "showflag", "icon") VALUES ('286daeeccc8847f4a5a24b2c04079e33', '1', 1, 'f066939ecbf64da3a54fa93d56e4391b', '操作员管理', '/operator/index', '1', NULL);
+INSERT INTO "tb_resource"("resid", "isleaf", "ordernum", "parentid", "resname", "respath", "showflag", "icon") VALUES ('42f227fbe7744adcaef7d15583276a33', '1', 2, 'f066939ecbf64da3a54fa93d56e4391b', '留言管理', '/feedback/index', '1', NULL);
+INSERT INTO "tb_resource"("resid", "isleaf", "ordernum", "parentid", "resname", "respath", "showflag", "icon") VALUES ('a1de09561f6740cab1065707fff8e8ae', '1', 3, 'f066939ecbf64da3a54fa93d56e4391b', '推送消息管理', '/pushmsg/index', '1', NULL);
+INSERT INTO "tb_resource"("resid", "isleaf", "ordernum", "parentid", "resname", "respath", "showflag", "icon") VALUES ('81d3556981c34633adadb0fc4dc8d1f3', '1', 4, 'f066939ecbf64da3a54fa93d56e4391b', '栏目管理', '/column/index', '1', NULL);
+INSERT INTO "tb_resource"("resid", "isleaf", "ordernum", "parentid", "resname", "respath", "showflag", "icon") VALUES ('99604b8d18b34417befe051a3720cbed', '1', 6, 'f066939ecbf64da3a54fa93d56e4391b', '创建文章', '/article/create', '1', NULL);
+INSERT INTO "tb_resource"("resid", "isleaf", "ordernum", "parentid", "resname", "respath", "showflag", "icon") VALUES ('4665765bf07d455486f2a5215dd97380', '1', 5, 'f066939ecbf64da3a54fa93d56e4391b', '文章管理', '/article/list', '1', NULL);
+
+INSERT INTO "tb_operator"("operid", "closedate", "email", "mobile", "opendate", "opercode", "opername", "operpwd", "opertype", "sex", "status", "tenantid", "thirdadmin", "jti", "roleid") VALUES ('LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', '20500101', NULL, NULL, '20190101', 'system', '系统管理员', '$2a$10$Ex9xp11.vCaD8D0a7ahiUOKqDij1TcCUBwRAmrqXeDvAkmzLibn4.', 'oper', NULL, 'normal', '{tenantid}', 'no', 'QwC1ln7rReYmBOhq57op6Q', '20497f2fa27a44f7841492288ab75d88');
+
+INSERT INTO "tb_role"("roleid", "detail", "moditime", "rolecode", "rolename") VALUES ('20497f2fa27a44f7841492288ab75d88', '系统管理员', '20200803173823', 'S', '系统管理员');
+
+INSERT INTO "tb_role_resource"("id", "addtime", "resid", "roleid") VALUES ('36fe95266fbc4eabacf2b7022b1bf7f2', '20200803174123', 'f066939ecbf64da3a54fa93d56e4391b', '20497f2fa27a44f7841492288ab75d88');
+INSERT INTO "tb_role_resource"("id", "addtime", "resid", "roleid") VALUES ('7197af22f7864c1ca15817a54dc6411c', '20200803174123', '286daeeccc8847f4a5a24b2c04079e33', '20497f2fa27a44f7841492288ab75d88');
+INSERT INTO "tb_role_resource"("id", "addtime", "resid", "roleid") VALUES ('5521acf036d54dc78f751e8a674133fb', '20200804141135', '42f227fbe7744adcaef7d15583276a33', '20497f2fa27a44f7841492288ab75d88');
+INSERT INTO "tb_role_resource"("id", "addtime", "resid", "roleid") VALUES ('ea8752334cde4df09db81189cc06bafa', '20200814165959', 'a1de09561f6740cab1065707fff8e8ae', '20497f2fa27a44f7841492288ab75d88');
+INSERT INTO "tb_role_resource"("id", "addtime", "resid", "roleid") VALUES ('fd4a4e21231e4844b1310f95afc40f9a', '20200825152358', '81d3556981c34633adadb0fc4dc8d1f3', '20497f2fa27a44f7841492288ab75d88');
+INSERT INTO "tb_role_resource"("id", "addtime", "resid", "roleid") VALUES ('fc8f90bb3b6d41f8b7e1b840b1a0d590', '20200827110834', '4665765bf07d455486f2a5215dd97380', '20497f2fa27a44f7841492288ab75d88');
+INSERT INTO "tb_role_resource"("id", "addtime", "resid", "roleid") VALUES ('460d7f0b57eb4dcfb73fb1b51ad37f4f', '20200827142245', '99604b8d18b34417befe051a3720cbed', '20497f2fa27a44f7841492288ab75d88');
+
+
 ---------  end of script
 commit;
diff --git a/backend/src/main/resources/data.sql b/backend/src/main/resources/data.sql
index 3bd9798..8512f52 100644
--- a/backend/src/main/resources/data.sql
+++ b/backend/src/main/resources/data.sql
@@ -1,15 +1,6 @@
 INSERT INTO tb_tenantconfig(cfgid, tenantid, datacenter_id)
 values ('main', '{tenantid}', '01');
 
-INSERT INTO tb_operator(operid, closedate, opendate, opercode, opername, operpwd, opertype, status, thirdadmin, tenantid)
-VALUES ('LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', '20500101', '20190101', 'system', '系统管理员', '$2a$10$Ex9xp11.vCaD8D0a7ahiUOKqDij1TcCUBwRAmrqXeDvAkmzLibn4.', 'oper', 'normal', 'no', '{tenantid}');
-
-
-INSERT INTO tb_role(roleid, createtime, editflag, lastsaved, rolecode, roledesc, rolename, tenantid)
-VALUES ('d1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '20190101000000', 0, '', 'ROLE_ADMIN', '超级管理员', '超级管理员', '{tenantid}');
-
-INSERT INTO tb_oper_role(id, operid, roleid, tenantid)
-VALUES ('1', 'LOR2IwRkbOjp+sVG9KR2BpHZbwGKepS4', 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
 
 INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
 VALUES (1, NULL, 0, NULL, 'layui-icon-home', '#', '主页', 1, -1, '{tenantid}');