结算整理和结算日志查询
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/DebitCreditDtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/DebitCreditDtlDao.java
index 0b5e733..b55c02c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/dao/DebitCreditDtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/dao/DebitCreditDtlDao.java
@@ -16,9 +16,9 @@
   @Query(value = "select a.drsubjno,case when a.drsubjno='220201' then '220201' else a.draccno end as draccno, a.crsubjno,case when a.crsubjno='220201' then '220201' else a.craccno end as craccno," +
       "a.summary,count(distinct a.refno) as transcnt,sum(a.amount) as transamt " +
       "from TB_USERDTL_DEBITCREDIT a left join TB_TRANSACTIONMAIN b on a.refno=b.refno " +
-      "where b.status='success' and b.accdate=:settledate " +
+      "where a.TENANTID=:tenantid and b.status='success' and b.accdate=:settledate " +
       "group by a.drsubjno,case when a.drsubjno='220201' then '220201' else a.draccno end,a.crsubjno,case when a.crsubjno='220201' then '220201' else a.craccno end,a.summary ", nativeQuery = true)
-  List<VoucherTemp> getVoucherData(@Param("settledate") String settledate);
+  List<VoucherTemp> getVoucherData(@Param("settledate") String settledate, @Param("tenantid") String tenantid);
 
   List<TDebitCreditDtl> findByRefno(String refno);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/service/SourceTypeService.java b/payapi/src/main/java/com/supwisdom/dlpay/api/service/SourceTypeService.java
index c0d78b7..8e4048b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/service/SourceTypeService.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/service/SourceTypeService.java
@@ -25,9 +25,6 @@
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
   boolean checkShopSourceType(String shopaccno, String sourceType, boolean anonymousflag) throws Exception;
 
-  @Transactional
-  List<TSourceType> getAllEnabledSourcetype();
-
   /**
    * 获取支付能力充值参数全局配置
    */
@@ -46,6 +43,9 @@
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
   boolean checkShopCanReverse(String sourcetype, String shopaccno) throws Exception;
 
+  @Transactional(rollbackFor = Exception.class, readOnly = true)
+  List<TSourceType> getAllEnabledSourcetype();
+
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
   TSourceTypeCheckStatus getSourceTypeCheckStatus(String sourceType);
 
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
index 86fb351..f0cc66c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
@@ -1,5 +1,6 @@
 package com.supwisdom.dlpay.framework.core;
 
+import com.supwisdom.dlpay.exception.TransactionException;
 import com.supwisdom.dlpay.framework.domain.TSettleLog;
 import com.supwisdom.dlpay.framework.service.DayendSettleService;
 import com.supwisdom.dlpay.framework.tenant.TenantContext;
