wwh 1 týždeň pred
rodič
commit
9c6e36e109
100 zmenil súbory, kde vykonal 3785 pridanie a 2170 odobranie
  1. 2 2
      app-admin/src/main/java/com/ruoyi/RuoYiApplication.java
  2. 2 2
      app-admin/src/main/java/com/ruoyi/web/controller/app/EntranceBatchController.java
  3. 13 2
      app-admin/src/main/java/com/ruoyi/web/controller/app/HarmlessTreatmentController.java
  4. 212 212
      app-admin/src/main/java/com/ruoyi/web/controller/app/MonitorController.java
  5. 4 2
      app-admin/src/main/java/com/ruoyi/web/controller/app/PigpenController.java
  6. 65 65
      app-admin/src/main/java/com/ruoyi/web/core/nfid/NFIDServer.java
  7. 246 246
      app-admin/src/main/java/com/ruoyi/web/core/nfid/NFIDTestClient.java
  8. 246 246
      app-admin/src/main/java/com/ruoyi/web/core/nfid/NFIDTestClient1.java
  9. 37 37
      app-admin/src/main/java/com/ruoyi/web/core/wvp/ApiResponseParser.java
  10. 107 107
      app-admin/src/main/java/com/ruoyi/web/core/wvp/DeviceHandler.java
  11. 70 70
      app-admin/src/main/java/com/ruoyi/web/core/wvp/JsonParser.java
  12. 127 127
      app-admin/src/main/java/com/ruoyi/web/core/wvp/SessionHandler.java
  13. 38 38
      app-admin/src/main/java/com/ruoyi/web/core/wvp/domain/ApiResponse.java
  14. 612 612
      app-admin/src/main/java/com/ruoyi/web/core/wvp/domain/DeviceChannelExtend.java
  15. 15 15
      app-admin/src/main/java/com/ruoyi/web/core/wvp/domain/DeviceChannelList.java
  16. 170 170
      app-admin/src/main/java/com/ruoyi/web/core/wvp/domain/Login.java
  17. 3 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsCheckProjectController.java
  18. 23 3
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsDistributionController.java
  19. 4 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsDivideCircleController.java
  20. 60 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsDrugCheckController.java
  21. 18 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsDrugController.java
  22. 3 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsInStockController.java
  23. 55 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsPatrolController.java
  24. 10 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsRestInspectionController.java
  25. 4 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsStockController.java
  26. 55 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsStoreController.java
  27. 59 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsTransportController.java
  28. 3 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsWorkshopController.java
  29. 3 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsCheckDevice.java
  30. 2 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsCheckInstrument.java
  31. 3 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsCheckProject.java
  32. 2 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDeviceMaintenance.java
  33. 3 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDisinfectManage.java
  34. 15 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDistribution.java
  35. 8 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDrug.java
  36. 1 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDrugCheck.java
  37. 2 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsInstrumentMaintenance.java
  38. 11 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsMaterial.java
  39. 3 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsProduceCheck.java
  40. 3 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsProduceRecall.java
  41. 1 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsStore.java
  42. 3 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsTransport.java
  43. 1 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/mapper/JsCheckProjectMapper.java
  44. 1 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/mapper/JsDisinfectManageMapper.java
  45. 5 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/mapper/JsDistributionMapper.java
  46. 4 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/mapper/JsDrugCheckMapper.java
  47. 4 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/mapper/JsProduceCheckMapper.java
  48. 3 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsCheckProjectService.java
  49. 11 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsDistributionService.java
  50. 1 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsDivideCircleService.java
  51. 22 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsDrugCheckService.java
  52. 1 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsInStockService.java
  53. 11 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsPatrolService.java
  54. 3 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsRestInspectionService.java
  55. 3 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsStockService.java
  56. 11 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsStoreService.java
  57. 11 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsTransportService.java
  58. 1 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsWorkshopService.java
  59. 24 10
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsCheckDeviceServiceImpl.java
  60. 26 10
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsCheckInstrumentServiceImpl.java
  61. 31 5
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsCheckProjectServiceImpl.java
  62. 12 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDeviceMaintenanceServiceImpl.java
  63. 10 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDisinfectManageServiceImpl.java
  64. 2 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDisinfectServiceImpl.java
  65. 119 12
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDistributionServiceImpl.java
  66. 61 5
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDivideCircleServiceImpl.java
  67. 419 5
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDrugCheckServiceImpl.java
  68. 50 24
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsInStockServiceImpl.java
  69. 13 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsInstrumentMaintenanceServiceImpl.java
  70. 15 3
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsMaterialServiceImpl.java
  71. 18 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsOtherProduceServiceImpl.java
  72. 4 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsOutStockServiceImpl.java
  73. 52 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsPatrolServiceImpl.java
  74. 2 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsProduceCheckServiceImpl.java
  75. 2 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsProduceRecallServiceImpl.java
  76. 17 4
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsRestInspectionServiceImpl.java
  77. 17 1
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsSampleServiceImpl.java
  78. 7 2
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsStockServiceImpl.java
  79. 86 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsStoreServiceImpl.java
  80. 81 0
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsTransportServiceImpl.java
  81. 17 12
      app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsWorkshopServiceImpl.java
  82. 8 8
      app-admin/src/main/resources/application.yml
  83. 3 0
      app-admin/src/main/resources/mapper/JsCheckProjectMapper.xml
  84. 4 0
      app-admin/src/main/resources/mapper/JsDisinfectManageMapper.xml
  85. 12 0
      app-admin/src/main/resources/mapper/JsDistributionMapper.xml
  86. 5 0
      app-admin/src/main/resources/mapper/JsDrugCheckMapper.xml
  87. 5 0
      app-admin/src/main/resources/mapper/JsProduceCheckMapper.xml
  88. 5 0
      app-system/pom.xml
  89. 10 0
      app-system/src/main/java/com/ruoyi/app/DTO/ProductTraceDTO.java
  90. 20 0
      app-system/src/main/java/com/ruoyi/app/DTO/SlaughterBatchDTO.java
  91. 46 35
      app-system/src/main/java/com/ruoyi/app/domain/DryLossRatio.java
  92. 13 0
      app-system/src/main/java/com/ruoyi/app/domain/Pigpen.java
  93. 47 27
      app-system/src/main/java/com/ruoyi/app/domain/ProductCategory.java
  94. 67 0
      app-system/src/main/java/com/ruoyi/app/domain/response/DrugCheckParam.java
  95. 22 4
      app-system/src/main/java/com/ruoyi/app/mapper/EntranceBatchMapper.java
  96. 3 0
      app-system/src/main/java/com/ruoyi/app/mapper/HarmlessTreatmentMapper.java
  97. 5 0
      app-system/src/main/java/com/ruoyi/app/mapper/PigpenMapper.java
  98. 3 0
      app-system/src/main/java/com/ruoyi/app/mapper/ProductCategoryMapper.java
  99. 6 4
      app-system/src/main/java/com/ruoyi/app/mapper/PurchaserMapper.java
  100. 0 0
      app-system/src/main/java/com/ruoyi/app/mapper/SlaughterBatchMapper.java

+ 2 - 2
app-admin/src/main/java/com/ruoyi/RuoYiApplication.java

@@ -1,7 +1,7 @@
 package com.ruoyi;
 
 import com.ruoyi.common.server.EnvInputServer;
-import com.ruoyi.web.core.nfid.NFIDServer;
+//import com.ruoyi.web.core.nfid.NFIDServer;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -21,7 +21,7 @@ public class RuoYiApplication
     {
         // System.setProperty("spring.devtools.restart.enabled", "false");
         ApplicationContext applicationContext = SpringApplication.run(RuoYiApplication.class, args);
-        applicationContext.getBean(NFIDServer.class).start();
+//        applicationContext.getBean(NFIDServer.class).start();
         // EnvInputServer
         //applicationContext.getBean(EnvInputServer.class).run();
     }

+ 2 - 2
app-admin/src/main/java/com/ruoyi/web/controller/app/EntranceBatchController.java

@@ -48,13 +48,13 @@ public class EntranceBatchController extends BaseController
     }
 
     /**
-     * 查询入场批次列表
+     * 入场批次列表
      */
     @PreAuthorize("@ss.hasPermi('app:entranceBatch:page')")
     @GetMapping("/page")
     public TableDataInfo page(EntranceBatch entranceBatch)
     {
-        List<EntranceBatch> list = entranceBatchService.selectEntranceBatchList(entranceBatch);
+        List<EntranceBatch> list = entranceBatchService.selectEntranceBatchList1(entranceBatch);
         return getDataTable(list);
     }
 

+ 13 - 2
app-admin/src/main/java/com/ruoyi/web/controller/app/HarmlessTreatmentController.java

@@ -5,6 +5,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.ruoyi.app.domain.EntranceBatch;
+import com.ruoyi.app.mapper.HarmlessTreatmentMapper;
 import com.ruoyi.app.service.IEntranceBatchService;
 import com.ruoyi.web.v2.v1.entity.JsDivideCircle;
 import com.ruoyi.web.v2.v1.service.IJsDivideCircleService;
@@ -44,6 +45,8 @@ public class HarmlessTreatmentController extends BaseController
     private IJsDivideCircleService divideCircleService;
     @Autowired
     private IEntranceBatchService entranceBatchService;
+    @Autowired
+    private HarmlessTreatmentMapper harmlessTreatmentMapper;
 
     /**
      * 查询无害化处理列表
@@ -56,6 +59,12 @@ public class HarmlessTreatmentController extends BaseController
         return getDataTable(list);
     }
 
+    @GetMapping("/page")
+    public TableDataInfo page()
+    {
+        List<HarmlessTreatment> harmlessTreatments = harmlessTreatmentMapper.listAll();
+        return getDataTable(harmlessTreatments);
+    }
     /**
      * 导出无害化处理列表
      */
