Prechádzať zdrojové kódy

Merge remote-tracking branch 'origin/master'

523096025 1 rok pred
rodič
commit
2f3e4dd406
72 zmenil súbory, kde vykonal 2375 pridanie a 88 odobranie
  1. 46 0
      huimv-admin/pom.xml
  2. 3 2
      huimv-admin/src/main/java/com/huimv/guowei/admin/config/InterceptorConfig.java
  3. 5 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/BaseBuildingController.java
  4. 59 20
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/BaseDuckInfoController.java
  5. 94 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/BatchController.java
  6. 13 5
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/BreedController.java
  7. 41 2
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DepartureController.java
  8. 11 5
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckBodySizeInfoController.java
  9. 45 3
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckEggTextureInfoController.java
  10. 8 5
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckImmunityInfoController.java
  11. 23 3
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckIncubateInfoController.java
  12. 80 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/EggProductionController.java
  13. 8 1
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/EnvDataController.java
  14. 3 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/controller/EnvMoveCallController.java
  15. 13 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/BaseDuckInfo.java
  16. 58 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/Batch.java
  17. 7 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/Breed.java
  18. 8 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/Departure.java
  19. 5 4
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckBodySizeInfo.java
  20. 8 6
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckEggTextureInfo.java
  21. 5 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckHealthInfo.java
  22. 5 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckImmunityInfo.java
  23. 23 2
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckIncubateInfo.java
  24. 57 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/EggProduction.java
  25. 6 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/EnvMoveCall.java
  26. 5 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/EnvRegularCallEgg.java
  27. 18 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/PrintEntrtyChi.java
  28. 11 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/dto/EggProductionDto.java
  29. 11 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/BaseBuildingVo.java
  30. 139 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/BaseDuckInfoImportData.java
  31. 53 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/BatchVo.java
  32. 54 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/DepartureVo.java
  33. 16 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/EnvDataGetOneVo.java
  34. 41 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/TreeBaseBuildingVo.java
  35. 3 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/mapper/BaseBuildingMapper.java
  36. 16 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/mapper/BatchMapper.java
  37. 16 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/mapper/EggProductionMapper.java
  38. 3 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/mapper/EnvDataMapper.java
  39. 5 1
      huimv-admin/src/main/java/com/huimv/guowei/admin/mqtt/EnvControll/PushCallback.java
  40. 2 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IBaseBuildingService.java
  41. 7 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IBaseDuckInfoService.java
  42. 20 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IBatchService.java
  43. 3 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IBreedService.java
  44. 6 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDepartureService.java
  45. 4 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDuckBodySizeInfoService.java
  46. 4 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDuckEggTextureInfoService.java
  47. 3 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IDuckImmunityInfoService.java
  48. 16 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IEggProductionService.java
  49. 4 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/IEnvDataService.java
  50. 46 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/BaseBuildingServiceImpl.java
  51. 183 8
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/BaseDuckInfoServiceImpl.java
  52. 64 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/BatchServiceImpl.java
  53. 66 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/BreedServiceImpl.java
  54. 54 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DepartureServiceImpl.java
  55. 56 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DuckBodySizeInfoServiceImpl.java
  56. 82 3
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DuckEggTextureInfoServiceImpl.java
  57. 6 1
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DuckHealthInfoServiceImpl.java
  58. 58 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DuckImmunityInfoServiceImpl.java
  59. 3 1
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/DuckIncubateInfoServiceImpl.java
  60. 20 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/EggProductionServiceImpl.java
  61. 53 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/EnvDataServiceImpl.java
  62. 4 1
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/EnvMoveCallServiceImpl.java
  63. 7 1
      huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/EnvRegularCallEggServiceImpl.java
  64. 203 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/timer/NewEnvTimer.java
  65. 190 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/utils/ExcelImportSheet.java
  66. 112 0
      huimv-admin/src/main/java/com/huimv/guowei/admin/utils/ExcelReader.java
  67. 23 1
      huimv-admin/src/main/java/com/huimv/guowei/admin/utils/Print.java
  68. 7 0
      huimv-admin/src/main/resources/com/huimv/guowei/admin/mapper/BaseBuildingMapper.xml
  69. 20 12
      huimv-admin/src/main/resources/com/huimv/guowei/admin/mapper/EnvDataMapper.xml
  70. 5 0
      huimv-admin/src/main/resources/mapper/BatchMapper.xml
  71. 9 1
      huimv-admin/src/main/resources/mapper/DuckBodySizeInfoMapper.xml
  72. 10 0
      huimv-admin/src/main/resources/mapper/EggProductionMapper.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");
     }
 }

+ 5 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/BaseBuildingController.java

@@ -75,6 +75,11 @@ public class BaseBuildingController {
         return baseBuildingService.listTreeBuilding(map);
     }
 
+    @PostMapping("/listTreeDuckBuilding")
+    public Result listTreeDuckBuilding(@RequestBody Map<String, String> map){
+        return baseBuildingService.listTreeDuckBuilding(map);
+    }
+
 //    @PostMapping("/list")
 //    public Result list(@RequestBody Map<String, Object> paramsMap) {
 //        System.out.println("paramsMap>>"+paramsMap.toString());

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

@@ -42,6 +42,11 @@ public class BaseDuckInfoController {
         return duckInfoService.listDuck(httpServletRequest, paramsMap);
     }
 
+    @RequestMapping("/listAppDuck")
+    public Result listAppDuck(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) {
+        return duckInfoService.listAppDuck(httpServletRequest, paramsMap);
+    }
+
     @RequestMapping("/deleteDuck")
     public Result deleteDuck(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) {
         duckInfoService.removeById(paramsMap.get("id"));
@@ -49,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,
@@ -63,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);
@@ -88,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);
     }
 
@@ -103,30 +119,33 @@ 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("chiNum", baseDuckInfo.getChiNum());
+        resultMap.put("jiaoNum", baseDuckInfo.getJiaoNum());
+        resultMap.put("batchNum", baseDuckInfo.getBatchNum());
+        resultMap.put("unitName", baseDuckInfo.getUnitName());
+        resultMap.put("duckNum", baseDuckInfo.getDuckNum());
+        return new Result(ResultCode.SUCCESS, resultMap);
     }
 
     @GetMapping("/printDuck")
@@ -138,11 +157,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);

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

@@ -0,0 +1,94 @@
+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.common.utils.ResultCode;
+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.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 代次号 前端控制器
+ * </p>
+ *
+ * @author author
+ * @since 2023-11-28
+ */
+@RestController
+@RequestMapping("/batch")
+@CrossOrigin
+public class BatchController {
+
+    @Autowired
+    private BatchServiceImpl batchService;
+
+    @RequestMapping("/listAll")
+    public Result listAll(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) {
+        String farmId = paramsMap.get("farmId");
+        QueryWrapper<Batch> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("farm_id", farmId);
+        List<Batch> batches = batchService.list(queryWrapper);
+        return new Result(ResultCode.SUCCESS, batches);
+    }
+
+
+    @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);
+        }
+
+    }
+}