@@ -25,10 +26,10 @@
   @SchedulerLock(name = "DayendSettleTask", lockAtMostForString = "PT30M")
   public void doSettleTask() {
     if (logger.isDebugEnabled()) logger.debug("进入日结算任务!");
+    if (null == TenantContext.getTenantSchema()) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID);
+
     settleLog = dayendSettleService.doCreateSettleLog(); //记录日志
     try {
-      if (null == TenantContext.getTenantSchema()) TenantContext.setTenantSchema(Constants.DEFAULT_TENANTID);
-
       //step1: 账户校验(fixme: 清算任务?)
       long t1 = System.currentTimeMillis();
       if (!checkAccounts()) {
@@ -80,6 +81,9 @@
         dayendSettleService.doUpdateSettleLog(settleLog.update("0", "成功结算"));
       }
       return ret;
+    } catch (TransactionException ex) {
+      dayendSettleService.doUpdateSettleLog(settleLog.update("" + ex.code(), ex.getMessage()));
+      return false;
     } catch (Exception e) {
       if (!StringUtil.isEmpty(e.getMessage())) {
         dayendSettleService.doUpdateSettleLog(settleLog.update("-9", e.getMessage()));
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java
index aa05bd7..bd32b18 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/PeriodDao.java
@@ -1,7 +1,6 @@
 package com.supwisdom.dlpay.framework.dao;
 
 import com.supwisdom.dlpay.framework.domain.TPeriod;
-import com.supwisdom.dlpay.framework.domain.TPeriodPK;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Lock;
 import org.springframework.data.jpa.repository.Query;
@@ -11,11 +10,11 @@
 import javax.persistence.LockModeType;
 
 @Repository
-public interface PeriodDao extends JpaRepository<TPeriod, TPeriodPK> {
-  @Query(value = "from TPeriod t where t.periodYear=:periodyear and t.periodMonth=:periodmonth ")
-  TPeriod getPeriod(@Param("periodyear") Integer periodyear, @Param("periodmonth") Integer periodmonth);
+public interface PeriodDao extends JpaRepository<TPeriod, String> {
+  @Query(value = "from TPeriod t where t.periodYear=:periodyear and t.periodMonth=:periodmonth and t.tenantId=:tenantid ")
+  TPeriod getPeriod(@Param("periodyear") Integer periodyear, @Param("periodmonth") Integer periodmonth, @Param("tenantid") String tenantid);
 
   @Lock(LockModeType.PESSIMISTIC_WRITE)
-  @Query(value = "from TPeriod t where t.periodYear=:periodyear and t.periodMonth=:periodmonth ")
-  TPeriod getTPeriodWithLock(@Param("periodyear") Integer periodyear, @Param("periodmonth") Integer periodmonth);
+  @Query(value = "from TPeriod t where t.periodYear=:periodyear and t.periodMonth=:periodmonth and t.tenantId=:tenantid  ")
+  TPeriod getTPeriodWithLock(@Param("periodyear") Integer periodyear, @Param("periodmonth") Integer periodmonth, @Param("tenantid") String tenantid);
 }
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 ec8fadc..88e3eb2 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
@@ -19,8 +19,16 @@
   @Query(value = "from TSettlectl where booksetno=:booksetno ")
   TSettlectl findByBooksetnoWithLock(@Param("booksetno") Integer booksetno);
 
+  @Lock(value = LockModeType.PESSIMISTIC_WRITE)
+  @Query(value = "from TSettlectl where tenantId=:tenantid ")
+  TSettlectl findByTenantIdWithLock(@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);
 
+  @Modifying(clearAutomatically = true)
+  @Query(value = "update TB_SETTLECTL set PERIODYEAR=:peridyear,PERIODMONTH=:peridmonth where TENANTID=:tenantid ", nativeQuery = true)
+  void updateSettlePeriodByTenantid(@Param("peridyear") int peridyear, @Param("peridmonth") int peridmonth, @Param("tenantid") String tenantid);
+
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleLogDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleLogDao.java
index 30de1ae..75b907a 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleLogDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SettleLogDao.java
@@ -2,8 +2,9 @@
 
 import com.supwisdom.dlpay.framework.domain.TSettleLog;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.stereotype.Repository;
 
 @Repository
-public interface SettleLogDao extends JpaRepository<TSettleLog, String> {
+public interface SettleLogDao extends JpaRepository<TSettleLog, String>, JpaSpecificationExecutor<TSettleLog> {
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
index f76cffa..db210cd 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
@@ -14,8 +14,8 @@
 @Repository
 public interface ShopaccDao extends JpaRepository<TShopacc, String> {
 
-  @Query(value = "select t.SHOPACCNO from TB_SHOPACC t left join TB_SHOPACCDAY a on t.SHOPACCNO=a.SHOPACCNO and a.accdate=:lastsettday where a.SHOPACCNO is null ", nativeQuery = true)
-  List<String> getNewShopacc(@Param("lastsettday") String lastsettday);
+  @Query(value = "select t.SHOPACCNO from TB_SHOPACC t left join TB_SHOPACCDAY a on t.SHOPACCNO=a.SHOPACCNO and a.accdate=:lastsettday where t.TENANTID=:tenantid and a.SHOPACCNO is null ", nativeQuery = true)
+  List<String> getNewShopacc(@Param("lastsettday") String lastsettday, @Param("tenantid") String tenantid);
 
 
   @Query(value = "select shopname from TShopacc where shopaccno=:shopaccno ")
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccdayDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccdayDao.java
index ddc0265..bf0d37b 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccdayDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccdayDao.java
@@ -13,17 +13,17 @@
 @Repository
 public interface ShopaccdayDao extends JpaRepository<TShopaccday, TShopaccdayPK> {
 
-  @Query(value = "from TShopaccday t where t.accdate=:accdate ")
-  List<TShopaccday> getShopaccdayByAccdate(@Param("accdate") String accdate);
+  @Query(value = "from TShopaccday t where t.accdate=:accdate and t.tenantId=:tenantid ")
+  List<TShopaccday> getShopaccdayByAccdate(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
 
   @Query(value = "from TShopaccday t where t.accdate=:accdate and t.shopaccno=:shopaccno ")
   TShopaccday getTShopaccdayById(@Param("accdate") String accdate, @Param("shopaccno") String shopaccno);
 
   @Modifying(clearAutomatically = true)
-  @Query(value = "update TB_SHOPACCDAY set balance=beginbal-dramt+cramt,updtime=:updtime where accdate=:accdate ", nativeQuery = true)
-  void updateShopaccdayBalance(@Param("accdate") String accdate,@Param("updtime")String updtime);
+  @Query(value = "update TB_SHOPACCDAY set balance=beginbal-dramt+cramt,updtime=:updtime where accdate=:accdate and TENANTID=:tenantid ", nativeQuery = true)
+  void updateShopaccdayBalance(@Param("accdate") String accdate,@Param("updtime")String updtime, @Param("tenantid") String tenantid);
 
-  @Query(value = "select sum(balance) as amount from TShopaccday where accdate=:accdate ")
-  Double getSumBalance(@Param("accdate") String accdate);
+  @Query(value = "select sum(balance) as amount from TShopaccday where accdate=:accdate and tenantId=:tenantid ")
+  Double getSumBalance(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
 
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectDao.java
index 78ecb03..c1fb3e8 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectDao.java
@@ -10,19 +10,19 @@
 import java.util.List;
 
 @Repository
-public interface SubjectDao extends JpaRepository<TSubject, String> {
+public interface SubjectDao extends JpaRepository<TSubject, Integer> {
 
-  @Query(value = "select t.SUBJNO from TB_SUBJECT t left join TB_SUBJECTBAL a on t.SUBJNO=a.SUBJNO where t.ENDFLAG=1 and a.SUBJNO is null ", nativeQuery = true)
-  List<String> getNewSubject();
+  @Query(value = "select t.* from TB_SUBJECT t left join TB_SUBJECTBAL a on t.SUBJNO=a.SUBJNO and t.TENANTID=a.TENANTID where t.ENDFLAG=1 and a.SUBJNO is null and t.TENANTID=:tenantid ", nativeQuery = true)
+  List<TSubject> getNewSubjectByTenantid(@Param("tenantid") String tenantid);
 
-  @Query(value = "select count(t.subjno) as existed from TB_SUBJECT t left join TB_SUBJECTBAL a on t.SUBJNO=a.SUBJNO where t.ENDFLAG=1 and a.SUBJNO is null ", nativeQuery = true)
-  ExistBean checkSettleSubject();
+  @Query(value = "select count(t.subjno) as existed from TB_SUBJECT t left join TB_SUBJECTBAL a on t.SUBJNO=a.SUBJNO and t.TENANTID=a.TENANTID where t.ENDFLAG=1 and a.SUBJNO is null and t.TENANTID=:tenantid ", nativeQuery = true)
+  ExistBean checkSettleSubjectByTenantid(@Param("tenantid") String tenantid);
 
-  @Query(value = "select a.subjno as accno from TB_SUBJECT a left join (select subjno from TB_SUBJECTDAY where accdate =:accdate ) b on a.subjno=b.subjno where a.subjlevel=1 and b.subjno is null ", nativeQuery = true)
-  List<String> getNewSubjnos(@Param("accdate") String accdate);
+  @Query(value = "select a.* from TB_SUBJECT a left join (select subjno from TB_SUBJECTDAY where accdate =:accdate and TENANTID=:tenantid ) b on a.subjno=b.subjno where a.subjlevel=1 and a.TENANTID=:tenantid and b.subjno is null ", nativeQuery = true)
+  List<TSubject> getNewSubjnos(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
 
-  @Query(value = "select subjname from TSubject where subjno=:subjno ")
-  String getSubjectname(@Param("subjno") String subjno);
+  @Query(value = "select subjname from TSubject where subjno=:subjno and tenantId=:tenantid ")
+  String getSubjectname(@Param("subjno") String subjno, @Param("tenantid") String tenantid);
 
   TSubject findBySubjno(String subjno);
 
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
index 73b01cf..3f5737e 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
@@ -13,21 +13,24 @@
 import java.util.List;
 
 @Repository
-public interface SubjectbalDao extends JpaRepository<TSubjectbal, String> {
+public interface SubjectbalDao extends JpaRepository<TSubjectbal, Integer> {
 
-  @Query(value = "select t.* from TB_SUBJECTBAL t left join ( select subjno from TB_SUBJECTDAY where accdate =:lastsettday) a on t.subjno=a.subjno where a.subjno is null ", nativeQuery = true)
-  List<TSubjectbal> getUnsettleSubjectbal(@Param("lastsettday") String lastsettday);
+  @Query(value = "select t.* from TB_SUBJECTBAL t left join ( select subjno from TB_SUBJECTDAY where accdate =:lastsettday and TENANTID=:tenantid) a on t.subjno=a.subjno where t.TENANTID=:tenantid and a.subjno is null ", nativeQuery = true)
+  List<TSubjectbal> getUnsettleSubjectbal(@Param("lastsettday") String lastsettday, @Param("tenantid") String tenantid);
 
-  @Query(value = "select sum(BEGINDRBAL) as dramt,sum(BEGINCRBAL) as cramt from TB_SUBJECTBAL where SUBJNO in (select SUBJNO from TB_SUBJECT where fsubjno=:fsubjno) ", nativeQuery = true)
-  MerchBean getSubjectInfo(@Param("fsubjno") String fsubjno);
+  @Query(value = "select sum(BEGINDRBAL) as dramt,sum(BEGINCRBAL) as cramt from TB_SUBJECTBAL where TENANTID=:tenantid and SUBJNO in (select SUBJNO from TB_SUBJECT where fsubjno=:fsubjno and TENANTID=:tenantid) ", nativeQuery = true)
+  MerchBean getSubjectInfo(@Param("fsubjno") String fsubjno, @Param("tenantid") String tenantid);
 
-  @Query(value = "select sa.subjno,sa.drbal,crbal,sb.subjtype,sb.balflag from TB_SUBJECTBAL sa,TB_SUBJECT sb where sa.subjno=sb.subjno and sb.endflag=1  order by sa.subjno ", nativeQuery = true)
-  List<SubjectInfoBean> getSubjectbalAndFlag();
+  @Query(value = "select sa.subjno,sa.drbal,crbal,sb.subjtype,sb.balflag from TB_SUBJECTBAL sa,TB_SUBJECT sb where sa.tenantid=sb.tenantid and sa.subjno=sb.subjno and sb.endflag=1 and sa.tenantid=:tenantid  order by sa.subjno ", nativeQuery = true)
+  List<SubjectInfoBean> getSubjectbalAndFlag(@Param("tenantid") String tenantid);
 
-  @Query(value = "select case when :balflag=1 then sum(drbal) else sum(crbal) end as amount from tb_subjectbal where subjno in (select subjno from tb_subject where endflag=1 and balflag=:balflag )",nativeQuery = true)
-  Double getSumEndsubjectBalByEndflag(@Param("balflag")Integer balflag);
+  @Query(value = "select case when :balflag=1 then sum(drbal) else sum(crbal) end as amount from tb_subjectbal where tenantid=:tenantid and subjno in (select subjno from tb_subject where endflag=1 and balflag=:balflag and tenantid=:tenantid )",nativeQuery = true)
+  Double getSumEndsubjectBalByEndflag(@Param("balflag")Integer balflag, @Param("tenantid") String tenantid);
 
   @Lock(LockModeType.PESSIMISTIC_WRITE)
   @Query("from TSubjectbal where subjno=:subjno ")
   TSubjectbal getTSubjectbalBySubjnoWithLock(@Param("subjno")String subjno);
+
+  @Query("from TSubjectbal where subjno=:subjno and tenantId=:tenantid ")
+  TSubjectbal getBySubjnoAndTenantId(@Param("subjno")String subjno, @Param("tenantid") String tenantid);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java
index 9a6a92c..fb65662 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java
@@ -15,26 +15,26 @@
 @Repository
 public interface SubjectdayDao extends JpaRepository<TSubjectday, TSubjectdayPK> {
 
-  @Query(value = "from TSubjectday where accdate=:accdate ")
-  List<TSubjectday> getAllByAccdate(@Param("accdate") String accdate);
+  @Query(value = "from TSubjectday where accdate=:accdate and tenantId=:tenantid ")
+  List<TSubjectday> getAllByAccdate(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
 
-  @Query(value = "select a.subjno as shopaccno,a.begindrbal as dramt,a.begincrbal as cramt from TB_SUBJECTDAY a left join (select subjno from TB_SUBJECT where endflag=1) b on a.subjno=b.subjno where a.accdate=:accdate and b.subjno is not null ", nativeQuery = true)
-  List<MerchBean> getEndSubjectbalInfos(@Param("accdate") String accdate);
+  @Query(value = "select a.subjno as shopaccno,a.begindrbal as dramt,a.begincrbal as cramt from TB_SUBJECTDAY a left join (select subjno from TB_SUBJECT where endflag=1 and TENANTID=:tenantid) b on a.subjno=b.subjno where a.TENANTID=:tenantid and a.accdate=:accdate and b.subjno is not null ", nativeQuery = true)
+  List<MerchBean> getEndSubjectbalInfos(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
 
-  @Query(value = "from TSubjectday where accdate=:accdate and subjno=:subjno")
-  TSubjectday getSubjectDayById(@Param("accdate") String accdate, @Param("subjno") String subjno);
+  @Query(value = "from TSubjectday where accdate=:accdate and subjno=:subjno and tenantId=:tenantid ")
+  TSubjectday getSubjectDayById(@Param("accdate") String accdate, @Param("subjno") String subjno, @Param("tenantid") String tenantid);
 
-  @Query(value = "from TSubjectday t where t.accdate=:accdate and t.subjno in (select subjno from TSubject where subjlevel=1 and endflag=0 ) ")
-  List<TSubjectday> getParentSubjectday(@Param("accdate") String accdate);
+  @Query(value = "from TSubjectday t where t.tenantId=:tenantid and t.accdate=:accdate and t.subjno in (select subjno from TSubject where subjlevel=1 and endflag=0 and tenantId=:tenantid) ")
+  List<TSubjectday> getParentSubjectday(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
 
   @Query(value = "select sum(sb.begindrbal) as begindrbal,sum(sb.begincrbal) as begincrbal,sum(sb.dramt) as dramt,sum(sb.cramt) as cramt,sum(sb.drbal) as drbal,sum(sb.crbal) as crbal  " +
       "from TB_SUBJECTDAY sb, TB_SUBJECT s " +
-      "where sb.accdate =:accdate and sb.subjno=s.subjno and s.subjlevel=2 and s.fsubjno=:fsubjno ", nativeQuery = true)
-  FSubjectInfoBean getParentSumInfo(@Param("accdate") String accdate, @Param("fsubjno") String fsubjno);
+      "where sb.tenantid=s.tenantid and sb.tenantid=:tenantid and sb.accdate =:accdate and sb.subjno=s.subjno and s.subjlevel=2 and s.fsubjno=:fsubjno ", nativeQuery = true)
+  FSubjectInfoBean getParentSumInfo(@Param("accdate") String accdate, @Param("fsubjno") String fsubjno, @Param("tenantid") String tenantid);
 
   @Query(value = "select sum(begindrbal) as begindrbal,sum(begincrbal) as begincrbal,sum(dramt) as dramt,sum(cramt) as cramt,sum(drbal) as drbal,sum(crbal) as crbal " +
-      "from tb_subjectday where accdate=:accdate and subjno in (select subjno from tb_subject where subjlevel=1) ", nativeQuery = true)
-  FSubjectInfoBean getAllParentSubjectSumInfo(@Param("accdate") String accdate);
+      "from tb_subjectday where accdate=:accdate and tenantid=:tenantid and subjno in (select subjno from tb_subject where subjlevel=1 and tenantid=:tenantid) ", nativeQuery = true)
+  FSubjectInfoBean getAllParentSubjectSumInfo(@Param("accdate") String accdate, @Param("tenantid") String tenantid);
 
   @Query(value = "SELECT t.subjno AS subjno, t.subjname AS subjname,t.fsubjno AS fsubjno,t.subjlevel AS subjlevel,t.displayflag, " +
       "a.begindrbal  AS lastdaydrbal,a.begincrbal  AS lastdaycrbal, " +
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java
index d40f266..516ff2c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/TranscodeDao.java
@@ -6,4 +6,5 @@
 
 @Repository
 public interface TranscodeDao extends JpaRepository<TTranscode, Integer> {
+  TTranscode getByTranscode(Integer transcode);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java
index 02f5bad..c6bcf4c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java
@@ -20,25 +20,25 @@
 @Repository
 public interface VoucherDao extends JpaRepository<TVoucher, Integer> {
 
-  @Query(value = "select count(t.voucherid) as existed from TB_VOUCHER t where t.POSTFLAG=0 ", nativeQuery = true)
-  ExistBean checkExistUnpostVouhcer();
+  @Query(value = "select count(t.voucherid) as existed from TB_VOUCHER t where t.POSTFLAG=0 and t.TENANTID=:tenantid ", nativeQuery = true)
+  ExistBean checkExistUnpostVouhcer(@Param("tenantid") String tenantid);
 
   @Modifying
-  @Query(value="delete from TB_VOUCHER where POSTFLAG=0 ",nativeQuery = true)
-  void deleteUnpostVoucher();
+  @Query(value = "delete from TB_VOUCHER where POSTFLAG=0 and TENANTID=:tenantid ", nativeQuery = true)
+  void deleteUnpostVoucher(@Param("tenantid") String tenantid);
 
   @Lock(LockModeType.PESSIMISTIC_WRITE)
-  @Query(value = "from TVoucher where postflag=0 order by voucherid ")
-  List<TVoucher> getSettleVouchers();
+  @Query(value = "from TVoucher where postflag=0 and tenantId=:tenantid order by voucherid ")
+  List<TVoucher> getSettleVouchers(@Param("tenantid") String tenantid);
 
   @Query(value="select va.accno as shopaccno,sum(va.dramt) as dramt,sum(va.cramt) as cramt " +
       "from tb_voucherentry va,tb_voucher vb " +
-      "where va.voucherid=vb.voucherid and vb.voucherdate=:settledate and va.subjno='2004' and va.accno is not null " +
+      "where va.voucherid=vb.voucherid and vb.voucherdate=:settledate and va.subjno='2004' and va.accno is not null and va.TENANTID=vb.TENANTID and va.TENANTID=:tenantid " +
       "group by va.accno order by va.accno ", nativeQuery = true)
-  List<MerchBean> getShopVoucherByAccdate(@Param("settledate")Integer settledate);
+  List<MerchBean> getShopVoucherByAccdate(@Param("settledate")Integer settledate, @Param("tenantid") String tenantid);
 
-  @Query(value = "select sum(va.dramt) as dramt, sum(va.cramt) as cramt  from TB_VOUCHERENTRY va,TB_VOUCHER vb where va.voucherid=vb.voucherid and vb.voucherdate=:voucherdate and va.subjno=:subjno ", nativeQuery = true)
-  MerchBean getSettleSuminfo(@Param("voucherdate") Integer voucherdate, @Param("subjno") String subjno);
+  @Query(value = "select sum(va.dramt) as dramt, sum(va.cramt) as cramt  from TB_VOUCHERENTRY va,TB_VOUCHER vb where va.tenantid=vb.tenantid and va.voucherid=vb.voucherid and va.tenantid=:tenantid and vb.voucherdate=:voucherdate and va.subjno=:subjno ", nativeQuery = true)
+  MerchBean getSettleSuminfo(@Param("voucherdate") Integer voucherdate, @Param("subjno") String subjno, @Param("tenantid") String tenantid);
 
   @Lock(LockModeType.PESSIMISTIC_WRITE)
   @Query(value = "from TVoucher where voucherid=:voucherid ")
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java
index cfb8cfd..0d3b3cd 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java
@@ -14,11 +14,11 @@
 @Repository
 public interface VoucherEntryDao extends JpaRepository<TVoucherEntry,TVoucherEntryPK> {
   @Modifying
-  @Query(value = "delete from TB_VOUCHERENTRY where VOUCHERID in (select VOUCHERID from TB_VOUCHER where POSTFLAG=0)", nativeQuery = true)
-  void deleteUnpostVoucherentry();
+  @Query(value = "delete from TB_VOUCHERENTRY where TENANTID=:tenantid and VOUCHERID in (select VOUCHERID from TB_VOUCHER where POSTFLAG=0 and t.TENANTID=:tenantid)", nativeQuery = true)
+  void deleteUnpostVoucherentry(@Param("tenantid") String tenantid);
 
-  @Query(value = "from TVoucherEntry where voucherid in (select voucherid from TVoucher where voucherdate=:voucherdate) order by subjno,accno,voucherid ")
-  List<TVoucherEntry> getVoucherEntryByVoucherdate(@Param("voucherdate") Integer voucherdate);
+  @Query(value = "from TVoucherEntry where tenantId=:tenantid and voucherid in (select voucherid from TVoucher where voucherdate=:voucherdate and tenantId=:tenantid) order by subjno,accno,voucherid ")
+  List<TVoucherEntry> getVoucherEntryByVoucherdate(@Param("voucherdate") Integer voucherdate, @Param("tenantid") String tenantid);
 
   @Lock(LockModeType.PESSIMISTIC_WRITE)
   @Query(value = "from TVoucherEntry t where t.voucherid=:voucherid ")
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VouchernoCtlDao.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VouchernoCtlDao.java
index 7f81bf9..fcf8b7d 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VouchernoCtlDao.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/dao/VouchernoCtlDao.java
@@ -16,7 +16,15 @@
   @Query(value = "update TB_VOUCHERNOCTL set PERIODMONTH=:peridmonth,VOUCHERNO=:voucherno where VOUCHERTYPE=1 ", nativeQuery = true)
   void updateVoucherno(@Param("peridmonth") int peridmonth, @Param("voucherno") int voucherno);
 
+  @Modifying(clearAutomatically = true)
+  @Query(value = "update TB_VOUCHERNOCTL set PERIODMONTH=:peridmonth,VOUCHERNO=:voucherno where TENANTID=:tenantid ", nativeQuery = true)
+  void updateVouchernoByTenantid(@Param("peridmonth") int peridmonth, @Param("voucherno") int voucherno, @Param("tenantid") String tenantid);
+
   @Lock(LockModeType.PESSIMISTIC_WRITE)
   @Query(value = "from TVouchernoCtl where vouchertype=1 ")
   TVouchernoCtl getVoucherno();
+
+  @Lock(LockModeType.PESSIMISTIC_WRITE)
+  @Query(value = "from TVouchernoCtl where tenantId=:tenantid ")
+  TVouchernoCtl getVouchernoByTenantid(@Param("tenantid") String tenantid);
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java
index 5d54268..6df7005 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriod.java
@@ -1,17 +1,23 @@
 package com.supwisdom.dlpay.framework.domain;
 
+import org.hibernate.annotations.GenericGenerator;
+
 import javax.persistence.*;
 import javax.validation.constraints.NotNull;
 
 @Entity
-@Table(name = "TB_PERIOD")
-@IdClass(TPeriodPK.class)
+@Table(name = "TB_PERIOD",
+    indexes = {@Index(name = "TB_PERIOD_UK", columnList = "PERIOD_YEAR, PERIOD_MONTH, TENANTID", unique = true)})
 public class TPeriod {
   @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name = "ID", nullable = false, length = 32)
+  private String id;
+
   @Column(name = "PERIOD_YEAR", nullable = false, precision = 4)
   private Integer periodYear;
 
-  @Id
   @Column(name = "PERIOD_MONTH", nullable = false, precision = 2)
   private Integer periodMonth;
 
@@ -27,10 +33,18 @@
   @NotNull
   private Integer settleflag = 0;
 
-  @Column(name = "tenantid", length = 20)
+  @Column(name = "TENANTID", length = 20)
   @NotNull
   private String tenantId;
 
+  public String getId() {
+    return id;
+  }
+
+  public void setId(String id) {
+    this.id = id;
+  }
+
   public Integer getPeriodYear() {
     return periodYear;
   }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriodPK.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriodPK.java
deleted file mode 100644
index e307db3..0000000
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TPeriodPK.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package com.supwisdom.dlpay.framework.domain;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
-import java.io.Serializable;
-
-public class TPeriodPK implements Serializable {
-
-  @Id
-  @Column(name="PERIOD_YEAR", nullable = false, precision = 4)
-  private Integer periodYear;
-
-  @Id
-  @Column(name="PERIOD_MONTH", nullable = false, precision = 2)
-  private Integer periodMonth;
-
-  public Integer getPeriodYear() {
-    return periodYear;
-  }
-
-  public void setPeriodYear(Integer periodYear) {
-    this.periodYear = periodYear;
-  }
-
-  public Integer getPeriodMonth() {
-    return periodMonth;
-  }
-
-  public void setPeriodMonth(Integer periodMonth) {
-    this.periodMonth = periodMonth;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (o == null || getClass() != o.getClass()) return false;
-    TPeriodPK tPeriodPK = (TPeriodPK) o;
-    if (periodYear != null ? !periodYear.equals(tPeriodPK.getPeriodYear()) : periodYear != null)
-      return false;
-    if (periodMonth != null ? !periodMonth.equals(tPeriodPK.getPeriodMonth()) : periodMonth != null)
-      return false;
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = periodYear != null ? periodYear.hashCode() : 0;
-    result = 31 * result + (periodMonth != null ? periodMonth.hashCode() : 0);
-    return result;
-  }
-}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
index 13be663..fe2ce3f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TResource.java
@@ -5,7 +5,7 @@
 
 @Entity
 @Table(name = "TB_RESOURCE")
-@SequenceGenerator(name = "SEQ_RES", sequenceName = "SEQ_RES", allocationSize = 1000)
+@SequenceGenerator(name = "SEQ_RES", sequenceName = "SEQ_RES", allocationSize = 1, initialValue = 1000)
 public class TResource {
   @Id
   @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_RES")
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
index aa0a515..5f6f214 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSettlectl.java
@@ -31,7 +31,7 @@
   @Column(name="UPDTIME", length = 14)
   private String updtime;
 
-  @Column(name = "tenantid", length = 20)
+  @Column(name = "TENANTID", length = 20)
   @NotNull
   private String tenantId;
 
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectbal.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectbal.java
index 93a64e1..47b7ddd 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectbal.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectbal.java
@@ -9,7 +9,7 @@
 public class TSubjectbal {
   @Id
   @Column(name = "subjid", nullable = false, length = 32)
-  private String subjid;
+  private Integer subjid;
 
   @Column(name = "SUBJNO", length = 10)
   @NotNull
@@ -55,7 +55,8 @@
   public TSubjectbal() {
   }
 
-  public TSubjectbal(String subjno) {
+  public TSubjectbal(Integer subjid, String subjno, String tenantId) {
+    this.subjid = subjid;
     this.subjno = subjno;
     this.accumdramt = 0D;
     this.accumcramt = 0D;
@@ -65,9 +66,11 @@
     this.cramt = 0D;
     this.drbal = 0D;
     this.crbal = 0D;
+    this.tenantId = tenantId;
   }
 
-  public TSubjectbal(String subjno, Double accumdramt, Double accumcramt, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal, String updtime, Integer lastsettleday, Double accumsettleamt) {
+  public TSubjectbal(Integer subjid, @NotNull String subjno, Double accumdramt, Double accumcramt, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal, String updtime, Integer lastsettleday, Double accumsettleamt, @NotNull String tenantId) {
+    this.subjid = subjid;
     this.subjno = subjno;
     this.accumdramt = accumdramt;
     this.accumcramt = accumcramt;
@@ -80,6 +83,7 @@
     this.updtime = updtime;
     this.lastsettleday = lastsettleday;
     this.accumsettleamt = accumsettleamt;
+    this.tenantId = tenantId;
   }
 
   public String getSubjno() {
@@ -186,11 +190,11 @@
     this.tenantId = tenantId;
   }
 
-  public String getSubjid() {
+  public Integer getSubjid() {
     return subjid;
   }
 
-  public void setSubjid(String subjid) {
+  public void setSubjid(Integer subjid) {
     this.subjid = subjid;
   }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectday.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectday.java
index d200c62..db73aeb 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectday.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectday.java
@@ -10,7 +10,7 @@
 public class TSubjectday {
   @Id
   @Column(name = "subjid", nullable = false, length = 32)
-  private String subjid;
+  private Integer subjid;
 
   @Id
   @Column(name = "ACCDATE", nullable = false, length = 8)
@@ -54,7 +54,8 @@
   public TSubjectday() {
   }
 
-  public TSubjectday(String accdate, String subjno, Integer periodYear, Integer periodMonth, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal) {
+  public TSubjectday(Integer subjid, String accdate, String subjno, Integer periodYear, Integer periodMonth, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal, String tenantId) {
+    this.subjid = subjid;
     this.accdate = accdate;
     this.subjno = subjno;
     this.periodYear = periodYear;
@@ -65,9 +66,11 @@
     this.cramt = cramt;
     this.drbal = drbal;
     this.crbal = crbal;
+    this.tenantId = tenantId;
   }
 
-  public TSubjectday(String accdate, String subjno, Integer periodYear, Integer periodMonth, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal, String updtime) {
+  public TSubjectday(Integer subjid, String accdate, String subjno, Integer periodYear, Integer periodMonth, Double begindrbal, Double begincrbal, Double dramt, Double cramt, Double drbal, Double crbal, String updtime, String tenantId) {
+    this.subjid = subjid;
     this.accdate = accdate;
     this.subjno = subjno;
     this.periodYear = periodYear;
@@ -79,6 +82,7 @@
     this.drbal = drbal;
     this.crbal = crbal;
     this.updtime = updtime;
+    this.tenantId = tenantId;
   }
 
   public String getAccdate() {
@@ -177,11 +181,11 @@
     this.tenantId = tenantId;
   }
 
-  public String getSubjid() {
+  public Integer getSubjid() {
     return subjid;
   }
 
-  public void setSubjid(String subjid) {
+  public void setSubjid(Integer subjid) {
     this.subjid = subjid;
   }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectdayPK.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectdayPK.java
index ac70e2f..e887b0c 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectdayPK.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TSubjectdayPK.java
@@ -11,7 +11,7 @@
 
   @Id
   @Column(name = "SUBJID", nullable = false, length = 32)
-  private String subjid;
+  private Integer subjid;
 
   public String getAccdate() {
     return accdate;
@@ -21,11 +21,11 @@
     this.accdate = accdate;
   }
 
-  public String getSubjid() {
+  public Integer getSubjid() {
     return subjid;
   }
 
-  public void setSubjid(String subjid) {
+  public void setSubjid(Integer subjid) {
     this.subjid = subjid;
   }
 
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntry.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntry.java
index b3006d8..d241958 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntry.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVoucherEntry.java
@@ -52,7 +52,7 @@
   public TVoucherEntry() {
   }
 
-  public TVoucherEntry(Integer voucherid, Integer entryid, String subjno, String accno, Double dramt, Double cramt, String summary, String oppsubjno, String oppaccno) {
+  public TVoucherEntry(Integer voucherid, Integer entryid, String subjno, String accno, Double dramt, Double cramt, String summary, String oppsubjno, String oppaccno, String tenantId) {
     this.voucherid = voucherid;
     this.entryid = entryid;
     this.subjno = subjno;
@@ -62,9 +62,10 @@
     this.summary = summary;
     this.oppsubjno = oppsubjno;
     this.oppaccno = oppaccno;
+    this.tenantId = tenantId;
   }
 
-  public TVoucherEntry(Integer voucherid, Integer entryid, String subjno, String accno, Double dramt, Double cramt, Double balance, Integer balflag, String summary, String oppsubjno, String oppaccno, String oppname) {
+  public TVoucherEntry(Integer voucherid, Integer entryid, String subjno, String accno, Double dramt, Double cramt, Double balance, Integer balflag, String summary, String oppsubjno, String oppaccno, String oppname, String tenantId) {
     this.voucherid = voucherid;
     this.entryid = entryid;
     this.subjno = subjno;
@@ -77,6 +78,7 @@
     this.oppsubjno = oppsubjno;
     this.oppaccno = oppaccno;
     this.oppname = oppname;
+    this.tenantId = tenantId;
   }
 
   public Integer getVoucherid() {
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java
index f7ff649..e2b9e3d 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java
@@ -1,15 +1,14 @@
 package com.supwisdom.dlpay.framework.domain;
 
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
+import javax.persistence.*;
 import javax.validation.constraints.NotNull;
 
 @Entity
 @Table(name = "TB_VOUCHERNOCTL")
 public class TVouchernoCtl {
   @Id
+  @SequenceGenerator(name = "vouchertype", sequenceName = "SEQ_vouchertype", allocationSize = 1, initialValue = 100)
+  @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "vouchertype")
   @Column(name = "VOUCHERTYPE", nullable = false, precision = 2)
   private Integer vouchertype;
 
@@ -28,10 +27,10 @@
   public TVouchernoCtl() {
   }
 
-  public TVouchernoCtl(Integer vouchertype, Integer periodMonth, Integer voucherno) {
-    this.vouchertype = vouchertype;
+  public TVouchernoCtl(Integer periodMonth, Integer voucherno, String tenantId) {
     this.periodMonth = periodMonth;
     this.voucherno = voucherno;
+    this.tenantId = tenantId;
   }
 
   public Integer getVouchertype() {
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 8310435..d1ff06d 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.exception.TransactionException;
 import com.supwisdom.dlpay.framework.dao.*;
 import com.supwisdom.dlpay.framework.data.FSubjectInfoBean;
 import com.supwisdom.dlpay.framework.data.MerchBean;
@@ -9,6 +10,7 @@
 import com.supwisdom.dlpay.framework.domain.*;
 import com.supwisdom.dlpay.framework.service.DayendSettleService;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.tenant.TenantContext;
 import com.supwisdom.dlpay.framework.util.DateUtil;
 import com.supwisdom.dlpay.framework.util.MoneyUtil;
 import com.supwisdom.dlpay.framework.util.StringUtil;
@@ -65,6 +67,7 @@
   public TSettleLog doCreateSettleLog() {
     TSettleLog log = new TSettleLog();
     log.setStarttime(systemUtilService.getSysdatetime().getHostdatetime());
+    log.setTenantId(TenantContext.getTenantSchema());
     return settleLogDao.save(log);
   }
 
@@ -76,7 +79,7 @@
   }
 
   private boolean doSwitchPeriod() throws Exception {
-    TPeriod period = periodDao.getTPeriodWithLock(periodYear, periodMonth);
+    TPeriod period = periodDao.getTPeriodWithLock(periodYear, periodMonth, TenantContext.getTenantSchema());
     if (period.getSettleflag() == 1) {
       throw new Exception("月末结转已完成");
     }
@@ -90,7 +93,7 @@
       periodMonth = periodMonth + 1; //year不变
     }
 
-    TPeriod nextPerid = periodDao.getPeriod(periodYear, periodMonth);
+    TPeriod nextPerid = periodDao.getPeriod(periodYear, periodMonth, TenantContext.getTenantSchema());
     if (null != nextPerid) {
       if (settledate != Integer.valueOf(nextPerid.getStartdate())) {
         throw new Exception("下一个会计期间的开始日期不正确");
@@ -109,25 +112,27 @@
       nextPerid.setStartdate(startdate.toString());
       nextPerid.setEnddate(enddate.toString());
       nextPerid.setSettleflag(0);
+      nextPerid.setTenantId(TenantContext.getTenantSchema());
       periodDao.save(nextPerid); //保存下个会计期间
     }
 
-    settleCtlDao.updateSettlePeriod(periodYear, periodMonth);
-    vouchernoCtlDao.updateVoucherno(periodMonth, 0);
+    settleCtlDao.updateSettlePeriodByTenantid(periodYear, periodMonth, TenantContext.getTenantSchema());
+    vouchernoCtlDao.updateVouchernoByTenantid(periodMonth, 0, TenantContext.getTenantSchema());
     return true;
   }
 
   private void saveVoucher(VoucherTemp voucherTemp) {
     TVoucher voucher = new TVoucher(periodYear, periodMonth, 0, settledate, settledate, voucherTemp.getTranscnt(), Math.abs(voucherTemp.getTransamt()), voucherTemp.getSummary(), "auto", hostdate);
+    voucher.setTenantId(TenantContext.getTenantSchema());
     voucher = voucherDao.save(voucher);
     TVoucherEntry entry1;
     TVoucherEntry entry2;
     if (voucherTemp.getTransamt() >= 0) {
-      entry1 = new TVoucherEntry(voucher.getVoucherid(), 1, voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), Math.abs(voucherTemp.getTransamt()), 0D, voucherTemp.getSummary(), voucherTemp.getCrsubjno(), voucherTemp.getCraccno());
-      entry2 = new TVoucherEntry(voucher.getVoucherid(), 2, voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), 0D, Math.abs(voucherTemp.getTransamt()), voucherTemp.getSummary(), voucherTemp.getDrsubjno(), voucherTemp.getDraccno());
+      entry1 = new TVoucherEntry(voucher.getVoucherid(), 1, voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), Math.abs(voucherTemp.getTransamt()), 0D, voucherTemp.getSummary(), voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), TenantContext.getTenantSchema());
+      entry2 = new TVoucherEntry(voucher.getVoucherid(), 2, voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), 0D, Math.abs(voucherTemp.getTransamt()), voucherTemp.getSummary(), voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), TenantContext.getTenantSchema());
     } else {
-      entry1 = new TVoucherEntry(voucher.getVoucherid(), 1, voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), 0D, Math.abs(voucherTemp.getTransamt()), voucherTemp.getSummary(), voucherTemp.getCrsubjno(), voucherTemp.getCraccno());
-      entry2 = new TVoucherEntry(voucher.getVoucherid(), 2, voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), Math.abs(voucherTemp.getTransamt()), 0D, voucherTemp.getSummary(), voucherTemp.getDrsubjno(), voucherTemp.getDraccno());
+      entry1 = new TVoucherEntry(voucher.getVoucherid(), 1, voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), 0D, Math.abs(voucherTemp.getTransamt()), voucherTemp.getSummary(), voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), TenantContext.getTenantSchema());
+      entry2 = new TVoucherEntry(voucher.getVoucherid(), 2, voucherTemp.getCrsubjno(), voucherTemp.getCraccno(), Math.abs(voucherTemp.getTransamt()), 0D, voucherTemp.getSummary(), voucherTemp.getDrsubjno(), voucherTemp.getDraccno(), TenantContext.getTenantSchema());
     }
     voucherEntryDao.save(entry1);
     voucherEntryDao.save(entry2);
@@ -135,7 +140,7 @@
 
   @Override
   public boolean doDayendSettle() throws Exception {
-    TSettlectl tSettlectl = settleCtlDao.findByBooksetnoWithLock(1);
+    TSettlectl tSettlectl = settleCtlDao.findByTenantIdWithLock(TenantContext.getTenantSchema());
     if (null == tSettlectl || null == tSettlectl.getBooksetno()) {
       throw new Exception("初始化错误,T_SETTLECTL 无初始化数据");
     }
@@ -149,38 +154,38 @@
     lastsettday = Integer.valueOf(DateUtil.getNewDay(tSettlectl.getSettledate().toString(), -1));
 
     if (settledate >= hostdate) {
-      throw new Exception("日终结算已完成");
+      throw new TransactionException(-99, "日终结算已完成");
     }
 
-    TPeriod period = periodDao.getPeriod(periodYear, periodMonth);
+    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())) {
       //月切
       if (!doSwitchPeriod()) {
-        throw new Exception("月切失败");
+        throw new TransactionException(-3, "月切失败");
       }
     }
 
     //新增科目插入科目余额表(末级科目)
-    List<String> newEndsubjectList = subjectDao.getNewSubject();
+    List<TSubject> newEndsubjectList = subjectDao.getNewSubjectByTenantid(TenantContext.getTenantSchema());
     if (!StringUtil.isEmpty(newEndsubjectList)) {
-      for (String subjno : newEndsubjectList) {
-        TSubjectbal subjectbal = new TSubjectbal(subjno);
+      for (TSubject subject : newEndsubjectList) {
+        TSubjectbal subjectbal = new TSubjectbal(subject.getId(),subject.getSubjno(), subject.getTenantId());
         subjectbalDao.save(subjectbal);
       }
     }
-    if (subjectDao.checkSettleSubject().getExisted() > 0) {
+    if (subjectDao.checkSettleSubjectByTenantid(TenantContext.getTenantSchema()).getExisted() > 0) {
       throw new Exception("初始化数据错误:科目余额表数据没有包含所有的科目余额");
     }
 
     //删除未入账凭证
-    if (voucherDao.checkExistUnpostVouhcer().getExisted() > 0) {
-      voucherEntryDao.deleteUnpostVoucherentry();
-      voucherDao.deleteUnpostVoucher();
+    if (voucherDao.checkExistUnpostVouhcer(TenantContext.getTenantSchema()).getExisted() > 0) {
+      voucherEntryDao.deleteUnpostVoucherentry(TenantContext.getTenantSchema());
+      voucherDao.deleteUnpostVoucher(TenantContext.getTenantSchema());
     }
 
     //用户交易凭证
-    List<VoucherTemp> userList = debitCreditDtlDao.getVoucherData(String.valueOf(settledate));
+    List<VoucherTemp> userList = debitCreditDtlDao.getVoucherData(String.valueOf(settledate), TenantContext.getTenantSchema());
     if (!StringUtil.isEmpty(userList)) {
       for (VoucherTemp temp : userList) {
         saveVoucher(temp);
@@ -188,16 +193,16 @@
     }
 
     //凭证号
-    TVouchernoCtl vouchernoCtl = vouchernoCtlDao.getVoucherno();
+    TVouchernoCtl vouchernoCtl = vouchernoCtlDao.getVouchernoByTenantid(TenantContext.getTenantSchema());
     if (null == vouchernoCtl) {
       vouchernoCtl = new TVouchernoCtl();
-      vouchernoCtl.setVouchertype(1);
       vouchernoCtl.setPeriodMonth(periodMonth);
       vouchernoCtl.setVoucherno(0);
+      vouchernoCtl.setTenantId(TenantContext.getTenantSchema());
       vouchernoCtlDao.save(vouchernoCtl);
     }
     int voucherno = vouchernoCtl.getVoucherno();
-    List<TVoucher> voucherList = voucherDao.getSettleVouchers();
+    List<TVoucher> voucherList = voucherDao.getSettleVouchers(TenantContext.getTenantSchema());
     if (!StringUtil.isEmpty(voucherList)) {
       for (TVoucher voucher : voucherList) {
         voucherno++;
@@ -211,24 +216,26 @@
 
     Map<String, Double> v_merchbaldict = new HashMap<String, Double>(0);
     //根据商户昨天日结表生成当天日结表(交易前余额), 新增商户添加记录
-    List<TShopaccday> lastShopaccdays = shopaccdayDao.getShopaccdayByAccdate(String.valueOf(lastsettday));
+    List<TShopaccday> lastShopaccdays = shopaccdayDao.getShopaccdayByAccdate(String.valueOf(lastsettday), TenantContext.getTenantSchema());
     if (!StringUtil.isEmpty(lastShopaccdays)) {
       for (TShopaccday lastday : lastShopaccdays) {
         TShopaccday today = new TShopaccday(String.valueOf(settledate), lastday.getShopaccno(), periodYear, periodMonth, lastday.getBalance(), 0D, 0D, 0D);
+        today.setTenantId(lastday.getTenantId());
         shopaccdayDao.save(today);
         v_merchbaldict.put(lastday.getShopaccno(), lastday.getBalance());
       }
     }
-    List<String> newShopaccs = shopaccDao.getNewShopacc(String.valueOf(lastsettday)); //新增商户
+    List<String> newShopaccs = shopaccDao.getNewShopacc(String.valueOf(lastsettday), TenantContext.getTenantSchema()); //新增商户
     if(!StringUtil.isEmpty(newShopaccs)){
       for(String accno:newShopaccs){
         TShopaccday today = new TShopaccday(String.valueOf(settledate), accno, periodYear, periodMonth, 0D, 0D, 0D, 0D);
+        today.setTenantId(TenantContext.getTenantSchema());
         shopaccdayDao.save(today);
         v_merchbaldict.put(accno, 0D);
       }
     }
 
-    List<MerchBean> merchBeanList = voucherDao.getShopVoucherByAccdate(settledate);
+    List<MerchBean> merchBeanList = voucherDao.getShopVoucherByAccdate(settledate, TenantContext.getTenantSchema());
     if (!StringUtil.isEmpty(merchBeanList)) {
       for (MerchBean merch : merchBeanList) {
         TShopaccday merchday = shopaccdayDao.getTShopaccdayById(String.valueOf(settledate), merch.getShopaccno());
@@ -240,34 +247,34 @@
         shopaccdayDao.save(merchday);
       }
     }
-    shopaccdayDao.updateShopaccdayBalance(String.valueOf(settledate), systemUtilService.getSysdatetime().getHostdatetime()); //批量更新余额,商户日结表生成
+    shopaccdayDao.updateShopaccdayBalance(String.valueOf(settledate), systemUtilService.getSysdatetime().getHostdatetime(), TenantContext.getTenantSchema()); //批量更新余额,商户日结表生成
 
     //根据科目昨天日结表生成当天日结表(交易前借贷方余额),新增末级科目插入记录(交易前余额为科目贷方余额)
-    List<TSubjectday> lastSubjectDays = subjectdayDao.getAllByAccdate(String.valueOf(lastsettday));
+    List<TSubjectday> lastSubjectDays = subjectdayDao.getAllByAccdate(String.valueOf(lastsettday), TenantContext.getTenantSchema());
     if (!StringUtil.isEmpty(lastSubjectDays)) {
       for (TSubjectday lastday : lastSubjectDays) {
-        TSubjectday today = new TSubjectday(String.valueOf(settledate), lastday.getSubjno(), periodYear, periodMonth, lastday.getDrbal(), lastday.getCrbal(), 0D, 0D, 0D, 0D);
+        TSubjectday today = new TSubjectday(lastday.getSubjid(),String.valueOf(settledate), lastday.getSubjno(), periodYear, periodMonth, lastday.getDrbal(), lastday.getCrbal(), 0D, 0D, 0D, 0D, lastday.getTenantId());
         subjectdayDao.save(today);
       }
     }
-    List<TSubjectbal> newSubjectBals = subjectbalDao.getUnsettleSubjectbal(String.valueOf(lastsettday));
+    List<TSubjectbal> newSubjectBals = subjectbalDao.getUnsettleSubjectbal(String.valueOf(lastsettday), TenantContext.getTenantSchema());
     if (!StringUtil.isEmpty(newSubjectBals)) {
       for (TSubjectbal newSubject : newSubjectBals) {
-        TSubjectday today = new TSubjectday(String.valueOf(settledate), newSubject.getSubjno(), periodYear, periodMonth, newSubject.getBegindrbal(), newSubject.getBegincrbal(), 0D, 0D, 0D, 0D);
+        TSubjectday today = new TSubjectday(newSubject.getSubjid(),String.valueOf(settledate), newSubject.getSubjno(), periodYear, periodMonth, newSubject.getBegindrbal(), newSubject.getBegincrbal(), 0D, 0D, 0D, 0D, newSubject.getTenantId());
         subjectdayDao.save(today);
       }
     }
-    List<String> newFSubjnos = subjectDao.getNewSubjnos(String.valueOf(settledate)); //新增非末级科目
+    List<TSubject> newFSubjnos = subjectDao.getNewSubjnos(String.valueOf(settledate), TenantContext.getTenantSchema()); //新增非末级科目
     if (!StringUtil.isEmpty(newFSubjnos)) {
-      for (String subjno : newFSubjnos) {
+      for (TSubject subj : newFSubjnos) {
         double beginDrbal = 0;
         double beginCrbal = 0;
-        MerchBean balInfo = subjectbalDao.getSubjectInfo(subjno); //统计下级所有科目的交易前余额
+        MerchBean balInfo = subjectbalDao.getSubjectInfo(subj.getSubjno(), subj.getTenantId()); //统计下级所有科目的交易前余额
         if (null != balInfo) {
           beginDrbal = (balInfo.getDramt() == null ? 0 : balInfo.getDramt().doubleValue());
           beginCrbal = (balInfo.getCramt() == null ? 0 : balInfo.getCramt().doubleValue());
         }
-        TSubjectday today = new TSubjectday(String.valueOf(settledate), subjno, periodYear, periodMonth, beginDrbal, beginCrbal, 0D, 0D, 0D, 0D);
+        TSubjectday today = new TSubjectday(subj.getId(),String.valueOf(settledate), subj.getSubjno(), periodYear, periodMonth, beginDrbal, beginCrbal, 0D, 0D, 0D, 0D, subj.getTenantId());
         subjectdayDao.save(today);
       }
     }
@@ -275,22 +282,22 @@
     //初始化末级科目期初余额(包含商户科目)
     Map<String, Double> v_subjbaldict = new HashMap<String, Double>(0);
     Map<String, Integer> v_subjbalflagdict = new HashMap<String, Integer>(0);
-    List<MerchBean> subjectList = subjectdayDao.getEndSubjectbalInfos(String.valueOf(settledate));
+    List<MerchBean> subjectList = subjectdayDao.getEndSubjectbalInfos(String.valueOf(settledate), TenantContext.getTenantSchema());
     if (!StringUtil.isEmpty(subjectList)) {
       for (MerchBean bean : subjectList) {
         v_subjbaldict.put(bean.getShopaccno(), MoneyUtil.formatYuan(bean.getDramt() + bean.getCramt()));
       }
     }
 
-    List<SubjectInfoBean> subjInfoList = subjectbalDao.getSubjectbalAndFlag();
+    List<SubjectInfoBean> subjInfoList = subjectbalDao.getSubjectbalAndFlag(TenantContext.getTenantSchema());
     for (SubjectInfoBean subj : subjInfoList) {
-      TSubjectday tSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), subj.getSubjno());
+      TSubjectday tSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), subj.getSubjno(), TenantContext.getTenantSchema());
       if (null == tSubjectday) {
         throw new Exception("科目日结表无此科目记录[" + subj.getSubjno() + "]");
       }
 
       v_subjbalflagdict.put(subj.getSubjno(), subj.getBalflag());
-      MerchBean suminfo = voucherDao.getSettleSuminfo(settledate, subj.getSubjno());
+      MerchBean suminfo = voucherDao.getSettleSuminfo(settledate, subj.getSubjno(), TenantContext.getTenantSchema());
       double sumDramt = ((null == suminfo || null == suminfo.getDramt()) ? 0 : suminfo.getDramt().doubleValue());
       double sumCramt = ((null == suminfo || null == suminfo.getCramt()) ? 0 : suminfo.getCramt().doubleValue());
       tSubjectday.setDramt(sumDramt);
@@ -304,9 +311,9 @@
       subjectdayDao.save(tSubjectday);
     }
     //根据二级更新一级科目日结
-    List<TSubjectday> parentSubject = subjectdayDao.getParentSubjectday(String.valueOf(settledate));
+    List<TSubjectday> parentSubject = subjectdayDao.getParentSubjectday(String.valueOf(settledate), TenantContext.getTenantSchema());
     for (TSubjectday fsub : parentSubject) {
-      FSubjectInfoBean sumInfo = subjectdayDao.getParentSumInfo(String.valueOf(settledate), fsub.getSubjno());
+      FSubjectInfoBean sumInfo = subjectdayDao.getParentSumInfo(String.valueOf(settledate), fsub.getSubjno(), fsub.getTenantId());
       fsub.setBegindrbal((null == sumInfo || null == sumInfo.getBegindrbal()) ? 0D : sumInfo.getBegindrbal());
       fsub.setBegincrbal((null == sumInfo || null == sumInfo.getBegincrbal()) ? 0D : sumInfo.getBegincrbal());
       fsub.setDramt((null == sumInfo || null == sumInfo.getDramt()) ? 0D : sumInfo.getDramt());
@@ -318,7 +325,7 @@
     }
 
     //批量更新凭证明细中商户或科目账户的余额
-    List<TVoucherEntry> entryList = voucherEntryDao.getVoucherEntryByVoucherdate(settledate);
+    List<TVoucherEntry> entryList = voucherEntryDao.getVoucherEntryByVoucherdate(settledate, TenantContext.getTenantSchema());
     if (!StringUtil.isEmpty(entryList)) {
       for (TVoucherEntry vce : entryList) {
         if (Subject.SUBJNO_MACHANT_INCOME.equals(vce.getSubjno())) {
@@ -331,7 +338,7 @@
           if (Subject.SUBJNO_MACHANT_INCOME.equals(vce.getOppsubjno())) {
             vce.setOppname(shopaccDao.getShopname(vce.getOppaccno()));
           } else {
-            vce.setOppname(subjectDao.getSubjectname(vce.getOppsubjno()));
+            vce.setOppname(subjectDao.getSubjectname(vce.getOppsubjno(), vce.getTenantId()));
           }
           voucherEntryDao.save(vce);
           Double befMerchbal = v_subjbaldict.get(vce.getSubjno());
@@ -352,7 +359,7 @@
           if (Subject.SUBJNO_MACHANT_INCOME.equals(vce.getOppsubjno())) {
             vce.setOppname(shopaccDao.getShopname(vce.getOppaccno()));
           } else {
-            vce.setOppname(subjectDao.getSubjectname(vce.getOppsubjno()));
+            vce.setOppname(subjectDao.getSubjectname(vce.getOppsubjno(), vce.getTenantId()));
           }
           voucherEntryDao.save(vce);
         }
@@ -374,11 +381,11 @@
 
     //核算科目日结表科目余额和凭证明细余额是否一致
     for (String subjno : v_subjbaldict.keySet()) {
-      TSubjectday tSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), subjno);
+      TSubjectday tSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), subjno, TenantContext.getTenantSchema());
       if (!MoneyUtil.moneyEqual(v_subjbaldict.get(subjno), tSubjectday.getDrbal() + tSubjectday.getCrbal())) {
         throw new Exception("结算后检查失败:科目日结表期末余额不等,科目号[" + subjno + "],科目余额[" + (tSubjectday.getDrbal() + tSubjectday.getCrbal()) + "],凭证科目余额[" + v_subjbaldict.get(subjno) + "]");
       }
-      TSubjectbal tSubjectbal = subjectbalDao.getOne(subjno);
+      TSubjectbal tSubjectbal = subjectbalDao.getBySubjnoAndTenantId(subjno, tSubjectday.getTenantId());
       tSubjectbal.setBegindrbal(tSubjectday.getBegindrbal());
       tSubjectbal.setBegincrbal(tSubjectday.getBegincrbal());
       tSubjectbal.setDramt(tSubjectday.getDramt());
@@ -390,8 +397,8 @@
     }
 
     //核对商户日结表余额表和科目日结表商户余额是否一致
-    TSubjectday shopSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), Subject.SUBJNO_MACHANT_INCOME);
-    Double merchbal = shopaccdayDao.getSumBalance(String.valueOf(settledate));
+    TSubjectday shopSubjectday = subjectdayDao.getSubjectDayById(String.valueOf(settledate), Subject.SUBJNO_MACHANT_INCOME, TenantContext.getTenantSchema());
+    Double merchbal = shopaccdayDao.getSumBalance(String.valueOf(settledate), TenantContext.getTenantSchema()); //
     double shopSubbal = (shopSubjectday == null ? 0 : shopSubjectday.getCrbal());
     double shopMerchbal = (merchbal == null ? 0 : merchbal);
     if (!MoneyUtil.moneyEqual(shopSubbal, shopMerchbal)) {
@@ -399,7 +406,7 @@
     }
 
     //核算一级科目余额是否平衡
-    FSubjectInfoBean allParentSubjbal = subjectdayDao.getAllParentSubjectSumInfo(String.valueOf(settledate));
+    FSubjectInfoBean allParentSubjbal = subjectdayDao.getAllParentSubjectSumInfo(String.valueOf(settledate), TenantContext.getTenantSchema());
     if (!MoneyUtil.moneyEqual(allParentSubjbal.getBegindrbal(), allParentSubjbal.getBegincrbal())) {
       throw new Exception("结算后检查失败:一级科目余额表期初余额不平衡,借方[" + allParentSubjbal.getBegindrbal() + "],贷方[" + allParentSubjbal.getBegincrbal() + "]");
     }
@@ -410,8 +417,8 @@
       throw new Exception("结算后检查失败:一级科目余额表期末额不平衡,借方[" + allParentSubjbal.getDrbal() + "]贷方[" + allParentSubjbal.getCrbal() + "]");
     }
     //校验科目余额表的balflag=1的总期末余额和balflag=2的总期末余额是否一致
-    Double balflag_1_sumbal = subjectbalDao.getSumEndsubjectBalByEndflag(1);
-    Double balflag_2_sumbal = subjectbalDao.getSumEndsubjectBalByEndflag(2);
+    Double balflag_1_sumbal = subjectbalDao.getSumEndsubjectBalByEndflag(1, TenantContext.getTenantSchema());
+    Double balflag_2_sumbal = subjectbalDao.getSumEndsubjectBalByEndflag(2, TenantContext.getTenantSchema());
     if (null == balflag_1_sumbal || null == balflag_1_sumbal) throw new Exception("结算后检查失败:科目余额表无数据");
     if (!MoneyUtil.moneyEqual(balflag_1_sumbal, balflag_2_sumbal)) {
       throw new Exception("结算后检查失败:科目余额表期末余额不平衡,借方[" + balflag_1_sumbal + "],贷方[" + balflag_2_sumbal + "]");
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 baf8449..d67a64d 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
@@ -84,7 +84,7 @@
 
   @Override
   public String getTranscodeName(int transocde, String defaultValue) {
-    TTranscode tTranscode = transcodeDao.getOne(transocde);
+    TTranscode tTranscode = transcodeDao.getByTranscode(transocde);
     if (null != tTranscode && !StringUtil.isEmpty(tTranscode.getTransname())) {
       return tTranscode.getTransname();
     }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SettleLogSearchBean.java b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SettleLogSearchBean.java
new file mode 100644
index 0000000..082c2ea
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/bean/SettleLogSearchBean.java
@@ -0,0 +1,40 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class SettleLogSearchBean {
+  private Integer page;
+  private Integer limit;
+  private String accdate;
+  private String status;
+
+  public Integer getPage() {
+    return page;
+  }
+
+  public void setPage(Integer page) {
+    this.page = page;
+  }
+
+  public Integer getLimit() {
+    return limit;
+  }
+
+  public void setLimit(Integer limit) {
+    this.limit = limit;
+  }
+
+  public String getAccdate() {
+    return accdate;
+  }
+
+  public void setAccdate(String accdate) {
+    this.accdate = accdate;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SettlementLogController.java b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SettlementLogController.java
new file mode 100644
index 0000000..296af29
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/controller/SettlementLogController.java
@@ -0,0 +1,56 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TSettleLog;
+import com.supwisdom.dlpay.framework.domain.TSyspara;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.WebConstant;
+import com.supwisdom.dlpay.system.bean.SettleLogSearchBean;
+import com.supwisdom.dlpay.system.service.SettlementLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 结算日志
+ * */
+@Controller
+public class SettlementLogController {
+  @Autowired
+  private SettlementLogService settlementLogService;
+
+  @GetMapping("/settlelog/index")
+  public String userdtlView() {
+    return "system/settlelog/index";
+  }
+
+  @GetMapping("/settlelog/datalist")
+  @PreAuthorize("hasPermission('/settlelog/index','')")
+  @ResponseBody
+  public PageResult<TSettleLog> searchUserdtlPage(@ModelAttribute SettleLogSearchBean searchBean) {
+    try {
+      Integer pageNo = searchBean.getPage();
+      Integer pageSize = searchBean.getLimit();
+      if (null == pageNo || pageNo < 1) pageNo = WebConstant.PAGENO_DEFAULT;
+      if (null == pageSize || pageSize < 1) pageSize = WebConstant.PAGESIZE_DEFAULT;
+      return settlementLogService.getSettleLogPage(searchBean,pageNo,pageSize);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
+    }
+  }
+
+  @PostMapping("/settlelog/dosettle")
+  @PreAuthorize("hasPermission('/settlelog/dosettle','')")
+  @ResponseBody
+  public JsonResult doSettlement() {
+    try {
+      return JsonResult.error("暂不支持调用结算执行逻辑");
+    } catch (Exception e) {
+      e.printStackTrace();
+      return JsonResult.error("系统处理异常").put("exception", e);
+    }
+  }
+
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/SettlementLogService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/SettlementLogService.java
new file mode 100644
index 0000000..0dfb031
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/SettlementLogService.java
@@ -0,0 +1,11 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.framework.domain.TSettleLog;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.SettleLogSearchBean;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface SettlementLogService {
+  @Transactional(rollbackFor = Exception.class, readOnly = true)
+  PageResult<TSettleLog> getSettleLogPage(SettleLogSearchBean searchBean, int pageNo, int pageSize);
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SettlementLogServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SettlementLogServiceImpl.java
new file mode 100644
index 0000000..f5cd51f
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/SettlementLogServiceImpl.java
@@ -0,0 +1,56 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.framework.dao.SettleLogDao;
+import com.supwisdom.dlpay.framework.domain.TSettleLog;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.bean.SettleLogSearchBean;
+import com.supwisdom.dlpay.system.service.SettlementLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class SettlementLogServiceImpl implements SettlementLogService {
+  @Autowired
+  private SettleLogDao settleLogDao;
+
+
+  @Override
+  public PageResult<TSettleLog> getSettleLogPage(SettleLogSearchBean searchBean, int pageNo, int pageSize) {
+    Pageable pageable = PageRequest.of(pageNo - 1, pageSize, Sort.by(Sort.Direction.DESC, "starttime"));
+    Page<TSettleLog> page = settleLogDao.findAll(new Specification<TSettleLog>() {
+      @Override
+      public Predicate toPredicate(Root<TSettleLog> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+        List<Predicate> predicates = new ArrayList<>();
+        if (!StringUtil.isEmpty(searchBean.getAccdate())) {
+          predicates.add(criteriaBuilder.ge(root.get("starttime").as(Long.class), Long.valueOf(DateUtil.unParseToDateFormat(searchBean.getAccdate()) + "000000")));
+          predicates.add(criteriaBuilder.le(root.get("endtime").as(Long.class), Long.valueOf(DateUtil.unParseToDateFormat(searchBean.getAccdate()) + "235959")));
+        }
+
+        if (!StringUtil.isEmpty(searchBean.getStatus())) {
+          if ("success".equalsIgnoreCase(searchBean.getStatus())) {
+            predicates.add(criteriaBuilder.equal(root.get("errcode").as(String.class), "0"));
+          } else {
+            predicates.add(criteriaBuilder.notEqual(root.get("errcode").as(String.class), "0"));
+            predicates.add(criteriaBuilder.notEqual(root.get("errcode").as(String.class), "-99"));
+          }
+        }
+        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
+      }
+    }, pageable);
+    return new PageResult<>(page);
+  }
+}
diff --git a/payapi/src/main/resources/data-postgresql.sql b/payapi/src/main/resources/data-postgresql.sql
index 89ba0ee..4298c90 100644
--- a/payapi/src/main/resources/data-postgresql.sql
+++ b/payapi/src/main/resources/data-postgresql.sql
@@ -1,6 +1,6 @@
 --pg--
-INSERT INTO "tb_period" ("period_year", "period_month", "startdate", "enddate", "settleflag" , "tenantid")
-VALUES (to_number(to_char(CURRENT_TIMESTAMP,'yyyy'),'9999'),to_number(to_char(CURRENT_TIMESTAMP,'MM'),'99'), to_char(CURRENT_TIMESTAMP,'yyyyMM')||'01', to_char((to_date(to_char(CURRENT_TIMESTAMP+'1 month','yyyyMM')||'01','yyyyMMdd')-1)::Timestamp,'yyyyMMdd'), 0, '{tenantid}');
+INSERT INTO "tb_period" ("id", "period_year", "period_month", "startdate", "enddate", "settleflag" , "tenantid")
+VALUES ('8a53b7826c65b925016c65bfa7c3001c',to_number(to_char(CURRENT_TIMESTAMP,'yyyy'),'9999'),to_number(to_char(CURRENT_TIMESTAMP,'MM'),'99'), to_char(CURRENT_TIMESTAMP,'yyyyMM')||'01', to_char((to_date(to_char(CURRENT_TIMESTAMP+'1 month','yyyyMM')||'01','yyyyMMdd')-1)::Timestamp,'yyyyMMdd'), 0, '{tenantid}');
 
 insert into TB_SETTLECTL(BOOKSETNO,PERIODYEAR,PERIODMONTH,STATDATE,SETTLEDATE,STATUS,updtime, "tenantid")
 values (1,to_number(to_char(CURRENT_TIMESTAMP,'yyyy'),'9999'),to_number(to_char(CURRENT_TIMESTAMP,'MM'),'99'),to_number(to_char(CURRENT_TIMESTAMP,'yyyyMMdd'),'99999999'),to_number(to_char(CURRENT_TIMESTAMP,'yyyyMMdd'),'99999999'),0,to_char(CURRENT_TIMESTAMP,'yyyyMMddhh24miss'), '{tenantid}');
diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql
index c177115..80a95a2 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -63,6 +63,8 @@
 VALUES (30, NULL, 1, NULL, '', '/report/subjectdetail', '科目明细账', 2, 20, '{tenantid}');
 INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
 VALUES (31, NULL, 1, NULL, '', '/report/shopbusiness', '商户营业情况表', 3, 20, '{tenantid}');
+INSERT INTO "tb_function" ("id", "createtime", "isleaf", "lastsaved", "menuicon", "menuurl", "name", "ordernum", "parentid", tenantid)
+VALUES (32, NULL, 1, NULL, '', '/settlelog/index', '结算日志', 5, 3, '{tenantid}');
 
 
 INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid)
@@ -117,6 +119,8 @@
 VALUES ('ff8080816b7947ed016b79557736007b', 12, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
 INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid)
 VALUES ('ff8080816b7947ed016b795577370081', 18, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO "tb_role_function" ("id", "functionid", "roleid", tenantid)
+VALUES ('ff8080816c8468e8016c846d7a570017', 32, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
 
 INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
 VALUES (4, '1', 4, '添加功能', '/function/add', '{tenantid}');
@@ -244,6 +248,10 @@
 VALUES (74, '', 31, '查询', '/report/shopbusiness', '{tenantid}');
 INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
 VALUES (76, '', 18, '新增', '/param/addsourcetype', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (77, '', 32, '查询', '/settlelog/index', '{tenantid}');
+INSERT INTO "tb_resource" ("id", "code", "function_id", "name", "uri", tenantid)
+VALUES (78, '', 32, '查询', '/settlelog/dosettle', '{tenantid}');
 
 INSERT INTO "tb_permission" ("id", "resid", "role_func_id", "roleid", tenantid)
 VALUES ('ff8080816b7947ed016b795577300036', 16, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
@@ -371,7 +379,10 @@
 VALUES ('ff8080816bbb130c016bbb6ea2f700c9', 76, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
 INSERT INTO  "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
 VALUES ('ff8080816bbb130c016bbb6ea2f600b3', 26, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
-
+INSERT INTO  "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816c8468e8016c846d7a5d0018', 77, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
+INSERT INTO  "tb_permission" ("id", "resid", "role_func_id", "roleid", "tenantid")
+VALUES ('ff8080816c85279d016c852aa829000d', 78, NULL, 'd1yctWs5+ks0iQN3m9bUvRHus6HbKbrs', '{tenantid}');
 
 INSERT INTO "tb_subject" ("subjid","subjno", "balflag", "displayflag", "endflag", "fsubjno", "opendate", "subjlevel", "subjname", "subjtype", "tenantid")
 VALUES (1, '1001', 1, 'y', 1, NULL, 20190430, 1, '库存现金', 1, '{tenantid}');
diff --git a/payapi/src/main/resources/templates/system/settlelog/index.html b/payapi/src/main/resources/templates/system/settlelog/index.html
new file mode 100644
index 0000000..3ba86e1
--- /dev/null
+++ b/payapi/src/main/resources/templates/system/settlelog/index.html
@@ -0,0 +1,152 @@
+<div class="layui-card">
+    <div class="layui-card-header">
+        <h2 class="header-title">结算日志</h2>
+        <span class="layui-breadcrumb pull-right">
+          <a href="#">系统中心</a>
+          <a><cite>结算日志</cite></a>
+        </span>
+    </div>
+    <div class="layui-card-body">
+        <div class="layui-form toolbar">
+            搜索:
+            <input id="search-settlelog-accdate" class="layui-input search-input" type="text" style="width: 150px;"
+                   placeholder="输入执行日期查询"/>&emsp;
+            <select id="search-settlelog-status" class="layui-select search-input">
+                <option value="">--请选择状态--</option>
+                <option value="success">成功</option>
+                <option value="error">失败</option>
+            </select>
+            <button id="search-settlelog-search" class="layui-btn icon-btn" data-type="search"><i class="layui-icon">&#xe615;</i>搜索
+            </button>
+            <button id="search-settlelog-deal" class="layui-btn icon-btn layui-btn-normal" data-type="add"><i
+                    class="layui-icon">&#xe605;</i>执行结算
+            </button>
+            <button id="search-settlelog-reset" class="layui-btn layui-btn-primary" data-type="reset"><i
+                    class="layui-icon"></i>清 空
+            </button>
+        </div>
+        <table class="layui-table" id="settlementLogTable" lay-filter="settlementLogTable-filter"></table>
+    </div>
+</div>
+
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element', 'laydate'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+        var laydate = layui.laydate;
+
+        form.render("select");
+        laydate.render({
+            elem: '#search-settlelog-accdate',
+            trigger: 'click'
+        });
+
+        // 渲染表格
+        table.render({
+            elem: '#settlementLogTable',
+            url: '[[@{/settlelog/datalist}]]',
+            page: true,
+            cols: [
+                [
+                    {
+                        field: 'starttime',
+                        title: '开始时间',
+                        width: 200,
+                        align: 'center',
+                        fixed: 'left',
+                        sort: true,
+                        templet: function (e) {
+                            return admin.formatDate(e.starttime);
+                        }
+                    },
+                    {
+                        field: 'endtime',
+                        title: '结束时间',
+                        width: 200,
+                        align: 'center',
+                        fixed: 'left',
+                        sort: true,
+                        templet: function (e) {
+                            return admin.formatDate(e.endtime);
+                        }
+                    },
+                    {
+                        field: 'errcode', title: '状态', width: 100, align: 'center', sort: true, templet: function (e) {
+                            if (null == e.errcode) {
+                                return '';
+                            } else if ('0' == e.errcode) {
+                                return '<span class="layui-badge layui-bg-green">成功</span>';
+                            } else if('-99' == e.errcode){
+                                return '<span class="layui-badge layui-bg-gray">无效</span>';
+                            } else {
+                                return '<span class="layui-badge">失败</span>';
+                            }
+                        }
+                    },
+                    {
+                        align: 'center', title: '执行时间', width: 120, templet: function (e) {
+                            if (null == e.endtime) {
+                                return '-';
+                            }
+                            var seconds = moment(e.endtime, 'YYYYMMDDHHmmss').diff(moment(e.starttime, 'YYYYMMDDHHmmss'), 'seconds');
+                            if (seconds > 0) {
+                                var h = parseInt(seconds / 3600);
+                                var m = parseInt((seconds - 3600 * h) / 60);
+                                var s = seconds % 60;
+                                var msg = '';
+                                if (h > 0) {
+                                    msg = msg + h + '时';
+                                }
+                                if (m > 0) {
+                                    msg = msg + m + '分';
+                                }
+                                if (s > 0) {
+                                    msg = msg + s + '秒';
+                                }
+                                return msg;
+                            } else {
+                                return '0';
+                            }
+                        }
+                    },
+                    {field: 'errcode', title: '错误码', width: 100, align: 'center'},
+                    {field: 'errmsg', title: '错误信息', align: 'left'}
+                ]
+            ]
+        });
+        // 搜索按钮点击事件
+        $('#search-settlelog-search').click(function () {
+            var accdate = $("#search-settlelog-accdate").val();
+            var status = $("#search-settlelog-status").val();
+            table.reload('settlementLogTable', {where: {accdate: accdate, status: status}, page: {curr: 1}});
+        });
+
+        $('#search-settlelog-deal').click(function () {
+            var token = $("meta[name='_csrf_token']").attr("value");
+            admin.go('[[@{/settlelog/dosettle}]]', {
+                _csrf: token
+            }, function (data) {
+                if (data.code === 200) {
+                    layer.msg(data.msg, {icon: 1, time: 1000});
+                    table.reload('settlementLogTable');
+                } else if (data.code === 401) {
+                    layer.msg(data.msg, {icon: 2, time: 1500}, function () {
+                        location.replace('[[@{/login}]]');
+                    }, 1000);
+                } else {
+                    layer.msg(data.msg, {icon: 2});
+                    return;
+                }
+            }, function (err) {
+                admin.errorBack(err);
+            });
+        });
+
+        $('#search-settlelog-reset').click(function () {
+            $("#search-settlelog-accdate").val("");
+            $("#search-settlelog-status").val("");
+            form.render("select");
+        });
+    });
+</script>
\ No newline at end of file