@@ -87,7 +96,8 @@ public class HarmlessTreatmentController extends BaseController
     public AjaxResult add(@Validated  @RequestBody HarmlessTreatment harmlessTreatment)
     {
         //判断全部数量是否超出了入场数量
-        if(!harmlessTreatmentService.checkTotalLessThanAmount(harmlessTreatment)){
+        int i = harmlessTreatmentService.checkTotalLessThanAmount(harmlessTreatment);
+        if(i<0){
             return error("新增无害化处理失败,病死头数、病害头数、途亡头数或急宰头数输入错误");
         }
         harmlessTreatment.setCreateBy(getUsername());
@@ -103,7 +113,8 @@ public class HarmlessTreatmentController extends BaseController
     public AjaxResult edit(@Validated @RequestBody HarmlessTreatment harmlessTreatment)
     {
         //判断全部数量是否超出了入场数量
-        if(!harmlessTreatmentService.checkTotalLessThanAmount(harmlessTreatment)){
+        int i = harmlessTreatmentService.checkTotalLessThanAmount(harmlessTreatment);
+        if(i<0){
             return error("修改无害化处理失败,病死头数、病害头数、途亡头数或急宰头数输入错误");
         }
         //判断是否填写分圈

+ 212 - 212
app-admin/src/main/java/com/ruoyi/web/controller/app/MonitorController.java

@@ -1,212 +1,212 @@
-package com.ruoyi.web.controller.app;
-
-import java.util.Date;
-import java.util.List;
-import java.util.stream.Collectors;
-import javax.servlet.http.HttpServletResponse;
-
-import com.ruoyi.app.domain.request.ReqMonitorAction;
-import com.ruoyi.web.core.wvp.domain.DeviceChannelExtend;
-import com.ruoyi.common.utils.DateUtils;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-import com.ruoyi.common.annotation.Log;
-import com.ruoyi.common.core.controller.BaseController;
-import com.ruoyi.common.core.domain.AjaxResult;
-import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.app.domain.Monitor;
-import com.ruoyi.app.service.IMonitorService;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.common.core.page.TableDataInfo;
-import com.ruoyi.web.core.wvp.DeviceHandler;
-
-/**
- * 监控设备Controller
- * 
- * @author coede
- * @date 2025-03-19
- */
-@Api("监控设备信息管理")
-@RestController
-@RequestMapping("/app/monitor")
-public class MonitorController extends BaseController
-{
-    @Autowired
-    private IMonitorService monitorService;
-
-    @Autowired
-    private DeviceHandler deviceHandler;
-
-    public static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
-    /**
-     * 查询监控设备列表
-     */
-    @ApiOperation("查询监控设备列表")
-    @PreAuthorize("@ss.hasPermi('app:monitor:list')")
-    @GetMapping("/list")
-    public TableDataInfo list(Monitor monitor)
-    {
-        startPage();
-        List<Monitor> list = monitorService.selectMonitorList(monitor);
-        return getDataTable(list);
-    }
-
-    /**
-     * 导出监控设备列表
-     */
-    @ApiOperation("导出监控设备列表")
-    @PreAuthorize("@ss.hasPermi('app:monitor:export')")
-    @Log(title = "监控设备", businessType = BusinessType.EXPORT)
-    @PostMapping("/export")
-    public void export(HttpServletResponse response, Monitor monitor)
-    {
-        List<Monitor> list = monitorService.selectMonitorList(monitor);
-        ExcelUtil<Monitor> util = new ExcelUtil<Monitor>(Monitor.class);
-        util.exportExcel(response, list, "监控设备数据");
-    }
-
-    /**
-     * 获取监控设备详细信息
-     */
-    @ApiOperation("获取监控设备详细信息")
-    @PreAuthorize("@ss.hasPermi('app:monitor:query')")
-    @GetMapping(value = "/{id}")
-    public AjaxResult getInfo(@PathVariable("id") Long id)
-    {
-        return success(monitorService.selectMonitorById(id));
-    }
-
-    /**
-     * 新增监控设备
-     */
-    @ApiOperation("新增监控设备")
-    @PreAuthorize("@ss.hasPermi('app:monitor:add')")
-    @Log(title = "监控设备", businessType = BusinessType.INSERT)
-    @PostMapping
-    public AjaxResult add(@Validated  @RequestBody Monitor monitor)
-    {
-        if (!monitorService.checkMonitorNameUnique(monitor))
-        {
-            return error("新增监控设备'" + monitor.getMonitorName() + "'失败,列表中存在重复的监控名称");
-        }
-        monitor.setCreateBy(getUsername());
-        return toAjax(monitorService.insertMonitor(monitor));
-    }
-
-    /**
-     * 同步监控设备
-     */
-    @ApiOperation("同步监控设备")
-    @PreAuthorize("@ss.hasPermi('app:monitor:sync')")
-    @Log(title = "监控设备", businessType = BusinessType.INSERT)
-    @PostMapping("/sync")
-    public AjaxResult sync()
-    {
-        try {
-            //获取WVP所有的设备通道
-            List<DeviceChannelExtend> channelList = deviceHandler.getDeviceList();
-            Date now = DateUtils.getNowDate();
-            List<Monitor> monitorArr = channelList.stream()
-                    .map(item -> {
-                        Monitor monitor = new Monitor();
-                        monitor.setMonitorName(item.getName());
-                        monitor.setIpAddr(item.getIpAddress());
-                        monitor.setMonitorBrand(item.getManufacture());
-                        monitor.setDeviceId(item.getDeviceId());
-                        monitor.setChannelId(item.getChannelId());
-                        monitor.setCreateTime(now);
-                        monitor.setCreateBy(getUsername());
-                        return monitor;
-                    })
-                    .collect(Collectors.toList());
-            return toAjax(monitorService.syncMonitor(monitorArr));
-        }catch (Exception e){
-            log.error(e.getMessage());
-            return error("同步失败");
-        }
-    }
-
-    /**
-     * 修改监控设备
-     */
-    @ApiOperation("修改监控设备")
-    @PreAuthorize("@ss.hasPermi('app:monitor:edit')")
-    @Log(title = "监控设备", businessType = BusinessType.UPDATE)
-    @PutMapping
-    public AjaxResult edit(@Validated @RequestBody Monitor monitor)
-    {
-        if (!monitorService.checkMonitorNameUnique(monitor))
-        {
-            return error("修改监控设备'" + monitor.getMonitorName() + "'失败,列表中存在重复的监控名称");
-        }
-        monitor.setUpdateBy(getUsername());
-        return toAjax(monitorService.updateMonitor(monitor));
-    }
-
-    /**
-     * 删除监控设备
-     */
-    @ApiOperation("删除监控设备")
-    @PreAuthorize("@ss.hasPermi('app:monitor:remove')")
-    @Log(title = "监控设备", businessType = BusinessType.DELETE)
-	@DeleteMapping("/{ids}")
-    public AjaxResult remove(@PathVariable Long[] ids)
-    {
-        return toAjax(monitorService.deleteMonitorByIds(ids));
-    }
-
-    /**
-     * 播放监控设备
-     */
-    @ApiOperation("播放监控设备")
-    @PreAuthorize("@ss.hasPermi('app:monitor:playStart')")
-    @Log(title = "监控设备", businessType = BusinessType.OTHER)
-    @PostMapping("/playStart")
-    public AjaxResult playStart(@Validated @RequestBody ReqMonitorAction req)
-    {
-        try{
-        Object res = deviceHandler.playOrStop(DeviceHandler.VIDEO_PLAY_START,req.getDeviceId(),req.getChannelId());
-            if (res != null){
-                return AjaxResult.success(res);
-            }else{
-                throw new RuntimeException("无视频信息,请重试");
-            }
-        }catch (Exception e){
-            return error("播放失败:"+e.getMessage());
-        }
-    }
-
-    /**
-     * 停止监控设备
-     */
-    @ApiOperation("停止监控设备")
-    @PreAuthorize("@ss.hasPermi('app:monitor:playStop')")
-    @Log(title = "监控设备", businessType = BusinessType.OTHER)
-    @PostMapping("/playStop")
-    public AjaxResult playStop(@Validated @RequestBody ReqMonitorAction req)
-    {
-        try{
-            Object res = deviceHandler.playOrStop(DeviceHandler.VIDEO_PLAY_STOP,req.getDeviceId(),req.getChannelId());
-            if (res != null){
-                return AjaxResult.success(res);
-            }else{
-                throw new RuntimeException("无视频信息,请重试");
-            }
-        }catch (Exception e){
-            return error("停止失败:"+e.getMessage());
-        }
-    }
-}
+//package com.ruoyi.web.controller.app;
+//
+//import java.util.Date;
+//import java.util.List;
+//import java.util.stream.Collectors;
+//import javax.servlet.http.HttpServletResponse;
+//
+//import com.ruoyi.app.domain.request.ReqMonitorAction;
+//import com.ruoyi.web.core.wvp.domain.DeviceChannelExtend;
+//import com.ruoyi.common.utils.DateUtils;
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.security.access.prepost.PreAuthorize;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.validation.annotation.Validated;
+//import org.springframework.web.bind.annotation.GetMapping;
+//import org.springframework.web.bind.annotation.PostMapping;
+//import org.springframework.web.bind.annotation.PutMapping;
+//import org.springframework.web.bind.annotation.DeleteMapping;
+//import org.springframework.web.bind.annotation.PathVariable;
+//import org.springframework.web.bind.annotation.RequestBody;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RestController;
+//import com.ruoyi.common.annotation.Log;
+//import com.ruoyi.common.core.controller.BaseController;
+//import com.ruoyi.common.core.domain.AjaxResult;
+//import com.ruoyi.common.enums.BusinessType;
+//import com.ruoyi.app.domain.Monitor;
+//import com.ruoyi.app.service.IMonitorService;
+//import com.ruoyi.common.utils.poi.ExcelUtil;
+//import com.ruoyi.common.core.page.TableDataInfo;
+//import com.ruoyi.web.core.wvp.DeviceHandler;
+//
+///**
+// * 监控设备Controller
+// *
+// * @author coede
+// * @date 2025-03-19
+// */
+//@Api("监控设备信息管理")
+//@RestController
+//@RequestMapping("/app/monitor")
+//public class MonitorController extends BaseController
+//{
+//    @Autowired
+//    private IMonitorService monitorService;
+//
+//    @Autowired
+//    private DeviceHandler deviceHandler;
+//
+//    public static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
+//    /**
+//     * 查询监控设备列表
+//     */
+//    @ApiOperation("查询监控设备列表")
+//    @PreAuthorize("@ss.hasPermi('app:monitor:list')")
+//    @GetMapping("/list")
+//    public TableDataInfo list(Monitor monitor)
+//    {
+//        startPage();
+//        List<Monitor> list = monitorService.selectMonitorList(monitor);
+//        return getDataTable(list);
+//    }
+//
+//    /**
+//     * 导出监控设备列表
+//     */
+//    @ApiOperation("导出监控设备列表")
+//    @PreAuthorize("@ss.hasPermi('app:monitor:export')")
+//    @Log(title = "监控设备", businessType = BusinessType.EXPORT)
+//    @PostMapping("/export")
+//    public void export(HttpServletResponse response, Monitor monitor)
+//    {
+//        List<Monitor> list = monitorService.selectMonitorList(monitor);
+//        ExcelUtil<Monitor> util = new ExcelUtil<Monitor>(Monitor.class);
+//        util.exportExcel(response, list, "监控设备数据");
+//    }
+//
+//    /**
+//     * 获取监控设备详细信息
+//     */
+//    @ApiOperation("获取监控设备详细信息")
+//    @PreAuthorize("@ss.hasPermi('app:monitor:query')")
+//    @GetMapping(value = "/{id}")
+//    public AjaxResult getInfo(@PathVariable("id") Long id)
+//    {
+//        return success(monitorService.selectMonitorById(id));
+//    }
+//
+//    /**
+//     * 新增监控设备
+//     */
+//    @ApiOperation("新增监控设备")
+//    @PreAuthorize("@ss.hasPermi('app:monitor:add')")
+//    @Log(title = "监控设备", businessType = BusinessType.INSERT)
+//    @PostMapping
+//    public AjaxResult add(@Validated  @RequestBody Monitor monitor)
+//    {
+//        if (!monitorService.checkMonitorNameUnique(monitor))
+//        {
+//            return error("新增监控设备'" + monitor.getMonitorName() + "'失败,列表中存在重复的监控名称");
+//        }
+//        monitor.setCreateBy(getUsername());
+//        return toAjax(monitorService.insertMonitor(monitor));
+//    }
+//
+//    /**
+//     * 同步监控设备
+//     */
+//    @ApiOperation("同步监控设备")
+//    @PreAuthorize("@ss.hasPermi('app:monitor:sync')")
+//    @Log(title = "监控设备", businessType = BusinessType.INSERT)
+//    @PostMapping("/sync")
+//    public AjaxResult sync()
+//    {
+//        try {
+//            //获取WVP所有的设备通道
+//            List<DeviceChannelExtend> channelList = deviceHandler.getDeviceList();
+//            Date now = DateUtils.getNowDate();
+//            List<Monitor> monitorArr = channelList.stream()
+//                    .map(item -> {
+//                        Monitor monitor = new Monitor();
+//                        monitor.setMonitorName(item.getName());
+//                        monitor.setIpAddr(item.getIpAddress());
+//                        monitor.setMonitorBrand(item.getManufacture());
+//                        monitor.setDeviceId(item.getDeviceId());
+//                        monitor.setChannelId(item.getChannelId());
+//                        monitor.setCreateTime(now);
+//                        monitor.setCreateBy(getUsername());
+//                        return monitor;
+//                    })
+//                    .collect(Collectors.toList());
+//            return toAjax(monitorService.syncMonitor(monitorArr));
+//        }catch (Exception e){
+//            log.error(e.getMessage());
+//            return error("同步失败");
+//        }
+//    }
+//
+//    /**
+//     * 修改监控设备
+//     */
+//    @ApiOperation("修改监控设备")
+//    @PreAuthorize("@ss.hasPermi('app:monitor:edit')")
+//    @Log(title = "监控设备", businessType = BusinessType.UPDATE)
+//    @PutMapping
+//    public AjaxResult edit(@Validated @RequestBody Monitor monitor)
+//    {
+//        if (!monitorService.checkMonitorNameUnique(monitor))
+//        {
+//            return error("修改监控设备'" + monitor.getMonitorName() + "'失败,列表中存在重复的监控名称");
+//        }
+//        monitor.setUpdateBy(getUsername());
+//        return toAjax(monitorService.updateMonitor(monitor));
+//    }
+//
+//    /**
+//     * 删除监控设备
+//     */
+//    @ApiOperation("删除监控设备")
+//    @PreAuthorize("@ss.hasPermi('app:monitor:remove')")
+//    @Log(title = "监控设备", businessType = BusinessType.DELETE)
+//	@DeleteMapping("/{ids}")
+//    public AjaxResult remove(@PathVariable Long[] ids)
+//    {
+//        return toAjax(monitorService.deleteMonitorByIds(ids));
+//    }
+//
+//    /**
+//     * 播放监控设备
+//     */
+//    @ApiOperation("播放监控设备")
+//    @PreAuthorize("@ss.hasPermi('app:monitor:playStart')")
+//    @Log(title = "监控设备", businessType = BusinessType.OTHER)
+//    @PostMapping("/playStart")
+//    public AjaxResult playStart(@Validated @RequestBody ReqMonitorAction req)
+//    {
+//        try{
+//        Object res = deviceHandler.playOrStop(DeviceHandler.VIDEO_PLAY_START,req.getDeviceId(),req.getChannelId());
+//            if (res != null){
+//                return AjaxResult.success(res);
+//            }else{
+//                throw new RuntimeException("无视频信息,请重试");
+//            }
+//        }catch (Exception e){
+//            return error("播放失败:"+e.getMessage());
+//        }
+//    }
+//
+//    /**
+//     * 停止监控设备
+//     */
+//    @ApiOperation("停止监控设备")
+//    @PreAuthorize("@ss.hasPermi('app:monitor:playStop')")
+//    @Log(title = "监控设备", businessType = BusinessType.OTHER)
+//    @PostMapping("/playStop")
+//    public AjaxResult playStop(@Validated @RequestBody ReqMonitorAction req)
+//    {
+//        try{
+//            Object res = deviceHandler.playOrStop(DeviceHandler.VIDEO_PLAY_STOP,req.getDeviceId(),req.getChannelId());
+//            if (res != null){
+//                return AjaxResult.success(res);
+//            }else{
+//                throw new RuntimeException("无视频信息,请重试");
+//            }
+//        }catch (Exception e){
+//            return error("停止失败:"+e.getMessage());
+//        }
+//    }
+//}

+ 4 - 2
app-admin/src/main/java/com/ruoyi/web/controller/app/PigpenController.java

@@ -3,6 +3,7 @@ package com.ruoyi.web.controller.app;
 import java.util.List;
 import javax.servlet.http.HttpServletResponse;
 
+import com.ruoyi.app.DTO.PigpenDTO;
 import com.ruoyi.app.domain.PigCategory;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,8 +58,9 @@ public class PigpenController extends BaseController
     @PostMapping("/export")
     public void export(HttpServletResponse response, Pigpen pigpen)
     {
-        List<Pigpen> list = pigpenService.selectPigpenList(pigpen);
-        ExcelUtil<Pigpen> util = new ExcelUtil<Pigpen>(Pigpen.class);
+        List<PigpenDTO> list = pigpenService.printPigpenList(pigpen);
+        list.forEach(item -> item.setQrcode(item.getPigpenName()));
+        ExcelUtil<PigpenDTO> util = new ExcelUtil<PigpenDTO>(PigpenDTO.class);
         util.exportExcel(response, list, "待宰圈数据");
     }
 

+ 65 - 65
app-admin/src/main/java/com/ruoyi/web/core/nfid/NFIDServer.java

@@ -1,66 +1,66 @@
-package com.ruoyi.web.core.nfid;
-
-import com.ruoyi.common.utils.spring.SpringUtils;
-import io.netty.bootstrap.ServerBootstrap;
-import io.netty.channel.*;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioServerSocketChannel;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-@Component
-public class NFIDServer {
-    private final int port = 3729;
-   // private final NFIDFrameHandler frameHandler;
-    private EventLoopGroup bossGroup;
-    private EventLoopGroup workerGroup;
-
-//    @Autowired
-//    private ClientHandler clientHandler;
-
-//    public NFIDServer(int port) {
-//        this.port = port;
-//       // this.frameHandler = frameHandler;
+//package com.ruoyi.web.core.nfid;
+//
+//import com.ruoyi.common.utils.spring.SpringUtils;
+//import io.netty.bootstrap.ServerBootstrap;
+//import io.netty.channel.*;
+//import io.netty.channel.nio.NioEventLoopGroup;
+//import io.netty.channel.socket.SocketChannel;
+//import io.netty.channel.socket.nio.NioServerSocketChannel;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.stereotype.Component;
+//
+//@Component
+//public class NFIDServer {
+//    private final int port = 3728;
+//   // private final NFIDFrameHandler frameHandler;
+//    private EventLoopGroup bossGroup;
+//    private EventLoopGroup workerGroup;
+//
+////    @Autowired
+////    private ClientHandler clientHandler;
+//
+////    public NFIDServer(int port) {
+////        this.port = port;
+////       // this.frameHandler = frameHandler;
+////    }
+//
+//    public void start() throws Exception {
+//        bossGroup = new NioEventLoopGroup(1);
+//        workerGroup = new NioEventLoopGroup();
+//
+//        try {
+//            ServerBootstrap b = new ServerBootstrap();
+//            b.group(bossGroup, workerGroup)
+//                    .channel(NioServerSocketChannel.class)
+//                    .childHandler(new ChannelInitializer<SocketChannel>() {
+//                        @Override
+//                        protected void initChannel(SocketChannel ch) {
+//                            ch.pipeline().addLast(new ClientHandler());
+//                        }
+//                    })
+//                    .option(ChannelOption.SO_BACKLOG, 128)
+//                    .childOption(ChannelOption.SO_KEEPALIVE, true);
+//
+//            ChannelFuture f = b.bind(port).sync();
+//            System.out.println("NFID Server started on port " + port);
+//            f.channel().closeFuture().sync();
+//        } finally {
+//            stop();
+//        }
 //    }
-
-    public void start() throws Exception {
-        bossGroup = new NioEventLoopGroup(1);
-        workerGroup = new NioEventLoopGroup();
-
-        try {
-            ServerBootstrap b = new ServerBootstrap();
-            b.group(bossGroup, workerGroup)
-                    .channel(NioServerSocketChannel.class)
-                    .childHandler(new ChannelInitializer<SocketChannel>() {
-                        @Override
-                        protected void initChannel(SocketChannel ch) {
-                            ch.pipeline().addLast(new ClientHandler());
-                        }
-                    })
-                    .option(ChannelOption.SO_BACKLOG, 128)
-                    .childOption(ChannelOption.SO_KEEPALIVE, true);
-
-            ChannelFuture f = b.bind(port).sync();
-            System.out.println("NFID Server started on port " + port);
-            f.channel().closeFuture().sync();
-        } finally {
-            stop();
-        }
-    }
-
-    public void stop() {
-        if (workerGroup != null) {
-            workerGroup.shutdownGracefully();
-        }
-        if (bossGroup != null) {
-            bossGroup.shutdownGracefully();
-        }
-    }
-
-    public static void main(String[] args) throws Exception {
-        // 启动服务器
-        NFIDServer server = new NFIDServer();
-        server.start();
-    }
-}
+//
+//    public void stop() {
+//        if (workerGroup != null) {
+//            workerGroup.shutdownGracefully();
+//        }
+//        if (bossGroup != null) {
+//            bossGroup.shutdownGracefully();
+//        }
+//    }
+//
+//    public static void main(String[] args) throws Exception {
+//        // 启动服务器
+//        NFIDServer server = new NFIDServer();
+//        server.start();
+//    }
+//}

+ 246 - 246
app-admin/src/main/java/com/ruoyi/web/core/nfid/NFIDTestClient.java

@@ -1,246 +1,246 @@
-package com.ruoyi.web.core.nfid;
-
-import io.netty.bootstrap.Bootstrap;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import io.netty.channel.*;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioSocketChannel;
-import io.netty.handler.timeout.IdleState;
-import io.netty.handler.timeout.IdleStateEvent;
-import io.netty.handler.timeout.IdleStateHandler;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-public class NFIDTestClient {
-    private static final String HOST = "localhost";
-    private static final int PORT = 3729;
-    private static final int HEARTBEAT_INTERVAL = 30; // 秒
-    private static final int RECONNECT_DELAY = 5; // 重试间隔(秒)
-
-    // 测试帧数据
-    private static final List<byte[]> TEST_FRAMES = Arrays.asList(
-            hexStringToByteArray("5A000112000018000C00010000F04EE845D972D375340002013D08000DE3AA3482"),
-            hexStringToByteArray("5A000112000018000CE28068940000502F57B4B649300002010D08000DE3AAF63F"),
-            hexStringToByteArray("5A000112000018000C2C14F77EF04EE845D974502A340002012C08000DE3AA7930"),
-            hexStringToByteArray("5A00010100004B00145238303038303030303230323030303030303038000001A1000C4A756E203130203230323000010011000002000E56312E30305F323031393036303903000A323032302D30362D31308FC5")
-    );
-
-    // 心跳帧
-    private static final byte[] HEARTBEAT_FRAME = hexStringToByteArray("5A00000001000000000000");
-
-    // 测试模式枚举
-    private enum TestMode {
-        NORMAL,      // 正常发送
-        STICKY,      // 粘包模式
-        SPLIT,       // 拆包模式
-        MIXED        // 混合模式
-    }
-
-    private static TestMode currentMode = TestMode.MIXED; // 默认使用混合模式
-
-    public static void main(String[] args) throws Exception {
-        if (args.length > 0) {
-            currentMode = TestMode.valueOf(args[0].toUpperCase());
-        }
-        System.out.println("Starting NFID test client in " + currentMode + " mode");
-
-        EventLoopGroup group = new NioEventLoopGroup();
-        Bootstrap bootstrap = createBootstrap(group);
-        connect(bootstrap, 0);
-    }
-
-    private static Bootstrap createBootstrap(EventLoopGroup group) {
-        Bootstrap b = new Bootstrap();
-        b.group(group)
-                .channel(NioSocketChannel.class)
-                .handler(new ChannelInitializer<SocketChannel>() {
-                    @Override
-                    protected void initChannel(SocketChannel ch) {
-                        ch.pipeline()
-                                .addLast(new IdleStateHandler(0, HEARTBEAT_INTERVAL, 0, TimeUnit.SECONDS))
-                                .addLast(new HeartbeatHandler())
-                                .addLast(new FrameSenderHandler())
-                                .addLast(new ResponseHandler());
-                    }
-                });
-        return b;
-    }
-
-    private static void connect(Bootstrap bootstrap, int attempt) {
-        bootstrap.connect(HOST, PORT).addListener(new ChannelFutureListener() {
-            @Override
-            public void operationComplete(ChannelFuture future) throws Exception {
-                if (future.isSuccess()) {
-                    System.out.println("Connected to NFID server at " + HOST + ":" + PORT);
-                    Channel channel = future.channel();
-
-                    channel.closeFuture().addListener(closeFuture -> {
-                        System.out.println("Connection lost, attempting to reconnect...");
-                        scheduleReconnect(bootstrap);
-                    });
-
-                } else {
-                    System.err.println("Connection attempt " + (attempt + 1) + " failed: " + future.cause().getMessage());
-                    scheduleReconnect(bootstrap);
-                }
-            }
-        });
-    }
-
-    private static void scheduleReconnect(Bootstrap bootstrap) {
-        bootstrap.config().group().schedule(() -> {
-            System.out.println("Reconnecting...");
-            connect(bootstrap, 0);
-        }, RECONNECT_DELAY, TimeUnit.SECONDS);
-    }
-
-    /**
-     * 心跳处理器
-     */
-    private static class HeartbeatHandler extends ChannelInboundHandlerAdapter {
-        @Override
-        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
-            if (evt instanceof IdleStateEvent) {
-                IdleStateEvent e = (IdleStateEvent) evt;
-                if (e.state() == IdleState.WRITER_IDLE) {
-                    ctx.writeAndFlush(Unpooled.wrappedBuffer(HEARTBEAT_FRAME));
-                    System.out.println("Sent heartbeat at " + System.currentTimeMillis());
-                }
-            }
-        }
-    }
-
-    /**
-     * 数据帧发送处理器
-     */
-    private static class FrameSenderHandler extends ChannelInboundHandlerAdapter {
-        private final Random random = new Random();
-        private final int MIN_INTERVAL = 500; // 1秒
-        private final int MAX_INTERVAL = 1500; // 3秒
-
-        @Override
-        public void channelActive(ChannelHandlerContext ctx) {
-            System.out.println("Channel active, starting frame sender in " + currentMode + " mode");
-            scheduleSendFrame(ctx);
-        }
-
-        private void scheduleSendFrame(ChannelHandlerContext ctx) {
-            if (!ctx.channel().isActive()) return;
-
-            int delay = MIN_INTERVAL + random.nextInt(MAX_INTERVAL - MIN_INTERVAL);
-            ctx.executor().schedule(() -> {
-                if (ctx.channel().isActive()) {
-                    sendFrameAccordingToMode(ctx);
-                    scheduleSendFrame(ctx);
-                }
-            }, delay, TimeUnit.MILLISECONDS);
-        }
-
-        private void sendFrameAccordingToMode(ChannelHandlerContext ctx) {
-            switch (currentMode) {
-                case NORMAL:
-                    sendNormalFrame(ctx);
-                    break;
-                case STICKY:
-                    sendStickyPackets(ctx);
-                    break;
-                case SPLIT:
-                    sendSplitFrame(ctx);
-                    break;
-                case MIXED:
-                    if (random.nextBoolean()) {
-                        sendNormalFrame(ctx);
-                    } else if (random.nextBoolean()) {
-                        sendStickyPackets(ctx);
-                    } else {
-                        sendSplitFrame(ctx);
-                    }
-                    break;
-            }
-        }
-
-        private void sendNormalFrame(ChannelHandlerContext ctx) {
-            byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
-            ctx.writeAndFlush(Unpooled.wrappedBuffer(frame));
-            System.out.println("[NORMAL] Sent single frame: " + bytesToHex(frame));
-        }
-
-        private void sendStickyPackets(ChannelHandlerContext ctx) {
-            // 随机合并2-4个帧一起发送
-            int frameCount = 2 + random.nextInt(3);
-            ByteBuf buffer = ctx.alloc().buffer();
-
-            for (int i = 0; i < frameCount; i++) {
-                byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
-                buffer.writeBytes(frame);
-                System.out.println("[STICKY] Adding frame " + (i+1) + ": " + bytesToHex(frame));
-            }
-
-            ctx.writeAndFlush(buffer);
-            System.out.println("[STICKY] Sent " + frameCount + " frames as sticky packet");
-        }
-
-        private void sendSplitFrame(ChannelHandlerContext ctx) {
-            byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
-            int splitPoint = 5 + random.nextInt(frame.length - 10); // 确保分割点在中间
-
-            byte[] part1 = Arrays.copyOfRange(frame, 0, splitPoint);
-            byte[] part2 = Arrays.copyOfRange(frame, splitPoint, frame.length);
-
-            System.out.println("[SPLIT] Splitting frame at position " + splitPoint +
-                    " (total length: " + frame.length + ")");
-
-            // 发送第一部分
-            ctx.writeAndFlush(Unpooled.wrappedBuffer(part1));
-            System.out.println("[SPLIT] Sent first part: " + bytesToHex(part1));
-
-            // 延迟发送第二部分
-            ctx.executor().schedule(() -> {
-                if (ctx.channel().isActive()) {
-                    ctx.writeAndFlush(Unpooled.wrappedBuffer(part2));
-                    System.out.println("[SPLIT] Sent second part: " + bytesToHex(part2));
-                }
-            }, 100 + random.nextInt(400), TimeUnit.MILLISECONDS); // 100-500ms延迟
-        }
-    }
-
-    /**
-     * 响应处理器
-     */
-    private static class ResponseHandler extends SimpleChannelInboundHandler<Object> {
-        @Override
-        protected void channelRead0(ChannelHandlerContext ctx, Object msg) {
-            System.out.println("Received server response: " + msg);
-        }
-
-        @Override
-        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
-            System.err.println("Connection error: " + cause.getMessage());
-            ctx.close();
-        }
-    }
-
-    // 辅助方法
-    private static byte[] hexStringToByteArray(String s) {
-        int len = s.length();
-        byte[] data = new byte[len / 2];
-        for (int i = 0; i < len; i += 2) {
-            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
-                    + Character.digit(s.charAt(i+1), 16));
-        }
-        return data;
-    }
-
-    private static String bytesToHex(byte[] bytes) {
-        StringBuilder sb = new StringBuilder();
-        for (byte b : bytes) {
-            sb.append(String.format("%02X ", b));
-        }
-        return sb.toString().trim();
-    }
-}
+//package com.ruoyi.web.core.nfid;
+//
+//import io.netty.bootstrap.Bootstrap;
+//import io.netty.buffer.ByteBuf;
+//import io.netty.buffer.Unpooled;
+//import io.netty.channel.*;
+//import io.netty.channel.nio.NioEventLoopGroup;
+//import io.netty.channel.socket.SocketChannel;
+//import io.netty.channel.socket.nio.NioSocketChannel;
+//import io.netty.handler.timeout.IdleState;
+//import io.netty.handler.timeout.IdleStateEvent;
+//import io.netty.handler.timeout.IdleStateHandler;
+//
+//import java.util.Arrays;
+//import java.util.List;
+//import java.util.Random;
+//import java.util.concurrent.TimeUnit;
+//
+//public class NFIDTestClient {
+//    private static final String HOST = "localhost";
+//    private static final int PORT = 3728;
+//    private static final int HEARTBEAT_INTERVAL = 30; // 秒
+//    private static final int RECONNECT_DELAY = 5; // 重试间隔(秒)
+//
+//    // 测试帧数据
+//    private static final List<byte[]> TEST_FRAMES = Arrays.asList(
+//            hexStringToByteArray("5A000112000018000C00010000F04EE845D972D375340002013D08000DE3AA3482"),
+//            hexStringToByteArray("5A000112000018000CE28068940000502F57B4B649300002010D08000DE3AAF63F"),
+//            hexStringToByteArray("5A000112000018000C2C14F77EF04EE845D974502A340002012C08000DE3AA7930"),
+//            hexStringToByteArray("5A00010100004B00145238303038303030303230323030303030303038000001A1000C4A756E203130203230323000010011000002000E56312E30305F323031393036303903000A323032302D30362D31308FC5")
+//    );
+//
+//    // 心跳帧
+//    private static final byte[] HEARTBEAT_FRAME = hexStringToByteArray("5A00000001000000000000");
+//
+//    // 测试模式枚举
+//    private enum TestMode {
+//        NORMAL,      // 正常发送
+//        STICKY,      // 粘包模式
+//        SPLIT,       // 拆包模式
+//        MIXED        // 混合模式
+//    }
+//
+//    private static TestMode currentMode = TestMode.MIXED; // 默认使用混合模式
+//
+//    public static void main(String[] args) throws Exception {
+//        if (args.length > 0) {
+//            currentMode = TestMode.valueOf(args[0].toUpperCase());
+//        }
+//        System.out.println("Starting NFID test client in " + currentMode + " mode");
+//
+//        EventLoopGroup group = new NioEventLoopGroup();
+//        Bootstrap bootstrap = createBootstrap(group);
+//        connect(bootstrap, 0);
+//    }
+//
+//    private static Bootstrap createBootstrap(EventLoopGroup group) {
+//        Bootstrap b = new Bootstrap();
+//        b.group(group)
+//                .channel(NioSocketChannel.class)
+//                .handler(new ChannelInitializer<SocketChannel>() {
+//                    @Override
+//                    protected void initChannel(SocketChannel ch) {
+//                        ch.pipeline()
+//                                .addLast(new IdleStateHandler(0, HEARTBEAT_INTERVAL, 0, TimeUnit.SECONDS))
+//                                .addLast(new HeartbeatHandler())
+//                                .addLast(new FrameSenderHandler())
+//                                .addLast(new ResponseHandler());
+//                    }
+//                });
+//        return b;
+//    }
+//
+//    private static void connect(Bootstrap bootstrap, int attempt) {
+//        bootstrap.connect(HOST, PORT).addListener(new ChannelFutureListener() {
+//            @Override
+//            public void operationComplete(ChannelFuture future) throws Exception {
+//                if (future.isSuccess()) {
+//                    System.out.println("Connected to NFID server at " + HOST + ":" + PORT);
+//                    Channel channel = future.channel();
+//
+//                    channel.closeFuture().addListener(closeFuture -> {
+//                        System.out.println("Connection lost, attempting to reconnect...");
+//                        scheduleReconnect(bootstrap);
+//                    });
+//
+//                } else {
+//                    System.err.println("Connection attempt " + (attempt + 1) + " failed: " + future.cause().getMessage());
+//                    scheduleReconnect(bootstrap);
+//                }
+//            }
+//        });
+//    }
+//
+//    private static void scheduleReconnect(Bootstrap bootstrap) {
+//        bootstrap.config().group().schedule(() -> {
+//            System.out.println("Reconnecting...");
+//            connect(bootstrap, 0);
+//        }, RECONNECT_DELAY, TimeUnit.SECONDS);
+//    }
+//
+//    /**
+//     * 心跳处理器
+//     */
+//    private static class HeartbeatHandler extends ChannelInboundHandlerAdapter {
+//        @Override
+//        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
+//            if (evt instanceof IdleStateEvent) {
+//                IdleStateEvent e = (IdleStateEvent) evt;
+//                if (e.state() == IdleState.WRITER_IDLE) {
+//                    ctx.writeAndFlush(Unpooled.wrappedBuffer(HEARTBEAT_FRAME));
+//                    System.out.println("Sent heartbeat at " + System.currentTimeMillis());
+//                }
+//            }
+//        }
+//    }
+//
+//    /**
+//     * 数据帧发送处理器
+//     */
+//    private static class FrameSenderHandler extends ChannelInboundHandlerAdapter {
+//        private final Random random = new Random();
+//        private final int MIN_INTERVAL = 500; // 1秒
+//        private final int MAX_INTERVAL = 1500; // 3秒
+//
+//        @Override
+//        public void channelActive(ChannelHandlerContext ctx) {
+//            System.out.println("Channel active, starting frame sender in " + currentMode + " mode");
+//            scheduleSendFrame(ctx);
+//        }
+//
+//        private void scheduleSendFrame(ChannelHandlerContext ctx) {
+//            if (!ctx.channel().isActive()) return;
+//
+//            int delay = MIN_INTERVAL + random.nextInt(MAX_INTERVAL - MIN_INTERVAL);
+//            ctx.executor().schedule(() -> {
+//                if (ctx.channel().isActive()) {
+//                    sendFrameAccordingToMode(ctx);
+//                    scheduleSendFrame(ctx);
+//                }
+//            }, delay, TimeUnit.MILLISECONDS);
+//        }
+//
+//        private void sendFrameAccordingToMode(ChannelHandlerContext ctx) {
+//            switch (currentMode) {
+//                case NORMAL:
+//                    sendNormalFrame(ctx);
+//                    break;
+//                case STICKY:
+//                    sendStickyPackets(ctx);
+//                    break;
+//                case SPLIT:
+//                    sendSplitFrame(ctx);
+//                    break;
+//                case MIXED:
+//                    if (random.nextBoolean()) {
+//                        sendNormalFrame(ctx);
+//                    } else if (random.nextBoolean()) {
+//                        sendStickyPackets(ctx);
+//                    } else {
+//                        sendSplitFrame(ctx);
+//                    }
+//                    break;
+//            }
+//        }
+//
+//        private void sendNormalFrame(ChannelHandlerContext ctx) {
+//            byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
+//            ctx.writeAndFlush(Unpooled.wrappedBuffer(frame));
+//            System.out.println("[NORMAL] Sent single frame: " + bytesToHex(frame));
+//        }
+//
+//        private void sendStickyPackets(ChannelHandlerContext ctx) {
+//            // 随机合并2-4个帧一起发送
+//            int frameCount = 2 + random.nextInt(3);
+//            ByteBuf buffer = ctx.alloc().buffer();
+//
+//            for (int i = 0; i < frameCount; i++) {
+//                byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
+//                buffer.writeBytes(frame);
+//                System.out.println("[STICKY] Adding frame " + (i+1) + ": " + bytesToHex(frame));
+//            }
+//
+//            ctx.writeAndFlush(buffer);
+//            System.out.println("[STICKY] Sent " + frameCount + " frames as sticky packet");
+//        }
+//
+//        private void sendSplitFrame(ChannelHandlerContext ctx) {
+//            byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
+//            int splitPoint = 5 + random.nextInt(frame.length - 10); // 确保分割点在中间
+//
+//            byte[] part1 = Arrays.copyOfRange(frame, 0, splitPoint);
+//            byte[] part2 = Arrays.copyOfRange(frame, splitPoint, frame.length);
+//
+//            System.out.println("[SPLIT] Splitting frame at position " + splitPoint +
+//                    " (total length: " + frame.length + ")");
+//
+//            // 发送第一部分
+//            ctx.writeAndFlush(Unpooled.wrappedBuffer(part1));
+//            System.out.println("[SPLIT] Sent first part: " + bytesToHex(part1));
+//
+//            // 延迟发送第二部分
+//            ctx.executor().schedule(() -> {
+//                if (ctx.channel().isActive()) {
+//                    ctx.writeAndFlush(Unpooled.wrappedBuffer(part2));
+//                    System.out.println("[SPLIT] Sent second part: " + bytesToHex(part2));
+//                }
+//            }, 100 + random.nextInt(400), TimeUnit.MILLISECONDS); // 100-500ms延迟
+//        }
+//    }
+//
+//    /**
+//     * 响应处理器
+//     */
+//    private static class ResponseHandler extends SimpleChannelInboundHandler<Object> {
+//        @Override
+//        protected void channelRead0(ChannelHandlerContext ctx, Object msg) {
+//            System.out.println("Received server response: " + msg);
+//        }
+//
+//        @Override
+//        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
+//            System.err.println("Connection error: " + cause.getMessage());
+//            ctx.close();
+//        }
+//    }
+//
+//    // 辅助方法
+//    private static byte[] hexStringToByteArray(String s) {
+//        int len = s.length();
+//        byte[] data = new byte[len / 2];
+//        for (int i = 0; i < len; i += 2) {
+//            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+//                    + Character.digit(s.charAt(i+1), 16));
+//        }
+//        return data;
+//    }
+//
+//    private static String bytesToHex(byte[] bytes) {
+//        StringBuilder sb = new StringBuilder();
+//        for (byte b : bytes) {
+//            sb.append(String.format("%02X ", b));
+//        }
+//        return sb.toString().trim();
+//    }
+//}

+ 246 - 246
app-admin/src/main/java/com/ruoyi/web/core/nfid/NFIDTestClient1.java

@@ -1,246 +1,246 @@
-package com.ruoyi.web.core.nfid;
-
-import io.netty.bootstrap.Bootstrap;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import io.netty.channel.*;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.SocketChannel;
-import io.netty.channel.socket.nio.NioSocketChannel;
-import io.netty.handler.timeout.IdleState;
-import io.netty.handler.timeout.IdleStateEvent;
-import io.netty.handler.timeout.IdleStateHandler;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
-
-public class NFIDTestClient1 {
-    private static final String HOST = "localhost";
-    private static final int PORT = 3729;
-    private static final int HEARTBEAT_INTERVAL = 30; // 秒
-    private static final int RECONNECT_DELAY = 5; // 重试间隔(秒)
-
-    // 测试帧数据
-    private static final List<byte[]> TEST_FRAMES = Arrays.asList(
-            hexStringToByteArray("5A000112000018000C00010000F04EE845D972D375340002013D08000DE3AA3482"),
-            hexStringToByteArray("5A000112000018000CE28068940000502F57B4B649300002010D08000DE3AAF63F"),
-            hexStringToByteArray("5A000112000018000C2C14F77EF04EE845D974502A340002012C08000DE3AA7930"),
-            hexStringToByteArray("5A00010100004B00145238303038303030303230323030303030303038000001A1000C4A756E203130203230323000010011000002000E56312E30305F323031393036303903000A323032302D30362D31308FC5")
-    );
-
-    // 心跳帧
-    private static final byte[] HEARTBEAT_FRAME = hexStringToByteArray("5A00000001000000000000");
-
-    // 测试模式枚举
-    private enum TestMode {
-        NORMAL,      // 正常发送
-        STICKY,      // 粘包模式
-        SPLIT,       // 拆包模式
-        MIXED        // 混合模式
-    }
-
-    private static TestMode currentMode = TestMode.MIXED; // 默认使用混合模式
-
-    public static void main(String[] args) throws Exception {
-        if (args.length > 0) {
-            currentMode = TestMode.valueOf(args[0].toUpperCase());
-        }
-        System.out.println("Starting NFID test client in " + currentMode + " mode");
-
-        EventLoopGroup group = new NioEventLoopGroup();
-        Bootstrap bootstrap = createBootstrap(group);
-        connect(bootstrap, 0);
-    }
-
-    private static Bootstrap createBootstrap(EventLoopGroup group) {
-        Bootstrap b = new Bootstrap();
-        b.group(group)
-                .channel(NioSocketChannel.class)
-                .handler(new ChannelInitializer<SocketChannel>() {
-                    @Override
-                    protected void initChannel(SocketChannel ch) {
-                        ch.pipeline()
-                                .addLast(new IdleStateHandler(0, HEARTBEAT_INTERVAL, 0, TimeUnit.SECONDS))
-                                .addLast(new HeartbeatHandler())
-                                .addLast(new FrameSenderHandler())
-                                .addLast(new ResponseHandler());
-                    }
-                });
-        return b;
-    }
-
-    private static void connect(Bootstrap bootstrap, int attempt) {
-        bootstrap.connect(HOST, PORT).addListener(new ChannelFutureListener() {
-            @Override
-            public void operationComplete(ChannelFuture future) throws Exception {
-                if (future.isSuccess()) {
-                    System.out.println("Connected to NFID server at " + HOST + ":" + PORT);
-                    Channel channel = future.channel();
-
-                    channel.closeFuture().addListener(closeFuture -> {
-                        System.out.println("Connection lost, attempting to reconnect...");
-                        scheduleReconnect(bootstrap);
-                    });
-
-                } else {
-                    System.err.println("Connection attempt " + (attempt + 1) + " failed: " + future.cause().getMessage());
-                    scheduleReconnect(bootstrap);
-                }
-            }
-        });
-    }
-
-    private static void scheduleReconnect(Bootstrap bootstrap) {
-        bootstrap.config().group().schedule(() -> {
-            System.out.println("Reconnecting...");
-            connect(bootstrap, 0);
-        }, RECONNECT_DELAY, TimeUnit.SECONDS);
-    }
-
-    /**
-     * 心跳处理器
-     */
-    private static class HeartbeatHandler extends ChannelInboundHandlerAdapter {
-        @Override
-        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
-            if (evt instanceof IdleStateEvent) {
-                IdleStateEvent e = (IdleStateEvent) evt;
-                if (e.state() == IdleState.WRITER_IDLE) {
-                    ctx.writeAndFlush(Unpooled.wrappedBuffer(HEARTBEAT_FRAME));
-                    System.out.println("Sent heartbeat at " + System.currentTimeMillis());
-                }
-            }
-        }
-    }
-
-    /**
-     * 数据帧发送处理器
-     */
-    private static class FrameSenderHandler extends ChannelInboundHandlerAdapter {
-        private final Random random = new Random();
-        private final int MIN_INTERVAL = 500; // 1秒
-        private final int MAX_INTERVAL = 1500; // 3秒
-
-        @Override
-        public void channelActive(ChannelHandlerContext ctx) {
-            System.out.println("Channel active, starting frame sender in " + currentMode + " mode");
-            scheduleSendFrame(ctx);
-        }
-
-        private void scheduleSendFrame(ChannelHandlerContext ctx) {
-            if (!ctx.channel().isActive()) return;
-
-            int delay = MIN_INTERVAL + random.nextInt(MAX_INTERVAL - MIN_INTERVAL);
-            ctx.executor().schedule(() -> {
-                if (ctx.channel().isActive()) {
-                    sendFrameAccordingToMode(ctx);
-                    scheduleSendFrame(ctx);
-                }
-            }, delay, TimeUnit.MILLISECONDS);
-        }
-
-        private void sendFrameAccordingToMode(ChannelHandlerContext ctx) {
-            switch (currentMode) {
-                case NORMAL:
-                    sendNormalFrame(ctx);
-                    break;
-                case STICKY:
-                    sendStickyPackets(ctx);
-                    break;
-                case SPLIT:
-                    sendSplitFrame(ctx);
-                    break;
-                case MIXED:
-                    if (random.nextBoolean()) {
-                        sendNormalFrame(ctx);
-                    } else if (random.nextBoolean()) {
-                        sendStickyPackets(ctx);
-                    } else {
-                        sendSplitFrame(ctx);
-                    }
-                    break;
-            }
-        }
-
-        private void sendNormalFrame(ChannelHandlerContext ctx) {
-            byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
-            ctx.writeAndFlush(Unpooled.wrappedBuffer(frame));
-            System.out.println("[NORMAL] Sent single frame: " + bytesToHex(frame));
-        }
-
-        private void sendStickyPackets(ChannelHandlerContext ctx) {
-            // 随机合并2-4个帧一起发送
-            int frameCount = 2 + random.nextInt(3);
-            ByteBuf buffer = ctx.alloc().buffer();
-
-            for (int i = 0; i < frameCount; i++) {
-                byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
-                buffer.writeBytes(frame);
-                System.out.println("[STICKY] Adding frame " + (i+1) + ": " + bytesToHex(frame));
-            }
-
-            ctx.writeAndFlush(buffer);
-            System.out.println("[STICKY] Sent " + frameCount + " frames as sticky packet");
-        }
-
-        private void sendSplitFrame(ChannelHandlerContext ctx) {
-            byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
-            int splitPoint = 5 + random.nextInt(frame.length - 10); // 确保分割点在中间
-
-            byte[] part1 = Arrays.copyOfRange(frame, 0, splitPoint);
-            byte[] part2 = Arrays.copyOfRange(frame, splitPoint, frame.length);
-
-            System.out.println("[SPLIT] Splitting frame at position " + splitPoint +
-                    " (total length: " + frame.length + ")");
-
-            // 发送第一部分
-            ctx.writeAndFlush(Unpooled.wrappedBuffer(part1));
-            System.out.println("[SPLIT] Sent first part: " + bytesToHex(part1));
-
-            // 延迟发送第二部分
-            ctx.executor().schedule(() -> {
-                if (ctx.channel().isActive()) {
-                    ctx.writeAndFlush(Unpooled.wrappedBuffer(part2));
-                    System.out.println("[SPLIT] Sent second part: " + bytesToHex(part2));
-                }
-            }, 100 + random.nextInt(400), TimeUnit.MILLISECONDS); // 100-500ms延迟
-        }
-    }
-
-    /**
-     * 响应处理器
-     */
-    private static class ResponseHandler extends SimpleChannelInboundHandler<Object> {
-        @Override
-        protected void channelRead0(ChannelHandlerContext ctx, Object msg) {
-            System.out.println("Received server response: " + msg);
-        }
-
-        @Override
-        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
-            System.err.println("Connection error: " + cause.getMessage());
-            ctx.close();
-        }
-    }
-
-    // 辅助方法
-    private static byte[] hexStringToByteArray(String s) {
-        int len = s.length();
-        byte[] data = new byte[len / 2];
-        for (int i = 0; i < len; i += 2) {
-            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
-                    + Character.digit(s.charAt(i+1), 16));
-        }
-        return data;
-    }
-
-    private static String bytesToHex(byte[] bytes) {
-        StringBuilder sb = new StringBuilder();
-        for (byte b : bytes) {
-            sb.append(String.format("%02X ", b));
-        }
-        return sb.toString().trim();
-    }
-}
+//package com.ruoyi.web.core.nfid;
+//
+//import io.netty.bootstrap.Bootstrap;
+//import io.netty.buffer.ByteBuf;
+//import io.netty.buffer.Unpooled;
+//import io.netty.channel.*;
+//import io.netty.channel.nio.NioEventLoopGroup;
+//import io.netty.channel.socket.SocketChannel;
+//import io.netty.channel.socket.nio.NioSocketChannel;
+//import io.netty.handler.timeout.IdleState;
+//import io.netty.handler.timeout.IdleStateEvent;
+//import io.netty.handler.timeout.IdleStateHandler;
+//
+//import java.util.Arrays;
+//import java.util.List;
+//import java.util.Random;
+//import java.util.concurrent.TimeUnit;
+//
+//public class NFIDTestClient1 {
+//    private static final String HOST = "localhost";
+//    private static final int PORT = 3728;
+//    private static final int HEARTBEAT_INTERVAL = 30; // 秒
+//    private static final int RECONNECT_DELAY = 5; // 重试间隔(秒)
+//
+//    // 测试帧数据
+//    private static final List<byte[]> TEST_FRAMES = Arrays.asList(
+//            hexStringToByteArray("5A000112000018000C00010000F04EE845D972D375340002013D08000DE3AA3482"),
+//            hexStringToByteArray("5A000112000018000CE28068940000502F57B4B649300002010D08000DE3AAF63F"),
+//            hexStringToByteArray("5A000112000018000C2C14F77EF04EE845D974502A340002012C08000DE3AA7930"),
+//            hexStringToByteArray("5A00010100004B00145238303038303030303230323030303030303038000001A1000C4A756E203130203230323000010011000002000E56312E30305F323031393036303903000A323032302D30362D31308FC5")
+//    );
+//
+//    // 心跳帧
+//    private static final byte[] HEARTBEAT_FRAME = hexStringToByteArray("5A00000001000000000000");
+//
+//    // 测试模式枚举
+//    private enum TestMode {
+//        NORMAL,      // 正常发送
+//        STICKY,      // 粘包模式
+//        SPLIT,       // 拆包模式
+//        MIXED        // 混合模式
+//    }
+//
+//    private static TestMode currentMode = TestMode.MIXED; // 默认使用混合模式
+//
+//    public static void main(String[] args) throws Exception {
+//        if (args.length > 0) {
+//            currentMode = TestMode.valueOf(args[0].toUpperCase());
+//        }
+//        System.out.println("Starting NFID test client in " + currentMode + " mode");
+//
+//        EventLoopGroup group = new NioEventLoopGroup();
+//        Bootstrap bootstrap = createBootstrap(group);
+//        connect(bootstrap, 0);
+//    }
+//
+//    private static Bootstrap createBootstrap(EventLoopGroup group) {
+//        Bootstrap b = new Bootstrap();
+//        b.group(group)
+//                .channel(NioSocketChannel.class)
+//                .handler(new ChannelInitializer<SocketChannel>() {
+//                    @Override
+//                    protected void initChannel(SocketChannel ch) {
+//                        ch.pipeline()
+//                                .addLast(new IdleStateHandler(0, HEARTBEAT_INTERVAL, 0, TimeUnit.SECONDS))
+//                                .addLast(new HeartbeatHandler())
+//                                .addLast(new FrameSenderHandler())
+//                                .addLast(new ResponseHandler());
+//                    }
+//                });
+//        return b;
+//    }
+//
+//    private static void connect(Bootstrap bootstrap, int attempt) {
+//        bootstrap.connect(HOST, PORT).addListener(new ChannelFutureListener() {
+//            @Override
+//            public void operationComplete(ChannelFuture future) throws Exception {
+//                if (future.isSuccess()) {
+//                    System.out.println("Connected to NFID server at " + HOST + ":" + PORT);
+//                    Channel channel = future.channel();
+//
+//                    channel.closeFuture().addListener(closeFuture -> {
+//                        System.out.println("Connection lost, attempting to reconnect...");
+//                        scheduleReconnect(bootstrap);
+//                    });
+//
+//                } else {
+//                    System.err.println("Connection attempt " + (attempt + 1) + " failed: " + future.cause().getMessage());
+//                    scheduleReconnect(bootstrap);
+//                }
+//            }
+//        });
+//    }
+//
+//    private static void scheduleReconnect(Bootstrap bootstrap) {
+//        bootstrap.config().group().schedule(() -> {
+//            System.out.println("Reconnecting...");
+//            connect(bootstrap, 0);
+//        }, RECONNECT_DELAY, TimeUnit.SECONDS);
+//    }
+//
+//    /**
+//     * 心跳处理器
+//     */
+//    private static class HeartbeatHandler extends ChannelInboundHandlerAdapter {
+//        @Override
+//        public void userEventTriggered(ChannelHandlerContext ctx, Object evt) {
+//            if (evt instanceof IdleStateEvent) {
+//                IdleStateEvent e = (IdleStateEvent) evt;
+//                if (e.state() == IdleState.WRITER_IDLE) {
+//                    ctx.writeAndFlush(Unpooled.wrappedBuffer(HEARTBEAT_FRAME));
+//                    System.out.println("Sent heartbeat at " + System.currentTimeMillis());
+//                }
+//            }
+//        }
+//    }
+//
+//    /**
+//     * 数据帧发送处理器
+//     */
+//    private static class FrameSenderHandler extends ChannelInboundHandlerAdapter {
+//        private final Random random = new Random();
+//        private final int MIN_INTERVAL = 500; // 1秒
+//        private final int MAX_INTERVAL = 1500; // 3秒
+//
+//        @Override
+//        public void channelActive(ChannelHandlerContext ctx) {
+//            System.out.println("Channel active, starting frame sender in " + currentMode + " mode");
+//            scheduleSendFrame(ctx);
+//        }
+//
+//        private void scheduleSendFrame(ChannelHandlerContext ctx) {
+//            if (!ctx.channel().isActive()) return;
+//
+//            int delay = MIN_INTERVAL + random.nextInt(MAX_INTERVAL - MIN_INTERVAL);
+//            ctx.executor().schedule(() -> {
+//                if (ctx.channel().isActive()) {
+//                    sendFrameAccordingToMode(ctx);
+//                    scheduleSendFrame(ctx);
+//                }
+//            }, delay, TimeUnit.MILLISECONDS);
+//        }
+//
+//        private void sendFrameAccordingToMode(ChannelHandlerContext ctx) {
+//            switch (currentMode) {
+//                case NORMAL:
+//                    sendNormalFrame(ctx);
+//                    break;
+//                case STICKY:
+//                    sendStickyPackets(ctx);
+//                    break;
+//                case SPLIT:
+//                    sendSplitFrame(ctx);
+//                    break;
+//                case MIXED:
+//                    if (random.nextBoolean()) {
+//                        sendNormalFrame(ctx);
+//                    } else if (random.nextBoolean()) {
+//                        sendStickyPackets(ctx);
+//                    } else {
+//                        sendSplitFrame(ctx);
+//                    }
+//                    break;
+//            }
+//        }
+//
+//        private void sendNormalFrame(ChannelHandlerContext ctx) {
+//            byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
+//            ctx.writeAndFlush(Unpooled.wrappedBuffer(frame));
+//            System.out.println("[NORMAL] Sent single frame: " + bytesToHex(frame));
+//        }
+//
+//        private void sendStickyPackets(ChannelHandlerContext ctx) {
+//            // 随机合并2-4个帧一起发送
+//            int frameCount = 2 + random.nextInt(3);
+//            ByteBuf buffer = ctx.alloc().buffer();
+//
+//            for (int i = 0; i < frameCount; i++) {
+//                byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
+//                buffer.writeBytes(frame);
+//                System.out.println("[STICKY] Adding frame " + (i+1) + ": " + bytesToHex(frame));
+//            }
+//
+//            ctx.writeAndFlush(buffer);
+//            System.out.println("[STICKY] Sent " + frameCount + " frames as sticky packet");
+//        }
+//
+//        private void sendSplitFrame(ChannelHandlerContext ctx) {
+//            byte[] frame = TEST_FRAMES.get(random.nextInt(TEST_FRAMES.size()));
+//            int splitPoint = 5 + random.nextInt(frame.length - 10); // 确保分割点在中间
+//
+//            byte[] part1 = Arrays.copyOfRange(frame, 0, splitPoint);
+//            byte[] part2 = Arrays.copyOfRange(frame, splitPoint, frame.length);
+//
+//            System.out.println("[SPLIT] Splitting frame at position " + splitPoint +
+//                    " (total length: " + frame.length + ")");
+//
+//            // 发送第一部分
+//            ctx.writeAndFlush(Unpooled.wrappedBuffer(part1));
+//            System.out.println("[SPLIT] Sent first part: " + bytesToHex(part1));
+//
+//            // 延迟发送第二部分
+//            ctx.executor().schedule(() -> {
+//                if (ctx.channel().isActive()) {
+//                    ctx.writeAndFlush(Unpooled.wrappedBuffer(part2));
+//                    System.out.println("[SPLIT] Sent second part: " + bytesToHex(part2));
+//                }
+//            }, 100 + random.nextInt(400), TimeUnit.MILLISECONDS); // 100-500ms延迟
+//        }
+//    }
+//
+//    /**
+//     * 响应处理器
+//     */
+//    private static class ResponseHandler extends SimpleChannelInboundHandler<Object> {
+//        @Override
+//        protected void channelRead0(ChannelHandlerContext ctx, Object msg) {
+//            System.out.println("Received server response: " + msg);
+//        }
+//
+//        @Override
+//        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
+//            System.err.println("Connection error: " + cause.getMessage());
+//            ctx.close();
+//        }
+//    }
+//
+//    // 辅助方法
+//    private static byte[] hexStringToByteArray(String s) {
+//        int len = s.length();
+//        byte[] data = new byte[len / 2];
+//        for (int i = 0; i < len; i += 2) {
+//            data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+//                    + Character.digit(s.charAt(i+1), 16));
+//        }
+//        return data;
+//    }
+//
+//    private static String bytesToHex(byte[] bytes) {
+//        StringBuilder sb = new StringBuilder();
+//        for (byte b : bytes) {
+//            sb.append(String.format("%02X ", b));
+//        }
+//        return sb.toString().trim();
+//    }
+//}

