소스 검색

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserInfoServiceImpl.java
#	ruoyi-system/src/main/resources/mapper/system/UserInfoMapper.xml
Administrator 2 년 전
부모
커밋
c22adb045f
28개의 변경된 파일3466개의 추가작업 그리고 216개의 파일을 삭제
  1. 11 1
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/info/UserInfoController.java
  2. 6 5
      ruoyi-admin/src/main/resources/application-prod.yml
  3. 36 0
      ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java
  4. 13 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/UserInfo.java
  5. 322 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/UserInfoOne.java
  6. 12 0
      ruoyi-system/src/main/java/com/ruoyi/system/domain/UserNucleicTime.java
  7. 2 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserInfoMapper.java
  8. 61 0
      ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserInfoOneMapper.java
  9. 3 0
      ruoyi-system/src/main/java/com/ruoyi/system/service/IUserInfoService.java
  10. 115 2
      ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserInfoServiceImpl.java
  11. 81 1
      ruoyi-system/src/main/resources/mapper/system/UserInfoMapper.xml
  12. 172 0
      ruoyi-system/src/main/resources/mapper/system/UserInfoOneMapper.xml
  13. 12 2
      ruoyi-ui/src/api/index.js
  14. 53 0
      ruoyi-ui/src/api/system/batch.js
  15. 9 0
      ruoyi-ui/src/api/system/info.js
  16. 7 0
      ruoyi-ui/src/router/index.js
  17. 5 0
      ruoyi-ui/src/settings.js
  18. 1 1
      ruoyi-ui/src/utils/request.js
  19. 3 5
      ruoyi-ui/src/views/dashboard/chart/BarChart.vue
  20. 4 3
      ruoyi-ui/src/views/dashboard/chart/PieChart.vue
  21. 72 43
      ruoyi-ui/src/views/index.vue
  22. 543 0
      ruoyi-ui/src/views/key/batch/index.vue
  23. 532 0
      ruoyi-ui/src/views/key/batchs/index.vue
  24. 216 148
      ruoyi-ui/src/views/key/groups/index.vue
  25. 532 0
      ruoyi-ui/src/views/key/ryxx/index.vue
  26. 4 4
      ruoyi-ui/src/views/login.vue
  27. 1 1
      ruoyi-ui/src/views/register.vue
  28. 638 0
      ruoyi-ui/src/views/system/user/yue/index.vue

+ 11 - 1
ruoyi-admin/src/main/java/com/ruoyi/web/controller/info/UserInfoController.java

@@ -7,6 +7,7 @@ import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.domain.UserInfo;
+import com.ruoyi.system.domain.UserInfoOne;
 import com.ruoyi.system.service.IUserInfoService;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -50,9 +51,18 @@ public class UserInfoController extends BaseController {
         return getDataTable(list);
     }
 
+    /**
+     * 单个人员信息对比查询
+     */
+    @GetMapping("/oneDateList")
+    public TableDataInfo oneDateList(UserInfoOne userInfoOne) throws Exception {
+        startPage();
+        List<UserInfoOne> list = userInfoService.oneDateList(userInfoOne);
+        return getDataTable(list);
+    }
 
     /**
-     * 查询导入人员信息列表
+     * 单个人员信息对比
      */
     @GetMapping("/oneDate")
     public AjaxResult oneDate(UserInfo userInfo) throws Exception {

+ 6 - 5
ruoyi-admin/src/main/resources/application-prod.yml

@@ -11,7 +11,7 @@ ruoyi:
     # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
     profile: /home/boman/xinyong
     #文件上传的激活前缀
-    pathMapping: http://47.99.82.249:6000/prod-api
+    pathMapping: http://192.168.3.102:6000/prod-api
     # 获取ip地址开关
     addressEnabled: false
     # 验证码类型 math 数组计算 char 字符验证
@@ -24,9 +24,10 @@ spring:
         druid:
             # 主库数据源
             master:
-                url: jdbc:mysql://127.0.0.1:3306/qianshan_nucleic_contrast?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+                url: jdbc:mysql://192.168.3.101:3306/qianshan_nucleic_contrast?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
                 username: root
-                password: zhaoshang@2018
+                #password: zhaoshang@2018
+                password: YeRq#zd%MQ
             # 从库数据源
             slave:
                 # 从数据源开关/默认关闭
@@ -76,13 +77,13 @@ spring:
     # redis 配置
     redis:
         # 地址
-        host: 127.0.0.1
+        host: 192.168.3.101
         # 端口,默认为6379
         port: 6379
         # 数据库索引
         database: 9
         # 密码
-        password: D3fQYAsw
+        password: 3r263Tr$
         # 连接超时时间
         timeout: 10s
         lettuce:

+ 36 - 0
ruoyi-common/src/main/java/com/ruoyi/common/utils/DateUtils.java

@@ -126,6 +126,42 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
         return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
     }
 
+
+    /**
+     * 计算两个时间差(小时)
+     * sendDate 结束时间
+     * snowDate 开始时间
+     *
+     */
+    public static Long getDateHour(String sendDate, String snowDate) {
+
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
+        try {
+            Date nowDate = simpleDateFormat.parse(snowDate);
+            Date endDate = simpleDateFormat.parse(sendDate);
+
+            long nd = 1000 * 24 * 60 * 60;
+            long nh = 1000 * 60 * 60;
+            long nm = 1000 * 60;
+            // long ns = 1000;
+            // 获得两个时间的毫秒时间差异
+            long diff = endDate.getTime() - nowDate.getTime();
+            // 计算差多少天
+            long day = diff / nd;
+            // 计算差多少小时
+            long hour = diff % nd / nh;
+
+            Long hours = day*24+hour;
+
+            return hours;
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+
+    }
+
+
     /**
      * 计算两个时间差
      */

+ 13 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/UserInfo.java

@@ -55,6 +55,10 @@ public class UserInfo extends BaseEntity
     @Excel(name = "核酸结果时间")
     private String nucleicResultsTime;
 
+    /** 核酸结果 */
+    @Excel(name = "核酸结果")
+    private String nucleicResults;
+
     /** 职业类别 */
     @Excel(name = "职业类别")
     private String jobStyle;
@@ -88,6 +92,10 @@ public class UserInfo extends BaseEntity
     @Excel(name = "比对结束时间")
     private String endTime;
 
+    public String getNucleicResults() {
+        return nucleicResults;
+    }
+
     public String getDetectionResult() {
         return detectionResult;
     }
@@ -265,6 +273,10 @@ public class UserInfo extends BaseEntity
         this.detectionProgress = detectionProgress;
     }
 
+    public void setNucleicResults(String nucleicResults) {
+        this.nucleicResults = nucleicResults;
+    }
+
     @Override
     public String toString() {
         return "UserInfo{" +
@@ -279,6 +291,7 @@ public class UserInfo extends BaseEntity
                 ", collectPlace='" + collectPlace + '\'' +
                 ", nucleicCollectTime='" + nucleicCollectTime + '\'' +
                 ", nucleicResultsTime='" + nucleicResultsTime + '\'' +
+                ", nucleicResults='" + nucleicResults + '\'' +
                 ", jobStyle='" + jobStyle + '\'' +
                 ", focusCrowdStyle='" + focusCrowdStyle + '\'' +
                 ", detectionFrequency='" + detectionFrequency + '\'' +

+ 322 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/UserInfoOne.java

@@ -0,0 +1,322 @@
+package com.ruoyi.system.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 导入人员信息对象 user_info_one
+ * 
+ * @author ruoyi
+ * @date 2022-08-30
+ */
+public class UserInfoOne extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    private Long id;
+
+    /** $column.columnComment */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private String name;
+
+    /** 性别 */
+    @Excel(name = "性别")
+    private String gender;
+
+    /** 年龄 */
+    @Excel(name = "年龄")
+    private Integer age;
+
+    /** 身份证号码 */
+    @Excel(name = "身份证号码")
+    private String idCard;
+
+    /** 联系号码 */
+    @Excel(name = "联系号码")
+    private String phoneNum;
+
+    /** 部门id */
+    @Excel(name = "部门id")
+    private String deptId;
+
+    /** 采集地点 */
+    @Excel(name = "采集地点")
+    private String collectPlace;
+
+    /** 核酸采集时间 */
+    @Excel(name = "核酸采集时间")
+    private String nucleicCollectTime;
+
+    /** 核酸结果时间 */
+    @Excel(name = "核酸结果时间")
+    private String nucleicResultsTime;
+
+    /** 采集结果 */
+    @Excel(name = "采集结果")
+    private String nucleicResults;
+
+    /** 职业类别 */
+    @Excel(name = "职业类别")
+    private String jobStyle;
+
+    /** 重点人群分类 */
+    @Excel(name = "重点人群分类")
+    private String focusCrowdStyle;
+
+    /** 检测频次(汉字拼接后) */
+    @Excel(name = "检测频次(汉字拼接后)")
+    private String detectionFrequency;
+
+    /** 检测频次(次数) */
+    @Excel(name = "检测频次", readConverterExp = "次=数")
+    private String detectionNumber;
+
+    /** 检测频次(时间范围) */
+    @Excel(name = "检测频次", readConverterExp = "时=间范围")
+    private String detectionScope;
+
+    /** 检测进度 */
+    @Excel(name = "检测进度")
+    private String detectionProgress;
+
+    /** 部门名称 */
+    @Excel(name = "部门名称")
+    private String deptName;
+
+    /** 比对开始时间 */
+    @Excel(name = "比对开始时间")
+    private String startTime;
+
+    /** 比对结束时间 */
+    @Excel(name = "比对结束时间")
+    private String endTime;
+
+    /** 比对结果 */
+    @Excel(name = "比对结果")
+    private String detectionResult;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+    public void setName(String name) 
+    {
+        this.name = name;
+    }
+
+    public String getName() 
+    {
+        return name;
+    }
+    public void setGender(String gender) 
+    {
+        this.gender = gender;
+    }
+
+    public String getGender() 
+    {
+        return gender;
+    }
+    public void setAge(Integer age) 
+    {
+        this.age = age;
+    }
+
+    public Integer getAge() 
+    {
+        return age;
+    }
+    public void setIdCard(String idCard) 
+    {
+        this.idCard = idCard;
+    }
+
+    public String getIdCard() 
+    {
+        return idCard;
+    }
+    public void setPhoneNum(String phoneNum) 
+    {
+        this.phoneNum = phoneNum;
+    }
+
+    public String getPhoneNum() 
+    {
+        return phoneNum;
+    }
+    public void setDeptId(String deptId) 
+    {
+        this.deptId = deptId;
+    }
+
+    public String getDeptId() 
+    {
+        return deptId;
+    }
+    public void setCollectPlace(String collectPlace) 
+    {
+        this.collectPlace = collectPlace;
+    }
+
+    public String getCollectPlace() 
+    {
+        return collectPlace;
+    }
+    public void setNucleicCollectTime(String nucleicCollectTime) 
+    {
+        this.nucleicCollectTime = nucleicCollectTime;
+    }
+
+    public String getNucleicCollectTime() 
+    {
+        return nucleicCollectTime;
+    }
+    public void setNucleicResultsTime(String nucleicResultsTime) 
+    {
+        this.nucleicResultsTime = nucleicResultsTime;
+    }
+
+    public String getNucleicResultsTime() 
+    {
+        return nucleicResultsTime;
+    }
+    public void setNucleicResults(String nucleicResults) 
+    {
+        this.nucleicResults = nucleicResults;
+    }
+
+    public String getNucleicResults() 
+    {
+        return nucleicResults;
+    }
+    public void setJobStyle(String jobStyle) 
+    {
+        this.jobStyle = jobStyle;
+    }
+
+    public String getJobStyle() 
+    {
+        return jobStyle;
+    }
+    public void setFocusCrowdStyle(String focusCrowdStyle) 
+    {
+        this.focusCrowdStyle = focusCrowdStyle;
+    }
+
+    public String getFocusCrowdStyle() 
+    {
+        return focusCrowdStyle;
+    }
+    public void setDetectionFrequency(String detectionFrequency) 
+    {
+        this.detectionFrequency = detectionFrequency;
+    }
+
+    public String getDetectionFrequency() 
+    {
+        return detectionFrequency;
+    }
+    public void setDetectionNumber(String detectionNumber) 
+    {
+        this.detectionNumber = detectionNumber;
+    }
+
+    public String getDetectionNumber() 
+    {
+        return detectionNumber;
+    }
+    public void setDetectionScope(String detectionScope) 
+    {
+        this.detectionScope = detectionScope;
+    }
+
+    public String getDetectionScope() 
+    {
+        return detectionScope;
+    }
+    public void setDetectionProgress(String detectionProgress) 
+    {
+        this.detectionProgress = detectionProgress;
+    }
+
+    public String getDetectionProgress() 
+    {
+        return detectionProgress;
+    }
+    public void setDeptName(String deptName) 
+    {
+        this.deptName = deptName;
+    }
+
+    public String getDeptName() 
+    {
+        return deptName;
+    }
+    public void setStartTime(String startTime) 
+    {
+        this.startTime = startTime;
+    }
+
+    public String getStartTime() 
+    {
+        return startTime;
+    }
+    public void setEndTime(String endTime) 
+    {
+        this.endTime = endTime;
+    }
+
+    public String getEndTime() 
+    {
+        return endTime;
+    }
+    public void setDetectionResult(String detectionResult) 
+    {
+        this.detectionResult = detectionResult;
+    }
+
+    public String getDetectionResult() 
+    {
+        return detectionResult;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("name", getName())
+            .append("gender", getGender())
+            .append("age", getAge())
+            .append("idCard", getIdCard())
+            .append("phoneNum", getPhoneNum())
+            .append("deptId", getDeptId())
+            .append("collectPlace", getCollectPlace())
+            .append("nucleicCollectTime", getNucleicCollectTime())
+            .append("nucleicResultsTime", getNucleicResultsTime())
+            .append("nucleicResults", getNucleicResults())
+            .append("jobStyle", getJobStyle())
+            .append("focusCrowdStyle", getFocusCrowdStyle())
+            .append("detectionFrequency", getDetectionFrequency())
+            .append("detectionNumber", getDetectionNumber())
+            .append("detectionScope", getDetectionScope())
+            .append("detectionProgress", getDetectionProgress())
+            .append("deptName", getDeptName())
+            .append("startTime", getStartTime())
+            .append("endTime", getEndTime())
+            .append("detectionResult", getDetectionResult())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 12 - 0
ruoyi-system/src/main/java/com/ruoyi/system/domain/UserNucleicTime.java

@@ -54,6 +54,13 @@ public class UserNucleicTime extends BaseEntity
     @Excel(name = "部门id")
     private String deptId;
 
+    /** 数据来源 */
+    private String dateSource;
+
+    public String getDateSource() {
+        return dateSource;
+    }
+
     public String getDeptId() {
         return deptId;
     }
@@ -157,6 +164,10 @@ public class UserNucleicTime extends BaseEntity
         this.phoneNum = phoneNum;
     }
 
+    public void setDateSource(String dateSource) {
+        this.dateSource = dateSource;
+    }
+
     @Override
     public String toString() {
         return "UserNucleicTime{" +
@@ -172,6 +183,7 @@ public class UserNucleicTime extends BaseEntity
                 ", name='" + name + '\'' +
                 ", phoneNum='" + phoneNum + '\'' +
                 ", deptId='" + deptId + '\'' +
+                ", dateSource='" + dateSource + '\'' +
                 '}';
     }
 }

+ 2 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserInfoMapper.java

@@ -65,4 +65,6 @@ public interface UserInfoMapper
     List<OdsQssHsjcxx> thirdNucleicAcid(@Param("startTime") String startTime, @Param("endTime")String endTime, @Param("idCardList")List<String> idCardList);
 
     void insertUserInfoList(@Param("userList")List<UserInfo> userList);
+
+    void insertUserInfoOne(UserInfo userInfo);
 }

+ 61 - 0
ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserInfoOneMapper.java