+ 13 - 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;
 
 /**
@@ -83,6 +81,8 @@ public class BreedController {
         if (ObjectUtil.isNotEmpty(duckInfo)) {
             if (duckInfo.getDuckSex() == 0) {
                 breed.setMaleNum(maleNum);
+                breed.setMaleChiNum(duckInfo.getChiNum());
+                breed.setMaleJiaoNum(duckInfo.getJiaoNum());
             } else {
                 return new Result(10001, "雌鸭编号不能填入雄鸭配种中!", false);
             }
@@ -100,6 +100,8 @@ public class BreedController {
         if (ObjectUtil.isNotEmpty(duckInfo1)) {
             if (duckInfo1.getDuckSex() == 1) {
                 breed.setFemaleNum(femaleNum);
+                breed.setFemaleChiNum(duckInfo1.getChiNum());
+                breed.setFemaleJiaoNum(duckInfo1.getJiaoNum());
             } else {
                 return new Result(10001, "雄鸭编号不能填入雌鸭配种中!", false);
             }
@@ -129,4 +131,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);
+    }
 }

+ 41 - 2
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DepartureController.java

@@ -6,6 +6,7 @@ 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.Departure;
+import com.huimv.guowei.admin.entity.vo.DepartureVo;
 import com.huimv.guowei.admin.service.IBaseDuckInfoService;
 import com.huimv.guowei.admin.service.IDepartureService;
 import com.huimv.guowei.admin.service.IDuckHealthInfoService;
@@ -17,11 +18,14 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletRequest;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 /**
  * <p>
- *  前端控制器
+ * 前端控制器
  * </p>
  *
  * @author author
@@ -40,11 +44,36 @@ public class DepartureController {
     public Result listById(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) {
         return departureService.list(httpServletRequest, paramsMap);
     }
+
     @RequestMapping("/listByDuckId")
     public Result listByDuckId(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) {
         String id = paramsMap.get("id");
-        return new Result(ResultCode.SUCCESS,departureService.getById(id));
+        Departure departure = departureService.getById(id);
+        if (1 == departure.getType()) {
+            return new Result(ResultCode.SUCCESS, departure);
+        } else {
+            QueryWrapper<Departure> queryWrapper1 = new QueryWrapper<>();
+            queryWrapper1.eq("batch_num", departure.getBatchNum()).eq("farm_id", departure.getFarmId());
+            List<Departure> departures = departureService.list(queryWrapper1);
+            DepartureVo departureVo = new DepartureVo();
+            departureVo.setBatchNum(departure.getBatchNum());
+            departureVo.setDate(departures.get(0).getDate());
+            departureVo.setFarmId(departure.getFarmId());
+            String s = "";
+            for (int i = 0; i < departures.size(); i++) {
+                if (i == departures.size() - 1) {
+                    s = s + departures.get(i).getChiNum();
+                } else {
+                    s = s + departures.get(i).getChiNum() + ",";
+                }
+            }
+            departureVo.setReason(departures.get(0).getReason());
+            departureVo.setChiNum(s);
+            departureVo.setType(2);
+            return new Result(ResultCode.SUCCESS, departureVo);
+        }
     }
+
     @RequestMapping("/listSelect")
     public Result listSelect(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) {
         return departureService.listSelect(httpServletRequest, paramsMap);
@@ -60,6 +89,10 @@ public class DepartureController {
             return new Result(10001, "该鸭只已离场,无需再次离场!", false);
         }
         infoServiceOne.setIsCage(1);
+        departure.setChiNum(infoServiceOne.getChiNum());
+        departure.setJiaoNum(infoServiceOne.getJiaoNum());
+        departure.setBatchNum(infoServiceOne.getBatchNum());
+        departure.setType(1);
         departureService.save(departure);
         infoService.updateById(infoServiceOne);
         return new Result(10000, "添加成功!", true);
@@ -70,10 +103,16 @@ public class DepartureController {
         departureService.updateById(departure);
         return new Result(10000, "修改成功!", true);
     }
+
     @RequestMapping("/deleteDuck")
     public Result deleteDuck(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) {
         String id = paramsMap.get("id");
         departureService.removeById(id);
         return new Result(10000, "删除成功!", true);
     }
+
+    @RequestMapping("/editBatch")
+    public Result editBatch(HttpServletRequest httpServletRequest, @RequestBody Map<String, String> paramsMap) throws ParseException {
+        return departureService.editBatch(httpServletRequest, paramsMap);
+    }
 }

+ 11 - 5
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;
 
 /**
@@ -35,13 +38,13 @@ public class DuckBodySizeInfoController {
 
     @PostMapping("/addInfo")
     public Result addInfo(@RequestBody DuckBodySizeInfo duckBodySizeInfo){
-        if (StringUtils.isEmpty(duckBodySizeInfo.getWingNum())){
-            duckBodySizeInfo.setWingNum("");
-        }
         BaseDuckInfo baseDuckInfo = baseDuckInfoService.getOne(new QueryWrapper<BaseDuckInfo>().eq("duck_num", duckBodySizeInfo.getDuckNum()));
         if (baseDuckInfo.getIsCage() == 1){
             return new Result(10001,"鸭只已离场!",false);
         }
+        duckBodySizeInfo.setChiNum(baseDuckInfo.getChiNum());
+        duckBodySizeInfo.setJiaoNum(baseDuckInfo.getJiaoNum());
+        duckBodySizeInfo.setBatchNum(baseDuckInfo.getBatchNum());
         duckBodySizeInfoService.save(duckBodySizeInfo);
         return Result.SUCCESS();
     }
@@ -64,7 +67,6 @@ public class DuckBodySizeInfoController {
         DuckBodySizeInfo duckBodySizeInfo = duckBodySizeInfoService.getById(paramsMap.get("id"));
         if (ObjectUtil.isEmpty(duckBodySizeInfo)){
             duckBodySizeInfo = new DuckBodySizeInfo();
-            duckBodySizeInfo.setWingNum("");
             duckBodySizeInfo.setBodyLength("");
             duckBodySizeInfo.setChestDeep("");
             duckBodySizeInfo.setChestWide("");
@@ -92,5 +94,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);
+    }
 }

+ 45 - 3
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckEggTextureInfoController.java

@@ -1,17 +1,25 @@
 package com.huimv.guowei.admin.controller;
 
 
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.DuckEggTextureInfo;
 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.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -32,7 +40,7 @@ public class DuckEggTextureInfoController {
     private IBaseDuckInfoService baseDuckInfoService;
 
     @PostMapping("/addInfo")
-    public Result addInfo(@RequestBody DuckEggTextureInfo duckEggTextureInfo){
+    public Result addInfo(@RequestBody DuckEggTextureInfo duckEggTextureInfo) throws ParseException {
         BaseDuckInfo baseDuckInfo = baseDuckInfoService.getOne(new QueryWrapper<BaseDuckInfo>().eq("duck_num", duckEggTextureInfo.getDuckNum()));
         if (baseDuckInfo.getDuckSex() == 0){
             return new Result(10001,"雄鸭无法新增蛋质信息!",false);
@@ -41,8 +49,19 @@ public class DuckEggTextureInfoController {
             return new Result(10001,"鸭只已离场!",false);
         }
         Date determineTime = duckEggTextureInfo.getDetermineTime();
-        Date layEggsTime = duckEggTextureInfo.getLayEggsTime();
-        if (layEggsTime.compareTo(determineTime) > 0){
+        String layEggsTime = duckEggTextureInfo.getLayEggsTime();
+        duckEggTextureInfo.setDuckId(baseDuckInfo.getId());
+        duckEggTextureInfo.setChiNum(baseDuckInfo.getChiNum());
+        duckEggTextureInfo.setJiaoNum(baseDuckInfo.getJiaoNum());
+        duckEggTextureInfo.setBatchNum(baseDuckInfo.getBatchNum());
+        String[] dateParts = layEggsTime.split("~");
+        String startDateString = dateParts[0];
+        String endDateString = dateParts[1];
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date startDate = sdf.parse(startDateString);
+        Date endDate = sdf.parse(endDateString);
+
+        if (startDate.compareTo(determineTime) > 0){
             return new Result(10001,"测定日期不能早于产蛋日期!",false);
         }
         duckEggTextureInfoService.save(duckEggTextureInfo);
@@ -77,4 +96,27 @@ 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);
+    }
+    //生成鸭蛋编号
+    @PostMapping("/addEggsNum")
+    public Result addEggsNum(@RequestBody Map<String, String> paramsMap){
+        String farmId = paramsMap.get("farmId");
+        QueryWrapper<DuckEggTextureInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("farm_id", farmId).orderByDesc("id").last(" limit 1");
+        DuckEggTextureInfo one = duckEggTextureInfoService.getOne(queryWrapper);
+        JSONObject jsonObject = new JSONObject();
+        if (ObjectUtil.isEmpty(one)) {
+            jsonObject.put("eggNum", "100001");
+        } else {
+            jsonObject.put("eggNum", Integer.parseInt(one.getEggsNum()) + 1);
+        }
+        return new Result(ResultCode.SUCCESS, jsonObject);
+    }
 }

+ 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);
+    }
 }

+ 23 - 3
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/DuckIncubateInfoController.java

@@ -13,6 +13,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.Map;
 
@@ -34,7 +36,7 @@ public class DuckIncubateInfoController {
     private IBaseDuckInfoService baseDuckInfoService;
 
     @PostMapping("/addInfo")
-    public Result addInfo(@RequestBody DuckIncubateInfo duckIncubateInfo){
+    public Result addInfo(@RequestBody DuckIncubateInfo duckIncubateInfo) throws ParseException {
         BaseDuckInfo baseDuckInfo = baseDuckInfoService.getOne(new QueryWrapper<BaseDuckInfo>().eq("duck_num", duckIncubateInfo.getDuckNum()));
         if (baseDuckInfo.getDuckSex() == 0){
             return new Result(10001,"雄鸭无法新增孵化信息!",false);
@@ -43,10 +45,28 @@ public class DuckIncubateInfoController {
             return new Result(10001,"鸭只已离场!",false);
         }
         Date incubateTime = duckIncubateInfo.getIncubateTime();
-        Date layEggsTime = duckIncubateInfo.getLayEggsTime();
-        if (layEggsTime.compareTo(incubateTime) > 0){
+        String layEggsTime = duckIncubateInfo.getLayEggsTime();
+        String[] dateParts = layEggsTime.split("~");
+        String startDateString = dateParts[0];
+        String endDateString = dateParts[1];
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date startDate = sdf.parse(startDateString);
+        Date endDate = sdf.parse(endDateString);
+        if (startDate.compareTo(incubateTime) > 0){
             return new Result(10001,"孵化日期不能早于产蛋日期!",false);
         }
+        if (duckIncubateInfo.getFertilizedNum()>duckIncubateInfo.getLayEggsNum()){
+            return new Result(10001,"受精蛋数应小于产蛋数!",false);
+        }
+        if (duckIncubateInfo.getIncubateNum()>duckIncubateInfo.getFertilizedNum()){
+            return new Result(10001,"孵化数应小于受精蛋数!",false);
+        }
+        if (duckIncubateInfo.getHealthyDuckNum() > duckIncubateInfo.getIncubateNum()){
+            return new Result(10001,"健雏数应小于孵化数!",false);
+        }
+        duckIncubateInfo.setChiNum(baseDuckInfo.getChiNum());
+        duckIncubateInfo.setJiaoNum(baseDuckInfo.getJiaoNum());
+        duckIncubateInfo.setBatchNum(baseDuckInfo.getBatchNum());
         duckIncubateInfoService.save(duckIncubateInfo);
         return Result.SUCCESS();
     }

+ 80 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/EggProductionController.java

@@ -0,0 +1,80 @@
+package com.huimv.guowei.admin.controller;
+
+
+import cn.hutool.core.collection.CollUtil;
+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.common.utils.ResultCode;
+import com.huimv.guowei.admin.entity.EggProduction;
+import com.huimv.guowei.admin.entity.dto.EggProductionDto;
+import com.huimv.guowei.admin.service.IEggProductionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalTime;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author newspaper
+ * @since 2023-11-28
+ */
+@RestController
+@RequestMapping("/egg-production")
+@CrossOrigin
+public class EggProductionController {
+    @Autowired
+    private IEggProductionService eggProductionService;
+
+    @PostMapping("/list")
+    public Result add(@RequestBody Map<String,String> paramsMap){
+        String farmId = paramsMap.get("farmId");
+        List<EggProduction> eggProductions = eggProductionService.list(new QueryWrapper<EggProduction>().eq("farm_id", farmId).orderByAsc("event_type"));
+        if (CollUtil.isEmpty(eggProductions)){
+            eggProductions = new ArrayList<>();
+            EggProduction eggProduction1 = new EggProduction();
+            eggProduction1.setStartTime(LocalTime.MIN);
+            eggProduction1.setEndTime(LocalTime.NOON.minusSeconds(1));
+            eggProduction1.setEventType(0);
+            eggProduction1.setFarmId(Integer.valueOf(farmId));
+            eggProductions.add(eggProduction1);
+
+            EggProduction eggProduction2 = new EggProduction();
+            eggProduction2.setStartTime(LocalTime.NOON);
+            eggProduction2.setEndTime(LocalTime.MAX.minusSeconds(1));
+            eggProduction2.setEventType(1);
+            eggProduction2.setFarmId(Integer.valueOf(farmId));
+            eggProductions.add(eggProduction2);
+            eggProductionService.saveBatch(eggProductions);
+        }
+        return new Result(ResultCode.SUCCESS,eggProductions);
+    }
+
+    @PostMapping("/update")
+    public Result add(@RequestBody EggProductionDto eggProductionDto){
+        List<EggProduction> list = eggProductionDto.getList();
+        EggProduction eggProduction1 = list.stream().filter(eggProduction -> eggProduction.getEventType().equals(0)).findFirst().orElse(null);
+        if (eggProduction1.getStartTime().isAfter(eggProduction1.getEndTime())){
+            return new Result(10001,"捡蛋起始时间不能晚于结束时间",false);
+        }
+        EggProduction eggProduction2 = list.stream().filter(eggProduction -> eggProduction.getEventType().equals(1)).findFirst().orElse(null);
+        if (eggProduction2.getStartTime().isAfter(eggProduction2.getEndTime())){
+            return new Result(10001,"上料起始时间不能晚于结束时间",false);
+        }
+        if (isTimeOverlap(eggProduction1.getStartTime(),eggProduction1.getEndTime(),eggProduction2.getStartTime(),eggProduction2.getEndTime())) {
+            return new Result(10001,"存在时间重叠",false);
+        }
+        eggProductionService.saveOrUpdateBatch(list);
+        return Result.SUCCESS();
+    }
+
+    public boolean isTimeOverlap(LocalTime start1, LocalTime end1, LocalTime start2, LocalTime end2) {
+        return !(end1.isBefore(start2) || start1.isAfter(end2));
+    }
+}

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

