From fe8db21391c7bc26044084ee4f0aa970994b56c7 Mon Sep 17 00:00:00 2001
From: zhuguifei <zhuguifei@zhuguifeideiMac.local>
Date: 星期四, 11 九月 2025 13:45:03 +0800
Subject: [PATCH] 新增预测性维护两个页面部分接口

---
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbBatchServiceImpl.java   |   25 ++
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbQualityService.java         |   32 ++++
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbBatchVo.java               |    5 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbBatch.java                    |    4 
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbQualityController.java    |   66 ++++++++
 ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbQualityServiceImpl.java |  309 ++++++++++++++++++++++++++++++++++++++
 6 files changed, 439 insertions(+), 2 deletions(-)

diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbQualityController.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbQualityController.java
new file mode 100644
index 0000000..357558d
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/controller/LbQualityController.java
@@ -0,0 +1,66 @@
+package cn.shlanbao.qms.controller;
+
+import cn.shlanbao.qms.domain.bo.LbBatchBo;
+import cn.shlanbao.qms.domain.vo.LbBatchVo;
+import cn.shlanbao.qms.service.ILbQualityService;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * AI璐ㄩ噺鍒嗘瀽-棰勬祴鎬х淮鎶�
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/qms/quality")
+public class LbQualityController {
+    private final ILbQualityService qualityService;
+
+    /**
+     * 骞村害璐ㄩ噺鍋ュ悍鐜�
+     */
+    @GetMapping("/health")
+    public Map<String, Object> health() {
+        return qualityService.queryQualityHealth();
+    }
+
+    /**
+     * 浠婃棩鎵规
+     */
+    @GetMapping("/batch")
+    public TableDataInfo<LbBatchVo> queryBatchList(LbBatchBo bo, PageQuery pageQuery) {
+        return qualityService.queryBatchList(bo, pageQuery);
+    }
+
+    /**
+     * 鏌ヨ杩戜竴鏈堟壒娆¤秼鍔�
+     * @return
+     */
+    @GetMapping("/pwbatch")
+    public Map<String,Object> queryPwbatchList() {
+        return qualityService.queryPwbatchList();
+    }
+
+
+    /**
+     * 鏌ヨ杩戜竴鏈圢G top5
+     * @return
+     */
+    @GetMapping("/ngrank")
+    public Map<String,Object> ngrank() {
+        return qualityService.queryNgrankList();
+    }
+
+
+
+
+
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbBatch.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbBatch.java
index dbcb742..b680945 100644
--- a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbBatch.java
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/LbBatch.java
@@ -1,11 +1,13 @@
 package cn.shlanbao.qms.domain;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.common.mybatis.core.domain.BaseEntity;
 import com.baomidou.mybatisplus.annotation.*;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
+import java.util.Date;
 
 /**
  * 鎵规绠$悊瀵硅薄 lb_batch
@@ -31,6 +33,8 @@
      * 鎵规鍙�
      */
     private String batchCode;
+    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
+    private Date batchTime;
 
     /**
      * 浜у搧鍨嬪彿
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbBatchVo.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbBatchVo.java
index dbfbfff..c2cd3b3 100644
--- a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbBatchVo.java
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/domain/vo/LbBatchVo.java
@@ -3,6 +3,7 @@
 import cn.shlanbao.qms.domain.LbBatch;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import org.dromara.common.excel.annotation.ExcelDictFormat;
 import org.dromara.common.excel.convert.ExcelDictConvert;
 import io.github.linpeilie.annotations.AutoMapper;
@@ -40,6 +41,10 @@
     @ExcelProperty(value = "鎵规鍙�")
     private String batchCode;
 
+    @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss")
+    private Date batchTime;
+
+
     /**
      * 浜у搧鍨嬪彿
      */
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbQualityService.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbQualityService.java
new file mode 100644
index 0000000..42457b2
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/ILbQualityService.java
@@ -0,0 +1,32 @@
+package cn.shlanbao.qms.service;
+
+import cn.shlanbao.qms.domain.bo.LbBatchBo;
+import cn.shlanbao.qms.domain.vo.LbBatchVo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+import java.util.Map;
+
+public interface ILbQualityService {
+    /**
+     * 鏌ヨ骞村害璐ㄩ噺鍋ュ悍搴�
+     */
+    Map<String, Object> queryQualityHealth();
+
+    /**
+     * 鏌ヨ浠婂ぉ鎵规
+     * @return
+     */
+    TableDataInfo<LbBatchVo> queryBatchList(LbBatchBo bo, PageQuery pageQuery);
+    /**
+     * 鏌ヨ杩戜竴鏈堟壒娆¤秼鍔�
+     * @return
+     */
+    Map<String, Object> queryPwbatchList();
+
+    /**
+     * 鏌ヨ杩戜竴鏈坣grank
+     * @return
+     */
+    Map<String, Object> queryNgrankList();
+}
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbBatchServiceImpl.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbBatchServiceImpl.java
index ce9ed02..20ecf84 100644
--- a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbBatchServiceImpl.java
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbBatchServiceImpl.java
@@ -1,5 +1,8 @@
 package cn.shlanbao.qms.service.impl;
 
+import cn.shlanbao.qms.domain.LbSensorResult;
+import cn.shlanbao.qms.domain.vo.LbSensorResultVo;
+import cn.shlanbao.qms.mapper.LbSensorResultMapper;
 import cn.shlanbao.qms.service.ILbTestResultService;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -31,7 +34,7 @@
 public class LbBatchServiceImpl implements ILbBatchService {
 
     private final LbBatchMapper baseMapper;
-
+    private final LbSensorResultMapper sensorResultMapper;
     private final ILbTestResultService testResultService;
 
     /**
@@ -42,7 +45,22 @@
      */
     @Override
     public LbBatchVo queryById(Long id){
-        return baseMapper.selectVoById(id);
+        LbBatchVo lbBatchVo = baseMapper.selectVoById(id);
+        if(lbBatchVo!=null){
+            LambdaQueryWrapper<LbSensorResult> sensorResultWrapper = new LambdaQueryWrapper<>();
+            sensorResultWrapper.eq(LbSensorResult::getBatchCode, lbBatchVo.getBatchCode());
+            List<LbSensorResultVo> sensorResultVoList = sensorResultMapper.selectVoList(sensorResultWrapper);
+            long okCount = sensorResultVoList.stream()
+                .filter(vo -> "OK".equals(vo.getJudgeResult()))
+                .count();
+
+            long ngCount = sensorResultVoList.stream()
+                .filter(vo -> "NG".equals(vo.getJudgeResult()))
+                .count();
+            lbBatchVo.setOkNum(okCount);
+            lbBatchVo.setNgNum(ngCount);
+        }
+        return lbBatchVo;
     }
 
     /**
@@ -83,6 +101,9 @@
         lqw.eq(bo.getUserId() != null, LbBatch::getUserId, bo.getUserId());
         lqw.eq(bo.getNum() != null, LbBatch::getNum, bo.getNum());
         lqw.orderByDesc(LbBatch::getBatchCode);
+        if(params!=null && params.containsKey("startTime")&&params.containsKey("endTime")) {
+            lqw.between(LbBatch::getBatchTime,params.get("startTime"),params.get("endTime"));
+        }
         return lqw;
     }
 
diff --git a/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbQualityServiceImpl.java b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbQualityServiceImpl.java
new file mode 100644
index 0000000..4fd5302
--- /dev/null
+++ b/ruoyi-modules/lb-qms/src/main/java/cn/shlanbao/qms/service/impl/LbQualityServiceImpl.java
@@ -0,0 +1,309 @@
+package cn.shlanbao.qms.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.shlanbao.qms.domain.LbBatch;
+import cn.shlanbao.qms.domain.LbSensorResult;
+import cn.shlanbao.qms.domain.LbTestResult;
+import cn.shlanbao.qms.domain.bo.LbBatchBo;
+import cn.shlanbao.qms.domain.vo.LbBatchVo;
+import cn.shlanbao.qms.domain.vo.LbSensorResultVo;
+import cn.shlanbao.qms.domain.vo.LbTestResultVo;
+import cn.shlanbao.qms.mapper.LbBatchMapper;
+import cn.shlanbao.qms.mapper.LbSensorResultMapper;
+import cn.shlanbao.qms.mapper.LbTestResultMapper;
+import cn.shlanbao.qms.service.ILbQualityService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@RequiredArgsConstructor
+@Service
+public class LbQualityServiceImpl implements ILbQualityService {
+    private final LbBatchMapper batchMapper;
+    private final LbSensorResultMapper sensorResultMapper;
+    private final LbTestResultMapper testResultMapper;
+
+    @Override
+    public Map<String, Object> queryQualityHealth() {
+        Map<String, Object> result = new HashMap<>(2);
+
+        // 鑾峰彇褰撳墠骞翠唤
+        int currentYear = DateUtil.year(DateUtil.date());
+
+        // 鏋勫缓鏌ヨ鏉′欢锛氭煡璇㈠綋鍓嶅勾浠界殑鏁版嵁
+        QueryWrapper<LbSensorResult> queryWrapper = new QueryWrapper<>();
+        queryWrapper.likeRight("batch_code", String.valueOf(currentYear));
+
+        // 鏌ヨ鏁版嵁
+        List<LbSensorResultVo> sensorResultList = sensorResultMapper.selectVoList(queryWrapper);
+
+        if (CollectionUtils.isEmpty(sensorResultList)) {
+            result.put("xAxis", Collections.emptyList());
+            result.put("yAxis", Collections.emptyList());
+            return result;
+        }
+
+        // 鎸夊勾鏈堝垎缁勶紙batch_code鍓�6浣嶏級
+        Map<String, List<LbSensorResultVo>> monthlyGroup = sensorResultList.stream()
+            .filter(vo -> vo != null && StringUtils.isNotBlank(vo.getBatchCode()))
+            .collect(Collectors.groupingBy(vo -> vo.getBatchCode().substring(0, 6)));
+
+        // 鍑嗗x杞村拰y杞存暟鎹�
+        List<String> xAxis = new ArrayList<>();
+        List<Map<String, Object>> yAxis = new ArrayList<>();
+
+        // 澶勭悊姣忎釜鏈堢殑鏁版嵁
+        monthlyGroup.entrySet().stream()
+            .sorted(Map.Entry.comparingByKey())
+            .forEach(entry -> {
+                String monthKey = entry.getKey();
+                List<LbSensorResultVo> monthlyData = entry.getValue();
+
+                if (CollectionUtils.isEmpty(monthlyData)) {
+                    return;
+                }
+
+                // 娣诲姞x杞存暟鎹�
+                xAxis.add(monthKey.substring(4, 6) + "鏈�");
+
+                // 璁$畻鍚堟牸鐜�
+                long passCount = monthlyData.stream()
+                    .filter(vo -> "OK".equalsIgnoreCase(vo.getJudgeResult()))
+                    .count();
+
+                double passRate = (double) passCount / monthlyData.size();
+
+                // 娣诲姞y杞存暟鎹�
+                Map<String, Object> monthData = new HashMap<>(1);
+                monthData.put("value", String.format("%.1f", (passRate * 10)));
+                yAxis.add(monthData);
+            });
+
+        result.put("xAxis", xAxis);
+        result.put("yAxis", yAxis);
+
+        return result;
+
+    }
+
+    @Override
+    public TableDataInfo<LbBatchVo> queryBatchList(LbBatchBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<LbBatch> lqw = buildQueryWrapper(bo);
+        Page<LbBatchVo> result = batchMapper.selectVoPage(pageQuery.build(), lqw);
+
+        List<LbBatchVo> records = result.getRecords();
+        if (records.isEmpty()) {
+            return TableDataInfo.build(result);
+        }
+
+        List<String> batchCodes = records.stream()
+            .map(LbBatchVo::getBatchCode)
+            .collect(Collectors.toList());
+
+        LambdaQueryWrapper<LbSensorResult> sensorResultWrapper = new LambdaQueryWrapper<>();
+        sensorResultWrapper.in(LbSensorResult::getBatchCode, batchCodes);
+
+        List<LbSensorResultVo> sensorResultVoList = sensorResultMapper.selectVoList(sensorResultWrapper);
+
+        // 涓�娆℃�х粺璁K鍜屾�绘暟
+        Map<String, BatchStats> statsMap = sensorResultVoList.stream()
+            .collect(Collectors.groupingBy(
+                LbSensorResultVo::getBatchCode,
+                Collectors.collectingAndThen(
+                    Collectors.toList(),
+                    list -> {
+                        long okCount = list.stream()
+                            .filter(vo -> "OK".equals(vo.getJudgeResult()))
+                            .count();
+                        return new BatchStats(okCount, list.size());
+                    }
+                )
+            ));
+
+        // 鎵归噺璁剧疆缁熻缁撴灉
+        records.forEach(item -> {
+            BatchStats stats = statsMap.get(item.getBatchCode());
+            if (stats != null) {
+                item.setOkNum(stats.okCount);
+                item.setNgNum(stats.totalCount - stats.okCount);
+            } else {
+                // 濡傛灉娌℃湁鐩稿叧妫�娴嬬粨鏋滐紝璁剧疆涓�0
+                item.setOkNum(0L);
+                item.setNgNum(item.getNum());
+            }
+        });
+
+        return TableDataInfo.build(result);
+    }
+
+    @Override
+    public Map<String, Object> queryPwbatchList() {
+        Map<String, Object> res = new HashMap<>(2);
+        // 鍑嗗x杞村拰y杞存暟鎹�
+        List<String> xAxis = new ArrayList<>();
+        List<Object> yAxis = new ArrayList<>();
+
+        LambdaQueryWrapper<LbBatch> dateQuery = Wrappers.lambdaQuery();
+        dateQuery.select(LbBatch::getBatchTime)
+            .groupBy(LbBatch::getBatchTime)
+            .orderByDesc(LbBatch::getBatchTime)  // 淇濇寔鍊掑簭鏌ヨ鏈�杩�7澶�
+            .last("LIMIT 30");
+
+        List<LbBatchVo> dateVos = batchMapper.selectVoList(dateQuery);
+
+        // 浠� Vo 瀵硅薄涓彁鍙� batchTime
+        List<Date> recentDates = dateVos.stream()
+            .map(LbBatchVo::getBatchTime)
+            .filter(Objects::nonNull)
+            .collect(Collectors.toList());
+
+        LambdaQueryWrapper<LbBatch> lqw = Wrappers.lambdaQuery();
+        lqw.in(LbBatch::getBatchTime, recentDates)
+            .orderByAsc(LbBatch::getBatchTime);  // 杩欓噷鏀逛负姝e簭锛岀‘淇濇暟鎹寜鏃ユ湡椤哄簭
+
+        List<LbBatchVo> records = batchMapper.selectVoList(lqw);
+
+        List<String> batchCodes = records.stream()
+            .map(LbBatchVo::getBatchCode)
+            .collect(Collectors.toList());
+
+        LambdaQueryWrapper<LbSensorResult> sensorResultWrapper = new LambdaQueryWrapper<>();
+        sensorResultWrapper.in(LbSensorResult::getBatchCode, batchCodes);
+
+        List<LbSensorResultVo> sensorResultVoList = sensorResultMapper.selectVoList(sensorResultWrapper);
+
+        // 璁$畻姣忎釜鏃ユ湡鐨凮K姣斾緥
+        Map<Date, Double> dateOkRatioMap = sensorResultVoList.stream()
+            .collect(Collectors.groupingBy(
+                result -> {
+                    String batchCode = result.getBatchCode();
+                    return records.stream()
+                        .filter(record -> record.getBatchCode().equals(batchCode))
+                        .findFirst()
+                        .map(LbBatchVo::getBatchTime)
+                        .orElse(null);
+                },
+                Collectors.collectingAndThen(
+                    Collectors.toList(),
+                    list -> {
+                        long okCount = list.stream()
+                            .filter(result -> "ok".equalsIgnoreCase(result.getJudgeResult()))
+                            .count();
+                        return list.size() > 0 ? (double) okCount / list.size() : 0.0;
+                    }
+                )
+            ))
+            .entrySet().stream()
+            .filter(entry -> entry.getKey() != null)
+            .sorted(Map.Entry.<Date, Double>comparingByKey())  // 鏀逛负姝e簭鎺掑簭
+            .collect(Collectors.toMap(
+                Map.Entry::getKey,
+                Map.Entry::getValue,
+                (e1, e2) -> e1,
+                LinkedHashMap::new
+            ));
+
+        // 杩囨护鎺墆Axis灏忎簬80鐨勬暟鎹�
+        dateOkRatioMap.entrySet().stream()
+            .filter(entry -> {
+                double ratio = entry.getValue() * 100;  // 杞崲涓虹櫨鍒嗘瘮
+                return ratio >= 80;  // 鍙繚鐣欏ぇ浜庣瓑浜�80鐨勬暟鎹�
+            })
+            .forEach(entry -> {
+                Date date = entry.getKey();
+                double ratio = entry.getValue() * 100;  // 杞崲涓虹櫨鍒嗘瘮
+                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+                xAxis.add(sdf.format(date));
+                yAxis.add(String.format("%.1f", ratio));
+            });
+
+        res.put("xAxis", xAxis);
+        res.put("yAxis", yAxis);
+
+        return res;
+    }
+
+    @Override
+    public Map<String, Object> queryNgrankList() {
+        Map<String, Object> res = new HashMap<>(2);
+        LambdaQueryWrapper<LbTestResult> lqwGroup = Wrappers.lambdaQuery();
+        lqwGroup.select(LbTestResult::getBatchCode)
+            .groupBy(LbTestResult::getBatchCode)
+            .orderByDesc(LbTestResult::getBatchCode)
+            .last("LIMIT 30");
+
+        List<LbTestResultVo> groupResultVos = testResultMapper.selectVoList(lqwGroup);
+        List<String> batchCodeList = groupResultVos.stream()
+            .map(LbTestResultVo::getBatchCode)
+            .collect(Collectors.toList());
+        LambdaQueryWrapper<LbTestResult> lqw = Wrappers.lambdaQuery();
+        lqw.in(LbTestResult::getBatchCode, batchCodeList);
+        lqw.eq(LbTestResult::getTestResult, "NG");
+        List<LbTestResultVo> testResultVos = testResultMapper.selectVoList(lqw);
+        // 1. 鎸塼estItem鍒嗙粍骞剁粺璁℃暟閲忥紙姣忚璁′负1锛�
+        Map<String, Long> countByTestItem = testResultVos.stream()
+            .filter(result -> "NG".equalsIgnoreCase(result.getTestResult()))
+            .collect(Collectors.groupingBy(
+                LbTestResultVo::getTestItem,
+                Collectors.counting()
+            ));
+
+        // 2. 鎸夋暟閲忛檷搴忔帓搴忓苟鍙栧墠5澶�
+        List<Map.Entry<String, Long>> top5Entries = countByTestItem.entrySet().stream()
+            .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
+            .limit(5)
+            .collect(Collectors.toList());
+
+        // 3. 鐢熸垚xAxis鍜寉Axis鏁扮粍
+        String[] xAxis = top5Entries.stream()
+            .map(Map.Entry::getKey)
+            .toArray(String[]::new);
+
+        Long[] yAxis = top5Entries.stream()
+            .map(Map.Entry::getValue)
+            .toArray(Long[]::new);
+
+        res.put("xAxis", xAxis);
+        res.put("yAxis", yAxis);
+        return res;
+    }
+
+    // 鍐呴儴缁熻绫�
+    private static class BatchStats {
+        long okCount;
+        long totalCount;
+
+        BatchStats(long okCount, long totalCount) {
+            this.okCount = okCount;
+            this.totalCount = totalCount;
+        }
+    }
+
+
+    private LambdaQueryWrapper<LbBatch> buildQueryWrapper(LbBatchBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<LbBatch> lqw = Wrappers.lambdaQuery();
+        lqw.eq(StringUtils.isNotBlank(bo.getBatchCode()), LbBatch::getBatchCode, bo.getBatchCode());
+        lqw.eq(StringUtils.isNotBlank(bo.getProdModel()), LbBatch::getProdModel, bo.getProdModel());
+        lqw.eq(StringUtils.isNotBlank(bo.getDeviceCode()), LbBatch::getDeviceCode, bo.getDeviceCode());
+        lqw.eq(bo.getUserId() != null, LbBatch::getUserId, bo.getUserId());
+        lqw.eq(bo.getNum() != null, LbBatch::getNum, bo.getNum());
+        lqw.orderByDesc(LbBatch::getBatchCode);
+        if (params != null && params.containsKey("startTime") && params.containsKey("endTime")) {
+            lqw.between(LbBatch::getBatchTime, params.get("startTime"), params.get("endTime"));
+        }
+        return lqw;
+    }
+
+}

--
Gitblit v1.9.3