@@ -0,0 +1,61 @@
+package com.ruoyi.system.mapper;
+
+import java.util.List;
+import com.ruoyi.system.domain.UserInfoOne;
+
+/**
+ * 导入人员信息Mapper接口
+ * 
+ * @author ruoyi
+ * @date 2022-08-30
+ */
+public interface UserInfoOneMapper 
+{
+    /**
+     * 查询导入人员信息
+     * 
+     * @param id 导入人员信息主键
+     * @return 导入人员信息
+     */
+    public UserInfoOne selectUserInfoOneById(Long id);
+
+    /**
+     * 查询导入人员信息列表
+     * 
+     * @param userInfoOne 导入人员信息
+     * @return 导入人员信息集合
+     */
+    public List<UserInfoOne> selectUserInfoOneList(UserInfoOne userInfoOne);
+
+    /**
+     * 新增导入人员信息
+     * 
+     * @param userInfoOne 导入人员信息
+     * @return 结果
+     */
+    public int insertUserInfoOne(UserInfoOne userInfoOne);
+
+    /**
+     * 修改导入人员信息
+     * 
+     * @param userInfoOne 导入人员信息
+     * @return 结果
+     */
+    public int updateUserInfoOne(UserInfoOne userInfoOne);
+
+    /**
+     * 删除导入人员信息
+     * 
+     * @param id 导入人员信息主键
+     * @return 结果
+     */
+    public int deleteUserInfoOneById(Long id);
+
+    /**
+     * 批量删除导入人员信息
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteUserInfoOneByIds(Long[] ids);
+}

+ 3 - 0
ruoyi-system/src/main/java/com/ruoyi/system/service/IUserInfoService.java

@@ -5,6 +5,7 @@ import java.util.List;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.system.domain.UserInfo;
+import com.ruoyi.system.domain.UserInfoOne;
 
 /**
  * 导入人员信息Service接口
@@ -65,4 +66,6 @@ public interface IUserInfoService
     String importUser(List<UserInfo> userList, String jobStyle, String focusCrowdStyle, String detectionNumber, String detectionScope, String startTime, String endTime, SysUser user) throws Exception;
 
     AjaxResult oneDate(UserInfo userInfo) throws Exception;
+
+    List<UserInfoOne> oneDateList(UserInfoOne userInfoOne);
 }

+ 115 - 2
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserInfoServiceImpl.java

@@ -15,9 +15,11 @@ import com.ruoyi.common.utils.http.HttpClientUtils;
 import com.ruoyi.common.utils.http.HttpUtils;
 import com.ruoyi.system.domain.OdsQssHsjcxx;
 import com.ruoyi.system.domain.UserInfo;
+import com.ruoyi.system.domain.UserInfoOne;
 import com.ruoyi.system.domain.UserNucleicTime;
 import com.ruoyi.system.mapper.SysDictTypeMapper;
 import com.ruoyi.system.mapper.UserInfoMapper;
+import com.ruoyi.system.mapper.UserInfoOneMapper;
 import com.ruoyi.system.mapper.UserNucleicTimeMapper;
 import com.ruoyi.system.service.IUserInfoService;
 import com.ruoyi.system.service.OdsQssHsjcxxService;
@@ -48,6 +50,8 @@ public class UserInfoServiceImpl implements IUserInfoService {
     private OdsQssHsjcxxService qdsQssHsjcxxService;
     @Autowired
     private UserNucleicTimeMapper userNucleicTimeMapper;
+    @Autowired
+    private UserInfoOneMapper userInfoOneMapper;
 
     /**
      * 查询导入人员信息
@@ -138,6 +142,26 @@ public class UserInfoServiceImpl implements IUserInfoService {
     public String importUser(List<UserInfo> userList, String jobStyle, String focusCrowdStyle, String detectionNumber,
                              String detectionScope, String startTime, String endTime, SysUser user) throws Exception {
         long start1 = System.currentTimeMillis();
+
+        StringBuilder sb = new StringBuilder();
+        for (UserInfo userInfo : userList) {
+            if (userInfo == null) {
+                return "表格格式错误,请按照表格模板格式上传人员名单";
+            }
+            if (userInfo.getIdCard().indexOf('x') != -1) { //判断是不是有X
+                //如果有X,就改成统一的大写X
+                userInfo.setIdCard(userInfo.getIdCard().replace("x", "X"));
+            }
+            userInfo.setIdCard((userInfo.getIdCard()).replaceAll("\\s*|\r|\n|\t",""));
+            if (userInfo.getIdCard().length() != 18) {
+                sb.append(userInfo.getName()).append(",");
+            }
+        }
+
+        if (StringUtils.isNotEmpty(sb.toString())) {
+            return "操作失败,以下人员身份证格式错误【" + sb.toString() + "】";
+        }
+
         //计算开始时间结束时间相隔天数
         SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
         Date date1 = simpleDateFormat.parse(startTime);
@@ -158,6 +182,8 @@ public class UserInfoServiceImpl implements IUserInfoService {
         List<UserNucleicTime> UserNucleicTimeList = new ArrayList<>();
 
         int index = 0;
+        int count = 0;
+        String PhoneNum = "";
         for (UserInfo userInfo : userList) {
             userInfo.setDeptId(user.getDeptId().toString());
             //采集地点
@@ -166,6 +192,9 @@ public class UserInfoServiceImpl implements IUserInfoService {
             StringBuilder nucleicCollectTime = new StringBuilder();
             //核酸结果时间
             StringBuilder nucleicResultsTime = new StringBuilder();
+            //核酸结果
+            StringBuilder nucleicResults = new StringBuilder();
+
 
             userInfo.setJobStyle(jobStyle);
             userInfo.setFocusCrowdStyle(focusCrowdStyle);
@@ -180,13 +209,30 @@ public class UserInfoServiceImpl implements IUserInfoService {
             Boolean bl = true;
 
             index = 0;
+            count = 0;
             if (OdsQssHsjcxxMapSorted.size() > 0) {
                 //身份证号码
                 String idCard = userInfo.getIdCard();
                 List<OdsQssHsjcxx> odsQssHsjcxxes = OdsQssHsjcxxMapSorted.get(idCard);
                 if (odsQssHsjcxxes != null && odsQssHsjcxxes.size() > 0) {
+                    //String time = null;
+
                     for (OdsQssHsjcxx odsQssHsjcxx : odsQssHsjcxxes) {
 
+                        /*if(StringUtils.isEmpty(time)){
+                            time = odsQssHsjcxx.getCjsj();
+                            index++;
+                        }else{
+                            Long hours = DateUtils.getDateHour(odsQssHsjcxx.getCjsj(),time);
+                            if(hours>=24){
+                                index++;
+                            }
+                        }*/
+                        if(StringUtils.isEmpty(PhoneNum)){
+                            PhoneNum = odsQssHsjcxx.getSjhm();
+                        }
+
+
                         if (StringUtils.isNotEmpty(collectPlace.toString())) {
                             collectPlace.append("<br>");
                         }
@@ -201,6 +247,20 @@ public class UserInfoServiceImpl implements IUserInfoService {
                             nucleicResultsTime.append("<br>");
                         }
                         nucleicResultsTime.append(odsQssHsjcxx.getJgcjss());
+
+                        if (StringUtils.isNotEmpty(nucleicResults.toString())) {
+                            nucleicResults.append("<br>");
+                        }
+                        if(StringUtils.isEmpty(odsQssHsjcxx.getJcjg())){
+                            nucleicResults.append(odsQssHsjcxx.getJcjg());
+                        }else if("0".equals(odsQssHsjcxx.getJcjg()) || "negative".equals(odsQssHsjcxx.getJcjg())){
+                            nucleicResults.append("阴性");
+                        }else if("1".equals(odsQssHsjcxx.getJcjg()) || "positive".equals(odsQssHsjcxx.getJcjg())){
+                            nucleicResults.append("阳性");
+                        }else{
+                            nucleicResults.append(odsQssHsjcxx.getJcjg());
+                        }
+
                     }
                     index = odsQssHsjcxxes.size();
                 }
@@ -208,12 +268,13 @@ public class UserInfoServiceImpl implements IUserInfoService {
             if (index < Integer.parseInt(detectionNumber)) {
                 bl = false;
             }
-
+            userInfo.setPhoneNum(OdsQssHsjcxxList.get(0).getSjhm());
             userInfo.setCollectPlace(collectPlace.toString());
             userInfo.setNucleicCollectTime(nucleicCollectTime.toString());
             userInfo.setNucleicResultsTime(nucleicResultsTime.toString());
+            userInfo.setNucleicResults(nucleicResults.toString());
             userInfo.setDetectionProgress(index + "/" + detectionNumber);
-
+            PhoneNum = "";
 
             if (bl) {
                 userInfo.setDetectionResult("正常");
@@ -239,6 +300,7 @@ public class UserInfoServiceImpl implements IUserInfoService {
                         userNucleicTime.setPhoneNum(userInfo.getPhoneNum());
                         userNucleicTime.setDeptId(user.getDeptId().toString());
                         UserNucleicTimeList.add(userNucleicTime);
+                        userNucleicTime.setDateSource("批量导入");
                     }
                 }
             }
@@ -264,6 +326,7 @@ public class UserInfoServiceImpl implements IUserInfoService {
             return AjaxResult.error("请将参数填写完整后查询");
         }
 
+        SysUser user = SecurityUtils.getLoginUser().getUser();
 
         String startTime = userInfo.getStartTime();
         String endTime = userInfo.getEndTime();
@@ -298,6 +361,8 @@ public class UserInfoServiceImpl implements IUserInfoService {
         StringBuilder nucleicCollectTime = new StringBuilder();
         //核酸结果时间
         StringBuilder nucleicResultsTime = new StringBuilder();
+        //核酸结果
+        StringBuilder nucleicResults = new StringBuilder();
 
         //判断结果是否合格,默认合格
         Boolean bl = true;
@@ -323,15 +388,30 @@ public class UserInfoServiceImpl implements IUserInfoService {
                 }
                 nucleicResultsTime.append(odsQssHsjcxx.getJgcjss());
 
+                if (StringUtils.isNotEmpty(nucleicResults.toString())) {
+                    nucleicResults.append("<br>");
+                }
+                if(StringUtils.isEmpty(odsQssHsjcxx.getJcjg())){
+                    nucleicResults.append(odsQssHsjcxx.getJcjg());
+                }else if("0".equals(odsQssHsjcxx.getJcjg()) || "negative".equals(odsQssHsjcxx.getJcjg())){
+                    nucleicResults.append("阴性");
+                }else if("1".equals(odsQssHsjcxx.getJcjg()) || "positive".equals(odsQssHsjcxx.getJcjg())) {
+                    nucleicResults.append("阳性");
+                }else{
+                    nucleicResults.append(odsQssHsjcxx.getJcjg());
+                }
+
                 index++;
             }
         }
         if (index < Integer.parseInt(detectionNumber)) {
             bl = false;
         }
+        userInfo.setDeptId(user.getDeptId().toString());
         userInfo.setCollectPlace(collectPlace.toString());
         userInfo.setNucleicCollectTime(nucleicCollectTime.toString());
         userInfo.setNucleicResultsTime(nucleicResultsTime.toString());
+        userInfo.setNucleicResults(nucleicResults.toString());
         userInfo.setDetectionProgress(index + "/" + detectionNumber);
         if (bl) {
             userInfo.setDetectionResult("正常");
@@ -341,8 +421,41 @@ public class UserInfoServiceImpl implements IUserInfoService {
         List<UserInfo> userList = new ArrayList<>();
 
         userList.add(userInfo);
+
+        List<UserNucleicTime> UserNucleicTimeList = new ArrayList<>();
+        if (OdsQssHsjcxxList != null && OdsQssHsjcxxList.size() > 0) {
+            for (OdsQssHsjcxx odsQssHsjcxx : OdsQssHsjcxxList) {
+                if (userInfo.getIdCard().equals(odsQssHsjcxx.getSfzhm())) {
+                    UserNucleicTime userNucleicTime = new UserNucleicTime();
+                    userNucleicTime.setInfoId(userInfo.getId());
+                    userNucleicTime.setIdCard(odsQssHsjcxx.getSfzhm());
+                    userNucleicTime.setCollectPlace(odsQssHsjcxx.getJcdd());
+                    userNucleicTime.setNucleicCollectTime(odsQssHsjcxx.getCjsj());
+                    userNucleicTime.setNucleicResultsTime(odsQssHsjcxx.getJgcjss());
+                    userNucleicTime.setName(userInfo.getName());
+                    userNucleicTime.setPhoneNum(userInfo.getPhoneNum());
+                    userNucleicTime.setDeptId(user.getDeptId().toString());
+                    userNucleicTime.setDateSource("单人");
+                    UserNucleicTimeList.add(userNucleicTime);
+                }
+            }
+        }
+
+
+        //批量保存
+        userInfoMapper.insertUserInfoOne(userInfo);
+        userNucleicTimeMapper.insertUserNucleicTimeList(UserNucleicTimeList);
+
+
         return AjaxResult.success("操作成功", userList);
     }
 
+    @Override
+    public List<UserInfoOne> oneDateList(UserInfoOne userInfoOne) {
+        SysUser user = SecurityUtils.getLoginUser().getUser();
+        userInfoOne.setDeptId(String.valueOf(user.getDeptId()));
+        return userInfoOneMapper.selectUserInfoOneList(userInfoOne);
+    }
+
 
 }

+ 81 - 1
ruoyi-system/src/main/resources/mapper/system/UserInfoMapper.xml

@@ -14,6 +14,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="deptId"    column="dept_id"    />
         <result property="nucleicCollectTime"    column="nucleic_collect_time"    />
         <result property="nucleicResultsTime"    column="nucleic_results_time"    />
+        <result property="nucleicResults"    column="nucleic_results"    />
         <result property="jobStyle"    column="job_style"    />
         <result property="focusCrowdStyle"    column="focus_crowd_style"    />
         <result property="collectPlace"    column="collect_place"    />
@@ -35,7 +36,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </resultMap>
 
     <sql id="selectUserInfoVo">
-        select id, name, gender, age, id_card, phone_num, dept_id, collect_place, nucleic_collect_time, nucleic_results_time,detection_progress, job_style, focus_crowd_style, detection_frequency, detection_number, detection_scope, dept_name, start_time, end_time,detection_result, create_by, create_time, update_by, update_time, remark from user_info
+        select id, name, gender, age, id_card, phone_num, dept_id, collect_place, nucleic_collect_time, nucleic_results_time,nucleic_results,detection_progress, job_style, focus_crowd_style, detection_frequency, detection_number, detection_scope, dept_name, start_time, end_time,detection_result, create_by, create_time, update_by, update_time, remark from user_info
     </sql>
 
     <select id="selectUserInfoList" parameterType="UserInfo" resultMap="UserInfoResult">
@@ -118,6 +119,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                                collect_place,
                                nucleic_collect_time,
                                nucleic_results_time,
+                               nucleic_results,
                                job_style,
                                focus_crowd_style,
                                detection_frequency,
@@ -140,6 +142,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{user.collectPlace},
             #{user.nucleicCollectTime},
             #{user.nucleicResultsTime},
+            #{user.nucleicResults},
             #{user.jobStyle},
             #{user.focusCrowdStyle},
             #{user.detectionFrequency},
@@ -154,6 +157,57 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             sysdate(),sysdate())
         </foreach>
     </insert>