@@ -32,5 +32,12 @@ public class EnvDataController {
     public Result listByBuild(@RequestBody Map<String ,String> paramsMap){
         return envDataService.listByBuild(paramsMap);
     }
-
+    @PostMapping("/getOneData")
+    public Result getOneData(@RequestBody Map<String ,String> paramsMap){
+        return envDataService.getOneData(paramsMap);
+    }
+    @PostMapping("/listDetail")
+    public Result listDetail(@RequestBody Map<String ,String> paramsMap){
+        return envDataService.getOneData(paramsMap);
+    }
 }

+ 3 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/controller/EnvMoveCallController.java

@@ -72,6 +72,9 @@ public class EnvMoveCallController {
             envMoveCall.setCallDate(sdf2.parse(endDate));
             envMoveCall.setDayage(duckInfo.getDayAge());
             envMoveCall.setDuckId(duckInfo.getId());
+            envMoveCall.setChiNum(duckInfo.getChiNum());
+            envMoveCall.setJiaoNum(duckInfo.getJiaoNum());
+            envMoveCall.setBatchNum(duckInfo.getBatchNum());
             moveCallService.save(envMoveCall);
             return new Result(10000, "添加成功!", true);
         }

+ 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;
 
 
 }

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

@@ -0,0 +1,58 @@
+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 java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+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;
+
+    /**
+     * 创建时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date createTime;
+
+    /**
+     * 是否启用 0为启用 1为不启用
+     */
+    private Integer isEnable;
+
+    private Integer count;
+
+
+}

