diff --git a/src/main/java/com/supwisdom/dlpay/consume/controller/TestAction.java b/src/main/java/com/supwisdom/dlpay/consume/controller/TestAction.java
index 4883502..a53e942 100644
--- a/src/main/java/com/supwisdom/dlpay/consume/controller/TestAction.java
+++ b/src/main/java/com/supwisdom/dlpay/consume/controller/TestAction.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.consume.controller;
 
 import com.supwisdom.dlpay.consume.bean.BaseResp;
+import com.supwisdom.dlpay.consume.service.TestService;
 import com.supwisdom.dlpay.framework.data.SystemDateTime;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -12,11 +13,15 @@
 public class TestAction {
   @Autowired
   private SystemUtilService systemUtilService;
+  @Autowired
+  private TestService testService;
 
   @RequestMapping("/demo")
   public BaseResp test() {
     SystemDateTime dt = systemUtilService.getSysdatetime();
 
+    testService.doTest();
+
     BaseResp resp = new BaseResp();
     resp.setRetcode("0");
     resp.setRetmsg("OK");
diff --git a/src/main/java/com/supwisdom/dlpay/consume/domain/TDebitCreditDtlPK.java b/src/main/java/com/supwisdom/dlpay/consume/domain/TDebitCreditDtlPK.java
index 02e15e9..12254a8 100644
--- a/src/main/java/com/supwisdom/dlpay/consume/domain/TDebitCreditDtlPK.java
+++ b/src/main/java/com/supwisdom/dlpay/consume/domain/TDebitCreditDtlPK.java
@@ -2,8 +2,9 @@
 
 import javax.persistence.Column;
 import javax.persistence.Id;
+import java.io.Serializable;
 
-public class TDebitCreditDtlPK {
+public class TDebitCreditDtlPK implements Serializable {
   @Id
   @Column(name = "REFNO", nullable = false, length = 32)
   private String refno;
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
index b6d95e8..5a80eab 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/SettleCtlDao.java
@@ -14,6 +14,10 @@
   @Lock(value = LockModeType.PESSIMISTIC_FORCE_INCREMENT)
   TSettlectl findByBooksetno(Integer booksetno);
 
+  @Lock(value = LockModeType.PESSIMISTIC_FORCE_INCREMENT)
+  @Query(value = "from TSettlectl where booksetno=:booksetno ")
+  TSettlectl findByBooksetnoWithLock(@RequestParam("booksetno") Integer booksetno);
+
   @Query(value = "update TB_SETTLECTL set PERIOD_YEAR=:peridyear,PERIOD_MONTH=:peridmonth where BOOKSETNO=1 ", nativeQuery = true)
   void updateSettlePeriod(@RequestParam("peridyear") int peridyear, @RequestParam("peridmonth") int peridmonth);
 
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
index e218b13..eac1aa2 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccDao.java
@@ -17,9 +17,12 @@
   @Query(value = "select t.SHOPACCNO as accno from TB_SHOPACC t left join TB_SHOPACCBAL a on t.SHOPACCNO=a.SHOPACCNO where a.SHOPACCNO is null ", nativeQuery = true)
   List<AccnoBean> getNewShopacc();
 
-  @Query(value = "select count(t.*) as existed from TB_SHOPACCBAL t left join TB_SHOPACCBAL a on t.SHOPACCNO=a.SHOPACCNO where a.SHOPACCNO is null and t.STATUS='normal' ", nativeQuery = true)
+  @Query(value = "select count(t.*) as existed from TB_SHOPACC t left join TB_SHOPACCBAL a on t.SHOPACCNO=a.SHOPACCNO where a.SHOPACCNO is null and t.STATUS='normal' ", nativeQuery = true)
   ExistBean checkSettleShopacc();
 
   @Query(value = "select shopname from TShopacc where shopaccno=:shopaccno ")
   AccnameBean getShopname(@RequestParam("shopaccno") String shopaccno);
+
+  @Query(value = "select t.SHOPACCNO as accno from TB_SHOPACC t left join TB_SHOPACCBAL a on t.SHOPACCNO=a.SHOPACCNO where a.SHOPACCNO is null and t.opendate>=:settday ", nativeQuery = true)
+  List<AccnoBean> getNewAddShopacc(@RequestParam("settday") String settday);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccbalDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccbalDao.java
index 7010d29..2bd91c0 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccbalDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ShopaccbalDao.java
@@ -2,10 +2,12 @@
 
 import com.supwisdom.dlpay.framework.domain.TShopaccbal;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import javax.persistence.LockModeType;
 import java.util.List;
 
 @Repository
@@ -14,4 +16,8 @@
   @Query(value = "select t.* from TB_SHOPACCBAL t left join (select shopaccno from TB_SHOPACCDAY where accdate=:lastsettday ) a on t.shopaccno=a.shopaccno where a.shopaccno is null ", nativeQuery = true)
   List<TShopaccbal> getUnsettleShopacc(@RequestParam("lastsettday") String lastsettday);
 
+  @Lock(LockModeType.PESSIMISTIC_FORCE_INCREMENT)
+  @Query(value = "from TShopaccbal where shopaccno=:shopaccno ")
+  TShopaccbal getTShopaccbalByIdWithLock(@RequestParam("shopaccno")String shopaccno);
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
index 02d9e16..3aacfe3 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectbalDao.java
@@ -5,10 +5,12 @@
 import com.supwisdom.dlpay.framework.data.SubjectInfoBean;
 import com.supwisdom.dlpay.framework.domain.TSubjectbal;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import javax.persistence.LockModeType;
 import java.util.List;
 
 @Repository
@@ -25,4 +27,8 @@
 
   @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)
   AmountBean getSumEndsubjectBalByEndflag(@RequestParam("balflag")Integer balflag);
+
+  @Lock(LockModeType.PESSIMISTIC_FORCE_INCREMENT)
+  @Query("from TSubjectbal where subjno=:subjno ")
+  TSubjectbal getTSubjectbalBySubjnoWithLock(@RequestParam("subjno")String subjno);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/TaskLockDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/TaskLockDao.java
index 782e1b5..e9b3a37 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/TaskLockDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/TaskLockDao.java
@@ -17,6 +17,17 @@
   @Query("select a from TTaskLock a where a.taskcode=:taskcode")
   TTaskLock getTaskLockWithLock(@RequestParam("taskcode") String taskcode);
 
+  //================= database=Oracle =================//
   @Query(value = "select  to_char(sysdate,'yyyymmdd') as hostdate,to_char(sysdate,'hh24miss') as hosttime,to_char(sysdate,'yyyymmddhh24miss') as hostdatetime, sysdate from dual", nativeQuery = true)
   SystemDateTime getOracleDatetime();
+
+  @Query(value = " select to_char(sysdate,'yyyyMMddhh24miss')||to_char(SEQ_REFNO.nextval,'FM000000') as billno from dual ", nativeQuery = true)
+  String getOracleRefno();
+
+
+
+
+  //================= database=PG =================//
+  @Query(value = " select to_char(CURRENT_TIMESTAMP,'yyyyMMddhh24miss')||to_char(nextval('SEQ_REFNO'),'FM000000') as billno ", nativeQuery = true)
+  String getPgRefno();
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java
index b670572..f331a6b 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherDao.java
@@ -31,4 +31,8 @@
 
   @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(@RequestParam("voucherdate") Integer voucherdate, @RequestParam("subjno") String subjno);
+
+  @Lock(LockModeType.PESSIMISTIC_FORCE_INCREMENT)
+  @Query(value = "from TVoucher where voucherid=:voucherid ")
+  TVoucher findByVoucheridWithLock(@RequestParam("voucherid") String voucherid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java
index 37e9c1e..2bb4664 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/VoucherEntryDao.java
@@ -3,10 +3,12 @@
 import com.supwisdom.dlpay.framework.domain.TVoucherEntry;
 import com.supwisdom.dlpay.framework.domain.TVoucherEntryPK;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Lock;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import javax.persistence.LockModeType;
 import java.util.List;
 
 @Repository
@@ -16,4 +18,8 @@
 
   @Query(value = "from TVoucherEntry where voucherid in (select voucherid from TVoucher where voucherdate=:voucherdate) order by subjno,accno,voucherid ")
   List<TVoucherEntry> getVoucherEntryByVoucherdate(@RequestParam("voucherdate") Integer voucherdate);
+
+  @Lock(LockModeType.PESSIMISTIC_FORCE_INCREMENT)
+  @Query(value = "from TVoucherEntry t where t.voucherid=:voucherid ")
+  List<TVoucherEntry> getVoucherEntryByVoucherid(@RequestParam("voucherid")String voucherid);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java b/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java
index 44757b7..8b010c4 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/TVouchernoCtl.java
@@ -18,6 +18,15 @@
   @Column(name = "VOUCHERNO", nullable = false, precision = 9)
   private Integer voucherno;
 
+  public TVouchernoCtl() {
+  }
+
+  public TVouchernoCtl(Integer vouchertype, Integer periodMonth, Integer voucherno) {
+    this.vouchertype = vouchertype;
+    this.periodMonth = periodMonth;
+    this.voucherno = voucherno;
+  }
+
   public Integer getVouchertype() {
     return vouchertype;
   }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/DayendSettleService.java b/src/main/java/com/supwisdom/dlpay/framework/service/DayendSettleService.java
index 3891fc2..d3318f0 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/DayendSettleService.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/DayendSettleService.java
@@ -4,10 +4,16 @@
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+/**
+ * 日终结算
+ * */
 public interface DayendSettleService {
   TSettleLog doCreateSettleLog();
   TSettleLog doUpdateSettleLog(TSettleLog log);
 
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-  boolean doDayendSettle() throws Exception;
+  boolean doDayendSettle() throws Exception; //日结
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  boolean doVoucherSettle(String voucherid) throws Exception; //指定凭证入账
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/DayendStatisticsService.java b/src/main/java/com/supwisdom/dlpay/framework/service/DayendStatisticsService.java
new file mode 100644
index 0000000..110f0e2
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/DayendStatisticsService.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.framework.service;
+
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 日终统计
+ * */
+public interface DayendStatisticsService {
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
+  boolean doDayendStatistics() throws Exception; //日结后统计
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java b/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
index ede550b..21d2793 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/SystemUtilService.java
@@ -7,13 +7,37 @@
 
 public interface SystemUtilService {
 
+  /**
+   * 取数据库日期
+   * */
   SystemDateTime getSysdatetime();
 
+  /**
+   * 更新任务表
+   * */
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   TTaskLock updateTaskLock(TTaskLock lock);
 
+  /**
+   * 取任务表
+   * */
   @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
   TTaskLock doLockTask(String taskcode, Integer minRecover, String remark);
 
+  /**
+   * 获取记账日期
+   * */
+  String getAccdate();
+
+  /**
+   * 获取流水号
+   * */
+  String getRefno();
+
+  /**
+   * 按交易码取交易名称
+   */
+  String getTranscodeName(int transocde, String defaultValue);
+
 
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendSettleServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendSettleServiceImpl.java
index c4c2d09..e575ab8 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendSettleServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendSettleServiceImpl.java
@@ -138,8 +138,8 @@
 
   @Override
   public boolean doDayendSettle() throws Exception {
-    TSettlectl tSettlectl = settleCtlDao.findByBooksetno(1);
-    if (null == tSettlectl) {
+    TSettlectl tSettlectl = settleCtlDao.findByBooksetnoWithLock(1);
+    if (null == tSettlectl || null == tSettlectl.getBooksetno()) {
       throw new Exception("初始化错误，T_SETTLECTL 无初始化数据");
     }
     tSettlectl.setStatus(1); //结算标记
@@ -226,7 +226,7 @@
 
     //用户交易凭证
     List<VoucherTemp> userList = debitCreditDtlDao.getVoucherData(String.valueOf(settledate));
-    if(!StringUtil.isEmpty(userList)){
+    if (!StringUtil.isEmpty(userList)) {
       for (VoucherTemp temp : userList) {
         saveVoucher(temp);
       }
@@ -243,7 +243,7 @@
     }
     int voucherno = vouchernoCtl.getVoucherno();
     List<TVoucher> voucherList = voucherDao.getSettleVouchers();
-    if (StringUtil.isEmpty(voucherList)) {
+    if (!StringUtil.isEmpty(voucherList)) {
       for (TVoucher voucher : voucherList) {
         voucherno++;
         voucher.setVoucherno(voucherno);
@@ -257,7 +257,7 @@
     Map<String, Double> v_merchbaldict = new HashMap<String, Double>(0);
     //根据商户昨天日结表生成当天日结表（交易前余额）， 新增商户添加记录（交易前余额为商户余额）
     List<TShopaccday> lastShopaccdays = shopaccdayDao.getShopaccdayByAccdate(String.valueOf(lastsettday));
-    if (StringUtil.isEmpty(lastShopaccdays)) {
+    if (!StringUtil.isEmpty(lastShopaccdays)) {
       for (TShopaccday lastday : lastShopaccdays) {
         TShopaccday today = new TShopaccday(String.valueOf(settledate), lastday.getShopaccno(), periodYear, periodMonth, lastday.getBalance(), 0D, 0D, 0D);
         shopaccdayDao.save(today);
@@ -295,7 +295,7 @@
       }
     }
     List<TSubjectbal> newSubjectBals = subjectbalDao.getUnsettleSubjectbal(String.valueOf(lastsettday));
-    if (StringUtil.isEmpty(newSubjectBals)) {
+    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);
         subjectdayDao.save(today);
@@ -320,7 +320,7 @@
     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));
-    if (StringUtil.isEmpty(subjectList)) {
+    if (!StringUtil.isEmpty(subjectList)) {
       for (MerchBean bean : subjectList) {
         v_subjbaldict.put(bean.getShopaccno(), MoneyUtil.formatYuan(bean.getDramt() + bean.getCramt()));
       }
@@ -461,8 +461,118 @@
 
     //日切
     tSettlectl.setStatus(0); //清标记
-    tSettlectl.setSettledate(Integer.valueOf(DateUtil.getNewDay(String.valueOf(settledate),1)));
+    tSettlectl.setSettledate(Integer.valueOf(DateUtil.getNewDay(String.valueOf(settledate), 1)));
     tSettlectl.setUpdtime(systemUtilService.getSysdatetime().getHostdatetime());
     return true;
   }
+
+  @Override
+  public boolean doVoucherSettle(String voucherid) throws Exception {
+    if (StringUtil.isEmpty(voucherid)) throw new Exception("参数为空");
+
+    TSettlectl settlectl = settleCtlDao.findByBooksetno(1);
+    if (null == settlectl || null == settlectl.getBooksetno()) {
+      throw new Exception("系统初始化参数错误");
+    }
+
+//    int hostDate = Integer.valueOf(systemUtilService.getSysdatetime().getHostdatetime());
+//    int prdyear = settlectl.getPeriodYear();
+//    int prdmonth = settlectl.getPeriodMonth();
+    int settday = settlectl.getSettledate();
+
+    List<AccnoBean> newShopList = shopaccDao.getNewAddShopacc(String.valueOf(settday));
+    if (!StringUtil.isEmpty(newShopList)) {
+      for (AccnoBean accno : newShopList) {
+        TShopaccbal shopBal = new TShopaccbal(accno.getAccno());
+        shopaccbalDao.save(shopBal);
+      }
+    }
+    if (shopaccDao.checkSettleShopacc().getExisted() > 0) {
+      throw new Exception("初始化数据错误:商户余额表数据没有包含所有有效的商户账户余额");
+    }
+
+    //新增科目插入科目余额表（末级科目）
+    List<AccnoBean> newEndsubjectList = subjectDao.getNewSubject();
+    if (!StringUtil.isEmpty(newEndsubjectList)) {
+      for (AccnoBean bean : newEndsubjectList) {
+        TSubjectbal subjectbal = new TSubjectbal(bean.getAccno());
+        subjectbalDao.save(subjectbal);
+      }
+    }
+    if (subjectDao.checkSettleSubject().getExisted() > 0) {
+      throw new Exception("初始化数据错误:科目余额表数据没有包含所有的科目余额");
+    }
+
+    TVoucher voucher = voucherDao.findByVoucheridWithLock(voucherid);
+    List<TVoucherEntry> entryList = voucherEntryDao.getVoucherEntryByVoucherid(voucherid);
+    if (null == voucher) {
+      throw new Exception("凭证查询无记录");
+    } else if ("auto".equals(voucher.getSourcetype())) {
+      throw new Exception("该凭证不是手工录入凭证");
+    } else if (voucher.getCheckflag() != 1) {
+      throw new Exception("该凭证未审核");
+    } else if (StringUtil.isEmpty(voucher.getSummary())) {
+      throw new Exception("摘要不能为空");
+    } else if (voucher.getPostflag() == 1) {
+      throw new Exception("凭证已入账");
+    }
+
+    if (StringUtil.isEmpty(entryList)) {
+      throw new Exception("凭证无借贷明细！");
+    }
+
+    //凭证号
+    TVouchernoCtl vouchernoCtl = vouchernoCtlDao.getVoucherno();
+    if (null == vouchernoCtl) {
+      vouchernoCtl = new TVouchernoCtl(1, periodMonth, 0);
+      vouchernoCtlDao.save(vouchernoCtl);
+    }
+    int voucherno = vouchernoCtl.getVoucherno() + 1;
+    vouchernoCtl.setVoucherno(voucherno);
+    vouchernoCtlDao.save(vouchernoCtl);
+
+    voucher.setVoucherno(voucherno);
+    voucher.setPostflag(1);
+    voucherDao.save(voucher); //修改凭证表凭证号、入账标志
+
+    //明细
+    for (TVoucherEntry entry : entryList) {
+      if (TradeDict.SUBJNO_SHOP.equals(entry.getSubjno())) {
+        TShopaccbal tShopaccbal = shopaccbalDao.getTShopaccbalByIdWithLock(entry.getAccno());
+        if (null == tShopaccbal) {
+          throw new Exception("商户表商户账号[" + entry.getAccno() + "]不存在");
+        }
+        tShopaccbal.setBalance(tShopaccbal.getBeginbal() + entry.getCramt() - entry.getDramt());
+        shopaccbalDao.save(tShopaccbal);
+        entry.setBalflag(2);
+        entry.setBalance(tShopaccbal.getBalance());
+      } else {
+        TSubjectbal tSubjectbal = subjectbalDao.getTSubjectbalBySubjnoWithLock(entry.getSubjno());
+        TSubject subject = subjectDao.getOne(entry.getSubjno());
+        if (null == tSubjectbal || null == subject) {
+          throw new Exception("科目表科目号[" + entry.getSubjno() + "]不存在");
+        } else if (subject.getEndflag() != 1) {
+          throw new Exception("科目[" + entry.getSubjno() + "]非末级科目");
+        }
+        entry.setBalflag(subject.getBalflag());
+        if (subject.getBalflag() == 1) {
+          tSubjectbal.setDrbal(tSubjectbal.getDrbal() + entry.getDramt() - entry.getCramt());
+          entry.setBalance(tSubjectbal.getDrbal());
+        } else {
+          tSubjectbal.setCrbal(tSubjectbal.getCrbal() - entry.getDramt() + entry.getCramt());
+          entry.setBalance(tSubjectbal.getCrbal());
+        }
+        subjectbalDao.save(tSubjectbal);
+      }
+
+      if (!StringUtil.isEmpty(entry.getOppaccno())) {
+        entry.setOppname(shopaccDao.getShopname(entry.getOppaccno()).getAccname());
+      } else {
+        entry.setOppname(subjectDao.getSubjectname(entry.getOppsubjno()).getAccname());
+      }
+      voucherEntryDao.save(entry);
+    }
+
+    return true;
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendStatisticsServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendStatisticsServiceImpl.java
new file mode 100644
index 0000000..b7d5c1b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/DayendStatisticsServiceImpl.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.framework.service.impl;
+
+import com.supwisdom.dlpay.framework.service.DayendStatisticsService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class DayendStatisticsServiceImpl implements DayendStatisticsService {
+
+  @Override
+  public boolean doDayendStatistics() throws Exception {
+    return false;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
index 863b206..b4b8b48 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/service/impl/SystemUtilServiceImpl.java
@@ -1,29 +1,35 @@
 package com.supwisdom.dlpay.framework.service.impl;
 
+import com.supwisdom.dlpay.framework.dao.SettleCtlDao;
 import com.supwisdom.dlpay.framework.dao.TaskLockDao;
+import com.supwisdom.dlpay.framework.dao.TranscodeDao;
 import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.framework.domain.TSettlectl;
 import com.supwisdom.dlpay.framework.domain.TTaskLock;
+import com.supwisdom.dlpay.framework.domain.TTranscode;
 import com.supwisdom.dlpay.framework.service.SystemUtilService;
 import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.apache.log4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContext;
-
 @Service
 public class SystemUtilServiceImpl implements SystemUtilService {
-  @PersistenceContext
-  private EntityManager entityManager;
   @Autowired
   private TaskLockDao taskLockDao;
+  @Autowired
+  private SettleCtlDao settleCtlDao;
+  @Autowired
+  private TranscodeDao transcodeDao;
+
+  private static final Logger logger = Logger.getLogger(SystemUtilServiceImpl.class);
 
   /**
    * 获取oracle数据库时间
    */
   private SystemDateTime getOracleDatetime() {
-    SystemDateTime systemDateTime = taskLockDao.getOracleDatetime();
-    return systemDateTime;
+    return taskLockDao.getOracleDatetime();
   }
 
   @Override
@@ -42,7 +48,7 @@
     String hostdatetime = getSysdatetime().getHostdatetime(); //yyyyMMddHHmmss
     TTaskLock lock = taskLockDao.getTaskLockWithLock(taskcode);
     if (lock != null) {
-      if (lock.getTaskstatus().intValue() == 1 && DateUtil.compareDatetime(DateUtil.getNewTime(hostdatetime, -60 * minRecover), lock.getTasktime()) < 0) {
+      if (lock.getTaskstatus() == 1 && DateUtil.compareDatetime(DateUtil.getNewTime(hostdatetime, -60 * minRecover), lock.getTasktime()) < 0) {
         // 被锁，正在执行操作
         return null;
       } else {
@@ -61,4 +67,35 @@
     }
     return lock;
   }
+
+  @Override
+  public String getAccdate() {
+    String hostdate = getSysdatetime().getHostdate();
+    TSettlectl settlectl = settleCtlDao.getOne(1);
+    if (null != settlectl && null != settlectl.getSettledate()) {
+      if (Integer.valueOf(hostdate) < settlectl.getSettledate().intValue()) {
+        return settlectl.getSettledate().toString();
+      }
+    }
+    return hostdate;
+  }
+
+  private String getOracleRefno(){
+      return taskLockDao.getOracleRefno();
+  }
+
+  @Override
+  public String getRefno(){
+    return getOracleRefno();
+  }
+
+  @Override
+  public String getTranscodeName(int transocde, String defaultValue) {
+    TTranscode tTranscode = transcodeDao.getOne(transocde);
+    if (null != tTranscode && !StringUtil.isEmpty(tTranscode.getTransname())) {
+      return tTranscode.getTransname();
+    }
+    return defaultValue;
+  }
+
 }
