Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	boman-api/boman-domain/src/main/java/com/boman/domain/entity/StatisticReportPersonnel.java
#	boman-report/src/main/java/com/boman/report/service/impl/StatisticReportServiceImpl.java
Administrator 3 years ago
parent
commit
a1db4cbf9c
19 changed files with 1489 additions and 234 deletions
  1. 23 0
      boman-api/boman-domain/src/main/java/com/boman/domain/dto/StatisticReportDto.java
  2. 124 22
      boman-api/boman-domain/src/main/java/com/boman/domain/entity/StatisticReport.java
  3. 76 3
      boman-api/boman-domain/src/main/java/com/boman/domain/entity/StatisticReportPersonnel.java
  4. 161 0
      boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/CollectUtils.java
  5. 18 4
      boman-report/src/main/java/com/boman/report/controller/StatisticReportController.java
  6. 30 0
      boman-report/src/main/java/com/boman/report/controller/StatisticReportPersonnelController.java
  7. 11 0
      boman-report/src/main/java/com/boman/report/mapper/StatisticReportMapper.java
  8. 8 0
      boman-report/src/main/java/com/boman/report/mapper/StatisticReportPersonnelMapper.java
  9. 10 0
      boman-report/src/main/java/com/boman/report/service/StatisticReportPersonnelService.java
  10. 22 1
      boman-report/src/main/java/com/boman/report/service/StatisticReportService.java
  11. 39 1
      boman-report/src/main/java/com/boman/report/service/impl/StatisticReportPersonnelImpl.java
  12. 81 0
      boman-report/src/main/java/com/boman/report/service/impl/StatisticReportServiceImpl.java
  13. 94 1
      boman-report/src/main/resources/mapper/StatisticReportMapper.xml
  14. 56 1
      boman-report/src/main/resources/mapper/StatisticReportPersonnelMapper.xml
  15. 68 0
      ruoyi-ui/src/api/system/tatementsetr.js
  16. BIN
      ruoyi-ui/src/assets/images/pic_zt_jxz.png
  17. 1 0
      ruoyi-ui/src/store/modules/user.js
  18. 0 1
      ruoyi-ui/src/views/system/issue/index.vue
  19. 667 200
      ruoyi-ui/src/views/system/tatementsetr/index.vue

+ 23 - 0
boman-api/boman-domain/src/main/java/com/boman/domain/dto/StatisticReportDto.java

@@ -0,0 +1,23 @@
+package com.boman.domain.dto;
+
+public class StatisticReportDto {
+    private String id;
+
+    private String name;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+}

+ 124 - 22
boman-api/boman-domain/src/main/java/com/boman/domain/entity/StatisticReport.java

@@ -1,27 +1,129 @@
 package com.boman.domain.entity;
 package com.boman.domain.entity;
 
 