+ 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;
 
 }

+ 8 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/Departure.java

@@ -59,4 +59,12 @@ public class Departure implements Serializable {
 
     private String unitName;
 
+    private String chiNum;
+
+    private String jiaoNum;
+
+    private String batchNum;
+
+    private Integer type;
+
 }

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

@@ -53,10 +53,6 @@ public class DuckBodySizeInfo implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
     private Date measureDate;
 
-    /**
-     * 翅号
-     */
-    private String wingNum;
 
     /**
      * 体斜长(cm)
@@ -100,5 +96,10 @@ public class DuckBodySizeInfo implements Serializable {
 
     private Integer farmId;
 
+    private String chiNum;
+
+    private String jiaoNum;
+
+    private String batchNum;
 
 }

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

@@ -50,8 +50,8 @@ public class DuckEggTextureInfo implements Serializable {
     /**
      * 产蛋日期
      */
-    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
-    private Date layEggsTime;
+//    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private String layEggsTime;
 
     /**
      * 测定日期
@@ -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/DuckHealthInfo.java

@@ -69,6 +69,11 @@ public class DuckHealthInfo implements Serializable {
 
     private String unitName;//笼位名称
 
+    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;
 
 }

+ 23 - 2
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/DuckIncubateInfo.java

@@ -50,8 +50,8 @@ public class DuckIncubateInfo implements Serializable {
     /**
      * 产蛋日期
      */
-    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
-    private Date layEggsTime;
+//    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
+    private String layEggsTime;
 
     /**
      * 产蛋数量(枚)
@@ -75,11 +75,32 @@ public class DuckIncubateInfo implements Serializable {
     private String incubateRate;
 
     /**
+     * 健雏数
+     */
+    private Integer healthyDuckNum;
+
+    /**
      * 健雏率
      */
     private String healthyDuckRate;
 
+    /**
+     * 受精蛋数
+     */
+    private Integer fertilizedNum;
+
+    /**
+     * 受精率
+     */
+    private String fertilizedRate;
+
     private Integer farmId;
 
+    private String chiNum;
+
+    private String jiaoNum;
+
+    private String batchNum;
+
 
 }

+ 57 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/EggProduction.java

@@ -0,0 +1,57 @@
+package com.huimv.guowei.admin.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author newspaper
+ * @since 2023-11-28
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("egg_production")
+public class EggProduction implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 开始时间
+     */
+    @TableField("start_time")
+    private LocalTime startTime;
+
+    /**
+     * 结束时间
+     */
+    @TableField("end_time")
+    private LocalTime endTime;
+
+    /**
+     * 0:捡蛋 1:上料
+     */
+    @TableField("event_type")
+    private Integer eventType;
+
+    /**
+     * 牧场编号
+     */
+    @TableField("farm_id")
+    private Integer farmId;
+
+
+}

+ 6 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/EnvMoveCall.java

@@ -68,4 +68,10 @@ public class EnvMoveCall implements Serializable {
     private String unitName;
     private Integer unitId;
 
+    private String chiNum;
+
+    private String jiaoNum;
+
+    private String batchNum;
+
 }

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

@@ -73,5 +73,10 @@ public class EnvRegularCallEgg implements Serializable {
     private Integer unitId;
     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;
+ }

+ 11 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/dto/EggProductionDto.java

@@ -0,0 +1,11 @@
+package com.huimv.guowei.admin.entity.dto;
+
+import com.huimv.guowei.admin.entity.EggProduction;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class EggProductionDto {
+    private List<EggProduction> list;
+}

+ 11 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/BaseBuildingVo.java

@@ -0,0 +1,11 @@
+package com.huimv.guowei.admin.entity.vo;
+
+import com.huimv.guowei.admin.entity.BaseBuilding;
+import lombok.Data;
+
+@Data
+public class BaseBuildingVo extends BaseBuilding {
+    private String chiNum;
+
+    private Integer duckSex;
+}

+ 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;
+}

+ 54 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/DepartureVo.java