+ 37 - 37
app-admin/src/main/java/com/ruoyi/web/core/wvp/ApiResponseParser.java

@@ -1,37 +1,37 @@
-package com.ruoyi.web.core.wvp;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.ruoyi.web.core.wvp.domain.ApiResponse;
-
-public class ApiResponseParser {
-    private static final ObjectMapper objectMapper = new ObjectMapper();
-
-    /**
-     * 解析完整ApiResponse,包含状态码和消息
-     * @param json JSON字符串
-     * @param dataType data字段的类型
-     * @return 完整的ApiResponse对象
-     */
-    public static <T> ApiResponse<T> parseFullResponse(String json, Class<T> dataType) throws Exception {
-        // 构建包含泛型信息的JavaType
-        JavaType javaType = objectMapper.getTypeFactory()
-                .constructParametricType(ApiResponse.class, dataType);
-
-        return objectMapper.readValue(json, javaType);
-    }
-
-    /**
-     * 使用TypeReference处理复杂嵌套类型
-     * @param json JSON字符串
-     * @param typeReference 类型引用
-     * @return 完整的ApiResponse对象
-     */
-    public static <T> ApiResponse<T> parseFullResponse(
-            String json,
-            TypeReference<ApiResponse<T>> typeReference) throws Exception {
-
-        return objectMapper.readValue(json, typeReference);
-    }
-}
+//package com.ruoyi.web.core.wvp;
+//
+//import com.fasterxml.jackson.core.type.TypeReference;
+//import com.fasterxml.jackson.databind.JavaType;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import com.ruoyi.web.core.wvp.domain.ApiResponse;
+//
+//public class ApiResponseParser {
+//    private static final ObjectMapper objectMapper = new ObjectMapper();
+//
+//    /**
+//     * 解析完整ApiResponse,包含状态码和消息
+//     * @param json JSON字符串
+//     * @param dataType data字段的类型
+//     * @return 完整的ApiResponse对象
+//     */
+//    public static <T> ApiResponse<T> parseFullResponse(String json, Class<T> dataType) throws Exception {
+//        // 构建包含泛型信息的JavaType
+//        JavaType javaType = objectMapper.getTypeFactory()
+//                .constructParametricType(ApiResponse.class, dataType);
+//
+//        return objectMapper.readValue(json, javaType);
+//    }
+//
+//    /**
+//     * 使用TypeReference处理复杂嵌套类型
+//     * @param json JSON字符串
+//     * @param typeReference 类型引用
+//     * @return 完整的ApiResponse对象
+//     */
+//    public static <T> ApiResponse<T> parseFullResponse(
+//            String json,
+//            TypeReference<ApiResponse<T>> typeReference) throws Exception {
+//
+//        return objectMapper.readValue(json, typeReference);
+//    }
+//}

+ 107 - 107
app-admin/src/main/java/com/ruoyi/web/core/wvp/DeviceHandler.java

@@ -1,107 +1,107 @@
-package com.ruoyi.web.core.wvp;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.ruoyi.common.utils.spring.SpringUtils;
-import com.ruoyi.web.core.nfid.MultiReaderNFIDProcessor;
-import com.ruoyi.web.core.wvp.domain.ApiResponse;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.http.HttpResponse;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import com.ruoyi.web.core.wvp.domain.DeviceChannelExtend;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import java.net.HttpURLConnection;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static com.ruoyi.common.utils.http.HttpUtils.*;
-
-@Component
-public class DeviceHandler {
-    @Value(value = "${wvp.addr}")
-    private String addr;
-
-    private final SessionHandler sessionHandler = SpringUtils.getBean(SessionHandler.class);
-
-    public static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
-
-    public static final String VIDEO_PLAY_START = "start";
-
-    public static final String VIDEO_PLAY_STOP = "stop";
-
-    //播放
-    public Object playOrStop(String type,String deviceId,String channelId) throws Exception{
-            String url= addr+ "/api/play/"+type+"/" + deviceId + "/" + channelId;
-            Map<String, String> headers = new HashMap<>();
-            String token = sessionHandler.getToken();
-            if (StringUtils.isNotEmpty(token)) {
-                headers.put("access-token", sessionHandler.getToken());
-            }else{
-                throw new RuntimeException("登录WVP失败");
-            }
-            HttpResponse response = sendHttpGet(url, StringUtils.EMPTY, Constants.UTF8,headers);
-            if(response.getStatusCode() == HttpURLConnection.HTTP_OK){
-                // 处理响应
-                ApiResponse<Object> apiResponse = JsonParser.parseWithJavaType(response.getContent(), Object.class);
-
-                if (apiResponse.getCode()!=null && apiResponse.getCode() ==0) {
-                    return apiResponse.getData();
-                } else {
-                    throw new RuntimeException(apiResponse.getMsg());
-                }
-            }else if (response.getStatusCode() == HttpURLConnection.HTTP_UNAUTHORIZED){
-                //是否重新登录
-                if (sessionHandler.needRelogin()){
-                    //重新登录
-                    sessionHandler.refreshToken();
-                }
-            }
-            return null;
-    }
-
-    //设备清单
-    public List<DeviceChannelExtend> getDeviceList() throws Exception {
-        try {
-            String url= addr+ "/api/device/query/allChannels";
-            Map<String, String> headers = new HashMap<>();
-            String token = sessionHandler.getToken();
-            if (StringUtils.isNotEmpty(token)) {
-                headers.put("access-token", sessionHandler.getToken());
-            }else{
-                throw new RuntimeException("登录WVP失败");
-            }
-            HttpResponse response = sendHttpGet(url, StringUtils.EMPTY, Constants.UTF8,headers);
-            if(response.getStatusCode() == HttpURLConnection.HTTP_OK){
-                TypeReference<ApiResponse<List<DeviceChannelExtend>>> typeRef =
-                        new TypeReference<ApiResponse<List<DeviceChannelExtend>>>() {};
-                // 处理响应
-                ApiResponse<List<DeviceChannelExtend>> apiResponse = ApiResponseParser.parseFullResponse(response.getContent(), typeRef);
-
-                if (apiResponse.getCode()!=null && apiResponse.getCode() ==0) {
-                    return apiResponse.getData();
-                } else {
-                    throw new RuntimeException(apiResponse.getMsg());
-                }
-            }else if (response.getStatusCode() == HttpURLConnection.HTTP_UNAUTHORIZED){
-                //是否重新登录
-                if (sessionHandler.needRelogin()){
-                    //重新登录
-                    sessionHandler.refreshToken();
-                }
-                throw new Exception("重新登录");
-            }
-
-        }catch (Exception e){
-            log.error("请求失败: " + e.getMessage());
-            throw e;
-        }
-        return new ArrayList<>();
-    }
-}
+//package com.ruoyi.web.core.wvp;
+//
+//import com.fasterxml.jackson.core.type.TypeReference;
+//import com.ruoyi.common.utils.spring.SpringUtils;
+//import com.ruoyi.web.core.nfid.MultiReaderNFIDProcessor;
+//import com.ruoyi.web.core.wvp.domain.ApiResponse;
+//import com.ruoyi.common.constant.Constants;
+//import com.ruoyi.common.utils.StringUtils;
+//import com.ruoyi.common.utils.http.HttpResponse;
+//import com.ruoyi.common.utils.poi.ExcelUtil;
+//import com.ruoyi.web.core.wvp.domain.DeviceChannelExtend;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Component;
+//
+//import java.net.HttpURLConnection;
+//import java.util.ArrayList;
+//import java.util.HashMap;
+//import java.util.List;
+//import java.util.Map;
+//
+//import static com.ruoyi.common.utils.http.HttpUtils.*;
+//
+//@Component
+//public class DeviceHandler {
+//    @Value(value = "${wvp.addr}")
+//    private String addr;
+//
+//    private final SessionHandler sessionHandler = SpringUtils.getBean(SessionHandler.class);
+//
+//    public static final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
+//
+//    public static final String VIDEO_PLAY_START = "start";
+//
+//    public static final String VIDEO_PLAY_STOP = "stop";
+//
+//    //播放
+//    public Object playOrStop(String type,String deviceId,String channelId) throws Exception{
+//            String url= addr+ "/api/play/"+type+"/" + deviceId + "/" + channelId;
+//            Map<String, String> headers = new HashMap<>();
+//            String token = sessionHandler.getToken();
+//            if (StringUtils.isNotEmpty(token)) {
+//                headers.put("access-token", sessionHandler.getToken());
+//            }else{
+//                throw new RuntimeException("登录WVP失败");
+//            }
+//            HttpResponse response = sendHttpGet(url, StringUtils.EMPTY, Constants.UTF8,headers);
+//            if(response.getStatusCode() == HttpURLConnection.HTTP_OK){
+//                // 处理响应
+//                ApiResponse<Object> apiResponse = JsonParser.parseWithJavaType(response.getContent(), Object.class);
+//
+//                if (apiResponse.getCode()!=null && apiResponse.getCode() ==0) {
+//                    return apiResponse.getData();
+//                } else {
+//                    throw new RuntimeException(apiResponse.getMsg());
+//                }
+//            }else if (response.getStatusCode() == HttpURLConnection.HTTP_UNAUTHORIZED){
+//                //是否重新登录
+//                if (sessionHandler.needRelogin()){
+//                    //重新登录
+//                    sessionHandler.refreshToken();
+//                }
+//            }
+//            return null;
+//    }
+//
+//    //设备清单
+//    public List<DeviceChannelExtend> getDeviceList() throws Exception {
+//        try {
+//            String url= addr+ "/api/device/query/allChannels";
+//            Map<String, String> headers = new HashMap<>();
+//            String token = sessionHandler.getToken();
+//            if (StringUtils.isNotEmpty(token)) {
+//                headers.put("access-token", sessionHandler.getToken());
+//            }else{
+//                throw new RuntimeException("登录WVP失败");
+//            }
+//            HttpResponse response = sendHttpGet(url, StringUtils.EMPTY, Constants.UTF8,headers);
+//            if(response.getStatusCode() == HttpURLConnection.HTTP_OK){
+//                TypeReference<ApiResponse<List<DeviceChannelExtend>>> typeRef =
+//                        new TypeReference<ApiResponse<List<DeviceChannelExtend>>>() {};
+//                // 处理响应
+//                ApiResponse<List<DeviceChannelExtend>> apiResponse = ApiResponseParser.parseFullResponse(response.getContent(), typeRef);
+//
+//                if (apiResponse.getCode()!=null && apiResponse.getCode() ==0) {
+//                    return apiResponse.getData();
+//                } else {
+//                    throw new RuntimeException(apiResponse.getMsg());
+//                }
+//            }else if (response.getStatusCode() == HttpURLConnection.HTTP_UNAUTHORIZED){
+//                //是否重新登录
+//                if (sessionHandler.needRelogin()){
+//                    //重新登录
+//                    sessionHandler.refreshToken();
+//                }
+//                throw new Exception("重新登录");
+//            }
+//
+//        }catch (Exception e){
+//            log.error("请求失败: " + e.getMessage());
+//            throw e;
+//        }
+//        return new ArrayList<>();
+//    }
+//}

+ 70 - 70
app-admin/src/main/java/com/ruoyi/web/core/wvp/JsonParser.java

@@ -1,70 +1,70 @@
-package com.ruoyi.web.core.wvp;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JavaType;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.ruoyi.web.core.wvp.domain.ApiResponse;
-
-import java.util.List;
-import java.util.Map;
-
-public class JsonParser {
-    private static final ObjectMapper objectMapper = new ObjectMapper();
-
-    // 方法1: 使用TypeReference
-    public static <T> ApiResponse<T> parseWithTypeReference(String json, Class<T> dataType) {
-        try {
-            JavaType type = objectMapper.getTypeFactory()
-                    .constructParametricType(ApiResponse.class, dataType);
-            return objectMapper.readValue(json, type);
-        } catch (Exception e) {
-            throw new RuntimeException("JSON解析失败: " + json, e);
-        }
-    }
-
-    // 通用解析方法
-    public static <T> ApiResponse<T> parseResponse(String json, JavaType dataType) {
-        try {
-            JavaType responseType = objectMapper.getTypeFactory()
-                    .constructParametricType(ApiResponse.class, dataType);
-            return objectMapper.readValue(json, responseType);
-        } catch (Exception e) {
-            throw new RuntimeException("JSON解析失败", e);
-        }
-    }
-    // 解析为指定类型的便捷方法
-    public static <T> ApiResponse<T> parseToTypedResponse(String json, Class<T> dataType) {
-        return parseResponse(json, objectMapper.getTypeFactory().constructType(dataType));
-    }
-
-    // 方法2: 使用JavaType
-    public static <T> ApiResponse<T> parseWithJavaType(String json, Class<T> dataType) {
-        try {
-            JavaType javaType = objectMapper.getTypeFactory()
-                    .constructParametricType(ApiResponse.class, dataType);
-            return objectMapper.readValue(json, javaType);
-        } catch (Exception e) {
-            throw new RuntimeException("JSON解析失败", e);
-        }
-    }
-
-    // 方法3: 处理嵌套泛型(如List<T>)
-    public static <T> ApiResponse<List<T>> parseListResponse(String json, Class<T> elementType) {
-        try {
-            JavaType elementJavaType = objectMapper.getTypeFactory()
-                    .constructType(elementType);
-            JavaType listType = objectMapper.getTypeFactory()
-                    .constructCollectionType(List.class, elementType);
-            JavaType responseType = objectMapper.getTypeFactory()
-                    .constructParametricType(ApiResponse.class, listType);
-            return objectMapper.readValue(json, responseType);
-        } catch (Exception e) {
-            throw new RuntimeException("JSON解析失败", e);
-        }
-    }
-
-    // 转换为Map
-    public static Map<String, Object> parseJsonToMap(String json) throws Exception {
-        return objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {});
-    }
-}
+//package com.ruoyi.web.core.wvp;
+//
+//import com.fasterxml.jackson.core.type.TypeReference;
+//import com.fasterxml.jackson.databind.JavaType;
+//import com.fasterxml.jackson.databind.ObjectMapper;
+//import com.ruoyi.web.core.wvp.domain.ApiResponse;
+//
+//import java.util.List;
+//import java.util.Map;
+//
+//public class JsonParser {
+//    private static final ObjectMapper objectMapper = new ObjectMapper();
+//
+//    // 方法1: 使用TypeReference
+//    public static <T> ApiResponse<T> parseWithTypeReference(String json, Class<T> dataType) {
+//        try {
+//            JavaType type = objectMapper.getTypeFactory()
+//                    .constructParametricType(ApiResponse.class, dataType);
+//            return objectMapper.readValue(json, type);
+//        } catch (Exception e) {
+//            throw new RuntimeException("JSON解析失败: " + json, e);
+//        }
+//    }
+//
+//    // 通用解析方法
+//    public static <T> ApiResponse<T> parseResponse(String json, JavaType dataType) {
+//        try {
+//            JavaType responseType = objectMapper.getTypeFactory()
+//                    .constructParametricType(ApiResponse.class, dataType);
+//            return objectMapper.readValue(json, responseType);
+//        } catch (Exception e) {
+//            throw new RuntimeException("JSON解析失败", e);
+//        }
+//    }
+//    // 解析为指定类型的便捷方法
+//    public static <T> ApiResponse<T> parseToTypedResponse(String json, Class<T> dataType) {
+//        return parseResponse(json, objectMapper.getTypeFactory().constructType(dataType));
+//    }
+//
+//    // 方法2: 使用JavaType
+//    public static <T> ApiResponse<T> parseWithJavaType(String json, Class<T> dataType) {
+//        try {
+//            JavaType javaType = objectMapper.getTypeFactory()
+//                    .constructParametricType(ApiResponse.class, dataType);
+//            return objectMapper.readValue(json, javaType);
+//        } catch (Exception e) {
+//            throw new RuntimeException("JSON解析失败", e);
+//        }
+//    }
+//
+//    // 方法3: 处理嵌套泛型(如List<T>)
+//    public static <T> ApiResponse<List<T>> parseListResponse(String json, Class<T> elementType) {
+//        try {
+//            JavaType elementJavaType = objectMapper.getTypeFactory()
+//                    .constructType(elementType);
+//            JavaType listType = objectMapper.getTypeFactory()
+//                    .constructCollectionType(List.class, elementType);
+//            JavaType responseType = objectMapper.getTypeFactory()
+//                    .constructParametricType(ApiResponse.class, listType);
+//            return objectMapper.readValue(json, responseType);
+//        } catch (Exception e) {
+//            throw new RuntimeException("JSON解析失败", e);
+//        }
+//    }
+//
+//    // 转换为Map
+//    public static Map<String, Object> parseJsonToMap(String json) throws Exception {
+//        return objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {});
+//    }
+//}

+ 127 - 127
app-admin/src/main/java/com/ruoyi/web/core/wvp/SessionHandler.java

