设备组查询显示子设备组的设备,设备管理编辑调整,报表导入提示修改
diff --git a/config/application-devel-pg.properties b/config/application-devel-pg.properties
index 84dffed..77d4185 100644
--- a/config/application-devel-pg.properties
+++ b/config/application-devel-pg.properties
@@ -8,7 +8,7 @@
 #logging.level.org.hibernate.SQL=DEBUG
 # Postgresql settings
 spring.datasource.platform=postgresql
-spring.datasource.url=jdbc:postgresql://172.28.201.70:15432/restaurantdev
+spring.datasource.url=jdbc:postgresql://172.28.201.101:25432/restauranttest
 spring.datasource.username=payapi
 spring.datasource.password=123456
 database.dbtype=postgresql
diff --git a/src/main/java/com/supwisdom/dlpay/framework/security/CodeUtil.java b/src/main/java/com/supwisdom/dlpay/framework/security/CodeUtil.java
index ecfb7c9..804526e 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/security/CodeUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/security/CodeUtil.java
@@ -35,10 +35,8 @@
     //获取生成的验证码
     String verifyCodeExpected = (String) request.getSession()
         .getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
-    System.out.println(verifyCodeExpected);
     //获取用户输入的验证码
     String verifyCodeActual = CodeUtil.getString(request, "imageCode");
-    System.out.println(verifyCodeActual);
     if (verifyCodeActual == null || !verifyCodeActual.equals(verifyCodeExpected)) {
       return false;
     }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceGroupController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceGroupController.java
index 197f709..c75b27f 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceGroupController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceGroupController.java
@@ -47,8 +47,7 @@
             searchBean.setPageNo(pageNo);
             searchBean.setDevgroupid(searchKey);
             searchBean.setPageSize(pageSize);