@@ -0,0 +1,54 @@
+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.util.Date;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author author
+ * @since 2023-06-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("departure")
+public class DepartureVo implements Serializable {
+
+//    private static final long serialVersionUID = 1L;
+//
+//    /**
+//     * id
+//     */
+//    @TableId(value = "id", type = IdType.AUTO)
+//    private Integer id;
+
+
+    /**
+     * 离场日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date date;
+
+
+    private Integer farmId;
+
+    private String chiNum;
+
+    private String batchNum;
+
+    private Integer type;
+
+    private String reason;
+
+}

+ 16 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/EnvDataGetOneVo.java

@@ -0,0 +1,16 @@
+package com.huimv.guowei.admin.entity.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class EnvDataGetOneVo {
+    private String deviceCode;
+    private String envTemp;
+    private String envHum;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createTime;
+
+}

+ 41 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/entity/vo/TreeBaseBuildingVo.java

@@ -0,0 +1,41 @@
+package com.huimv.guowei.admin.entity.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TreeBaseBuildingVo implements Comparable<TreeBaseBuildingVo> {
+    private static final long serialVersionUID=1L;
+
+    private String id;
+
+    private String buildName;
+
+    private Integer parentId;
+
+    private Integer fType;
+
+    private String chiNum;
+
+    private Integer duckSex;
+
+    private Integer farmCode;
+
+    private Integer stageCode;
+
+    private Integer sort;
+
+
+    private List<TreeBaseBuildingVo> childNode;
+
+
+    @Override
+    public int compareTo(TreeBaseBuildingVo o) {
+        return Integer.compare(Integer.parseInt(this.id), Integer.parseInt(o.id));
+    }
+}

+ 3 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/mapper/BaseBuildingMapper.java

@@ -2,6 +2,7 @@ package com.huimv.guowei.admin.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.huimv.guowei.admin.entity.BaseBuilding;
+import com.huimv.guowei.admin.entity.vo.BaseBuildingVo;
 import com.huimv.guowei.admin.entity.vo.ScreenDuckVo;
 import com.huimv.guowei.admin.entity.vo.ScreenEnergyVo;
 import com.huimv.guowei.admin.entity.vo.ScreenFeedVo;
@@ -29,4 +30,6 @@ public interface BaseBuildingMapper extends BaseMapper<BaseBuilding> {
     List<ScreenFeedVo> listScreenFeed();
 
     List<ScreenDuckVo> listScreenDuck(String farmId);
+
+    List<BaseBuildingVo> listTreeDuckBuilding(String farmId);
 }

+ 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> {
+
+}

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

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

+ 3 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/mapper/EnvDataMapper.java

@@ -2,6 +2,7 @@ package com.huimv.guowei.admin.mapper;
 
 import com.huimv.guowei.admin.entity.EnvData;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huimv.guowei.admin.entity.vo.EnvDataGetOneVo;
 import com.huimv.guowei.admin.entity.vo.EnvDataScreenVo;
 import com.huimv.guowei.admin.entity.vo.EnvDataVo;
 
@@ -30,4 +31,6 @@ public interface EnvDataMapper extends BaseMapper<EnvData> {
     EnvDataVo getLastFlowByUnitId(String farmId, String unitId);
 
     List<EnvDataScreenVo> getLastFlowScreen(String farmId);
+
+    List<EnvDataGetOneVo> getOneData(String farmId);
 }

+ 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());

+ 2 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/IBaseBuildingService.java

@@ -39,4 +39,6 @@ public interface IBaseBuildingService extends IService<BaseBuilding> {
     Result listScreenFeed(Map<String, String> map);
 
     Result listScreenDuck(Map<String, String> map);
+
+    Result listTreeDuckBuilding(Map<String, String> map);
 }

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

@@ -30,10 +30,17 @@ 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);
 
     Result listDuckByScreen2(HttpServletRequest httpServletRequest, Map<String,String> paramsMap);
+
+    Result listAppDuck(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);
 }

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

@@ -5,6 +5,7 @@ import com.huimv.guowei.admin.entity.Departure;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 import javax.servlet.http.HttpServletRequest;
+import java.text.ParseException;
 import java.util.Map;
 
 /**
@@ -19,4 +20,9 @@ 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);
+
+    Result editBatch(HttpServletRequest httpServletRequest, Map<String,String> paramsMap) throws ParseException;
+
 }

+ 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);
 }

+ 16 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/IEggProductionService.java

@@ -0,0 +1,16 @@
+package com.huimv.guowei.admin.service;
+
+import com.huimv.guowei.admin.entity.EggProduction;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author newspaper
+ * @since 2023-11-28
+ */
+public interface IEggProductionService extends IService<EggProduction> {
+
+}

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

@@ -19,4 +19,8 @@ public interface IEnvDataService extends IService<EnvData> {
     Result getLastFlow(Map<String, String> paramsMap);
 
     Result listByBuild(Map<String, String> paramsMap);
+
+    Result getOneData(Map<String, String> paramsMap);
+
+    Result listDetail(Map<String, String> paramsMap);
 }

+ 46 - 0
huimv-admin/src/main/java/com/huimv/guowei/admin/service/impl/BaseBuildingServiceImpl.java

@@ -285,6 +285,15 @@ public class BaseBuildingServiceImpl extends ServiceImpl<BaseBuildingMapper, Bas
         return new Result(ResultCode.SUCCESS,resultMap);
     }
 
+    @Override
+    public Result listTreeDuckBuilding(Map<String, String> map) {
+        String farmId = map.get("farmId");
+        List<BaseBuildingVo> baseBuildings = baseBuildingMapper.listTreeDuckBuilding(farmId);
+        List<TreeBaseBuildingVo> treeBaseBuildings = parseBizBaseDuckArea(baseBuildings);
+        Collections.sort(treeBaseBuildings);
+        return new Result(ResultCode.SUCCESS,treeBaseBuildings);
+    }
+
 
 //    @Override
 //    public Result list(String farmCode, String buildName, String stageCode) {
@@ -339,4 +348,41 @@ public class BaseBuildingServiceImpl extends ServiceImpl<BaseBuildingMapper, Bas
 //        roots.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(TreeBaseBuilding::getId)) ),ArrayList ::new));
         return roots;
     }
+
+
+    private List<TreeBaseBuildingVo> parseBizBaseDuckArea(List<BaseBuildingVo> bizBaseAreas){
+        //构建需要展示的树形节点结构
+        Map<String, TreeBaseBuildingVo> nodeMap = bizBaseAreas.stream().map(baseBuilding -> {
+            TreeBaseBuildingVo baseVo = new TreeBaseBuildingVo();
+            baseVo.setId(baseBuilding.getId()+"");
+            baseVo.setFarmCode(baseBuilding.getFarmId());
+            baseVo.setParentId(baseBuilding.getParentId());
+            baseVo.setSort(baseBuilding.getSort());
+            baseVo.setDuckSex(baseBuilding.getDuckSex());
+            baseVo.setChiNum(baseBuilding.getChiNum());
+            baseVo.setStageCode(baseBuilding.getStageCode());
+            baseVo.setBuildName(baseBuilding.getBuildName());
+            baseVo.setFType(baseBuilding.getFType());
+            baseVo.setChildNode(new ArrayList<>());
+            return baseVo;
+        }).collect(Collectors.toMap(TreeBaseBuildingVo::getId, b -> b,(k1, k2)->k1));
+        //创建数组存父亲节点
+        ArrayList<TreeBaseBuildingVo> roots = new ArrayList<>();
+        //构建树形
+        nodeMap.values().forEach(item->{
+            String parentCode = item.getParentId()+"";
+            if (nodeMap.get(parentCode) == null){
+                //父节点为空,说明当前节点就已经是父节点了 将该节点存起来
+                roots.add(item);
+            }else {
+                //父节点 不为空,说明有父节点,拿到该节点的父节点的孩子节点(就是我自己),将该节点存起来
+                nodeMap.get(parentCode).getChildNode().add(item);
+            }
+        });
+        roots.forEach(parent -> {
+            List<TreeBaseBuildingVo> childNodes = parent.getChildNode();
+            childNodes.sort(Comparator.comparingInt(o -> Integer.parseInt(o.getId())));
+        });
+        return roots;
+    }
 }

+ 183 - 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,15 @@ 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 jiaoNum = paramsMap.get("jiaoNum");
+        String location = paramsMap.get("location");//前端传来的是位置名字
         String farmId = paramsMap.get("farmId");//场的编码
         String pageNum = paramsMap.get("pageNum");
         String pageSize = paramsMap.get("pageSize");
@@ -78,7 +87,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(jiaoNum), "jiao_num", jiaoNum)
                 .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 +96,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 +135,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 +152,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 +164,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 +268,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 +281,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 +352,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");//鸭只编号
@@ -579,5 +734,25 @@ public class BaseDuckInfoServiceImpl extends ServiceImpl<BaseDuckInfoMapper, Bas
 
     }
 
+    @Override
+    public Result listAppDuck(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
+        String chiNum = paramsMap.get("chiNum");
+        String jiaoNum = paramsMap.get("jiaoNum");
+        String farmId = paramsMap.get("farmId");//场的编码
+        String pageNum = paramsMap.get("pageNum");
+        String pageSize = paramsMap.get("pageSize");
+        if (pageNum == null || "".equals(pageNum)) {
+            pageNum = "1";
+        }
+        if (pageSize == null || "".equals(pageSize)) {
+            pageSize = "10";
+        }
+        QueryWrapper<BaseDuckInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like(StringUtils.isNotBlank(chiNum), "chi_num", chiNum)
+                .like(StringUtils.isNotBlank(jiaoNum), "jiao_num", jiaoNum).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));
+    }
+
 
 }

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

