对账任务修改
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
index c04f3f3..18c15d9 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
@@ -13,6 +13,6 @@
 public interface PersondtlDao extends JpaRepository<TPersondtl, String>,JpaSpecificationExecutor<TPersondtl> {
     Page<TPersondtl> findByUseridAndStatus(String userid,String status, Pageable pageable);
 
-    @Query("select count(t.refno) as totalcnt,sum(t.amount) as totalamt from TPersondtl t where t.accdate=?1 and t.sourceType=?2 and t.tenantid=?3 ")
+    @Query("select count(t.refno) as totalcnt,sum(t.amount) as totalamt from TPersondtl t where t.status='success' and t.accdate=?1 and t.sourceType=?2 and t.tenantid=?3 ")
     CountAmountBean getPersondtlSumInfo(String accdate, String sourcetype, String tenantid);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeCheckDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeCheckDao.java
index 9f1a81d..13244fe 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeCheckDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/SourceTypeCheckDao.java
@@ -1,7 +1,10 @@
 package com.supwisdom.dlpay.api.dao;
 
 import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus;
+import com.supwisdom.dlpay.framework.data.ExistBean;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 
 @Repository
@@ -10,4 +13,8 @@
 
   TSourceTypeCheckStatus getById(int id);
 
+
+  @Query(value = "select count(a.sourcetype_id) as existed from tb_sourcetype a left join tb_sourcetype_check b on a.sourcetype=b.sourcetype and a.tenantid=b.tenantid " +
+      " where a.tenantid=:tenantid and a.enable=true and a.checkable=true and coalesce(b.check_accdate,'00000000')<=:settledate ", nativeQuery = true)
+  ExistBean checkCanSettleCondition(@Param("settledate") String settledate, @Param("tenantid") String tenantid);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkdtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkdtlDao.java
index 0b80ad7..ce066d4 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkdtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/TransactionChkdtlDao.java
@@ -42,7 +42,7 @@
   @Query("select count(t.id) as existed from TTransactionChkdtl t where t.chkfileId=?1 and t.chkresult=?2 ")
   ExistBean getCountByChkresult(String chkfileId, String chkresult);
 
-  @Query(value = "select t.refno from TB_PERSONDTL t left join TB_TRANSACTION_CHKDTL a on t.REFNO=a.OTHER_REFNO and a.CHKFILE_ID=:chkfileId " +
+  @Query(value = "select t.refno from TB_PERSONDTL t left join TB_TRANSACTION_CHKDTL a on t.REFNO=a.LOCAL_REFNO and a.CHKFILE_ID=:chkfileId " +
       " where t.ACCDATE=:accdate and t.SOURCETYPE=:sourcetype and t.status='success' and a.id is null order by t.refno ", nativeQuery = true)
   List<String> findLocalMoreDtls(@Param("accdate") String accdate, @Param("sourcetype") String sourcetype, @Param("chkfileId") String chkfileId);
 
@@ -54,4 +54,7 @@
 
   @Query("select count(t.id) as existed from TTransactionChkdtl t where t.chkfileId=?1 and t.resolved<>'equal' ")
   ExistBean getChkdtlNotEqualCount(String chkfileId);
+
+  @Query("select count(t.id) as existed from TTransactionChkdtl t where t.chkfileId=?1 and t.resolved='equal' ")
+  ExistBean getChkdtlEqualCount(String chkfileId);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java
index 49f1d81..befec80 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceType.java
@@ -58,10 +58,12 @@
   @Column(name = "PAYDESC", length = 200)
   private String paydesc;
 
-
-  @Column(name = "tplusn", precision = 5)
+  @Column(name = "tplusn", nullable = false, precision = 5)
   private Integer tplusN; // 系统结算日期,  T+0 ~ T+N
 
+  @Column(name = "START_CHKTIME", precision = 5)
+  private String startChktime; //开始能对账的时间。比如微信、支付宝是上午10点生成对账单,一般设为10:30开始对,则填:103000;为空时这说明无限制
+
   @Column(name = "tenantid", length = 20)
   @NotNull
   private String tenantid = "";
@@ -179,4 +181,12 @@
   public void setTplusN(Integer tplusN) {
     this.tplusN = tplusN;
   }
+
+  public String getStartChktime() {
+    return startChktime;
+  }
+
+  public void setStartChktime(String startChktime) {
+    this.startChktime = startChktime;
+  }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceTypeCheckStatus.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceTypeCheckStatus.java
index aae858e..e055f3c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceTypeCheckStatus.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TSourceTypeCheckStatus.java
@@ -22,16 +22,13 @@
   @NotNull
   private String startAccdate; // 对账起始日期
 
-  @Column(name = "check_file_date", length = 8)
-  private String checkFileDate; // 当前对账文件日期
-
-  @Column(name = "check_file_status")
-  private Boolean checkFileOk; // 当前对账文件下载成功标志
-
   @Column(name = "check_accdate", length = 8)
   @NotNull
   private String checkAccdate; // 当前对账记账日期
 
+  @Column(name = "check_file_status")
+  private Boolean checkFileOk; // 当前对账文件下载成功标志
+
   @Column(name = "check_status")
   @NotNull
   private Boolean checkStatus; // 当前对账完成状态
@@ -118,14 +115,6 @@
     this.startAccdate = startAccdate;
   }
 
-  public String getCheckFileDate() {
-    return checkFileDate;
-  }
-
-  public void setCheckFileDate(String checkFileDate) {
-    this.checkFileDate = checkFileDate;
-  }
-
   public Boolean getCheckFileOk() {
     return checkFileOk;
   }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkdtl.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkdtl.java
index ef5422a..a96eb07 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkdtl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkdtl.java
@@ -66,7 +66,7 @@
   @Column(name = "LASTSAVED")
   private Timestamp lastsaved;
 
-  @Column(name = "tenantid", length = 20)
+  @Column(name = "tenantid", nullable = false, length = 20)
   private String tenantid = "";
 
   public String getId() {
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkfile.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkfile.java
index f6f3df6..d5499dc 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkfile.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TTransactionChkfile.java
@@ -46,7 +46,7 @@
   @Column(name = "LASTSAVED")
   private Timestamp lastsaved;
 
-  @Column(name = "tenantid", length = 20)
+  @Column(name = "tenantid", nullable = false, length = 20)
   private String tenantid = "";
 
   public String getId() {
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
index 88e3eb2..5dc15cb 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
@@ -23,6 +23,9 @@
   @Query(value = "from TSettlectl where tenantId=:tenantid ")
   TSettlectl findByTenantIdWithLock(@Param("tenantid") String tenantid);
 
+  @Query(value = "from TSettlectl where tenantId=:tenantid ")
+  TSettlectl findByTenantId(@Param("tenantid") String tenantid);
+
   @Modifying(clearAutomatically = true)
   @Query(value = "update TB_SETTLECTL set PERIODYEAR=:peridyear,PERIODMONTH=:peridmonth where BOOKSETNO=1 ", nativeQuery = true)
   void updateSettlePeriod(@Param("peridyear") int peridyear, @Param("peridmonth") int peridmonth);
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
index 7eda63d..1c8123b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
@@ -71,4 +71,7 @@
 
   String getSubsystemSignKey(String syscode);
 
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  String getSettleDateBytenantId(String tenantId) throws Exception;
+
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendSettleServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendSettleServiceImpl.java
index d1ff06d..94566fa 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendSettleServiceImpl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendSettleServiceImpl.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.framework.service.impl;
 
 import com.supwisdom.dlpay.api.dao.DebitCreditDtlDao;
+import com.supwisdom.dlpay.api.dao.SourceTypeCheckDao;
 import com.supwisdom.dlpay.exception.TransactionException;
 import com.supwisdom.dlpay.framework.dao.*;
 import com.supwisdom.dlpay.framework.data.FSubjectInfoBean;
@@ -53,6 +54,8 @@
   private SubjectdayDao subjectdayDao;
   @Autowired
   private DebitCreditDtlDao debitCreditDtlDao;
+  @Autowired
+  private SourceTypeCheckDao sourceTypeCheckDao;
 
 
   private static final Logger logger = LoggerFactory.getLogger(DayendSettleServiceImpl.class);
@@ -157,6 +160,10 @@
       throw new TransactionException(-99, "日终结算已完成");
     }
 
+    if (sourceTypeCheckDao.checkCanSettleCondition(String.valueOf(settledate), tSettlectl.getTenantId()).getExisted() > 0) {
+      throw new TransactionException(-90, "有对账未完成");
+    }
+
     TPeriod period = periodDao.getPeriod(periodYear, periodMonth, TenantContext.getTenantSchema());
     if (null == period) throw new Exception("year=[" + periodYear + "],month=[" + periodMonth + "] t_period not find ");
     if (settledate > Integer.valueOf(period.getEnddate())) {
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
index d67a64d..a15f4de 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
@@ -1,5 +1,7 @@
 package com.supwisdom.dlpay.framework.service.impl;
 
+import com.supwisdom.dlpay.exception.TransactionCheckException;
+import com.supwisdom.dlpay.exception.TransactionProcessException;
 import com.supwisdom.dlpay.framework.core.DatabaseConfig;
 import com.supwisdom.dlpay.framework.dao.*;
 import com.supwisdom.dlpay.framework.data.SystemDateTime;
@@ -8,6 +10,7 @@
 import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.framework.util.NumberUtil;
 import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.framework.util.TradeErrorCode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -183,4 +186,11 @@
     return "";
   }
 
+  @Override
+  public String getSettleDateBytenantId(String tenantId) throws Exception{
+    TSettlectl ctl = settleCtlDao.findByTenantId(tenantId);
+    if(null==ctl) throw new TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR,"获取当前结算日期失败!");
+    return ctl.getSettledate().toString();
+  }
+
 }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_checkfile_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_checkfile_service.kt