@@ -1,127 +1,127 @@
-package com.ruoyi.web.core.wvp;
-import com.ruoyi.common.constant.Constants;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.common.utils.http.HttpResponse;
-import com.ruoyi.web.core.wvp.domain.ApiResponse;
-import com.ruoyi.web.core.wvp.domain.Login;
-import com.ruoyi.common.core.redis.RedisCache;
-import com.ruoyi.common.utils.poi.ExcelUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Component;
-
-import java.net.HttpURLConnection;
-import java.nio.charset.StandardCharsets;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.HashMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import static com.ruoyi.common.utils.http.HttpUtils.sendHttpGet;
-
-@Component
-public class SessionHandler {
-    @Autowired
-    private RedisCache redisCache;
-
-    @Value(value = "${wvp.addr}")
-    private String addr;
-
-    @Value(value = "${wvp.username}")
-    private String username;
-
-    @Value(value = "${wvp.password}")
-    private String password;
-
-    private final String WVP_TOKEN = "WVP_TOKEN";
-
-    //token有效期 10分钟
-    private final Integer WVP_TOKEN_EXPIRATION = 10;
-
-    public final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
-
-    private long lastLoginTime;
-
-    public SessionHandler(){
-        // 启动定时任务
-        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
-        scheduler.scheduleAtFixedRate(
-                this::loginWVP,
-                1,
-                20*60,
-                TimeUnit.SECONDS
-        );
-    }
-
-    //登录WVP
-    private String loginWVP() {
-        try {
-            String url= addr+ "/api/user/login?username="+username+"&password="+hashPassword(password);
-            HttpResponse response = sendHttpGet(url, StringUtils.EMPTY, Constants.UTF8,new HashMap<>());
-
-            if(response.getStatusCode() == HttpURLConnection.HTTP_OK) {
-                // 处理响应
-                ApiResponse<Login> apiResponse = ApiResponseParser.parseFullResponse(response.getContent(), Login.class);
-                if (apiResponse.getCode() != null && apiResponse.getCode() == 0) {
-                    Login loginInfo = apiResponse.getData();
-                    redisCache.setCacheObject(WVP_TOKEN, loginInfo.getAccessToken(), WVP_TOKEN_EXPIRATION, TimeUnit.MINUTES);
-                    lastLoginTime = System.currentTimeMillis();
-                    return loginInfo.getAccessToken();
-                } else {
-                    throw new RuntimeException(apiResponse.getMsg());
-                }
-            }else{
-                throw new RuntimeException("登录失败");
-            }
-        }catch (Exception e){
-           log.error("请求失败: " + e.getMessage());
-        }
-        return null;
-    }
-
-    public long getLastLoginTime(){
-        return lastLoginTime;
-    }
-
-    public String getToken(){
-        String token =  redisCache.getCacheObject(WVP_TOKEN);
-        if (token == null) {
-           return loginWVP();
-        }
-        return token;
-    }
-
-    public boolean needRelogin(){
-        return  (System.currentTimeMillis() - lastLoginTime > WVP_TOKEN_EXPIRATION*60*1000);
-    }
-
-    public String refreshToken(){
-        redisCache.deleteObject(WVP_TOKEN);
-        return loginWVP();
-    }
-
-    private static String hashPassword(String password) {
-        try {
-            // MD5
-            MessageDigest digest = MessageDigest.getInstance("MD5");
-            byte[] hashBytes = digest.digest(password.getBytes(StandardCharsets.UTF_8));
-
-            // byte数组转成16进制的字符串
-            StringBuilder hexString = new StringBuilder();
-            for (byte b : hashBytes) {
-                String hex = Integer.toHexString(0xff & b);
-                if (hex.length() == 1) {
-                    hexString.append('0');
-                }
-                hexString.append(hex);
-            }
-            return hexString.toString();
-        } catch (NoSuchAlgorithmException e) {
-            throw new RuntimeException("MD5 algorithm not found", e);
-        }
-    }
-}
+//package com.ruoyi.web.core.wvp;
+//import com.ruoyi.common.constant.Constants;
+//import com.ruoyi.common.utils.StringUtils;
+//import com.ruoyi.common.utils.http.HttpResponse;
+//import com.ruoyi.web.core.wvp.domain.ApiResponse;
+//import com.ruoyi.web.core.wvp.domain.Login;
+//import com.ruoyi.common.core.redis.RedisCache;
+//import com.ruoyi.common.utils.poi.ExcelUtil;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.beans.factory.annotation.Value;
+//import org.springframework.stereotype.Component;
+//
+//import java.net.HttpURLConnection;
+//import java.nio.charset.StandardCharsets;
+//import java.security.MessageDigest;
+//import java.security.NoSuchAlgorithmException;
+//import java.util.HashMap;
+//import java.util.concurrent.Executors;
+//import java.util.concurrent.ScheduledExecutorService;
+//import java.util.concurrent.TimeUnit;
+//
+//import static com.ruoyi.common.utils.http.HttpUtils.sendHttpGet;
+//
+//@Component
+//public class SessionHandler {
+//    @Autowired
+//    private RedisCache redisCache;
+//
+//    @Value(value = "${wvp.addr}")
+//    private String addr;
+//
+//    @Value(value = "${wvp.username}")
+//    private String username;
+//
+//    @Value(value = "${wvp.password}")
+//    private String password;
+//
+//    private final String WVP_TOKEN = "WVP_TOKEN";
+//
+//    //token有效期 10分钟
+//    private final Integer WVP_TOKEN_EXPIRATION = 10;
+//
+//    public final Logger log = LoggerFactory.getLogger(ExcelUtil.class);
+//
+//    private long lastLoginTime;
+//
+//    public SessionHandler(){
+//        // 启动定时任务
+//        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+//        scheduler.scheduleAtFixedRate(
+//                this::loginWVP,
+//                1,
+//                20*60,
+//                TimeUnit.SECONDS
+//        );
+//    }
+//
+//    //登录WVP
+//    private String loginWVP() {
+//        try {
+//            String url= addr+ "/api/user/login?username="+username+"&password="+hashPassword(password);
+//            HttpResponse response = sendHttpGet(url, StringUtils.EMPTY, Constants.UTF8,new HashMap<>());
+//
+//            if(response.getStatusCode() == HttpURLConnection.HTTP_OK) {
+//                // 处理响应
+//                ApiResponse<Login> apiResponse = ApiResponseParser.parseFullResponse(response.getContent(), Login.class);
+//                if (apiResponse.getCode() != null && apiResponse.getCode() == 0) {
+//                    Login loginInfo = apiResponse.getData();
+//                    redisCache.setCacheObject(WVP_TOKEN, loginInfo.getAccessToken(), WVP_TOKEN_EXPIRATION, TimeUnit.MINUTES);
+//                    lastLoginTime = System.currentTimeMillis();
+//                    return loginInfo.getAccessToken();
+//                } else {
+//                    throw new RuntimeException(apiResponse.getMsg());
+//                }
+//            }else{
+//                throw new RuntimeException("登录失败");
+//            }
+//        }catch (Exception e){
+//           log.error("请求失败: " + e.getMessage());
+//        }
+//        return null;
+//    }
+//
+//    public long getLastLoginTime(){
+//        return lastLoginTime;
+//    }
+//
+//    public String getToken(){
+//        String token =  redisCache.getCacheObject(WVP_TOKEN);
+//        if (token == null) {
+//           return loginWVP();
+//        }
+//        return token;
+//    }
+//
+//    public boolean needRelogin(){
+//        return  (System.currentTimeMillis() - lastLoginTime > WVP_TOKEN_EXPIRATION*60*1000);
+//    }
+//
+//    public String refreshToken(){
+//        redisCache.deleteObject(WVP_TOKEN);
+//        return loginWVP();
+//    }
+//
+//    private static String hashPassword(String password) {
+//        try {
+//            // MD5
+//            MessageDigest digest = MessageDigest.getInstance("MD5");
+//            byte[] hashBytes = digest.digest(password.getBytes(StandardCharsets.UTF_8));
+//
+//            // byte数组转成16进制的字符串
+//            StringBuilder hexString = new StringBuilder();
+//            for (byte b : hashBytes) {
+//                String hex = Integer.toHexString(0xff & b);
+//                if (hex.length() == 1) {
+//                    hexString.append('0');
+//                }
+//                hexString.append(hex);
+//            }
+//            return hexString.toString();
+//        } catch (NoSuchAlgorithmException e) {
+//            throw new RuntimeException("MD5 algorithm not found", e);
+//        }
+//    }
+//}

+ 38 - 38
app-admin/src/main/java/com/ruoyi/web/core/wvp/domain/ApiResponse.java

@@ -1,38 +1,38 @@
-package com.ruoyi.web.core.wvp.domain;
-
-import org.apache.poi.ss.formula.functions.T;
-
-public class ApiResponse<T> {
-    private Integer code;
-    private T data;
-    private String msg;
-    public void setCode(Integer code)
-    {
-        this.code = code;
-    }
-
-    public Integer getCode()
-    {
-        return code;
-    }
-
-    public void setData(T data)
-    {
-        this.data = data;
-    }
-
-    public T getData()
-    {
-        return data;
-    }
-
-    public void setMsg(String msg)
-    {
-        this.msg = msg;
-    }
-
-    public String getMsg()
-    {
-        return msg;
-    }
-}
+//package com.ruoyi.web.core.wvp.domain;
+//
+//import org.apache.poi.ss.formula.functions.T;
+//
+//public class ApiResponse<T> {
+//    private Integer code;
+//    private T data;
+//    private String msg;
+//    public void setCode(Integer code)
+//    {
+//        this.code = code;
+//    }
+//
+//    public Integer getCode()
+//    {
+//        return code;
+//    }
+//
+//    public void setData(T data)
+//    {
+//        this.data = data;
+//    }
+//
+//    public T getData()
+//    {
+//        return data;
+//    }
+//
+//    public void setMsg(String msg)
+//    {
+//        this.msg = msg;
+//    }
+//
+//    public String getMsg()
+//    {
+//        return msg;
+//    }
+//}

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 612 - 612
app-admin/src/main/java/com/ruoyi/web/core/wvp/domain/DeviceChannelExtend.java


+ 15 - 15
app-admin/src/main/java/com/ruoyi/web/core/wvp/domain/DeviceChannelList.java

@@ -1,15 +1,15 @@
-package com.ruoyi.web.core.wvp.domain;
-
-import java.util.List;
-
-public class DeviceChannelList {
-    private List<DeviceChannelExtend> channelList;
-
-    public List<DeviceChannelExtend> getChannelList() {
-        return channelList;
-    }
-
-    public void setChannelList(List<DeviceChannelExtend> channelList) {
-        this.channelList = channelList;
-    }
-}
+//package com.ruoyi.web.core.wvp.domain;
+//
+//import java.util.List;
+//
+//public class DeviceChannelList {
+//    private List<DeviceChannelExtend> channelList;
+//
+//    public List<DeviceChannelExtend> getChannelList() {
+//        return channelList;
+//    }
+//
+//    public void setChannelList(List<DeviceChannelExtend> channelList) {
+//        this.channelList = channelList;
+//    }
+//}

+ 170 - 170
app-admin/src/main/java/com/ruoyi/web/core/wvp/domain/Login.java