@@ -0,0 +1,64 @@
+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.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.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");
+        String batchNum = paramsMap.get("batchNum");
+        String pageNum = paramsMap.get("pageNum");
+        String pageSize = paramsMap.get("pageSize");
+        if (pageNum == null || "".equals(pageNum)) {
+            pageNum = "1";
+        }
+        if (pageSize == null || "".equals(pageSize)) {
+            pageSize = "10";
+        }
+        QueryWrapper<Batch> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("farm_id", farmId).like(StringUtils.isNotBlank(batchNum), "batch_num", batchNum);
+        Page<Batch> page = new Page<>(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
+        Page<Batch> batchPage = batchMapper.selectPage(page, queryWrapper);
+        List<Batch> records = batchPage.getRecords();
+        for (Batch record : records) {
+            QueryWrapper<BaseDuckInfo> queryWrapper1 = new QueryWrapper<>();
+            queryWrapper1.eq("farm_id", farmId).eq("batch_num", record.getBatchNum());
+            Integer count = infoMapper.selectCount(queryWrapper1);
+            record.setCount(count);
+        }
+        return new Result(ResultCode.SUCCESS, batchPage);
+    }
+}

+ 66 - 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) {
@@ -51,8 +65,60 @@ public class BreedServiceImpl extends ServiceImpl<BreedMapper, Breed> implements
         }
         QueryWrapper<Breed> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("farm_id", farmId).like(StringUtils.isNotBlank(unitName),"unit_name", unitName)
+                .or()
+                .like(StringUtils.isNotBlank(unitName),"male_chi_num", unitName)
+                .or()
+                .like(StringUtils.isNotBlank(unitName),"female_chi_num", unitName)
+                .or()
+                .like(StringUtils.isNotBlank(unitName),"male_jiao_num", unitName)
+                .or()
+                .like(StringUtils.isNotBlank(unitName),"female_jiao_num", unitName)
                 .orderByDesc("id");
         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.setFemaleNum(duckInfo.getDuckNum());
+                breed.setUnitId(duckInfo.getUnitId());
+                breed.setUnitName(duckInfo.getUnitName());
+                breed.setFarmId(duckInfo.getFarmId());
+                QueryWrapper<BaseDuckInfo> queryWrapper1 = new QueryWrapper<>();
+                queryWrapper1.eq("chi_num", breed.getMaleChiNum());
+                BaseDuckInfo duckInfo1 = infoMapper.selectOne(queryWrapper);
+                breed.setMaleNum(duckInfo1.getDuckNum());
+                breedMapper.insert(breed);
+                System.out.println(breed.toString());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new Result(10001, "数据格式异常!", false);
+        }finally {
+            //写着好看的
+        }
+        return new Result(10000, "保存成功!", true);
+    }
 }

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

@@ -5,8 +5,12 @@ 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.Batch;
 import com.huimv.guowei.admin.entity.Departure;
 import com.huimv.guowei.admin.entity.DuckHealthInfo;
+import com.huimv.guowei.admin.mapper.BaseDuckInfoMapper;
+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;
@@ -14,6 +18,10 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletRequest;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -29,6 +37,10 @@ public class DepartureServiceImpl extends ServiceImpl<DepartureMapper, Departure
 
     @Autowired
     private DepartureMapper departureMapper;
+    @Autowired
+    private BatchMapper batchMapper;
+    @Autowired
+    private BaseDuckInfoMapper infoMapper;
 
     @Override
     public Result list(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) {
@@ -38,6 +50,7 @@ public class DepartureServiceImpl extends ServiceImpl<DepartureMapper, Departure
         queryWrapper.eq("farm_id", farmId)
                 .like(StringUtils.isNotBlank(unitName),"unit_name", unitName)
                 .orderByDesc("date").last(" limit 10");
+
         return new Result(ResultCode.SUCCESS, departureMapper.selectList(queryWrapper));
     }
 
@@ -55,8 +68,49 @@ public class DepartureServiceImpl extends ServiceImpl<DepartureMapper, Departure
         }
         QueryWrapper<Departure> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("farm_id", farmId).like(StringUtils.isNotBlank(unitName),"unit_name", unitName)
+                .or()
+                .like(StringUtils.isNotBlank(unitName),"chi_num", unitName)
+                .or()
+                .like(StringUtils.isNotBlank(unitName),"jiao_num", unitName)
                 .orderByDesc("id");
         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;
+    }
+
+    @Override
+    public Result editBatch(HttpServletRequest httpServletRequest, Map<String, String> paramsMap) throws ParseException {
+        String farmId = paramsMap.get("farmId");
+        String batchNum = paramsMap.get("batchNum");
+        String reason = paramsMap.get("reason");
+        String date = paramsMap.get("date");
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        QueryWrapper<BaseDuckInfo> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("farm_id", farmId).eq("batch_num", batchNum);
+        List<BaseDuckInfo> baseDuckInfos = infoMapper.selectList(queryWrapper);
+        for (BaseDuckInfo baseDuckInfo : baseDuckInfos) {
+            if (baseDuckInfo.getIsCage() != 1) {
+                baseDuckInfo.setIsCage(1);
+                Departure departure = new Departure();
+                departure.setBatchNum(baseDuckInfo.getBatchNum());
+                departure.setJiaoNum(baseDuckInfo.getJiaoNum());
+                departure.setChiNum(baseDuckInfo.getChiNum());
+                departure.setDate(sdf.parse(date));
+                departure.setFarmId(baseDuckInfo.getFarmId());
+                departure.setUnitName(baseDuckInfo.getUnitName());
+                departure.setUnitId(baseDuckInfo.getUnitId());
+                departure.setDuckNum(baseDuckInfo.getDuckNum());
+                departure.setReason(reason);
+                departure.setType(2);
+                infoMapper.updateById(baseDuckInfo);
+                departureMapper.insert(departure);
+            }
+        }
+        return new Result(ResultCode.SUCCESS);
+    }
 }

+ 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);
+    }
 }

+ 82 - 3
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) {
@@ -46,7 +60,72 @@ public class DuckEggTextureInfoServiceImpl extends ServiceImpl<DuckEggTextureInf
         String unitName = paramsMap.get("unitName");
         Page<DuckEggTextureInfo> page = new Page(Integer.parseInt(pageNo),Integer.parseInt(pageSize));
         Page<DuckEggTextureInfo> duckEggTextureInfoPage = duckEggTextureInfoMapper.selectPage(page,
-                new QueryWrapper<DuckEggTextureInfo>().like("unit_name",unitName).eq("farm_id",farmId).orderByDesc("id"));
+                new QueryWrapper<DuckEggTextureInfo>().like("unit_name", unitName)
+                        .or(wrapper -> wrapper.like("chi_num", unitName).or().like("jiao_num", 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);
+    }
 }

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

@@ -89,6 +89,9 @@ public class DuckHealthInfoServiceImpl extends ServiceImpl<DuckHealthInfoMapper,
         healthInfo.setDuckId(baseDuckInfo.getId());
         healthInfo.setUnitId(baseDuckInfo.getUnitId());
         healthInfo.setUnitName(baseDuckInfo.getUnitName());