-import lombok.Builder;
-import lombok.Data;
-
-@Data
-@Builder
-public class StatisticReport {
-
-  private Long id;
-  private String reportName;
-  private String reportId;
-  private String templateName;
-  private java.sql.Date startTime;
-  private java.sql.Date endTime;
-  private String reportStatus;
-  private String status;
-  private String repUploadFile;
-  private String remark;
-  private String createBy;
-  private java.sql.Timestamp createTime;
-  private String updateBy;
-  private java.sql.Timestamp updateTime;
-  private String isDel;
+import com.boman.domain.BaseEntity;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
 
 
+import java.sql.Date;
+import java.util.List;
 
 
+public class StatisticReport extends BaseEntity {
+
+    private Long id;
+    private String reportName;
+    private String reportId;
+    private String templateName;
+    private Date startTime;
+    private Date endTime;
+    private String sTime;
+    private String eTime;
+    private String reportStatus;
+    private String status;
+    private String repUploadFile;
+    private String isDel;
+    private List<StatisticReportPersonnel> personnels;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getReportName() {
+        return reportName;
+    }
+
+    public void setReportName(String reportName) {
+        this.reportName = reportName;
+    }
+
+    public String getReportId() {
+        return reportId;
+    }
+
+    public void setReportId(String reportId) {
+        this.reportId = reportId;
+    }
+
+    public String getTemplateName() {
+        return templateName;
+    }
+
+    public void setTemplateName(String templateName) {
+        this.templateName = templateName;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getReportStatus() {
+        return reportStatus;
+    }
+
+    public void setReportStatus(String reportStatus) {
+        this.reportStatus = reportStatus;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getRepUploadFile() {
+        return repUploadFile;
+    }
+
+    public void setRepUploadFile(String repUploadFile) {
+        this.repUploadFile = repUploadFile;
+    }
+
+    public List<StatisticReportPersonnel> getPersonnels() {
+        return personnels;
+    }
+
+    public void setPersonnels(List<StatisticReportPersonnel> personnels) {
+        this.personnels = personnels;
+    }
+
+    public String getIsDel() {
+        return isDel;
+    }
+
+    public void setIsDel(String isDel) {
+        this.isDel = isDel;
+    }
+
+    public String getsTime() {
+        return sTime;
+    }
+
+    public void setsTime(String sTime) {
+        this.sTime = sTime;
+    }
+
+    public String geteTime() {
+        return eTime;
+    }
+
+    public void seteTime(String eTime) {
+        this.eTime = eTime;
+    }
 }
 }

+ 76 - 3
boman-api/boman-domain/src/main/java/com/boman/domain/entity/StatisticReportPersonnel.java

@@ -2,12 +2,14 @@ package com.boman.domain.entity;
 
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.boman.domain.BaseEntity;
 import lombok.Builder;
 import lombok.Builder;
 import lombok.Data;
 import lombok.Data;
 
 
-@Data
-@Builder
-public class StatisticReportPersonnel {
+import java.util.Date;
+import java.util.List;
+
+public class StatisticReportPersonnel  extends BaseEntity {
 
 
   private Long id;
   private Long id;
   private String reportName;
   private String reportName;
@@ -24,4 +26,75 @@ public class StatisticReportPersonnel {
   private java.sql.Timestamp updateTime;
   private java.sql.Timestamp updateTime;
   private String uploadFile;
   private String uploadFile;
 
 
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public String getReportName() {
+    return reportName;
+  }
+
+  public void setReportName(String reportName) {
+    this.reportName = reportName;
+  }
+
+  public Long getStatisticId() {
+    return statisticId;
+  }
+
+  public void setStatisticId(Long statisticId) {
+    this.statisticId = statisticId;
+  }
+
+  public Long getDeptId() {
+    return deptId;
+  }
+
+  public void setDeptId(Long deptId) {
+    this.deptId = deptId;
+  }
+
+  public String getDeptName() {
+    return deptName;
+  }
+
+  public void setDeptName(String deptName) {
+    this.deptName = deptName;
+  }
+
+  public Long getUserId() {
+    return userId;
+  }
+
+  public void setUserId(Long userId) {
+    this.userId = userId;
+  }
+
+  public String getUserName() {
+    return userName;
+  }
+
+  public void setUserName(String userName) {
+    this.userName = userName;
+  }
+
+  public String getIsDel() {
+    return isDel;
+  }
+
+  public void setIsDel(String isDel) {
+    this.isDel = isDel;
+  }
+
+  public String getStatus() {
+    return status;
+  }
+
+  public void setStatus(String status) {
+    this.status = status;
+  }
 }
 }

+ 161 - 0
boman-common/boman-common-core/src/main/java/com/boman/common/core/utils/CollectUtils.java

@@ -0,0 +1,161 @@
+package com.boman.common.core.utils;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+/**
+ * 集合工具类
+ *
+ * @author z.h
+ */
+public final class CollectUtils {
+
+    public static <E> List<E> newArrayList() {
+        return new ArrayList<E>();
+    }
+
+    public static <E> List<E> newArrayList(int initialCapacity) {
+        return new ArrayList<E>(initialCapacity);
+    }
+
+    public static <E> List<E> newArrayList(Collection<? extends E> c) {
+        return new ArrayList<E>(c);
+    }
+
+    public static <E> List<E> newArrayList(E... values) {
+        List<E> list = new ArrayList<E>(values.length);
+        for (E e : values) {
+            list.add(e);
+        }
+        return list;
+    }
+
+    /**
+     * 将一个集合按照固定大小查分成若干个集合。
+     *
+     * @param list
+     * @param count
+     * @return
+     */
+    public static <T> List<List<T>> split(final List<T> list, final int count) {
+        List<List<T>> subIdLists = CollectUtils.newArrayList();
+        if (list.size() < count) {
+            subIdLists.add(list);
+        } else {
+            int i = 0;
+            while (i < list.size()) {
+                int end = i + count;
+                if (end > list.size()) {
+                    end = list.size();
+                }
+                subIdLists.add(list.subList(i, end));
+                i += count;
+            }
+        }
+        return subIdLists;
+    }
+
+    public static boolean isEmpty(Collection<?> coll) {
+        return (coll == null || coll.isEmpty());
+    }
+
+    public static boolean isNotEmpty(Collection<?> coll) {
+        return null != coll && !coll.isEmpty();
+    }
+
+    public static <K, V> Map<K, V> newHashMap() {
+        return new HashMap<K, V>();
+    }
+
+    public static <K, V> Map<K, V> newConcurrentHashMap() {
+        return new ConcurrentHashMap<K, V>();
+    }
+
+    public static <E> Queue<E> newConcurrentLinkedQueue() {
+        return new ConcurrentLinkedQueue<E>();
+    }
+
+    public static <K, V> Map<K, V> newHashMap(Map<? extends K, ? extends V> m) {
+        return new HashMap<K, V>(m);
+    }
+
+    public static <K, V> Map<K, V> newLinkedHashMap(Map<? extends K, ? extends V> m) {
+        return new LinkedHashMap<K, V>(m);
+    }
+
+    public static <K, V> Map<K, V> newLinkedHashMap(int size) {
+        return new LinkedHashMap<K, V>(size);
+    }
+
+    public static <E> Set<E> newHashSet() {
+        return new HashSet<E>();
+    }
+
+    public static <E> Set<E> newHashSet(E... values) {
+        Set<E> set = new HashSet<E>(values.length);
+        for (E e : values) {
+            set.add(e);
+        }
+        return set;
+    }
+
+    public static <E> Set<E> newHashSet(Collection<? extends E> c) {
+        return new HashSet<E>(c);
+    }
+
+    public static Map<String, String> toMap(String[]... wordMappings) {
+        Map<String, String> mappings = new HashMap<String, String>();
+        for (int i = 0; i < wordMappings.length; i++) {
+            String singular = wordMappings[i][0];
+            String plural = wordMappings[i][1];
+            mappings.put(singular, plural);
+        }
+        return mappings;
+    }
+    public static <T> List<T> intersection(List<T> first, List<T> second) {
+        List<T> list = CollectUtils.newArrayList();
+        Map<T, Integer> mapa = getCardinalityMap(first), mapb = getCardinalityMap(second);
+        Set<T> elts = new HashSet<T>(first);
+        elts.addAll(second);
+        for (T obj : elts)
+            for (int i = 0, m = Math.min(getFreq(obj, mapa), getFreq(obj, mapb)); i < m; i++)
+                list.add(obj);
+        return list;
+    }
+
+    public static <T> List<T> union(List<T> first, List<T> second) {
+        Map<T, Integer> mapa = getCardinalityMap(first), mapb = getCardinalityMap(second);
+        Set<T> elts = new HashSet<T>(first);
+        elts.addAll(second);
+        List<T> list = newArrayList();
+        for (T obj : elts)
+            for (int i = 0, m = Math.max(getFreq(obj, mapa), getFreq(obj, mapb)); i < m; i++)
+                list.add(obj);
+        return list;
+
+    }
+
+    public static <T> List<T> subtract(List<T> first, List<T> second) {
+        List<T> list = newArrayList(first);
+        for (T t : second)
+            list.remove(t);
+        return list;
+    }
+
+    public static <T> Map<T, Integer> getCardinalityMap(final List<T> coll) {
+        Map<T, Integer> count = newHashMap();
+        for (Iterator<T> it = coll.iterator(); it.hasNext();) {
+            T obj = it.next();
+            Integer c = (count.get(obj));
+            if (c == null) count.put(obj, Integer.valueOf(1));
+            else count.put(obj, new Integer(c.intValue() + 1));
+        }
+        return count;
+    }
+
+    private static final <T> int getFreq(final T obj, final Map<T, Integer> freqMap) {
+        Integer count = freqMap.get(obj);
+        return (count != null) ? count.intValue() : 0;
+    }
+}

+ 18 - 4
boman-report/src/main/java/com/boman/report/controller/StatisticReportController.java

@@ -1,28 +1,37 @@
 package com.boman.report.controller;
 package com.boman.report.controller;
 
 
 import com.boman.common.core.web.controller.BaseController;
 import com.boman.common.core.web.controller.BaseController;
+import com.boman.common.core.web.page.TableDataInfo;
 import com.boman.domain.dto.AjaxResult;
 import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.entity.StatisticReportPersonnel;
 import com.boman.report.service.StatisticReportService;
 import com.boman.report.service.StatisticReportService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PathVariable;
+import com.boman.domain.entity.StatisticReport;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 
 
+import java.util.List;
+
 @RestController
 @RestController
 @RequestMapping("/statistic/report")
 @RequestMapping("/statistic/report")
 public class StatisticReportController extends BaseController {
 public class StatisticReportController extends BaseController {
 
 
     @Autowired
     @Autowired
     private StatisticReportService statisticReportService;
     private StatisticReportService statisticReportService;
+    @Autowired
+    private StatisticReportService reportService;
+
     /**
     /**
      * 获取报表id集合
      * 获取报表id集合
      *
      *
      * @return
      * @return
      */
      */
     @RequestMapping("/datas")
     @RequestMapping("/datas")
-    public AjaxResult getReports() {
-        return AjaxResult.success();
+    public AjaxResult datas(@RequestBody StatisticReport report) {
+        return AjaxResult.success(reportService.datas(report));
     }
     }
 
 
     /**
     /**
@@ -30,10 +39,15 @@ public class StatisticReportController extends BaseController {
      * @return
      * @return
      */
      */
     @RequestMapping("/list")
     @RequestMapping("/list")
-    public AjaxResult list() {
+    public TableDataInfo list(@RequestBody StatisticReport report) {
         startPage();
         startPage();
+        List<StatisticReport> list = reportService.selectList(report);
+        return getDataTable(list);
+    }
 
 
-        return AjaxResult.success();
+    @RequestMapping("/saveOrUpdate")
+    public AjaxResult saveOrUpdate(@RequestBody StatisticReport report) {
+        return reportService.saveOrUpdate(report);
     }
     }
 
 
 
 

+ 30 - 0
boman-report/src/main/java/com/boman/report/controller/StatisticReportPersonnelController.java

@@ -0,0 +1,30 @@
+package com.boman.report.controller;
+
+import com.boman.common.core.web.controller.BaseController;
+import com.boman.common.core.web.page.TableDataInfo;
+import com.boman.domain.entity.StatisticReportPersonnel;
+import com.boman.report.service.StatisticReportPersonnelService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/statistic/reportPersonnel")
+public class StatisticReportPersonnelController extends BaseController {
+
+    @Autowired
+    private StatisticReportPersonnelService service;
+
+    /**
+     * 列表
+     * @return
+     */
+    @RequestMapping("/list")
+    public TableDataInfo list(@RequestBody StatisticReportPersonnel personnel) {
+        startPage();
+        List<StatisticReportPersonnel> list = service.selectList(personnel);
+        return getDataTable(list);
+    }
+
+}

+ 11 - 0
boman-report/src/main/java/com/boman/report/mapper/StatisticReportMapper.java

@@ -1,9 +1,13 @@
 package com.boman.report.mapper;
 package com.boman.report.mapper;
 
 
+import com.boman.domain.dto.StatisticReportDto;
+import com.boman.domain.entity.StatisticReport;
 import com.boman.domain.entity.StatisticReport;
 import com.boman.domain.entity.StatisticReport;
 import com.boman.domain.entity.vo.StatisticReportVo;
 import com.boman.domain.entity.vo.StatisticReportVo;
 import org.springframework.stereotype.Repository;
 import org.springframework.stereotype.Repository;
 
 
+import java.util.List;
+
 /**
 /**
  * @author shiqian
  * @author shiqian
  * @date 2021年08月24日 11:09
  * @date 2021年08月24日 11:09
@@ -11,6 +15,13 @@ import org.springframework.stereotype.Repository;
 @Repository
 @Repository
 public interface StatisticReportMapper {
 public interface StatisticReportMapper {
 
 
+    List<StatisticReportDto> selectReportInfo(String userName);
+
+    List<StatisticReport> selectList(StatisticReport report);
+
+    int insert(StatisticReport report);
+
+    int update(StatisticReport report);
     /**
     /**
      * 获取表报详情
      * 获取表报详情
      * @param id
      * @param id

+ 8 - 0
boman-report/src/main/java/com/boman/report/mapper/StatisticReportPersonnelMapper.java

@@ -11,5 +11,13 @@ import java.util.List;
  **/
  **/
 @Repository
 @Repository
 public interface StatisticReportPersonnelMapper {
 public interface StatisticReportPersonnelMapper {
+
+    int deleteByStatisticIds(List<Long> ids);
+
+    int insert(StatisticReportPersonnel personnel);
+
     List<StatisticReportPersonnel> selectByStatisticId(Long id);
     List<StatisticReportPersonnel> selectByStatisticId(Long id);
+
+    List<StatisticReportPersonnel> selectList(StatisticReportPersonnel personnel);
+
 }
 }

+ 10 - 0
boman-report/src/main/java/com/boman/report/service/StatisticReportPersonnelService.java

@@ -1,8 +1,18 @@
 package com.boman.report.service;
 package com.boman.report.service;
 
 
+import com.boman.domain.entity.StatisticReportPersonnel;
+
+import java.util.List;
+
 /**
 /**
  * @author shiqian
  * @author shiqian
  * @date 2021年08月24日 11:09
  * @date 2021年08月24日 11:09
  **/
  **/
 public interface StatisticReportPersonnelService {
 public interface StatisticReportPersonnelService {
+
+    int deleteByStatisticIds(List<Long> ids);
+
+    int insert(List<StatisticReportPersonnel> personnels);
+
+    List<StatisticReportPersonnel> selectList(StatisticReportPersonnel personnel);
 }
 }

+ 22 - 1
boman-report/src/main/java/com/boman/report/service/StatisticReportService.java

@@ -1,16 +1,37 @@
 package com.boman.report.service;
 package com.boman.report.service;
 
 
 import com.boman.domain.dto.AjaxResult;
 import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.dto.StatisticReportDto;
+import com.boman.domain.entity.StatisticReport;
+
+import java.util.List;
+import java.util.Map;
+
+import com.boman.domain.dto.AjaxResult;
+
+import com.boman.domain.dto.AjaxResult;
+import com.boman.domain.entity.StatisticReport;
+
+import java.util.List;
 
 
 /**
 /**
  * @author shiqian
  * @author shiqian
  * @date 2021年08月24日 11:10
  * @date 2021年08月24日 11:10
  **/
  **/
-public interface StatisticReportService{
+public interface StatisticReportService {
+
+    Map<String, Object> datas(StatisticReport report);
+
+    List<StatisticReport> selectList(StatisticReport report);
+
+    AjaxResult saveOrUpdate(StatisticReport report);
+
     /**
     /**
      * 获取表报详情
      * 获取表报详情
      * @param id
      * @param id
      * @return
      * @return
      */
      */
     AjaxResult getReportInfo (Long id);
     AjaxResult getReportInfo (Long id);
+   
 }
 }
+

+ 39 - 1
boman-report/src/main/java/com/boman/report/service/impl/StatisticReportPersonnelImpl.java

@@ -1,8 +1,17 @@
 package com.boman.report.service.impl;
 package com.boman.report.service.impl;
 
 
+import com.boman.common.core.utils.SecurityUtils;
+import com.boman.domain.entity.StatisticReportPersonnel;
+import com.boman.report.mapper.StatisticReportPersonnelMapper;
+import com.boman.report.service.StatisticReportPersonnelService;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
 
 
 import static com.boman.common.core.utils.obj.ObjectUtils.*;
 import static com.boman.common.core.utils.obj.ObjectUtils.*;
 
 
@@ -11,7 +20,36 @@ import static com.boman.common.core.utils.obj.ObjectUtils.*;
  * @date 2021年08月24日 11:11
  * @date 2021年08月24日 11:11
  **/
  **/
 @Service
 @Service
-public class StatisticReportPersonnelImpl {
+public class StatisticReportPersonnelImpl implements StatisticReportPersonnelService {
 
 
     private static final Logger LOGGER = LoggerFactory.getLogger(StatisticReportPersonnelImpl.class);
     private static final Logger LOGGER = LoggerFactory.getLogger(StatisticReportPersonnelImpl.class);
+
+    @Autowired
+    private StatisticReportPersonnelMapper personnelMapper;
+
+    @Override
+    @Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
+    public int deleteByStatisticIds(List<Long> ids) {
+        return personnelMapper.deleteByStatisticIds(ids);
+    }
+
+    @Override
+    @Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
+    public int insert(List<StatisticReportPersonnel> personnels) {
+        if(isEmpty(personnels)) {
+            return 0;
+        }
+        for(StatisticReportPersonnel personnel : personnels) {
+            personnelMapper.insert(personnel);
+        }
+        return personnels.size();
+    }
+
+    @Override
+    public List<StatisticReportPersonnel> selectList(StatisticReportPersonnel personnel) {
+        personnel.setUserName(SecurityUtils.getUsername());
+        return personnelMapper.selectList(personnel);
+    }
+
+
 }
 }

+ 81 - 0
boman-report/src/main/java/com/boman/report/service/impl/StatisticReportServiceImpl.java

@@ -13,13 +13,18 @@ import com.boman.report.mapper.StatisticReportMapper;
 import com.boman.report.mapper.StatisticReportPersonnelMapper;
 import com.boman.report.mapper.StatisticReportPersonnelMapper;
 import com.boman.report.service.StatisticReportService;
 import com.boman.report.service.StatisticReportService;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonObject;
+import com.boman.common.core.utils.SecurityUtils;
+import com.boman.report.service.StatisticReportPersonnelService;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
+import org.springframework.transaction.annotation.Transactional;
 
 
 import java.lang.ref.ReferenceQueue;
 import java.lang.ref.ReferenceQueue;
 import java.util.*;
 import java.util.*;
+
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 /**
 /**
@@ -30,6 +35,16 @@ import java.util.stream.Collectors;
 public class StatisticReportServiceImpl implements StatisticReportService {
 public class StatisticReportServiceImpl implements StatisticReportService {
 
 
     private static final Logger LOGGER = LoggerFactory.getLogger(ImportServiceImpl.class);
     private static final Logger LOGGER = LoggerFactory.getLogger(ImportServiceImpl.class);
+
+
+    public static final String INSERT =  "insert";
+
+    public static final String UPDATE =  "update";
+
+
+    @Autowired
+    private StatisticReportPersonnelService personnelService;
+
     @Autowired
     @Autowired
     private StatisticReportMapper statisticReportMapper;
     private StatisticReportMapper statisticReportMapper;
 
 
@@ -104,4 +119,70 @@ public class StatisticReportServiceImpl implements StatisticReportService {
         }
         }
         return AjaxResult.success(reportInfo);
         return AjaxResult.success(reportInfo);
     }
     }
+
+    @Override
+    public Map<String, Object> datas(StatisticReport report) {
+        Map<String, Object> result = new HashMap<>();
+        List<StatisticReportDto> reportDtos = statisticReportMapper.selectReportInfo(SecurityUtils.getUsername());
+        result.put("reports", reportDtos);
+        return result;
+    }
+
+    @Override
+    public List<StatisticReport> selectList(StatisticReport report) {
+        report.setCreateBy(SecurityUtils.getUsername());
+        return statisticReportMapper.selectList(report);
+    }
+
+    @Override
+    @Transactional(isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
+    public AjaxResult saveOrUpdate(StatisticReport report) {
+        try {
+            if(report.getId() != null) { // 修改
+                this.genReport(report, UPDATE);
+                // 先删除所有字表数据
+                personnelService.deleteByStatisticIds(CollectUtils.newArrayList(report.getId()));
+                // 保存报表数据
+                statisticReportMapper.update(report);
+            }else {//新增
+                genReport(report, INSERT);
+                statisticReportMapper.insert(report);
+            }
+            // 获取人员
+            this.genReportPersonal(report);
+            personnelService.insert(report.getPersonnels());
+        }catch (Exception e) {
+            LOGGER.info("新增错误,{}", e.getMessage());
+            return AjaxResult.error();
+        }
+        return AjaxResult.success();
+    }
+
+    private void genReport(StatisticReport report, String type) {
+        Date now = new Date();
+        if(type.equals(INSERT)) {
+            report.setCreateBy(SecurityUtils.getUsername());
+            report.setCreateTime(now);
+            report.setUpdateTime(now);
+        }else{
+            report.setUpdateBy(SecurityUtils.getUsername());
+            report.setUpdateTime(now);
+        }
+    }
+
+    private void genReportPersonal(StatisticReport report) {
+        Long statisticId = report.getId();
+        String reportName =  report.getReportName();
+        String userName = SecurityUtils.getUsername();
+        Date now = new Date();
+        List<StatisticReportPersonnel> personnels = report.getPersonnels();
+        for (StatisticReportPersonnel personnel : personnels) {
+            personnel.setStatisticId(statisticId);
+            personnel.setReportName(reportName);
+            personnel.setCreateBy(userName);
+            personnel.setCreateTime(now);
+            personnel.setUpdateBy(userName);
+            personnel.setUpdateTime(now);
+        }
+    }
 }
 }

+ 94 - 1
boman-report/src/main/resources/mapper/StatisticReportMapper.xml

@@ -31,4 +31,97 @@
         <include refid="selectStatisticReportVo"/>
         <include refid="selectStatisticReportVo"/>
         where id = #{id} and is_del = "N"
         where id = #{id} and is_del = "N"
     </select>
     </select>
-</mapper> 
+    <resultMap type="com.boman.domain.dto.StatisticReportDto" id="ReportDtoResult">
+        <id property="id" column="id"/>
+        <result property="name" column="name"/>
+    </resultMap>
+
+    <sql id="selectReportVo">
+        select * from statistic_report
+    </sql>
+
+    <select id="selectList" parameterType="com.boman.domain.entity.StatisticReport" resultMap="StatisticReportResult">
+        <include refid="selectReportVo"/>
+        <where>
+            <if test="id != null and id != ''">
+                AND id = #{id}
+            </if>
+            <if test="createBy != null and createBy != ''">
+                AND create_by = #{createBy}
+            </if>
+            <if test="reportName != null and reportName != ''">
+                AND lower(report_name) like lower(concat('%', #{reportName}, '%'))
+            </if>
+            <if test="sTime != null and sTime != ''">
+                AND date_format(start_time, '%Y-%m-%d') &lt;= #{sTime}
+            </if>
+            <if test="eTime != null and eTime != ''">
+                AND date_format(end_time, '%Y-%m-%d') &gt;= #{eTime}
+            </if>
+            <if test="status != null and status != ''">
+                AND status = #{status}
+            </if>
+        </where>
+        order by create_time DESC
+    </select>
+
+    <insert id="insert" parameterType="com.boman.domain.entity.StatisticReport" useGeneratedKeys="true" keyProperty="id">
+        insert into statistic_report
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="reportName != null and reportName != ''">report_name,</if>
+            <if test="reportId != null">report_id,</if>
+            <if test="templateName != null">template_name,</if>
+            <if test="startTime != null">start_time,</if>
+            <if test="endTime != null">end_time,</if>
+            <if test="reportStatus != null">report_status,</if>
+            <if test="status != null">status,</if>
+            <if test="repUploadFile != null and repUploadFile != ''">rep_upload_file,</if>
+            <if test="remark != null">remark,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="reportName != null and reportName != ''">#{reportName},</if>
+            <if test="reportId != null">#{reportId},</if>
+            <if test="templateName != null">#{templateName},</if>
+            <if test="startTime != null">#{startTime},</if>
+            <if test="endTime != null">#{endTime},</if>
+            <if test="reportStatus != null">#{reportStatus},</if>
+            <if test="status != null">#{status},</if>
+            <if test="repUploadFile != null and repUploadFile != ''">#{repUploadFile},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="isDel != null">#{isDel},</if>
+        </trim>
+    </insert>
+
+    <update id="update" parameterType="com.boman.domain.entity.StatisticReport">
+        update statistic_report
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="reportName != null and reportName != ''">report_name = #{reportName},</if>
+            <if test="reportId != null">report_id = #{reportId},</if>
+            <if test="templateName != null">template_name = #{template_name},</if>
+            <if test="startTime != null">start_time = #{startTime},</if>
+            <if test="endTime == null">end_time = #{endTime},</if>
+            <if test="reportStatus != null">report_status = #{reportStatus},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="repUploadFile != null">rep_upload_file = #{repUploadFile},</if>
+            <if test="remark != null">remark = #{remark},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="isDel != null">is_del = #{isDel},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <select id="selectReportInfo" resultMap="ReportDtoResult" parameterType="java.lang.String">
+        select id, name from  jimu_report where create_by = #{userName} order by create_by desc
+    </select>
+</mapper>

+ 56 - 1
boman-report/src/main/resources/mapper/StatisticReportPersonnelMapper.xml

@@ -21,6 +21,61 @@
         <result property="updateTime" column="update_time"/>
         <result property="updateTime" column="update_time"/>
     </resultMap>
     </resultMap>
 
 
+    <select id="selectList" parameterType="com.boman.domain.entity.StatisticReportPersonnel" resultMap="StatisticReportPersonnelResult">
+        SELECT r.* FROM  statistic_report_personnel p
+        JOIN statistic_report r on r.id = p.statistic_id AND r.is_del = 'N' and r.`status` = '2'
+        <where>
+            <if test="createBy != null and createBy != ''">
+                AND p.create_by = #{createBy}
+            </if>
+            <if test="reportName != null and reportName != ''">
+                AND lower(r.report_name) like lower(concat('%', #{reportName}, '%'))
+            </if>
+            <if test="userName != null and userName != ''">
+                AND p.user_name = #{userName}
+            </if>
+        </where>
+    </select>
+
+    <delete id="deleteByStatisticIds" parameterType="java.util.List">
+        delete from statistic_report_personnel where statistic_id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <insert id="insert" parameterType="com.boman.domain.entity.StatisticReportPersonnel">
+        insert into statistic_report_personnel
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="reportName != null and reportName != ''">report_name,</if>
+            <if test="statisticId != null">statistic_id,</if>
+            <if test="deptId != null">dept_id,</if>
+            <if test="deptName != null">dept_name,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="userName != null">user_name,</if>
+            <if test="isDel != null">is_del,</if>
+            <if test="status != null">status,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="reportName != null and reportName != ''">#{reportName},</if>
+            <if test="statisticId != null">#{statisticId},</if>
+            <if test="deptId != null">#{deptId},</if>
+            <if test="deptName != null">#{deptName},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="userName != null">#{userName},</if>
+            <if test="isDel != null">#{isDel},</if>
+            <if test="status != null">#{status},</if>
+            <if test="remark != null">#{remark},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+        </trim>
+    </insert>
     <sql id="selectStatisticReportPersonnelVo">
     <sql id="selectStatisticReportPersonnelVo">
         select id, report_name, statistic_id, dept_id, dept_name, user_id, user_name,upload_file, is_del, status, create_by, create_time, update_by, update_time
         select id, report_name, statistic_id, dept_id, dept_name, user_id, user_name,upload_file, is_del, status, create_by, create_time, update_by, update_time
         from statistic_report_personnel
         from statistic_report_personnel
@@ -30,4 +85,4 @@
         <include refid="selectStatisticReportPersonnelVo"/>
         <include refid="selectStatisticReportPersonnelVo"/>
         where statistic_id = #{id} and is_del = "N"
         where statistic_id = #{id} and is_del = "N"
     </select>
     </select>
-</mapper> 
+</mapper>

+ 68 - 0
ruoyi-ui/src/api/system/tatementsetr.js

@@ -0,0 +1,68 @@
+import request from '@/utils/request'
+
+// 查询部门列表
+export function tistDept(query) {
+  return request({
+    url: '/boman-report/statistic/report/datas',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询部门列表(排除节点)
+export function listDeptExcludeChild(id) {
+  return request({
+    url: '/system/dept/list/exclude/' + id,
+    method: 'get'
+  })
+}
+
+// 查询部门详细
+export function getDept(id) {
+  return request({
+    url: '/system/dept/' + id,
+    method: 'get'
+  })
+}
+
+// 查询部门下拉树结构
+export function treeselect() {
+  return request({
+    url: '/system/dept/treeselect',
+    method: 'get'
+  })
+}
+
+// 根据角色ID查询部门树结构
+export function roleDeptTreeselect(roleId) {
+  return request({
+    url: '/system/dept/roleDeptTreeselect/' + roleId,
+    method: 'get'
+  })
+}
+
+// 新增部门
+export function addDeptiu(data) {
+  return request({
+    url: '/boman-report/statistic/report/saveOrUpdate',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改部门
+export function updateDept(data) {
+  return request({
+    url: '/system/dept',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除部门
+export function delDept(id) {
+  return request({
+    url: '/system/dept/' + id,
+    method: 'delete'
+  })
+}

BIN
ruoyi-ui/src/assets/images/pic_zt_jxz.png


+ 1 - 0
ruoyi-ui/src/store/modules/user.js

@@ -46,6 +46,7 @@ const user = {
         login(username, password, code, uuid).then(res => {
         login(username, password, code, uuid).then(res => {
           let data = res.data
           let data = res.data
           setToken(data.access_token)
           setToken(data.access_token)
+		  localStorage.setItem('JmReport-Access-Token', data.access_token);
           commit('SET_TOKEN', data.access_token)
           commit('SET_TOKEN', data.access_token)
           setExpiresIn(data.expires_in)
           setExpiresIn(data.expires_in)
           commit('SET_EXPIRES_IN', data.expires_in)
           commit('SET_EXPIRES_IN', data.expires_in)

+ 0 - 1
ruoyi-ui/src/views/system/issue/index.vue

@@ -768,7 +768,6 @@ export default {
     // 人员选择
     // 人员选择
     changeren(){
     changeren(){
     this.modalShow = true
     this.modalShow = true
-
     },
     },
     // 上传文件
     // 上传文件
     handleChangert(file, fileList) {
     handleChangert(file, fileList) {

+ 667 - 200
ruoyi-ui/src/views/system/tatementsetr/index.vue

@@ -1,34 +1,17 @@
 <template>
 <template>
   <div class="app-container">
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="字典名称" prop="dictName">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
+      <el-form-item label="部门名称" prop="deptName">
         <el-input
         <el-input
-          v-model="queryParams.dictName"
-          placeholder="请输入字典名称"
+          v-model="queryParams.deptName"
+          placeholder="请输入部门名称"
           clearable
           clearable
           size="small"
           size="small"
-          style="width: 240px"
-          @keyup.enter.native="handleQuery"
-        />
-      </el-form-item>
-      <el-form-item label="字典类型" prop="dictType">
-        <el-input
-          v-model="queryParams.dictType"
-          placeholder="请输入字典类型"
-          clearable
-          size="small"
-          style="width: 240px"
           @keyup.enter.native="handleQuery"
           @keyup.enter.native="handleQuery"
         />
         />
       </el-form-item>
       </el-form-item>
       <el-form-item label="状态" prop="status">
       <el-form-item label="状态" prop="status">
-        <el-select
-          v-model="queryParams.status"
-          placeholder="字典状态"
-          clearable
-          size="small"
-          style="width: 240px"
-        >
+        <el-select v-model="queryParams.status" placeholder="部门状态" clearable size="small">
           <el-option
           <el-option
             v-for="dict in statusOptions"
             v-for="dict in statusOptions"
             :key="dict.dictValue"
             :key="dict.dictValue"
@@ -37,18 +20,6 @@
           />
           />
         </el-select>
         </el-select>
       </el-form-item>
       </el-form-item>
-      <el-form-item label="创建时间">
-        <el-date-picker
-          v-model="dateRange"
-          size="small"
-          style="width: 240px"
-          value-format="yyyy-MM-dd"
-          type="daterange"
-          range-separator="-"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期"
-        ></el-date-picker>
-      </el-form-item>
       <el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -63,68 +34,23 @@
           icon="el-icon-plus"
           icon="el-icon-plus"
           size="mini"
           size="mini"
           @click="handleAdd"
           @click="handleAdd"
-          v-hasPermi="['system:dict:add']"
+          v-hasPermi="['sys_dept:A']"
         >新增</el-button>
         >新增</el-button>
       </el-col>
       </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="success"
-          plain
-          icon="el-icon-edit"
-          size="mini"
-          :disabled="single"
-          @click="handleUpdate"
-          v-hasPermi="['system:dict:edit']"
-        >修改</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['system:dict:remove']"
-        >删除</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="warning"
-          plain
-          icon="el-icon-download"
-          size="mini"
-          @click="handleExport"
-          v-hasPermi="['system:dict:export']"
-        >导出</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-refresh"
-          size="mini"
-          @click="handleClearCache"
-          v-hasPermi="['system:dict:remove']"
-        >清理缓存</el-button>
-      </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
     </el-row>
 
 
-    <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="字典编号" align="center" prop="id" />
-      <el-table-column label="字典名称" align="center" prop="dictName" :show-overflow-tooltip="true" />
-      <el-table-column label="字典类型" align="center" :show-overflow-tooltip="true">
-        <template slot-scope="scope">
-          <router-link :to="'/dict/type/data/' + scope.row.id" class="link-type">
-            <span>{{ scope.row.dictType }}</span>
-          </router-link>
-        </template>
-      </el-table-column>
-      <el-table-column label="状态" align="center" prop="status" :formatter="statusFormat" />
-      <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
-      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+    <el-table
+      v-loading="loading"
+      :data="deptList"
+      row-key="id"
+      default-expand-all
+      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
+    >
+      <el-table-column prop="deptName" label="部门名称" width="260"></el-table-column>
+      <el-table-column prop="orderNum" label="排序" width="200"></el-table-column>
+      <el-table-column prop="status" label="状态" :formatter="statusFormat" width="100"></el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" width="200">
         <template slot-scope="scope">
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.createTime) }}</span>
           <span>{{ parseTime(scope.row.createTime) }}</span>
         </template>
         </template>
@@ -136,105 +62,253 @@
             type="text"
             type="text"
             icon="el-icon-edit"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:dict:edit']"
+            v-hasPermi="['sys_dept:M']"
           >修改</el-button>
           >修改</el-button>
           <el-button
           <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-plus"
+            @click="handleAdd(scope.row)"
+            v-hasPermi="['sys_dept:A']"
+          >新增</el-button>
+          <el-button
+            v-if="scope.row.id != 0"
             size="mini"
             size="mini"
             type="text"
             type="text"
             icon="el-icon-delete"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['system:dict:remove']"
+            v-hasPermi="['sys_dept:D']"
           >删除</el-button>
           >删除</el-button>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
     </el-table>
     </el-table>
 
 
-    <pagination
-      v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
-      @pagination="getList"
-    />
+    <!-- 添加或修改部门对话框 -->
+    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="900px" append-to-body >
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="报表名称:" prop="reportName">
+              <el-input v-model="form.reportName" placeholder="请输入报表名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="报表设计器:" prop="reportId">
+              <treeselect v-model="form.reportId" :options="deptOptionstwofr" :normalizer="normalizerghy" placeholder="选择报表设计器" />
+            </el-form-item>
+          </el-col>
 
 
-    <!-- 添加或修改参数配置对话框 -->
-    <el-dialog :close-on-click-modal="false" :title="title" :visible.sync="open" width="500px" append-to-body>
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="字典名称" prop="dictName">
-          <el-input v-model="form.dictName" placeholder="请输入字典名称" />
-        </el-form-item>
-        <el-form-item label="字典类型" prop="dictType">
-          <el-input v-model="form.dictType" placeholder="请输入字典类型" />
-        </el-form-item>
-        <el-form-item label="状态" prop="status">
-          <el-radio-group v-model="form.status">
-            <el-radio
-              v-for="dict in statusOptions"
-              :key="dict.dictValue"
-              :label="dict.dictValue"
-            >{{dict.dictLabel}}</el-radio>
-          </el-radio-group>
-        </el-form-item>
-        <el-form-item label="备注" prop="remark">
-          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
-        </el-form-item>
+          <el-col :span="24">
+            <el-form-item label="表格模板" prop="orderNum">
+              <el-upload
+               :disabled="false" class="upload-demo" :headers="{Authorization: 'Bearer ' + getToken()}"
+                  :action="process + '/boman-file/upload'" :on-change="handleChangert"
+                 :on-success="upImageFn" :on-error="err" :on-remove="reseImage" :file-list="configtwo" :on-preview="handlePictureCardPreview" :before-upload="befors" :multiple="false" >
+                <el-button size="small" type="primary">点击上传</el-button>
+                <div slot="tip" class="el-upload__tip" style="color: red; font-size: 14px;">只能上传xls/xlsx文件,且不超过50MB</div>
+              </el-upload>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="开始时间:" prop="startTime">
+              <el-date-picker
+                    v-model="form.startTime"
+                    type="date"
+                    placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="截止时间:" prop="phone">
+              <el-date-picker
+                    v-model="form.endTime"
+                    type="date"
+                    placeholder="选择日期">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="参与人员:" prop="email">
+               <!-- <treeselect v-model="form.parentId" :options="deptOptions" :normalizer="normalizer" placeholder="选择报表设计器" /> -->
+              <el-input v-model="messageReun"  :disabled="true"  >
+                  <el-button style="padding: 9px 15px; font-size: 12px; border-radius: 3px;" size="small" type="primary" slot="prepend" @click="changeren">选择人员</el-button>
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="注意事项:">
+              <el-input   type="textarea"
+  :rows="2" v-model="form.remark" placeholder="请输入注意事项" style="width: 100%;" />
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
       </el-form>
       <div slot="footer" class="dialog-footer">
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
         <el-button type="primary" @click="submitForm">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
         <el-button @click="cancel">取 消</el-button>
       </div>
       </div>
     </el-dialog>
     </el-dialog>
+    <!-- 分配角色数据权限对话框 -->
+    <el-dialog   :close-on-click-modal="false" title="选择人员" :visible.sync="modalShow" width="980px" append-to-body>
+      <!-- <Flowshoe  :instanceId="instanceId"></Flowshoe> -->
+      <div class="tab_bott">
+        <div class="tabBot_oje">
+          <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick">
+            <!-- :setCheckedKeys='setCheckedKeys' :getCheckedKeys = "getCheckedKeys" -->
+            <el-tab-pane label="按部门" name="first">
+              <div class="head-container">
+                <el-input
+                  v-model="deptName"
+                  placeholder="请输入部门名称"
+                  clearable
+                  size="small"
+                  prefix-icon="el-icon-search"
+                  style="margin-bottom: 20px"
+                />
+              </div>
+              <div class="head-container">
+                <el-tree
+                  :data="deptOptions"
+                  :expand-on-click-node="false"
+                  :props="defaultProps"
+                  :filter-node-method="filterNode"
+                  ref="tree"
+                  default-expand-all
+                  @node-click="handleNodeClick"
+                />
+              </div>
+            </el-tab-pane>
+            <el-tab-pane label="按角色" name="second" style="height: 400px;">
+               <treeselect v-model="form.parentId" :options="deptOptionstwo" :normalizer="normalizer" :flat="true" :maxHeight="150" @select="djieskle" placeholder="点击选择角色" />
+            </el-tab-pane>
+            <el-tab-pane label="按组" name="third" style="height: 400px;">
+             <treeselect  v-model="form.parentIdty" :options="deptOptionsthre" :normalizer="normalizerty" :flat="true" @select="djieskletwo" :maxHeight="350" placeholder="点击选择组" />
+            </el-tab-pane>
+          </el-tabs>
+        </div>
+        <div class="tabBot_two">
+          <el-card class="box-card box-cardtt" shadow="always">
+              <div slot="header" class="clearfix">
+                <span>人员</span>
+               <el-button style=" float: right;  padding: 3px 10px;" type="danger" plain @click="eledelte">删除</el-button>
+               <el-button style=" float: right; padding: 3px 10px;margin-right: 20px;" type="primary" plain @click="quande">全选</el-button>
+              </div>
+              <ul class="infinite-list infinite-listty" v-infinite-scroll="load" style="overflow:auto">
+                  <li
+                    v-for="(item, index) in liseh"
+                    :class="[ quandet==true? 'infinite-list-itemty infinite-list-itemss' : item.id == idneese.id ? 'infinite-list-itemty infinite-list-itemss' : 'infinite-list-itemty']"
+                    :key="index"
+                    @click="reyantt(item)"
+                  >
+                    {{ item.nickName }}
+                  </li>
+                </ul>
+              </el-card>
+              <el-card class="box-card box-cardtt" shadow="always">
+                <div slot="header" class="clearfix">
+                  <span>已选择</span>
+                  <el-button style="float: right; padding: 3px 0" type="text" @click = 'determine'>确定</el-button>
+                </div>
+                <ul class="infinite-list infinite-listty" v-infinite-scroll="load" style="overflow:auto">
+                  <li v-for="item in lisehtwo" @click="lidele(item)" :key="item.id" class="infinite-list-item">
+                    {{ item.nickName }}
+                    <img src="../../../assets/images/dele.png" alt="" class="index_navTimeimg" />
+                  </li>
+                </ul>
+              </el-card>
+        </div>
+      </div>
+    </el-dialog>
   </div>
   </div>
 </template>
 </template>
 
 
 <script>
 <script>
-import { listType, getType, delType, addType, updateType, clearCache } from "@/api/system/dict/type";
-
+import { listDept, getDept, delDept,  updateDept, listDeptExcludeChild } from "@/api/system/dept";
+import { tistDept,addDeptiu } from "@/api/system/tatementsetr";
+import { listRoles,listIndex,   delRole, addRole,addbjectSave, updateRole, exportRole, dataScope, changeRoleStatus, buent,issdanelist,issdaneid,weiduhegw,addbjectSawen } from "@/api/system/isses";
+import { treeselect } from "@/api/system/dept";
+  import Treeselect from "@riophae/vue-treeselect";
+  import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import {
+    getToken
+  } from "@/utils/auth";
+  import { group , getRole, getPersonnel, getMembers,delRoleses } from '@/api/system/election';
+  import { listRole } from "@/api/system/role";
 export default {
 export default {
-  name: "Dict",
+  name: "Dept",
+  components: { Treeselect },
   data() {
   data() {
     return {
     return {
       // 遮罩层
       // 遮罩层
       loading: true,
       loading: true,
-      // 选中数组
-      ids: [],
-      // 非单个禁用
-      single: true,
-      // 非多个禁用
-      multiple: true,
       // 显示搜索条件
       // 显示搜索条件
       showSearch: true,
       showSearch: true,
-      // 总条数
-      total: 0,
-      // 字典表格数据
-      typeList: [],
+      // 表格树数据
+      deptList: [],
+      deptOptionstwofr:[],
+      // 部门树选项
+      deptOptions: [],
+      // 角色
+      deptOptionstwo:[],
+      deptOptionsthre:[],
+      configtwo: [],
       // 弹出层标题
       // 弹出层标题
       title: "",
       title: "",
+      process: process.env.VUE_APP_BASE_API,
       // 是否显示弹出层
       // 是否显示弹出层
       open: false,
       open: false,
       // 状态数据字典
       // 状态数据字典
       statusOptions: [],
       statusOptions: [],
-      // 日期范围
-      dateRange: [],
+      // 部门名称
+      deptName: undefined,
       // 查询参数
       // 查询参数
       queryParams: {
       queryParams: {
-        pageNum: 1,
-        pageSize: 10,
-        dictName: undefined,
-        dictType: undefined,
+        deptName: undefined,
         status: undefined
         status: undefined
       },
       },
+      queryParamsjuegt:{
+       pageNo:1,
+       pageSize:1000,
+       reportType:'datainfo'
+      },
       // 表单参数
       // 表单参数
-      form: {},
+      form: {
+        personnels:[{
+           deptId: 0,
+           deptName: "",
+           userId: 0,
+            userName: ""
+        }]
+      },
+      activeName:'first',
+      modalShow:false,
       // 表单校验
       // 表单校验
       rules: {
       rules: {
-        dictName: [
-          { required: true, message: "字典名称不能为空", trigger: "blur" }
+        reportName: [
+          { required: true, message: "报表名称不能为空", trigger: "blur" }
         ],
         ],
-        dictType: [
-          { required: true, message: "字典类型不能为空", trigger: "blur" }
-        ]
-      }
+
+      },
+       quandet:false,
+       lisehtwo:[
+       ],
+       liseh: [
+             ],
+      idneese: {},
+      messageReun:'',
+      frowtse:{
+
+      },
+      // 单位  名称
+      mpany:{
+        ompany:[],
+        name:[]
+        },
+        config:[],
+        defaultProps: {
+          children: "children",
+          label: "label"
+        },
     };
     };
   },
   },
   created() {
   created() {
@@ -242,17 +316,40 @@ export default {
     this.getDicts("sys_normal_disable").then(response => {
     this.getDicts("sys_normal_disable").then(response => {
       this.statusOptions = response.data;
       this.statusOptions = response.data;
     });
     });
+    this.getTreeselect()
   },
   },
   methods: {
   methods: {
-    /** 查询字典类型列表 */
+    /** 查询部门列表 */
     getList() {
     getList() {
       this.loading = true;
       this.loading = true;
-      listType(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
-          this.typeList = response.rows;
-          this.total = response.total;
-          this.loading = false;
-        }
-      );
+      tistDept().then(response => {
+        this.deptOptionstwofr = response.data.reports
+        this.loading = false;
+      });
+    },
+    /** 转换部门数据结构 */
+    /** 转换角色数据结构 */
+    normalizer(node) {
+      // if (node.children && !node.children.length) {
+      //   delete node.children;
+      // }
+      return {
+        id: node.id,
+        label: node.roleName,
+      };
+    },
+    /** 转换组数据结构 */
+    normalizerty(node) {
+      return {
+        id: node.id,
+        label: node.groupName,
+      };
+    },
+    normalizerghy(node){
+      return {
+        id: node.id,
+        label: node.name,
+      };
     },
     },
     // 字典状态字典翻译
     // 字典状态字典翻译
     statusFormat(row, column) {
     statusFormat(row, column) {
@@ -266,93 +363,463 @@ export default {
     // 表单重置
     // 表单重置
     reset() {
     reset() {
       this.form = {
       this.form = {
-        id: undefined,
-        dictName: undefined,
-        dictType: undefined,
-        status: "0",
-        remark: undefined
+        personnels:[{
+           deptId: 0,
+           deptName: "",
+           userId: 0,
+            userName: ""
+        }]
       };
       };
       this.resetForm("form");
       this.resetForm("form");
     },
     },
     /** 搜索按钮操作 */
     /** 搜索按钮操作 */
     handleQuery() {
     handleQuery() {
-      this.queryParams.pageNum = 1;
       this.getList();
       this.getList();
     },
     },
     /** 重置按钮操作 */
     /** 重置按钮操作 */
     resetQuery() {
     resetQuery() {
-      this.dateRange = [];
       this.resetForm("queryForm");
       this.resetForm("queryForm");
       this.handleQuery();
       this.handleQuery();
     },
     },
     /** 新增按钮操作 */
     /** 新增按钮操作 */
-    handleAdd() {
+    handleAdd(row) {
       this.reset();
       this.reset();
+      if (row != undefined) {
+        // this.form.parentId = row.id;
+      }
       this.open = true;
       this.open = true;
-      this.title = "添加字典类型";
-    },
-    // 多选框选中数据
-    handleSelectionChange(selection) {
-      this.ids = selection.map(item => item.id)
-      this.single = selection.length!=1
-      this.multiple = !selection.length
+      this.title = "添加部门";
+      listDept().then(response => {
+	        this.deptOptions = this.handleTree(response.data, "id");
+      });
     },
     },
     /** 修改按钮操作 */
     /** 修改按钮操作 */
     handleUpdate(row) {
     handleUpdate(row) {
       this.reset();
       this.reset();
-      const id = row.id || this.ids
-      getType(id).then(response => {
-        this.form = response.data;
+      getDept(row.id).then(response => {
+        // this.form = response.data;
         this.open = true;
         this.open = true;
-        this.title = "修改字典类型";
+        this.title = "修改部门";
+      });
+      listDeptExcludeChild(row.id).then(response => {
+	        this.deptOptions = this.handleTree(response.data, "id");
       });
       });
     },
     },
     /** 提交按钮 */
     /** 提交按钮 */
     submitForm: function() {
     submitForm: function() {
       this.$refs["form"].validate(valid => {
       this.$refs["form"].validate(valid => {
-        if (valid) {
-          if (this.form.id != undefined) {
-            updateType(this.form).then(response => {
-              this.msgSuccess("修改成功");
-              this.open = false;
-              this.getList();
-            });
-          } else {
-            addType(this.form).then(response => {
-              this.msgSuccess("新增成功");
-              this.open = false;
-              this.getList();
-            });
-          }
+       console.log(this.lisehtwo)
+      if(this.lisehtwo.length == 0){
+         this.msgSuccess("请选择分发人员");
+         return false
+      }
+      for(var i = 0 ; i < this.lisehtwo.length; i++){
+        this.form.personnels[i] = {deptId:0,deptName:'',userId:0,userName:''}
+        this.form.personnels[i].userId = this.lisehtwo[i].id
+        this.form.personnels[i].userName = this.lisehtwo[i].userName
+        this.form.personnels[i].deptId  = this.lisehtwo[i].deptId
+        if(this.lisehtwo[i].dept !== undefined && this.lisehtwo[i].dept !==null){
+          this.form.personnels[i].deptName = this.lisehtwo[i].dept.deptName
+          // this.form.personnels[i].deptId  = this.lisehtwo[i].dept.deptId
+        }else{
+          this.form.personnels[i].deptName = this.lisehtwo[i].deptName
+
         }
         }
+      }
+
+      console.log(this.form)
+          addDeptiu(this.form).then(response => {
+            this.msgSuccess("新增成功");
+            this.open = false;
+            this.getList();
+          });
+        // if (valid) {
+        //   if (this.form.id != undefined) {
+        //     updateDept(this.form).then(response => {
+        //       this.msgSuccess("修改成功");
+        //       this.open = false;
+        //       this.getList();
+        //     });
+        //   } else {
+        //     addDept(this.form).then(response => {
+        //       this.msgSuccess("新增成功");
+        //       this.open = false;
+        //       this.getList();
+        //     });
+        //   }
+        // }
       });
       });
     },
     },
     /** 删除按钮操作 */
     /** 删除按钮操作 */
     handleDelete(row) {
     handleDelete(row) {
-      const ids = row.id || this.ids;
-      this.$confirm('是否确认删除字典编号为"' + ids + '"的数据项?', "警告", {
+      this.$confirm('是否确认删除名称为"' + row.deptName + '"的数据项?', "警告", {
           confirmButtonText: "确定",
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           cancelButtonText: "取消",
           type: "warning"
           type: "warning"
         }).then(function() {
         }).then(function() {
-          return delType(ids);
+          return delDept(row.id);
         }).then(() => {
         }).then(() => {
           this.getList();
           this.getList();
           this.msgSuccess("删除成功");
           this.msgSuccess("删除成功");
         })
         })
     },
     },
-    /** 导出按钮操作 */
-    handleExport() {
-      this.download('system/dict/type/export', {
-        ...this.queryParams
-      }, `type_${new Date().getTime()}.xlsx`)
+    // 上传文件
+    handleChangert(file, fileList) {
+      // this.fileList = []
+      const jieg = []
+      jieg.push(fileList[fileList.length - 1])
+      console.log(jieg)
+      this.fileList = jieg.slice(-3);
     },
     },
-    /** 清理缓存按钮操作 */
-    handleClearCache() {
-      clearCache().then(response => {
-        this.msgSuccess("清理成功");
-      });
+    upImageFn(res, file) {
+      if(res.code !== 200){
+        this.msgSuccess('上传失败');
+        return false
+      }else{
+        this.msgSuccess('上传成功');
+        this.config= res.data
+        console.log(res.data)
+        console.log(res.data.name.substr(0,res.data.name.length-4))
+
+        // this.querjtgoe.message_upload = this.config
+        // console.log(this.querjtgoe.message_upload)
+        this.form.templateName = res.data.name
+        this.form.repUploadFile = JSON.stringify(this.config)
+        // this.querjtgoe.message_title = res.data.name.substr(0,res.data.name.length-4)
+        // this.querjtgoe.message_upload = JSON.stringify(this.querjtgoe.message_upload)
+      }
+      // querjtgoe.message_title
+      console.log(res)
+      // console.log(res.data.name.substr(-4))
+    },
+    err(){
+      this.msgSuccess("上传失败");
+     console.log(35)
+    },
+    reseImage(file, fileList) {
+      let urls = ""
+      this.configtwo = []
+      // if (file.response) {
+      //   urls = file.response.url
+      // } else {
+      //   urls = file.url
+      // }
+      // for (let i = this.configtwo.length - 1; i >= 0; i--) {
+      //   if (this.configtwo[i].url == urls) {
+      //     this.configtwo.splice(i, 1);
+      //   }
+      // }
+     console.log(this.configtwo)
+     // if(this.configtwo.length == 0){
+     //   this.querjtgoe.message_enclosure = undefined
+     // }else{
+     //   this.querjtgoe.message_enclosure = JSON.stringify(this.configtwo)
+     // }
+
+    },
+    getToken() {
+      return getToken()
+    },
+    // 上传前控制
+    befors(res, file){
+      console.log(res,file)
+      console.log(res.name.substr(0,res.name.length-4))
+      if(res.type !== 'application/vnd.ms-excel'  ){
+        if(res.type !== 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'){
+          this.msgSuccess('只能上传xls文件');
+          return false
+        }
+
+      }else{
+        return true
+      }
+      // return   true
+    },
+    // 图片预览
+    handlePictureCardPreview(file) {
+      console.log(file,87)
+      console.log(file.name.split('.'))
+      let hegs = file.name.split('.')
+      console.log(hegs[hegs.length - 1])
+      // if(hegs[hegs.length - 1] == 'pdf'){
+      //   this.shouewhu = true
+      // }else{
+      //   this.shouewhu = false
+      // }
+      this.dialogImageUrl = file.url;
+      this.dialogVisible = true;
+      this.imashow = true
+    },
+    // 人员选择
+    changeren(){
+    this.modalShow = true
+    },
+    handleClick(index){
+    if(index.index == 0){
+      this.getTreeselect()
+    }else if(index.index == 1){
+      this.getTreeselectjue()
+    }else if(index.index == 2){
+      this.getTreeselecu()
     }
     }
+    },
+    /** 查询部门下拉树结构 */
+    getTreeselect() {
+      treeselect().then(response => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 查询角色
+    getTreeselectjue() {
+      this.loading = true;
+      listRole(this.queryParams).then(response => {
+        this.deptOptionstwo = this.handleTree(response.rows, "id");
+        this.loading = false;
+      });
+    },
+    // 查询组
+    getTreeselecu() {
+      this.loading = true;
+      group(this.queryParams).then(response => {
+        this.deptOptionsthre = this.handleTree(response.data, "id");
+        this.loading = false;
+      });
+    },
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      console.log(data);
+      // this.queryParams.deptId = data.id;
+      this.staff(data.id);
+      this.quandet = false
+      // this.getList();
+    },
+    // 点击组/角色
+      djieskle(node, instanceId) {
+        this.personnel(node.id);
+        console.log(node, instanceId);
+      },
+      djieskletwo(node, instanceId) {
+        this.members(node.id);
+        this.elezu = node.id
+        console.log(node, instanceId);
+      },
+      // 点击全部删除
+      eledelte(){
+       this.lisehtwo = []
+      },
+      // 点击全选
+      quande(){
+        var dueg = []
+        dueg = (this.dhiuw)
+       this.quandet = true
+       var that =  this
+       // dueg.push(index)
+       // this.lisehtwo = dueg
+       // this.lisehtwo.push(index);
+       // this.lisehtwo = [...new Set(this.lisehtwo)];
+       // that.positions.map(train => {
+       //   that.new_Positions.push(train.trainId);
+       // });
+       // that.resultArr = []; //去重后的数组
+       var flag;
+       for (var i in dueg) {
+         flag = true;
+         for (var j in that.lisehtwo) {
+           if (that.lisehtwo[j].id == dueg[i].id) {
+             flag = false;
+             break;
+           }
+         }
+         if (flag) {
+           that.lisehtwo.push(dueg[i]);
+         }
+       }
+      },
+      // 点击添加
+      reyantt(index) {
+        var dueg = [];
+        this.idneese = index;
+        var that =  this
+        dueg.push(index)
+        // this.lisehtwo = dueg
+        // this.lisehtwo.push(index);
+        // this.lisehtwo = [...new Set(this.lisehtwo)];
+        // that.positions.map(train => {
+        //   that.new_Positions.push(train.trainId);
+        // });
+        // that.resultArr = []; //去重后的数组
+        var flag;
+        for (var i in dueg) {
+          flag = true;
+          for (var j in that.lisehtwo) {
+            if (that.lisehtwo[j].id == dueg[i].id) {
+              flag = false;
+              break;
+            }
+          }
+          if (flag) {
+            that.lisehtwo.push(dueg[i]);
+          }
+        }
+        // for(var i = 0 ; i <this.lisehtwo.length; i++ ){
+        //   if(this.lisehtwo[i].id == index.id){
+        //     this.lisehtwo.splice(i,1)
+        //   }
+        // }
+        // })
+      },
+      // 点击确定
+      determine(){
+        var eledete = []
+       this.lisehtwo.filter(route=>{
+         eledete.push(route.id)
+       })
+       eledete  = eledete.join(',')
+       console.log(this.lisehtwo)
+       this.messageReun = '已选择' + this.lisehtwo.length +'人'
+       // this.elezu
+       this.loading = true;
+       buent(this.lisehtwo).then(response => {
+         // this.lisehtwo = response.data;
+         // this.dhiuw = response.data
+         this.mpany.ompany = response.deptNameList
+         this.mpany.name = response.nikeNameList
+         console.log( this.mpany.ompany)
+         if(response.code == 200){
+           this.msgSuccess('操作成功');
+           this.modalShow = false
+         }
+         this.loading = false;
+       });
+      },
+      load(){
+
+      },
+      // 按照部门查询人员
+      staff(index) {
+        this.loading = true;
+        var that = this;
+        getRole(index).then(response => {
+          // this.deptOptionsthre = this.handleTree(response.data, "id");
+          // this.rtuer = true
+          this.liseh = []
+          this.liseh = response.data;
+          this.dhiuw = response.data
+          this.loading = false;
+        });
+      },
+      // 按照角色查询人员
+      personnel(index) {
+        this.loading = true;
+        getPersonnel(index).then(response => {
+          // this.deptOptionsthre = this.handleTree(response.data, "id");        this.liseh = response.data;
+          this.liseh = []
+          this.liseh = response.data;
+          this.dhiuw = response.data
+          this.loading = false;
+        });
+      },
+      // 按照组查询人员
+      members(index) {
+        this.loading = true;
+        getMembers(index).then(response => {
+          // this.deptOptionsthre = this.handleTree(response.data, "id");
+          // this.liseh = response.data;
+          // response.data
+          // this.lisehtwo.push(response.data)
+          this.liseh = []
+          this.liseh = response.data;
+          this.dhiuw = response.data
+          // this.dhiuw.filter(route=>{
+          //   this.lisehtwo.push(route)
+          // })
+          this.loading = false;
+        });
+      },
   }
   }
 };
 };
 </script>
 </script>
+<style lang="scss">
+  .infinite-list {
+    // height: 150px;
+    margin-bottom: 20px;
+    flex-wrap: wrap;
+    .infinite-list-item {
+      // flex:1!important;
+      display: flex;
+      // justify-content: space-between;
+      align-items: center;
+      text-align: center;
+      list-style: none;
+      height: 23px;
+      margin-left: 10px;
+      // line-height: 30px;
+    }
+    .infinite-list-itemss {
+      color: #1890ff;
+    }
+  }
+  .infinite-listty {
+    display: flex;
+    flex-wrap: wrap;
+    .infinite-list-itemty {
+      // flex:1;
+      display: flex;
+      // justify-content: space-between;
+      height: 23px;
+      line-height: 23px;
+      // text-align: center;
+      list-style: none;
+      margin-left: 10px;
+      // border-radius: 40px;
+      // border: 1px solid #eee;
+      // border-bottom: 1px solid #eee;
+    }
+
+  }
+  // 分发人员
+  .infinite-listopma{
+   width: 100%;
+   display: flex;
+   flex-wrap: wrap;
+   justify-content: flex-start;
+   align-items: center;
+   li{
+     list-style: none;
+     // width: 20%;
+     margin-left: 10px;
+     line-height: 23px;
+   }
+  }
+
+</style>
+<style lang="scss" scoped="">
+  .app-container{
+    padding: 0 80px !important;
+    padding-top: 20px !important;
+  }
+
+  .tab_bott {
+    display: flex;
+  }
+  .tabBot_oje {
+    width: 40%;
+  }
+  .tabBot_two {
+    width: 50%;
+    margin-left: 30px;
+  }
+  .box-cardtt{
+    margin-top: 30px;
+  }
+  .index_navTimeimg {
+    width: 10px;
+    height: 10px;
+    margin-left: 5px;
+  }
+</style>