diff --git a/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java b/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
index 785ef41..0560c06 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/core/DayendSettleTask.java
@@ -22,8 +22,8 @@
 
   private static final Logger logger = LoggerFactory.getLogger(DayendSettleTask.class);
 
-//  @Scheduled(cron="0 3/30 2-3 * * ? ")
-  @Scheduled(cron="0 0/2 * * * ? ")
+  @Scheduled(cron="0 3/30 2-3 * * ? ")
+//  @Scheduled(cron="0 0/2 * * * ? ")
   public void doSettleTask() {
     if (logger.isDebugEnabled()) logger.debug("进入日结算任务！");
 
diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java
index fb10362..9a6a92c 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/dao/SubjectdayDao.java
@@ -4,6 +4,7 @@
 import com.supwisdom.dlpay.framework.data.MerchBean;
 import com.supwisdom.dlpay.framework.domain.TSubjectday;
 import com.supwisdom.dlpay.framework.domain.TSubjectdayPK;
+import com.supwisdom.dlpay.system.bean.SubjectDayInfo;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.query.Param;
@@ -28,10 +29,20 @@
 
   @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)
+      "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);
 
   @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);
+
+  @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, " +
+      "b.dramt AS dramt,b.cramt AS cramt,c.drbal AS drbal,c.crbal AS crbal " +
+      "FROM tb_subject t " +
+      "left join (SELECT t1.subjno,t1.begindrbal,t1.begincrbal FROM tb_subjectday t1 WHERE t1.accdate = :startdate ) a on t.subjno=a.subjno " +
+      "left join (SELECT t2.subjno,SUM(t2.dramt) dramt,SUM(t2.cramt) cramt FROM tb_subjectday t2 WHERE t2.accdate>=:startdate and t2.accdate<=:enddate GROUP BY t2.subjno) b on t.subjno=b.subjno " +
+      "left join (SELECT t3.subjno, t3.drbal, t3.crbal FROM tb_subjectday t3 WHERE t3.accdate = :enddate) c on t.subjno=c.subjno " +
+      "ORDER BY t.subjno asc ", nativeQuery = true)
+  List<SubjectDayInfo> getAllTSubjectday(@Param("startdate") String startdate, @Param("enddate") String enddate);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayInfo.java b/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayInfo.java
new file mode 100644
index 0000000..f31d5b5
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayInfo.java
@@ -0,0 +1,25 @@
+package com.supwisdom.dlpay.system.bean;
+
+public interface SubjectDayInfo {
+  String getSubjno();
+
+  String getSubjname();
+
+  String getFsubjno();
+
+  Integer getSubjlevel();
+
+  String getDisplayflag();
+
+  Double getLastdaydrbal();
+
+  Double getLastdaycrbal();
+
+  Double getDramt();
+
+  Double getCramt();
+
+  Double getDrbal();
+
+  Double getCrbal();
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayShowBean.java b/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayShowBean.java
new file mode 100644
index 0000000..c36c212
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/bean/SubjectDayShowBean.java
@@ -0,0 +1,103 @@
+package com.supwisdom.dlpay.system.bean;
+
+public class SubjectDayShowBean {
+  private String subjno;
+  private String subjname;
+  private String fsubjno;
+  private Integer subjlevel;
+  private String displayflag;
+  private Double lastdaydrbal;
+  private Double lastdaycrbal;
+  private Double dramt;
+  private Double cramt;
+  private Double drbal;
+  private Double crbal;
+
+  public String getSubjno() {
+    return subjno;
+  }
+
+  public void setSubjno(String subjno) {
+    this.subjno = subjno;
+  }
+
+  public String getSubjname() {
+    return subjname;
+  }
+
+  public void setSubjname(String subjname) {
+    this.subjname = subjname;
+  }
+
+  public String getFsubjno() {
+    return fsubjno;
+  }
+
+  public void setFsubjno(String fsubjno) {
+    this.fsubjno = fsubjno;
+  }
+
+  public Integer getSubjlevel() {
+    return subjlevel;
+  }
+
+  public void setSubjlevel(Integer subjlevel) {
+    this.subjlevel = subjlevel;
+  }
+
+  public String getDisplayflag() {
+    return displayflag;
+  }
+
+  public void setDisplayflag(String displayflag) {
+    this.displayflag = displayflag;
+  }
+
+  public Double getLastdaydrbal() {
+    return lastdaydrbal;
+  }
+
+  public void setLastdaydrbal(Double lastdaydrbal) {
+    this.lastdaydrbal = lastdaydrbal;
+  }
+
+  public Double getLastdaycrbal() {
+    return lastdaycrbal;
+  }
+
+  public void setLastdaycrbal(Double lastdaycrbal) {
+    this.lastdaycrbal = lastdaycrbal;
+  }
+
+  public Double getDramt() {
+    return dramt;
+  }
+
+  public void setDramt(Double dramt) {
+    this.dramt = dramt;
+  }
+
+  public Double getCramt() {
+    return cramt;
+  }
+
+  public void setCramt(Double cramt) {
+    this.cramt = cramt;
+  }
+
+  public Double getDrbal() {
+    return drbal;
+  }
+
+  public void setDrbal(Double drbal) {
+    this.drbal = drbal;
+  }
+
+  public Double getCrbal() {
+    return crbal;
+  }
+
+  public void setCrbal(Double crbal) {
+    this.crbal = crbal;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/controller/SettleReportController.java b/src/main/java/com/supwisdom/dlpay/system/controller/SettleReportController.java
new file mode 100644
index 0000000..b86669e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/controller/SettleReportController.java
@@ -0,0 +1,57 @@
+package com.supwisdom.dlpay.system.controller;
+
+import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.framework.domain.TSubject;
+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.SubjectDayShowBean;
+import com.supwisdom.dlpay.system.service.SettleReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+@Controller
+public class SettleReportController {
+  @Autowired
+  private SettleReportService settleReportService;
+
+  /**
+   * ====================================================
+   * 科目日结表
+   * ====================================================
+   */
+  @GetMapping("/report/subjectday")
+  public String subjectdayReport(ModelMap map) {
+    String settledate = settleReportService.getSystemSettledate();
+    map.addAttribute("maxdate", DateUtil.parseToDateFormat(DateUtil.getNewDay(settledate, -1)));
+    return "system/report/subjectday";
+  }
+
+  @GetMapping("/report/subjectdaylist")
+  @PreAuthorize("hasPermission('/report/subjectday','')")
+  @ResponseBody
+  public PageResult<SubjectDayShowBean> getSubjectdayData(@RequestParam(value = "startdate",required = false) String startdate,
+                                                          @RequestParam(value = "enddate",required = false) String enddate,
+                                                          @RequestParam(value = "nodealshow", required = false, defaultValue = "false") Boolean noDealShow) {
+    try {
+      if (StringUtil.isEmpty(startdate) || StringUtil.isEmpty(enddate)) {
+        return new PageResult<>(99, "请选择时间段");
+      } else if (!DateUtil.checkDatetimeValid(DateUtil.unParseToDateFormat(startdate), "yyyyMMdd")) {
+        return new PageResult<>(99, "起始时间非法");
+      } else if (!DateUtil.checkDatetimeValid(DateUtil.unParseToDateFormat(enddate), "yyyyMMdd")) {
+        return new PageResult<>(99, "截止时间非法");
+      }
+      return settleReportService.getSubjectDayInfos(DateUtil.unParseToDateFormat(startdate), DateUtil.unParseToDateFormat(enddate), noDealShow);
+    } catch (Exception e) {
+      e.printStackTrace();
+      return new PageResult<>(99, "系统查询错误");
+    }
+  }
+
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/SettleReportService.java b/src/main/java/com/supwisdom/dlpay/system/service/SettleReportService.java
new file mode 100644
index 0000000..cf59944
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/SettleReportService.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.system.service;
+
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.system.bean.SubjectDayShowBean;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+public interface SettleReportService {
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  String getSystemSettledate();
+
+  @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class, readOnly = true)
+  PageResult<SubjectDayShowBean> getSubjectDayInfos(String startdate,String enddate, boolean nodealshow);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/system/service/impl/SettleReportServiceImpl.java b/src/main/java/com/supwisdom/dlpay/system/service/impl/SettleReportServiceImpl.java
new file mode 100644
index 0000000..dabf5e8
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/system/service/impl/SettleReportServiceImpl.java
@@ -0,0 +1,69 @@
+package com.supwisdom.dlpay.system.service.impl;
+
+import com.supwisdom.dlpay.framework.dao.SettleCtlDao;
+import com.supwisdom.dlpay.framework.dao.SubjectdayDao;
+import com.supwisdom.dlpay.framework.domain.TSettlectl;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.MoneyUtil;
+import com.supwisdom.dlpay.framework.util.PageResult;
+import com.supwisdom.dlpay.framework.util.StringUtil;
+import com.supwisdom.dlpay.system.bean.SubjectDayInfo;
+import com.supwisdom.dlpay.system.bean.SubjectDayShowBean;
+import com.supwisdom.dlpay.system.service.SettleReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class SettleReportServiceImpl implements SettleReportService {
+  @Autowired
+  private SubjectdayDao subjectdayDao;
+  @Autowired
+  private SettleCtlDao settleCtlDao;
+
+  @Override
+  public String getSystemSettledate() {
+    TSettlectl settlectl = settleCtlDao.getOne(1);
+    if (null != settlectl && null != settlectl.getSettledate()) {
+      return settlectl.getSettledate().toString();
+    }
+    return DateUtil.getNow("yyyyMMdd");
+  }
+
+  @Override
+  public PageResult<SubjectDayShowBean> getSubjectDayInfos(String startdate, String enddate, boolean nodealshow) {
+    List<SubjectDayInfo> list = subjectdayDao.getAllTSubjectday(startdate, enddate);
+    if (StringUtil.isEmpty(list)) {
+      return new PageResult<>(99, "无数据");
+    }
+
+    List<SubjectDayShowBean> result = new ArrayList<>(0);
+    for (SubjectDayInfo info : list) {
+      SubjectDayShowBean bean = new SubjectDayShowBean();
+      bean.setSubjno(info.getSubjno());
+      bean.setSubjname(info.getSubjname());
+      bean.setFsubjno(info.getFsubjno() == null ? "-1" : info.getFsubjno());
+      bean.setSubjlevel(info.getSubjlevel());
+      bean.setDisplayflag(info.getDisplayflag());
+      bean.setLastdaydrbal(info.getLastdaydrbal() == null ? 0.00 : info.getLastdaydrbal());
+      bean.setLastdaycrbal(info.getLastdaycrbal() == null ? 0.00 : info.getLastdaycrbal());
+      bean.setDramt(info.getDramt() == null ? 0.00 : info.getDramt());
+      bean.setCramt(info.getCramt() == null ? 0.00 : info.getCramt());
+      bean.setDrbal(info.getDrbal() == null ? 0.00 : info.getDrbal());
+      bean.setCrbal(info.getCrbal() == null ? 0.00 : info.getCrbal());
+      if (bean.getLastdaydrbal() == 0 && bean.getLastdaycrbal() == 0 && bean.getDramt() == 0 && bean.getCramt() == 0 && bean.getDrbal() == 0 && bean.getCrbal() == 0) {
+        //无交易记录
+        if (nodealshow && "y".equals(bean.getDisplayflag())) {
+          result.add(bean); //显示
+        } else {
+          continue;
+        }
+      } else {
+        result.add(bean);
+      }
+    }
+    return new PageResult<SubjectDayShowBean>(result);
+  }
+}
diff --git a/src/main/resources/static/custom/module/treetable-lay/treetable.css b/src/main/resources/static/custom/module/treetable-lay/treetable.css
index ca2922d..584b2f8 100755
--- a/src/main/resources/static/custom/module/treetable-lay/treetable.css
+++ b/src/main/resources/static/custom/module/treetable-lay/treetable.css
@@ -13,5 +13,6 @@
 
 .treeTable-icon.open .layui-icon-triangle-d:before {
     content: "\e625";
+    background-color: transparent;
 }
 
diff --git a/src/main/resources/static/custom/module/treetable-lay/treetable.js b/src/main/resources/static/custom/module/treetable-lay/treetable.js
index 35efdcf..af7361a 100755
--- a/src/main/resources/static/custom/module/treetable-lay/treetable.js
+++ b/src/main/resources/static/custom/module/treetable-lay/treetable.js
@@ -10,91 +10,105 @@
             if (!treetable.checkParam(param)) {
                 return;
             }
-            var doneCallback = param.done;
             // 获取数据
+            if (param.data) {
+                treetable.init(param, param.data);
+            } else {
+                $.getJSON(param.url, param.where, function (res) {
+                    treetable.init(param, res.data);
+                });
+            }
+        },
+        // 渲染表格
+        init: function (param, data) {
             var mData = [];
-            $.getJSON(param.url, param.where, function (res) {
-                var tNodes = res.data;
-                // 补上id和pid字段
-                for (var i = 0; i < tNodes.length; i++) {
-                    var tt = tNodes[i];
-                    if (!tt.id) {
-                        if (!param.treeIdName) {
-                            layer.msg('参数treeIdName不能为空', {icon: 5});
-                            return;
-                        }
-                        tt.id = tt[param.treeIdName];
+            var doneCallback = param.done;
+            var tNodes = data;
+            // 补上id和pid字段
+            for (var i = 0; i < tNodes.length; i++) {
+                var tt = tNodes[i];
+                if (!tt.id) {
+                    if (!param.treeIdName) {
+                        layer.msg('参数treeIdName不能为空', {icon: 5});
+                        return;
                     }
-                    if (!tt.pid) {
-                        if (!param.treePidName) {
-                            layer.msg('参数treePidName不能为空', {icon: 5});
-                            return;
+                    tt.id = tt[param.treeIdName];
+                }
+                if (!tt.pid) {
+                    if (!param.treePidName) {
+                        layer.msg('参数treePidName不能为空', {icon: 5});
+                        return;
+                    }
+                    tt.pid = tt[param.treePidName];
+                }
+            }
+
+            // 对数据进行排序
+            var sort = function (s_pid, data) {
+                for (var i = 0; i < data.length; i++) {
+                    if (data[i].pid == s_pid) {
+                        var len = mData.length;
+                        if (len > 0 && mData[len - 1].id == s_pid) {
+                            mData[len - 1].isParent = true;
                         }
-                        tt.pid = tt[param.treePidName];
+                        mData.push(data[i]);
+                        sort(data[i].id, data);
                     }
                 }
+            };
+            sort(param.treeSpid, tNodes);
 
-                // 对数据进行排序
-                var sort = function (s_pid, data) {
-                    for (var i = 0; i < data.length; i++) {
-                        if (data[i].pid == s_pid) {
-                            var len = mData.length;
-                            if (len > 0 && mData[len - 1].id == s_pid) {
-                                mData[len - 1].isParent = true;
-                            }
-                            mData.push(data[i]);
-                            sort(data[i].id, data);
-                        }
-                    }
-                };
-                sort(param.treeSpid, tNodes);
-
-                // 重写参数
-                param.url = undefined;
-                param.data = mData;
-                param.page = {
-                    count: param.data.length,
-                    limit: param.data.length
-                };
-                param.cols[0][param.treeColIndex].templet = function (d) {
-                    var mId = d.id;
-                    var mPid = d.pid;
-                    var isDir = d.isParent;
-                    var emptyNum = treetable.getEmptyNum(mPid, mData);
-                    var iconHtml = '';
-                    for (var i = 0; i < emptyNum; i++) {
-                        iconHtml += '<span class="treeTable-empty"></span>';
-                    }
+            // 重写参数
+            param.url = undefined;
+            param.data = mData;
+            param.page = {
+                count: param.data.length,
+                limit: param.data.length
+            };
+            param.cols[0][param.treeColIndex].templet = function (d) {
+                var mId = d.id;
+                var mPid = d.pid;
+                var isDir = d.isParent;
+                var showIcon = true;
+                if (undefined != param.showicon && (param.showicon == true || param.showicon == false)) {
+                    showIcon = param.showicon;
+                }
+                var emptyNum = treetable.getEmptyNum(mPid, mData);
+                var iconHtml = '';
+                for (var i = 0; i < emptyNum; i++) {
+                    iconHtml += '<span class="treeTable-empty"></span>';
+                }
+                if (showIcon) {
                     if (isDir) {
                         iconHtml += '<i class="layui-icon layui-icon-triangle-d"></i> <i class="layui-icon layui-icon-layer"></i>';
                     } else {
                         iconHtml += '<i class="layui-icon layui-icon-file"></i>';
                     }
-                    iconHtml += '&nbsp;&nbsp;';
-                    var ttype = isDir ? 'dir' : 'file';
-                    var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">';
-                    return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>'
-                };
+                }
+                iconHtml += '&nbsp;&nbsp;';
+                var ttype = isDir ? 'dir' : 'file';
+                var vg = '<span class="treeTable-icon open" lay-tid="' + mId + '" lay-tpid="' + mPid + '" lay-ttype="' + ttype + '">';
+                return vg + iconHtml + d[param.cols[0][param.treeColIndex].field] + '</span>'
+            };
 
-                param.done = function (res, curr, count) {
-                    $(param.elem).next().addClass('treeTable');
-                    $('.treeTable .layui-table-page').css('display', 'none');
-                    $(param.elem).next().attr('treeLinkage', param.treeLinkage);
-                    // 绑定事件换成对body绑定
-                    /*$('.treeTable .treeTable-icon').click(function () {
-                        treetable.toggleRows($(this), param.treeLinkage);
-                    });*/
-                    if (param.treeDefaultClose) {
-                        treetable.foldAll(param.elem);
-                    }
-                    if (doneCallback) {
-                        doneCallback(res, curr, count);
-                    }
-                };
+            param.done = function (res, curr, count) {
+                $(param.elem).next().addClass('treeTable');
+                $('.treeTable .layui-table-page').css('display', 'none');
+                $(param.elem).next().attr('treeLinkage', param.treeLinkage);
+                // 绑定事件换成对body绑定
+                /*$('.treeTable .treeTable-icon').click(function () {
+                    treetable.toggleRows($(this), param.treeLinkage);
+                });*/
+                if (param.treeDefaultClose) {
+                    treetable.foldAll(param.elem);
+                }
+                if (doneCallback) {
+                    doneCallback(res, curr, count);
+                }
+            };
 
-                // 渲染表格
-                table.render(param);
-            });
+            // 渲染表格
+            table.render(param);
         },
         // 计算缩进的数量
         getEmptyNum: function (pid, data) {
diff --git a/src/main/resources/templates/system/report/subjectday.html b/src/main/resources/templates/system/report/subjectday.html
new file mode 100644
index 0000000..75c140c
--- /dev/null
+++ b/src/main/resources/templates/system/report/subjectday.html
@@ -0,0 +1,165 @@
+<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" lay-filter="subjectday-search-form">
+            <input type="hidden" id="subjectday-hidden-maxdate" th:value="${maxdate}" />
+            <div class="layui-form-item" style="margin-bottom: 0;">
+                <div class="layui-inline">
+                    <label class="layui-form-label">记账日期</label>
+                    <div class="layui-input-inline">
+                        <input type="text" name="startdate" id="subjectday-search-startdate" placeholder="起始日期" th:value="${maxdate}"
+                               autocomplete="off" class="layui-input"/>
+                    </div>
+                    <div class="layui-form-mid">-</div>
+                    <div class="layui-input-inline">
+                        <input type="text" name="enddate" id="subjectday-search-enddate" placeholder="截止日期" th:value="${maxdate}"
+                               autocomplete="off" class="layui-input"/>
+                    </div>
+                </div>
+
+                <div class="layui-inline">
+                    <div class="layui-input-block" style="margin-left: 0;">
+                        <input type="checkbox" name="nodealshow" id="subjectday-search-nodealshow" lay-skin="primary" title="显示未交易科目"/>
+                    </div>
+                </div>
+
+                <div class="layui-inline">
+                    <button id="subjectday-search-btn" class="layui-btn icon-btn" data-type="search"><i
+                            class="layui-icon">&#xe615;</i>搜索
+                    </button>
+                </div>
+            </div>
+        </div>
+    </div>
+    <div class="layui-card-body">
+        <!--<div class="layui-btn-group">-->
+            <!--<button class="layui-btn" id="btn-fold-subjectday">仅看一级</button>-->
+            <!--<button class="layui-btn" id="btn-expand-subjectday">查看二级</button>-->
+        <!--</div>-->
+        <table class="layui-table" id="subjectDayTable" lay-filter="subjectDayTable-filter"></table>
+    </div>
+</div>
+
+<script type="text/html" id="subjectday-toolbar">
+    <div class="layui-btn-container">
+        <button class="layui-btn layui-btn-sm" id="btn-fold-subjectday" lay-event="subjectdayShowFold">仅看一级</button>
+        <button class="layui-btn layui-btn-sm" id="btn-expand-subjectday" lay-event="subjectdayExpandAll">查看二级</button>
+    </div>
+</script>
+
+<script>
+    layui.use(['form', 'table', 'layer', 'admin', 'element', 'laydate', 'treetable'], function () {
+        var form = layui.form;
+        var table = layui.table;
+        var admin = layui.admin;
+        var laydate = layui.laydate;
+        var treetable = layui.treetable;
+
+        form.render("checkbox");
+        laydate.render({
+            elem: '#subjectday-search-startdate',
+            max: $("#subjectday-hidden-maxdate").val()
+        });
+        laydate.render({
+            elem: '#subjectday-search-enddate',
+            max: $("#subjectday-hidden-maxdate").val()
+        });
+
+        var renderTable = function (obj) {
+            layer.load(2);
+            treetable.render({
+                id: 'subjectDayReport',
+                title: '科目汇总表',
+                treeColIndex: 0,
+                treeSpid: '-1',
+                treeIdName: 'subjno',
+                treePidName: 'fsubjno',
+                treeDefaultClose: false,
+                treeLinkage: false,
+                elem: '#subjectDayTable',
+                url: '/report/subjectdaylist',
+                page: false,
+                where: obj,
+                showicon: false,
+                toolbar:'#subjectday-toolbar',
+                cols: [
+                    [
+                        {field: 'subjno', title: '科目号', align: 'left', rowspan: 2},
+                        {
+                            field: 'subjname', title: '科目名称', align: 'left', rowspan: 2, templet: function (d) {
+                                if (d.subjlevel == 1) {
+                                    return '<span>' + d.subjname + '</span>';
+                                } else {
+                                    return '<span>&nbsp;&nbsp;&nbsp;&nbsp;' + d.subjname + '</span>';
+                                }
+
+                            }
+                        },
+                        {align: 'center', title: '期初余额', colspan: 2},
+                        {align: 'center', title: '本期发生额', colspan: 2},
+                        {align: 'center', title: '期末余额', colspan: 2}
+                    ], [
+                        {field: 'lastdaydrbal', title: '借方', align: 'center'},
+                        {field: 'lastdaycrbal', title: '贷方', align: 'center'},
+                        {field: 'dramt', title: '借方', align: 'center'},
+                        {field: 'cramt', title: '贷方', align: 'center'},
+                        {field: 'drbal', title: '借方', align: 'center'},
+                        {field: 'crbal', title: '贷方', align: 'center'}
+                    ]
+                ],
+                done: function (res, curr, count) {
+                    layer.closeAll('loading');
+                }
+            });
+        }
+        renderTable({
+            startdate: $("#subjectday-search-startdate").val(),
+            enddate: $("#subjectday-search-enddate").val(),
+            nodealshow: false
+        });
+
+        $('#btn-expand-subjectday').click(function () {
+            treetable.expandAll('#subjectDayTable');
+        });
+
+        $('#btn-fold-subjectday').click(function () {
+            treetable.foldAll('#subjectDayTable');
+        });
+
+        $('#subjectday-search-btn').click(function () {
+            var startdate = $("#subjectday-search-startdate").val();
+            var enddate = $("#subjectday-search-enddate").val();
+            var nodealshow = $("#subjectday-search-nodealshow").is(':checked');
+            if (null == startdate || "" == $.trim(startdate)) {
+                layer.msg('请选择起始日期', {icon: 2, time: 1500});
+                return;
+            }
+            if (null == enddate || "" == $.trim(enddate)) {
+                layer.msg('请选择截止日期', {icon: 2, time: 1500});
+                return;
+            }
+            renderTable({
+                startdate: startdate,
+                enddate: enddate,
+                nodealshow: nodealshow
+            });
+        });
+
+        table.on('toolbar(subjectDayTable-filter)', function(obj){
+            switch(obj.event){
+                case 'subjectdayShowFold':
+                    treetable.foldAll('#subjectDayTable');
+                    break;
+                case 'subjectdayExpandAll':
+                    treetable.expandAll('#subjectDayTable');
+                    break;
+            }
+        });
+    });
+</script>
\ No newline at end of file