+        healthInfo.setChiNum(baseDuckInfo.getChiNum());
+        healthInfo.setJiaoNum(baseDuckInfo.getJiaoNum());
+        healthInfo.setBatchNum(baseDuckInfo.getBatchNum());
         healthInfoMapper.insert(healthInfo);
         return new Result(ResultCode.SUCCESS);
     }
@@ -117,7 +120,9 @@ public class DuckHealthInfoServiceImpl extends ServiceImpl<DuckHealthInfoMapper,
             pageSize = "10";
         }
         QueryWrapper<DuckHealthInfo> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("farm_id", farmId).like(StringUtils.isNotBlank("unit_name"),"unit_name", unitName)
+        queryWrapper.eq("farm_id", farmId).like(StringUtils.isNotBlank(unitName),"unit_name", unitName)
+                .or().like(StringUtils.isNotBlank(unitName),"chi_num", unitName).or()
+                .like(StringUtils.isNotBlank(unitName),"jiao_num", unitName)
                 .orderByDesc("health_date");
         Page<DuckHealthInfo> page = new Page<>(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
         return new Result(ResultCode.SUCCESS, healthInfoMapper.selectPage(page, queryWrapper));

+ 58 - 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;
 
 /**
@@ -74,6 +82,9 @@ public class DuckImmunityInfoServiceImpl extends ServiceImpl<DuckImmunityInfoMap
         duckImmunityInfo.setUnitName(baseDuckInfo.getUnitName());
         duckImmunityInfo.setUnitId(baseDuckInfo.getUnitId());
         duckImmunityInfo.setDuckNum(baseDuckInfo.getDuckNum());
+        duckImmunityInfo.setChiNum(baseDuckInfo.getChiNum());
+        duckImmunityInfo.setJiaoNum(baseDuckInfo.getJiaoNum());
+        duckImmunityInfo.setBatchNum(baseDuckInfo.getBatchNum());
         infoMapper.insert(duckImmunityInfo);
         return new Result(ResultCode.SUCCESS);
     }
@@ -99,9 +110,56 @@ public class DuckImmunityInfoServiceImpl extends ServiceImpl<DuckImmunityInfoMap
         }
         QueryWrapper<DuckImmunityInfo> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("farm_id", farmId).like(StringUtils.isNotBlank(unitName),"unit_name", unitName)
+                .or()
+                .like(StringUtils.isNotBlank(unitName),"chi_num", unitName)
+                .or()
+                .like(StringUtils.isNotBlank(unitName),"jiao_num", unitName)
         .orderByDesc("health_date");
         Page<DuckImmunityInfo> page = new Page<>(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
         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);
+    }
+
 }

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

@@ -46,7 +46,9 @@ public class DuckIncubateInfoServiceImpl extends ServiceImpl<DuckIncubateInfoMap
         String unitName = paramsMap.get("unitName");
         Page<DuckIncubateInfo> page = new Page(Integer.parseInt(pageNo),Integer.parseInt(pageSize));
         Page<DuckIncubateInfo> duckIncubateInfoPage = duckIncubateInfoMapper.selectPage(page,
-                new QueryWrapper<DuckIncubateInfo>().eq("farm_id",farmId).like("unit_name",unitName).orderByDesc("id"));
+                new QueryWrapper<DuckIncubateInfo>().eq("farm_id",farmId)
+                        .like("unit_name", unitName)
+                        .or(wrapper -> wrapper.like("chi_num", unitName).or().like("jiao_num", unitName)).orderByDesc("id"));
         return new Result(ResultCode.SUCCESS,duckIncubateInfoPage);
     }
 

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

@@ -0,0 +1,20 @@
+package com.huimv.guowei.admin.service.impl;
+
+import com.huimv.guowei.admin.entity.EggProduction;
+import com.huimv.guowei.admin.mapper.EggProductionMapper;
+import com.huimv.guowei.admin.service.IEggProductionService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author newspaper
+ * @since 2023-11-28
+ */
+@Service
+public class EggProductionServiceImpl extends ServiceImpl<EggProductionMapper, EggProduction> implements IEggProductionService {
+
+}

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

@@ -1,15 +1,20 @@
 package com.huimv.guowei.admin.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.huimv.guowei.admin.common.utils.Result;
 import com.huimv.guowei.admin.common.utils.ResultCode;
 import com.huimv.guowei.admin.entity.BaseBuilding;
 import com.huimv.guowei.admin.entity.EnvData;
+import com.huimv.guowei.admin.entity.EnvDevice;
+import com.huimv.guowei.admin.entity.vo.EnvDataGetOneVo;
 import com.huimv.guowei.admin.entity.vo.EnvDataVo;
 import com.huimv.guowei.admin.mapper.BaseBuildingMapper;
 import com.huimv.guowei.admin.mapper.EnvDataMapper;
+import com.huimv.guowei.admin.mapper.EnvDeviceMapper;
 import com.huimv.guowei.admin.service.IEnvDataService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
@@ -34,6 +39,8 @@ public class EnvDataServiceImpl extends ServiceImpl<EnvDataMapper, EnvData> impl
 
     @Resource
     private BaseBuildingMapper baseBuildingMapper;
+    @Resource
+    private EnvDeviceMapper deviceMapper;
 
     @Override
     public Result getLastFlow(Map<String, String> paramsMap) {
@@ -80,4 +87,50 @@ public class EnvDataServiceImpl extends ServiceImpl<EnvDataMapper, EnvData> impl
         return new Result(ResultCode.SUCCESS,envDataList);
     }
 
+    @Override
+    public Result getOneData(Map<String, String> paramsMap) {
+        String farmId = paramsMap.get("farmId");
+        String unitId = paramsMap.get("unitId");
+        QueryWrapper<EnvData> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("farm_id", farmId).eq("unit_id", unitId).orderByDesc("create_time")
+                .last(" limit 1");
+        EnvData envData = envDataMapper.selectOne(queryWrapper);
+        QueryWrapper<EnvDevice> queryWrapper1 = new QueryWrapper<>();
+        queryWrapper1.eq("farm_id", farmId).eq("device_code", envData.getDeviceId());
+        EnvDevice device = deviceMapper.selectOne(queryWrapper1);
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("deviceCode", envData.getDeviceId());
+        jsonObject.put("createTime", envData.getCreateTime());
+        jsonObject.put("envHum", envData.getEnvHum());
+        jsonObject.put("envTemp", envData.getEnvTemp());
+        jsonObject.put("unitName", device.getUnitName());
+        jsonObject.put("unitId", device.getUnitId());
+/*        JSONArray jsonArray = new JSONArray();
+        List<EnvDataGetOneVo> data = envDataMapper.getOneData(farmId);
+        for (EnvDataGetOneVo datum : data) {
+            QueryWrapper<EnvDevice> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("farm_id", farmId).eq("device_code", datum.getDeviceCode());
+            EnvDevice device = deviceMapper.selectOne(queryWrapper);
+            JSONObject jsonObject = new JSONObject();
+            jsonObject.put("deviceCode", datum.getDeviceCode());
+            jsonObject.put("createTime", datum.getCreateTime());
+            jsonObject.put("envHum", datum.getEnvHum());
+            jsonObject.put("envTemp", datum.getEnvTemp());
+            jsonObject.put("unitName", device.getUnitName());
+            jsonObject.put("unitId", device.getUnitId());
+            jsonArray.add(jsonObject);
+        }*/
+        return new Result(ResultCode.SUCCESS, jsonObject);
+    }
+
+    @Override
+    public Result listDetail(Map<String, String> paramsMap) {
+        String farmId = paramsMap.get("farmId");
+        String unitId = paramsMap.get("unitId");
+        QueryWrapper<EnvData> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("farm_id", farmId).eq("unit_id", unitId).orderByAsc("create_time");
+        List<EnvData> dataList = envDataMapper.selectList(queryWrapper);
+        return new Result(ResultCode.SUCCESS, dataList);
+    }
+
 }

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