@@ -1,170 +1,170 @@
-package com.ruoyi.web.core.wvp.domain;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
-import java.util.Date;
-
-public class Login {
-    private String accessToken;
-    private String serverId;
-    private Long id;
-    private Boolean enabled;
-    private String pushKey;
-    private Role role;
-    private String username;
-    private Boolean accountNonExpired;
-    private Boolean accountNonLocked;
-    private Boolean credentialsNonExpired;
-    private String password;
-    private Object authorities;
-
-    // getters and setters
-    public String getAccessToken() {
-        return accessToken;
-    }
-
-    public void setAccessToken(String accessToken) {
-        this.accessToken = accessToken;
-    }
-
-    public String getServerId() {
-        return serverId;
-    }
-
-    public void setServerId(String serverId) {
-        this.serverId = serverId;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public Boolean getEnabled() {
-        return enabled;
-    }
-
-    public void setEnabled(Boolean enabled) {
-        this.enabled = enabled;
-    }
-
-    public String getPushKey() {
-        return pushKey;
-    }
-
-    public void setPushKey(String pushKey) {
-        this.pushKey = pushKey;
-    }
-
-    public Role getRole() {
-        return role;
-    }
-
-    public void setRole(Role role) {
-        this.role = role;
-    }
-
-    public String getUsername() {
-        return username;
-    }
-
-    public void setUsername(String username) {
-        this.username = username;
-    }
-
-    public Boolean getAccountNonExpired() {
-        return accountNonExpired;
-    }
-
-    public void setAccountNonExpired(Boolean accountNonExpired) {
-        this.accountNonExpired = accountNonExpired;
-    }
-
-    public Boolean getAccountNonLocked() {
-        return accountNonLocked;
-    }
-
-    public void setAccountNonLocked(Boolean accountNonLocked) {
-        this.accountNonLocked = accountNonLocked;
-    }
-
-    public Boolean getCredentialsNonExpired() {
-        return credentialsNonExpired;
-    }
-
-    public void setCredentialsNonExpired(Boolean credentialsNonExpired) {
-        this.credentialsNonExpired = credentialsNonExpired;
-    }
-
-    public String getPassword() {
-        return password;
-    }
-
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    public Object getAuthorities() {
-        return authorities;
-    }
-
-    public void setAuthorities(Object authorities) {
-        this.authorities = authorities;
-    }
-
-    // Role内部类
-    public static class Role {
-        private Long id;
-        private String name;
-        private String authority;
-
-        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-        private Date createTime;
-
-        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
-        private Date updateTime;
-
-        // getters and setters
-        public Long getId() {
-            return id;
-        }
-
-        public void setId(Long id) {
-            this.id = id;
-        }
-
-        public String getName() {
-            return name;
-        }
-
-        public void setName(String name) {
-            this.name = name;
-        }
-
-        public String getAuthority() {
-            return authority;
-        }
-
-        public void setAuthority(String authority) {
-            this.authority = authority;
-        }
-
-        public Date getCreateTime() {
-            return createTime;
-        }
-
-        public void setCreateTime(Date createTime) {
-            this.createTime = createTime;
-        }
-
-        public Date getUpdateTime() {
-            return updateTime;
-        }
-
-        public void setUpdateTime(Date updateTime) {
-            this.updateTime = updateTime;
-        }
-    }
-}
+//package com.ruoyi.web.core.wvp.domain;
+//
+//import com.fasterxml.jackson.annotation.JsonFormat;
+//import java.util.Date;
+//
+//public class Login {
+//    private String accessToken;
+//    private String serverId;
+//    private Long id;
+//    private Boolean enabled;
+//    private String pushKey;
+//    private Role role;
+//    private String username;
+//    private Boolean accountNonExpired;
+//    private Boolean accountNonLocked;
+//    private Boolean credentialsNonExpired;
+//    private String password;
+//    private Object authorities;
+//
+//    // getters and setters
+//    public String getAccessToken() {
+//        return accessToken;
+//    }
+//
+//    public void setAccessToken(String accessToken) {
+//        this.accessToken = accessToken;
+//    }
+//
+//    public String getServerId() {
+//        return serverId;
+//    }
+//
+//    public void setServerId(String serverId) {
+//        this.serverId = serverId;
+//    }
+//
+//    public Long getId() {
+//        return id;
+//    }
+//
+//    public void setId(Long id) {
+//        this.id = id;
+//    }
+//
+//    public Boolean getEnabled() {
+//        return enabled;
+//    }
+//
+//    public void setEnabled(Boolean enabled) {
+//        this.enabled = enabled;
+//    }
+//
+//    public String getPushKey() {
+//        return pushKey;
+//    }
+//
+//    public void setPushKey(String pushKey) {
+//        this.pushKey = pushKey;
+//    }
+//
+//    public Role getRole() {
+//        return role;
+//    }
+//
+//    public void setRole(Role role) {
+//        this.role = role;
+//    }
+//
+//    public String getUsername() {
+//        return username;
+//    }
+//
+//    public void setUsername(String username) {
+//        this.username = username;
+//    }
+//
+//    public Boolean getAccountNonExpired() {
+//        return accountNonExpired;
+//    }
+//
+//    public void setAccountNonExpired(Boolean accountNonExpired) {
+//        this.accountNonExpired = accountNonExpired;
+//    }
+//
+//    public Boolean getAccountNonLocked() {
+//        return accountNonLocked;
+//    }
+//
+//    public void setAccountNonLocked(Boolean accountNonLocked) {
+//        this.accountNonLocked = accountNonLocked;
+//    }
+//
+//    public Boolean getCredentialsNonExpired() {
+//        return credentialsNonExpired;
+//    }
+//
+//    public void setCredentialsNonExpired(Boolean credentialsNonExpired) {
+//        this.credentialsNonExpired = credentialsNonExpired;
+//    }
+//
+//    public String getPassword() {
+//        return password;
+//    }
+//
+//    public void setPassword(String password) {
+//        this.password = password;
+//    }
+//
+//    public Object getAuthorities() {
+//        return authorities;
+//    }
+//
+//    public void setAuthorities(Object authorities) {
+//        this.authorities = authorities;
+//    }
+//
+//    // Role内部类
+//    public static class Role {
+//        private Long id;
+//        private String name;
+//        private String authority;
+//
+//        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//        private Date createTime;
+//
+//        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+//        private Date updateTime;
+//
+//        // getters and setters
+//        public Long getId() {
+//            return id;
+//        }
+//
+//        public void setId(Long id) {
+//            this.id = id;
+//        }
+//
+//        public String getName() {
+//            return name;
+//        }
+//
+//        public void setName(String name) {
+//            this.name = name;
+//        }
+//
+//        public String getAuthority() {
+//            return authority;
+//        }
+//
+//        public void setAuthority(String authority) {
+//            this.authority = authority;
+//        }
+//
+//        public Date getCreateTime() {
+//            return createTime;
+//        }
+//
+//        public void setCreateTime(Date createTime) {
+//            this.createTime = createTime;
+//        }
+//
+//        public Date getUpdateTime() {
+//            return updateTime;
+//        }
+//
+//        public void setUpdateTime(Date updateTime) {
+//            this.updateTime = updateTime;
+//        }
+//    }
+//}

+ 3 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsCheckProjectController.java

@@ -1,6 +1,7 @@
 package com.ruoyi.web.v2.v1.controller;
 
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.v2.v1.entity.JsCheckProject;
 import com.ruoyi.web.v2.v1.entity.JsDisinfectManage;
@@ -32,13 +33,13 @@ public class JsCheckProjectController {
 
     @ApiOperation("检验项目管理添加")
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody JsCheckProject checkProject){
+    public AjaxResult add(@RequestBody JsCheckProject checkProject) throws JsonProcessingException {
         return projectService.add(checkProject);
     }
 
     @ApiOperation("检验项目管理修改")
     @PostMapping("/edit")
-    public AjaxResult edit(@RequestBody JsCheckProject checkProject){
+    public AjaxResult edit(@RequestBody JsCheckProject checkProject) throws JsonProcessingException {
         return projectService.edit(checkProject);
     }
 

+ 23 - 3
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsDistributionController.java

@@ -1,9 +1,11 @@
 package com.ruoyi.web.v2.v1.controller;
 
 
+import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.v2.v1.entity.JsDeviceMaintenance;
 import com.ruoyi.web.v2.v1.entity.JsDistribution;
+import com.ruoyi.web.v2.v1.entity.JsProduceCode;
 import com.ruoyi.web.v2.v1.service.IJsDistributionService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -60,11 +62,11 @@ public class JsDistributionController {
     public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
             , @RequestParam(value = "startTime", required = false) String startTime
             , @RequestParam(value = "endTime", required = false) String endTime
-            , @RequestParam(value = "supplierId", required = false) Integer supplierId
-            , @RequestParam(value = "purchaserId", required = false) Integer purchaserId
+            , @RequestParam(value = "supplierName", required = false) String supplierName
+            , @RequestParam(value = "purchaserName", required = false) String purchaserName
             , @RequestParam(value = "animalCertNo", required = false) Integer animalCertNo) {
 
-        return distributionService.page(pageNum, pageSize, startTime, endTime,supplierId,purchaserId,animalCertNo);
+        return distributionService.page(pageNum, pageSize, startTime, endTime, supplierName, purchaserName, animalCertNo);
     }
 
     @ApiOperation("分销登记详情")
@@ -74,4 +76,22 @@ public class JsDistributionController {
         return success(distributionService.getById(id));
     }
 
+    @ApiOperation("屠宰生产清单")
+    @Anonymous
+    @GetMapping("/productionPage")
+    public AjaxResult productionPage(@RequestParam("pageNum") Integer pageNum,
+                                     @RequestParam("pageSize") Integer pageSize
+            ,@RequestParam(value = "startTime", required = false) String startTime
+            , @RequestParam(value = "endTime", required = false) String endTime
+            , @RequestParam(value = "animalCertNo", required = false) String animalCertNo) {
+        return success(distributionService.productionPage(pageNum, pageSize, startTime, endTime, animalCertNo));
+    }
+
+    @ApiOperation("合格证修改")
+    @PostMapping("/editProduce")
+    public AjaxResult editProduce(@RequestBody JsProduceCode jsProduceCode) {
+        return distributionService.editProduce(jsProduceCode);
+    }
+
+
 }

+ 4 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsDivideCircleController.java

@@ -46,13 +46,15 @@ public class JsDivideCircleController {
     @PostMapping("/delete")
     public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
         String ids = paramsMap.get("ids");
+
         return divideCircleService.delete(ids);
     }
 
     @ApiOperation("分圈登记列表")
     @PostMapping("/list")
-    public AjaxResult listAll() {
-        return divideCircleService.listAll();
+    public AjaxResult listAll(@RequestBody Map<String, String> paramsMap) {
+        String startTime = paramsMap.get("startTime");
+        return divideCircleService.listAll(startTime);
     }
 
     @ApiOperation("分圈登记分页")

+ 60 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsDrugCheckController.java

@@ -1,18 +1,25 @@
 package com.ruoyi.web.v2.v1.controller;
 
 
+import com.ruoyi.app.domain.HarmlessTreatment;
+import com.ruoyi.app.domain.response.DrugCheckParam;
+import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
 import com.ruoyi.web.v2.v1.entity.JsDivideCircle;
 import com.ruoyi.web.v2.v1.entity.JsDrugCheck;
+import com.ruoyi.web.v2.v1.entity.vo.DrugAndProduce;
 import com.ruoyi.web.v2.v1.service.IJsDrugCheckService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
 import java.util.Map;
 
 import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.PageUtils.startPage;
 
 /**
  * <p>
@@ -72,4 +79,57 @@ public class JsDrugCheckController {
         String id = paramsMap.get("id");
         return success(drugCheckService.getById(id));
     }
+
+    @ApiOperation("违禁药物检测及屠宰检验情况登记表")
+    @Anonymous
+    @GetMapping("/drugAndProduce")
+    public AjaxResult drugAndProduce(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , @RequestParam(value = "startTime", required = false) String startTime
+            , @RequestParam(value = "endTime", required = false) String endTime
+            , @RequestParam(value = "cargoOwner", required = false) String cargoOwner) {
+        return success(drugCheckService.drugAndProduce(pageNum, pageSize,startTime,endTime,cargoOwner));
+    }
+
+    @ApiOperation("无害化处理登记表")
+    @Anonymous
+    @GetMapping("/harmlessTreatment")
+    public AjaxResult harmlessTreatment(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , @RequestParam(value = "startTime", required = false) String startTime
+            , @RequestParam(value = "endTime", required = false) String endTime
+            , @RequestParam(value = "cargoOwner", required = false) String cargoOwner) {
+        return success(drugCheckService.harmlessTreatment(pageNum, pageSize,startTime,endTime,cargoOwner));
+    }
+
+        @ApiOperation("生猪入场查验情况登记表")
+    @Anonymous
+    @GetMapping("/Admission")
+    public AjaxResult Admission(@RequestParam("pageNum") Integer pageNum,
+                                @RequestParam("pageSize") Integer pageSize
+                , @RequestParam(value = "startTime", required = false) String startTime
+                , @RequestParam(value = "endTime", required = false) String endTime
+                , @RequestParam(value = "animalCertNo", required = false) String animalCertNo
+                , @RequestParam(value = "cargoOwner", required = false) String cargoOwner) {
+        return success(drugCheckService.Admission(pageNum, pageSize,startTime,endTime,animalCertNo,cargoOwner));
+    }
+
+
+    @ApiOperation("生猪产品出场情况登记表")
+    @Anonymous
+    @GetMapping("/outPlace")
+    public AjaxResult outPlace(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , @RequestParam(value = "startTime", required = false) String startTime
+            , @RequestParam(value = "endTime", required = false) String endTime
+            , @RequestParam(value = "cargoOwner", required = false) String cargoOwner) {
+        return success(drugCheckService.outPlace(pageNum, pageSize,startTime,endTime,cargoOwner));
+    }
+
+    @ApiOperation("生猪屠宰情况日汇总等级表")
+    @Anonymous
+    @GetMapping("/SummaryVo")
+    public AjaxResult SummaryVo(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , @RequestParam(value = "startTime", required = false) String startTime
+            , @RequestParam(value = "endTime", required = false) String endTime) {
+        return success(drugCheckService.SummaryVo(pageNum, pageSize, startTime, endTime));
+    }
+
 }

+ 18 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsDrugController.java

@@ -3,8 +3,12 @@ package com.ruoyi.web.v2.v1.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.jsonUtil;
 import com.ruoyi.web.v2.v1.entity.JsCheckProject;
 import com.ruoyi.web.v2.v1.entity.JsDrug;
 import com.ruoyi.web.v2.v1.service.IJsDrugService;
@@ -36,7 +40,13 @@ public class JsDrugController {
 
     @ApiOperation("违禁药物管理添加")
     @PostMapping("/add")
-    public AjaxResult add(@RequestBody JsDrug jsDrug){
+    public AjaxResult add(@RequestBody JsDrug jsDrug) throws JsonProcessingException {
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode jsonArray = mapper.readTree(jsDrug.getResult());
+        String fieldToCheck = "name";
+        if (jsonUtil.checkForDuplicateFields(jsonArray, fieldToCheck)) {
+            return error("新增药物'" + jsDrug.getDrugName() + "'失败,本次添加中存在重复的检查结果");
+        }
         int i = drugService.count(new QueryWrapper<JsDrug>().eq("drug_name", jsDrug.getDrugName()));
         if (i != 0) {
             return error("该违禁药物已存在");
@@ -47,7 +57,13 @@ public class JsDrugController {
 
     @ApiOperation("违禁药物管理修改")
     @PostMapping("/edit")
-    public AjaxResult edit(@RequestBody JsDrug jsDrug){
+    public AjaxResult edit(@RequestBody JsDrug jsDrug) throws JsonProcessingException {
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode jsonArray = mapper.readTree(jsDrug.getResult());
+        String fieldToCheck = "name";
+        if (jsonUtil.checkForDuplicateFields(jsonArray, fieldToCheck)) {
+            return error("修改药物'" + jsDrug.getDrugName() + "'失败,本次添加中存在重复的检查结果");
+        }
         int i = drugService.count(new QueryWrapper<JsDrug>().eq("drug_name", jsDrug.getDrugName()).ne("id",jsDrug.getId()));
         if (i != 0) {
             return error("该违禁药物已存在");

+ 3 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsInStockController.java

@@ -51,8 +51,9 @@ public class JsInStockController {
 
     @ApiOperation("物料入库列表")
     @PostMapping("/list")
-    public AjaxResult listAll() {
-        return inStockService.listAll();
+    public AjaxResult listAll(@RequestBody Map<String, String> paramsMap) {
+        String materialBatch = paramsMap.get("materialBatch");
+        return inStockService.listAll(materialBatch);
     }
 
     @ApiOperation("物料入库分页")

+ 55 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsPatrolController.java

@@ -1,9 +1,18 @@
 package com.ruoyi.web.v2.v1.controller;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.web.v2.v1.entity.JsPatrol;
+import com.ruoyi.web.v2.v1.entity.JsStore;
+import com.ruoyi.web.v2.v1.service.IJsPatrolService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
 
 /**
  * <p>
@@ -15,6 +24,50 @@ import org.springframework.web.bind.annotation.RestController;
  */
 @RestController
 @RequestMapping("/js-patrol")
+@Api("2.0质量巡查")
 public class JsPatrolController {
 
+    @Autowired
+    private IJsPatrolService jsPatrolService;
+
+    @ApiOperation("质量巡查添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody JsPatrol jsPatrol) {
+        return jsPatrolService.add(jsPatrol);
+    }
+
+    @ApiOperation("质量巡查修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody JsPatrol jsPatrol) {
+        return jsPatrolService.edit(jsPatrol);
+    }
+
+    @ApiOperation("质量巡查删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        return jsPatrolService.delete(ids);
+    }
+
+    @ApiOperation("质量巡查列表")
+    @PostMapping("/list")
+    public AjaxResult listAll() {
+        return jsPatrolService.listAll();
+    }
+
+    @ApiOperation("质量巡查分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , @RequestParam(value = "startTime", required = false) String startTime
+            , @RequestParam(value = "endTime", required = false) String endTime
+            , @RequestParam(value = "patrolLocation", required = false) String patrolLocation) {
+        return jsPatrolService.page(pageNum, pageSize, startTime, endTime,patrolLocation);
+    }
+
+    @ApiOperation("质量巡查详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(jsPatrolService.getById(id));
+    }
 }

+ 10 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsRestInspectionController.java

@@ -105,9 +105,18 @@ public class JsRestInspectionController {
         String pageNum = paramsMap.get("pageNum");
         String pageSize = paramsMap.get("pageSize");
         String id = paramsMap.get("id");
+        String[] split = id.split(",");
         Page<JsRestInspection> page = new Page<>(Integer.parseInt(pageNum), Integer.parseInt(pageSize));
         QueryWrapper<JsRestInspection> queryWrapper = new QueryWrapper<>();
-        queryWrapper.in("divide_circle_id",id);
+        queryWrapper.in("id",split);
         return success(inspectionService.page(page, queryWrapper));
     }
+
+
+    @ApiOperation("选择待宰圈号得到最新待宰圈的批次")
+    @PostMapping("/listByPigpen")
+    public AjaxResult listByPigpen(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(inspectionService.listByPigpen(Integer.parseInt(id)));
+    }
 }

+ 4 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsStockController.java

@@ -8,6 +8,8 @@ import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Map;
+
 /**
  * <p>
  * v2.0库存管理 前端控制器
@@ -26,8 +28,8 @@ public class JsStockController {
 
     @ApiOperation("库存管理列表")
     @PostMapping("/list")
-    public AjaxResult listAll() {
-        return stockService.listAll();
+    public AjaxResult listAll(@RequestBody Map<String, String> paramsMap) {
+        return stockService.listAll(paramsMap);
     }
 
     @ApiOperation("库存管理分页")

+ 55 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsStoreController.java

@@ -1,9 +1,18 @@
 package com.ruoyi.web.v2.v1.controller;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.web.v2.v1.entity.JsProduceRecall;
+import com.ruoyi.web.v2.v1.entity.JsStore;
+import com.ruoyi.web.v2.v1.service.IJsStoreService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
 
 /**
  * <p>
@@ -15,6 +24,50 @@ import org.springframework.web.bind.annotation.RestController;
  */
 @RestController
 @RequestMapping("/js-store")
+@Api("2.0无害化暂存")
 public class JsStoreController {
 
+    @Autowired
+    private IJsStoreService storeService;
+
+    @ApiOperation("无害化暂存添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody JsStore jsStore) {
+        return storeService.add(jsStore);
+    }
+
+    @ApiOperation("无害化暂存修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody JsStore jsStore) {
+        return storeService.edit(jsStore);
+    }
+
+    @ApiOperation("无害化暂存删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        return storeService.delete(ids);
+    }
+
+    @ApiOperation("无害化暂存列表")
+    @PostMapping("/list")
+    public AjaxResult listAll() {
+        return storeService.listAll();
+    }
+
+    @ApiOperation("无害化暂存分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , @RequestParam(value = "startTime", required = false) String startTime
+            , @RequestParam(value = "endTime", required = false) String endTime
+            , @RequestParam(value = "harmlessTreatmentId", required = false) Integer harmlessTreatmentId) {
+        return storeService.page(pageNum, pageSize, startTime, endTime,harmlessTreatmentId);
+    }
+
+    @ApiOperation("无害化暂存详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(storeService.getById(id));
+    }
 }

+ 59 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsTransportController.java

@@ -1,9 +1,19 @@
 package com.ruoyi.web.v2.v1.controller;
 
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.ruoyi.app.service.IHarmlessTreatmentService;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.web.v2.v1.entity.JsStore;
+import com.ruoyi.web.v2.v1.entity.JsTransport;
+import com.ruoyi.web.v2.v1.service.IJsTransportService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
 
-import org.springframework.web.bind.annotation.RestController;
+import java.util.Map;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
 
 /**
  * <p>
@@ -15,6 +25,53 @@ import org.springframework.web.bind.annotation.RestController;
  */
 @RestController
 @RequestMapping("/js-transport")
+@Api("2.0无害化转运")
 public class JsTransportController {
 
+    @Autowired
+    private IJsTransportService transportService;
+    @Autowired
+    private IHarmlessTreatmentService harmlessTreatmentService;
+
+    @ApiOperation("无害化转运添加")
+    @PostMapping("/add")
+    public AjaxResult add(@RequestBody JsTransport transport) {
+        return transportService.add(transport);
+    }
+
+    @ApiOperation("无害化转运修改")
+    @PostMapping("/edit")
+    public AjaxResult edit(@RequestBody JsTransport transport) {
+        return transportService.edit(transport);
+    }
+
+    @ApiOperation("无害化转运删除")
+    @PostMapping("/delete")
+    public AjaxResult delete(@RequestBody Map<String, String> paramsMap) {
+        String ids = paramsMap.get("ids");
+        return transportService.delete(ids);
+    }
+
+    @ApiOperation("无害化转运列表")
+    @PostMapping("/list")
+    public AjaxResult listAll() {
+        return transportService.listAll();
+    }
+
+    @ApiOperation("无害化转运分页")
+    @GetMapping("/page")
+    public AjaxResult page(@RequestParam("pageNum") Integer pageNum, @RequestParam("pageSize") Integer pageSize
+            , @RequestParam(value = "startTime", required = false) String startTime
+            , @RequestParam(value = "endTime", required = false) String endTime
+            , @RequestParam(value = "harmlessTreatmentId", required = false) Integer harmlessTreatmentId) {
+        return transportService.page(pageNum, pageSize, startTime, endTime,harmlessTreatmentId);
+    }
+
+    @ApiOperation("无害化转运详情")
+    @PostMapping("/listById")
+    public AjaxResult listById(@RequestBody Map<String, String> paramsMap) {
+        String id = paramsMap.get("id");
+        return success(transportService.getById(id));
+    }
+
 }

+ 3 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/controller/JsWorkshopController.java

@@ -51,8 +51,9 @@ public class JsWorkshopController {
 
     @ApiOperation("生产车间管理管理列表")
     @PostMapping("/list")
-    public AjaxResult listAll(){
-        return workshopService.listAll();
+    public AjaxResult listAll(@RequestBody Map<String, String> paramsMap){
+        String workshopType = paramsMap.get("workshopType");
+        return workshopService.listAll(workshopType);
     }
 
     @ApiOperation("生产车间管理管理分页")

+ 3 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsCheckDevice.java

@@ -54,5 +54,8 @@ public class JsCheckDevice implements Serializable {
     @ApiModelProperty(value = "联系人")
     private String userName;
 
+    @ApiModelProperty(value = "保养周期")
+    private Integer days;
+
 
 }

+ 2 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsCheckInstrument.java

@@ -54,5 +54,7 @@ public class JsCheckInstrument implements Serializable {
     @ApiModelProperty(value = "联系人")
     private String userName;
 
+    @ApiModelProperty(value = "保养周期")
+    private Integer days;
 
 }

+ 3 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsCheckProject.java

@@ -42,11 +42,12 @@ public class JsCheckProject implements Serializable {
     @ApiModelProperty(value = "检验方法")
     private String checkMethod;
 
-    @ApiModelProperty(value = "结果选项0正常1异常")
-    private Integer result;
+    @ApiModelProperty(value = "结果")
+    private String result;
 
     @ApiModelProperty(value = "检验时间")
     private String createTime;
 
+    private Boolean defaultFlag;
 
 }

+ 2 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDeviceMaintenance.java

@@ -49,5 +49,7 @@ public class JsDeviceMaintenance implements Serializable {
     @ApiModelProperty(value = "责任人")
     private String userName;
 
+    @ApiModelProperty(value = "维修人员")
+    private String maintenanceUser;
 
 }

+ 3 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDisinfectManage.java

@@ -50,4 +50,7 @@ public class JsDisinfectManage implements Serializable {
     private String remark;
 
 
+    private Boolean defaultFlag;
+
+
 }

+ 15 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDistribution.java

@@ -53,7 +53,7 @@ public class JsDistribution implements Serializable {
     private String produceName;
 
     @ApiModelProperty(value = "数量")
-    private String amount;
+    private Integer amount;
 
     @ApiModelProperty(value = "吊钩类型")
     private String hookType;
@@ -70,5 +70,19 @@ public class JsDistribution implements Serializable {
     @ApiModelProperty(value = "宰后重量")
     private String afterWeight;
 
+    @ApiModelProperty(value = "进场批次")
+    private Integer entranceBatchId;
+
+    /*动物检疫合格证*/
+    @ApiModelProperty(value = "动物检疫合格证")
+    private String animalCert;
+
+    /*肉品合格证*/
+    @ApiModelProperty(value = "肉品合格证")
+    private String meatCert;
+
+    private String oneCode;
+
+    private String unit;
 
 }

+ 8 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDrug.java

@@ -33,5 +33,13 @@ public class JsDrug implements Serializable {
     @ApiModelProperty(value = "药物名称")
     private String drugName;
 
+    @ApiModelProperty(value = "结果")
+    private String result;
+
+    @ApiModelProperty(value = "内容")
+    private String content;
+
+    @ApiModelProperty(value = "方法")
+    private String method;
 
 }

+ 1 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsDrugCheck.java

@@ -53,7 +53,7 @@ public class JsDrugCheck implements Serializable {
     private String checkConten;
 
     @ApiModelProperty(value = "抽检结果")
-    private Integer result;
+    private String result;
 
     @ApiModelProperty(value = "批次号")
     private Integer entranceBatchId;

+ 2 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsInstrumentMaintenance.java

@@ -49,5 +49,6 @@ public class JsInstrumentMaintenance implements Serializable {
     @ApiModelProperty(value = "责任人")
     private String userName;
 
-
+    @ApiModelProperty(value = "维护人")
+    private String maintenanceUser;
 }

+ 11 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsMaterial.java

@@ -33,8 +33,19 @@ public class JsMaterial implements Serializable {
     @ApiModelProperty(value = "物料名称")
     private String materialName;
 
+    @ApiModelProperty(value = "物料编码")
+    private String materialNum;
+
     @ApiModelProperty(value = "物料类型(原材料、产品、包材、危险化学品、检验检疫试剂、消毒药剂)")
     private Integer materialType;
 
+    @ApiModelProperty(value = "计量单位")
+    private String unit;
+
+    @ApiModelProperty(value = "型号规格")
+    private String model;
+
+    @ApiModelProperty(value = "保存条件")
+    private String saveCondition;
 
 }

+ 3 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsProduceCheck.java

@@ -58,7 +58,7 @@ public class JsProduceCheck implements Serializable {
     private String unqualifiedNum;
 
     @ApiModelProperty(value = "类型")
-    private Integer type;
+    private Integer types;
 
     @ApiModelProperty(value = "不合格原因")
     private String unqualifiedReason;
@@ -71,5 +71,7 @@ public class JsProduceCheck implements Serializable {
 
     private Integer entranceBatchId;
 
+    private String unit;
+
 
 }

+ 3 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsProduceRecall.java

@@ -55,5 +55,8 @@ public class JsProduceRecall implements Serializable {
     @ApiModelProperty(value = "召回后处理")
     private String recallDeal;
 
+    private String unit;
+
+    private String recallWeight;
 
 }

+ 1 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsStore.java

@@ -35,7 +35,7 @@ public class JsStore implements Serializable {
     private String storeTime;
 
     @ApiModelProperty(value = "无害化批次id")
-    private Integer harmlessTreatmentId;
+    private String harmlessTreatmentId;
 
     @ApiModelProperty(value = "病死病害头数")
     private Integer illnessAmount;

+ 3 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/entity/JsTransport.java

@@ -35,7 +35,7 @@ public class JsTransport implements Serializable {
     private String transportTime;
 
     @ApiModelProperty(value = "无害化批次id")
-    private Integer harmlessTreatmentId;
+    private String harmlessTreatmentId;
 
     @ApiModelProperty(value = "病死病害头数")
     private Integer illnessAmount;
@@ -55,5 +55,7 @@ public class JsTransport implements Serializable {
     @ApiModelProperty(value = "联系电话")
     private String phone;
 
+    private String responsibilityUser;
+
 
 }

+ 1 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/mapper/JsCheckProjectMapper.java

@@ -12,5 +12,6 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @since 2025-05-20
  */
 public interface JsCheckProjectMapper extends BaseMapper<JsCheckProject> {
+    public int updateHookDefault();
 
 }

+ 1 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/mapper/JsDisinfectManageMapper.java

@@ -14,4 +14,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface JsDisinfectManageMapper extends BaseMapper<JsDisinfectManage> {
 
+    public int updateHookDefault();
 }

+ 5 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/mapper/JsDistributionMapper.java

@@ -2,6 +2,10 @@ package com.ruoyi.web.v2.v1.mapper;
 
 import com.ruoyi.web.v2.v1.entity.JsDistribution;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.web.v2.v1.entity.vo.ProductionVo;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface JsDistributionMapper extends BaseMapper<JsDistribution> {
 
+    List<ProductionVo> getAllList(@Param("purchaserName")String purchaserName,@Param("startTime") String startTime, @Param("endTime")String endTime);
 }

+ 4 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/mapper/JsDrugCheckMapper.java

@@ -2,6 +2,9 @@ package com.ruoyi.web.v2.v1.mapper;
 
 import com.ruoyi.web.v2.v1.entity.JsDrugCheck;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.web.v2.v1.entity.vo.DrugCheckVo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface JsDrugCheckMapper extends BaseMapper<JsDrugCheck> {
 
+    List<DrugCheckVo> getDrug(Long id);
 }

+ 4 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/mapper/JsProduceCheckMapper.java

@@ -2,6 +2,9 @@ package com.ruoyi.web.v2.v1.mapper;
 
 import com.ruoyi.web.v2.v1.entity.JsProduceCheck;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.web.v2.v1.entity.vo.ProduceCheckVo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface JsProduceCheckMapper extends BaseMapper<JsProduceCheck> {
 
+    List<ProduceCheckVo> getAll(Integer id);
 }

+ 3 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsCheckProjectService.java

@@ -1,5 +1,6 @@
 package com.ruoyi.web.v2.v1.service;
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.v2.v1.entity.JsCheckProject;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -16,9 +17,9 @@ import com.ruoyi.web.v2.v1.entity.JsDisinfectManage;
 public interface IJsCheckProjectService extends IService<JsCheckProject> {
 
 
-    AjaxResult add(JsCheckProject checkProject);
+    AjaxResult add(JsCheckProject checkProject) throws JsonProcessingException;
 
-    AjaxResult edit(JsCheckProject checkProject);
+    AjaxResult edit(JsCheckProject checkProject) throws JsonProcessingException;
 
     AjaxResult delete(String ids);
 

+ 11 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsDistributionService.java

@@ -4,6 +4,10 @@ import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.v2.v1.entity.JsDeviceMaintenance;
 import com.ruoyi.web.v2.v1.entity.JsDistribution;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.web.v2.v1.entity.JsProduceCode;
+import com.ruoyi.web.v2.v1.entity.JsProduction;
+import com.ruoyi.web.v2.v1.entity.vo.DrugAndProduce;
+import com.ruoyi.web.v2.v1.utils.PaginationUtil;
 
 /**
  * <p>
@@ -21,7 +25,13 @@ public interface IJsDistributionService extends IService<JsDistribution> {
 
     AjaxResult delete(String ids);
 
-    AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, Integer supplierId, Integer purchaserId, Integer animalCertNo);
+    AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, String supplierName, String purchaserName,  Integer animalCertNo);
 
     AjaxResult listAll();
+
+    //屠宰生产清单
+    PaginationUtil.PageResult<JsProduction> productionPage(Integer pageNum, Integer pageSize, String startTime, String endTime, String animalCertNo);
+
+    AjaxResult editProduce(JsProduceCode jsProduceCode);
+
 }

+ 1 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsDivideCircleService.java

@@ -23,5 +23,5 @@ public interface IJsDivideCircleService extends IService<JsDivideCircle> {
 
     AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, String pigpenName);
 
-    AjaxResult listAll();
+    AjaxResult listAll(String startTime);
 }

+ 22 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsDrugCheckService.java

@@ -1,9 +1,14 @@
 package com.ruoyi.web.v2.v1.service;
 
+import com.ruoyi.app.domain.response.DrugCheckParam;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.v2.v1.entity.JsDivideCircle;
 import com.ruoyi.web.v2.v1.entity.JsDrugCheck;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.web.v2.v1.entity.vo.*;
+import com.ruoyi.web.v2.v1.utils.PaginationUtil;
+
+import java.util.List;
 
 /**
  * <p>
@@ -24,4 +29,21 @@ public interface IJsDrugCheckService extends IService<JsDrugCheck> {
     AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, String animalCertNo);
 
     AjaxResult listAll();
+
+    //违禁药物检测及屠宰检验情况登记表
+    PaginationUtil.PageResult<DrugAndProduce> drugAndProduce(Integer pageNum,Integer pageSize,String startTime,String endTime,String cargoOwner);
+
+    //无害化处理登记表
+    PaginationUtil.PageResult<HarmlessVo> harmlessTreatment(Integer pageNum, Integer pageSize,String startTime,String endTime,String cargoOwner);
+
+    //生猪入场查验情况登记表
+    PaginationUtil.PageResult<AdmissionVo> Admission(Integer pageNum, Integer pageSize,String startTime
+            ,String endTime,String animalCertNo,String cargoOwner);
+
+
+    //生猪产品出场情况登记表
+    PaginationUtil.PageResult<OutPlaceVo> outPlace(Integer pageNum, Integer pageSize,String startTime,String endTime,String cargoOwner);
+
+    //生猪屠宰情况日汇总等级表
+    PaginationUtil.PageResult<SummaryVo> SummaryVo(Integer pageNum, Integer pageSize,String startTime,String endTime);
 }

+ 1 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsInStockService.java

@@ -23,6 +23,6 @@ public interface IJsInStockService extends IService<JsInStock> {
 
     AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, String materialBatch, String materialName, Integer materialType);
 
-    AjaxResult listAll();
+    AjaxResult listAll(String materialBatch);
 
 }

+ 11 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsPatrolService.java

@@ -1,7 +1,9 @@
 package com.ruoyi.web.v2.v1.service;
 
+import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.web.v2.v1.entity.JsPatrol;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.web.v2.v1.entity.JsStore;
 
 /**
  * <p>
@@ -13,4 +15,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IJsPatrolService extends IService<JsPatrol> {
 
+    AjaxResult add(JsPatrol jsPatrol);
+
+    AjaxResult edit(JsPatrol jsPatrol);
+
+    AjaxResult delete(String ids);
+
+    AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, String patrolLocation);
+
+    AjaxResult listAll();
 }

+ 3 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsRestInspectionService.java

@@ -35,4 +35,7 @@ public interface IJsRestInspectionService extends IService<JsRestInspection> {
     AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, String pigpenName);
 
     AjaxResult listAll();
+
+    //选择待宰圈号 得到最新待宰圈的批次
+    AjaxResult listByPigpen(Integer pigpenId);
 }

+ 3 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsStockService.java

@@ -5,6 +5,8 @@ import com.ruoyi.web.v2.v1.entity.JsSample;
 import com.ruoyi.web.v2.v1.entity.JsStock;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.Map;
+
 /**
  * <p>
  * v2.0库存管理 服务类
@@ -17,5 +19,5 @@ public interface IJsStockService extends IService<JsStock> {
 
     AjaxResult page(Integer pageNum, Integer pageSize, String materialBatch, String materialName, Integer materialType);
 
-    AjaxResult listAll();
+    AjaxResult listAll(Map<String, String> paramsMap);
 }

+ 11 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsStoreService.java

@@ -1,5 +1,7 @@
 package com.ruoyi.web.v2.v1.service;
 
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.web.v2.v1.entity.JsProduceRecall;
 import com.ruoyi.web.v2.v1.entity.JsStore;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,4 +15,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IJsStoreService extends IService<JsStore> {
 
+    AjaxResult add(JsStore jsStore);
+
+    AjaxResult edit(JsStore jsStore);
+
+    AjaxResult delete(String ids);
+
+    AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, Integer harmlessTreatmentId);
+
+    AjaxResult listAll();
 }

+ 11 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsTransportService.java

@@ -1,5 +1,7 @@
 package com.ruoyi.web.v2.v1.service;
 
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.web.v2.v1.entity.JsStore;
 import com.ruoyi.web.v2.v1.entity.JsTransport;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,4 +15,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IJsTransportService extends IService<JsTransport> {
 
+    AjaxResult add(JsTransport transport);
+
+    AjaxResult edit(JsTransport transport);
+
+    AjaxResult delete(String ids);
+
+    AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, Integer harmlessTreatmentId);
+
+    AjaxResult listAll();
 }

+ 1 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/IJsWorkshopService.java

@@ -23,5 +23,5 @@ public interface IJsWorkshopService extends IService<JsWorkshop> {
 
     AjaxResult page(Integer pageNum, Integer pageSize, String workshopName, String workshopNum, String workshopType);
 
-    AjaxResult listAll();
+    AjaxResult listAll(String workshopType);
 }

+ 24 - 10
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsCheckDeviceServiceImpl.java

@@ -11,8 +11,10 @@ import com.ruoyi.web.v2.v1.entity.JsWorkshop;
 import com.ruoyi.web.v2.v1.mapper.JsCheckDeviceMapper;
 import com.ruoyi.web.v2.v1.service.IJsCheckDeviceService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.web.v2.v1.utils.PhoneNumberValidator;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import static com.ruoyi.common.core.domain.AjaxResult.error;
 import static com.ruoyi.common.core.domain.AjaxResult.success;
@@ -34,14 +36,17 @@ public class JsCheckDeviceServiceImpl extends ServiceImpl<JsCheckDeviceMapper, J
     @Override
     public AjaxResult add(JsCheckDevice checkDevice) {
         String deviceName = checkDevice.getDeviceName();
-        Integer count = checkDeviceMapper.selectCount(new QueryWrapper<JsCheckDevice>().eq("device_name", deviceName));
+        if (ObjectUtil.isNotEmpty(checkDevice.getPhone())) {
+            if (!PhoneNumberValidator.isValidPhoneNumber(checkDevice.getPhone())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return error("手机号码格式不正确!");
+            }
+        }
+        Integer count = checkDeviceMapper.selectCount(new QueryWrapper<JsCheckDevice>().eq("device_name", deviceName)
+                .or().eq("device_num",checkDevice.getDeviceNum()));
         if (count != 0) {
             return error("设备档案已存在!");
         } else {
-            UUID uuid = UUID.randomUUID();
-            String uuidStr = uuid.toString();
-            String randomNum = uuidStr.substring(0, 6);
-            checkDevice.setDeviceNum(randomNum);
             checkDeviceMapper.insert(checkDevice);
         }
         return success("添加成功");
@@ -50,12 +55,21 @@ public class JsCheckDeviceServiceImpl extends ServiceImpl<JsCheckDeviceMapper, J
     @Override
     public AjaxResult edit(JsCheckDevice checkDevice) {
         String deviceName = checkDevice.getDeviceName();
-        Integer count = checkDeviceMapper.selectCount(new QueryWrapper<JsCheckDevice>().eq("device_name", deviceName).ne("id",checkDevice.getId()));
+        if (ObjectUtil.isNotEmpty(checkDevice.getPhone())) {
+            if (!PhoneNumberValidator.isValidPhoneNumber(checkDevice.getPhone())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return error("手机号码格式不正确!");
+            }
+        }
+        Integer count = checkDeviceMapper.selectCount(new QueryWrapper<JsCheckDevice>().ne("id",checkDevice.getId()).eq("device_name", deviceName));
         if (count != 0) {
-            return error("车间名称已存在!");
-        } else {
-            checkDeviceMapper.updateById(checkDevice);
+            return error("设备档案名称已存在!");
+        }
+        Integer count1 = checkDeviceMapper.selectCount(new QueryWrapper<JsCheckDevice>().ne("id",checkDevice.getId()).eq("device_num", checkDevice.getDeviceNum()));
+        if (count1 != 0) {
+            return error("设备档案编号已存在!");
         }
+        checkDeviceMapper.updateById(checkDevice);
         return success("修改成功");
     }
 
@@ -73,7 +87,7 @@ public class JsCheckDeviceServiceImpl extends ServiceImpl<JsCheckDeviceMapper, J
     public AjaxResult page(Integer pageNum, Integer pageSize, String deviceNum, String deviceName) {
         QueryWrapper<JsCheckDevice> queryWrapper = new QueryWrapper<>();
         Page<JsCheckDevice> page = new Page<>(pageNum, pageSize);
-        queryWrapper.eq(StringUtils.isNotEmpty(deviceNum), "device_num", deviceNum).or()
+        queryWrapper.like(StringUtils.isNotEmpty(deviceNum), "device_num", deviceNum).or()
                 .like(StringUtils.isNotEmpty(deviceName), "device_name", deviceName);
         return success(checkDeviceMapper.selectPage(page, queryWrapper));
     }

+ 26 - 10
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsCheckInstrumentServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ruoyi.web.v2.v1.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.AjaxResult;
@@ -10,8 +11,10 @@ import com.ruoyi.web.v2.v1.entity.JsCheckInstrument;
 import com.ruoyi.web.v2.v1.mapper.JsCheckInstrumentMapper;
 import com.ruoyi.web.v2.v1.service.IJsCheckInstrumentService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.web.v2.v1.utils.PhoneNumberValidator;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 import static com.ruoyi.common.core.domain.AjaxResult.error;
 import static com.ruoyi.common.core.domain.AjaxResult.success;
@@ -33,14 +36,17 @@ public class JsCheckInstrumentServiceImpl extends ServiceImpl<JsCheckInstrumentM
     @Override
     public AjaxResult add(JsCheckInstrument checkDevice) {
         String deviceName = checkDevice.getDeviceName();
-        Integer count = instrumentMapper.selectCount(new QueryWrapper<JsCheckInstrument>().eq("device_name", deviceName));
+        if (ObjectUtil.isNotEmpty(checkDevice.getPhone())) {
+            if (!PhoneNumberValidator.isValidPhoneNumber(checkDevice.getPhone())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return error("手机号码格式不正确!");
+            }
+        }
+        Integer count = instrumentMapper.selectCount(new QueryWrapper<JsCheckInstrument>().eq("device_name", deviceName)
+                .or().eq("device_num", checkDevice.getDeviceNum()));
         if (count != 0) {
-            return error("设备档案已存在!");
+            return error("检验仪器已存在!");
         } else {
-            UUID uuid = UUID.randomUUID();
-            String uuidStr = uuid.toString();
-            String randomNum = uuidStr.substring(0, 6);
-            checkDevice.setDeviceNum(randomNum);
             instrumentMapper.insert(checkDevice);
         }
         return success("添加成功");
@@ -49,12 +55,22 @@ public class JsCheckInstrumentServiceImpl extends ServiceImpl<JsCheckInstrumentM
     @Override
     public AjaxResult edit(JsCheckInstrument checkDevice) {
         String deviceName = checkDevice.getDeviceName();
-        Integer count = instrumentMapper.selectCount(new QueryWrapper<JsCheckInstrument>().eq("device_name", deviceName).ne("id",checkDevice.getId()));
+        if (ObjectUtil.isNotEmpty(checkDevice.getPhone())) {
+            if (!PhoneNumberValidator.isValidPhoneNumber(checkDevice.getPhone())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return error("手机号码格式不正确!");
+            }
+        }
+        Integer count = instrumentMapper.selectCount(new QueryWrapper<JsCheckInstrument>().ne("id", checkDevice.getId()).eq("device_name", deviceName));
         if (count != 0) {
-            return error("车间名称已存在!");
-        } else {
-            instrumentMapper.updateById(checkDevice);
+            return error("检验仪器名称已存在!");
         }
+        Integer count1 = instrumentMapper.selectCount(new QueryWrapper<JsCheckInstrument>().ne("id", checkDevice.getId()).eq("device_num", checkDevice.getDeviceNum()));
+        if (count1 != 0) {
+            return error("检验仪器编号已存在!");
+        }
+        instrumentMapper.updateById(checkDevice);
+
         return success("修改成功");
     }
 

+ 31 - 5
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsCheckProjectServiceImpl.java

@@ -2,8 +2,12 @@ package com.ruoyi.web.v2.v1.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.jsonUtil;
 import com.ruoyi.web.v2.v1.entity.JsCheckProject;
 import com.ruoyi.web.v2.v1.entity.JsDisinfectManage;
 import com.ruoyi.web.v2.v1.mapper.JsCheckProjectMapper;
@@ -30,24 +34,46 @@ public class JsCheckProjectServiceImpl extends ServiceImpl<JsCheckProjectMapper,
     private JsCheckProjectMapper projectMapper;
 
     @Override
-    public AjaxResult add(JsCheckProject checkProject) {
+    public AjaxResult add(JsCheckProject checkProject) throws JsonProcessingException {
         String projectName = checkProject.getProjectName();
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode jsonArray = mapper.readTree(checkProject.getResult());
+        String fieldToCheck = "name";
+        if (jsonUtil.checkForDuplicateFields(jsonArray, fieldToCheck)) {
+            return error("新增检查项目'" + checkProject.getProjectName() + "'失败,本次添加中存在重复的检查结果");
+        }
         Integer count = projectMapper.selectCount(new QueryWrapper<JsCheckProject>().eq("project_name", projectName));
         if (count != 0) {
-            return error("消毒方式已存在!");
+            return error("检验项目已存在!");
         } else {
+            //是否设置为默认吊钩
+            if (checkProject.getDefaultFlag()){
+                //将其他吊钩设置为非默认
+                projectMapper.updateHookDefault();
+            }
             projectMapper.insert(checkProject);
         }
         return success("添加成功");
     }
 
     @Override
-    public AjaxResult edit(JsCheckProject checkProject) {
+    public AjaxResult edit(JsCheckProject checkProject) throws JsonProcessingException {
         String projectName = checkProject.getProjectName();
-        Integer count = projectMapper.selectCount(new QueryWrapper<JsCheckProject>().eq("project_name", projectName).ne("id",checkProject.getId()));
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode jsonArray = mapper.readTree(checkProject.getResult());
+        String fieldToCheck = "name";
+        if (jsonUtil.checkForDuplicateFields(jsonArray, fieldToCheck)) {
+            return error("修改检查项目'" + checkProject.getProjectName() + "'失败,本次添加中存在重复的检查结果");
+        }
+        Integer count = projectMapper.selectCount(new QueryWrapper<JsCheckProject>().eq("project_name", projectName).ne("id", checkProject.getId()));
         if (count != 0) {
-            return error("消毒方式已存在!");
+            return error("检验项目已存在!");
         } else {
+            //是否设置为默认吊钩
+            if (checkProject.getDefaultFlag()){
+                //将其他吊钩设置为非默认
+                projectMapper.updateHookDefault();
+            }
             projectMapper.updateById(checkProject);
         }
         return success("修改成功");

+ 12 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDeviceMaintenanceServiceImpl.java

@@ -5,8 +5,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.web.v2.v1.entity.JsDeviceMaintenance;
+import com.ruoyi.web.v2.v1.entity.JsMaintenanceWarning;
 import com.ruoyi.web.v2.v1.entity.JsProduceCheck;
 import com.ruoyi.web.v2.v1.mapper.JsDeviceMaintenanceMapper;
+import com.ruoyi.web.v2.v1.mapper.JsMaintenanceWarningMapper;
 import com.ruoyi.web.v2.v1.service.IJsDeviceMaintenanceService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,10 +29,18 @@ public class JsDeviceMaintenanceServiceImpl extends ServiceImpl<JsDeviceMaintena
 
     @Autowired
     private JsDeviceMaintenanceMapper deviceMaintenanceMapper;
+    @Autowired
+    private JsMaintenanceWarningMapper warningMapper;
 
     @Override
     public AjaxResult add(JsDeviceMaintenance deviceMaintenance) {
         deviceMaintenanceMapper.insert(deviceMaintenance);
+        String deviceNum = deviceMaintenance.getDeviceNum();
+        QueryWrapper<JsMaintenanceWarning> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("device_num", deviceNum).orderByDesc("maintenance_time").last(" limit 1");
+        JsMaintenanceWarning warning = warningMapper.selectOne(queryWrapper);
+        warning.setIsHandle(1);
+        warningMapper.updateById(warning);
         return success();
     }
 
@@ -56,8 +66,9 @@ public class JsDeviceMaintenanceServiceImpl extends ServiceImpl<JsDeviceMaintena
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("maintenance_time", startTime, endTime);
+            queryWrapper.between("maintenance_time", startTime+" 00:00:00", endTime+" 23:59:59");
         }
+        queryWrapper.orderByDesc("maintenance_time");
         queryWrapper.like(StringUtils.isNotEmpty(deviceNum),"device_num", deviceNum)
                 .or().like(StringUtils.isNotEmpty(deviceName),"device_name", deviceName);
         return success(deviceMaintenanceMapper.selectPage(page, queryWrapper));

+ 10 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDisinfectManageServiceImpl.java

@@ -35,6 +35,11 @@ public class JsDisinfectManageServiceImpl extends ServiceImpl<JsDisinfectManageM
         if (count != 0) {
             return error("消毒方式已存在!");
         } else {
+            //是否设置为默认吊钩
+            if (jsDisinfectManage.getDefaultFlag()){
+                //将其他吊钩设置为非默认
+                disinfectManageMapper.updateHookDefault();
+            }
             disinfectManageMapper.insert(jsDisinfectManage);
         }
         return success("添加成功");
@@ -47,6 +52,11 @@ public class JsDisinfectManageServiceImpl extends ServiceImpl<JsDisinfectManageM
         if (count != 0) {
             return error("消毒方式已存在!");
         } else {
+            //是否设置为默认吊钩
+            if (jsDisinfectManage.getDefaultFlag()){
+                //将其他吊钩设置为非默认
+                disinfectManageMapper.updateHookDefault();
+            }
             disinfectManageMapper.updateById(jsDisinfectManage);
         }
         return success("修改成功");

+ 2 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDisinfectServiceImpl.java

@@ -56,8 +56,9 @@ public class JsDisinfectServiceImpl extends ServiceImpl<JsDisinfectMapper, JsDis
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("disinfect_time", startTime, endTime);
+            queryWrapper.between("disinfect_time", startTime+" 00:00:00", endTime+" 23:59:59");
         }
+        queryWrapper.orderByDesc("disinfect_time");
         queryWrapper.like(StringUtils.isNotEmpty(disinfectLocation),"disinfect_location", disinfectLocation);
         return success(disinfectMapper.selectPage(page, queryWrapper));
     }

+ 119 - 12
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDistributionServiceImpl.java

@@ -1,18 +1,35 @@
 package com.ruoyi.web.v2.v1.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.app.domain.EntranceBatch;
+import com.ruoyi.app.domain.Pigpen;
+import com.ruoyi.app.domain.ProductCategory;
+import com.ruoyi.app.domain.Purchaser;
+import com.ruoyi.app.mapper.EntranceBatchMapper;
+import com.ruoyi.app.mapper.PigpenMapper;
+import com.ruoyi.app.mapper.ProductCategoryMapper;
+import com.ruoyi.app.mapper.PurchaserMapper;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.web.v2.v1.entity.JsDeviceMaintenance;
-import com.ruoyi.web.v2.v1.entity.JsDistribution;
-import com.ruoyi.web.v2.v1.mapper.JsDisinfectMapper;
-import com.ruoyi.web.v2.v1.mapper.JsDistributionMapper;
+import com.ruoyi.common.utils.uuid.UUID;
+import com.ruoyi.web.v2.v1.entity.*;
+import com.ruoyi.web.v2.v1.entity.vo.HarmlessVo;
+import com.ruoyi.web.v2.v1.entity.vo.ProductionVo;
+import com.ruoyi.web.v2.v1.mapper.*;
 import com.ruoyi.web.v2.v1.service.IJsDistributionService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.web.v2.v1.utils.PaginationUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Base64;
+import java.util.Date;
+import java.util.List;
+
 import static com.ruoyi.common.core.domain.AjaxResult.success;
 
 /**
@@ -28,9 +45,40 @@ public class JsDistributionServiceImpl extends ServiceImpl<JsDistributionMapper,
 
     @Autowired
     private JsDistributionMapper distributionMapper;
+    @Autowired
+    private JsDivideCircleMapper circleMapper;
+    @Autowired
+    private PigpenMapper pigpenMapper;
+    @Autowired
+    private EntranceBatchMapper entranceBatchMapper;
+    @Autowired
+    private PurchaserMapper purchaserMapper;
+    @Autowired
+    private ProductCategoryMapper categoryMapper;
+    @Autowired
+    private JsProduceCodeMapper produceCodeMapper;
 
     @Override
     public AjaxResult add(JsDistribution distribution) {
+        Integer supplierId = distribution.getSupplierId();
+//        QueryWrapper<JsDivideCircle> queryWrapper = new QueryWrapper<>();
+//        queryWrapper.eq("supplier_id", supplierId);
+//        List<JsDivideCircle> divideCircles = circleMapper.selectList(queryWrapper);
+//        for (JsDivideCircle divideCircle : divideCircles) {
+//            Pigpen pigpen = pigpenMapper.selectPigpenById(divideCircle.getPigpenId().longValue());
+//            pigpen.setIsUse(0);
+//            pigpenMapper.updatePigpen(pigpen);
+//        }
+        UUID uuid = UUID.randomUUID();
+        ByteBuffer bb = ByteBuffer.wrap(new byte[16]);
+        bb.putLong(uuid.getMostSignificantBits());
+        bb.putLong(uuid.getLeastSignificantBits());
+        String shortUUID = Base64.getUrlEncoder().withoutPadding().encodeToString(bb.array());
+        JsProduceCode jsProduceCode = new JsProduceCode();
+        jsProduceCode.setCreateTime(new Date());
+        jsProduceCode.setOneCode(shortUUID);
+        distribution.setOneCode(shortUUID);
+        produceCodeMapper.insert(jsProduceCode);
         distributionMapper.insert(distribution);
         return success();
     }
@@ -45,29 +93,32 @@ public class JsDistributionServiceImpl extends ServiceImpl<JsDistributionMapper,
     public AjaxResult delete(String ids) {
         String[] split = ids.split(",");
         for (String s : split) {
+            JsDistribution jsDistribution = distributionMapper.selectById(s);
+            QueryWrapper<JsProduceCode> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("one_code", jsDistribution.getOneCode());
+            produceCodeMapper.delete(queryWrapper);
             distributionMapper.deleteById(s);
         }
         return success();
     }
 
     @Override
-    public AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, Integer supplierId, Integer purchaserId, Integer animalCertNo) {
+    public AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, String supplierName, String purchaserName, Integer animalCertNo) {
         Page<JsDistribution> page = new Page<>(pageNum, pageSize);
         QueryWrapper<JsDistribution> queryWrapper = new QueryWrapper<>();
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("distribution_time", startTime, endTime);
-        }
-        if (null != supplierId) {
-            queryWrapper.eq("supplier_id", supplierId);
-        }
-        if (null != purchaserId) {
-            queryWrapper.eq("purchaser_id", purchaserId);
+            queryWrapper.between("distribution_time", startTime + " 00:00:00", endTime + " 23:59:59");
         }
+
+        queryWrapper.like(StringUtils.isNotEmpty(supplierName), "supplier_id", supplierName);
+        queryWrapper.eq(StringUtils.isNotEmpty(purchaserName), "purchaser_name", purchaserName);
+
         if (null != animalCertNo) {
             queryWrapper.eq("animalCert_no", animalCertNo);
         }
+        queryWrapper.orderByDesc("distribution_time");
         return success(distributionMapper.selectPage(page, queryWrapper));
     }
 
@@ -75,4 +126,60 @@ public class JsDistributionServiceImpl extends ServiceImpl<JsDistributionMapper,
     public AjaxResult listAll() {
         return success(distributionMapper.selectList(null));
     }
+
+    @Override
+    public PaginationUtil.PageResult<JsProduction> productionPage(Integer pageNum, Integer pageSize, String startTime, String endTime, String animalCertNo) {
+        QueryWrapper<JsDistribution> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotEmpty(animalCertNo), "animal_cert_no", animalCertNo).groupBy("purchaser_name");
+        if ("".equals(startTime) || null == startTime) {
+
+        } else {
+            queryWrapper.between("distribution_time", startTime + " 00:00:00", endTime + " 23:59:59");
+        }
+        List<JsDistribution> jsDistributions = distributionMapper.selectList(queryWrapper);
+        List<JsProduction> productions = new ArrayList<>();
+        for (JsDistribution jsDistribution : jsDistributions) {
+            JsProduction jsProduction = new JsProduction();
+            jsProduction.setOneCode(jsDistribution.getOneCode());
+            jsProduction.setCreateTime(jsDistribution.getDistributionTime());
+            jsProduction.setSupplierName(jsDistribution.getSupplierName());
+            jsProduction.setPurchaserName(jsDistribution.getPurchaserName());
+            jsProduction.setAnimalCertNo(jsDistribution.getAnimalCertNo());
+            QueryWrapper<JsProduceCode> queryWrapper1 = new QueryWrapper<>();
+            queryWrapper1.eq("one_code", jsDistribution.getOneCode());
+            JsProduceCode jsProduceCode = produceCodeMapper.selectOne(queryWrapper1);
+            if (ObjectUtil.isNotEmpty(jsProduceCode)) {
+                jsProduction.setAnimalCert(jsProduceCode.getAnimalCert());
+                jsProduction.setMeatCert(jsProduceCode.getMeatCert());
+            }
+            Purchaser purchaser = purchaserMapper.selectPurchaserById((long) jsDistribution.getPurchaserId());
+            jsProduction.setSalePlace(purchaser.getSalePlace());
+            EntranceBatch entranceBatch = entranceBatchMapper.selectEntranceBatchById(jsDistribution.getEntranceBatchId().longValue());
+            if (ObjectUtil.isNotEmpty(entranceBatch)) {
+                jsProduction.setAmount(entranceBatch.getAmount());
+                jsProduction.setVariety(entranceBatch.getVariety());
+            }
+            List<ProductionVo> list = new ArrayList<>();
+            if ("".equals(startTime) || null == startTime) {
+                list = distributionMapper.getAllList(jsDistribution.getPurchaserName(), null, null);
+            } else {
+                list = distributionMapper.getAllList(jsDistribution.getPurchaserName(), startTime + " 00:00:00", endTime + " 23:59:59");
+            }
+            jsProduction.setProductionVos(list);
+            productions.add(jsProduction);
+        }
+        return PaginationUtil.paginate(productions, pageNum, pageSize);
+    }
+
+    @Override
+    public AjaxResult editProduce(JsProduceCode jsProduceCode) {
+        String oneCode = jsProduceCode.getOneCode();
+        QueryWrapper<JsProduceCode> queryWrapper1 = new QueryWrapper<>();
+        queryWrapper1.eq("one_code", oneCode);
+        JsProduceCode jsProduceCode1 = produceCodeMapper.selectOne(queryWrapper1);
+        jsProduceCode1.setAnimalCert(jsProduceCode.getAnimalCert());
+        jsProduceCode1.setMeatCert(jsProduceCode.getMeatCert());
+        produceCodeMapper.updateById(jsProduceCode1);
+        return success();
+    }
 }

+ 61 - 5
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDivideCircleServiceImpl.java

@@ -19,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
+import java.util.List;
 
 import static com.ruoyi.common.core.domain.AjaxResult.error;
 import static com.ruoyi.common.core.domain.AjaxResult.success;
@@ -51,11 +52,30 @@ public class JsDivideCircleServiceImpl extends ServiceImpl<JsDivideCircleMapper,
         }
 
         HarmlessTreatment harmlessTreatment = harmlessTreatmentMapper.selectByEntraceBatchId(divideCircle.getEntranceBatchId().longValue());
+        EntranceBatch entranceBatch = entranceBatchMapper.selectEntranceBatchById(divideCircle.getEntranceBatchId().longValue());
         if (ObjectUtil.isEmpty(harmlessTreatment)) {
             return error("未进行无害化处理");
         }
-        int batch = entranceBatchMapper.deleteEntranceBatchById(divideCircle.getEntranceBatchId().longValue());
-
+        int i = harmlessTreatment.getIllnessDeadAmount() + harmlessTreatment.getIllnessDiseaseAmount() + harmlessTreatment.getRoadDealAmount();
+        if (divideCircle.getAmount() > (entranceBatch.getAmount()-i)) {
+            return error("新增失败,分圈数量应小于批次号中现存活猪只数量");
+        }
+        if (divideCircle.getAmount() > pigpen.getMaxCapacity()) {
+            return error("超过猪圈的最大容量");
+        }
+        String animalCertNo = divideCircle.getAnimalCertNo();
+        QueryWrapper<JsDivideCircle> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("animal_cert_no", animalCertNo);
+        List<JsDivideCircle> jsDivideCircles = jsDivideCircleMapper.selectList(queryWrapper);
+        Integer amount = 0;
+        if (jsDivideCircles.size() != 0) {
+            for (JsDivideCircle jsDivideCircle : jsDivideCircles) {
+                amount = amount + jsDivideCircle.getAmount();
+            }
+        }
+        if (divideCircle.getAmount() > (entranceBatch.getAmount() - i) - amount) {
+            return error("该批次中所剩需分圈猪只不足");
+        }
         divideCircle.setCreateTime(new Date());
         jsDivideCircleMapper.insert(divideCircle);
         pigpen.setIsUse(1);
@@ -65,6 +85,39 @@ public class JsDivideCircleServiceImpl extends ServiceImpl<JsDivideCircleMapper,
 
     @Override
     public AjaxResult edit(JsDivideCircle divideCircle) {
+        Pigpen pigpen = pigpenMapper.selectPigpenById(divideCircle.getPigpenId().longValue());
+        if (pigpen.getIsUse() != 0 && pigpen.getId() != divideCircle.getPigpenId().longValue()) {
+            return error("修改失败,该待宰圈已被使用");
+        }
+        HarmlessTreatment harmlessTreatment = harmlessTreatmentMapper.selectByEntraceBatchId(divideCircle.getEntranceBatchId().longValue());
+        EntranceBatch entranceBatch = entranceBatchMapper.selectEntranceBatchById(divideCircle.getEntranceBatchId().longValue());
+        if (ObjectUtil.isEmpty(harmlessTreatment)) {
+            return error("未进行无害化处理");
+        }
+        int i = harmlessTreatment.getIllnessDeadAmount() + harmlessTreatment.getIllnessDiseaseAmount() + harmlessTreatment.getRoadDealAmount();
+        if (divideCircle.getAmount() > (entranceBatch.getAmount()-i)) {
+            return error("修改失败,分圈数量应小于批次号中现存活猪只数量");
+        }
+        if (divideCircle.getAmount() > pigpen.getMaxCapacity()) {
+            return error("超过猪圈的最大容量");
+        }
+        String animalCertNo = divideCircle.getAnimalCertNo();
+        QueryWrapper<JsDivideCircle> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("animal_cert_no", animalCertNo);
+        List<JsDivideCircle> jsDivideCircles = jsDivideCircleMapper.selectList(queryWrapper);
+        Integer amount = 0;
+        if (jsDivideCircles.size() != 0) {
+            for (JsDivideCircle jsDivideCircle : jsDivideCircles) {
+                amount = amount + jsDivideCircle.getAmount();
+            }
+        }
+        JsDivideCircle circle = jsDivideCircleMapper.selectById(divideCircle.getId());
+        if (divideCircle.getAmount() > (entranceBatch.getAmount() - i) + circle.getAmount() - amount) {
+            return error("该批次中所剩需分圈猪只不足");
+        }
+        divideCircle.setCreateTime(new Date());
+        pigpen.setIsUse(1);
+        pigpenMapper.updatePigpen(pigpen);
         jsDivideCircleMapper.updateById(divideCircle);
         return success();
     }
@@ -89,15 +142,18 @@ public class JsDivideCircleServiceImpl extends ServiceImpl<JsDivideCircleMapper,
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("divide_time", startTime, endTime);
+            queryWrapper.between("divide_time", startTime+" 00:00:00", endTime+" 23:59:59");
         }
+        queryWrapper.orderByDesc("divide_time");
         queryWrapper.like(StringUtils.isNotEmpty(pigpenName),"pigpen_name", pigpenName);
         return success(jsDivideCircleMapper.selectPage(page, queryWrapper));
     }
 
     @Override
-    public AjaxResult listAll() {
-        return success(jsDivideCircleMapper.selectList(null));
+    public AjaxResult listAll(String startTime) {
+        QueryWrapper<JsDivideCircle> queryWrapper = new QueryWrapper<>();
+        queryWrapper.ge("divide_time", startTime+" 00:00:00");
+        return success(jsDivideCircleMapper.selectList(queryWrapper));
     }
 
 }

+ 419 - 5
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsDrugCheckServiceImpl.java

@@ -1,18 +1,36 @@
 package com.ruoyi.web.v2.v1.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.app.DTO.AncimalDTO;
+import com.ruoyi.app.domain.EntranceBatch;
+import com.ruoyi.app.domain.HarmlessTreatment;
+import com.ruoyi.app.domain.Purchaser;
+import com.ruoyi.app.domain.Supplier;
+import com.ruoyi.app.domain.response.DrugCheckParam;
+import com.ruoyi.app.mapper.*;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.web.v2.v1.entity.JsDivideCircle;
-import com.ruoyi.web.v2.v1.entity.JsDrugCheck;
-import com.ruoyi.web.v2.v1.mapper.JsDrugCheckMapper;
+import com.ruoyi.web.v2.v1.entity.*;
+import com.ruoyi.web.v2.v1.entity.vo.*;
+import com.ruoyi.web.v2.v1.mapper.*;
 import com.ruoyi.web.v2.v1.service.IJsDrugCheckService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.web.v2.v1.utils.PaginationUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static com.ruoyi.common.core.domain.AjaxResult.error;
 import static com.ruoyi.common.core.domain.AjaxResult.success;
+import static com.ruoyi.common.utils.PageUtils.startPage;
 
 /**
  * <p>
@@ -27,15 +45,72 @@ public class JsDrugCheckServiceImpl extends ServiceImpl<JsDrugCheckMapper, JsDru
 
     @Autowired
     private JsDrugCheckMapper drugCheckMapper;
+    @Autowired
+    private JsProduceCheckMapper produceCheckMapper;
+    @Autowired
+    private EntranceBatchMapper entranceBatchMapper;
+    @Autowired
+    private JsDivideCircleMapper circleMapper;
+    @Autowired
+    private JsRestInspectionMapper restInspectionMapper;
+    @Autowired
+    private HarmlessTreatmentMapper harmlessTreatmentMapper;
+    @Autowired
+    private JsDistributionMapper distributionMapper;
+    @Autowired
+    private PurchaserMapper purchaserMapper;
+    @Autowired
+    private SupplierMapper supplierMapper;
+    @Autowired
+    private JsProduceCodeMapper produceCodeMapper;
 
     @Override
     public AjaxResult add(JsDrugCheck drugCheck) {
+        EntranceBatch entranceBatch = entranceBatchMapper.selectEntranceBatchById(drugCheck.getEntranceBatchId().longValue());
+        HarmlessTreatment harmlessTreatment = harmlessTreatmentMapper.selectByEntraceBatchId(entranceBatch.getId());//无害化病害数量
+        if (ObjectUtil.isEmpty(harmlessTreatment)) {
+            return error("请先进行无害化处理");
+        }
+        List<JsDivideCircle> circles = circleMapper.selectList(new QueryWrapper<JsDivideCircle>().eq("entrance_batch_id", entranceBatch.getId()));
+        Integer dealAmount = 0;
+        if (circles.size() != 0) {
+            List<Integer> userIds = circles.stream().map(JsDivideCircle::getId).collect(Collectors.toList());
+            QueryWrapper<JsRestInspection> queryWrapper1 = new QueryWrapper<>();
+            queryWrapper1.in("divide_circle_id", userIds);
+            queryWrapper1.select(" IFNULL(sum(deal_amount),'0') dealAmount");
+            JsRestInspection restInspection = restInspectionMapper.selectOne(queryWrapper1);//静养病死病害数量
+            dealAmount = restInspection.getDealAmount();
+        }
+        int amount = entranceBatch.getAmount() - dealAmount -
+                harmlessTreatment.getIllnessDeadAmount() - harmlessTreatment.getIllnessDiseaseAmount()
+                - harmlessTreatment.getRoadDealAmount();
+        if (amount < drugCheck.getCheckAmount()) {
+            return error("抽检头数超过批次中先存活猪只数量!");
+        }
         drugCheckMapper.insert(drugCheck);
         return success();
     }
 
     @Override
     public AjaxResult edit(JsDrugCheck drugCheck) {
+        EntranceBatch entranceBatch = entranceBatchMapper.selectEntranceBatchById(drugCheck.getEntranceBatchId().longValue());
+        HarmlessTreatment harmlessTreatment = harmlessTreatmentMapper.selectByEntraceBatchId(entranceBatch.getId());//无害化病害数量
+        List<JsDivideCircle> circles = circleMapper.selectList(new QueryWrapper<JsDivideCircle>().eq("entrance_batch_id", entranceBatch.getId()));
+        Integer dealAmount = 0;
+        if (circles.size() != 0) {
+            List<Integer> userIds = circles.stream().map(JsDivideCircle::getId).collect(Collectors.toList());
+            QueryWrapper<JsRestInspection> queryWrapper1 = new QueryWrapper<>();
+            queryWrapper1.in("divide_circle_id", userIds);
+            queryWrapper1.select(" IFNULL(sum(deal_amount),'0') dealAmount");
+            JsRestInspection restInspection = restInspectionMapper.selectOne(queryWrapper1);//静养病死病害数量
+            dealAmount = restInspection.getDealAmount();
+        }
+        int amount = entranceBatch.getAmount() - dealAmount -
+                harmlessTreatment.getIllnessDeadAmount() - harmlessTreatment.getIllnessDiseaseAmount()
+                - harmlessTreatment.getRoadDealAmount();
+        if (amount < drugCheck.getCheckAmount()) {
+            return error("抽检头数超过批次中先存活猪只数量!");
+        }
         drugCheckMapper.updateById(drugCheck);
         return success();
     }
@@ -56,9 +131,10 @@ public class JsDrugCheckServiceImpl extends ServiceImpl<JsDrugCheckMapper, JsDru
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("check_time", startTime, endTime);
+            queryWrapper.between("check_time", startTime + " 00:00:00", endTime + " 23:59:59");
         }
-        queryWrapper.like(StringUtils.isNotEmpty(animalCertNo),"animal_cert_no", animalCertNo);
+        queryWrapper.orderByDesc("check_time");
+        queryWrapper.like(StringUtils.isNotEmpty(animalCertNo), "animal_cert_no", animalCertNo);
         return success(drugCheckMapper.selectPage(page, queryWrapper));
     }
 
@@ -66,4 +142,342 @@ public class JsDrugCheckServiceImpl extends ServiceImpl<JsDrugCheckMapper, JsDru
     public AjaxResult listAll() {
         return success(drugCheckMapper.selectList(null));
     }
+
+    @Override
+    public PaginationUtil.PageResult<DrugAndProduce> drugAndProduce(Integer pageNum, Integer pageSize, String startTime, String endTime, String cargoOwner) {
+        List<EntranceBatch> entranceBatchList = new ArrayList<>();
+        if ("".equals(startTime) || null == startTime) {
+            entranceBatchList = entranceBatchMapper.getAll(null, null, null,cargoOwner);
+        } else {
+            entranceBatchList = entranceBatchMapper.getAll(startTime + " 00:00:00", endTime + " 23:59:59",  null,cargoOwner);
+        }
+        List<DrugAndProduce> drugAndProduces = new ArrayList<>();
+        if (entranceBatchList.size() != 0) {
+            for (EntranceBatch entranceBatch : entranceBatchList) {
+                //违禁药品
+                List<DrugCheckVo> jsDrugChecks = drugCheckMapper.getDrug(entranceBatch.getId());
+                //宰前所有都列出来,合格为检疫证数量减去无害化所有和静养所有
+                List<JsDivideCircle> circles = circleMapper.selectList(new QueryWrapper<JsDivideCircle>().eq("entrance_batch_id", entranceBatch.getId()));
+                Integer dealAmount = 0;
+                if (circles.size() != 0) {
+                    List<Integer> userIds = circles.stream().map(JsDivideCircle::getId).collect(Collectors.toList());
+                    QueryWrapper<JsRestInspection> queryWrapper1 = new QueryWrapper<>();
+                    queryWrapper1.in("divide_circle_id", userIds);
+                    queryWrapper1.select(" IFNULL(sum(deal_amount),'0') dealAmount");
+                    JsRestInspection restInspection = restInspectionMapper.selectOne(queryWrapper1);//静养病死病害数量
+                    dealAmount = restInspection.getDealAmount();
+                }
+
+                HarmlessTreatment harmlessTreatment = harmlessTreatmentMapper.selectByEntraceBatchId(entranceBatch.getId());//无害化病害数量
+
+                List<JsProduceCheck> produceChecks = produceCheckMapper.selectList(new QueryWrapper<JsProduceCheck>().eq("entrance_batch_id", entranceBatch.getId()));//生产检验
+
+                DrugAndProduce drugAndProduce = new DrugAndProduce();
+                drugAndProduce.setDrugs(jsDrugChecks);
+                drugAndProduce.setNum(entranceBatch.getId());
+                Supplier supplier = supplierMapper.selectSupplierById(entranceBatch.getSupplierId());
+                drugAndProduce.setCargoOwner(supplier.getSupplierName());
+                drugAndProduce.setDealAmount(dealAmount);
+                int amount = 0;
+                if (ObjectUtil.isNotEmpty(harmlessTreatment)) {
+                    drugAndProduce.setIllnessDeadAmount(harmlessTreatment.getIllnessDeadAmount());
+                    drugAndProduce.setIllnessDiseaseAmount(harmlessTreatment.getIllnessDiseaseAmount());
+                    drugAndProduce.setRoadDealAmount(harmlessTreatment.getRoadDealAmount());
+                    drugAndProduce.setSnapKillAmount(harmlessTreatment.getSnapKillAmount());
+                     amount = entranceBatch.getAmount() - dealAmount -
+                            harmlessTreatment.getIllnessDeadAmount() - harmlessTreatment.getIllnessDiseaseAmount()
+                            - harmlessTreatment.getRoadDealAmount() - harmlessTreatment.getSnapKillAmount();//宰前合格头数
+                    drugAndProduce.setQualifiedAmountBefore(amount);
+                    drugAndProduce.setTuzaiAmount(amount);
+                } else {
+                    drugAndProduce.setIllnessDeadAmount(0);
+                    drugAndProduce.setIllnessDiseaseAmount(0);
+                    drugAndProduce.setRoadDealAmount(0);
+                    drugAndProduce.setSnapKillAmount(0);
+                    drugAndProduce.setQualifiedAmountBefore(0);
+                    drugAndProduce.setTuzaiAmount(0);
+                }
+
+
+                Double weight = 0.00;
+                Integer number = 0;
+                if (produceChecks.size() != 0) {
+                    for (JsProduceCheck produceCheck : produceChecks) {
+                        if (produceCheck.getTypes() == 0) {
+                            weight = weight + Double.valueOf(produceCheck.getUnqualifiedNum());
+                        }
+                        if ("白条".equals(produceCheck.getProduceName())) {
+                            number = number + Integer.valueOf(produceCheck.getUnqualifiedNum());
+                        }
+                    }
+                }
+
+                drugAndProduce.setWeight(weight.toString());
+                drugAndProduce.setQualifiedAmountAfter((amount*2-number)/2.0);
+                drugAndProduce.setCreateTime(entranceBatch.getEntranceTime());
+                drugAndProduces.add(drugAndProduce);
+            }
+        }
+        return PaginationUtil.paginate(drugAndProduces, pageNum, pageSize);
+    }
+
+    @Override
+    public PaginationUtil.PageResult<HarmlessVo> harmlessTreatment(Integer pageNum, Integer pageSize, String startTime, String endTime, String cargoOwner) {
+        List<EntranceBatch> entranceBatchList = new ArrayList<>();
+        if ("".equals(startTime) || null == startTime) {
+            entranceBatchList = entranceBatchMapper.getAll(null, null, null,cargoOwner);
+        } else {
+            entranceBatchList = entranceBatchMapper.getAll(startTime + " 00:00:00", endTime + " 23:59:59", null ,cargoOwner);
+        }
+        List<HarmlessVo> harmlessVos = new ArrayList<>();
+        Integer id = 1;
+        if (entranceBatchList.size() != 0) {
+            for (EntranceBatch entranceBatch : entranceBatchList) {
+                HarmlessVo harmlessVo = new HarmlessVo();
+                harmlessVo.setId(id);
+                Supplier supplier = supplierMapper.selectSupplierById(entranceBatch.getSupplierId());
+                harmlessVo.setCargoOwner(supplier.getSupplierName());
+                harmlessVo.setCreateTime(entranceBatch.getEntranceTime());
+                HarmlessTreatment harmlessTreatment = harmlessTreatmentMapper.selectByEntraceBatchId(entranceBatch.getId());
+                if (ObjectUtil.isNotEmpty(harmlessTreatment)) {
+                    harmlessVo.setDealReason(harmlessTreatment.getDealReason());
+                    harmlessVo.setIllnessDeadAmount(harmlessTreatment.getIllnessDeadAmount());
+                    harmlessVo.setIllnessDiseaseAmount(harmlessTreatment.getIllnessDiseaseAmount());
+                    harmlessVo.setRoadDealAmount(harmlessTreatment.getRoadDealAmount());
+                    harmlessVo.setSnapKillAmount(harmlessTreatment.getSnapKillAmount());
+                } else {
+                    harmlessVo.setDealReason("");
+                    harmlessVo.setIllnessDeadAmount(0);
+                    harmlessVo.setIllnessDiseaseAmount(0);
+                    harmlessVo.setRoadDealAmount(0);
+                    harmlessVo.setSnapKillAmount(0);
+                }
+                List<ProduceCheckVo> checkVos = new ArrayList<>();
+                checkVos = produceCheckMapper.getAll(entranceBatch.getId().intValue());//生产检验
+                harmlessVo.setProduceCheckVos(checkVos);
+                harmlessVos.add(harmlessVo);
+                id++;
+            }
+        }
+        return PaginationUtil.paginate(harmlessVos, pageNum, pageSize);
+    }
+
+    @Override
+    public PaginationUtil.PageResult<AdmissionVo> Admission(Integer pageNum, Integer pageSize, String startTime
+            , String endTime, String animalCertNo, String cargoOwner) {
+        List<EntranceBatch> entranceBatchList = new ArrayList<>();
+        if ("".equals(startTime) || null == startTime) {
+            entranceBatchList = entranceBatchMapper.getAll(null, null, animalCertNo, cargoOwner);
+        } else {
+            entranceBatchList = entranceBatchMapper.getAll(startTime + " 00:00:00", endTime + " 23:59:59", animalCertNo, cargoOwner);
+        }
+        List<AdmissionVo> admissionVos = new ArrayList<>();
+        if (entranceBatchList.size() != 0) {
+            for (EntranceBatch entranceBatch : entranceBatchList) {
+                AdmissionVo admissionVo = new AdmissionVo();
+                admissionVo.setCreateTime(entranceBatch.getEntranceTime());
+                admissionVo.setNum(entranceBatch.getId());
+                Supplier supplier = supplierMapper.selectSupplierById(entranceBatch.getSupplierId());
+                admissionVo.setCargoOwner(supplier.getSupplierName());
+                if ("1".equals(entranceBatch.getOriginPlace())) {
+                    admissionVo.setOriginPlace("本市");
+                } else if ("2".equals(entranceBatch.getOriginPlace())) {
+                    admissionVo.setOriginPlace("市外");
+                } else if ("3".equals(entranceBatch.getOriginPlace())) {
+                    admissionVo.setOriginPlace("省外");
+                } else {
+                    admissionVo.setOriginPlace("本市");
+                }
+
+                admissionVo.setAnimalCertNo(entranceBatch.getAnimalCertNo());
+
+                HarmlessTreatment harmlessTreatment = harmlessTreatmentMapper.selectByEntraceBatchId(entranceBatch.getId());
+                if (ObjectUtil.isNotEmpty(harmlessTreatment)) {
+                    admissionVo.setIllnessDeadAmount(harmlessTreatment.getIllnessDeadAmount());
+                    admissionVo.setIllnessDiseaseAmount(harmlessTreatment.getIllnessDiseaseAmount());
+                    admissionVo.setRoadDealAmount(harmlessTreatment.getRoadDealAmount());
+                    admissionVo.setSnapKillAmount(harmlessTreatment.getSnapKillAmount());
+                    int amount = entranceBatch.getAmount() - harmlessTreatment.getIllnessDeadAmount() -
+                            harmlessTreatment.getIllnessDiseaseAmount() - harmlessTreatment.getRoadDealAmount() - harmlessTreatment.getSnapKillAmount();
+                    admissionVo.setQualifiedAmount(amount);
+                    admissionVo.setAmount(entranceBatch.getAmount() - harmlessTreatment.getRoadDealAmount());
+                } else {
+                    admissionVo.setIllnessDeadAmount(0);
+                    admissionVo.setIllnessDiseaseAmount(0);
+                    admissionVo.setRoadDealAmount(0);
+                    admissionVo.setSnapKillAmount(0);
+                    admissionVo.setQualifiedAmount(0);
+                    admissionVo.setAmount(0);
+                }
+                admissionVos.add(admissionVo);
+            }
+        }
+
+        return PaginationUtil.paginate(admissionVos, pageNum, pageSize);
+    }
+
+    @Override
+    public PaginationUtil.PageResult<OutPlaceVo> outPlace(Integer pageNum, Integer pageSize, String startTime, String endTime, String cargoOwner) {
+        List<OutPlaceVo> outPlaceVos = new ArrayList<>();
+        QueryWrapper<JsDistribution> queryWrapper = new QueryWrapper<>();
+        queryWrapper.like(StringUtils.isNotEmpty(cargoOwner), "supplier_name", cargoOwner);
+        queryWrapper.orderByDesc("distribution_time");
+        if ("".equals(startTime) || null == startTime) {
+
+        } else {
+            queryWrapper.between("distribution_time", startTime + " 00:00:00", endTime + " 23:59:59");
+        }
+        List<JsDistribution> jsDistributions = distributionMapper.selectList(queryWrapper);
+        if (jsDistributions.size() != 0) {
+            for (JsDistribution jsDistribution : jsDistributions) {
+                OutPlaceVo placeVo = new OutPlaceVo();
+                placeVo.setNum(jsDistribution.getId());
+                placeVo.setUnit(jsDistribution.getUnit());
+                placeVo.setCreateTime(jsDistribution.getDistributionTime());
+                Supplier supplier = supplierMapper.selectSupplierById(jsDistribution.getSupplierId().longValue());
+                placeVo.setCargoOwner(supplier.getSupplierName());
+                AncimalDTO oneAnimal = purchaserMapper.getOneAnimal(jsDistribution.getPurchaserId().toString());
+                if (ObjectUtil.isNotEmpty(oneAnimal)) {
+                    placeVo.setAnimalCert(oneAnimal.getAnimalCert());
+                    placeVo.setMeatCert(oneAnimal.getMeatCert());
+                }
+                placeVo.setProduceName(jsDistribution.getProduceName());
+                Purchaser purchaser = purchaserMapper.selectPurchaserById((long) jsDistribution.getPurchaserId());
+                if (ObjectUtil.isNotEmpty(purchaser)) {
+                        if ("1".equals(purchaser.getSalePlace())) {
+                            placeVo.setAmount(jsDistribution.getAmount().toString());
+                        } else if ("2".equals(purchaser.getSalePlace())) {
+                            placeVo.setAmount2(jsDistribution.getAmount().toString());
+                        } else if ("3".equals(purchaser.getSalePlace())) {
+                            placeVo.setAmount3(jsDistribution.getAmount().toString());
+                        }
+//                    }
+                    if ("1".equals(purchaser.getSalePlace())) {
+                        placeVo.setWeight(jsDistribution.getWeight());
+                    } else if ("2".equals(purchaser.getSalePlace())) {
+                        placeVo.setWeight2(jsDistribution.getWeight());
+                    } else if ("3".equals(purchaser.getSalePlace())) {
+                        placeVo.setWeight3(jsDistribution.getWeight());
+                    }
+                }
+                outPlaceVos.add(placeVo);
+            }
+        }
+        return PaginationUtil.paginate(outPlaceVos, pageNum, pageSize);
+    }
+
+    @Override
+    public PaginationUtil.PageResult<SummaryVo> SummaryVo(Integer pageNum, Integer pageSize, String startTime, String endTime) {
+        List<EntranceBatch> entranceBatchList = new ArrayList<>();
+
+        if ("".equals(startTime) || null == startTime) {
+            entranceBatchList = entranceBatchMapper.getAll(null, null, null, null);
+        } else {
+            entranceBatchList = entranceBatchMapper.getAll(startTime+" 00:00:00", endTime+" 23:59:59", null, null);
+        }
+
+
+
+        List<SummaryVo> summaryVos = new ArrayList<>();
+        List<SummaryVo> summaryVoList = new ArrayList<>();
+        if (entranceBatchList.size() != 0) {
+            for (EntranceBatch entranceBatch : entranceBatchList) {
+                SummaryVo summaryVo = new SummaryVo();
+                summaryVo.setCreateTime(entranceBatch.getEntranceTime());
+                summaryVo.setAmount(entranceBatch.getAmount());
+                QueryWrapper<JsDrugCheck> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("entrance_batch_id", entranceBatch.getId());
+                List<JsDrugCheck> jsDrugChecks = drugCheckMapper.selectList(queryWrapper);
+                Integer checkAmount = 0;
+                Integer resultAmount = 0;
+                if (jsDrugChecks.size() != 0) {
+                    for (JsDrugCheck jsDrugCheck : jsDrugChecks) {
+                        //抽检头数
+                        checkAmount = checkAmount + jsDrugCheck.getCheckAmount();
+                        //合格头数
+                        if ("阳性".equals(jsDrugCheck.getResult())) {
+                            resultAmount = resultAmount + jsDrugCheck.getCheckAmount();
+                        }
+
+                    }
+
+                }
+                summaryVo.setCheckAmount(checkAmount);
+                summaryVo.setQualifiedAmount(resultAmount);
+                summaryVo.setAmount(entranceBatch.getAmount());//到场活猪头数
+
+
+                QueryWrapper<JsDistribution> queryWrapper1 = new QueryWrapper<>();
+                queryWrapper1.eq("entrance_batch_id", entranceBatch.getId());
+                queryWrapper1.select(" amount amount,after_weight afterWeight,produce_name produceName");
+                List<JsDistribution> jsDistributions = distributionMapper.selectList(queryWrapper1);
+                Integer amount = 0;
+                Double values = 0.00;
+                if (jsDistributions.size() != 0) {
+                    for (JsDistribution jsDistribution : jsDistributions) {
+                        if ("白条".equals(jsDistribution.getProduceName())) {
+                            amount = amount + jsDistribution.getAmount();
+                        } else {
+                            values = values + Double.parseDouble(jsDistribution.getAfterWeight());
+                        }
+                    }
+                }
+                summaryVo.setDongAmount(amount / 2.0);//胴体头数
+                DecimalFormat def = new DecimalFormat("0.00");
+                summaryVo.setWeight(def.format(values));//产品重量
+
+                HarmlessTreatment harmlessTreatment = harmlessTreatmentMapper.selectByEntraceBatchId(entranceBatch.getId());
+
+                if (ObjectUtil.isNotEmpty(harmlessTreatment)) {
+                    summaryVo.setIllnessDeadAmount(harmlessTreatment.getIllnessDeadAmount());
+                    summaryVo.setIllnessDiseaseAmount(harmlessTreatment.getIllnessDiseaseAmount());
+                    summaryVo.setRoadDealAmount(harmlessTreatment.getRoadDealAmount());
+                    summaryVo.setSnapKillAmount(harmlessTreatment.getSnapKillAmount());
+                    int amount1 = entranceBatch.getAmount() - harmlessTreatment.getIllnessDeadAmount() -
+                            harmlessTreatment.getIllnessDiseaseAmount() - harmlessTreatment.getRoadDealAmount() - harmlessTreatment.getSnapKillAmount();
+                    summaryVo.setTuzaiAmount(amount1);//待宰头数
+                } else {
+                    summaryVo.setIllnessDeadAmount(0);
+                    summaryVo.setIllnessDiseaseAmount(0);
+                    summaryVo.setRoadDealAmount(0);
+                    summaryVo.setSnapKillAmount(0);
+                    summaryVo.setTuzaiAmount(entranceBatch.getAmount());//待宰头数
+                }
+                summaryVos.add(summaryVo);
+            }
+            summaryVoList = mergeObjectsByTime(summaryVos);
+        }
+
+        return PaginationUtil.paginate(summaryVoList, pageNum, pageSize);
+    }
+
+
+    public List<SummaryVo> mergeObjectsByTime(List<SummaryVo> list) {
+        Map<Date, SummaryVo> map = new HashMap<>();
+
+        for (SummaryVo summaryVo : list) {
+            map.compute(summaryVo.getCreateTime(), (k, v) -> {
+                if (v == null) {
+                    return new SummaryVo(summaryVo.getCreateTime(), summaryVo.getAmount(), summaryVo.getCheckAmount(), summaryVo.getQualifiedAmount(),
+                            summaryVo.getTuzaiAmount(), summaryVo.getDongAmount(), summaryVo.getWeight(), summaryVo.getRoadDealAmount(),
+                            summaryVo.getIllnessDeadAmount(), summaryVo.getIllnessDiseaseAmount(),
+                            summaryVo.getSnapKillAmount());
+                }
+                v.setAmount(v.getAmount() + summaryVo.getAmount());
+                v.setCheckAmount(v.getCheckAmount() + summaryVo.getCheckAmount());
+                v.setQualifiedAmount(v.getQualifiedAmount() + summaryVo.getQualifiedAmount());
+                v.setTuzaiAmount(v.getTuzaiAmount() + summaryVo.getTuzaiAmount());
+                v.setDongAmount(v.getDongAmount() + summaryVo.getDongAmount());
+                v.setWeight(v.getWeight() + summaryVo.getWeight());
+                v.setRoadDealAmount(v.getRoadDealAmount() + summaryVo.getRoadDealAmount());
+                v.setIllnessDeadAmount(v.getIllnessDeadAmount() + summaryVo.getIllnessDeadAmount());
+                v.setIllnessDiseaseAmount(v.getIllnessDiseaseAmount() + summaryVo.getIllnessDiseaseAmount());
+                v.setSnapKillAmount(v.getSnapKillAmount() + summaryVo.getSnapKillAmount());
+                return v;
+            });
+        }
+
+        return new ArrayList<>(map.values());
+    }
+
 }

+ 50 - 24
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsInStockServiceImpl.java

@@ -7,14 +7,17 @@ import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.web.v2.v1.entity.JsInStock;
 import com.ruoyi.web.v2.v1.entity.JsInstrumentMaintenance;
+import com.ruoyi.web.v2.v1.entity.JsMaterial;
 import com.ruoyi.web.v2.v1.entity.JsStock;
 import com.ruoyi.web.v2.v1.mapper.JsInStockMapper;
+import com.ruoyi.web.v2.v1.mapper.JsMaterialMapper;
 import com.ruoyi.web.v2.v1.mapper.JsStockMapper;
 import com.ruoyi.web.v2.v1.service.IJsInStockService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
 import java.util.Date;
 
 import static com.ruoyi.common.core.domain.AjaxResult.success;
@@ -34,33 +37,49 @@ public class JsInStockServiceImpl extends ServiceImpl<JsInStockMapper, JsInStock
     private JsInStockMapper inStockMapper;
     @Autowired
     private JsStockMapper stockMapper;
+    @Autowired
+    private JsMaterialMapper materialMapper;
 
     @Override
     public AjaxResult add(JsInStock inStock) {
-        String materialBatch = inStock.getMaterialBatch();
-        QueryWrapper<JsStock> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq("material_batch", materialBatch);
-        JsStock jsStock = stockMapper.selectOne(queryWrapper);
+        Integer materialType = inStock.getMaterialType();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        String format = sdf.format(new Date());
+        JsStock jsStock1 = new JsStock();
+        JsMaterial jsMaterial = materialMapper.selectOne(new QueryWrapper<JsMaterial>().eq("material_type",materialType).eq("material_name",inStock.getMaterialName()));
+        JsStock jsStock = stockMapper.selectOne(new QueryWrapper<JsStock>().like("material_batch", jsMaterial.getMaterialNum()+format).orderByDesc("id").last(" limit 1"));
         if (ObjectUtil.isEmpty(jsStock)) {
-            JsStock jsStock1 = new JsStock();
-            jsStock1.setMaterialBatch(materialBatch);
-            jsStock1.setLocation(inStock.getLocation());
-            jsStock1.setMaterialName(inStock.getMaterialName());
-            jsStock1.setMaterialType(inStock.getMaterialType());
-            jsStock1.setModel(inStock.getModel());
-            jsStock1.setSaveCondition(inStock.getSaveCondition());
-            jsStock1.setSaveUser(inStock.getSaveUser());
-            jsStock1.setStockAmount(inStock.getStockAmount());
-            jsStock1.setUnit(inStock.getUnit());
-            jsStock1.setUpdateTime(new Date());
-            stockMapper.insert(jsStock1);
+            jsStock1.setMaterialBatch(jsMaterial.getMaterialNum()+format+String.format("%02d", 1));
+            inStock.setMaterialBatch(jsMaterial.getMaterialNum()+format+String.format("%02d", 1));
         } else {
-            String stockAmount = jsStock.getStockAmount();
-            double v = Double.valueOf(stockAmount) + Double.valueOf(inStock.getStockAmount());
-            jsStock.setStockAmount(String.valueOf(v));
-            jsStock.setUpdateTime(new Date());
-            stockMapper.updateById(jsStock);
+            String materialBatch = jsStock.getMaterialBatch();
+            Integer integer = Integer.valueOf( materialBatch.substring(materialBatch.length()-2,materialBatch.length()));
+            String formattedNumber = String.format("%02d", integer+1);
+            jsStock1.setMaterialBatch(materialBatch.substring(0,materialBatch.length()-2)+formattedNumber);
+            inStock.setMaterialBatch(materialBatch.substring(0,materialBatch.length()-2)+formattedNumber);
         }
+
+//        if (ObjectUtil.isEmpty(jsMaterial)) {
+//            String formattedNumber = String.format("%04d", 1);
+//            jsMaterial.setMaterialNum(formattedNumber);
+//        } else {
+//            String workshopNum = jsMaterial.getMaterialNum();
+//            Integer integer = Integer.valueOf(workshopNum);
+//            String formattedNumber = String.format("%04d", integer+1);
+//            jsMaterial.setMaterialNum(formattedNumber);
+//        }
+
+        jsStock1.setLocation(inStock.getLocation());
+        jsStock1.setMaterialName(inStock.getMaterialName());
+        jsStock1.setMaterialType(inStock.getMaterialType());
+        jsStock1.setModel(inStock.getModel());
+        jsStock1.setSaveCondition(inStock.getSaveCondition());
+        jsStock1.setSaveUser(inStock.getSaveUser());
+        jsStock1.setStockAmount(inStock.getStockAmount());
+        jsStock1.setUnit(inStock.getUnit());
+        jsStock1.setUpdateTime(new Date());
+        stockMapper.insert(jsStock1);
+
         inStockMapper.insert(inStock);
         return success();
     }
@@ -95,18 +114,25 @@ public class JsInStockServiceImpl extends ServiceImpl<JsInStockMapper, JsInStock
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("in_time", startTime, endTime);
+            queryWrapper.between("in_time", startTime + " 00:00:00", endTime + " 23:59:59");
         }
         queryWrapper.like(StringUtils.isNotEmpty(materialBatch), "material_batch", materialBatch)
                 .or().like(StringUtils.isNotEmpty(materialName), "material_name", materialName);
         if (null != materialType) {
             queryWrapper.eq("material_type", materialType);
         }
+        queryWrapper.orderByDesc("id");
         return success(inStockMapper.selectPage(page, queryWrapper));
     }
 
     @Override
-    public AjaxResult listAll() {
-        return success(inStockMapper.selectList(null));
+    public AjaxResult listAll(String materialBatch) {
+        return success(inStockMapper.selectOne(new QueryWrapper<JsInStock>().eq("material_batch", materialBatch)));
+    }
+
+    public static void main(String[] args) {
+        String s = "00062025061803";
+        System.out.println(s.substring(s.length() - 2, s.length()));
+        System.out.println(s.substring(0, s.length() - 2));
     }
 }

+ 13 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsInstrumentMaintenanceServiceImpl.java

@@ -6,7 +6,9 @@ import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.web.v2.v1.entity.JsDeviceMaintenance;
 import com.ruoyi.web.v2.v1.entity.JsInstrumentMaintenance;
+import com.ruoyi.web.v2.v1.entity.JsMaintenanceWarning;
 import com.ruoyi.web.v2.v1.mapper.JsInstrumentMaintenanceMapper;
+import com.ruoyi.web.v2.v1.mapper.JsMaintenanceWarningMapper;
 import com.ruoyi.web.v2.v1.service.IJsInstrumentMaintenanceService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -27,10 +29,18 @@ public class JsInstrumentMaintenanceServiceImpl extends ServiceImpl<JsInstrument
 
     @Autowired
     private JsInstrumentMaintenanceMapper maintenanceMapper;
+    @Autowired
+    private JsMaintenanceWarningMapper warningMapper;
 
     @Override
     public AjaxResult add(JsInstrumentMaintenance deviceMaintenance) {
         maintenanceMapper.insert(deviceMaintenance);
+        String deviceNum = deviceMaintenance.getDeviceNum();
+        QueryWrapper<JsMaintenanceWarning> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("device_num", deviceNum).orderByDesc("maintenance_time").last(" limit 1");
+        JsMaintenanceWarning warning = warningMapper.selectOne(queryWrapper);
+        warning.setIsHandle(1);
+        warningMapper.updateById(warning);
         return success();
     }
 
@@ -56,10 +66,11 @@ public class JsInstrumentMaintenanceServiceImpl extends ServiceImpl<JsInstrument
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("maintenance_time", startTime, endTime);
+            queryWrapper.between("maintenance_time", startTime+" 00:00:00", endTime+" 23:59:59");
         }
+        queryWrapper.orderByDesc("maintenance_time");
         queryWrapper.like(StringUtils.isNotEmpty(deviceNum),"device_num", deviceNum)
-                .or().like(StringUtils.isNotEmpty(deviceNum),"device_name", deviceName);
+                .or().like(StringUtils.isNotEmpty(deviceName),"device_name", deviceName);
         return success(maintenanceMapper.selectPage(page, queryWrapper));
     }
 

+ 15 - 3
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsMaterialServiceImpl.java

@@ -1,11 +1,13 @@
 package com.ruoyi.web.v2.v1.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.web.v2.v1.entity.JsDisinfectManage;
 import com.ruoyi.web.v2.v1.entity.JsMaterial;
+import com.ruoyi.web.v2.v1.entity.JsWorkshop;
 import com.ruoyi.web.v2.v1.mapper.JsMaterialMapper;
 import com.ruoyi.web.v2.v1.service.IJsMaterialService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -31,11 +33,20 @@ public class JsMaterialServiceImpl extends ServiceImpl<JsMaterialMapper, JsMater
 
     @Override
     public AjaxResult add(JsMaterial material) {
-        String materialName = material.getMaterialName();
-        Integer count = materialMapper.selectCount(new QueryWrapper<JsMaterial>().eq("material_name", materialName).eq("material_type",material.getMaterialType()));
+        Integer count = materialMapper.selectCount(new QueryWrapper<JsMaterial>().eq("material_name",material.getMaterialName()));
         if (count != 0) {
-            return error("物料已存在!");
+            return error("物料类型已存在!");
         } else {
+            JsMaterial jsMaterial = materialMapper.selectOne(new QueryWrapper<JsMaterial>().last(" limit 1").orderByDesc("id"));
+            if (ObjectUtil.isEmpty(jsMaterial)) {
+                String formattedNumber = String.format("%04d", 1);
+                material.setMaterialNum(formattedNumber);
+            } else {
+                String workshopNum = jsMaterial.getMaterialNum();
+                Integer integer = Integer.valueOf(workshopNum);
+                String formattedNumber = String.format("%04d", integer+1);
+                material.setMaterialNum(formattedNumber);
+            }
             materialMapper.insert(material);
         }
         return success("添加成功");
@@ -80,4 +91,5 @@ public class JsMaterialServiceImpl extends ServiceImpl<JsMaterialMapper, JsMater
     public AjaxResult listAll() {
         return success(materialMapper.selectList(null));
     }
+
 }

+ 18 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsOtherProduceServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ruoyi.web.v2.v1.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.AjaxResult;
@@ -9,9 +10,12 @@ import com.ruoyi.web.v2.v1.entity.JsOtherProduce;
 import com.ruoyi.web.v2.v1.mapper.JsOtherProduceMapper;
 import com.ruoyi.web.v2.v1.service.IJsOtherProduceService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.web.v2.v1.utils.PhoneNumberValidator;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
+import static com.ruoyi.common.core.domain.AjaxResult.error;
 import static com.ruoyi.common.core.domain.AjaxResult.success;
 
 /**
@@ -30,12 +34,24 @@ public class JsOtherProduceServiceImpl extends ServiceImpl<JsOtherProduceMapper,
 
     @Override
     public AjaxResult add(JsOtherProduce otherProduce) {
+        if (ObjectUtil.isNotEmpty(otherProduce.getPhone())) {
+            if (!PhoneNumberValidator.isValidPhoneNumber(otherProduce.getPhone())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return error("手机号码格式不正确!");
+            }
+        }
         otherProduceMapper.insert(otherProduce);
         return success();
     }
 
     @Override
     public AjaxResult edit(JsOtherProduce otherProduce) {
+        if (ObjectUtil.isNotEmpty(otherProduce.getPhone())) {
+            if (!PhoneNumberValidator.isValidPhoneNumber(otherProduce.getPhone())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return error("手机号码格式不正确!");
+            }
+        }
         otherProduceMapper.updateById(otherProduce);
         return success();
     }
@@ -56,8 +72,9 @@ public class JsOtherProduceServiceImpl extends ServiceImpl<JsOtherProduceMapper,
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("exit_time", startTime, endTime);
+            queryWrapper.between("exit_time",startTime+" 00:00:00", endTime+" 23:59:59");
         }
+        queryWrapper.orderByDesc("exit_time");
         queryWrapper.like(StringUtils.isNotEmpty(produceName), "produce_name", produceName);
         return success(otherProduceMapper.selectPage(page, queryWrapper));
     }

+ 4 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsOutStockServiceImpl.java

@@ -50,7 +50,8 @@ public class JsOutStockServiceImpl extends ServiceImpl<JsOutStockMapper, JsOutSt
         if (Double.valueOf(inStock.getStockAmount()) > Double.valueOf(stockAmount)) {
             return error("当前批次可领用数量小于领用数量");
         }
-        jsStock.setStockAmount(String.valueOf(Double.valueOf(stockAmount) - Double.valueOf(inStock.getStockAmount())));
+        double v = Double.valueOf(stockAmount) - Double.valueOf(inStock.getStockAmount());
+        jsStock.setStockAmount(String.valueOf(v));
         jsStock.setUpdateTime(new Date());
         stockMapper.updateById(jsStock);
         jsOutStockMapper.insert(inStock);
@@ -90,13 +91,14 @@ public class JsOutStockServiceImpl extends ServiceImpl<JsOutStockMapper, JsOutSt
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("out_time", startTime, endTime);
+            queryWrapper.between("out_time",startTime+" 00:00:00", endTime+" 23:59:59");
         }
         queryWrapper.like(StringUtils.isNotEmpty(materialBatch), "material_batch", materialBatch)
                 .or().like(StringUtils.isNotEmpty(materialName), "material_name", materialName);
         if (null != materialType) {
             queryWrapper.eq("material_type", materialType);
         }
+        queryWrapper.orderByDesc("out_time");
         return success(jsOutStockMapper.selectPage(page, queryWrapper));
     }
 

+ 52 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsPatrolServiceImpl.java

@@ -1,11 +1,19 @@
 package com.ruoyi.web.v2.v1.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.web.v2.v1.entity.JsPatrol;
+import com.ruoyi.web.v2.v1.entity.JsStore;
 import com.ruoyi.web.v2.v1.mapper.JsPatrolMapper;
 import com.ruoyi.web.v2.v1.service.IJsPatrolService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+
 /**
  * <p>
  * v2.0质量巡查 服务实现类
@@ -17,4 +25,48 @@ import org.springframework.stereotype.Service;
 @Service
 public class JsPatrolServiceImpl extends ServiceImpl<JsPatrolMapper, JsPatrol> implements IJsPatrolService {
 
+    @Autowired
+    private JsPatrolMapper jsPatrolMapper;
+
+    @Override
+    public AjaxResult add(JsPatrol jsPatrol) {
+        jsPatrolMapper.insert(jsPatrol);
+        return success();
+    }
+
+    @Override
+    public AjaxResult edit(JsPatrol jsPatrol) {
+        jsPatrolMapper.updateById(jsPatrol);
+        return success();
+    }
+
+    @Override
+    public AjaxResult delete(String ids) {
+        String[] split = ids.split(",");
+        for (String s : split) {
+            jsPatrolMapper.deleteById(s);
+        }
+        return success();
+    }
+
+    @Override
+    public AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, String patrolLocation) {
+        Page<JsPatrol> page = new Page<>(pageNum, pageSize);
+        QueryWrapper<JsPatrol> queryWrapper = new QueryWrapper<>();
+        if ("".equals(startTime) || null == startTime) {
+
+        } else {
+            queryWrapper.between("patrol_time", startTime, endTime);
+        }
+        queryWrapper.orderByDesc("patrol_time");
+        queryWrapper.like(StringUtils.isNotEmpty(patrolLocation), "patrol_location", patrolLocation);
+
+
+        return success(jsPatrolMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public AjaxResult listAll() {
+        return success(jsPatrolMapper.selectList(null));
+    }
 }

+ 2 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsProduceCheckServiceImpl.java

@@ -56,8 +56,9 @@ public class JsProduceCheckServiceImpl extends ServiceImpl<JsProduceCheckMapper,
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("check_time", startTime, endTime);
+            queryWrapper.between("check_time", startTime+" 00:00:00", endTime+" 23:59:59");
         }
+        queryWrapper.orderByDesc("check_time");
         queryWrapper.like(StringUtils.isNotEmpty(animalCertNo),"animal_cert_no", animalCertNo);
         return success(produceCheckMapper.selectPage(page, queryWrapper));
     }

+ 2 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsProduceRecallServiceImpl.java

@@ -56,8 +56,9 @@ public class JsProduceRecallServiceImpl extends ServiceImpl<JsProduceRecallMappe
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("recall_time", startTime, endTime);
+            queryWrapper.between("recall_time",startTime+" 00:00:00", endTime+" 23:59:59");
         }
+        queryWrapper.orderByDesc("recall_time");
         queryWrapper.like(StringUtils.isNotEmpty(produceName),"produce_name", produceName);
         return success(produceRecallMapper.selectPage(page, queryWrapper));
     }

+ 17 - 4
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsRestInspectionServiceImpl.java

@@ -2,6 +2,7 @@ package com.ruoyi.web.v2.v1.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.app.mapper.PigpenMapper;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.web.v2.v1.entity.JsDivideCircle;
@@ -37,17 +38,20 @@ public class JsRestInspectionServiceImpl extends ServiceImpl<JsRestInspectionMap
     private UploadImage uploadImage;
     @Autowired
     private JsDivideCircleMapper divideCircleMapper;
+    @Autowired
+    private PigpenMapper pigpenMapper;
 
     @Override
     public AjaxResult add(JsRestInspection jsRestInspection) {
+        restInspectionMapper.insert(jsRestInspection);
+        JsRestInspection restInspection = restInspectionMapper.selectOne(new QueryWrapper<JsRestInspection>().orderByDesc("id").last(" limit 1"));
         JsDivideCircle jsDivideCircle = divideCircleMapper.selectById(jsRestInspection.getDivideCircleId());
         if ("".equals(jsDivideCircle.getRestInspectionId()) || null == jsDivideCircle.getRestInspectionId()) {
-            jsDivideCircle.setRestInspectionId(jsRestInspection.getDivideCircleId().toString());
+            jsDivideCircle.setRestInspectionId(restInspection.getId().toString());
         } else {
-            jsDivideCircle.setRestInspectionId(jsDivideCircle.getRestInspectionId() + "," + jsRestInspection.getDivideCircleId());
+            jsDivideCircle.setRestInspectionId(jsDivideCircle.getRestInspectionId() + "," + restInspection.getId());
         }
         divideCircleMapper.updateById(jsDivideCircle);
-        restInspectionMapper.insert(jsRestInspection);
         return success();
 
     }
@@ -126,8 +130,9 @@ public class JsRestInspectionServiceImpl extends ServiceImpl<JsRestInspectionMap
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("rest_inspection_time", startTime, endTime);
+            queryWrapper.between("rest_inspection_time", startTime+" 00:00:00", endTime+" 23:59:59");
         }
+        queryWrapper.orderByDesc("rest_inspection_time");
         queryWrapper.like(StringUtils.isNotEmpty(pigpenName),"pigpen_name", pigpenName);
         return success(restInspectionMapper.selectPage(page, queryWrapper));
     }
@@ -137,4 +142,12 @@ public class JsRestInspectionServiceImpl extends ServiceImpl<JsRestInspectionMap
         return success(restInspectionMapper.selectList(null));
     }
 
+    @Override
+    public AjaxResult listByPigpen(Integer pigpenId) {
+        QueryWrapper<JsDivideCircle> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("pigpen_id", pigpenId).orderByDesc("divide_time").last(" limit 1");
+        JsDivideCircle jsDivideCircle = divideCircleMapper.selectOne(queryWrapper);
+        return success(jsDivideCircle);
+    }
+
 }

+ 17 - 1
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsSampleServiceImpl.java

@@ -1,5 +1,6 @@
 package com.ruoyi.web.v2.v1.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.common.core.domain.AjaxResult;
@@ -12,6 +13,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
 import static com.ruoyi.common.core.domain.AjaxResult.success;
 
 /**
@@ -30,6 +34,17 @@ public class JsSampleServiceImpl extends ServiceImpl<JsSampleMapper, JsSample> i
 
     @Override
     public AjaxResult add(JsSample sample) {
+        JsSample jsSample = sampleMapper.selectOne(new QueryWrapper<JsSample>().orderByDesc("id").last(" limit 1"));
+        if (ObjectUtil.isNotEmpty(jsSample)) {
+            String materialBatch = jsSample.getSampleNum();
+            Integer integer = Integer.valueOf(materialBatch);
+            String formattedNumber = String.format("%02d", integer+1);
+            sample.setSampleNum(formattedNumber);
+        } else {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            String format = sdf.format(new Date());
+            sample.setSampleNum(format+String.format("%02d", 1));
+        }
         sampleMapper.insert(sample);
         return success();
     }
@@ -56,8 +71,9 @@ public class JsSampleServiceImpl extends ServiceImpl<JsSampleMapper, JsSample> i
         if ("".equals(startTime) || null == startTime) {
 
         } else {
-            queryWrapper.between("keep_time", startTime, endTime);
+            queryWrapper.between("keep_time", startTime+" 00:00:00", endTime+" 23:59:59");
         }
+        queryWrapper.orderByDesc("keep_time");
         queryWrapper.like(StringUtils.isNotEmpty(sampleNum),"sample_num", sampleNum);
         return success(sampleMapper.selectPage(page, queryWrapper));
     }

+ 7 - 2
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsStockServiceImpl.java

@@ -12,6 +12,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Map;
+
 import static com.ruoyi.common.core.domain.AjaxResult.success;
 
 /**
@@ -41,7 +43,10 @@ public class JsStockServiceImpl extends ServiceImpl<JsStockMapper, JsStock> impl
     }
 
     @Override
-    public AjaxResult listAll() {
-        return success(stockMapper.selectList(null));
+    public AjaxResult listAll(Map<String, String> paramsMap) {
+        String materialBatch = paramsMap.get("materialBatch");
+        QueryWrapper<JsStock> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.isNotEmpty(materialBatch), "material_batch", materialBatch);
+        return success(stockMapper.selectList(queryWrapper));
     }
 }

+ 86 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsStoreServiceImpl.java

@@ -1,11 +1,28 @@
 package com.ruoyi.web.v2.v1.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.web.v2.v1.entity.JsProduceRecall;
+import com.ruoyi.web.v2.v1.entity.JsSample;
 import com.ruoyi.web.v2.v1.entity.JsStore;
+import com.ruoyi.web.v2.v1.entity.JsTransport;
 import com.ruoyi.web.v2.v1.mapper.JsStoreMapper;
+import com.ruoyi.web.v2.v1.mapper.JsTransportMapper;
 import com.ruoyi.web.v2.v1.service.IJsStoreService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import static com.ruoyi.common.core.domain.AjaxResult.success;
+
 /**
  * <p>
  * v2.0无害化暂存 服务实现类
@@ -17,4 +34,73 @@ import org.springframework.stereotype.Service;
 @Service
 public class JsStoreServiceImpl extends ServiceImpl<JsStoreMapper, JsStore> implements IJsStoreService {
 
+    @Autowired
+    private JsStoreMapper jsStoreMapper;
+    @Autowired
+    private JsTransportMapper transportMapper;
+
+    @Override
+    public AjaxResult add(JsStore jsStore) {
+        JsStore jsStore1 = jsStoreMapper.selectOne(new QueryWrapper<JsStore>().orderByDesc("id").last(" limit 1"));
+        if (ObjectUtil.isNotEmpty(jsStore1)) {
+            String materialBatch = jsStore1.getHarmlessTreatmentId();
+            Integer integer = Integer.valueOf(materialBatch);
+            String formattedNumber = String.format("%02d", integer+1);
+            jsStore.setHarmlessTreatmentId(formattedNumber);
+        } else {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            String format = sdf.format(new Date());
+            jsStore.setHarmlessTreatmentId(format+String.format("%02d", 1));
+        }
+        jsStoreMapper.insert(jsStore);
+        return success();
+    }
+
+    @Override
+    public AjaxResult edit(JsStore jsStore) {
+        jsStoreMapper.updateById(jsStore);
+        return success();
+    }
+
+    @Override
+    public AjaxResult delete(String ids) {
+        String[] split = ids.split(",");
+        for (String s : split) {
+            jsStoreMapper.deleteById(s);
+        }
+        return success();
+    }
+
+    @Override
+    public AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, Integer harmlessTreatmentId) {
+        Page<JsStore> page = new Page<>(pageNum, pageSize);
+        QueryWrapper<JsStore> queryWrapper = new QueryWrapper<>();
+        if ("".equals(startTime) || null == startTime) {
+
+        } else {
+            queryWrapper.between("store_time", startTime, endTime);
+        }
+        if (null != harmlessTreatmentId) {
+            queryWrapper.eq("harmless_treatment_id", harmlessTreatmentId);
+        }
+        queryWrapper.orderByDesc("store_time");
+        return success(jsStoreMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public AjaxResult listAll() {
+        List<JsStore> jsStores = jsStoreMapper.selectList(null);
+        List<JsStore> list = new ArrayList<>();
+        if (jsStores.size() != 0) {
+            for (JsStore jsStore : jsStores) {
+                QueryWrapper<JsTransport> queryWrapper = new QueryWrapper<>();
+                queryWrapper.eq("harmless_treatment_id", jsStore.getHarmlessTreatmentId());
+                Integer count = transportMapper.selectCount(queryWrapper);
+                if (count == 0) {
+                    list.add(jsStore);
+                }
+            }
+        }
+        return success(list);
+    }
 }

+ 81 - 0
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsTransportServiceImpl.java

@@ -1,10 +1,24 @@
 package com.ruoyi.web.v2.v1.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.web.v2.v1.entity.JsStore;
 import com.ruoyi.web.v2.v1.entity.JsTransport;
 import com.ruoyi.web.v2.v1.mapper.JsTransportMapper;
 import com.ruoyi.web.v2.v1.service.IJsTransportService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.web.v2.v1.utils.PhoneNumberValidator;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import static com.ruoyi.common.core.domain.AjaxResult.error;
+import static com.ruoyi.common.core.domain.AjaxResult.success;
 
 /**
  * <p>
@@ -17,4 +31,71 @@ import org.springframework.stereotype.Service;
 @Service
 public class JsTransportServiceImpl extends ServiceImpl<JsTransportMapper, JsTransport> implements IJsTransportService {
 
+    @Autowired
+    private JsTransportMapper transportMapper;
+
+    @Override
+    public AjaxResult add(JsTransport transport) {
+        if (ObjectUtil.isNotEmpty(transport.getPhone())) {
+            if (!PhoneNumberValidator.isValidPhoneNumber(transport.getPhone())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return error("手机号码格式不正确!");
+            }
+        }
+        JsTransport jsTransport = transportMapper.selectOne(new QueryWrapper<JsTransport>().orderByDesc("id").last(" limit 1"));
+        if (ObjectUtil.isNotEmpty(jsTransport)) {
+            String materialBatch = jsTransport.getHarmlessTreatmentId();
+            Integer integer = Integer.valueOf(materialBatch);
+            String formattedNumber = String.format("%02d", integer+1);
+            transport.setHarmlessTreatmentId(formattedNumber);
+        } else {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+            String format = sdf.format(new Date());
+            transport.setHarmlessTreatmentId(format+String.format("%02d", 1));
+        }
+        transportMapper.insert(transport);
+        return success();
+    }
+
+    @Override
+    public AjaxResult edit(JsTransport transport) {
+        if (ObjectUtil.isNotEmpty(transport.getPhone())) {
+            if (!PhoneNumberValidator.isValidPhoneNumber(transport.getPhone())) {
+                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+                return error("手机号码格式不正确!");
+            }
+        }
+        transportMapper.updateById(transport);
+        return success();
+    }
+
+    @Override
+    public AjaxResult delete(String ids) {
+        String[] split = ids.split(",");
+        for (String s : split) {
+            transportMapper.deleteById(s);
+        }
+        return success();
+    }
+
+    @Override
+    public AjaxResult page(Integer pageNum, Integer pageSize, String startTime, String endTime, Integer harmlessTreatmentId) {
+        Page<JsTransport> page = new Page<>(pageNum, pageSize);
+        QueryWrapper<JsTransport> queryWrapper = new QueryWrapper<>();
+        if ("".equals(startTime) || null == startTime) {
+
+        } else {
+            queryWrapper.between("transport_time", startTime, endTime);
+        }
+        if (null != harmlessTreatmentId) {
+            queryWrapper.eq("harmless_treatment_id", harmlessTreatmentId);
+        }
+        queryWrapper.orderByDesc("transport_time");
+        return success(transportMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public AjaxResult listAll() {
+        return success(transportMapper.selectList(null));
+    }
 }

+ 17 - 12
app-admin/src/main/java/com/ruoyi/web/v2/v1/service/impl/JsWorkshopServiceImpl.java

@@ -37,16 +37,16 @@ public class JsWorkshopServiceImpl extends ServiceImpl<JsWorkshopMapper, JsWorks
         if (count != 0) {
             return error("车间名称已存在!");
         } else {
-            JsWorkshop workshop1 = workshopMapper.selectOne(new QueryWrapper<JsWorkshop>().orderByDesc("id").last(" limit 1"));
-            if (ObjectUtil.isEmpty(workshop1)) {
-                String formattedNumber = String.format("%03d", 1);
-                workshop.setWorkshopNum(formattedNumber);
-            } else {
-                String workshopNum = workshop1.getWorkshopNum();
-                Integer integer = Integer.valueOf(workshopNum);
-                String formattedNumber = String.format("%03d", integer+1);
-                workshop.setWorkshopNum(formattedNumber);
-            }
+//            JsWorkshop workshop1 = workshopMapper.selectOne(new QueryWrapper<JsWorkshop>().orderByDesc("id").last(" limit 1"));
+//            if (ObjectUtil.isEmpty(workshop1)) {
+//                String formattedNumber = String.format("%03d", 1);
+//                workshop.setWorkshopNum(formattedNumber);
+//            } else {
+//                String workshopNum = workshop1.getWorkshopNum();
+//                Integer integer = Integer.valueOf(workshopNum);
+//                String formattedNumber = String.format("%03d", integer+1);
+//                workshop.setWorkshopNum(formattedNumber);
+//            }
             workshopMapper.insert(workshop);
         }
         return success("添加成功");
@@ -84,8 +84,13 @@ public class JsWorkshopServiceImpl extends ServiceImpl<JsWorkshopMapper, JsWorks
     }
 
     @Override
-    public AjaxResult listAll() {
-        return success(workshopMapper.selectList(null));
+    public AjaxResult listAll(String workshopType) {
+        if ("".equals(workshopType) || null==workshopType) {
+            return success(workshopMapper.selectList(null));
+        } else {
+            return success(workshopMapper.selectList(new QueryWrapper<JsWorkshop>().eq("workshop_type",workshopType)));
+        }
+
     }
 
 

+ 8 - 8
app-admin/src/main/resources/application.yml

@@ -76,7 +76,7 @@ spring:
     # 数据库索引
     database: 10
     # 密码
-#    password: 123456
+#    password: hm123456
     # 连接超时时间
     timeout: 10s
     lettuce:
@@ -132,13 +132,13 @@ xss:
   urlPatterns: /system/*,/monitor/*,/tool/*
 
 #WVP配置
-wvp:
-  #地址
-  addr: http://101.66.246.132:18080
-  #用户名
-  username: admin
-  #密码
-  password: admin
+#wvp:
+#  #地址
+#  addr: http://101.66.246.132:18080
+#  #用户名
+#  username: admin
+#  #密码
+#  password: admin
 
 
 mybatis-plus:

+ 3 - 0
app-admin/src/main/resources/mapper/JsCheckProjectMapper.xml

@@ -2,4 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.web.v2.v1.mapper.JsCheckProjectMapper">
 
+    <update id="updateHookDefault" parameterType="com.ruoyi.web.v2.v1.entity.JsCheckProject">
+        update js_check_project set default_flag = 0 where default_flag = 1
+    </update>
 </mapper>

+ 4 - 0
app-admin/src/main/resources/mapper/JsDisinfectManageMapper.xml

@@ -2,4 +2,8 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.web.v2.v1.mapper.JsDisinfectManageMapper">
 
+
+    <update id="updateHookDefault" parameterType="com.ruoyi.web.v2.v1.entity.JsDisinfectManage">
+        update js_disinfect_manage set default_flag = 0 where default_flag = 1
+    </update>
 </mapper>

+ 12 - 0
app-admin/src/main/resources/mapper/JsDistributionMapper.xml

@@ -2,4 +2,16 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.web.v2.v1.mapper.JsDistributionMapper">
 
+    <select id="getAllList" resultType="com.ruoyi.web.v2.v1.entity.vo.ProductionVo">
+select b.productName produceName,a.afterWeight weight,a.amount amount,b.unit unit FROM
+(select produce_name produceName,SUM(after_weight) afterWeight,SUM(amount) amount FROM js_distribution where purchaser_name=#{purchaserName}
+        <if test="startTime != null">
+            AND distribution_time between #{startTime} and #{endTime}
+        </if>
+GROUP BY produce_name)
+ as a right JOIN
+(select product_name productName,unit unit FROM product_category WHERE del_flag='0') AS b
+on a.produceName=b.productName
+
+    </select>
 </mapper>

+ 5 - 0
app-admin/src/main/resources/mapper/JsDrugCheckMapper.xml

@@ -2,4 +2,9 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.web.v2.v1.mapper.JsDrugCheckMapper">
 
+    <select id="getDrug" resultType="com.ruoyi.web.v2.v1.entity.vo.DrugCheckVo">
+        select IFNULL(sum(check_amount),'0') checkAmount,result result,check_project checkProject from js_drug_check
+        where entrance_batch_id=#{id}
+        group by check_project
+    </select>
 </mapper>

+ 5 - 0
app-admin/src/main/resources/mapper/JsProduceCheckMapper.xml

@@ -2,4 +2,9 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.web.v2.v1.mapper.JsProduceCheckMapper">
 
+    <select id="getAll" resultType="com.ruoyi.web.v2.v1.entity.vo.ProduceCheckVo">
+        select IFNULL(sum(unqualified_num),'0') unqualifiedNum,produce_name produceName,method method,unit unit,types types from js_produce_check
+        where entrance_batch_id=#{id}
+        GROUP BY produce_name
+    </select>
 </mapper>

+ 5 - 0
app-system/pom.xml

@@ -22,6 +22,11 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>app-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
 
     </dependencies>
 

+ 10 - 0
app-system/src/main/java/com/ruoyi/app/DTO/ProductTraceDTO.java

@@ -33,6 +33,16 @@ public class ProductTraceDTO {
     private Long snapKillAmount;
     private BigDecimal unqualifiedWeight;
     private String dealWay;
+    private String roadDealAmount;
+
+    public String getRoadDealAmount() {
+        return roadDealAmount;
+    }
+
+    public void setRoadDealAmount(String roadDealAmount) {
+        this.roadDealAmount = roadDealAmount;
+    }
+
     private List<SlaughterBatchDTO> slaughterBatchs;
     private WeightOfProductTraceDTO weightOfProductTrace;
     // Getter and Setter methods

+ 20 - 0
app-system/src/main/java/com/ruoyi/app/DTO/SlaughterBatchDTO.java

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
 
 import java.math.BigDecimal;
 import java.util.Date;
+import java.util.List;
 
 public class SlaughterBatchDTO {
     private Long id;
@@ -24,6 +25,25 @@ public class SlaughterBatchDTO {
     private BigDecimal headWeight;
     private BigDecimal redWeight;
     private BigDecimal whiteWeight;
+    private String purchaserId;
+
+    public String getPurchaserId() {
+        return purchaserId;
+    }
+
+    public void setPurchaserId(String purchaserId) {
+        this.purchaserId = purchaserId;
+    }
+
+    public List<ProductionVo> getProductionVos() {
+        return productionVos;
+    }
+
+    public void setProductionVos(List<ProductionVo> productionVos) {
+        this.productionVos = productionVos;
+    }
+
+    private List<ProductionVo> productionVos;
 
     // Getters and Setters
     public Long getId() {

+ 46 - 35
app-system/src/main/java/com/ruoyi/app/domain/DryLossRatio.java

@@ -2,6 +2,7 @@ package com.ruoyi.app.domain;
 
 import java.math.BigDecimal;
 import java.util.Date;
+
 import com.fasterxml.jackson.annotation.JsonFormat;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
@@ -15,46 +16,60 @@ import javax.validation.constraints.NotNull;
 
 /**
  * 干损比例对象 dry_loss_ratio
- * 
+ *
  * @author ruoyi
  * @date 2025-03-19
  */
-public class DryLossRatio extends BaseEntity
-{
+public class DryLossRatio extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** ID */
+    /**
+     * ID
+     */
     private Long id;
 
-    /** 干损比例 */
+    /**
+     * 干损比例
+     */
     @Excel(name = "干损比例")
     private BigDecimal dryLossRatio;
 
-    /** 开始时间 */
+    /**
+     * 开始时间
+     */
     @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd")
     private String startTime;
 
+    public Integer getIsUse() {
+        return isUse;
+    }
+
+    public void setIsUse(Integer isUse) {
+        this.isUse = isUse;
+    }
+
+    private Integer isUse;
+
 //    /** 结束时间 */
 //    @JsonFormat(pattern = "yyyy-MM-dd")
 //    @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd")
 //    private Date endTime;
 
-    /** 删除标志 */
+    /**
+     * 删除标志
+     */
     private String delFlag;
 
-    public void setId(Long id) 
-    {
+    public void setId(Long id) {
         this.id = id;
     }
 
-    public Long getId() 
-    {
+    public Long getId() {
         return id;
     }
 
-    public void setDryLossRatio(BigDecimal dryLossRatio) 
-    {
+    public void setDryLossRatio(BigDecimal dryLossRatio) {
         this.dryLossRatio = dryLossRatio;
     }
 
@@ -62,19 +77,16 @@ public class DryLossRatio extends BaseEntity
     @DecimalMin(value = "0.01", inclusive = true, message = "干损比例输入超出设定范围限制(0.01~99.99)")
     @DecimalMax(value = "99.99", inclusive = true, message = "干损比例输入超出设定范围限制(0.01~99.99)")
     @Digits(integer = 2, fraction = 2, message = "干损比例输入的整数部分不能超过2位,小数部分不能超过2位")
-    public BigDecimal getDryLossRatio() 
-    {
+    public BigDecimal getDryLossRatio() {
         return dryLossRatio;
     }
 
-    public void setStartTime(String startTime)
-    {
+    public void setStartTime(String startTime) {
         this.startTime = startTime;
     }
 
     @NotNull(message = "开始时间不能为空")
-    public String getStartTime()
-    {
+    public String getStartTime() {
         return startTime;
     }
 
@@ -89,29 +101,28 @@ public class DryLossRatio extends BaseEntity
 //        return endTime;
 //    }
 
-    public void setDelFlag(String delFlag) 
-    {
+    public void setDelFlag(String delFlag) {
         this.delFlag = delFlag;
     }
 
-    public String getDelFlag() 
-    {
+    public String getDelFlag() {
         return delFlag;
     }
 
     @Override
     public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("id", getId())
-            .append("dryLossRatio", getDryLossRatio())
-            .append("startTime", getStartTime())
-           // .append("endTime", getEndTime())
-            .append("remark", getRemark())
-            .append("createTime", getCreateTime())
-            .append("createBy", getCreateBy())
-            .append("updateTime", getUpdateTime())
-            .append("updateBy", getUpdateBy())
-            .append("delFlag", getDelFlag())
-            .toString();
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("dryLossRatio", getDryLossRatio())
+                .append("startTime", getStartTime())
+                // .append("endTime", getEndTime())
+                .append("remark", getRemark())
+                .append("createTime", getCreateTime())
+                .append("createBy", getCreateBy())
+                .append("updateTime", getUpdateTime())
+                .append("updateBy", getUpdateBy())
+                .append("delFlag", getDelFlag())
+                .append("isUse", getIsUse())
+                .toString();
     }
 }

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

@@ -49,6 +49,18 @@ public class Pigpen extends BaseEntity {
 
     private Integer isUse;
 
+    private String remark;
+
+    @Override
+    public String getRemark() {
+        return remark;
+    }
+
+    @Override
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
     public void setId(Long id) {
         this.id = id;
     }
@@ -98,6 +110,7 @@ public class Pigpen extends BaseEntity {
                 .append("updateBy", getUpdateBy())
                 .append("isUse", getIsUse())
                 .append("delFlag", getDelFlag())
+                .append("remark", getRemark())
                 .toString();
     }
 }

+ 47 - 27
app-system/src/main/java/com/ruoyi/app/domain/ProductCategory.java

@@ -10,66 +10,86 @@ import javax.validation.constraints.Size;
 
 /**
  * 产品分类对象 product_category
- * 
+ *
  * @author coede
  * @date 2025-03-19
  */
-public class ProductCategory extends BaseEntity
-{
+public class ProductCategory extends BaseEntity {
     private static final long serialVersionUID = 1L;
 
-    /** ID */
+    /**
+     * ID
+     */
     private Long id;
 
-    /** 产品名称 */
+    /**
+     * 产品名称
+     */
     @Excel(name = "产品名称")
     private String productName;
 
-    /** 删除标志 */
+    private String unit;
+
+    public String getUnit() {
+        return unit;
+    }
+
+//    private Boolean defaultFlag;
+//
+//    public Boolean getDefaultFlag() {
+//        return defaultFlag;
+//    }
+//
+//    public void setDefaultFlag(Boolean defaultFlag) {
+//        this.defaultFlag = defaultFlag;
+//    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    /**
+     * 删除标志
+     */
     private String delFlag;
 
-    public void setId(Long id) 
-    {
+    public void setId(Long id) {
         this.id = id;
     }
 
-    public Long getId() 
-    {
+    public Long getId() {
         return id;
     }
 
-    public void setProductName(String productName) 
-    {
+    public void setProductName(String productName) {
         this.productName = productName;
     }
 
     @NotBlank(message = "产品名称不能为空")
     @Size(min = 1, max = 10, message = "产品名称输入超出最大长度限制(10位)")
-    public String getProductName() 
-    {
+    public String getProductName() {
         return productName;
     }
 
-    public void setDelFlag(String delFlag) 
-    {
+    public void setDelFlag(String delFlag) {
         this.delFlag = delFlag;
     }
 
-    public String getDelFlag() 
-    {
+    public String getDelFlag() {
         return delFlag;
     }
 
     @Override
     public String toString() {
-        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
-            .append("id", getId())
-            .append("productName", getProductName())
-            .append("createTime", getCreateTime())
-            .append("createBy", getCreateBy())
-            .append("updateTime", getUpdateTime())
-            .append("updateBy", getUpdateBy())
-            .append("delFlag", getDelFlag())
-            .toString();
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("productName", getProductName())
+                .append("createTime", getCreateTime())
+                .append("createBy", getCreateBy())
+                .append("updateTime", getUpdateTime())
+                .append("updateBy", getUpdateBy())
+                .append("delFlag", getDelFlag())
+                .append("unit", getUnit())
+                .toString();
     }
 }

+ 67 - 0
app-system/src/main/java/com/ruoyi/app/domain/response/DrugCheckParam.java

@@ -0,0 +1,67 @@
+package com.ruoyi.app.domain.response;
+
+import lombok.Data;
+
+@Data
+public class DrugCheckParam {
+
+    private Integer pageNum;
+
+    private Integer pageSize;
+
+    private String startTime;
+
+    private String endTime;
+
+    public Integer getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(Integer pageNum) {
+        this.pageNum = pageNum;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public String getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(String startTime) {
+        this.startTime = startTime;
+    }
+
+    public String getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(String endTime) {
+        this.endTime = endTime;
+    }
+
+    public String getAnimalCertNo() {
+        return animalCertNo;
+    }
+
+    public void setAnimalCertNo(String animalCertNo) {
+        this.animalCertNo = animalCertNo;
+    }
+
+    public String getSupplierName() {
+        return supplierName;
+    }
+
+    public void setSupplierName(String supplierName) {
+        this.supplierName = supplierName;
+    }
+
+    private String animalCertNo;
+
+    private String supplierName;
+}

+ 22 - 4
app-system/src/main/java/com/ruoyi/app/mapper/EntranceBatchMapper.java

@@ -1,16 +1,15 @@
 package com.ruoyi.app.mapper;
 
+import java.util.Date;
 import java.util.List;
 
-import com.ruoyi.app.DTO.DailyEntranceAmountDTO;
-import com.ruoyi.app.DTO.EntranceReportDTO;
-import com.ruoyi.app.DTO.TimeAndNumberDTO;
+import com.ruoyi.app.DTO.*;
 import com.ruoyi.app.domain.EntranceBatch;
 import com.ruoyi.app.domain.Supplier;
 import com.ruoyi.app.domain.request.ProductTraceParam;
 import com.ruoyi.app.domain.request.ReqEntranceReport;
 import com.ruoyi.app.domain.request.TimeRangeParam;
-import com.ruoyi.app.DTO.ProductTraceDTO;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 入场批次Mapper接口
@@ -44,6 +43,9 @@ public interface EntranceBatchMapper
      */
     public List<EntranceBatch> selectEntranceBatchList(EntranceBatch entranceBatch);
 
+    /*查询当天是否有完结报告*/
+    public List<EntranceBatch> selectEntranceBatchList1(EntranceBatch entranceBatch);
+
     /**
      * 校验检疫证号是否唯一
      *
@@ -216,4 +218,20 @@ public interface EntranceBatchMapper
      */
     public EntranceBatch selectByAnimalNo(String anNo);
 
+    /**
+     *
+     * 获取所有的列表
+     * */
+    public List<EntranceBatch> getAll(@Param("startTime") String startTime,@Param("endTime")String endTime,@Param("animalCertNo")String animalCertNo
+            ,@Param("cargoOwner") String cargoOwner);
+
+
+    /*生猪屠宰情况日汇总*/
+
+
+    /*
+    * 查询当天是否有完结报告,如果有完结报告则不展示入场批次,如果无则展示当天
+    * */
+
+    public JsReportDto selectByTime();
 }

+ 3 - 0
app-system/src/main/java/com/ruoyi/app/mapper/HarmlessTreatmentMapper.java

@@ -71,4 +71,7 @@ public interface HarmlessTreatmentMapper
     public HarmlessSumDTO selectHarmlessSumByTime(TimeRangeParam timeRangeParam);
 
     public HarmlessTreatment selectByEntraceBatchId(Long id);
+
+
+    public List<HarmlessTreatment> listAll();
 }

+ 5 - 0
app-system/src/main/java/com/ruoyi/app/mapper/PigpenMapper.java

@@ -1,6 +1,8 @@
 package com.ruoyi.app.mapper;
 
 import java.util.List;
+
+import com.ruoyi.app.DTO.PigpenDTO;
 import com.ruoyi.app.domain.Pigpen;
 import com.ruoyi.common.core.domain.entity.SysUser;
 
@@ -26,6 +28,9 @@ public interface PigpenMapper
      * @param pigpen 待宰圈
      * @return 待宰圈集合
      */
+    public List<PigpenDTO> printPigpenList(Pigpen pigpen);
+
+
     public List<Pigpen> selectPigpenList(Pigpen pigpen);
 
     /**

+ 3 - 0
app-system/src/main/java/com/ruoyi/app/mapper/ProductCategoryMapper.java

@@ -68,4 +68,7 @@ public interface ProductCategoryMapper
      * @return 结果
      */
     public int deleteProductCategoryByIds(Long[] ids);
+
+
+    public int updateHookDefault();
 }

+ 6 - 4
app-system/src/main/java/com/ruoyi/app/mapper/PurchaserMapper.java

@@ -2,10 +2,7 @@ package com.ruoyi.app.mapper;
 
 import java.util.List;
 
-import com.ruoyi.app.DTO.PurchaserAmountRankDTO;
-import com.ruoyi.app.DTO.PurchaserSaleAmountDTO;
-import com.ruoyi.app.DTO.SupplierAmountRankDTO;
-import com.ruoyi.app.DTO.SupplierOriginAmountDTO;
+import com.ruoyi.app.DTO.*;
 import com.ruoyi.app.domain.Purchaser;
 import com.ruoyi.app.domain.Supplier;
 import com.ruoyi.app.domain.request.ReqPurchaser;
@@ -122,4 +119,9 @@ public interface PurchaserMapper
      * @return 结果
      */
     public List<PurchaserSaleAmountDTO> selectSaleAmountByTime(TimeRangeParam timeRangeParam);
+
+
+    public Purchaser getOnePurchaser(String purchaserName);
+
+    public AncimalDTO getOneAnimal(String purchaserName);
 }

+ 0 - 0
app-system/src/main/java/com/ruoyi/app/mapper/SlaughterBatchMapper.java


Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov