Ver Fonte

整体修改

wwh há 1 ano atrás
pai
commit
8342f9f2a1
39 ficheiros alterados com 1601 adições e 50 exclusões
  1. 46 0
      huimv-admin/pom.xml
  2. 3 2
      huimv-admin/src/main/java/com/huimv/guowei/admin/config/InterceptorConfig.java
  3. 51 20
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/BaseDuckInfoController.java
  4. 82 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/BatchController.java
  5. 9 5
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/BreedController.java
  6. 8 1
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckBodySizeInfoController.java
  7. 11 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckEggTextureInfoController.java
  8. 8 5
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckImmunityInfoController.java
  9. 13 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/BaseDuckInfo.java
  10. 52 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/Batch.java
  11. 7 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/Breed.java
  12. 5 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckBodySizeInfo.java
  13. 6 4
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckEggTextureInfo.java
  14. 5 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckImmunityInfo.java
  15. 18 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/PrintEntrtyChi.java
  16. 139 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/BaseDuckInfoImportData.java
  17. 53 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/BatchVo.java
  18. 16 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/mapper/BatchMapper.java
  19. 5 1
      huimv-admin/src/main/java/com/huimv/guowei/admin/mqtt/EnvControll/PushCallback.java
  20. 5 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IBaseDuckInfoService.java
  21. 20 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IBatchService.java
  22. 3 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IBreedService.java
  23. 3 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDepartureService.java
  24. 4 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDuckBodySizeInfoService.java
  25. 4 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDuckEggTextureInfoService.java
  26. 3 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDuckImmunityInfoService.java
  27. 162 8
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/BaseDuckInfoServiceImpl.java
  28. 77 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/BatchServiceImpl.java
  29. 53 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/BreedServiceImpl.java
  30. 10 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DepartureServiceImpl.java
  31. 56 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DuckBodySizeInfoServiceImpl.java
  32. 79 2
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DuckEggTextureInfoServiceImpl.java
  33. 51 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DuckImmunityInfoServiceImpl.java
  34. 1 1
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/EnvRegularCallEggServiceImpl.java
  35. 203 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/timer/NewEnvTimer.java
  36. 190 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/utils/ExcelImportSheet.java
  37. 112 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/utils/ExcelReader.java
  38. 23 1
      huimv-admin/src/main/java/com/huimv/guowei/admin/utils/Print.java
  39. 5 0
      huimv-admin/src/main/resources/mapper/BatchMapper.xml

+ 46 - 0
huimv-admin/pom.xml

@@ -128,6 +128,52 @@
             <version>1.1.0</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>3.15</version>
+        </dependency>
+
+        <!-- poi 读取word doc-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-scratchpad</artifactId>
+            <version>3.15</version>
+        </dependency>
+
+        <!-- poi 读取word docx-->
+        <!--        <dependency>-->
+        <!--            <groupId>fr.opensagres.xdocreport</groupId>-->
+        <!--            <artifactId>xdocreport</artifactId>-->
+        <!--            <version>1.0.6</version>-->
+        <!--        </dependency>-->
+
+        <!-- poi xml-->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.15</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml-schemas</artifactId>
+            <version>3.15</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <version>1.18.12</version>
+            <scope>provided</scope>
+        </dependency>
+
+
+        <dependency>
+            <groupId>fr.opensagres.xdocreport</groupId>
+            <artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>
+            <version>1.0.6</version>
+        </dependency>
 
     </dependencies>
 

+ 3 - 2
huimv-admin/src/main/java/com/huimv/guowei/admin/config/InterceptorConfig.java

@@ -28,7 +28,8 @@ public class InterceptorConfig implements WebMvcConfigurer {
     public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor(jwtInterceptor()).
                 excludePathPatterns("/admin/my/*")
-                .excludePathPatterns("/receive/feed","/base-duck-info/printDuck","/env-regular-call-egg/printEgg","/send/play","/energy-water/printWater","/energy-electricity/printElectricity",
-                        "/admin/cameraArea/getUrl");
+                .excludePathPatterns("/receive/feed","/base-duck-info/printDuck","/base-duck-info/printChi","/env-regular-call-egg/printEgg","/send/play","/energy-water/printWater","/energy-electricity/printElectricity",
+                        "/admin/cameraArea/getUrl","/breed/importData","/duck-immunity-info/importData","/base-duck-info/importData"
+                        ,"/duck-body-size-info/importData","/duck-egg-texture-info/importData");
     }
 }

+ 51 - 20
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/BaseDuckInfoController.java

@@ -54,10 +54,9 @@ public class BaseDuckInfoController {
     }
 
     @PostMapping("/addDuck")