-            System.out.println(searchKey+"&&&&");
-            return deviceService.getDeviceByGroupId(searchBean);
+            return deviceService.getBindDevicesBySearch(searchBean);
         } catch (Exception e) {
             e.printStackTrace();
             return new PageResult<>(99, "系统查询错误");
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java
index bc0cae0..ed32a71 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/controller/DeviceManageController.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.restaurant.controller;
 
 
+import com.google.gson.Gson;
 import com.supwisdom.dlpay.api.bean.JsonResult;
 import com.supwisdom.dlpay.restaurant.bean.DeviceSearchBean;
 import com.supwisdom.dlpay.restaurant.domain.TDevice;
@@ -18,7 +19,10 @@
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+
 @Controller
 @RequestMapping("/devicemanage")
 public class DeviceManageController {
@@ -32,6 +36,14 @@
 
     @RequestMapping("/index")
     public String indexView(ModelMap model) {
+        Map<Integer, String> map = new HashMap<>();
+        List<TDeviceGroup> lst = groupService.findAll();
+        for (TDeviceGroup group : lst) {
+            map.put(group.getDevgroupid(), group.getGroupname());
+        }
+        Gson gson = new Gson();
+        String gsonString = gson.toJson(map);
+        model.put("groupList", gsonString);
 
         return "restaurant/devicemanage/index";
     }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java
index 0eee4e7..f7223da 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/DeviceService.java
@@ -39,4 +39,8 @@
 
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
     JsonResult importFile(MultipartFile file, HttpServletRequest request) throws Exception;
+
+    @Transactional(rollbackFor = Exception.class, readOnly = true)
+    PageResult<TDevice> getBindDevicesBySearch(DeviceSearchBean searchBean);
+
 }
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
index 0d6e626..b6360ac 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/CustomerServiceImpl.java
@@ -126,12 +126,17 @@
 //    InputStream excelstream = new FileInputStream(savePath+"/"+fname);
         InputStream excelstream = file.getInputStream();
         List<Object[][]> oList = null;
-        if (fname.endsWith(".xls")) {
-            oList = ImportExcelUtil.getIntegralData(excelstream);//2003版本
-        } else {
-            oList = ImportExcelUtil.getIntegralData07(excelstream);//2007版本以上
+        try{
+            if (fname.endsWith(".xls")) {
+                oList = ImportExcelUtil.getIntegralData(excelstream);//2003版本
+            } else {
+                oList = ImportExcelUtil.getIntegralData07(excelstream);//2007版本以上
+            }
+        }catch (Exception e){
+            return JsonResult.error("模板格式错误,请重新下载模板");
         }
 
+
         String msg = "";
         Integer successCnt=0;
         Integer failCnt=0;
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
index cafc853..72efa0b 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceDiscountRuleServiceImpl.java
@@ -200,14 +200,19 @@
       throw new WebCheckException("文件格式错误,请选择excel文件");
     }
     List<Object[][]> excelData = null;
-    if (filename.endsWith(".xls")) {
-      excelData = ImportExcelUtil.getIntegralData(file.getInputStream());//2003版本
-    } else {
-      excelData = ImportExcelUtil.getIntegralData07(file.getInputStream());//2007版本以上
+    try{
+      if (filename.endsWith(".xls")) {
+        excelData = ImportExcelUtil.getIntegralData(file.getInputStream());//2003版本
+      } else {
+        excelData = ImportExcelUtil.getIntegralData07(file.getInputStream());//2007版本以上
+      }
+      if (null == excelData || excelData.size() < 1) {
+        throw new WebCheckException("excel文件解析错误");
+      }
+    }catch (ArrayIndexOutOfBoundsException e){
+      throw new WebCheckException("模板格式错误,请重新下载模板");
     }
-    if (null == excelData || excelData.size() < 1) {
-      throw new WebCheckException("excel文件解析错误");
-    }
+
 
     int index_cardno = -1;
     int index_name = -1;
diff --git a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java
index 37be9e7..3eeb755 100644
--- a/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/supwisdom/dlpay/restaurant/service/impl/DeviceServiceImpl.java
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.restaurant.service.impl;
 
 import com.supwisdom.dlpay.api.bean.JsonResult;
+import com.supwisdom.dlpay.exception.WebCheckException;
 import com.supwisdom.dlpay.restaurant.bean.DeviceSearchBean;
 import com.supwisdom.dlpay.restaurant.dao.DeviceDao;
 import com.supwisdom.dlpay.restaurant.dao.ShopDeviceDao;
@@ -12,6 +13,9 @@
 import com.supwisdom.dlpay.framework.util.ImportExcelUtil;
 import com.supwisdom.dlpay.framework.util.PageResult;
 import com.supwisdom.dlpay.framework.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.hibernate.query.internal.NativeQueryImpl;
+import org.hibernate.transform.Transformers;
 import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.domain.Sort;
@@ -20,9 +24,13 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
 import javax.persistence.criteria.*;
 import javax.servlet.http.HttpServletRequest;
 import java.io.InputStream;
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -36,6 +44,8 @@
     private ShopDeviceDao shopDeviceDao;
     @Autowired
     private ShopSettlementDao shopSettlementDao;
+    @PersistenceContext
+    private EntityManager entityManager;
 
         @Override
         public PageResult<TDevice> getDeviceByParam(DeviceSearchBean param) {
@@ -115,7 +125,6 @@
 
     @Override
     public JsonResult updateDevice(TDevice device) {
-
         TDevice d = deviceDao.findTDeviceById(device.getId());
         d.setDevicename(device.getDevicename());
         d.setDevgroupid(device.getDevgroupid());
@@ -156,13 +165,20 @@
 //    InputStream excelstream = new FileInputStream(savePath+"/"+fname);
         InputStream excelstream = file.getInputStream();
         List<Object[][]> oList = null;
-        if (fname.endsWith(".xls")) {
-            oList = ImportExcelUtil.getIntegralData(excelstream);//2003版本
-        } else {
-            oList = ImportExcelUtil.getIntegralData07(excelstream);//2007版本以上
+        try{
+            if (fname.endsWith(".xls")) {
+                oList = ImportExcelUtil.getIntegralData(excelstream);//2003版本
+            } else {
+                oList = ImportExcelUtil.getIntegralData07(excelstream);//2007版本以上
+            }
+        }catch (Exception e){
+            return JsonResult.error("模板格式错误,请重新下载模板");
         }
 
+
         String msg = "";
+        Integer successCnt=0;
+        Integer failCnt=0;
         for (Object[][] data : oList) {
             for (int i = 1; i < data.length; i++) {
 
@@ -194,8 +210,45 @@
 
             return JsonResult.ok("成功导入"+sList.size()+"条信息");
         }
+        msg="导入成功"+successCnt+"条,导入失败"+failCnt+"条<br/>"+msg;
+
         return JsonResult.error(String.format(Locale.CHINESE, msg));
     }
 
+    @Override
+    public PageResult<TDevice> getBindDevicesBySearch(DeviceSearchBean searchBean) {
+        List<Integer> chirdGroupids = null;
+        Integer devgroupid=searchBean.getDevgroupid();
+        if (null != devgroupid) {
+            Query chirdGroupQuery = entityManager.createNativeQuery(" WITH  RECURSIVE  r  AS ( " +
+                    " SELECT * FROM tb_devicegroup WHERE devgroupid = :gid " +
+                    " union ALL " +
+                    " SELECT a.* FROM tb_devicegroup a, r WHERE a.pid = r.devgroupid ) " +
+                    " SELECT devgroupid FROM r ORDER BY devgroupid ");
+            chirdGroupQuery.setParameter("gid", devgroupid.intValue());
+            chirdGroupids = chirdGroupQuery.getResultList(); //递归查询所有的子节点
+        }
+
+        StringBuffer sql = new StringBuffer("select t.id ,t.devicename,t.devphyid,t.shopid,t.factoryid,t.state " +
+                " from TB_DEVICE t left join TB_DEVICEGROUP a on t.devgroupid=a.devgroupid ");
+        StringBuffer countsql = new StringBuffer("select count(*) " +
+                " from TB_DEVICE t left join TB_DEVICEGROUP a on t.devgroupid=a.devgroupid ");
+
+        if (!StringUtil.isEmpty(chirdGroupids)) {
+            sql.append(" where t.devgroupid in ("+ StringUtils.join(chirdGroupids.toArray(),",")+") ");
+            countsql.append(" where t.devgroupid in ("+ StringUtils.join(chirdGroupids.toArray(),",")+") ");
+
+        }
+        sql.append(" order by t.id ");
+        Query query = entityManager.createNativeQuery(sql.toString());
+        query.setFirstResult((searchBean.getPageNo() - 1) * searchBean.getPageSize());
+        query.setMaxResults(searchBean.getPageSize()); //分页显示
+        Query countQuery = entityManager.createNativeQuery(countsql.toString());
+        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(TDevice.class));
+        List<TDevice> list = query.getResultList();
+        BigInteger count = (BigInteger) countQuery.getSingleResult();
+        return new PageResult<>(count.longValue(),list);
+    }
+
 
 }
diff --git a/src/main/resources/templates/restaurant/devicegroup/index.html b/src/main/resources/templates/restaurant/devicegroup/index.html
index dcb9d31..775f629 100644
--- a/src/main/resources/templates/restaurant/devicegroup/index.html
+++ b/src/main/resources/templates/restaurant/devicegroup/index.html
@@ -51,7 +51,6 @@
         table.render({
             elem: '#devicegroup-table',
             url: '[[@{/devicegroup/listDevice}]]',
-            where:  {searchkey:0},
             page: true,
             cols: [
                 [
diff --git a/src/main/resources/templates/restaurant/devicemanage/form.html b/src/main/resources/templates/restaurant/devicemanage/form.html
index 09d53ba..41cf76a 100644
--- a/src/main/resources/templates/restaurant/devicemanage/form.html
+++ b/src/main/resources/templates/restaurant/devicemanage/form.html
@@ -1,6 +1,6 @@
 
 <form id="form" lay-filter="form" class="layui-form model-form">
-    <input name="id" id="id" type="hidden"/>
+    <input name="id" id="devicemanage-id" type="hidden"/>
     <div class="layui-form-item">
         <label class="layui-form-label"><span style="color: red">* </span>设备名称</label>
         <div class="layui-input-block">
diff --git a/src/main/resources/templates/restaurant/devicemanage/index.html b/src/main/resources/templates/restaurant/devicemanage/index.html
index 283b379..1bde305 100644
--- a/src/main/resources/templates/restaurant/devicemanage/index.html
+++ b/src/main/resources/templates/restaurant/devicemanage/index.html
@@ -25,13 +25,16 @@
         <table class="layui-table" id="devicemanage-table" lay-filter="devicemanage-table"></table>
     </div>
 </div>
-
+<input hidden th:value="${groupList}" id="grouplist">
 <script type="text/html" id="devicemanage-dev-tpl-state">
     <input type="checkbox" lay-filter="devicemanage-dev-tpl-state" value="{{d.id}}" lay-skin="switch" lay-text="正常|注销"
            {{d.state=='1'?'checked':''}} />
 </script>
 <script>
 
+    var rawlist=$("#grouplist").val();
+    var grouplist=JSON.parse(rawlist);
+
     layui.use(['form', 'table', 'layer', 'admin', 'element'], function () {
         let form = layui.form;
         let table = layui.table;
@@ -44,14 +47,26 @@
             elem: '#devicemanage-table',
             url: '[[@{/devicemanage/list}]]',
             page: true,
+            minWidth: 80,
             cols: [
                 [
                     {field: 'id', title: '终端编号', sort: true},
                     {field: 'devicename', title: '设备名称', width:200},
-                    {field: 'devphyid', sort: true, width: 200, title: '设备物理id'},
-                    {field: 'shopid', sort: true, width: 150, title: '商户id'},
-                    {field: 'factoryid', sort: true, width: 200, title: '设备厂商'},
-                    {field: 'state', title: '状态', sort: true, width: 100, templet: '#devicemanage-dev-tpl-state'},
+                    {field: 'devphyid', sort: true,  title: '设备物理id'},
+                    {field: 'shopid', sort: true,  title: '商户id'},
+                    {field: 'factoryid', sort: true, title: '设备厂商'},
+                    {
+                        field: 'groupid',
+                        sort: true,
+                        title: '设备组',
+                        templet: function (item) {
+                            if(item.devgroupid==0||item.devgroupid== null){
+                                return '无';
+                            }
+                            return grouplist[item.devgroupid];
+                        }
+                    },
+                    {field: 'state', title: '状态', sort: true,  templet: '#devicemanage-dev-tpl-state'},
                     {
                         field: 'id', align: 'center', title: '操作', fixed: 'right', templet: function (item) {
                             return ' <a class="layui-btn  layui-btn-xs" lay-event="devicemanage-edit"><i class="layui-icon layui-icon-edit"></i>修改</a> ';
@@ -76,7 +91,7 @@
 
         let showModel = function (data) {
             let title = data ? '修改设备信息' : '添加设备';
-            admin.putTempData('t_dev', data);
+            admin.putTempData('t_devm', data);
             admin.popupCenter({
                 title: title,
                 path: '[[@{/devicemanage/loadupdate}]]',
diff --git a/src/main/resources/templates/restaurant/discountrule/ruleform.html b/src/main/resources/templates/restaurant/discountrule/ruleform.html
index 236edb9..175f81c 100644
--- a/src/main/resources/templates/restaurant/discountrule/ruleform.html
+++ b/src/main/resources/templates/restaurant/discountrule/ruleform.html
@@ -8,7 +8,7 @@
     </div>
 
     <div class="layui-form-item">
-        <label class="layui-form-label">餐补名称</label>
+        <label class="layui-form-label"><span style="color: red">* </span>餐补名称</label>
         <div class="layui-input-block">
            <input type="text" class="layui-input" name="rulename" id="form-discountrule-rulename" maxlength="20" style="width: 90%;"
                   autocomplete="off" lay-verify="required|Rulename"/>
@@ -16,7 +16,7 @@
     </div>
 
     <div class="layui-form-item">
-        <label class="layui-form-label">可用时间段</label>
+        <label class="layui-form-label"><span style="color: red">* </span>可用时间段</label>
         <div class="layui-input-inline" style="width: 100px;">
             <input type="text" name="starttime" placeholder="9:00" id="form-discountrule-starttime" autocomplete="off" maxlength="5"
                    class="layui-input" lay-verify="required"/>
@@ -29,7 +29,7 @@
     </div>
 
     <div class="layui-form-item">
-        <label class="layui-form-label" id="form-discountrule-amount-text">固定金额(元)</label>
+        <label class="layui-form-label" id="form-discountrule-amount-text"><span style="color: red">* </span>固定金额(元)</label>
         <div class="layui-input-block">
             <input type="text" name="amount" id="form-discountrule-amount" maxlength="9" autocomplete="off" style="width: 90%;"
                    class="layui-input" lay-verify="required|Amount"/>
@@ -37,7 +37,7 @@
     </div>
 
     <div class="layui-form-item">
-        <label class="layui-form-label">可用次数/人</label>
+        <label class="layui-form-label"><span style="color: red">* </span>可用次数/人</label>
         <div class="layui-input-block">
             <input type="text" name="limitcnt" id="form-discountrule-limitcnt" maxlength="9" autocomplete="off" style="width: 90%;"
                    class="layui-input" lay-verify="required|number"/>
@@ -45,7 +45,7 @@
     </div>
 
     <div class="layui-form-item">
-        <label class="layui-form-label">餐补对象</label>
+        <label class="layui-form-label"><span style="color: red">* </span>餐补对象</label>
         <div class="layui-input-inline" style="width: auto;">
             <button type="button" class="layui-btn upoadfile-btn" >
                 <i class="layui-icon">&#xe67c;</i>上传名单