+    <insert id="insertUserInfoOne" parameterType="com.ruoyi.system.domain.UserInfo">
+        insert into user_info_one
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null">name,</if>
+            <if test="gender != null">gender,</if>
+            <if test="age != null">age,</if>
+            <if test="idCard != null">id_card,</if>
+            <if test="phoneNum != null">phone_num,</if>
+            <if test="deptId != null">dept_id,</if>
+            <if test="collectPlace != null">collect_place,</if>
+            <if test="nucleicCollectTime != null">nucleic_collect_time,</if>
+            <if test="nucleicResultsTime != null">nucleic_results_time,</if>
+            <if test="nucleicResults != null">focus_crowd_style,</if>
+            <if test="jobStyle != null">job_style,</if>
+            <if test="focusCrowdStyle != null">focus_crowd_style,</if>
+            <if test="detectionFrequency != null">detection_frequency,</if>
+            <if test="detectionNumber != null">detection_number,</if>
+            <if test="detectionScope != null">detection_scope,</if>
+            <if test="deptName != null">dept_name,</if>
+            <if test="startTime != null">start_time,</if>
+            <if test="endTime != null">end_time,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="remark != null">remark,</if>
+            create_time,update_time
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="name != null">#{name},</if>
+            <if test="gender != null">#{gender},</if>
+            <if test="age != null">#{age},</if>
+            <if test="idCard != null">#{idCard},</if>
+            <if test="phoneNum != null">#{phoneNum},</if>
+            <if test="deptId != null">#{deptId},</if>
+            <if test="collectPlace != null">#{collectPlace},</if>
+            <if test="nucleicCollectTime != null">#{nucleicCollectTime},</if>
+            <if test="nucleicResultsTime != null">#{nucleicResultsTime},</if>
+            <if test="nucleicResults != null">#{nucleicResults},</if>
+            <if test="jobStyle != null">#{jobStyle},</if>
+            <if test="focusCrowdStyle != null">#{focusCrowdStyle},</if>
+            <if test="detectionFrequency != null">#{detectionFrequency},</if>
+            <if test="detectionNumber != null">#{detectionNumber},</if>
+            <if test="detectionScope != null">#{detectionScope},</if>
+            <if test="deptName != null">#{deptName},</if>
+            <if test="startTime != null">#{startTime},</if>
+            <if test="endTime != null">#{endTime},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="remark != null">#{remark},</if>
+            sysdate(),sysdate()
+        </trim>
+    </insert>
 
     <update id="updateUserInfo" parameterType="UserInfo">
         update user_info
@@ -196,12 +250,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="thirdNucleicAcid" resultType="com.ruoyi.system.domain.OdsQssHsjcxx">
         select sfzhm,xm,sjhm,cjsj,jgcjss,jcdd,jcjg,sjly
+        from ( select sfzhm,xm,sjhm,cjsj,jgcjss,jcdd,jcjg,sjly
+        from ods_qss_hsjcxx_all
+        where cjsj > #{startTime}  and #{endTime}>=cjsj
         from ods_qss_hsjcxx
         where cjsj BETWEEN  #{startTime}  and #{endTime}
         and sfzhm in
         <foreach item="idCard" collection="idCardList" open="(" separator="," close=")">
             #{idCard}
         </foreach>
+
+        UNION
+
+        SELECT s.id_card_no as sfzhm,
+               s.user_name as xm,
+               s.user_phone as sjhm,
+               s.collect_datetime as cjsj,
+               testing_datetime as jgcjsj,
+               s.collect_site_name as jcdd,
+               sign_name as jcjg,
+               c.town as sjly
+        FROM `tb_whole_testing_sample_921`  s
+        LEFT JOIN tb_whole_testing_result_921 r on s.id = r.id
+        LEFT JOIN tb_whole_collect_site_city c on s.collect_site_code = c.id
+        where s.collect_datetime > #{startTime}  and #{endTime}>=s.collect_datetime
+        and s.id_card_no in
+        <foreach item="idCard" collection="idCardList" open="(" separator="," close=")">
+            #{idCard}
+        </foreach>
+        ) a
+        order by a.cjsj;
     </select>
 
+
+
 </mapper>

+ 172 - 0
ruoyi-system/src/main/resources/mapper/system/UserInfoOneMapper.xml