index 253ef36..25c298b 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_checkfile_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_checkfile_service.kt
@@ -40,7 +40,7 @@
 
     override fun acquireCheckFile(checkStatus: TSourceTypeCheckStatus): AgentResponse<TSourceTypeCheckStatus> {
         try {
-            val billDate = checkStatus.checkFileDate
+            val billDate = checkStatus.checkAccdate
             logger.info("大理农商行对账单下载:download checkdate=【$billDate】")
 
             val chkfile: TTransactionChkfile = transactionReconciliationService
@@ -130,7 +130,7 @@
 
     override fun downloadCheckFile(checkStatus: TSourceTypeCheckStatus): AgentResponse<TSourceTypeCheckStatus> {
         try {
-            val billDate = checkStatus.checkFileDate
+            val billDate = checkStatus.checkAccdate
             val agentUrl = checkStatus.chkfileUrl
             if ("none" == agentUrl) {
                 return successDownload("当日无交易明细", checkStatus)
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt
index f6416e0..87107ff 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/scheduler_sourcetype_chk.kt
@@ -10,6 +10,8 @@
 import com.supwisdom.dlpay.api.service.TransactionReconciliationService
 import com.supwisdom.dlpay.exception.TransactionException
 import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.tenant.TenantContext
+import com.supwisdom.dlpay.framework.util.Constants
 import com.supwisdom.dlpay.framework.util.DateUtil
 import com.supwisdom.dlpay.util.ConstantUtil
 import mu.KotlinLogging
@@ -78,67 +80,86 @@
     @Autowired
     private lateinit var sourceTypeCheckExecutor: SourceTypeCheckExecutor
 
-    private fun prepareCheckStatus(checkStatus: TSourceTypeCheckStatus) {
-        if (checkStatus.startAccdate.isNullOrEmpty()) {
-            // 没有对账文件状态时创建一条以当前系统记账日期为起始时间的对账明细
-            checkStatus.startAccdate = systemUtilService.accdate
-            checkStatus.checkAccdate = checkStatus.startAccdate
-            checkStatus.checkFileDate = checkStatus.startAccdate
-        } else {
-            checkStatus.apply {
-                checkAccdate = DateUtil.getNewDay(checkAccdate, 1)
-                checkFileDate = DateUtil.getNewDay(checkFileDate, 1)
-            }
-        }
-        checkStatus.apply {
-            this.checkStatus = false
-            checkFileOk = false
-            repairStatus = false
-            settleStatus = false
-            forceRecheck = false
-        }
-    }
-
     private fun newSourceTypeStatus(sourceType: TSourceType, accdate: String): TSourceTypeCheckStatus {
-        return TSourceTypeCheckStatus().also {
-            it.sourceType = sourceType.sourceType
-            it.tenantId = sourceType.tenantid
-            // 没有对账文件状态时创建一条以当前系统记账日期为起始时间的对账明细
-        }
+        return sourceTypeService.saveOrUpdateSourceTypeCheckStatus(TSourceTypeCheckStatus().apply {
+            this.sourceType = sourceType.sourceType
+            this.startAccdate = accdate
+            this.checkAccdate = accdate
+            this.checkFileOk = false
+            this.checkStatus = false
+            this.repairStatus = false
+            this.settleStatus = false
+            this.forceRecheck = false
+            this.lastUpdate = systemUtilService.sysdatetime.sysdate
+            this.tenantId = sourceType.tenantid
+            this.chkfileUrl = null
+            this.remark = null
+        })
     }
 
-    private fun isCheckFinish(status: TSourceTypeCheckStatus): Boolean {
-        return (status.checkStatus && status.repairStatus)
+    private fun canStartCheck(sourcetype: TSourceType): Boolean {
+        val hosttime = systemUtilService.sysdatetime.hosttime
+        if(DateUtil.checkDatetimeValid(sourcetype.startChktime,DateUtil.TIME_FMT) && DateUtil.compareDatetime(hosttime, sourcetype.startChktime, DateUtil.TIME_FMT)<=0){
+            return false //sourcetype 设定了每天开始对账时间,小于这个对账时间不能对账
+        }
+        return true
     }
 
     private fun determineSourceTypeCheck(sourcetype: TSourceType): TSourceTypeCheckStatus? {
-        if (!sourcetype.checkable || !sourcetype.enable) {
-            return null
-        }
-        val accdate = systemUtilService.accdate
-        val status = sourceTypeService.getSourceTypeCheckStatus(sourcetype.sourceType)
-                ?: newSourceTypeStatus(sourcetype, accdate)
+        try {
+            if (!sourcetype.checkable || !sourcetype.enable) {
+                return null
+            }
 
-        val interval = DateUtil.getIntervalDay(status.checkAccdate, accdate).toInt()
-        return if (status.checkStatus && status.repairStatus && interval == sourcetype.tplusN) {
-            // 当前日期对账已完成,并且已经对账到最后一天
-            null
-        } else if (status.checkStatus && interval > sourcetype.tplusN) {
-            // 当前日期对账已完成 且 后面还有对账可以进行
-            prepareCheckStatus(status)
-            sourceTypeService.saveOrUpdateSourceTypeCheckStatus(status)
-        } else if ((!status.checkStatus || !status.repairStatus) && interval >= sourcetype.tplusN) {
-            // 当前对账并未完成 且满足对账条件
-            status
-        } else {
-            // 其它条件不对账
-            null
+            val accdate = systemUtilService.accdate
+            var status = sourceTypeService.getSourceTypeCheckStatus(sourcetype.sourceType)
+                    ?: newSourceTypeStatus(sourcetype, accdate)
+
+            if (status.settleStatus) {
+                //已完成清算可以结算了,直接切换到下一天
+                val nextday = DateUtil.getNewDay(status.checkAccdate, 1)
+                status.apply {
+                    this.checkAccdate = nextday
+                    this.checkFileOk = false
+                    this.checkStatus = false
+                    this.repairStatus = false
+                    this.settleStatus = false
+                    this.forceRecheck = false
+                    this.chkfileUrl = null
+                    this.remark = null
+                }
+               status = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(status) //更新
+            }
+
+            val interval = DateUtil.getIntervalDay(status.checkAccdate, accdate).toInt()
+            if (interval > sourcetype.tplusN) {
+                if (!status.settleStatus) {
+                    //未结算过,继续
+                    return status
+                }
+                return null
+            } else if (interval == sourcetype.tplusN) {
+                //对最后一天的账(比如:T+1对昨天的帐,需判断可以对账的起始时间)
+                if (!status.settleStatus && canStartCheck(sourcetype)) {
+                    return status
+                }
+                return null
+            } else {
+                // 其它条件不对账
+                return null
+            }
+
+        } catch (ex: Exception) {
+            ex.printStackTrace()
+            return null
         }
     }
 
     @Scheduled(cron = "\${payapi.sourcetype.checker.scheduler:-}")
     @SchedulerLock(name = "payapiSourceTypeCheckLock", lockAtMostForString = "PT30M")
     fun runCheck() {
+        if(TenantContext.getTenantSchema()==null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID)
+
         val allSourcetype = sourceTypeService.allEnabledSourcetype
                 ?: return
 
@@ -148,7 +169,7 @@
 
         val checkProcessResult = checkFileStatus.map {
             // 对账文件是否下载完成
-            if (it.checkFileOk) {
+            if (it.checkFileOk && !it.forceRecheck) {
                 // 开始对账
                 sourceTypeCheckExecutor.reconciliation(it)
             } else {
@@ -248,6 +269,11 @@
     fun checkAndDownloadChkfile(checkStatus: TSourceTypeCheckStatus): Future<ExecutorResult> {
         // 2. 根据对账日期下载对账文件
         try {
+            if(TenantContext.getTenantSchema()==null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID)
+            if (checkStatus.settleStatus) {
+                return AsyncResult(ExecutorResult(checkStatus, FAIL, "[${checkStatus.checkAccdate}]日对账已完成"))
+            }
+
             val result = getProvider(checkStatus.sourceType)?.let { provider ->
                 val acResp = provider.acquireCheckFile(checkStatus)
                 if (acResp.code == AgentCode.REQUIRE_QUERY) {
@@ -286,12 +312,20 @@
     @Async("sourcetypeCheckTaskExecutor")
     fun reconciliation(checkStatus: TSourceTypeCheckStatus): Future<ExecutorResult> {
         // 3. 完成对账
+        if(TenantContext.getTenantSchema()==null) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID)
+        if (!checkStatus.checkFileOk) {
+            return AsyncResult(ExecutorResult(checkStatus, FAIL, "checkAccdate=[${checkStatus.checkAccdate}]对账单未完成下载,不能对账"))
+        } else if (checkStatus.settleStatus) {
+            //当天已完成对账
+            return AsyncResult(ExecutorResult(checkStatus, SUCCESS, "checkAccdate=[${checkStatus.checkAccdate}]对账已成功"))
+        }
+
         val result =transactionReconciliationService.getTransactionChkfile(checkStatus.checkAccdate, checkStatus.sourceType)?.let { chkfile ->
             try {
                 doCheckProcess(chkfile, checkStatus) //执行对账过程
                 when (checkStatus.settleStatus) {
                     true -> ExecutorResult(checkStatus, SUCCESS, "对账成功,双方一致")
-                    false -> ExecutorResult(checkStatus, FAIL, "对账不平")
+                    false -> ExecutorResult(checkStatus, FAIL, chkfile.remark)
                 }
             } catch (ex: Exception) {
                 ex.printStackTrace()
@@ -365,7 +399,7 @@
         transactionReconciliationService.doFinishChkfileStatus(chkfile, checkStatus)
 
         //补账, result为equal或unequal时补帐,error跳过
-        if (checkStatus.repairStatus) {
+        if (checkStatus.checkStatus && checkStatus.repairStatus) {
             transactionReconciliationService.getNeedRepairChkdtls(chkfile).forEach { chkdtl ->
                 try {
                     transactionReconciliationService.doRepairTransactionChkdtl(chkdtl) //补账
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt
index 3becb42..2fbe26a 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/transaction_reconciliation_service_impl.kt
@@ -196,16 +196,16 @@
 
     override fun doCheckLocalMoreDtls(chkfile: TTransactionChkfile): Int {
         return transactionChkdtlDao.findLocalMoreDtls(chkfile.accdate, chkfile.sourcetype, chkfile.id)?.also {
-            it.forEach { refno ->
+            it.forEachIndexed { index, refno ->
                 //保存多余的记录
                 transactionMainDao.findByRefno(refno)?.also { transMain ->
                     transactionChkdtlDao.save(TTransactionChkdtl().apply {
                         this.chkfileId = chkfile.id
                         this.accdate = chkfile.accdate
                         this.sourcetype = chkfile.sourcetype
-                        this.recordno = null
+                        this.recordno = -1 * (index + 1)
                         this.amount = transMain.personDtl.amount
-                        this.otherRefno = transMain.reverseRefno ?: "0"
+                        this.otherRefno = transMain.sourceTypeRefno ?: "$index"
                         this.localRefno = transMain.refno
                         this.otherAccdate = transMain.accdate
                         this.transtype = when (transMain.reverseType) {
@@ -256,8 +256,8 @@
                 chkfile.remark = "校对完成,双方交易一致"
             }
             checkStatus.repairStatus = true
-            checkStatus.remark = chkfile.remark
         }
+        checkStatus.remark = chkfile.remark
         transactionChkfileDao.save(chkfile)
         sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus)
     }
@@ -286,13 +286,15 @@
         checkStatus.remark = chkfile.remark
         if (chkfile.result in setOf(ConstantUtil.CHKFILE_RESULT_EQUAL, ConstantUtil.CHKFILE_RESULT_UNEQUAL)) {
             val notEqualCount = transactionChkdtlDao.getChkdtlNotEqualCount(chkfile.id).existed
-            if (notEqualCount == 0 && chkfile.othercnt == chkfile.localcnt && MoneyUtil.moneyEqual(chkfile.otheramt, chkfile.localamt)) {
+            val equalCount = transactionChkdtlDao.getChkdtlEqualCount(chkfile.id).existed
+            if (notEqualCount == 0 && equalCount==chkfile.othercnt && chkfile.othercnt == chkfile.localcnt && MoneyUtil.moneyEqual(chkfile.otheramt, chkfile.localamt)) {
                 //对平
                 chkfile.remark = when (chkfile.result == ConstantUtil.CHKFILE_RESULT_EQUAL) {
                     true -> "对账完成,双方交易一致"
                     else -> "对账完成,补账后双方交易一致"
                 }
                 checkStatus.settleStatus = true
+                checkStatus.forceRecheck = false //清掉
                 checkStatus.remark = chkfile.remark
             }else{
                 checkStatus.remark = "对账完成,补账有失败"
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 b708983..2b43122 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
@@ -12,10 +12,7 @@
 import com.supwisdom.dlpay.exception.TransactionProcessException
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.tenant.TenantContext
-import com.supwisdom.dlpay.framework.util.MoneyUtil
-import com.supwisdom.dlpay.framework.util.Subject
-import com.supwisdom.dlpay.framework.util.TradeDict
-import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.framework.util.*
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.stereotype.Service
 import java.sql.SQLException
@@ -557,6 +554,13 @@
                     "补帐交易<$refno>状态错误,status<${transaction.status}>")
         }
 
+        val currentSettledate = systemUtilService.getSettleDateBytenantId(transaction.tenantid)
+        if (DateUtil.compareDatetime(transaction.accdate, currentSettledate, DateUtil.DATE_FMT) < 0) {
+            //流水记账日期小于结算日期 ( transaction.accdate这天已结算,不能补账!)
+            throw TransactionCheckException(TradeErrorCode.BUSINESS_DEAL_ERROR,
+                    "流水<$refno>记账日期<${transaction.accdate}>小于系统的结算日期<$currentSettledate>,不能补账")
+        }
+
         transaction.status = TradeDict.DTL_STATUS_SUCCESS //置为成功
         transactionOnSuccess(transaction, sourcetypeRefno, true)
 //        transaction.checkDate = systemUtilService.accdate
@@ -568,7 +572,7 @@
             transaction.personDtl.remark = remark
         }
         if(transaction.shop){
-            transaction.personDtl.remark = remark
+            transaction.shopDtl.remark = remark
         }
         if(transaction.subject){
             //
diff --git a/payapi/src/main/resources/application.properties b/payapi/src/main/resources/application.properties
index eb46e66..16dfbda 100644
--- a/payapi/src/main/resources/application.properties
+++ b/payapi/src/main/resources/application.properties
@@ -33,8 +33,7 @@
 shopbalance.updater.cron=10/* * * * * ?
 dayend.settletask.cron=0 3/30 2-3 * * ?
 query.third.transdtl.result.cron=7 0/1 * * * ?
-download.ynrcc.chkfile.cron =3 0/10 1 * * ?
-#dayend.settletask.cron = 0 0/2 * * * ?
+payapi.sourcetype.checker.scheduler=7 3/10 * * * ?
 ################################################
 # user password
 auth.password.bcrypt.length=10
diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql
index 0e592a6..556d542 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -480,24 +480,18 @@
 
 
 
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tenantid")
-VALUES ('D3820D49DACA49199E36537F6719665F', 'citizenCard', 't', '大理市民卡', 't', 'f', 't', 'f', 't', '112234', '-', '{tenantid}');
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno","deposite_subjno","tenantid")
-VALUES ('0997477F40904AD1A2E37FD15345CE00', 'balance', 'f', '账户余额', 't', 'f', 't', 'f', 't', '-', '-', '{tenantid}');
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno","deposite_subjno", "tenantid")
-VALUES ('F0CA47ADC0F24DFCA0D95DF4136CC2D0', 'thirdpart', 'f', '其他第三方支付', 't', 't', 'f', 'f', 'f','-','-', '{tenantid}');
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno","deposite_subjno","tenantid")
-VALUES ('F5B344726FA24BD896E70DEE3D3F46CA', 'swyktv5', 't', '一卡通支付', 't', 't', 't', 't', 't','-','-', '{tenantid}');
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno","deposite_subjno","tenantid")
-VALUES ('28EE54CD3B044CC197D6C5B0E309F8B8', 'alipay', 't', '支付宝', 't', 't', 't', 't', 'f', '112230','112210', '{tenantid}');
-INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable",
-"consume_enable", "anonymous_enable", "reversable", "pay_subjno","deposite_subjno","tenantid")
-VALUES ('DAEF88B54B684347B2B83940C38C7671', 'wechat', 't', '微信支付', 't', 't', 't', 't', 'f', '112231','112211', '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('D3820D49DACA49199E36537F6719665F', 'citizenCard', 't', '大理市民卡', 't', 'f', 't', 'f', 't', '112234', '-', 1, null, '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('0997477F40904AD1A2E37FD15345CE00', 'balance', 'f', '账户余额', 't', 'f', 't', 'f', 't', '-', '-', 0, null, '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('F0CA47ADC0F24DFCA0D95DF4136CC2D0', 'thirdpart', 'f', '其他第三方支付', 't', 't', 'f', 'f', 'f','-','-', 0, null, '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('F5B344726FA24BD896E70DEE3D3F46CA', 'swyktv5', 't', '一卡通支付', 't', 't', 't', 't', 't','-','-', 1, null, '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('28EE54CD3B044CC197D6C5B0E309F8B8', 'alipay', 't', '支付宝', 't', 't', 't', 't', 'f', '112230','112210', 1, '103000', '{tenantid}');
+INSERT INTO "tb_sourcetype" ("sourcetype_id", "sourcetype", "checkable", "paydesc", "enable", "charge_enable", "consume_enable", "anonymous_enable", "reversable", "pay_subjno", "deposite_subjno", "tplusn", "start_chktime", "tenantid")
+VALUES ('DAEF88B54B684347B2B83940C38C7671', 'wechat', 't', '微信支付', 't', 't', 't', 't', 'f', '112231','112211', 1, '103000', '{tenantid}');
 
 -- 支付方式
 INSERT INTO TB_SOURCETYPE_CONFIG (ID, SOURCETYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
diff --git a/payapi/src/main/resources/templates/system/thirdchk/chkstatus.html b/payapi/src/main/resources/templates/system/thirdchk/chkstatus.html
index 2114a4a..73f1fb7 100644
--- a/payapi/src/main/resources/templates/system/thirdchk/chkstatus.html
+++ b/payapi/src/main/resources/templates/system/thirdchk/chkstatus.html
@@ -51,7 +51,7 @@
                         }
                     },
                     {field: 'startAccdate', title: '起始日期', width: 110, align: 'center'},
-                    {field: 'checkFileDate', title: '对账日期', width: 110, align: 'center'},
+                    {field: 'checkAccdate', title: '对账日期', width: 110, align: 'center'},
                     {
                         field: 'checkFileOk', title: '下载账单状态', width: 120, align: 'center', templet: function (e) {
                             if (e.checkFileOk) {