-    public Result addDuck(HttpServletRequest httpServletRequest, @RequestParam(name = "imgUrl",required = false) MultipartFile imgUrl,
+    public Result addDuck(HttpServletRequest httpServletRequest, @RequestParam(name = "imgUrl", required = false) MultipartFile imgUrl,
                           @RequestParam(name = "farmId") String farmId,
                           @RequestParam(name = "unitList") String unitList,
-                          @RequestParam(name = "duckCode") String duckCode,
                           @RequestParam(name = "unitName") String unitName,
                           @RequestParam(name = "duckBreed") String duckBreed,
                           @RequestParam(name = "duckSex") String duckSex,
@@ -68,17 +67,23 @@ public class BaseDuckInfoController {
                           @RequestParam(name = "unitId") String unitId,
                           @RequestParam(name = "breedEnv") String breedEnv,
                           @RequestParam(name = "hatchRate", required = false) String hatchRate,
-                          @RequestParam(name = "fatherNum",required = false) String fatherNum,
-                          @RequestParam(name = "motherNum",required = false) String motherNum,
+                          @RequestParam(name = "fatherNum", required = false) String fatherNum,
+                          @RequestParam(name = "motherNum", required = false) String motherNum,
                           @RequestParam(name = "fatherGenotype") String fatherGenotype,
                           @RequestParam(name = "motherGenotype") String motherGenotype,
-                          @RequestParam(name = "specialNeeds") String specialNeeds) throws Exception {
+                          @RequestParam(name = "specialNeeds") String specialNeeds,
+                          @RequestParam(name = "batchNum") String batchNum,
+                          @RequestParam(name = "chiNum") String chiNum,
+                          @RequestParam(name = "jiaoNum") String jiaoNum,
+                          @RequestParam(name = "fatherChiNum",required = false) String fatherChiNum,
+                          @RequestParam(name = "fatherJiaoNum",required = false) String fatherJiaoNum,
+                          @RequestParam(name = "motherChiNum",required = false) String motherChiNum,
+                          @RequestParam(name = "motherJiaoNum",required = false) String motherJiaoNum) throws Exception {
         httpServletRequest.setCharacterEncoding("UTF-8");
         Map<String, String> map = new HashMap<>();
         map.put("unitList", unitList);
         map.put("unitName", unitName);
         map.put("farmId", farmId);
-        map.put("duckCode", duckCode);
         map.put("duckBreed", duckBreed);
         map.put("duckSex", duckSex);
         map.put("duckBirthPlace", duckBirthPlace);
@@ -93,7 +98,13 @@ public class BaseDuckInfoController {
         map.put("fatherGenotype", fatherGenotype);
         map.put("motherGenotype", motherGenotype);
         map.put("specialNeeds", specialNeeds);
-
+        map.put("batchNum", batchNum);
+        map.put("chiNum", chiNum);
+        map.put("jiaoNum", jiaoNum);
+        map.put("fatherChiNum", fatherChiNum);
+        map.put("fatherJiaoNum", fatherJiaoNum);
+        map.put("motherChiNum", motherChiNum);
+        map.put("motherJiaoNum", motherJiaoNum);
         return duckInfoService.addDuck(httpServletRequest, map, imgUrl);
     }
 
@@ -108,30 +119,30 @@ public class BaseDuckInfoController {
     }
 
     @PostMapping("/getLocationById")
-    public Result getLocationById(@RequestBody Map<String, String> paramsMap){
+    public Result getLocationById(@RequestBody Map<String, String> paramsMap) {
         String duckNum = paramsMap.get("duckNum");
         BaseDuckInfo baseDuckInfo = duckInfoService.getOne(new QueryWrapper<BaseDuckInfo>().eq("duck_num", duckNum));
-        if (ObjectUtil.isEmpty(baseDuckInfo)){
-            return new Result(10001,"鸭只不存在",false);
+        if (ObjectUtil.isEmpty(baseDuckInfo)) {
+            return new Result(10001, "鸭只不存在", false);
         }
         Map resultMap = new HashMap();
-        resultMap.put("unitName",baseDuckInfo.getUnitName());
-        resultMap.put("unitId",baseDuckInfo.getUnitId());
-        return new Result(ResultCode.SUCCESS,resultMap);
+        resultMap.put("unitName", baseDuckInfo.getUnitName());
+        resultMap.put("unitId", baseDuckInfo.getUnitId());
+        return new Result(ResultCode.SUCCESS, resultMap);
     }
 
     @PostMapping("/getDuckNumByUnitId")
-    public Result getDuckNumByUnitId(@RequestBody Map<String, String> paramsMap){
+    public Result getDuckNumByUnitId(@RequestBody Map<String, String> paramsMap) {
         String unitId = paramsMap.get("unitId");
         String farmId = paramsMap.get("farmId");
-        BaseDuckInfo baseDuckInfo = duckInfoService.getOne(new QueryWrapper<BaseDuckInfo>().eq("farm_id",farmId).eq("unit_id", unitId).eq("is_cage",0));
-        if (ObjectUtil.isEmpty(baseDuckInfo)){
-            return new Result(10001,"该笼位无鸭只",false);
+        BaseDuckInfo baseDuckInfo = duckInfoService.getOne(new QueryWrapper<BaseDuckInfo>().eq("farm_id", farmId).eq("unit_id", unitId).eq("is_cage", 0));
+        if (ObjectUtil.isEmpty(baseDuckInfo)) {
+            return new Result(10001, "该笼位无鸭只", false);
         }
         Map resultMap = new HashMap();
-        resultMap.put("unitName",baseDuckInfo.getUnitName());
-        resultMap.put("duckNum",baseDuckInfo.getDuckNum());
-        return new Result(ResultCode.SUCCESS,resultMap);
+        resultMap.put("unitName", baseDuckInfo.getUnitName());
+        resultMap.put("duckNum", baseDuckInfo.getDuckNum());
+        return new Result(ResultCode.SUCCESS, resultMap);
     }
 
     @GetMapping("/printDuck")
@@ -143,11 +154,31 @@ public class BaseDuckInfoController {
         PdfUtil.returnPdfStream3(response, path, "鸭只档案列表");
     }
 
+    @GetMapping("/printChi")
+    public void printChi(HttpServletResponse response, @RequestParam(name = "farmId") String farmId) throws Exception {
+        Map<String, String> map = new HashMap<>();
+        map.put("farmId", farmId);
+        duckInfoService.printChi(response, map);
+        String path = "/opt/guowei/chi.xls";
+        PdfUtil.returnPdfStream3(response, path, "最新笼位列表");
+    }
+
+    //excel导入
+    @PostMapping("/importData")
+    public Result importData(HttpServletRequest httpServletRequest, @RequestParam(name = "file") MultipartFile file,
+                             @RequestParam(name = "farmId") String farmId) throws Exception {
+        Map<String, String> map = new HashMap<>();
+        map.put("farmId", farmId);
+        return duckInfoService.importData(httpServletRequest, map, file);
+    }
+
+
     //大屏
     @RequestMapping("/listDuckByScreen")
     public Result listDuckByScreen(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) {
         return duckInfoService.listDuckByScreen(httpServletRequest, paramsMap);
     }
+
     @RequestMapping("/listDuckByScreen2")
     public Result listDuckByScreen2(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) {
         return duckInfoService.listDuckByScreen2(httpServletRequest, paramsMap);

+ 82 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/BatchController.java

@@ -0,0 +1,82 @@
+package com.huimv.guowei.admin.controller;
+
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.huimv.guowei.admin.common.utils.Result;
+import com.huimv.guowei.admin.entity.Batch;
+import com.huimv.guowei.admin.service.impl.BatchServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+/**
+ * <p>
+ * 代次号 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2023-11-28
+ */
+@RestController
+@RequestMapping("/batch")
+@CrossOrigin
+public class BatchController {
+
+    @Autowired
+    private BatchServiceImpl batchService;
+
+    @RequestMapping("/listBatch")
+    public Result listDuck(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) {
+        return batchService.list(httpServletRequest, paramsMap);
+    }
+
+    @RequestMapping("/addBatch")
+    public Result addBatch(HttpServletRequest httpServletRequest, @RequestBody Batch batch) {
+        QueryWrapper<Batch> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("farm_id", batch.getFarmId()).eq("batch_num", batch.getBatchNum());
+        Batch one = batchService.getOne(queryWrapper);
+        if (ObjectUtil.isNotEmpty(one)) {
+            return new Result(10001, "添加失败,代次号已存在", false);
+        } else {
+            batchService.save(batch);
+            return new Result(10000, "添加成功!", true);
+        }
+
+    }
+    @RequestMapping("/deleteBatch")
+    public Result deleteBatch(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        QueryWrapper<Batch> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("id", id);
+        Batch batch = batchService.getOne(queryWrapper);
+        if (batch.getIsEnable() == 0) {
+            return new Result(10001, "删除失败,代次号正在被使用!", true);
+        } else {
+            batchService.removeById(id);
+            return new Result(10000, "删除成功!", true);
+        }
+
+    }
+
+    @RequestMapping("/editBatch")
+    public Result editBatch(HttpServletRequest httpServletRequest,  @RequestBody Batch batch) {
+        QueryWrapper<Batch> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("farm_id", batch.getFarmId()).eq("batch_num", batch.getBatchNum())
+                .ne("id", batch.getId());
+        Batch one = batchService.getOne(queryWrapper);
+        if (ObjectUtil.isNotEmpty(one)) {
+            return new Result(10001, "修改失败,代次号已存在", false);
+        } else {
+            batchService.updateById(batch);
+            return new Result(10000, "修改成功!", true);
+        }
+
+    }
+}

+ 9 - 5
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/BreedController.java

@@ -12,16 +12,14 @@ import com.huimv.guowei.admin.entity.DuckHealthInfo;
 import com.huimv.guowei.admin.service.IBaseDuckInfoService;
 import com.huimv.guowei.admin.service.IBreedService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -129,4 +127,10 @@ public class BreedController {
         breedService.removeById(id);
         return new Result(10000, "删除成功!", true);
     }
+
+    //excel导入
+    @PostMapping("/importData")
+    public Result addDuck(HttpServletRequest httpServletRequest, @RequestParam(name = "file") MultipartFile file) throws Exception {
+        return breedService.importData(httpServletRequest, file);
+    }
 }

+ 8 - 1
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckBodySizeInfoController.java

@@ -13,7 +13,10 @@ import org.apache.commons.lang.ObjectUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -92,5 +95,9 @@ public class DuckBodySizeInfoController {
         return duckBodySizeInfoService.listPageInfo(paramsMap);
     }
 
-
+    //excel导入
+    @PostMapping("/importData")
+    public Result importData(HttpServletRequest httpServletRequest, @RequestParam(name = "file") MultipartFile file) throws Exception {
+        return duckBodySizeInfoService.importData(httpServletRequest,file);
+    }
 }

+ 11 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckEggTextureInfoController.java

@@ -10,8 +10,11 @@ import com.huimv.guowei.admin.service.IBaseDuckInfoService;
 import com.huimv.guowei.admin.service.IDuckEggTextureInfoService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -77,4 +80,12 @@ public class DuckEggTextureInfoController {
         return duckEggTextureInfoService.listPageInfo(paramsMap);
     }
 
+    //excel导入
+    @PostMapping("/importData")
+    public Result importData(HttpServletRequest httpServletRequest, @RequestParam(name = "file") MultipartFile file,
+                             @RequestParam(name = "farmId") String farmId) throws Exception {
+        Map<String, String> map = new HashMap<>();
+        map.put("farmId", farmId);
+        return duckEggTextureInfoService.importData(httpServletRequest, map, file);
+    }
 }

+ 8 - 5
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckImmunityInfoController.java

@@ -6,11 +6,8 @@ import com.huimv.guowei.admin.common.utils.ResultCode;
 import com.huimv.guowei.admin.entity.DuckImmunityInfo;
 import com.huimv.guowei.admin.service.IDuckImmunityInfoService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.CrossOrigin;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import java.text.ParseException;
@@ -71,4 +68,10 @@ public class DuckImmunityInfoController {
         String id = paramsMap.get("id");
         return new Result(ResultCode.SUCCESS,infoService.getById(id));
     }
+
+    //excel导入
+    @PostMapping("/importData")
+    public Result addDuck(HttpServletRequest httpServletRequest,@RequestParam(name = "file") MultipartFile files) throws Exception {
+        return infoService.importData(httpServletRequest, files);
+    }
 }

+ 13 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/BaseDuckInfo.java

@@ -122,6 +122,19 @@ public class BaseDuckInfo implements Serializable {
 
     private String unitList;
 
+    private String batchNum;
+
+    private String chiNum;
+
+    private String jiaoNum;
+
+    private String fatherChiNum;
+
+    private String fatherJiaoNum;
+
+    private String motherChiNum;
+
+    private String motherJiaoNum;
 
 
 }

+ 52 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/Batch.java

@@ -0,0 +1,52 @@
+package com.huimv.guowei.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 代次号
+ * </p>
+ *
+ * @author author
+ * @since 2023-11-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("batch")
+public class Batch implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 批次号
+     */
+    private String batchNum;
+
+    /**
+     * 牧场编码
+     */
+    private Integer farmId;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 是否启用 0为启用 1为不启用
+     */
+    private Integer isEnable;
+
+
+}

+ 7 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/Breed.java

@@ -56,5 +56,12 @@ public class Breed implements Serializable {
 
     private String unitName;
 
+    private String maleChiNum;
+
+    private String femaleChiNum;
+
+    private String maleJiaoNum;
+
+    private String femaleJiaoNum;
 
 }

+ 5 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckBodySizeInfo.java

@@ -100,5 +100,10 @@ public class DuckBodySizeInfo implements Serializable {
 
     private Integer farmId;
 
+    private String chiNum;
+
+    private String jiaoNum;
+
+    private String batchNum;
 
 }

+ 6 - 4
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckEggTextureInfo.java

@@ -59,10 +59,7 @@ public class DuckEggTextureInfo implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
     private Date determineTime;
 
-    /**
-     * 鸭蛋种类 1受精蛋 2肉浮蛋
-     */
-//    private Integer eggType;
+
     /**
      * 鸭蛋编号
      */
@@ -132,5 +129,10 @@ public class DuckEggTextureInfo implements Serializable {
 
     private Integer farmId;
 
+    private String chiNum;
+
+    private String jiaoNum;
+
+    private String batchNum;
 
 }

+ 5 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckImmunityInfo.java

@@ -54,5 +54,10 @@ public class DuckImmunityInfo implements Serializable {
 
     private String unitName;
 
+    private String chiNum;
+
+    private String jiaoNum;
+
+    private String batchNum;
 
 }

+ 18 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/PrintEntrtyChi.java

@@ -0,0 +1,18 @@
+package com.huimv.guowei.admin.entity;
+
+import lombok.Data;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-14
+ */
+@Data
+public class PrintEntrtyChi {
+    private String unitName;
+    private String chiNum;
+    private String jiaoNum;
+ }

+ 139 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/BaseDuckInfoImportData.java

@@ -0,0 +1,139 @@
+package com.huimv.guowei.admin.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("base_duck_info")
+public class BaseDuckInfoImportData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String duckNum;
+
+    /**
+     * 1北京鸭、2连城白鸭、3山麻鸭、4攸县麻鸭、5白改鸭、6缙云麻鸭、7绍兴鸭(带圈白翼梢)、8绍兴鸭(红毛绿翼梢)、9绍兴鸭(白羽绍鸭)
+     */
+    private String duckBreed;
+
+    /**
+     * 0雄性,1雌性
+     */
+    private String duckSex;
+
+    /**
+     * 出生地
+     */
+    private String duckBirthplace;
+
+    /**
+     * 出生日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date duckBirthday;
+
+    /**
+     * 基因型
+     */
+    private String genotype;
+
+    /**
+     * 当前体重
+     */
+    private String nowWeight;
+
+    /**
+     * 位置 id
+     */
+    private Integer unitId;
+
+    /**
+     * 位置
+     */
+    private String unitName;
+
+    //饲养环境
+    private  String breedingEnv;
+
+    //特殊需求
+    private  String specialNeeds;
+
+    // 母系 基因
+    private  String motherGenotype;
+
+    // 父系 基因
+    private  String fatherGenotype;
+
+
+    /**
+     * 出壳率
+     */
+    private BigDecimal hatchRate;
+
+    /**
+     * 日龄
+     */
+    private Integer dayAge;
+
+    /**
+     * 父系信息
+     */
+    private String fatherNum;
+
+    /**
+     * 母系信息
+     */
+    private String motherNum;
+
+    /**
+     * 鸭子图片
+     */
+    private String duckImgUrl;
+
+    /**
+     * 0未出笼 1已出笼
+     */
+    private Integer isCage;
+
+    private Integer farmId;
+
+    private String unitList;
+
+    private String batchNum;
+
+    private String chiNum;
+
+    private String jiaoNum;
+
+    private String fatherChiNum;
+
+    private String fatherJiaoNum;
+
+    private String motherChiNum;
+
+    private String motherJiaoNum;
+
+
+}

+ 53 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/BatchVo.java

@@ -0,0 +1,53 @@
+package com.huimv.guowei.admin.entity.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 代次号
+ * </p>
+ *
+ * @author author
+ * @since 2023-11-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("batch")
+public class BatchVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 批次号
+     */
+    private String batchNum;
+
+    /**
+     * 牧场编码
+     */
+    private Integer farmId;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 是否启用 0为启用 1为不启用
+     */
+    private Integer isEnable;
+
+    private Integer count;
+}

+ 16 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/mapper/BatchMapper.java

@@ -0,0 +1,16 @@
+package com.huimv.guowei.admin.mapper;
+
+import com.huimv.guowei.admin.entity.Batch;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 代次号 Mapper 接口
+ * </p>
+ *
+ * @author author
+ * @since 2023-11-28
+ */
+public interface BatchMapper extends BaseMapper<Batch> {
+
+}

+ 5 - 1
huimv-admin/src/main/java/com/huimv/guowei/admin/mqtt/EnvControll/PushCallback.java

@@ -198,7 +198,11 @@ public class PushCallback implements MqttCallbackExtended {
                         } else {
                             water.setOriginalValue(waterMeter2.toString());
                             BigDecimal bd = new BigDecimal(water1.getOriginalValue());
-                            water.setWaterValue(waterMeter2.subtract(bd).toString());
+                            if (bd.compareTo(BigDecimal.ZERO) == -1) {
+                                water.setWaterValue(BigDecimal.ZERO.toString());
+                            } else {
+                                water.setWaterValue(waterMeter2.subtract(bd).toString());
+                            }
                         }
                     } else {
                         water.setWaterValue(waterMeter2.toString());

+ 5 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/IBaseDuckInfoService.java

@@ -30,8 +30,13 @@ public interface IBaseDuckInfoService extends IService<BaseDuckInfo> {
 
     void printDuck(HttpServletResponse response, Map<String,String> paramsMap) throws Exception;
 
+    void printChi(HttpServletResponse response, Map<String,String> paramsMap) throws Exception;
+
     void updateDayAge();
 
+    Result importData(HttpServletRequest httpServletRequest, Map<String,String> paramsMap, MultipartFile files);
+
+
     //大屏
     Result listDuckByScreen(HttpServletRequest httpServletRequest, Map<String,String> paramsMap);
 

+ 20 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/IBatchService.java

@@ -0,0 +1,20 @@
+package com.huimv.guowei.admin.service;
+
+import com.huimv.guowei.admin.common.utils.Result;
+import com.huimv.guowei.admin.entity.Batch;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+/**
+ * <p>
+ * 代次号 服务类
+ * </p>
+ *
+ * @author author
+ * @since 2023-11-28
+ */
+public interface IBatchService extends IService<Batch> {
+    Result list(HttpServletRequest httpServletRequest, Map<String, String> paramsMap);
+}

+ 3 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/IBreedService.java

@@ -3,6 +3,7 @@ package com.huimv.guowei.admin.service;
 import com.huimv.guowei.admin.common.utils.Result;
 import com.huimv.guowei.admin.entity.Breed;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
@@ -19,4 +20,6 @@ public interface IBreedService extends IService<Breed> {
     Result list(HttpServletRequest httpServletRequest, Map<String,String> paramsMap);
 
     Result listSelect(HttpServletRequest httpServletRequest, Map<String,String> paramsMap);
+
+    Result importData(HttpServletRequest httpServletRequest, MultipartFile files);
 }

+ 3 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDepartureService.java

@@ -19,4 +19,7 @@ public interface IDepartureService extends IService<Departure> {
     Result list(HttpServletRequest httpServletRequest, Map<String,String> paramsMap);
 
     Result listSelect(HttpServletRequest httpServletRequest, Map<String,String> paramsMap);
+
+    Result listBatch(HttpServletRequest httpServletRequest, Map<String,String> paramsMap);
+
 }

+ 4 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDuckBodySizeInfoService.java

@@ -3,7 +3,9 @@ package com.huimv.guowei.admin.service;
 import com.huimv.guowei.admin.common.utils.Result;
 import com.huimv.guowei.admin.entity.DuckBodySizeInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -21,4 +23,6 @@ public interface IDuckBodySizeInfoService extends IService<DuckBodySizeInfo> {
     Result listPageInfo(Map<String, String> paramsMap);
 
     Result getLastInfo(Map<String, String> paramsMap);
+
+    Result importData(HttpServletRequest httpServletRequest, MultipartFile files);
 }

+ 4 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDuckEggTextureInfoService.java

@@ -3,7 +3,9 @@ package com.huimv.guowei.admin.service;
 import com.huimv.guowei.admin.common.utils.Result;
 import com.huimv.guowei.admin.entity.DuckEggTextureInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -19,4 +21,6 @@ public interface IDuckEggTextureInfoService extends IService<DuckEggTextureInfo>
     Result listLimitInfo(Map<String, String> paramsMap);
 
     Result listPageInfo(Map<String, String> paramsMap);
+
+    Result importData(HttpServletRequest httpServletRequest, Map<String,String> paramsMap, MultipartFile files);
 }

+ 3 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDuckImmunityInfoService.java

@@ -3,6 +3,7 @@ package com.huimv.guowei.admin.service;
 import com.huimv.guowei.admin.common.utils.Result;
 import com.huimv.guowei.admin.entity.DuckImmunityInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import java.text.ParseException;
@@ -24,4 +25,6 @@ public interface IDuckImmunityInfoService extends IService<DuckImmunityInfo> {
     Result listByH5(HttpServletRequest httpServletRequest, Map<String,String> paramsMap);
 
     Result listSelect(HttpServletRequest httpServletRequest, Map<String,String> paramsMap);
+
+    Result importData(HttpServletRequest httpServletRequest, MultipartFile files);
 }

+ 162 - 8
huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/BaseDuckInfoServiceImpl.java

@@ -13,13 +13,17 @@ import com.huimv.guowei.admin.common.utils.Result;
 import com.huimv.guowei.admin.common.utils.ResultCode;
 import com.huimv.guowei.admin.common.utils.UploadImage;
 import com.huimv.guowei.admin.entity.*;
+import com.huimv.guowei.admin.entity.vo.BaseDuckInfoImportData;
 import com.huimv.guowei.admin.entity.vo.BaseDuckInfoVo;
 import com.huimv.guowei.admin.entity.vo.EnvMoveCallVo;
 import com.huimv.guowei.admin.entity.vo.EnvRegularCallFeedingVo;
 import com.huimv.guowei.admin.mapper.*;
 import com.huimv.guowei.admin.service.IBaseDuckInfoService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.guowei.admin.utils.ExcelImportSheet;
 import com.huimv.guowei.admin.utils.Print;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
@@ -27,6 +31,7 @@ import org.springframework.web.multipart.MultipartFile;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.io.InputStream;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.text.ParseException;
@@ -63,11 +68,14 @@ public class BaseDuckInfoServiceImpl extends ServiceImpl<BaseDuckInfoMapper, Bas
     private BaseDuckBreedImgMapper imgMapper;
     @Autowired
     private DepartureMapper departureMapper;
+    @Autowired
+    private BaseBuildingMapper buildingMapper;
+
 
     @Override
     public Result listDuck(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
-        String location = paramsMap.get("duckCode");//前端传来的是编号
-//        String location = paramsMap.get("location");//前端传来的是位置名字
+        String chiNum = paramsMap.get("chiNum");//前端传来的是编号
+        String location = paramsMap.get("location");//前端传来的是位置名字
         String farmId = paramsMap.get("farmId");//场的编码
         String pageNum = paramsMap.get("pageNum");
         String pageSize = paramsMap.get("pageSize");
@@ -78,7 +86,7 @@ public class BaseDuckInfoServiceImpl extends ServiceImpl<BaseDuckInfoMapper, Bas
             pageSize = "10";
         }
         QueryWrapper<BaseDuckInfo> queryWrapper = new QueryWrapper<>();
-        queryWrapper/*.like(StringUtils.isNotBlank(code), "duck_num", code)*/
+        queryWrapper.like(StringUtils.isNotBlank(chiNum), "chi_num", chiNum)
                 .like(StringUtils.isNotBlank(location), "unit_name", location).eq("farm_id", farmId).orderByDesc("id");
         Page<BaseDuckInfo> page = new Page<>(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
         return new Result(ResultCode.SUCCESS, duckInfoMapper.selectPage(page, queryWrapper));
@@ -87,7 +95,17 @@ public class BaseDuckInfoServiceImpl extends ServiceImpl<BaseDuckInfoMapper, Bas
     @Override
     public Result addDuck(HttpServletRequest httpServletRequest, Map<String, String> paramsMap, MultipartFile imgUrl) throws ParseException, IOException {
         BaseDuckInfo baseDuckInfo = new BaseDuckInfo();
-        baseDuckInfo.setDuckNum(paramsMap.get("duckCode"));
+        QueryWrapper<BaseDuckInfo> queryWrapper3 = new QueryWrapper<>();
+        queryWrapper3.eq("farm_id", paramsMap.get("farmId")).orderByDesc("id").last(" limit 1");
+        BaseDuckInfo info = duckInfoMapper.selectOne(queryWrapper3);
+        if (ObjectUtil.isNotEmpty(info)) {
+            baseDuckInfo.setDuckNum(String.valueOf(Integer.parseInt(info.getDuckNum()) + 1));
+        } else {
+            baseDuckInfo.setDuckNum("20231124");
+        }
+        baseDuckInfo.setBatchNum(paramsMap.get("batchNum"));
+        baseDuckInfo.setChiNum(paramsMap.get("chiNum"));
+        baseDuckInfo.setJiaoNum(paramsMap.get("jiaoNum"));
         baseDuckInfo.setUnitList(paramsMap.get("unitList"));
         baseDuckInfo.setUnitName(paramsMap.get("unitName"));
         baseDuckInfo.setFarmId(Integer.parseInt(paramsMap.get("farmId")));
@@ -116,6 +134,10 @@ public class BaseDuckInfoServiceImpl extends ServiceImpl<BaseDuckInfoMapper, Bas
         String fatherNum = paramsMap.get("fatherNum");
         String motherNum = paramsMap.get("motherNum");
         String duckCode = paramsMap.get("duckCode");
+        baseDuckInfo.setFatherChiNum(paramsMap.get("fatherChiNum"));
+        baseDuckInfo.setFatherJiaoNum(paramsMap.get("fatherJiaoNum"));
+        baseDuckInfo.setMotherChiNum(paramsMap.get("motherChiNum"));
+        baseDuckInfo.setMotherJiaoNum(paramsMap.get("motherJiaoNum"));
         if (StringUtils.isNotBlank(fatherNum) && StringUtils.isNotBlank(motherNum)) {
             if (fatherNum.equals(motherNum) ||
                     motherNum.equals(duckCode) ||
@@ -129,7 +151,7 @@ public class BaseDuckInfoServiceImpl extends ServiceImpl<BaseDuckInfoMapper, Bas
             if (ObjectUtil.isEmpty(father)) {
                 return new Result(10001, "父亲编号不存在,请重新输入!", false);
             } else {
-                if (father.getDuckSex() == 1) {
+                if (father.getDuckSex()==1) {
                     return new Result(10001, "该编号为母亲编号,请重新填写!", false);
                 }
                 if (father.getDayAge() < 100) {
@@ -141,7 +163,7 @@ public class BaseDuckInfoServiceImpl extends ServiceImpl<BaseDuckInfoMapper, Bas
                     if (ObjectUtil.isEmpty(mother)) {
                         return new Result(10001, "母亲编号不存在,请重新输入!", false);
                     } else {
-                        if (mother.getDuckSex() == 0) {
+                        if (mother.getDuckSex() ==0) {
                             return new Result(10001, "该编号为父亲编号,请重新填写!", false);
                         }
 
@@ -245,7 +267,7 @@ public class BaseDuckInfoServiceImpl extends ServiceImpl<BaseDuckInfoMapper, Bas
             if (ObjectUtil.isEmpty(father)) {
                 return new Result(10001, "父亲编号不存在,请重新输入!", false);
             } else {
-                if (father.getDuckSex() == 1) {
+                if (father.getDuckSex() ==1) {
                     return new Result(10001, "该编号为母亲编号,请重新填写!", false);
                 }
 
@@ -258,7 +280,7 @@ public class BaseDuckInfoServiceImpl extends ServiceImpl<BaseDuckInfoMapper, Bas
                     if (ObjectUtil.isEmpty(mother)) {
                         return new Result(10001, "母亲编号不存在,请重新输入!", false);
                     } else {
-                        if (mother.getDuckSex() == 0) {
+                        if (mother.getDuckSex() ==0) {
                             return new Result(10001, "该编号为父亲编号,请重新填写!", false);
                         }
 
@@ -329,11 +351,143 @@ public class BaseDuckInfoServiceImpl extends ServiceImpl<BaseDuckInfoMapper, Bas
     }
 
     @Override
+    public void printChi(HttpServletResponse response, Map<String, String> paramsMap) throws Exception {
+        String farmId = paramsMap.get("farmId");
+        QueryWrapper<BaseDuckInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("farm_id", farmId).eq("is_cage", 0);
+        List<BaseDuckInfo> baseDuckInfos = duckInfoMapper.selectList(queryWrapper);
+        Print.printChi(baseDuckInfos);
+    }
+
+    @Override
     public void updateDayAge() {
         duckInfoMapper.updateDayAge();
     }
 
     @Override
+    public Result importData(HttpServletRequest httpServletRequest,  Map<String,String> paramsMap,MultipartFile files) {
+        String farmId = paramsMap.get("farmId");
+        Map<String , String> map = new HashMap<>();
+        //表头与键值对的映射关系
+        map.put("翅号" , "chiNum");
+        map.put("脚号" , "jiaoNum");
+        map.put("代次号" , "batchNum");
+        map.put("性别" , "duckSex");
+        map.put("品种" , "duckBreed");
+        map.put("来源" , "duckBirthplace");
+        map.put("基因型" , "genotype");
+        map.put("出生日期" , "duckBirthday");
+        map.put("位置" , "unitName");
+        map.put("当前体重" , "nowWeight");
+        map.put("饲养环境" , "breedingEnv");
+        map.put("特殊需求" , "specialNeeds");
+        map.put("父亲翅号" , "fatherChiNum");
+        map.put("父亲脚号" , "fatherJiaoNum");
+        map.put("母亲翅号" , "motherChiNum");
+        map.put("母亲脚号" , "motherJiaoNum");
+        try(
+                //这里面的对象会自动关闭
+                InputStream in = files.getInputStream();
+                Workbook workbook = ExcelImportSheet.getTypeFromExtends(in , files.getOriginalFilename())
+        ) {
+
+            //根据名称获取单张表对象 也可以使用getSheetAt(int index)获取单张表的对象 获取第一张表
+            Sheet sheet = workbook.getSheetAt(0);
+            List<BaseDuckInfoImportData> list = ExcelImportSheet.getListFromExcel(sheet , BaseDuckInfoImportData.class , map);
+
+            for (BaseDuckInfoImportData breed : list) {
+                //底层数据库操作 insert什么的
+                QueryWrapper<BaseBuilding> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("farm_id", farmId).eq("build_name", breed.getUnitName());
+                BaseBuilding baseBuilding = buildingMapper.selectOne(queryWrapper);
+                breed.setUnitId(baseBuilding.getId());
+                breed.setUnitList(baseBuilding.getParentId() + "," + baseBuilding.getId());
+                breed.setFarmId(Integer.parseInt(farmId));
+                if ("雄性".equals(breed.getDuckSex())) {
+                    breed.setDuckSex("0");
+                }
+                if ("雌性".equals(breed.getDuckSex())) {
+                    breed.setDuckSex("1");
+                }
+                QueryWrapper<BaseDuckBreedImg> queryWrapper1 = new QueryWrapper<>();
+                if ("北京鸭".equals(breed.getDuckBreed())) {
+                    queryWrapper1.eq("duck_breed", 1);
+                    BaseDuckBreedImg img = imgMapper.selectOne(queryWrapper1);
+                    breed.setDuckBreed("1");
+                    breed.setDuckImgUrl(img.getImgUrl());
+                }else if ("连城白鸭".equals(breed.getDuckBreed())) {
+                    queryWrapper1.eq("duck_breed", 2);
+                    BaseDuckBreedImg img = imgMapper.selectOne(queryWrapper1);
+                    breed.setDuckBreed("2");
+                    breed.setDuckImgUrl(img.getImgUrl());
+                }else if ("山麻鸭".equals(breed.getDuckBreed())) {
+                    queryWrapper1.eq("duck_breed", 3);
+                    BaseDuckBreedImg img = imgMapper.selectOne(queryWrapper1);
+                    breed.setDuckBreed("3");
+                    breed.setDuckImgUrl(img.getImgUrl());
+                } else if ("攸县麻鸭".equals(breed.getDuckBreed())) {
+                    queryWrapper1.eq("duck_breed", 4);
+                    BaseDuckBreedImg img = imgMapper.selectOne(queryWrapper1);
+                    breed.setDuckBreed("4");
+                    breed.setDuckImgUrl(img.getImgUrl());
+                }else if ("白改鸭".equals(breed.getDuckBreed())) {
+                    queryWrapper1.eq("duck_breed", 5);
+                    BaseDuckBreedImg img = imgMapper.selectOne(queryWrapper1);
+                    breed.setDuckBreed("5");
+                    breed.setDuckImgUrl(img.getImgUrl());
+                }else if ("缙云麻鸭".equals(breed.getDuckBreed())) {
+                    queryWrapper1.eq("duck_breed", 6);
+                    BaseDuckBreedImg img = imgMapper.selectOne(queryWrapper1);
+                    breed.setDuckBreed("6");
+                    breed.setDuckImgUrl(img.getImgUrl());
+                }else if ("绍兴鸭(带圈白翼梢)".equals(breed.getDuckBreed())) {
+                    queryWrapper1.eq("duck_breed", 7);
+                    BaseDuckBreedImg img = imgMapper.selectOne(queryWrapper1);
+                    breed.setDuckBreed("7");
+                    breed.setDuckImgUrl(img.getImgUrl());
+                }else if ("绍兴鸭(红毛绿翼梢)".equals(breed.getDuckBreed())) {
+                    queryWrapper1.eq("duck_breed", 8);
+                    BaseDuckBreedImg img = imgMapper.selectOne(queryWrapper1);
+                    breed.setDuckBreed("8");
+                    breed.setDuckImgUrl(img.getImgUrl());
+                } else if ("绍兴鸭(白羽绍鸭)".equals(breed.getDuckBreed())) {
+                    queryWrapper1.eq("duck_breed", 9);
+                    BaseDuckBreedImg img = imgMapper.selectOne(queryWrapper1);
+                    breed.setDuckBreed("9");
+                    breed.setDuckImgUrl(img.getImgUrl());
+                }
+                QueryWrapper<BaseDuckInfo> queryWrapper3 = new QueryWrapper<>();
+                queryWrapper3.eq("farm_id", farmId).orderByDesc("id").last(" limit 1");
+                BaseDuckInfo info = duckInfoMapper.selectOne(queryWrapper3);
+                if (ObjectUtil.isNotEmpty(info)) {
+                    breed.setDuckNum(String.valueOf(Integer.parseInt(info.getDuckNum()) + 1));
+                } else {
+                    breed.setDuckNum("20231124");
+                }
+                BaseDuckInfo baseDuckInfo = new BaseDuckInfo();
+                BeanUtil.copyProperties(breed, baseDuckInfo);
+
+                Date birthday = breed.getDuckBirthday();
+                Date date2 = new Date();
+                // 计算两个日期之间的天数
+                int between = daysBetween(birthday, date2);
+                baseDuckInfo.setDayAge(between);
+                baseDuckInfo.setDuckSex(Integer.parseInt(breed.getDuckSex()));
+                baseDuckInfo.setDuckBreed(Integer.parseInt(breed.getDuckBreed()));
+                baseDuckInfo.setIsCage(0);
+                baseMapper.insert(baseDuckInfo);
+                System.out.println(breed.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new Result(10001, "数据格式异常!", false);
+        }finally {
+            //写着好看的
+        }
+        return new Result(10000, "保存成功!", true);
+    }
+
+    @Override
     public Result listDuckByScreen(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
         String farmId = paramsMap.get("farmId");
         String duckNum = paramsMap.get("duckNum");//鸭只编号

+ 77 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/BatchServiceImpl.java

@@ -0,0 +1,77 @@
+package com.huimv.guowei.admin.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huimv.guowei.admin.common.utils.Result;
+import com.huimv.guowei.admin.common.utils.ResultCode;
+import com.huimv.guowei.admin.entity.BaseDuckInfo;
+import com.huimv.guowei.admin.entity.Batch;
+import com.huimv.guowei.admin.entity.vo.BatchVo;
+import com.huimv.guowei.admin.mapper.BaseDuckInfoMapper;
+import com.huimv.guowei.admin.mapper.BatchMapper;
+import com.huimv.guowei.admin.service.IBatchService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 代次号 服务实现类
+ * </p>
+ *
+ * @author author
+ * @since 2023-11-28
+ */
+@Service
+public class BatchServiceImpl extends ServiceImpl<BatchMapper, Batch> implements IBatchService {
+
+    @Autowired
+    private BatchMapper batchMapper;
+    @Autowired
+    private BaseDuckInfoMapper infoMapper;
+    @Override
+    public Result list(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
+        String farmId = paramsMap.get("farmId");
+        QueryWrapper<Batch> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("farm_id", farmId);
+        List<Batch> batches = batchMapper.selectList(queryWrapper);
+        List<BatchVo> list = new ArrayList<>();
+        for (Batch batch : batches) {
+            QueryWrapper<BaseDuckInfo> queryWrapper1 = new QueryWrapper<>();
+            queryWrapper1.eq("farm_id", farmId).eq("batch_num", batch.getBatchNum());
+            Integer count = infoMapper.selectCount(queryWrapper1);
+            BatchVo batchVo = new BatchVo();
+            BeanUtil.copyProperties(batch, batchVo);
+            batchVo.setCount(count);
+            list.add(batchVo);
+        }
+        String pageNum = paramsMap.get("pageNum");
+        String pageSize = paramsMap.get("pageSize");
+        if (pageNum == null || "".equals(pageNum)) {
+            pageNum = "1";
+        }
+        if (pageSize == null || "".equals(pageSize)) {
+            pageSize = "10";
+        }
+        int page = Integer.parseInt(pageNum);//相当于pageNo-------分页中的pi
+        int count = Integer.parseInt(pageSize);//相当于pageSize-------分页中的ps
+        int size = list.size();
+        int pageCount=size/count;
+        int fromIndex = count * (page - 1);
+        int toIndex = fromIndex + count;
+        if (toIndex >= size) {
+            toIndex = size;
+        }
+        if(page>pageCount+1){
+            fromIndex=0;
+            toIndex=0;
+        }
+        return new Result(ResultCode.SUCCESS, list.subList(fromIndex, toIndex));
+    }
+}

+ 53 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/BreedServiceImpl.java

@@ -5,15 +5,27 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huimv.guowei.admin.common.utils.Result;
 import com.huimv.guowei.admin.common.utils.ResultCode;
+import com.huimv.guowei.admin.entity.BaseDuckInfo;
 import com.huimv.guowei.admin.entity.Breed;
 import com.huimv.guowei.admin.entity.Departure;
+import com.huimv.guowei.admin.mapper.BaseDuckInfoMapper;
 import com.huimv.guowei.admin.mapper.BreedMapper;
 import com.huimv.guowei.admin.service.IBreedService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.guowei.admin.utils.ExcelImportSheet;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -28,6 +40,8 @@ import java.util.Map;
 public class BreedServiceImpl extends ServiceImpl<BreedMapper, Breed> implements IBreedService {
     @Autowired
     private BreedMapper breedMapper;
+    @Autowired
+    private BaseDuckInfoMapper infoMapper;
 
     @Override
     public Result list(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
@@ -55,4 +69,43 @@ public class BreedServiceImpl extends ServiceImpl<BreedMapper, Breed> implements
         Page<Breed> page = new Page<>(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
         return new Result(ResultCode.SUCCESS, breedMapper.selectPage(page, queryWrapper));
     }
+
+    @Override
+    public Result importData(HttpServletRequest httpServletRequest, MultipartFile files) {
+        Map<String , String> map = new HashMap<>();
+        //表头与键值对的映射关系
+        map.put("雄鸭翅号" , "maleChiNum");
+        map.put("雌鸭翅号" , "femaleChiNum");
+        map.put("配种日期" , "date");
+        map.put("雄鸭脚号" , "maleJiaoNum");
+        map.put("雌鸭脚号" , "femaleJiaoNum");
+        try(
+                //这里面的对象会自动关闭
+                InputStream in = files.getInputStream();
+                Workbook workbook = ExcelImportSheet.getTypeFromExtends(in , files.getOriginalFilename())
+        ) {
+
+            //根据名称获取单张表对象 也可以使用getSheetAt(int index)获取单张表的对象 获取第一张表
+            Sheet sheet = workbook.getSheetAt(0);
+            List<Breed> list = ExcelImportSheet.getListFromExcel(sheet , Breed.class , map);
+
+            for (Breed breed : list) {
+                //底层数据库操作 insert什么的
+                QueryWrapper<BaseDuckInfo> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("chi_num", breed.getFemaleChiNum());
+                BaseDuckInfo duckInfo = infoMapper.selectOne(queryWrapper);
+                breed.setUnitId(duckInfo.getUnitId());
+                breed.setUnitName(duckInfo.getUnitName());
+                breed.setFarmId(duckInfo.getFarmId());
+                breedMapper.insert(breed);
+                System.out.println(breed.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new Result(10001, "数据格式异常!", false);
+        }finally {
+            //写着好看的
+        }
+        return new Result(10000, "保存成功!", true);
+    }
 }

+ 10 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DepartureServiceImpl.java

@@ -7,6 +7,7 @@ import com.huimv.guowei.admin.common.utils.Result;
 import com.huimv.guowei.admin.common.utils.ResultCode;
 import com.huimv.guowei.admin.entity.Departure;
 import com.huimv.guowei.admin.entity.DuckHealthInfo;
+import com.huimv.guowei.admin.mapper.BatchMapper;
 import com.huimv.guowei.admin.mapper.DepartureMapper;
 import com.huimv.guowei.admin.service.IDepartureService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -29,6 +30,8 @@ public class DepartureServiceImpl extends ServiceImpl<DepartureMapper, Departure
 
     @Autowired
     private DepartureMapper departureMapper;
+    @Autowired
+    private BatchMapper batchMapper;
 
     @Override
     public Result list(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
@@ -59,4 +62,11 @@ public class DepartureServiceImpl extends ServiceImpl<DepartureMapper, Departure
         Page<Departure> page = new Page<>(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
         return new Result(ResultCode.SUCCESS, departureMapper.selectPage(page, queryWrapper));
     }
+
+    @Override
+    public Result listBatch(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
+        String farmId = paramsMap.get("farmId");
+
+        return null;
+    }
 }

+ 56 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DuckBodySizeInfoServiceImpl.java

@@ -6,16 +6,24 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huimv.guowei.admin.common.utils.Result;
 import com.huimv.guowei.admin.common.utils.ResultCode;
 import com.huimv.guowei.admin.entity.BaseDuckInfo;
+import com.huimv.guowei.admin.entity.Breed;
 import com.huimv.guowei.admin.entity.DuckBodySizeInfo;
 import com.huimv.guowei.admin.entity.vo.DuckBodySizeInfoVo;
 import com.huimv.guowei.admin.mapper.BaseDuckInfoMapper;
 import com.huimv.guowei.admin.mapper.DuckBodySizeInfoMapper;
 import com.huimv.guowei.admin.service.IDuckBodySizeInfoService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.guowei.admin.utils.ExcelImportSheet;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -70,4 +78,52 @@ public class DuckBodySizeInfoServiceImpl extends ServiceImpl<DuckBodySizeInfoMap
         }
         return new Result(ResultCode.SUCCESS,duckBodySizeInfo);
     }
+
+    @Override
+    public Result importData(HttpServletRequest httpServletRequest, MultipartFile files) {
+        Map<String , String> map = new HashMap<>();
+        //表头与键值对的映射关系
+        map.put("翅号" , "chiNum");
+        map.put("脚号" , "jiaoNum");
+        map.put("代次号" , "batchNum");
+        map.put("胫围" , "shinPerimeter");
+        map.put("胫长" , "shinWide");
+        map.put("骨盆宽" , "pelvicWide");
+        map.put("胸深" , "chestDeep");
+        map.put("胸宽" , "chestWide");
+        map.put("半潜水长" , "halfWaterLength");
+        map.put("龙骨长" , "keelLength");
+        map.put("体斜长" , "bodyLength");
+        map.put("测量日期" , "measureDate");
+        try(
+                //这里面的对象会自动关闭
+                InputStream in = files.getInputStream();
+                Workbook workbook = ExcelImportSheet.getTypeFromExtends(in , files.getOriginalFilename())
+        ) {
+
+            //根据名称获取单张表对象 也可以使用getSheetAt(int index)获取单张表的对象 获取第一张表
+            Sheet sheet = workbook.getSheetAt(0);
+            List<DuckBodySizeInfo> list = ExcelImportSheet.getListFromExcel(sheet , DuckBodySizeInfo.class , map);
+
+            for (DuckBodySizeInfo breed : list) {
+                //底层数据库操作 insert什么的
+                QueryWrapper<BaseDuckInfo> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("chi_num", breed.getChiNum());
+                BaseDuckInfo baseDuckInfo = baseDuckInfoMapper.selectOne(queryWrapper);
+                breed.setFarmId(baseDuckInfo.getFarmId());
+                breed.setDuckNum(baseDuckInfo.getDuckNum());
+                breed.setDuckId(baseDuckInfo.getId());
+                breed.setUnitId(baseDuckInfo.getUnitId());
+                breed.setUnitName(baseDuckInfo.getUnitName());
+                duckBodySizeInfoMapper.insert(breed);
+                System.out.println(breed.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new Result(10001, "数据格式异常!", false);
+        }finally {
+            //写着好看的
+        }
+        return new Result(10000, "保存成功!", true);
+    }
 }

+ 79 - 2
huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DuckEggTextureInfoServiceImpl.java

@@ -1,18 +1,30 @@
 package com.huimv.guowei.admin.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.druid.util.StringUtils;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huimv.guowei.admin.common.utils.Result;
 import com.huimv.guowei.admin.common.utils.ResultCode;
-import com.huimv.guowei.admin.entity.DuckBodySizeInfo;
-import com.huimv.guowei.admin.entity.DuckEggTextureInfo;
+import com.huimv.guowei.admin.entity.*;
+import com.huimv.guowei.admin.entity.vo.BaseDuckInfoImportData;
+import com.huimv.guowei.admin.mapper.BaseDuckInfoMapper;
 import com.huimv.guowei.admin.mapper.DuckEggTextureInfoMapper;
 import com.huimv.guowei.admin.service.IDuckEggTextureInfoService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.guowei.admin.utils.ExcelImportSheet;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -28,6 +40,8 @@ import java.util.Map;
 public class DuckEggTextureInfoServiceImpl extends ServiceImpl<DuckEggTextureInfoMapper, DuckEggTextureInfo> implements IDuckEggTextureInfoService {
     @Resource
     private DuckEggTextureInfoMapper duckEggTextureInfoMapper;
+    @Autowired
+    private BaseDuckInfoMapper infoMapper;
 
     @Override
     public Result listLimitInfo(Map<String, String> paramsMap) {
@@ -49,4 +63,67 @@ public class DuckEggTextureInfoServiceImpl extends ServiceImpl<DuckEggTextureInf
                 new QueryWrapper<DuckEggTextureInfo>().like("unit_name",unitName).eq("farm_id",farmId).orderByDesc("id"));
         return new Result(ResultCode.SUCCESS,duckEggTextureInfoPage);
     }
+    @Override
+    public Result importData(HttpServletRequest httpServletRequest, Map<String,String> paramsMap, MultipartFile files) {
+        String farmId = paramsMap.get("farmId");
+        Map<String , String> map = new HashMap<>();
+        //表头与键值对的映射关系
+        map.put("翅号" , "chiNum");
+        map.put("脚号" , "jiaoNum");
+        map.put("代次号" , "batchNum");
+        map.put("产蛋日期" , "layEggsTime");
+        map.put("测定日期" , "determineTime");
+        map.put("蛋壳颜色" , "eggColour");
+        map.put("钝端厚度" , "bluntThick");
+        map.put("锐端厚度" , "sharpThick");
+        map.put("侧面厚度" , "sideThick");
+        map.put("长径" , "longDiameter");
+        map.put("短径" , "shortDiameter");
+        map.put("蛋壳强度" , "eggStrength");
+        map.put("Wgt" , "wgt");
+        map.put("Hgt" , "hgt");
+        map.put("Col" , "col");
+        map.put("Hu" , "hu");
+        map.put("等级" , "grade");
+        try(
+                //这里面的对象会自动关闭
+                InputStream in = files.getInputStream();
+                Workbook workbook = ExcelImportSheet.getTypeFromExtends(in , files.getOriginalFilename())
+        ) {
+
+            //根据名称获取单张表对象 也可以使用getSheetAt(int index)获取单张表的对象 获取第一张表
+            Sheet sheet = workbook.getSheetAt(0);
+            List<DuckEggTextureInfo> list = ExcelImportSheet.getListFromExcel(sheet , DuckEggTextureInfo.class , map);
+
+            for (DuckEggTextureInfo breed : list) {
+                //底层数据库操作 insert什么的
+                QueryWrapper<BaseDuckInfo> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("farm_id", farmId).eq("chi_num", breed.getChiNum());
+                BaseDuckInfo duckInfo = infoMapper.selectOne(queryWrapper);
+                breed.setDuckNum(duckInfo.getDuckNum());
+                breed.setDuckId(duckInfo.getId());
+                breed.setUnitId(duckInfo.getUnitId());
+                breed.setUnitName(duckInfo.getUnitName());
+                breed.setFarmId(duckInfo.getFarmId());
+                QueryWrapper<DuckEggTextureInfo> queryWrapper1 = new QueryWrapper<>();
+                queryWrapper1.eq("farm_id", farmId).orderByDesc("id").last(" limit 1");
+                DuckEggTextureInfo textureInfo = duckEggTextureInfoMapper.selectOne(queryWrapper1);
+                if (ObjectUtil.isEmpty(textureInfo)) {
+                    breed.setEggsNum("100001");
+                } else {
+                    breed.setEggsNum(String.valueOf(Integer.parseInt(textureInfo.getEggsNum()) + 1));
+                }
+                if (duckInfo.getDuckSex() == 1) {
+                    duckEggTextureInfoMapper.insert(breed);
+                }
+//                System.out.println(breed.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new Result(10001, "数据格式异常!", false);
+        }finally {
+            //写着好看的
+        }
+        return new Result(10000, "保存成功!", true);
+    }
 }

+ 51 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DuckImmunityInfoServiceImpl.java

@@ -6,19 +6,27 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.huimv.guowei.admin.common.utils.Result;
 import com.huimv.guowei.admin.common.utils.ResultCode;
 import com.huimv.guowei.admin.entity.BaseDuckInfo;
+import com.huimv.guowei.admin.entity.Breed;
 import com.huimv.guowei.admin.entity.DuckHealthInfo;
 import com.huimv.guowei.admin.entity.DuckImmunityInfo;
 import com.huimv.guowei.admin.mapper.BaseDuckInfoMapper;
 import com.huimv.guowei.admin.mapper.DuckImmunityInfoMapper;
 import com.huimv.guowei.admin.service.IDuckImmunityInfoService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.guowei.admin.utils.ExcelImportSheet;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
+import java.io.InputStream;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -104,4 +112,47 @@ public class DuckImmunityInfoServiceImpl extends ServiceImpl<DuckImmunityInfoMap
         return new Result(ResultCode.SUCCESS, infoMapper.selectPage(page, queryWrapper));
     }
 
+    @Override
+    public Result importData(HttpServletRequest httpServletRequest, MultipartFile files) {
+        Map<String , String> map = new HashMap<>();
+        //表头与键值对的映射关系
+        map.put("接种疫苗" , "vaccination");
+        map.put("翅号" , "chiNum");
+        map.put("注射部位" , "injection");
+        map.put("剂量" , "dose");
+        map.put("代次号" , "batchNum");
+        map.put("脚号" , "jiaoNum");
+        map.put("接种日期" , "healthDate");
+        try(
+                //这里面的对象会自动关闭
+                InputStream in = files.getInputStream();
+                Workbook workbook = ExcelImportSheet.getTypeFromExtends(in , files.getOriginalFilename())
+        ) {
+
+            //根据名称获取单张表对象 也可以使用getSheetAt(int index)获取单张表的对象 获取第一张表
+            Sheet sheet = workbook.getSheetAt(0);
+            List<DuckImmunityInfo> list = ExcelImportSheet.getListFromExcel(sheet , DuckImmunityInfo.class , map);
+
+            for (DuckImmunityInfo breed : list) {
+                //底层数据库操作 insert什么的
+                QueryWrapper<BaseDuckInfo> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("chi_num", breed.getChiNum());
+                BaseDuckInfo baseDuckInfo = baseDuckInfoMapper.selectOne(queryWrapper);
+                breed.setFarmId(baseDuckInfo.getFarmId());
+                breed.setUnitId(baseDuckInfo.getUnitId());
+                breed.setUnitName(baseDuckInfo.getUnitName());
+                breed.setDuckNum(baseDuckInfo.getDuckNum());
+                breed.setDuckId(baseDuckInfo.getId());
+                infoMapper.insert(breed);
+                System.out.println(breed.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new Result(10001, "数据格式异常!", false);
+        }finally {
+            //写着好看的
+        }
+        return new Result(10000, "保存成功!", true);
+    }
+
 }

+ 1 - 1
huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/EnvRegularCallEggServiceImpl.java

@@ -215,7 +215,7 @@ public class EnvRegularCallEggServiceImpl extends ServiceImpl<EnvRegularCallEggM
         QueryWrapper<BaseDuckInfo> infoQueryWrapper = new QueryWrapper<>();
         infoQueryWrapper.eq("farm_id", farmId).eq("duck_num", duckNum);
         BaseDuckInfo duckInfo = infoMapper.selectOne(infoQueryWrapper);
-        if (duckInfo.getDuckSex() == 0) {
+        if (duckInfo.getDuckSex() .equals("0")) {
             return new Result(10001, "雄鸭没有产蛋数量!", false);
         }
 

+ 203 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/timer/NewEnvTimer.java

@@ -0,0 +1,203 @@
+package com.huimv.guowei.admin.timer;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.Header;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.huimv.guowei.admin.entity.EnvData;
+import com.huimv.guowei.admin.entity.EnvDevice;
+import com.huimv.guowei.admin.entity.EnvWarningInfo;
+import com.huimv.guowei.admin.entity.EnvWarningThreshold;
+import com.huimv.guowei.admin.service.IEnvDataService;
+import com.huimv.guowei.admin.service.IEnvDeviceService;
+import com.huimv.guowei.admin.service.IEnvWarningInfoService;
+import com.huimv.guowei.admin.service.IEnvWarningThresholdService;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+import org.springframework.web.client.RestTemplate;
+
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.util.*;
+
+@Configuration
+@EnableScheduling
+public class NewEnvTimer {
+
+
+    @Autowired
+    private IEnvDeviceService envDeviceService;
+
+    @Autowired
+    private IEnvDataService envDataService;
+
+    @Autowired
+    private IEnvWarningThresholdService envWarningThresholdService;
+
+    @Autowired
+    private IEnvWarningInfoService envWarningInfoService;
+
+
+
+
+    @Scheduled(cron = "0 0/20 * * * ?")  //每10分钟执行一次
+//    @Scheduled(cron = "0 * * * * ?")  //每10分钟执行一次
+//    @Scheduled(cron = "*/5 * * * * ?")  //每10秒钟执行一次
+    public void getDeviceFlowData() throws ParseException {
+        String userId = "-1618620464";
+        String farmCode = "21";
+
+        List<EnvDevice> farm_id = envDeviceService.list(new QueryWrapper<EnvDevice>().eq("farm_id", farmCode).eq("device_type",4));
+//        EnvWarningThreshold envWarningThreshold = envWarningThresholdService.getOne(new QueryWrapper<EnvWarningThreshold>().eq("farm_id", farmCode));
+        System.out.println("开始");
+        Date date = new Date();
+        for (EnvDevice envDevice : farm_id) {
+            String deviceCode = envDevice.getDeviceCode();
+            if (StringUtils.isNotBlank(deviceCode)) {
+                JSONObject resultJo = JSONObject.parseObject(getDeviceFlowFromRemoteURL(userId, deviceCode));
+                System.out.println("resultJo >>>>>>>>>>>> =" + resultJo);
+                if (resultJo.getInteger("code") != 1000) {
+                    System.out.println("牧场[" + farmCode + "]设备组编号(" + deviceCode + ")调用远程接口返回结果出错.");
+                } else {
+                    JSONArray dataJa = resultJo.getJSONArray("data");
+                    JSONObject dataJo = dataJa.getJSONObject(0);
+                    JSONArray realTimeDataJa = dataJo.getJSONArray("realTimeData");
+                    JSONObject tempJo = realTimeDataJa.getJSONObject(0);
+                    String temp = tempJo.getString("dataValue");
+                    JSONObject humiJo = realTimeDataJa.getJSONObject(1);
+                    String humi = humiJo.getString("dataValue");
+                    if (StringUtils.isBlank(humi)) {
+                        humi = "0";
+                    }
+                    if (StringUtils.isBlank(temp)) {
+                        temp = "0";
+                    }
+                    EnvData envData = new EnvData();
+                    envData.setUnitId(envDevice.getUnitId());
+                    envData.setEnvTemp(temp);
+                    envData.setEnvHum(humi);
+                    envData.setFarmId(envDevice.getFarmId());
+                    envData.setCreateTime(date);
+                    envData.setDeviceId(envDevice.getDeviceCode());
+//                    saveTemWarning(temp, envWarningThreshold, envDevice);
+//                    saveHumWarning(humi, envWarningThreshold, envDevice);
+                    envDataService.save(envData);
+                }
+            }
+        }
+
+    }
+
+    //获取远程数据
+    private String getDeviceFlowFromRemoteURL(String userId, String groupId) {
+        String url= "http://www.0531yun.com/app/GetDeviceData";
+        Map<String, Object> map = new HashMap<>();
+        map.put("groupId", groupId);
+        HashMap<String, String> headers = new HashMap<>();//存放请求头
+        headers.put("userId", userId);
+        //发送get请求并接收响应数据
+        String body = HttpUtil.createGet(url).addHeaders(headers).form(map).execute().body();
+        System.out.println(body);
+        return body;
+    }
+
+//    private void saveTemWarning(String val, EnvWarningThreshold envWarningThreshold, EnvDevice envDevice) {
+//        if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(val)) {
+//            String maxTem;
+//            String minTem;
+//            if (ObjectUtil.isEmpty(envWarningThreshold) || com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(envWarningThreshold.getMaxTem())) {
+//                maxTem = "40";
+//            } else {
+//                maxTem = envWarningThreshold.getMaxTem();
+//            }
+//            if (ObjectUtil.isEmpty(envWarningThreshold) || com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(envWarningThreshold.getMinTem())) {
+//                minTem = "0";
+//            } else {
+//                minTem = envWarningThreshold.getMinTem();
+//            }
+//            System.out.println("maxTem:" + Double.parseDouble(maxTem) + "  minTem:" + Double.parseDouble(minTem) + "   val:" + Double.parseDouble(val));
+//            if (Double.parseDouble(maxTem) < Double.parseDouble(val)) {
+//                EnvWarningInfo envWarningInfo = new EnvWarningInfo();
+//                envWarningInfo.setBuildLocation(envDevice.getUnitName());
+//                envWarningInfo.setDate(new Date());
+//                envWarningInfo.setDeviceId(envDevice.getDeviceCode());
+//                envWarningInfo.setFarmId(envDevice.getFarmId());
+//                envWarningInfo.setUnitId(envDevice.getUnitId());
+//                envWarningInfo.setUnitName(envDevice.getUnitName());
+//                envWarningInfo.setUserIds(envWarningThreshold.getUserIds());
+//                envWarningInfo.setWarningContent("当前温度为" + val + "°超过阈值,请及时检查");
+//                envWarningInfo.setWarningType(1);
+//                envWarningInfoService.save(envWarningInfo);
+//            }
+//            if (Double.parseDouble(minTem) > Double.parseDouble(val)) {
+//                EnvWarningInfo envWarningInfo = new EnvWarningInfo();
+//                envWarningInfo.setBuildLocation(envDevice.getUnitName());
+//                envWarningInfo.setDate(new Date());
+//                envWarningInfo.setDeviceId(envDevice.getDeviceCode());
+//                envWarningInfo.setFarmId(envDevice.getFarmId());
+//                envWarningInfo.setUnitId(envDevice.getUnitId());
+//                envWarningInfo.setUnitName(envDevice.getUnitName());
+//                envWarningInfo.setUserIds(envWarningThreshold.getUserIds());
+//                envWarningInfo.setWarningContent("当前温度为" + val + "°低于阈值,请及时检查");
+//                envWarningInfo.setWarningType(1);
+//                envWarningInfoService.save(envWarningInfo);
+//            }
+//        }
+//    }
+//
+//    public void saveHumWarning(String val, EnvWarningThreshold envWarningThreshold, EnvDevice envDevice) {
+//        if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(val)) {
+//            String maxHum;
+//            String minHum;
+//            if (ObjectUtil.isEmpty(envWarningThreshold) || com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(envWarningThreshold.getMaxHum())) {
+//                maxHum = "90";
+//            } else {
+//                maxHum = envWarningThreshold.getMaxHum();
+//            }
+//            if (ObjectUtil.isEmpty(envWarningThreshold) || com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(envWarningThreshold.getMinHum())) {
+//                minHum = "0";
+//            } else {
+//                minHum = envWarningThreshold.getMinHum();
+//            }
+//            if (Double.parseDouble(maxHum) < Double.parseDouble(val)) {
+//                EnvWarningInfo envWarningInfo = new EnvWarningInfo();
+//                envWarningInfo.setBuildLocation(envDevice.getUnitName());
+//                envWarningInfo.setDate(new Date());
+//                envWarningInfo.setDeviceId(envDevice.getDeviceCode());
+//                envWarningInfo.setFarmId(envDevice.getFarmId());
+//                envWarningInfo.setUnitId(envDevice.getUnitId());
+//                envWarningInfo.setUnitName(envDevice.getUnitName());
+//                envWarningInfo.setUserIds(envWarningThreshold.getUserIds());
+//                envWarningInfo.setWarningContent("当前湿度为" + val + "%超过阈值,请及时检查");
+//                envWarningInfo.setWarningType(2);
+//                envWarningInfoService.save(envWarningInfo);
+//            }
+//            if (Double.parseDouble(minHum) > Double.parseDouble(val)) {
+//                EnvWarningInfo envWarningInfo = new EnvWarningInfo();
+//                envWarningInfo.setBuildLocation(envDevice.getUnitName());
+//                envWarningInfo.setDate(new Date());
+//                envWarningInfo.setDeviceId(envDevice.getDeviceCode());
+//                envWarningInfo.setFarmId(envDevice.getFarmId());
+//                envWarningInfo.setUnitId(envDevice.getUnitId());
+//                envWarningInfo.setUnitName(envDevice.getUnitName());
+//                envWarningInfo.setUserIds(envWarningThreshold.getUserIds());
+//                envWarningInfo.setWarningContent("当前湿度为" + val + "%低于阈值,请及时检查");
+//                envWarningInfo.setWarningType(2);
+//                envWarningInfoService.save(envWarningInfo);
+//            }
+//        }
+//    }
+}

+ 190 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/utils/ExcelImportSheet.java

@@ -0,0 +1,190 @@
+package com.huimv.guowei.admin.utils;
+
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.util.*;
+
+/**
+ * @author 三文鱼先生
+ * @title
+ * @description 导入工具类
+ * @date 2022/8/17
+ **/
+public class ExcelImportSheet {
+
+    /**
+     * @description 根据文件后缀获取相应的Workbook对象
+     * @author 三文鱼先生
+     * @date 9:46 2022/8/17
+     * @param in 用于构建Workbook对象的输入流
+     * @param fileName 文件名称
+     * @return org.apache.poi.ss.usermodel.Workbook
+     **/
+    public static Workbook getTypeFromExtends(InputStream in , String fileName) throws Exception {
+        String[] str = fileName.split("\\.");
+        //获取文件后缀
+        String extend = str[1];
+        if(extend.equals("xls")) {
+            //2003版的excel
+            return new HSSFWorkbook(in);
+        } else if(extend.equals("xlsx")){
+            //2007版的excel
+            return new XSSFWorkbook(in);
+        }else {
+            throw new Exception("请检查文件类型是否正确。");
+        }
+    }
+
+    /**
+     * @description 将单个sheet里的数据获取到List<T>的泛型列表里面
+     * @author 三文鱼先生
+     * @date 9:47 2022/8/17
+     * @param sheet 单个的工作表
+     * @param cs 生成的对象类名
+     * @param map 表头与对象属性映射
+     * @return java.util.List<T>
+     **/
+    public static <T> List<T> getListFromExcel(Sheet sheet , Class cs , Map<String , String> map) throws Exception {
+        T e;
+        List<T> list = new ArrayList<>();
+        //根据第一行获取表头对应的属性顺序
+        List<String> paramsList = getMethodFromFirstRow(sheet , map);
+        //根据类和属性顺序的List 获取属性对应的类型属性
+        List<Class> typeClass = getParamsType(cs , paramsList);
+        //遍历所有行 从第二行开始 首行是表头字段
+        for (int i = sheet.getFirstRowNum() + 1; i <= sheet.getLastRowNum(); i++) {
+            //单元行
+            Row row = sheet.getRow(i);
+            //一行对应一个T,将对象强转为泛型
+            e = (T) cs.newInstance();
+            //遍历单元行的每一列 设置值给泛型e
+            for (int j = 0; j < row.getLastCellNum(); j++) {
+                //获取一个单元格
+                Cell cell = row.getCell(j);
+                //调用泛型对象的set方法设置单元格里的值 这也就是为什么我们要获取属性顺序以及其对应的类型
+                cs.getMethod(getSetterMethodName(paramsList.get(j)) , typeClass.get(j))
+                        .invoke(e , getValueFromType(cell , typeClass.get(j)));
+            }
+            list.add(e);
+        }
+        return list;
+    }
+
+    /**
+     * @description 获取属性的setter方法
+     * @author 三文鱼先生
+     * @date 9:54 2022/8/17
+     * @param param 属性
+     * @return java.lang.String 返回一个setXxx
+     **/
+    public static String getSetterMethodName(String param) {
+        char[] chars = param.toCharArray();
+        //首字母大写
+        if(Character.isLowerCase(chars[0])) {
+            chars[0] -= 32;
+        }
+        //拼接set方法
+        return "set" + new String(chars);
+    }
+
+    /**
+     * @description 从第一行(表头)获取字段对应的属性的顺序
+     * @author 三文鱼先生
+     * @date 9:51 2022/8/17
+     * @param sheet 工作表
+     * @param map 表头字段与对象属性的映射
+     * @return java.util.List<java.lang.String> 属性的集合
+     **/
+    public static List<String> getMethodFromFirstRow(Sheet sheet , Map<String,String> map) throws Exception {
+        //获取表头
+        Row row = sheet.getRow(sheet.getFirstRowNum());
+        //获取到的属性列表
+        List<String> paramsList = new ArrayList<>();
+        //遍历表头
+        for(int i = row.getFirstCellNum(); i  < row.getLastCellNum(); i++) {
+            Cell cell = row.getCell(i);
+            //获取行字符串的值
+            String str = cell.getStringCellValue();
+            //键值对映射获取对应方法名称
+            if(map.containsKey(str)) {
+                //获取对应属性的set方法
+                paramsList.add(map.get(str));
+            } else {
+                throw new Exception("请检查首行数据是否正确。");
+            }
+        }
+        return  paramsList;
+    }
+
+    /**
+     * @description  根据对象和属性顺序列表,返回对应顺序的参数类型List
+     * @author 三文鱼先生
+     * @date 9:55 2022/8/17
+     * @param cs 对象类
+     * @param paramsList 表头对应的属性顺序List
+     * @return java.util.List<java.lang.Class>
+     **/
+    public static List<Class> getParamsType(Class cs , List<String> paramsList) {
+        List<Class> typeClass = new ArrayList<>();
+        //对象的所有属性
+        Field[] fields = cs.getDeclaredFields();
+        //临时的属性 - 类型映射
+        Map<String , Class> map = new HashMap();
+        //获取属性名称及类型
+        for (Field field : fields) {
+            map.put(field.getName(), field.getType());
+        }
+        //遍历属性List获取对应的类型List
+        for (String s : paramsList) {
+            typeClass.add(map.get(s));
+        }
+        return typeClass;
+    }
+
+
+    /**
+     * @description 根据对应的Class获取将对应的值类型
+     * @author 三文鱼先生
+     * @date 9:59 2022/8/17
+     * @param cell
+     * @param cs
+     * @return java.lang.Object
+     **/
+    public static Object getValueFromType(Cell cell , Class cs) {
+        //字符串类型
+        if (String.class.equals(cs)) {
+            //设置对应的类型
+            cell.setCellType(CellType.STRING);
+            return cell.getStringCellValue();
+        } else if(boolean.class.equals(cs)){
+            //boolean类型
+            cell.setCellType(CellType.BOOLEAN);
+            return cell.getBooleanCellValue();
+        }else if (Date.class.equals(cs)) {
+            //日期类型 此种数据并未测试
+            return cell.getDateCellValue();
+        } else if (int.class.equals(cs) || Integer.class.equals(cs)){
+            //int类型
+            cell.setCellType(CellType.NUMERIC);
+            return (int)cell.getNumericCellValue();
+        } else if(double.class.equals(cs) || Double.class.equals(cs)) {
+            //double类型
+            cell.setCellType(CellType.NUMERIC);
+            return cell.getNumericCellValue();
+        }else if(BigDecimal.class.equals(cs) || BigDecimal.class.equals(cs)) {
+            //bigdecimal类型
+            cell.setCellType(CellType.NUMERIC);
+            return cell.getNumericCellValue();
+        }
+        //这里还可以填充其他类型
+        else {
+            //未知类型 默认为错误类型
+            return cell.getErrorCellValue();
+        }
+    }
+}

+ 112 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/utils/ExcelReader.java

@@ -0,0 +1,112 @@
+package com.huimv.guowei.admin.utils;
+
+
+
+
+import com.huimv.guowei.admin.entity.Departure;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.streaming.SXSSFWorkbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.*;
+
+public class ExcelReader {
+    public static void main(String[] args) throws IOException {
+//        String excelFilePath = "G:/test.xlsx";
+//        FileInputStream inputStream = new FileInputStream(new File(excelFilePath));
+//        SXSSFWorkbook workbook = new SXSSFWorkbook();
+//        Sheet sheet = workbook.getSheetAt(0);
+//        Iterator<Row> iterator = sheet.iterator();
+//        while (iterator.hasNext()) {
+//            Row nextRow = iterator.next();
+//            Iterator<Cell> cellIterator = nextRow.cellIterator();
+//            List<String> rowValues = new ArrayList<>();
+//            while (cellIterator.hasNext()) {
+//                Cell cell = cellIterator.next();
+//                switch (cell.getCellType()) {
+//                    case STRING:
+//                        rowValues.add(cell.getStringCellValue().trim());
+//                        break;
+//                    case NUMERIC:
+//                        rowValues.add(String.valueOf(cell.getNumericCellValue()).trim());
+//                        break;
+//                    default:
+//                        rowValues.add("");
+//                        break;
+//                }
+//            }
+//            System.out.println(rowValues);
+//
+////            String sql = "INSERT INTO departure (id,duck_num,unit_id,date,reason,farm_id,unit_name) "
+////                    + "VALUES ('" + rowValues.get(0) + "','" + rowValues.get(1) + "','" + rowValues.get(2) + "','" + rowValues.get(3) + "','"
+////                    + rowValues.get(4) + "','"+ rowValues.get(5) + "','"+ rowValues.get(6) + "')";
+////
+////            Connection conn = DBConnection.getConnection();
+////            Statement statement = null;
+////
+////            try {
+////                statement = conn.createStatement();
+////                statement.executeUpdate(sql);
+////            } catch (SQLException e) {
+////                e.printStackTrace();
+////            } finally {
+////                try {
+////                    if (statement != null) {
+////                        statement.close();
+////                    }
+////                    if (conn != null) {
+////                        conn.close();
+////                    }
+////                } catch (SQLException e) {
+////                    e.printStackTrace();
+////                }
+////            }
+//        }
+//        workbook.close();
+//        inputStream.close();
+
+        Map<String , String> map = new HashMap<>();
+        //表头与键值对的映射关系
+        map.put("序号", "id");
+        map.put("鸭只编号" , "duckNum");
+        map.put("位置" , "unitId");
+        map.put("离场日期" , "date");
+        map.put("原因" , "reason");
+        map.put("编码" , "farmId");
+        map.put("位置名称" , "unitName");
+        try(
+                //这里面的对象会自动关闭
+                InputStream in = new FileInputStream(new File("G:\\test.xlsx"));
+                //用流来构建工作簿对象
+                Workbook workbook = ExcelImportSheet.getTypeFromExtends(in , "test.xlsx")
+        ) {
+
+            //根据名称获取单张表对象 也可以使用getSheetAt(int index)获取单张表的对象 获取第一张表
+            Sheet sheet = workbook.getSheetAt(0);
+            List<Departure> list = ExcelImportSheet.getListFromExcel(sheet , Departure.class , map);
+
+            for (Departure student : list) {
+                //底层数据库操作 insert什么的
+                System.out.println(student.toString());
+            }
+        }catch(IOException exception) {
+            exception.printStackTrace();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }finally {
+            //写着好看的
+        }
+
+    }
+
+}

+ 23 - 1
huimv-admin/src/main/java/com/huimv/guowei/admin/utils/Print.java

@@ -43,7 +43,7 @@ public class Print {
         for (PrintEntrty printEntrty : printEntrties) {
             PrintEntrtyVo printEntrtyVo = new PrintEntrtyVo();
             BaseDuckInfo duckInfo = printEntrty.getBaseDuckInfo();
-            printEntrtyVo.setDuckCode(duckInfo.getDuckNum());
+            printEntrtyVo.setDuckCode(duckInfo.getChiNum()+"、"+duckInfo.getJiaoNum());
 
             if (duckInfo.getDuckBreed() == 1) {
                 printEntrtyVo.setDuckType("北京鸭");
@@ -226,5 +226,27 @@ public class Print {
         //生成
         JxlsHelper.getInstance().processTemplate(is, os, context);
     }
+    public static void printChi(List<BaseDuckInfo> baseDuckInfos) throws Exception {
 
+        //准备数据
+        String path = "/opt/guowei/chi.xls";
+        //获取模板文件,你自己当前模板的位置  我这里为当前项目下
+        InputStream is = new FileInputStream("/opt/guowei/chi.xlsx");
+        //根据模板生成的文件保存路径  我这里保存在本地D盘
+        OutputStream os = new FileOutputStream(path);
+        //绑定数据
+        Context context = new Context();
+        List<PrintEntrtyChi> list = new ArrayList<>();
+        for (BaseDuckInfo baseDuckInfo : baseDuckInfos) {
+            PrintEntrtyChi printEntrtyChi = new PrintEntrtyChi();
+            printEntrtyChi.setUnitName(baseDuckInfo.getUnitName());
+            printEntrtyChi.setChiNum(baseDuckInfo.getChiNum());
+            printEntrtyChi.setJiaoNum(baseDuckInfo.getJiaoNum());
+            list.add(printEntrtyChi);
+        }
+
+        context.putVar("list", list);
+        //生成
+        JxlsHelper.getInstance().processTemplate(is, os, context);
+    }
 }

+ 5 - 0
huimv-admin/src/main/resources/mapper/BatchMapper.xml

@@ -0,0 +1,5 @@
+<?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.huimv.guowei.admin.mapper.BatchMapper">
+
+</mapper>