@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.system.mapper.UserInfoOneMapper">
+    
+    <resultMap type="UserInfoOne" id="UserInfoOneResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="gender"    column="gender"    />
+        <result property="age"    column="age"    />
+        <result property="idCard"    column="id_card"    />
+        <result property="phoneNum"    column="phone_num"    />
+        <result property="deptId"    column="dept_id"    />
+        <result property="collectPlace"    column="collect_place"    />
+        <result property="nucleicCollectTime"    column="nucleic_collect_time"    />
+        <result property="nucleicResultsTime"    column="nucleic_results_time"    />
+        <result property="nucleicResults"    column="nucleic_results"    />
+        <result property="jobStyle"    column="job_style"    />
+        <result property="focusCrowdStyle"    column="focus_crowd_style"    />
+        <result property="detectionFrequency"    column="detection_frequency"    />
+        <result property="detectionNumber"    column="detection_number"    />
+        <result property="detectionScope"    column="detection_scope"    />
+        <result property="detectionProgress"    column="detection_progress"    />
+        <result property="deptName"    column="dept_name"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="endTime"    column="end_time"    />
+        <result property="detectionResult"    column="detection_result"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="remark"    column="remark"    />
+    </resultMap>
+
+    <sql id="selectUserInfoOneVo">
+        select id, name, gender, age, id_card, phone_num, dept_id, collect_place, nucleic_collect_time, nucleic_results_time, nucleic_results, job_style, focus_crowd_style, detection_frequency, detection_number, detection_scope, detection_progress, dept_name, start_time, end_time, detection_result, create_by, create_time, update_by, update_time, remark from user_info_one
+    </sql>
+
+    <select id="selectUserInfoOneList" parameterType="UserInfoOne" resultMap="UserInfoOneResult">
+        <include refid="selectUserInfoOneVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="gender != null  and gender != ''"> and gender = #{gender}</if>
+            <if test="age != null "> and age = #{age}</if>
+            <if test="idCard != null  and idCard != ''"> and id_card = #{idCard}</if>
+            <if test="phoneNum != null  and phoneNum != ''"> and phone_num = #{phoneNum}</if>
+            <if test="deptId != null  and deptId != ''"> and dept_id = #{deptId}</if>
+            <if test="collectPlace != null  and collectPlace != ''"> and collect_place = #{collectPlace}</if>
+            <if test="nucleicCollectTime != null  and nucleicCollectTime != ''"> and nucleic_collect_time = #{nucleicCollectTime}</if>
+            <if test="nucleicResultsTime != null  and nucleicResultsTime != ''"> and nucleic_results_time = #{nucleicResultsTime}</if>
+            <if test="nucleicResults != null  and nucleicResults != ''"> and nucleic_results = #{nucleicResults}</if>
+            <if test="jobStyle != null  and jobStyle != ''"> and job_style = #{jobStyle}</if>
+            <if test="focusCrowdStyle != null  and focusCrowdStyle != ''"> and focus_crowd_style = #{focusCrowdStyle}</if>
+            <if test="detectionFrequency != null  and detectionFrequency != ''"> and detection_frequency = #{detectionFrequency}</if>
+            <if test="detectionNumber != null  and detectionNumber != ''"> and detection_number = #{detectionNumber}</if>
+            <if test="detectionScope != null  and detectionScope != ''"> and detection_scope = #{detectionScope}</if>
+            <if test="detectionProgress != null  and detectionProgress != ''"> and detection_progress = #{detectionProgress}</if>
+            <if test="deptName != null  and deptName != ''"> and dept_name like concat('%', #{deptName}, '%')</if>
+            <if test="startTime != null  and startTime != ''"> and start_time = #{startTime}</if>
+            <if test="endTime != null  and endTime != ''"> and end_time = #{endTime}</if>
+            <if test="detectionResult != null  and detectionResult != ''"> and detection_result = #{detectionResult}</if>
+        </where>
+        order by create_time desc
+    </select>
+    
+    <select id="selectUserInfoOneById" parameterType="Long" resultMap="UserInfoOneResult">
+        <include refid="selectUserInfoOneVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertUserInfoOne" parameterType="UserInfoOne" useGeneratedKeys="true" keyProperty="id">
+        insert into user_info_one
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null">name,</if>
+            <if test="gender != null">gender,</if>
+            <if test="age != null">age,</if>
+            <if test="idCard != null">id_card,</if>
+            <if test="phoneNum != null">phone_num,</if>
+            <if test="deptId != null">dept_id,</if>
+            <if test="collectPlace != null">collect_place,</if>
+            <if test="nucleicCollectTime != null">nucleic_collect_time,</if>
+            <if test="nucleicResultsTime != null">nucleic_results_time,</if>
+            <if test="nucleicResults != null">nucleic_results,</if>
+            <if test="jobStyle != null">job_style,</if>
+            <if test="focusCrowdStyle != null">focus_crowd_style,</if>
+            <if test="detectionFrequency != null">detection_frequency,</if>
+            <if test="detectionNumber != null">detection_number,</if>
+            <if test="detectionScope != null">detection_scope,</if>
+            <if test="detectionProgress != null">detection_progress,</if>
+            <if test="deptName != null">dept_name,</if>
+            <if test="startTime != null">start_time,</if>
+            <if test="endTime != null">end_time,</if>
+            <if test="detectionResult != null">detection_result,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="remark != null">remark,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="name != null">#{name},</if>
+            <if test="gender != null">#{gender},</if>
+            <if test="age != null">#{age},</if>
+            <if test="idCard != null">#{idCard},</if>
+            <if test="phoneNum != null">#{phoneNum},</if>
+            <if test="deptId != null">#{deptId},</if>
+            <if test="collectPlace != null">#{collectPlace},</if>
+            <if test="nucleicCollectTime != null">#{nucleicCollectTime},</if>
+            <if test="nucleicResultsTime != null">#{nucleicResultsTime},</if>
+            <if test="nucleicResults != null">#{nucleicResults},</if>
+            <if test="jobStyle != null">#{jobStyle},</if>
+            <if test="focusCrowdStyle != null">#{focusCrowdStyle},</if>
+            <if test="detectionFrequency != null">#{detectionFrequency},</if>
+            <if test="detectionNumber != null">#{detectionNumber},</if>
+            <if test="detectionScope != null">#{detectionScope},</if>
+            <if test="detectionProgress != null">#{detectionProgress},</if>
+            <if test="deptName != null">#{deptName},</if>
+            <if test="startTime != null">#{startTime},</if>
+            <if test="endTime != null">#{endTime},</if>
+            <if test="detectionResult != null">#{detectionResult},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="remark != null">#{remark},</if>
+         </trim>
+    </insert>
+
+    <update id="updateUserInfoOne" parameterType="UserInfoOne">
+        update user_info_one
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null">name = #{name},</if>
+            <if test="gender != null">gender = #{gender},</if>
+            <if test="age != null">age = #{age},</if>
+            <if test="idCard != null">id_card = #{idCard},</if>
+            <if test="phoneNum != null">phone_num = #{phoneNum},</if>
+            <if test="deptId != null">dept_id = #{deptId},</if>
+            <if test="collectPlace != null">collect_place = #{collectPlace},</if>
+            <if test="nucleicCollectTime != null">nucleic_collect_time = #{nucleicCollectTime},</if>
+            <if test="nucleicResultsTime != null">nucleic_results_time = #{nucleicResultsTime},</if>
+            <if test="nucleicResults != null">nucleic_results = #{nucleicResults},</if>
+            <if test="jobStyle != null">job_style = #{jobStyle},</if>
+            <if test="focusCrowdStyle != null">focus_crowd_style = #{focusCrowdStyle},</if>
+            <if test="detectionFrequency != null">detection_frequency = #{detectionFrequency},</if>
+            <if test="detectionNumber != null">detection_number = #{detectionNumber},</if>
+            <if test="detectionScope != null">detection_scope = #{detectionScope},</if>
+            <if test="detectionProgress != null">detection_progress = #{detectionProgress},</if>
+            <if test="deptName != null">dept_name = #{deptName},</if>
+            <if test="startTime != null">start_time = #{startTime},</if>
+            <if test="endTime != null">end_time = #{endTime},</if>
+            <if test="detectionResult != null">detection_result = #{detectionResult},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="remark != null">remark = #{remark},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteUserInfoOneById" parameterType="Long">
+        delete from user_info_one where id = #{id}
+    </delete>
+
+    <delete id="deleteUserInfoOneByIds" parameterType="String">
+        delete from user_info_one where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 12 - 2
ruoyi-ui/src/api/index.js

@@ -13,12 +13,22 @@ export function treeselect(query) {
 
 export function listTsde(query) {
   return request({
-    url: '/boman-web-core/index/stsByCzrkHomePage' ,
+    url: '/index/info' ,
     method: 'get'
   })
 }
 
 
+// 查询本周重点人群核酸检测
+export function listInfo(query) {
+  return request({
+    url: '/system/time/homeList',
+    method: 'get',
+    params: query
+  })
+}
+
+
 
 // 查询设备信息列表
 export function listDevice(query) {
@@ -59,7 +69,7 @@ export function listdbyh(query) {
 // 柱状图数据
 export function listzhuzh(query) {
   return request({
-    url: '/sts/echarts3 ',
+    url: '/index/info/jobStyle',
     method: 'get',
     params: query
   })

+ 53 - 0
ruoyi-ui/src/api/system/batch.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询导入人员信息列表
+export function listInfo(query) {
+  return request({
+    url: '/system/info/oneDate',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询总核酸次数
+export function listInfohs(query) {
+  return request({
+    url: '/system/info/oneDateList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询导入人员信息详细
+export function getInfo(id) {
+  return request({
+    url: '/system/info/' + id,
+    method: 'get'
+  })
+}
+
+// 新增导入人员信息
+export function addInfo(data) {
+  return request({
+    url: '/system/info',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改导入人员信息
+export function updateInfo(data) {
+  return request({
+    url: '/system/info',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除导入人员信息
+export function delInfo(id) {
+  return request({
+    url: '/system/info/' + id,
+    method: 'delete'
+  })
+}

+ 9 - 0
ruoyi-ui/src/api/system/info.js

@@ -9,6 +9,15 @@ export function listInfo(query) {
   })
 }
 
+// 查询总核酸次数
+export function listInfohs(query) {
+  return request({
+    url: '/index/info/heSuanCount',
+    method: 'get',
+    params: query
+  })
+}
+
 // 查询导入人员信息详细
 export function getInfo(id) {
   return request({

+ 7 - 0
ruoyi-ui/src/router/index.js

@@ -85,7 +85,14 @@ export const constantRoutes = [
         component: () => import('@/views/system/user/profile/index'),
         name: 'Profile',
         meta: { title: '个人中心', icon: 'user' }
+      },
+      {
+        path: 'yue',
+        component: () => import('@/views/system/user/yue/index'),
+        name: 'Yue',
+        meta: { title: '信息跳转', icon: 'user' }
       }
+      
     ]
   }
 ]

+ 5 - 0
ruoyi-ui/src/settings.js

@@ -1,5 +1,10 @@
 module.exports = {
     urls: `http://192.168.101.168:9001`,
+    // urls: `http://192.168.101.11:9001`,
+    // urls:`https://yqfk.qs163.cn`,
+
+    // urls: `http://192.168.3.102:6000`,
+
   /**
    * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
    */

+ 1 - 1
ruoyi-ui/src/utils/request.js

@@ -17,7 +17,7 @@ const service = axios.create({
   // axios中请求配置有baseURL选项,表示请求URL公共部分
   baseURL: process.env.VUE_APP_BASE_API,
   // 超时
-  timeout: 10000
+  timeout: 20000
 })
 
 // request拦截器

+ 3 - 5
ruoyi-ui/src/views/dashboard/chart/BarChart.vue

@@ -61,7 +61,7 @@ export default {
       this.setOptions(this.chartData)
     },
       setOptions({ y, x ,data } = {}) {
-        console.log(y,x,data,56)
+        // console.log(y,x,data,56)
        this.chart.setOption({
          tooltip: {
            trigger: 'axis',
@@ -95,9 +95,7 @@ export default {
          },
          xAxis: [{
            type: 'category',
-           data: ['进口冷链食品存储、 加工类企业一线人员', '市场监管系统一线 人员(直接接触)', '市场监管系统非一线人员', '入境人员隔离点工作专班人员', '境内隔离点专班工作人员', '阳性感染着、密切 接触者等现场流调、 转运的有关工作人员', '定点医疗机构的医 护、保洁、转运司 机等工作人员',
-             '普通医疗机构中发 热门诊的医护、保洁等工作人员','普通医疗机构除发 热门诊以外的工作人员','发热门诊患者','新住院患者、 陪护人员','医疗废弃物处理企 业的从事收运、处 理等工作人员','国际邮政快递包裹 运输、分拣装卸、 派送等二线工作人 员及快递服务点从 业人员','国内邮政快递包裹 运输、分拣装卸、 派送等一线工作人 员及快递服务点从 业人员',
-           ],
+           data: x,
            splitLine:{
              show:true
            },
@@ -151,7 +149,7 @@ export default {
          series: [
           {
 						type: "bar",
-						data: [70, 150, 110, 210, 200,70, 150, 110, 210, 200,70, 150, 110, 210, 200,],
+						data: y,
 						barWidth: '15',
 						itemStyle: {
               //这里设置柱形图圆角 [左上角,右上角,右下角,左下角]

+ 4 - 3
ruoyi-ui/src/views/dashboard/chart/PieChart.vue

@@ -23,7 +23,7 @@ export default {
       default: '200px'
     },
     chartData: {
-      type: Array,
+      type: Object,
       required: true
     }
   },
@@ -59,6 +59,7 @@ export default {
       this.setOptions(this.chartData)
     },
     setOptions(data) {
+      // console.log(data)
       this.chart.setOption({
         graphic:{
           type: 'text',
@@ -111,8 +112,8 @@ export default {
               },
               // data:data,
               data: [
-                { value: 6, name: '上周核酸人数' },
-                { value: 4, name: '本周核酸人数' }
+                { value: data.indexDataLastWeek, name: '上周核酸人数' },
+                { value: data.indexDataWeek, name: '本周核酸人数' }
 
               ]
             }

+ 72 - 43
ruoyi-ui/src/views/index.vue

@@ -14,15 +14,15 @@
             <el-col :xs="24" :sm="14" >
               <el-row type="flex" justify="space-between" :gutter="30">
                 <el-col>
-                  <div class="nchead ncheadl">
+                  <div class="nchead ncheadl" @click="nlshe">
                     <div class="ncheadtit">本月核酸总人数</div>
-                    <div class="ncheadtxt">13654</div>
+                    <div class="ncheadtxt">{{deviceIpOptions.indexDataMonth == null? '暂无数据' : deviceIpOptions.indexDataMonth}}</div>
                   </div>
                   </el-col>
                   <el-col>
-                  <div class="nchead ncheadc">
+                  <div class="nchead ncheadc"  @click="nlshefr">
                     <div class="ncheadtit">本周核酸总人数</div>
-                    <div class="ncheadtxt">4550</div>
+                    <div class="ncheadtxt">{{deviceIpOptions.indexDataWeek == null? '暂无数据' : deviceIpOptions.indexDataWeek}}</div>
                   </div>
                 </el-col>
               </el-row>
@@ -38,20 +38,20 @@
                 </div>
                 <div class="nche_chart">
                   <div class="nche_chartl">
-                    <pie-chart :chart-data="panelChartDatayuanh" />
+                    <pie-chart :chart-data="deviceIpOptions" />
                   </div>
                   <div class="nche_chartr">
                     <div class="nche_chartrr">
                       <div class="nche_chartra coca">本周核酸人数</div>
-                      <div class="nche_chartrb">4550</div>
+                      <div class="nche_chartrb">{{deviceIpOptions.indexDataWeek == null? '暂无数据' : deviceIpOptions.indexDataWeek}}</div>
                       <div class="nche_chartra">占比</div>
-                      <div class="nche_chartrb coa" style="margin-bottom: 0;">47%</div>
+                      <div class="nche_chartrb coa" style="margin-bottom: 0; font-size: 28px;">{{deviceIpOptions.resultWeek == null? '暂无数据' : deviceIpOptions.resultWeek}}</div>
                     </div>
                     <div class="nche_chartrr">
                       <div class="nche_chartra cocb">上周核酸人数</div>
-                      <div class="nche_chartrb">5137</div>
+                      <div class="nche_chartrb">{{deviceIpOptions.indexDataLastWeek == null? '暂无数据' : deviceIpOptions.indexDataLastWeek}}</div>
                       <div class="nche_chartra" >占比</div>
-                      <div class="nche_chartrb cob" style="margin-bottom: 0;">53%</div>
+                      <div class="nche_chartrb cob" style="margin-bottom: 0; font-size: 28px;">{{deviceIpOptions.resultLastWeek == null? '暂无数据' : deviceIpOptions.resultLastWeek}}</div>
                     </div>
                   </div>
                 </div>
@@ -64,25 +64,24 @@
     </el-row>
     <!-- 新的 -->
     <!-- 折线图数据 -->
-    <el-row :gutter="30"  style="margin-left: 0; margin-right: 0;">
+    <!-- <el-row :gutter="30"  style="margin-left: 0; margin-right: 0;">
       <el-col  style="padding-left: 0;padding-right: 0;">
         <div class="chart-wrapper dp_zhud" style="  padding: 30px; ">
           <div class="chart_tit">
             <div class="chart_titl">本周职业类别核酸情况统计</div>
             <div class="chart_titr">单位:人</div>
           </div>
-          <!-- <p class="dp_zhudtitle">本周职业类别核酸情况统计 </p> -->
           <line-chart :chart-data="newlineChartData" />
         </div>
       </el-col>
 
-    </el-row>
+    </el-row> -->
     <!-- 柱状图数据 -->
     <el-row :gutter="30"  style="margin-left: 0; margin-right: 0;">
       <el-col  style="padding-left: 0;padding-right: 0;">
         <div class="chart-wrapper dp_zhud" style="  padding: 30px; ">
          <div class="chart_tit">
-           <div class="chart_titl">本周重点人群分类核酸人数统计</div>
+           <div class="chart_titl">本周职业类别核酸情况统计</div>
            <div class="chart_titr">单位:人</div>
          </div>
           <bar-chart :chart-data="newlChartDatazhuzh" />
@@ -114,26 +113,33 @@
     <div class="tabsty" >
      <div class="chart_tit">
        <div class="chart_titl">本周重点人群核酸详情</div>
-       <div class="chart_titra">查看更多 >></div>
+       <!-- <div class="chart_titra">查看更多 >></div> -->
      </div>
-     <div class="chart_titrb">2022年08月08日 - 14日</div>
+     <div class="chart_titrb">当前时间:{{gettime}}</div>
       <!-- panelChartDatas.townDatas -->
       <!-- tableData -->
       <el-table v-loading="loading" :data="tableData"
-        style="width: 100%;"  stripe  height="280" :show-overflow-tooltip="true">
+        style="width: 100%;"  stripe  height="320" :show-overflow-tooltip="true">
         <el-table-column prop="name" label="姓名"  align="center"/>
-        <el-table-column prop="card" label="身份证号"  align="center" width="180"/>
+        <el-table-column prop="idCard" label="身份证号"  align="center" width="180"/>
         <!-- <el-table-column prop="zu" label="组"  align="center"/> -->
-        <el-table-column prop="rphone" label="联系电话(人口信息登记)"  align="center"/>
-        <el-table-column prop="hphone" label="联系电话(核酸检测登记)"  align="center"/>
-        <el-table-column prop="cjsj" label="采集时间"  align="center"/>
-        <el-table-column prop="cjdd" label="采集地点"  align="center"/>
-        <el-table-column prop="shsj" label="审核时间"  align="center"/>
+        <el-table-column prop="phoneNum" label="联系电话"  align="center" width="160"/>
+        <el-table-column label="重点人群分类" align="center" prop="focusCrowdStyle" width="130"/>
+        <el-table-column label="核酸采集时间" align="center" prop="nucleicCollectTime" width="157">
+          <template slot-scope="scope">
+            <span>{{ scope.row.nucleicCollectTime }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="核酸结果时间" align="center" prop="nucleicResultsTime" width="157">
+          <template slot-scope="scope">
+            <span>{{ scope.row.nucleicResultsTime}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="collectPlace" label="采集地点"  align="center"/>
 
 
       </el-table>
-<!--
-      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" /> -->
+      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
     </div>
 
     <!-- <panel-group @handleSetLineChartData="handleSetLineChartData" /> -->
@@ -157,7 +163,7 @@
 </template>
 
 <script>
-import {treeselect,listDevice, exportPost,listzhex,listleida,listdbyh, listzhuzh,listTsde} from "@/api/index";
+import {listInfo,treeselect,listDevice, exportPost,listzhex,listleida,listdbyh, listzhuzh,listTsde} from "@/api/index";
 import PanelGroup from './dashboard/PanelGroup';
 import PanelGroups from './dashboard/PanelGroups';
 import PanelGroupone from './dashboard/PanelGroupone';
@@ -212,8 +218,6 @@ export default {
     return {
       newlineChartData:{},
       newlChartDatazhuzh:{},
-
-
       lineChartData: {},
       dayList: 1, //判断天周月
       taye: 'newVisitis', //根据点击天周月变换,折线图数据变换
@@ -221,16 +225,7 @@ export default {
       panelChartDatas:{},
       panelChartDataleid:{},
       panelChartDatayuanh:[],
-      tableData: [
-         {name: '王天风', card: '123456789112345631', rphone: "14756055892", hphone: '14756055892', cjsj: '2022-08-08 10:23:56', cjdd: '中医院', shsj: '2022-08-08 19:23:56'},
-         {name: '李铎', card: '123456789112345632', rphone: "14756055892", hphone: '14756055892', cjsj: '2022-08-08 10:23:56', cjdd: '中医院', shsj: '2022-08-08 19:23:56'},
-         {name: '冯毅发', card: '123456789112345632', rphone: "14756055892", hphone: '14756055892', cjsj: '2022-08-08 10:23:56', cjdd: '中医院', shsj: '2022-08-08 19:23:56'},
-         {name: '刘婷婷', card: '123456789112345633', rphone: "14756055892", hphone: '14756055892', cjsj: '2022-08-08 10:23:56', cjdd: '中医院', shsj: '2022-08-08 19:23:56'},
-         {name: '尹菲菲', card: '123456789112345635', rphone: "14756055892", hphone: '14756055892', cjsj: '2022-08-08 10:23:56', cjdd: '中医院', shsj: '2022-08-08 19:23:56'},
-         {name: '马鑫', card: '123456789112345636', rphone: "14756055892", hphone: '14756055892', cjsj: '2022-08-08 10:23:56', cjdd: '中医院', shsj: '2022-08-08 19:23:56'},
-         {name: '吴自力', card: '123456789112345637', rphone: "14756055892", hphone: '14756055892', cjsj: '2022-08-08 10:23:56', cjdd: '中医院', shsj: '2022-08-08 19:23:56'},
-         {name: '林琳', card: '123456789112345638', rphone: "14756055892", hphone: '14756055892', cjsj: '2022-08-08 10:23:56', cjdd: '中医院', shsj: '2022-08-08 19:23:56'},
-      ], //表格数据
+      tableData: [], //表格数据
       // 总条数
       total: 10,
       queryParams: {
@@ -241,7 +236,10 @@ export default {
       loading: false,
       deviceIpOptions:{},
       panelChartDatazhuzh:{},
-      nhye:false
+      nhye:false,
+      yuhse:[],
+      infoList:[],
+      gettime:''
     };
   },
   computed: {
@@ -271,12 +269,23 @@ export default {
    // 底部圆环
    // this.dbyhList()
    // 柱状图
-   // this.zhuzhList()
+   this.zhuzhList()
 
    //户籍列表
-   // this.lisdtwe()
+   this.lisdtwe()
+   this.getList()
+   // 获取当前时间
+   this.getCurrentTime()
   },
   methods: {
+    getList() {
+      // this.loading = true;
+      listInfo(this.queryParams).then(response => {
+        this.tableData = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
     handleSetLineChartData(type) {
       this.lineChartData = lineChartData[type];
     },
@@ -317,7 +326,7 @@ export default {
     // 圆环数据
     yuanhaun(val){
       treeselect(val).then(response => {
-        this.deviceIpOptions = response.data;
+        // this.deviceIpOptions = response.data;
         this.panelChartDatas = this.deviceIpOptions
       });
     },
@@ -331,9 +340,10 @@ export default {
    },
    // 户籍列表
    lisdtwe(){
+     this.yuhse = []
       listTsde().then(response => {
         this.deviceIpOptions = response.data;
-        this.panelChartDatas = this.deviceIpOptions
+        // this.panelChartDatas = this.deviceIpOptions
       });
    },
    // 折线图数据
@@ -361,7 +371,7 @@ export default {
    // 柱状图数据
    zhuzhList(){
      listzhuzh().then(response => {
-       this.panelChartDatazhuzh = response.data;
+       this.newlChartDatazhuzh = response.data;
        // this.panelChartDatas = this.deviceIpOptions
      });
    },
@@ -397,6 +407,25 @@ export default {
    twjrde(){
      this.$router.push({path: "/business/ucleic"});
    },
+   nlshe(){
+     // this.$router.push({path: "/user/yue"});
+   },
+   nlshefr(){
+     // this.$router.push({path: "/user/yue"});
+   },
+    getCurrentTime() {
+           //获取当前时间并打印
+           var _this = this;
+           console.log(3)
+         let yy = new Date().getFullYear();
+         let mm = new Date().getMonth()+1;
+         let dd = new Date().getDate();
+         let hh = new Date().getHours();
+         let mf = new Date().getMinutes()<10 ? '0'+new Date().getMinutes() : new Date().getMinutes();
+         let ss = new Date().getSeconds()<10 ? '0'+new Date().getSeconds() : new Date().getSeconds();
+         _this.gettime = yy+'-'+mm+'-'+dd+' '+hh+':'+mf+':'+ss;
+         console.log(_this.gettime)
+       }
 
   }
 };

+ 543 - 0
ruoyi-ui/src/views/key/batch/index.vue

@@ -0,0 +1,543 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :rules="rules" size="small" :inline="true" v-show="showSearch" label-width="80px">
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="身份证号" prop="idCard">
+            <el-input
+              v-model="queryParams.idCard"
+              placeholder="请输入身份证号码"
+              style="width: 108%;"
+              clearable
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="开始时间" prop="startTime">
+            <el-date-picker clearable
+              v-model="queryParams.startTime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%;"
+              placeholder="请选择比对开始时间">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="结束时间" prop="endTime">
+            <el-date-picker clearable
+              v-model="queryParams.endTime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%;"
+              placeholder="请选择比对结束时间">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+
+
+        <!-- <el-col :span="8">
+          <el-form-item label="采集时间" prop="nucleicCollectTime">
+                      <el-date-picker clearable
+                        v-model="queryParams.nucleicCollectTime"
+                        type="datetime"
+                        value-format="yyyy-MM-dd HH:mm:ss"
+                        format="yyyy-MM-dd HH:mm:ss"
+                        style="width: 100%;"
+                        placeholder="请选择核酸采集时间">
+                      </el-date-picker>
+                    </el-form-item>
+
+        </el-col> -->
+        <!-- <el-col :span="8">
+          <el-form-item :label="'天' + '\u3000\u3000' + '数'" prop="detectionScope">
+            <el-input
+              v-model="queryParams.detectionScope"
+              placeholder="请输入天数"
+                min="0"
+               type="number"
+               @blur="nhksets"
+               style="width: 108%;"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+        </el-col> -->
+
+        <el-col :span="24">
+          <el-col :span="8">
+            <el-form-item :label="'次' + '\u3000\u3000' + '数'" prop="detectionNumber">
+             <el-input
+               v-model="queryParams.detectionNumber"
+               placeholder="请输入次数"
+               style="width: 114%;"
+                 min="0"
+                type="number"
+                @blur="nhkse"
+                @keyup.enter.native="handleQuery"
+             />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="8">
+             <el-form-item class="nkseydf">
+               <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuerys">搜索</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-form-item>
+          </el-col>
+        </el-col>
+
+
+
+
+
+
+      </el-row>
+
+
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <!-- <el-col :span="18">
+        <div style="color: #343434; font-size: 20px;">截至 <span style="color: #00b385;">{{gettime}}</span> 止   共计 <span style="color: #00b385;">{{nskeia}}</span> 次核酸</div>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="importTemplate"
+        >下载模板</el-button>
+      </el-col>
+     <el-col :span="1.5">
+       <el-button
+         type="info"
+         plain
+         icon="el-icon-upload2"
+         size="mini"
+         @click="handleImport"
+         v-hasPermi="['system:info:import']"
+       >导入</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:info:export']"
+        >导出</el-button>
+      </el-col> -->
+      <!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> -->
+    </el-row>
+
+    <el-table v-loading="loading" v-if="mjue" :data="infoList" @selection-change="handleSelectionChange">
+      <el-table-column :fixed="rigs" label="姓名" align="center" prop="name"  width="110"/>
+      <el-table-column :fixed="rigs" label="身份证号码" align="center" prop="idCard" width="180"/>
+      <el-table-column label="联系号码" align="center" prop="phoneNum" width="110"/>
+      <el-table-column label="核酸采集时间" align="center" prop="nucleicCollectTime" width="157">
+        <template slot-scope="scope">
+          <span v-html="scope.row.nucleicCollectTime"></span>
+        </template>
+      </el-table-column>
+      <el-table-column label="核酸结果时间" align="center" prop="nucleicResultsTime" width="157">
+        <template slot-scope="scope">
+          <span v-html="scope.row.nucleicResultsTime"></span>
+        </template>
+      </el-table-column>
+      <el-table-column  label="采集地点"  align="center" width="117">
+        <template slot-scope="scope">
+            <span v-html="scope.row.collectPlace"></span>
+          </template>
+      </el-table-column>
+      <el-table-column  label="采集结果"  align="center" width="117">
+        <template slot-scope="scope">
+            <span v-html="scope.row.nucleicResults"></span>
+          </template>
+      </el-table-column>
+      <!-- <el-table-column label="职业类别" align="center" prop="jobStyle" width="137"/> -->
+      <!-- <el-table-column label="重点人群分类" align="center" prop="focusCrowdStyle" width="130"/> -->
+      <el-table-column label="检测频次(次/天)" align="center" prop="detectionFrequency" width="115"/>
+      <el-table-column label="比对开始时间" align="center" prop="startTime" width="157">
+        <template slot-scope="scope">
+          <span>{{ scope.row.startTime}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="比对结束时间" align="center" prop="endTime" width="157">
+        <template slot-scope="scope">
+          <span>{{ scope.row.endTime}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column :fixed="rig" label="进度(已做核酸次数/频次)" align="center" prop="detectionProgress" width="165"/>
+      <el-table-column  :fixed="rig" label="是否异常" align="center" prop="detectionResult" >
+        <template slot-scope="scope">
+            <span :class="[scope.row.detectionResult == '正常' ? 'heade_codfr' : 'lndw']">{{ scope.row.detectionResult}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column :fixed="rig" label="操作" align="center" class-name="small-padding fixed-width">
+          <template slot-scope="scope">
+            <el-button
+              size="mini"
+              type="text"
+              icon="el-icon-delete"
+              @click="handleDelete(scope.row)"
+              v-hasPermi="['system:dept:remove']"
+            >删除</el-button>
+          </template>
+        </el-table-column>
+    </el-table>
+    <div v-if="!mjue" style="text-align: center;">正在加载数据......</div>
+
+
+  </div>
+</template>
+
+<script>
+import { listInfo, getInfo, delInfo, addInfo, updateInfo,listInfohs } from "@/api/system/batch";
+import { getToken } from "@/utils/auth";
+export default {
+  dicts: ['occupational_category', 'classification_population','whether_abnormal'],
+  name: "Info",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 导入人员信息表格数据
+      infoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        idCard: null,
+        phoneNum: null,
+        nucleicCollectTime: null,
+        nucleicResultsTime: null,
+        jobStyle: null,
+        focusCrowdStyle: null,
+        detectionFrequency: null,
+        startTime: null,
+        endTime: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        // startTime: [
+        //   { required: true, message: "开始时间不能为空", trigger: "blur" }
+        // ],
+        // endTime:[
+        //   { required: true, message: "结束时间不能为空", trigger: "blur" }
+        // ],
+        // detectionNumber:[
+        //   { required: true, message: "次数不能为空", trigger: "blur" }
+        // ],
+        // detectionScope:[
+        //   { required: true, message: "天数不能为空", trigger: "blur" }
+        // ],
+        // idCard:[
+        //   { required: true, message: "身份证不能为空", trigger: "blur" }
+        // ]
+      },
+      // 用户导入参数
+      upload: {
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+          detectionNumber:null,
+          detectionScope:null,
+          startTime: null,
+          endTime: null,
+          jobStyle:null,
+          focusCrowdStyle:null,
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/system/info/importData"
+      },
+      postOptions:[],
+      gettime:'',
+      nskeia:'',
+      mjue:true,
+      rig:'right',
+      rigs:'left',
+      tableMaxHeight:300,
+    };
+  },
+  created() {
+    // this.getList();
+    // this.getCurrentTime()
+    this.getLisths()
+    this.loading = false;
+    window.onresize = () => {
+                    this.changeTableMaxHeight()
+                  }
+                  this.changeTableMaxHeight()
+  },
+  mounted() {
+    window.onresize = () => {
+                    this.changeTableMaxHeight()
+                  }
+                  this.changeTableMaxHeight()
+  },
+  methods: {
+    /** 查询导入人员信息列表 */
+    getList() {
+      this.loading = true;
+      this.mjue = false
+      listInfo(this.queryParams).then(response => {
+        this.infoList = response.data;
+        this.mjue = true
+        // this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 查询总核酸次数 */
+    getLisths() {
+      // this.loading = true;
+      this.loading = true;
+      this.mjue = false
+      listInfohs(this.queryParams).then(response => {
+        this.infoList = response.rows;
+        this.mjue = true
+        // this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        gender: null,
+        age: null,
+        idCard: null,
+        phoneNum: null,
+        nucleicCollectTime: null,
+        nucleicResultsTime: null,
+        jobStyle: null,
+        focusCrowdStyle: null,
+        detectionFrequency: null,
+        detectionNumber: null,
+        detectionScope: null,
+        deptName: null,
+        startTime: null,
+        endTime: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 对比按钮操作 */
+    handleQuery() {
+          this.queryParams.pageNum = 1;
+          this.getList();
+    },
+    // 搜索
+    handleQuerys(){
+          this.queryParams.pageNum = 1;
+          this.getLisths();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuerys();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加导入人员信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改导入人员信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateInfo(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInfo(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除导入人员信息编号为"' + ids + '"的数据项?').then(function() {
+        return delInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/info/export', {
+        ...this.queryParams
+      }, `info_${new Date().getTime()}.xlsx`)
+    },
+    /** 导入按钮操作 */
+    handleImport() {
+      this.upload.title = "导入信息";
+      this.upload.open = true;
+    },
+    /** 下载模板操作 */
+    importTemplate() {
+      window.open("https://yqfk.qs163.cn/moban/模板.xlsx")
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.upload.detectionNumber = null
+      this.upload.startTime=null
+      this.upload.endTime= null
+      this.upload.jobStyle= null
+      this.upload.focusCrowdStyle= null
+      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 提交上传文件
+    submitFileForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.$refs.upload.submit();
+        }
+      });
+    },
+    // 次数失去焦点事件
+    nhkse(value){
+     console.log(this.upload.detectionNumber)
+     if(this.upload.detectionNumber < 0){
+       this.upload.detectionNumber = 0
+     }
+    },
+    // 天数失去焦点事件
+    nhksets(){
+      if(this.upload.detectionScope < 0){
+        this.upload.detectionScope = 0
+      }
+    },
+    // 取消
+    nlmse(){
+      this.upload.open = false
+      this.upload.detectionNumber = null
+      this.upload.startTime=null
+      this.upload.endTime= null
+      this.upload.jobStyle= null
+      this.upload.focusCrowdStyle= null
+    },
+    getCurrentTime() {
+           //获取当前时间并打印
+           var _this = this;
+           console.log(3)
+         let yy = new Date().getFullYear();
+         let mm = new Date().getMonth()+1;
+         let dd = new Date().getDate();
+         let hh = new Date().getHours();
+         let mf = new Date().getMinutes()<10 ? '0'+new Date().getMinutes() : new Date().getMinutes();
+         let ss = new Date().getSeconds()<10 ? '0'+new Date().getSeconds() : new Date().getSeconds();
+         _this.gettime = yy+'-'+mm+'-'+dd;
+         console.log(_this.gettime)
+       },
+       // 获取屏幕高度
+                 showFilterForm () {
+                       this.filterActive = !this.filterActive
+                       this.changeTableMaxHeight()
+                     },
+
+                     changeTableMaxHeight () {
+                       let height = document.body.offsetHeight // 网页可视区域高度
+                       // if (this.filterActive) {
+                       //   this.tableMaxHeight = height - 320
+                       // } else {
+                         this.tableMaxHeight = height - 380
+                       // }
+                       console.log(height)
+                     },
+  }
+};
+</script>
+<style type="text/css" lang="scss">
+.nhkiu{
+  .el-upload-dragger{
+    width: 560px !important;
+    margin-bottom: 20px;
+  }
+}
+.nkseydf{
+  .el-button--primary{
+    background-color: #00b385 !important;
+    border-color: #00b385 !important;
+  }
+}
+.lndw{
+  color: red;
+}
+.heade_codfr{
+  color: #00b385;
+}
+
+</style>

+ 532 - 0
ruoyi-ui/src/views/key/batchs/index.vue

@@ -0,0 +1,532 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :rules="rules" size="small" :inline="true" v-show="showSearch" label-width="80px">
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="身份证号" prop="idCard">
+            <el-input
+              v-model="queryParams.idCard"
+              placeholder="请输入身份证号码"
+              style="width: 108%;"
+              clearable
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="开始时间" prop="startTime">
+            <el-date-picker clearable
+              v-model="queryParams.startTime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%;"
+              placeholder="请选择比对开始时间">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="结束时间" prop="endTime">
+            <el-date-picker clearable
+              v-model="queryParams.endTime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%;"
+              placeholder="请选择比对结束时间">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+
+
+        <!-- <el-col :span="8">
+          <el-form-item label="采集时间" prop="nucleicCollectTime">
+                      <el-date-picker clearable
+                        v-model="queryParams.nucleicCollectTime"
+                        type="datetime"
+                        value-format="yyyy-MM-dd HH:mm:ss"
+                        format="yyyy-MM-dd HH:mm:ss"
+                        style="width: 100%;"
+                        placeholder="请选择核酸采集时间">
+                      </el-date-picker>
+                    </el-form-item>
+
+        </el-col> -->
+        <!-- <el-col :span="8">
+          <el-form-item :label="'天' + '\u3000\u3000' + '数'" prop="detectionScope">
+            <el-input
+              v-model="queryParams.detectionScope"
+              placeholder="请输入天数"
+                min="0"
+               type="number"
+               @blur="nhksets"
+               style="width: 108%;"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+        </el-col> -->
+
+        <el-col :span="24">
+          <el-col :span="8">
+            <el-form-item :label="'次' + '\u3000\u3000' + '数'" prop="detectionNumber">
+             <el-input
+               v-model="queryParams.detectionNumber"
+               placeholder="请输入次数"
+               style="width: 114%;"
+                 min="0"
+                type="number"
+                @blur="nhkse"
+                @keyup.enter.native="handleQuery"
+             />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="8">
+             <el-form-item class="nkseydf">
+               <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuerys">搜索</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-form-item>
+          </el-col>
+        </el-col>
+
+
+
+
+
+
+      </el-row>
+
+
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <!-- <el-col :span="18">
+        <div style="color: #343434; font-size: 20px;">截至 <span style="color: #00b385;">{{gettime}}</span> 止   共计 <span style="color: #00b385;">{{nskeia}}</span> 次核酸</div>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="importTemplate"
+        >下载模板</el-button>
+      </el-col>
+     <el-col :span="1.5">
+       <el-button
+         type="info"
+         plain
+         icon="el-icon-upload2"
+         size="mini"
+         @click="handleImport"
+         v-hasPermi="['system:info:import']"
+       >导入</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:info:export']"
+        >导出</el-button>
+      </el-col>
+      <!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> -->
+    </el-row>
+
+    <el-table v-loading="loading" v-if="mjue" :data="infoList" @selection-change="handleSelectionChange">
+      <el-table-column :fixed="rigs" label="姓名" align="center" prop="name"  width="110"/>
+      <el-table-column :fixed="rigs" label="身份证号码" align="center" prop="idCard" width="180"/>
+      <el-table-column label="联系号码" align="center" prop="phoneNum" width="110"/>
+      <el-table-column label="核酸采集时间" align="center" prop="nucleicCollectTime" width="157">
+        <template slot-scope="scope">
+          <span v-html="scope.row.nucleicCollectTime"></span>
+        </template>
+      </el-table-column>
+      <el-table-column label="核酸结果时间" align="center" prop="nucleicResultsTime" width="157">
+        <template slot-scope="scope">
+          <span v-html="scope.row.nucleicResultsTime"></span>
+        </template>
+      </el-table-column>
+      <el-table-column  label="采集地点"  align="center" width="117">
+        <template slot-scope="scope">
+            <span v-html="scope.row.collectPlace"></span>
+          </template>
+      </el-table-column>
+      <el-table-column  label="采集结果"  align="center" width="117">
+        <template slot-scope="scope">
+            <span v-html="scope.row.nucleicResults"></span>
+          </template>
+      </el-table-column>
+      <!-- <el-table-column label="职业类别" align="center" prop="jobStyle" width="137"/> -->
+      <!-- <el-table-column label="重点人群分类" align="center" prop="focusCrowdStyle" width="130"/> -->
+      <el-table-column label="检测频次(次/天)" align="center" prop="detectionFrequency" width="115"/>
+      <el-table-column label="比对开始时间" align="center" prop="startTime" width="157">
+        <template slot-scope="scope">
+          <span>{{ scope.row.startTime}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="比对结束时间" align="center" prop="endTime" width="157">
+        <template slot-scope="scope">
+          <span>{{ scope.row.endTime}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column :fixed="rig" label="进度(已做核酸次数/频次)" align="center" prop="detectionProgress" width="165"/>
+      <el-table-column  :fixed="rig" label="是否异常" align="center" prop="detectionResult" >
+        <template slot-scope="scope">
+            <span :class="[scope.row.detectionResult == '正常' ? 'heade_codfr' : 'lndw']">{{ scope.row.detectionResult}}</span>
+          </template>
+        </el-table-column>
+    </el-table>
+    <div v-if="!mjue" style="text-align: center;">正在加载数据......</div>
+
+
+  </div>
+</template>
+
+<script>
+import { listInfo, getInfo, delInfo, addInfo, updateInfo,listInfohs } from "@/api/system/batch";
+import { getToken } from "@/utils/auth";
+export default {
+  dicts: ['occupational_category', 'classification_population','whether_abnormal'],
+  name: "Info",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 导入人员信息表格数据
+      infoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        idCard: null,
+        phoneNum: null,
+        nucleicCollectTime: null,
+        nucleicResultsTime: null,
+        jobStyle: null,
+        focusCrowdStyle: null,
+        detectionFrequency: null,
+        startTime: null,
+        endTime: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        // startTime: [
+        //   { required: true, message: "开始时间不能为空", trigger: "blur" }
+        // ],
+        // endTime:[
+        //   { required: true, message: "结束时间不能为空", trigger: "blur" }
+        // ],
+        // detectionNumber:[
+        //   { required: true, message: "次数不能为空", trigger: "blur" }
+        // ],
+        // detectionScope:[
+        //   { required: true, message: "天数不能为空", trigger: "blur" }
+        // ],
+        // idCard:[
+        //   { required: true, message: "身份证不能为空", trigger: "blur" }
+        // ]
+      },
+      // 用户导入参数
+      upload: {
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+          detectionNumber:null,
+          detectionScope:null,
+          startTime: null,
+          endTime: null,
+          jobStyle:null,
+          focusCrowdStyle:null,
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/system/info/importData"
+      },
+      postOptions:[],
+      gettime:'',
+      nskeia:'',
+      mjue:true,
+      rig:'right',
+      rigs:'left',
+      tableMaxHeight:300,
+    };
+  },
+  created() {
+    // this.getList();
+    // this.getCurrentTime()
+    this.getLisths()
+    this.loading = false;
+    window.onresize = () => {
+                    this.changeTableMaxHeight()
+                  }
+                  this.changeTableMaxHeight()
+  },
+  mounted() {
+    window.onresize = () => {
+                    this.changeTableMaxHeight()
+                  }
+                  this.changeTableMaxHeight()
+  },
+  methods: {
+    /** 查询导入人员信息列表 */
+    getList() {
+      this.loading = true;
+      this.mjue = false
+      listInfo(this.queryParams).then(response => {
+        this.infoList = response.data;
+        this.mjue = true
+        // this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 查询总核酸次数 */
+    getLisths() {
+      // this.loading = true;
+      this.loading = true;
+      this.mjue = false
+      listInfohs(this.queryParams).then(response => {
+        this.infoList = response.rows;
+        this.mjue = true
+        // this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        gender: null,
+        age: null,
+        idCard: null,
+        phoneNum: null,
+        nucleicCollectTime: null,
+        nucleicResultsTime: null,
+        jobStyle: null,
+        focusCrowdStyle: null,
+        detectionFrequency: null,
+        detectionNumber: null,
+        detectionScope: null,
+        deptName: null,
+        startTime: null,
+        endTime: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 对比按钮操作 */
+    handleQuery() {
+          this.queryParams.pageNum = 1;
+          this.getList();
+    },
+    // 搜索
+    handleQuerys(){
+          this.queryParams.pageNum = 1;
+          this.getLisths();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuerys();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加导入人员信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改导入人员信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateInfo(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInfo(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除导入人员信息编号为"' + ids + '"的数据项?').then(function() {
+        return delInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/info/export', {
+        ...this.queryParams
+      }, `info_${new Date().getTime()}.xlsx`)
+    },
+    /** 导入按钮操作 */
+    handleImport() {
+      this.upload.title = "导入信息";
+      this.upload.open = true;
+    },
+    /** 下载模板操作 */
+    importTemplate() {
+      window.open("https://yqfk.qs163.cn/moban/模板.xlsx")
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.upload.detectionNumber = null
+      this.upload.startTime=null
+      this.upload.endTime= null
+      this.upload.jobStyle= null
+      this.upload.focusCrowdStyle= null
+      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 提交上传文件
+    submitFileForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.$refs.upload.submit();
+        }
+      });
+    },
+    // 次数失去焦点事件
+    nhkse(value){
+     console.log(this.upload.detectionNumber)
+     if(this.upload.detectionNumber < 0){
+       this.upload.detectionNumber = 0
+     }
+    },
+    // 天数失去焦点事件
+    nhksets(){
+      if(this.upload.detectionScope < 0){
+        this.upload.detectionScope = 0
+      }
+    },
+    // 取消
+    nlmse(){
+      this.upload.open = false
+      this.upload.detectionNumber = null
+      this.upload.startTime=null
+      this.upload.endTime= null
+      this.upload.jobStyle= null
+      this.upload.focusCrowdStyle= null
+    },
+    getCurrentTime() {
+           //获取当前时间并打印
+           var _this = this;
+           console.log(3)
+         let yy = new Date().getFullYear();
+         let mm = new Date().getMonth()+1;
+         let dd = new Date().getDate();
+         let hh = new Date().getHours();
+         let mf = new Date().getMinutes()<10 ? '0'+new Date().getMinutes() : new Date().getMinutes();
+         let ss = new Date().getSeconds()<10 ? '0'+new Date().getSeconds() : new Date().getSeconds();
+         _this.gettime = yy+'-'+mm+'-'+dd;
+         console.log(_this.gettime)
+       },
+       // 获取屏幕高度
+                 showFilterForm () {
+                       this.filterActive = !this.filterActive
+                       this.changeTableMaxHeight()
+                     },
+
+                     changeTableMaxHeight () {
+                       let height = document.body.offsetHeight // 网页可视区域高度
+                       // if (this.filterActive) {
+                       //   this.tableMaxHeight = height - 320
+                       // } else {
+                         this.tableMaxHeight = height - 380
+                       // }
+                       console.log(height)
+                     },
+  }
+};
+</script>
+<style type="text/css" lang="scss">
+.nhkiu{
+  .el-upload-dragger{
+    width: 560px !important;
+    margin-bottom: 20px;
+  }
+}
+.nkseydf{
+  .el-button--primary{
+    background-color: #00b385 !important;
+    border-color: #00b385 !important;
+  }
+}
+.lndw{
+  color: red;
+}
+.heade_codfr{
+  color: #00b385;
+}
+
+</style>

+ 216 - 148
ruoyi-ui/src/views/key/groups/index.vue

@@ -14,17 +14,18 @@
           </el-form-item>
         </el-col>
         <el-col :span="8">
-          <el-form-item label="检测频次" prop="detectionFrequency">
-            <el-input
-              v-model="queryParams.detectionFrequency"
-              placeholder="请输入检测频次(汉字拼接后)"
-              clearable
-              style="width: 108%;"
-              @keyup.enter.native="handleQuery"
-            />
-          </el-form-item>
+          <el-form-item label="人群分类" prop="focusCrowdStyle">
+            <el-select clearable style="width: 108%;" filterable v-model="queryParams.focusCrowdStyle"  placeholder="请选择人群分类">
+              <el-option
+                v-for="dict in dict.type.classification_population"
+                :key="dict.label"
+                :label="dict.label"
+                :value="dict.label"
+              ></el-option>
+            </el-select>
+            </el-form-item>
         </el-col>
-        <el-col :span="8">
+        <!-- <el-col :span="8">
           <el-form-item label="采集时间" prop="nucleicCollectTime">
                       <el-date-picker clearable
                         v-model="queryParams.nucleicCollectTime"
@@ -36,6 +37,18 @@
                       </el-date-picker>
                     </el-form-item>
 
+        </el-col> -->
+        <el-col :span="8">
+          <el-form-item label="职业类别" prop="jobStyle">
+            <el-select clearable style="width: 108%;" filterable v-model="queryParams.jobStyle"  placeholder="请选择职业类别">
+              <el-option
+                v-for="dict in dict.type.occupational_category "
+                :key="dict.label"
+                :label="dict.label"
+                :value="dict.label"
+              ></el-option>
+            </el-select>
+            </el-form-item>
         </el-col>
 
         <el-col :span="24">
@@ -50,6 +63,18 @@
               />
             </el-form-item>
           </el-col>
+          <el-col :span="8">
+            <el-form-item label="开始时间" prop="startTime">
+              <el-date-picker clearable
+                v-model="queryParams.startTime"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                format="yyyy-MM-dd HH:mm:ss"
+                style="width: 100%;"
+                placeholder="请选择比对开始时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
           <el-col :span="8">
             <el-form-item label="采集地点" prop="collectPlace">
               <el-input
@@ -61,19 +86,6 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="8">
-            <el-form-item label="结果时间" prop="nucleicResultsTime">
-              <el-date-picker clearable
-                v-model="queryParams.nucleicResultsTime"
-                type="datetime"
-                value-format="yyyy-MM-dd HH:mm:ss"
-                format="yyyy-MM-dd HH:mm:ss"
-                style="width: 100%;"
-                placeholder="请选择核酸结果时间">
-              </el-date-picker>
-            </el-form-item>
-          </el-col>
-
         </el-col>
         <el-col :span="8">
           <el-form-item label="联系号码" prop="phoneNum">
@@ -87,18 +99,7 @@
           </el-form-item>
 
         </el-col>
-        <el-col :span="8">
-          <el-form-item label="开始时间" prop="startTime">
-            <el-date-picker clearable
-              v-model="queryParams.startTime"
-              type="datetime"
-              value-format="yyyy-MM-dd HH:mm:ss"
-              format="yyyy-MM-dd HH:mm:ss"
-              style="width: 100%;"
-              placeholder="请选择比对开始时间">
-            </el-date-picker>
-          </el-form-item>
-        </el-col>
+
         <el-col :span="8">
           <el-form-item label="结束时间" prop="endTime">
             <el-date-picker clearable
@@ -111,19 +112,43 @@
             </el-date-picker>
           </el-form-item>
         </el-col>
+        <el-col :span="8">
+          <el-form-item label="是否正常" prop="detectionResult">
+            <el-select clearable style="width: 108%;" filterable v-model="queryParams.detectionResult"  placeholder="请选择是否正常">
+              <el-option
+                v-for="dict in dict.type.whether_abnormal"
+                :key="dict.label"
+                :label="dict.label"
+                :value="dict.label"
+              ></el-option>
+            </el-select>
+            </el-form-item>
+        </el-col>
+        <el-col :span="8">
+           <el-form-item class="nkseydf">
+             <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-form-item>
+        </el-col>
 
 
       </el-row>
 
-      <el-form-item>
-        <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-form-item>
+
     </el-form>
 
     <el-row :gutter="10" class="mb8">
-      <el-col :span="20">
-        <div style="color: #343434; font-size: 20px;">截至 <span style="color: #00b385;">2022年08月14日</span> 止   共计 <span style="color: #00b385;">33256</span> 次核酸</div>
+      <el-col :span="18">
+        <div style="color: #343434; font-size: 20px;">截至 <span style="color: #00b385;">{{gettime}}</span> 止   共计 <span style="color: #00b385;">{{nskeia}}</span> 次核酸</div>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="importTemplate"
+        >下载模板</el-button>
       </el-col>
      <el-col :span="1.5">
        <el-button
@@ -148,36 +173,60 @@
       <!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> -->
     </el-row>
 
-    <el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
-      <el-table-column label="姓名" align="center" prop="name"  width="110"/>
-      <el-table-column label="性别" align="center" prop="gender" />
-      <el-table-column label="年龄" align="center" prop="age" />
-      <el-table-column label="身份证号码" align="center" prop="idCard" width="180"/>
+    <el-table  :height="tableMaxHeight" v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
+      <el-table-column :fixed="rigs" label="姓名" align="center" prop="name"  width="110"/>
+      <el-table-column :fixed="rigs" label="身份证号码" align="center" prop="idCard" width="180"/>
       <el-table-column label="联系号码" align="center" prop="phoneNum" width="110"/>
-      <el-table-column label="核酸采集时间" align="center" prop="nucleicCollectTime" width="102">
+      <el-table-column label="核酸采集时间" align="center" prop="nucleicCollectTime" width="157">
         <template slot-scope="scope">
-          <span>{{ scope.row.nucleicCollectTime }}</span>
+          <span v-html="scope.row.nucleicCollectTime"></span>
         </template>
       </el-table-column>
-      <el-table-column label="核酸结果时间" align="center" prop="nucleicResultsTime" width="102">
+      <el-table-column label="核酸结果时间" align="center" prop="nucleicResultsTime" width="157">
         <template slot-scope="scope">
-          <span>{{ scope.row.nucleicResultsTime}}</span>
+          <span v-html="scope.row.nucleicResultsTime"></span>
         </template>
       </el-table-column>
-      <el-table-column label="职业类别" align="center" prop="jobStyle" />
+      <el-table-column  label="采集地点"  align="center" width="117">
+        <template slot-scope="scope">
+            <span v-html="scope.row.collectPlace"></span>
+          </template>
+      </el-table-column>
+      <el-table-column  label="采集结果"  align="center" width="117">
+        <template slot-scope="scope">
+            <span v-html="scope.row.nucleicResults"></span>
+          </template>
+      </el-table-column>
+      <el-table-column label="职业类别" align="center" prop="jobStyle" width="137"/>
       <el-table-column label="重点人群分类" align="center" prop="focusCrowdStyle" width="130"/>
-      <el-table-column label="检测频次" align="center" prop="detectionFrequency" />
-      <el-table-column label="比对开始时间" align="center" prop="startTime" width="102">
+      <el-table-column label="检测频次(次/天)" align="center" prop="detectionFrequency" width="115"/>
+      <el-table-column label="比对开始时间" align="center" prop="startTime" width="157">
         <template slot-scope="scope">
           <span>{{ scope.row.startTime}}</span>
         </template>
       </el-table-column>
-      <el-table-column label="比对结束时间" align="center" prop="endTime" width="102">
+      <el-table-column label="比对结束时间" align="center" prop="endTime" width="157">
         <template slot-scope="scope">
           <span>{{ scope.row.endTime}}</span>
         </template>
       </el-table-column>
-
+      <el-table-column :fixed="rig" label="进度(已做核酸次数/频次)" align="center" prop="detectionProgress" width="165"/>
+      <el-table-column :fixed="rig" label="是否异常" align="center" prop="detectionResult" >
+        <template slot-scope="scope">
+            <span :class="[scope.row.detectionResult == '正常' ? 'heade_codfr' : 'lndw']">{{ scope.row.detectionResult}}</span>
+          </template>
+      </el-table-column>
+      <el-table-column :fixed="rig" label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['system:dept:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
     </el-table>
 
     <pagination
@@ -188,52 +237,6 @@
       @pagination="getList"
     />
 
-    <!-- 添加或修改导入人员信息对话框 -->
-    <!-- <el-dialog :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="name">
-          <el-input v-model="form.name" placeholder="请输入姓名" />
-        </el-form-item>
-        <el-form-item label="性别" prop="gender">
-          <el-input v-model="form.gender" placeholder="请输入性别" />
-        </el-form-item>
-        <el-form-item label="年龄" prop="age">
-          <el-input v-model="form.age" placeholder="请输入年龄" />
-        </el-form-item>
-        <el-form-item label="身份证号码" prop="idCard">
-          <el-input v-model="form.idCard" placeholder="请输入身份证号码" />
-        </el-form-item>
-        <el-form-item label="联系号码" prop="phoneNum">
-          <el-input v-model="form.phoneNum" placeholder="请输入联系号码" />
-        </el-form-item>
-        <el-form-item label="检测频次" prop="detectionNumber">
-          <el-input v-model="form.detectionNumber" placeholder="请输入检测频次" />
-        </el-form-item>
-        <el-form-item label="检测频次" prop="detectionScope">
-          <el-input v-model="form.detectionScope" placeholder="请输入检测频次" />
-        </el-form-item>
-        <el-form-item label="比对开始时间" prop="startTime">
-          <el-date-picker clearable
-            v-model="form.startTime"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择比对开始时间">
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="比对结束时间" prop="endTime">
-          <el-date-picker clearable
-            v-model="form.endTime"
-            type="date"
-            value-format="yyyy-MM-dd"
-            placeholder="请选择比对结束时间">
-          </el-date-picker>
-        </el-form-item>
-      </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
-    </el-dialog> -->
 
 
     <!-- 用户导入对话框 -->
@@ -284,31 +287,7 @@
               </el-date-picker>
               </el-form-item>
             </el-col>
-            <el-col :span="12">
-              <el-form-item :label="'次' + '\u3000\u3000' + '数'" prop="detectionNumber">
-               <el-input
-                 v-model="upload.detectionNumber"
-                 placeholder="请输入次数"
-                   min="0"
-                  type="number"
-                  @blur="nhkse"
-               />
-                </el-form-item>
 
-
-            </el-col>
-            <el-col :span="12">
-              <el-form-item :label="'天' + '\u3000\u3000' + '数'" prop="detectionScope">
-                <el-input
-                  v-model="upload.detectionScope"
-                  placeholder="请输入天数"
-                    min="0"
-                   type="number"
-                   @blur="nhksets"
-                  @keyup.enter.native="handleQuery"
-                />
-                </el-form-item>
-            </el-col>
             <el-col :span="12">
               <el-form-item label="职业类别" prop="jobStyle">
                 <el-select filterable v-model="upload.jobStyle"  placeholder="请选择职业类别">
@@ -333,10 +312,34 @@
                 </el-select>
                 </el-form-item>
             </el-col>
+            <el-col :span="24">
+              <el-form-item :label="'次' + '\u3000\u3000' + '数'" prop="detectionNumber">
+               <el-input
+                 v-model="upload.detectionNumber"
+                 placeholder="请输入次数"
+                   min="0"
+                  type="number"
+                  @blur="nhkse"
+               />
+                </el-form-item>
+            </el-col>
+            <!-- <el-col :span="12">
+              <el-form-item :label="'天' + '\u3000\u3000' + '数'" prop="detectionScope">
+                <el-input
+                  v-model="upload.detectionScope"
+                  placeholder="请输入天数"
+                    min="0"
+                   type="number"
+                   @blur="nhksets"
+                  @keyup.enter.native="handleQuery"
+                />
+                </el-form-item>
+            </el-col> -->
             </el-form>
           </el-row>
           <span>仅允许导入xls、xlsx格式文件。</span>
           <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline; color: #00b385;" @click="importTemplate">下载模板</el-link>
+          <div v-if="nlsmeh" style="font-size:16px;vertical-align: baseline; color: red;margin-top: 10px;">正在导入中,请稍后,请勿进行操作......</div>
         </div>
       </el-upload>
       <div slot="footer" class="dialog-footer">
@@ -348,10 +351,10 @@
 </template>
 
 <script>
-import { listInfo, getInfo, delInfo, addInfo, updateInfo } from "@/api/system/info";
+import { listInfo, getInfo, delInfo, addInfo, updateInfo,listInfohs } from "@/api/system/info";
 import { getToken } from "@/utils/auth";
 export default {
-  dicts: ['occupational_category', 'classification_population'],
+  dicts: ['occupational_category', 'classification_population','whether_abnormal'],
   name: "Info",
   data() {
     return {
@@ -401,9 +404,6 @@ export default {
         detectionNumber:[
           { required: true, message: "次数不能为空", trigger: "blur" }
         ],
-        detectionScope:[
-          { required: true, message: "天数不能为空", trigger: "blur" }
-        ],
         jobStyle:[
           { required: true, message: "职业类别不能为空", trigger: "blur" }
         ],
@@ -432,11 +432,29 @@ export default {
         // 上传的地址
         url: process.env.VUE_APP_BASE_API + "/system/info/importData"
       },
-      postOptions:[]
+      postOptions:[],
+      gettime:'',
+      nskeia:'',
+      rig:'right',
+      rigs:'left',
+      tableMaxHeight:300,
+      nlsmeh:false
     };
   },
   created() {
     this.getList();
+    this.getCurrentTime()
+    this.getLisths()
+    window.onresize = () => {
+                    this.changeTableMaxHeight()
+                  }
+                  this.changeTableMaxHeight()
+  },
+  mounted() {
+    window.onresize = () => {
+                    this.changeTableMaxHeight()
+                  }
+                  this.changeTableMaxHeight()
   },
   methods: {
     /** 查询导入人员信息列表 */
@@ -448,6 +466,15 @@ export default {
         this.loading = false;
       });
     },
+    /** 查询总核酸次数 */
+    getLisths() {
+      // this.loading = true;
+      listInfohs().then(response => {
+        this.nskeia = response.data;
+        // this.total = response.total;
+        // this.loading = false;
+      });
+    },
     // 取消按钮
     cancel() {
       this.open = false;
@@ -535,7 +562,7 @@ export default {
     /** 删除按钮操作 */
     handleDelete(row) {
       const ids = row.id || this.ids;
-      this.$modal.confirm('是否确认删除导入人员信息编号为"' + ids + '"的数据项?').then(function() {
+      this.$modal.confirm('是否确认删除信息').then(function() {
         return delInfo(ids);
       }).then(() => {
         this.getList();
@@ -550,30 +577,34 @@ export default {
     },
     /** 导入按钮操作 */
     handleImport() {
-      this.upload.title = "用户导入";
+      this.upload.title = "导入信息";
       this.upload.open = true;
     },
     /** 下载模板操作 */
     importTemplate() {
-      // this.download('system/user/importTemplate', {
-      // }, `user_template_${new Date().getTime()}.xlsx`)
+      window.open("https://yqfk.qs163.cn/muban/muban.xlsx")
     },
     // 文件上传中处理
     handleFileUploadProgress(event, file, fileList) {
       this.upload.isUploading = true;
+      this.nlsmeh = true
     },
     // 文件上传成功处理
     handleFileSuccess(response, file, fileList) {
-      this.upload.open = false;
-      this.upload.isUploading = false;
-      this.$refs.upload.clearFiles();
-      this.upload.detectionNumber = null
-      this.upload.startTime=null
-      this.upload.endTime= null
-      this.upload.jobStyle= null
-      this.upload.focusCrowdStyle= null
+      // if(response.code == 200){
+        this.nlsmeh = false
+        this.upload.open = false;
+        this.upload.isUploading = false;
+        this.$refs.upload.clearFiles();
+        this.upload.detectionNumber = null
+        this.upload.startTime=null
+        this.upload.endTime= null
+        this.upload.jobStyle= null
+        this.upload.focusCrowdStyle= null
+
+      // }
       this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
-      this.getList();
+       this.getList();
     },
     // 提交上传文件
     submitFileForm() {
@@ -604,7 +635,35 @@ export default {
       this.upload.endTime= null
       this.upload.jobStyle= null
       this.upload.focusCrowdStyle= null
-    }
+    },
+    getCurrentTime() {
+           //获取当前时间并打印
+           var _this = this;
+           console.log(3)
+         let yy = new Date().getFullYear();
+         let mm = new Date().getMonth()+1;
+         let dd = new Date().getDate();
+         let hh = new Date().getHours();
+         let mf = new Date().getMinutes()<10 ? '0'+new Date().getMinutes() : new Date().getMinutes();
+         let ss = new Date().getSeconds()<10 ? '0'+new Date().getSeconds() : new Date().getSeconds();
+         _this.gettime = yy+'-'+mm+'-'+dd;
+         console.log(_this.gettime)
+       },
+  // 获取屏幕高度
+            showFilterForm () {
+                  this.filterActive = !this.filterActive
+                  this.changeTableMaxHeight()
+                },
+
+                changeTableMaxHeight () {
+                  let height = document.body.offsetHeight // 网页可视区域高度
+                  // if (this.filterActive) {
+                  //   this.tableMaxHeight = height - 320
+                  // } else {
+                    this.tableMaxHeight = height - 380
+                  // }
+                  console.log(height)
+                },
   }
 };
 </script>
@@ -615,8 +674,17 @@ export default {
     margin-bottom: 20px;
   }
 }
-.el-button--primary{
-  background-color: #00b385 !important;
-  border-color: #00b385 !important;
+.nkseydf{
+  .el-button--primary{
+    background-color: #00b385 !important;
+    border-color: #00b385 !important;
+  }
 }
+.lndw{
+  color: red;
+}
+.heade_codfr{
+  color: #00b385;
+}
+
 </style>

+ 532 - 0
ruoyi-ui/src/views/key/ryxx/index.vue

@@ -0,0 +1,532 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :rules="rules" size="small" :inline="true" v-show="showSearch" label-width="80px">
+      <el-row>
+        <el-col :span="8">  
+          <el-form-item label="身份证号" prop="idCard">
+            <el-input
+              v-model="queryParams.idCard"
+              placeholder="请输入身份证号码"
+              style="width: 108%;"
+              clearable
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="开始时间" prop="startTime">
+            <el-date-picker clearable
+              v-model="queryParams.startTime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%;"
+              placeholder="请选择比对开始时间">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="结束时间" prop="endTime">
+            <el-date-picker clearable
+              v-model="queryParams.endTime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%;"
+              placeholder="请选择比对结束时间">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+
+
+        <!-- <el-col :span="8">
+          <el-form-item label="采集时间" prop="nucleicCollectTime">
+                      <el-date-picker clearable
+                        v-model="queryParams.nucleicCollectTime"
+                        type="datetime"
+                        value-format="yyyy-MM-dd HH:mm:ss"
+                        format="yyyy-MM-dd HH:mm:ss"
+                        style="width: 100%;"
+                        placeholder="请选择核酸采集时间">
+                      </el-date-picker>
+                    </el-form-item>
+
+        </el-col> -->
+        <!-- <el-col :span="8">
+          <el-form-item :label="'天' + '\u3000\u3000' + '数'" prop="detectionScope">
+            <el-input
+              v-model="queryParams.detectionScope"
+              placeholder="请输入天数"
+                min="0"
+               type="number"
+               @blur="nhksets"
+               style="width: 108%;"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+        </el-col> -->
+
+        <el-col :span="24">
+          <el-col :span="8">
+            <el-form-item :label="'次' + '\u3000\u3000' + '数'" prop="detectionNumber">
+             <el-input
+               v-model="queryParams.detectionNumber"
+               placeholder="请输入次数"
+               style="width: 114%;"
+                 min="0"
+                type="number"
+                @blur="nhkse"
+                @keyup.enter.native="handleQuery"
+             />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="8">
+             <el-form-item class="nkseydf">
+               <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuerys">搜索</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-form-item>
+          </el-col>
+        </el-col>
+
+
+
+
+
+
+      </el-row>
+
+
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <!-- <el-col :span="18">
+        <div style="color: #343434; font-size: 20px;">截至 <span style="color: #00b385;">{{gettime}}</span> 止   共计 <span style="color: #00b385;">{{nskeia}}</span> 次核酸</div>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          @click="importTemplate"
+        >下载模板</el-button>
+      </el-col>
+     <el-col :span="1.5">
+       <el-button
+         type="info"
+         plain
+         icon="el-icon-upload2"
+         size="mini"
+         @click="handleImport"
+         v-hasPermi="['system:info:import']"
+       >导入</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:info:export']"
+        >导出</el-button>
+      </el-col>
+      <!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> -->
+    </el-row>
+
+    <el-table v-loading="loading" v-if="mjue" :data="infoList" @selection-change="handleSelectionChange">
+      <el-table-column :fixed="rigs" label="姓名" align="center" prop="name"  width="110"/>
+      <el-table-column :fixed="rigs" label="身份证号码" align="center" prop="idCard" width="180"/>
+      <el-table-column label="联系号码" align="center" prop="phoneNum" width="110"/>
+      <el-table-column label="核酸采集时间" align="center" prop="nucleicCollectTime" width="157">
+        <template slot-scope="scope">
+          <span v-html="scope.row.nucleicCollectTime"></span>
+        </template>
+      </el-table-column>
+      <el-table-column label="核酸结果时间" align="center" prop="nucleicResultsTime" width="157">
+        <template slot-scope="scope">
+          <span v-html="scope.row.nucleicResultsTime"></span>
+        </template>
+      </el-table-column>
+      <el-table-column  label="采集地点"  align="center" width="117">
+        <template slot-scope="scope">
+            <span v-html="scope.row.collectPlace"></span>
+          </template>
+      </el-table-column>
+      <el-table-column  label="采集结果"  align="center" width="117">
+        <template slot-scope="scope">
+            <span v-html="scope.row.nucleicResults"></span>
+          </template>
+      </el-table-column>
+      <!-- <el-table-column label="职业类别" align="center" prop="jobStyle" width="137"/> -->
+      <!-- <el-table-column label="重点人群分类" align="center" prop="focusCrowdStyle" width="130"/> -->
+      <el-table-column label="检测频次(次/天)" align="center" prop="detectionFrequency" width="115"/>
+      <el-table-column label="比对开始时间" align="center" prop="startTime" width="157">
+        <template slot-scope="scope">
+          <span>{{ scope.row.startTime}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="比对结束时间" align="center" prop="endTime" width="157">
+        <template slot-scope="scope">
+          <span>{{ scope.row.endTime}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column :fixed="rig" label="进度(已做核酸次数/频次)" align="center" prop="detectionProgress" width="165"/>
+      <el-table-column  :fixed="rig" label="是否异常" align="center" prop="detectionResult" >
+        <template slot-scope="scope">
+            <span :class="[scope.row.detectionResult == '正常' ? 'heade_codfr' : 'lndw']">{{ scope.row.detectionResult}}</span>
+          </template>
+        </el-table-column>
+    </el-table>
+    <div v-if="!mjue" style="text-align: center;">正在加载数据......</div>
+
+
+  </div>
+</template>
+
+<script>
+import { listInfo, getInfo, delInfo, addInfo, updateInfo,listInfohs } from "@/api/system/batch";
+import { getToken } from "@/utils/auth";
+export default {
+  dicts: ['occupational_category', 'classification_population','whether_abnormal'],
+  name: "Info",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 导入人员信息表格数据
+      infoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        idCard: null,
+        phoneNum: null,
+        nucleicCollectTime: null,
+        nucleicResultsTime: null,
+        jobStyle: null,
+        focusCrowdStyle: null,
+        detectionFrequency: null,
+        startTime: null,
+        endTime: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        // startTime: [
+        //   { required: true, message: "开始时间不能为空", trigger: "blur" }
+        // ],
+        // endTime:[
+        //   { required: true, message: "结束时间不能为空", trigger: "blur" }
+        // ],
+        // detectionNumber:[
+        //   { required: true, message: "次数不能为空", trigger: "blur" }
+        // ],
+        // detectionScope:[
+        //   { required: true, message: "天数不能为空", trigger: "blur" }
+        // ],
+        // idCard:[
+        //   { required: true, message: "身份证不能为空", trigger: "blur" }
+        // ]
+      },
+      // 用户导入参数
+      upload: {
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+          detectionNumber:null,
+          detectionScope:null,
+          startTime: null,
+          endTime: null,
+          jobStyle:null,
+          focusCrowdStyle:null,
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/system/info/importData"
+      },
+      postOptions:[],
+      gettime:'',
+      nskeia:'',
+      mjue:true,
+      rig:'right',
+      rigs:'left',
+      tableMaxHeight:300,
+    };
+  },
+  created() {
+    // this.getList();
+    // this.getCurrentTime()
+    this.getLisths()
+    this.loading = false;
+    window.onresize = () => {
+                    this.changeTableMaxHeight()
+                  }
+                  this.changeTableMaxHeight()
+  },
+  mounted() {
+    window.onresize = () => {
+                    this.changeTableMaxHeight()
+                  }
+                  this.changeTableMaxHeight()
+  },
+  methods: {
+    /** 查询导入人员信息列表 */
+    getList() {
+      this.loading = true;
+      this.mjue = false
+      listInfo(this.queryParams).then(response => {
+        this.infoList = response.data;
+        this.mjue = true
+        // this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 查询总核酸次数 */
+    getLisths() {
+      // this.loading = true;
+      this.loading = true;
+      this.mjue = false
+      listInfohs(this.queryParams).then(response => {
+        this.infoList = response.rows;
+        this.mjue = true
+        // this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        gender: null,
+        age: null,
+        idCard: null,
+        phoneNum: null,
+        nucleicCollectTime: null,
+        nucleicResultsTime: null,
+        jobStyle: null,
+        focusCrowdStyle: null,
+        detectionFrequency: null,
+        detectionNumber: null,
+        detectionScope: null,
+        deptName: null,
+        startTime: null,
+        endTime: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 对比按钮操作 */
+    handleQuery() {
+          this.queryParams.pageNum = 1;
+          this.getList();
+    },
+    // 搜索
+    handleQuerys(){
+          this.queryParams.pageNum = 1;
+          this.getLisths();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuerys();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加导入人员信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改导入人员信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateInfo(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInfo(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除导入人员信息编号为"' + ids + '"的数据项?').then(function() {
+        return delInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/info/export', {
+        ...this.queryParams
+      }, `info_${new Date().getTime()}.xlsx`)
+    },
+    /** 导入按钮操作 */
+    handleImport() {
+      this.upload.title = "导入信息";
+      this.upload.open = true;
+    },
+    /** 下载模板操作 */
+    importTemplate() {
+      window.open("https://yqfk.qs163.cn/moban/模板.xlsx")
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.upload.detectionNumber = null
+      this.upload.startTime=null
+      this.upload.endTime= null
+      this.upload.jobStyle= null
+      this.upload.focusCrowdStyle= null
+      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 提交上传文件
+    submitFileForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.$refs.upload.submit();
+        }
+      });
+    },
+    // 次数失去焦点事件
+    nhkse(value){
+     console.log(this.upload.detectionNumber)
+     if(this.upload.detectionNumber < 0){
+       this.upload.detectionNumber = 0
+     }
+    },
+    // 天数失去焦点事件
+    nhksets(){
+      if(this.upload.detectionScope < 0){
+        this.upload.detectionScope = 0
+      }
+    },
+    // 取消
+    nlmse(){
+      this.upload.open = false
+      this.upload.detectionNumber = null
+      this.upload.startTime=null
+      this.upload.endTime= null
+      this.upload.jobStyle= null
+      this.upload.focusCrowdStyle= null
+    },
+    getCurrentTime() {
+           //获取当前时间并打印
+           var _this = this;
+           console.log(3)
+         let yy = new Date().getFullYear();
+         let mm = new Date().getMonth()+1;
+         let dd = new Date().getDate();
+         let hh = new Date().getHours();
+         let mf = new Date().getMinutes()<10 ? '0'+new Date().getMinutes() : new Date().getMinutes();
+         let ss = new Date().getSeconds()<10 ? '0'+new Date().getSeconds() : new Date().getSeconds();
+         _this.gettime = yy+'-'+mm+'-'+dd;
+         console.log(_this.gettime)
+       },
+       // 获取屏幕高度
+                 showFilterForm () {
+                       this.filterActive = !this.filterActive
+                       this.changeTableMaxHeight()
+                     },
+
+                     changeTableMaxHeight () {
+                       let height = document.body.offsetHeight // 网页可视区域高度
+                       // if (this.filterActive) {
+                       //   this.tableMaxHeight = height - 320
+                       // } else {
+                         this.tableMaxHeight = height - 380
+                       // }
+                       console.log(height)
+                     },
+  }
+};
+</script>
+<style type="text/css" lang="scss">
+.nhkiu{
+  .el-upload-dragger{
+    width: 560px !important;
+    margin-bottom: 20px;
+  }
+}
+.nkseydf{
+  .el-button--primary{
+    background-color: #00b385 !important;
+    border-color: #00b385 !important;
+  }
+}
+.lndw{
+  color: red;
+}
+.heade_codfr{
+  color: #00b385;
+}
+
+</style>

+ 4 - 4
ruoyi-ui/src/views/login.vue

@@ -56,7 +56,7 @@
     </el-form>
     <!--  底部  -->
     <div class="el-login-footer">
-      <span>Copyright © 2018-2022 ruoyi.vip All Rights Reserved.</span>
+      <span></span>
     </div>
   </div>
 </template>
@@ -72,8 +72,8 @@ export default {
     return {
       codeUrl: "",
       loginForm: {
-        username: "admin",
-        password: "admin123",
+        username: "",
+        password: "",
         rememberMe: false,
         code: "",
         uuid: ""
@@ -89,7 +89,7 @@ export default {
       },
       loading: false,
       // 验证码开关
-      captchaEnabled: true,
+      captchaEnabled: false,
       // 注册开关
       register: false,
       redirect: undefined

+ 1 - 1
ruoyi-ui/src/views/register.vue

@@ -61,7 +61,7 @@
     </el-form>
     <!--  底部  -->
     <div class="el-register-footer">
-      <span>Copyright © 2018-2022 ruoyi.vip All Rights Reserved.</span>
+      <span></span>
     </div>
   </div>
 </template>

+ 638 - 0
ruoyi-ui/src/views/system/user/yue/index.vue

@@ -0,0 +1,638 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-row>
+        <el-col :span="8">
+          <el-form-item label="身份证号" prop="idCard">
+            <el-input
+              v-model="queryParams.idCard"
+              placeholder="请输入身份证号码"
+              style="width: 100%;"
+              clearable
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="人群分类" prop="focusCrowdStyle">
+            <el-select style="width: 108%;" filterable v-model="queryParams.focusCrowdStyle"  placeholder="请选择人群分类">
+              <el-option
+                v-for="dict in dict.type.classification_population"
+                :key="dict.label"
+                :label="dict.label"
+                :value="dict.label"
+              ></el-option>
+            </el-select>
+            </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="采集时间" prop="nucleicCollectTime">
+                      <el-date-picker clearable
+                        v-model="queryParams.nucleicCollectTime"
+                        type="datetime"
+                        value-format="yyyy-MM-dd HH:mm:ss"
+                        format="yyyy-MM-dd HH:mm:ss"
+                        style="width: 100%;"
+                        placeholder="请选择核酸采集时间">
+                      </el-date-picker>
+                    </el-form-item>
+
+        </el-col>
+
+        <el-col :span="24">
+          <el-col :span="8">
+            <el-form-item :label="'姓' + '\u3000\u3000' + '名'" prop="name">
+              <el-input
+                v-model="queryParams.name"
+                placeholder="请输入姓名"
+                style="width: 100%;"
+                clearable
+                @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="采集地点" prop="collectPlace">
+              <el-input
+                v-model="queryParams.collectPlace"
+                placeholder="请输入采集地点"
+                clearable
+                style="width: 108%;"
+                @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="结果时间" prop="nucleicResultsTime">
+              <el-date-picker clearable
+                v-model="queryParams.nucleicResultsTime"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                format="yyyy-MM-dd HH:mm:ss"
+                style="width: 100%;"
+                placeholder="请选择核酸结果时间">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="联系号码" prop="phoneNum">
+            <el-input
+              v-model="queryParams.phoneNum"
+              placeholder="请输入联系号码"
+              style="width: 100%;"
+              clearable
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="开始时间" prop="startTime">
+            <el-date-picker clearable
+              v-model="queryParams.startTime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%;"
+              placeholder="请选择比对开始时间">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="8">
+          <el-form-item label="结束时间" prop="endTime">
+            <el-date-picker clearable
+              v-model="queryParams.endTime"
+              type="datetime"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              format="yyyy-MM-dd HH:mm:ss"
+              style="width: 100%;"
+              placeholder="请选择比对结束时间">
+            </el-date-picker>
+          </el-form-item>
+        </el-col>
+        <el-col :span="24">
+          <el-col :span="8">
+            <el-form-item label="职业类别" prop="jobStyle">
+              <el-select filterable v-model="queryParams.jobStyle"  placeholder="请选择职业类别">
+                <el-option
+                  v-for="dict in dict.type.occupational_category "
+                  :key="dict.label"
+                  :label="dict.label"
+                  :value="dict.label"
+                ></el-option>
+              </el-select>
+              </el-form-item>
+          </el-col>
+           <el-form-item>
+             <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-form-item>
+        </el-col>
+
+
+      </el-row>
+
+      
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="20">
+        <div style="color: #343434; font-size: 20px;">截至 <span style="color: #00b385;">2022年08月14日</span> 止   共计 <span style="color: #00b385;">33256</span> 次核酸</div>
+      </el-col>
+     <el-col :span="1.5">
+       <el-button
+         type="info"
+         plain
+         icon="el-icon-upload2"
+         size="mini"
+         @click="handleImport"
+         v-hasPermi="['system:info:import']"
+       >导入</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:info:export']"
+        >导出</el-button>
+      </el-col>
+      <!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> -->
+    </el-row>
+
+    <el-table v-loading="loading" :data="infoList" @selection-change="handleSelectionChange">
+      <el-table-column label="姓名" align="center" prop="name"  width="110"/>
+      <el-table-column label="性别" align="center" prop="gender" />
+      <el-table-column label="年龄" align="center" prop="age" />
+      <el-table-column label="身份证号码" align="center" prop="idCard" width="180"/>
+      <el-table-column label="联系号码" align="center" prop="phoneNum" width="110"/>
+      <el-table-column label="核酸采集时间" align="center" prop="nucleicCollectTime" width="102">
+        <template slot-scope="scope">
+          <span>{{ scope.row.nucleicCollectTime }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="核酸结果时间" align="center" prop="nucleicResultsTime" width="102">
+        <template slot-scope="scope">
+          <span>{{ scope.row.nucleicResultsTime}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="职业类别" align="center" prop="jobStyle" />
+      <el-table-column label="重点人群分类" align="center" prop="focusCrowdStyle" width="130"/>
+      <el-table-column label="检测频次" align="center" prop="detectionFrequency" />
+      <el-table-column label="比对开始时间" align="center" prop="startTime" width="102">
+        <template slot-scope="scope">
+          <span>{{ scope.row.startTime}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="比对结束时间" align="center" prop="endTime" width="102">
+        <template slot-scope="scope">
+          <span>{{ scope.row.endTime}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="是否异常" align="center" prop="detectionFrequency" />
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改导入人员信息对话框 -->
+    <!-- <el-dialog :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="name">
+          <el-input v-model="form.name" placeholder="请输入姓名" />
+        </el-form-item>
+        <el-form-item label="性别" prop="gender">
+          <el-input v-model="form.gender" placeholder="请输入性别" />
+        </el-form-item>
+        <el-form-item label="年龄" prop="age">
+          <el-input v-model="form.age" placeholder="请输入年龄" />
+        </el-form-item>
+        <el-form-item label="身份证号码" prop="idCard">
+          <el-input v-model="form.idCard" placeholder="请输入身份证号码" />
+        </el-form-item>
+        <el-form-item label="联系号码" prop="phoneNum">
+          <el-input v-model="form.phoneNum" placeholder="请输入联系号码" />
+        </el-form-item>
+        <el-form-item label="检测频次" prop="detectionNumber">
+          <el-input v-model="form.detectionNumber" placeholder="请输入检测频次" />
+        </el-form-item>
+        <el-form-item label="检测频次" prop="detectionScope">
+          <el-input v-model="form.detectionScope" placeholder="请输入检测频次" />
+        </el-form-item>
+        <el-form-item label="比对开始时间" prop="startTime">
+          <el-date-picker clearable
+            v-model="form.startTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择比对开始时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="比对结束时间" prop="endTime">
+          <el-date-picker clearable
+            v-model="form.endTime"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="请选择比对结束时间">
+          </el-date-picker>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog> -->
+
+
+    <!-- 用户导入对话框 -->
+    <el-dialog :title="upload.title" :visible.sync="upload.open" width="600px" append-to-body>
+      <el-upload
+        ref="upload"
+        :limit="1"
+        accept=".xlsx, .xls"
+        :headers="upload.headers"
+        :action="upload.url"
+        :disabled="upload.isUploading"
+        :on-progress="handleFileUploadProgress"
+        :on-success="handleFileSuccess"
+        :auto-upload="false"
+        :data="{focusCrowdStyle:upload.focusCrowdStyle,jobStyle:upload.jobStyle,startTime:upload.startTime,endTime:upload.endTime,detectionNumber:upload.detectionNumber,detectionScope:upload.detectionScope}"
+        drag
+        class="nhkiu"
+      >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">将文件拖到此处,或<em style="color: #00b385;">点击上传</em></div>
+        <div class="el-upload__tip text-center" slot="tip">
+          <div class="el-upload__tip" slot="tip">
+           <!-- <el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据 -->
+          </div>
+          <el-row>
+             <el-form ref="form" :model="upload" :rules="rules" label-width="80px">
+            <el-col :span="12">
+              <el-form-item label="开始时间" prop="startTime">
+             <el-date-picker clearable
+               v-model="upload.startTime"
+               type="datetime"
+               value-format="yyyy-MM-dd HH:mm:ss"
+               format="yyyy-MM-dd HH:mm:ss"
+               style="width: 100%;"
+               placeholder="请选择比对开始时间">
+             </el-date-picker>
+             </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="结束时间" prop="endTime">
+              <el-date-picker clearable
+                v-model="upload.endTime"
+                type="datetime"
+                value-format="yyyy-MM-dd HH:mm:ss"
+                format="yyyy-MM-dd HH:mm:ss"
+                style="width: 100%;"
+                placeholder="请选择比对结束时间">
+              </el-date-picker>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item :label="'次' + '\u3000\u3000' + '数'" prop="detectionNumber">
+               <el-input
+                 v-model="upload.detectionNumber"
+                 placeholder="请输入次数"
+                   min="0"
+                  type="number"
+                  @blur="nhkse"
+               />
+                </el-form-item>
+
+
+            </el-col>
+            <el-col :span="12">
+              <el-form-item :label="'天' + '\u3000\u3000' + '数'" prop="detectionScope">
+                <el-input
+                  v-model="upload.detectionScope"
+                  placeholder="请输入天数"
+                    min="0"
+                   type="number"
+                   @blur="nhksets"
+                  @keyup.enter.native="handleQuery"
+                />
+                </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="职业类别" prop="jobStyle">
+                <el-select filterable v-model="upload.jobStyle"  placeholder="请选择职业类别">
+                  <el-option
+                    v-for="dict in dict.type.occupational_category "
+                    :key="dict.label"
+                    :label="dict.label"
+                    :value="dict.label"
+                  ></el-option>
+                </el-select>
+                </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="人群分类" prop="focusCrowdStyle">
+                <el-select filterable v-model="upload.focusCrowdStyle"  placeholder="请选择人群分类">
+                  <el-option
+                    v-for="dict in dict.type.classification_population"
+                    :key="dict.label"
+                    :label="dict.label"
+                    :value="dict.label"
+                  ></el-option>
+                </el-select>
+                </el-form-item>
+            </el-col>
+            </el-form>
+          </el-row>
+          <span>仅允许导入xls、xlsx格式文件。</span>
+          <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline; color: #00b385;" @click="importTemplate">下载模板</el-link>
+        </div>
+      </el-upload>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitFileForm">确 定</el-button>
+        <el-button @click="nlmse">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listInfo, getInfo, delInfo, addInfo, updateInfo } from "@/api/system/info";
+import { getToken } from "@/utils/auth";
+export default {
+  dicts: ['occupational_category', 'classification_population'],
+  name: "Info",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 导入人员信息表格数据
+      infoList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        idCard: null,
+        phoneNum: null,
+        nucleicCollectTime: null,
+        nucleicResultsTime: null,
+        jobStyle: null,
+        focusCrowdStyle: null,
+        detectionFrequency: null,
+        startTime: null,
+        endTime: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        startTime: [
+          { required: true, message: "开始时间不能为空", trigger: "blur" }
+        ],
+        endTime:[
+          { required: true, message: "结束时间不能为空", trigger: "blur" }
+        ],
+        detectionNumber:[
+          { required: true, message: "次数不能为空", trigger: "blur" }
+        ],
+        detectionScope:[
+          { required: true, message: "天数不能为空", trigger: "blur" }
+        ],
+        jobStyle:[
+          { required: true, message: "职业类别不能为空", trigger: "blur" }
+        ],
+        focusCrowdStyle:[
+          { required: true, message: "人群分类不能为空", trigger: "blur" }
+        ]
+      },
+      // 用户导入参数
+      upload: {
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+          detectionNumber:null,
+          detectionScope:null,
+          startTime: null,
+          endTime: null,
+          jobStyle:null,
+          focusCrowdStyle:null,
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + "/system/info/importData"
+      },
+      postOptions:[]
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询导入人员信息列表 */
+    getList() {
+      this.loading = true;
+      listInfo(this.queryParams).then(response => {
+        this.infoList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        gender: null,
+        age: null,
+        idCard: null,
+        phoneNum: null,
+        nucleicCollectTime: null,
+        nucleicResultsTime: null,
+        jobStyle: null,
+        focusCrowdStyle: null,
+        detectionFrequency: null,
+        detectionNumber: null,
+        detectionScope: null,
+        deptName: null,
+        startTime: null,
+        endTime: null,
+        createBy: null,
+        createTime: null,
+        updateBy: null,
+        updateTime: null,
+        remark: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加导入人员信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改导入人员信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateInfo(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addInfo(this.form).then(response => {
+              this.$modal.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$modal.confirm('是否确认删除导入人员信息编号为"' + ids + '"的数据项?').then(function() {
+        return delInfo(ids);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/info/export', {
+        ...this.queryParams
+      }, `info_${new Date().getTime()}.xlsx`)
+    },
+    /** 导入按钮操作 */
+    handleImport() {
+      this.upload.title = "用户导入";
+      this.upload.open = true;
+    },
+    /** 下载模板操作 */
+    importTemplate() {
+      // this.download('system/user/importTemplate', {
+      // }, `user_template_${new Date().getTime()}.xlsx`)
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true;
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false;
+      this.upload.isUploading = false;
+      this.$refs.upload.clearFiles();
+      this.upload.detectionNumber = null
+      this.upload.startTime=null
+      this.upload.endTime= null
+      this.upload.jobStyle= null
+      this.upload.focusCrowdStyle= null
+      this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });
+      this.getList();
+    },
+    // 提交上传文件
+    submitFileForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.$refs.upload.submit();
+        }
+      });
+    },
+    // 次数失去焦点事件
+    nhkse(value){
+     console.log(this.upload.detectionNumber)
+     if(this.upload.detectionNumber < 0){
+       this.upload.detectionNumber = 0
+     }
+    },
+    // 天数失去焦点事件
+    nhksets(){
+      if(this.upload.detectionScope < 0){
+        this.upload.detectionScope = 0
+      }
+    },
+    // 取消
+    nlmse(){
+      this.upload.open = false
+      this.upload.detectionNumber = null
+      this.upload.startTime=null
+      this.upload.endTime= null
+      this.upload.jobStyle= null
+      this.upload.focusCrowdStyle= null
+    }
+  }
+};
+</script>
+<style type="text/css" lang="scss">
+.nhkiu{
+  .el-upload-dragger{
+    width: 560px !important;
+    margin-bottom: 20px;
+  }
+}
+.el-button--primary{
+  background-color: #00b385 !important;
+  border-color: #00b385 !important;
+}
+</style>