@@ -118,7 +118,10 @@ public class EnvMoveCallServiceImpl extends ServiceImpl<EnvMoveCallMapper, EnvMo
         }
         QueryWrapper<EnvMoveCall> queryWrapper = new QueryWrapper<>();
         if ("1".equals(type)) {
-            queryWrapper.like(StringUtils.isNotBlank(unitName), "unit_name", unitName).orderByDesc("call_date").eq("farm_id", farmId);
+            queryWrapper.like(StringUtils.isNotBlank(unitName), "unit_name", unitName).or()
+                    .like(StringUtils.isNotBlank(unitName), "chi_num", unitName).or()
+                    .like(StringUtils.isNotBlank(unitName), "jiao_num", unitName)
+                    .orderByDesc("call_date").eq("farm_id", farmId);
             Page<EnvMoveCall> page = new Page<>(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
             return new Result(ResultCode.SUCCESS, moveCallMapper.selectPage(page, queryWrapper));
         } else {

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

@@ -126,6 +126,9 @@ public class EnvRegularCallEggServiceImpl extends ServiceImpl<EnvRegularCallEggM
         egg.setEggNum(Integer.parseInt(eggNum));
         egg.setCallDate(sdf.parse(date));
         egg.setDuckId(Integer.parseInt(duckId));
+        egg.setChiNum(baseDuckInfo.getChiNum());
+        egg.setJiaoNum(baseDuckInfo.getJiaoNum());
+        egg.setBatchNum(baseDuckInfo.getBatchNum());
         eggMapper.insert(egg);
         return new Result(10000, "添加成功!", true);
     }
@@ -176,6 +179,9 @@ public class EnvRegularCallEggServiceImpl extends ServiceImpl<EnvRegularCallEggM
 
         QueryWrapper<EnvRegularCallEgg> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("farm_id", farmId).like(StringUtils.isNotBlank(unitName), "unit_name", unitName)
+                .or()
+                .like(StringUtils.isNotBlank(unitName), "chi_num", unitName).or()
+                .like(StringUtils.isNotBlank(unitName), "jiao_num", unitName)
                 .select("IFNULL(SUM(duck_weight),'0') duckWeight, IFNULL(SUM(egg_num),'0') eggNum,duck_num duckNum,unit_name unitName,duck_id duckId")
                 .groupBy("duck_num")
                 .orderByDesc("call_date");
@@ -215,7 +221,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);
+    }
 }

+ 7 - 0
huimv-admin/src/main/resources/com/huimv/guowei/admin/mapper/BaseBuildingMapper.xml

@@ -96,4 +96,11 @@ GROUP BY d.duck_num
 ORDER BY duck_num
     </select>
 
+    <select id="listTreeDuckBuilding" resultType="com.huimv.guowei.admin.entity.vo.BaseBuildingVo">
+        SELECT b.*, d.chi_num,d.duck_sex
+        FROM `base_building` b
+        LEFT JOIN `base_duck_info` d ON b.id = d.unit_id AND d.is_cage = 0 AND b.farm_id = #{farmId}
+        ORDER BY b.id ASC
+    </select>
+
 </mapper>

+ 20 - 12
huimv-admin/src/main/resources/com/huimv/guowei/admin/mapper/EnvDataMapper.xml

@@ -4,18 +4,18 @@
 
     <!-- 通用查询映射结果 -->
     <resultMap id="BaseResultMap" type="com.huimv.guowei.admin.entity.EnvData">
-        <id column="id" property="id" />
-        <result column="device_id" property="deviceId" />
-        <result column="env_temp" property="envTemp" />
-        <result column="env_hum" property="envHum" />
-        <result column="original_data" property="originalData" />
-        <result column="unit_id" property="unitId" />
-        <result column="farm_id" property="farmId" />
-        <result column="create_time" property="createTime" />
-        <result column="receive_date" property="receiveDate" />
-        <result column="other1" property="other1" />
-        <result column="other2" property="other2" />
-        <result column="other3" property="other3" />
+        <id column="id" property="id"/>
+        <result column="device_id" property="deviceId"/>
+        <result column="env_temp" property="envTemp"/>
+        <result column="env_hum" property="envHum"/>
+        <result column="original_data" property="originalData"/>
+        <result column="unit_id" property="unitId"/>
+        <result column="farm_id" property="farmId"/>
+        <result column="create_time" property="createTime"/>
+        <result column="receive_date" property="receiveDate"/>
+        <result column="other1" property="other1"/>
+        <result column="other2" property="other2"/>
+        <result column="other3" property="other3"/>
     </resultMap>
 
     <select id="getLastFlow" resultType="com.huimv.guowei.admin.entity.vo.EnvDataVo">
@@ -83,4 +83,12 @@
         ) d ON b.id = d.unit_id
         WHERE b.parent_id = 0 AND b.farm_id = #{farmId}
     </select>
+
+    <select id="getOneData" resultType="com.huimv.guowei.admin.entity.vo.EnvDataGetOneVo">
+        SELECT
+	b.device_id deviceCode,b.create_time createTime,b.env_temp envTemp,b.env_hum envHum
+FROM
+	( SELECT create_time, max( id ) id,device_id FROM env_data GROUP BY device_id  ) a
+	JOIN env_data b ON a.device_id = b.device_id AND a.id = b.id WHERE b.farm_id=#{farmId}
+    </select>
 </mapper>

+ 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>

+ 9 - 1
huimv-admin/src/main/resources/mapper/DuckBodySizeInfoMapper.xml

@@ -30,7 +30,15 @@
 
     <select id="listPageInfo" resultType="com.huimv.guowei.admin.entity.vo.DuckBodySizeInfoVo">
         SELECT s.*,b.day_age FROM `duck_body_size_info` s LEFT JOIN `base_duck_info` b ON s.duck_num = b.duck_num
-        WHERE s.farm_id = #{farmId} AND s.unit_name Like '%${unitName}%' ORDER BY s.id DESC
+        WHERE s.farm_id = #{farmId}
+        <if test="unitName != null and unitName != ''">
+            AND (
+            s.unit_name LIKE CONCAT('%', #{unitName}, '%')
+            OR s.chi_num LIKE CONCAT('%', #{unitName}, '%')
+            OR s.jiao_num LIKE CONCAT('%', #{unitName}, '%')
+            )
+        </if>
+        ORDER BY s.id DESC
     </select>
 
     <select id="getLastInfo" resultType="com.huimv.guowei.admin.entity.DuckBodySizeInfo">

+ 10 - 0
huimv-admin/src/main/resources/mapper/EggProductionMapper.xml

@@ -0,0 +1,10 @@
+<?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.EggProductionMapper">
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, start_time, end_time, event_type, farm_id
+    </sql>
+
+</mapper>