maven
2025-12-11 faab40422cfb077b0437d3e232ea01517b3825d0
yys 修改大屏接口
已添加1个文件
已修改3个文件
206 ■■■■ 文件已修改
src/main/java/com/ruoyi/home/controller/HomeController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/dto/QualityProductQualifiedRateDto.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/service/HomeService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java 160 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -7,10 +7,7 @@
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.home.dto.AnalysisCustomerContractAmountsDto;
import com.ruoyi.home.dto.HomeBusinessDto;
import com.ruoyi.home.dto.QualityStatisticsDto;
import com.ruoyi.home.dto.StatisticsReceivablePayableDto;
import com.ruoyi.home.dto.*;
import com.ruoyi.home.service.HomeService;
import com.ruoyi.production.dto.SalesLedgerWorkDto;
import io.swagger.annotations.Api;
@@ -77,5 +74,13 @@
        return AjaxResult.success(statisticsReceivablePayable);
    }
    @ApiOperation("BI统计-产品合格率,库存周转率")
    @GetMapping("/qualityProductQualifiedRate")
    public AjaxResult qualityProductQualifiedRate() {
        QualityProductQualifiedRateDto qualityProductQualifiedRate = homeService.qualityProductQualifiedRate();
        return AjaxResult.success(qualityProductQualifiedRate);
    }
}
src/main/java/com/ruoyi/home/dto/QualityProductQualifiedRateDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.home.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
 * @author :yys
 * @date : 2025/12/11 9:25
 */
@Data
public class QualityProductQualifiedRateDto {
    // åŽŸææ–™åˆæ ¼çŽ‡
    private BigDecimal rawMaterialQualifiedRate = BigDecimal.ZERO;
    // è¿‡ç¨‹åˆæ ¼çއ
    private BigDecimal processQualifiedRate = BigDecimal.ZERO;
    // å‡ºåŽ‚åˆæ ¼çŽ‡
    private BigDecimal factoryQualifiedRate = BigDecimal.ZERO;
    // åº“存周转率
    private BigDecimal inventoryTurnoverRate = BigDecimal.ZERO;
}
src/main/java/com/ruoyi/home/service/HomeService.java
@@ -1,10 +1,7 @@
package com.ruoyi.home.service;
import com.ruoyi.approve.pojo.ApproveProcess;
import com.ruoyi.home.dto.AnalysisCustomerContractAmountsDto;
import com.ruoyi.home.dto.HomeBusinessDto;
import com.ruoyi.home.dto.QualityStatisticsDto;
import com.ruoyi.home.dto.StatisticsReceivablePayableDto;
import com.ruoyi.home.dto.*;
import java.text.ParseException;
import java.util.List;
@@ -26,4 +23,6 @@
    List<ApproveProcess> todos() throws ParseException;
    StatisticsReceivablePayableDto statisticsReceivablePayable(Integer type);
    QualityProductQualifiedRateDto qualityProductQualifiedRate();
}
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -38,6 +38,7 @@
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
@@ -261,50 +262,80 @@
    @Override
    public QualityStatisticsDto qualityStatistics() {
        // èŽ·å–ä¸€å‘¨æ•°æ®
        // èŽ·å–å½“å‰æ—¶é—´
        // èŽ·å–è¿‘å››ä¸ªæœˆæ•°æ®ï¼ˆå¾€å‰æŽ¨ä¸‰ä¸ªæœˆï¼Œå…±4个完整月份)
        LocalDate today = LocalDate.now();
        // èŽ·å–æœ¬å‘¨å‘¨ä¸€
        LocalDate startOfWeek = today.with(DayOfWeek.MONDAY);
        // èŽ·å–æœ¬å‘¨å‘¨æ—¥
        LocalDate endOfWeek = today.with(DayOfWeek.SUNDAY);
        LambdaQueryWrapper<QualityInspect> qualityInspectLambdaQueryWrapper = new LambdaQueryWrapper<>();
        qualityInspectLambdaQueryWrapper.ge(QualityInspect::getCheckTime, startOfWeek)
                .gt(QualityInspect::getCheckTime, endOfWeek);
        List<QualityInspect> qualityInspects = qualityStatisticsMapper.selectList(qualityInspectLambdaQueryWrapper);
        // å®šä¹‰æ—¥æœŸæ ¼å¼åŒ–器(用于显示“年月”格式)
        DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
        QualityStatisticsDto qualityStatisticsDto = new QualityStatisticsDto();
        qualityStatisticsDto.setSupplierNum(qualityInspects.stream().filter(item -> item.getInspectType().equals(0)).map(QualityInspect::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add));
        qualityStatisticsDto.setProcessNum(qualityInspects.stream().filter(item -> item.getInspectType().equals(1)).map(QualityInspect::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add));
        qualityStatisticsDto.setFactoryNum(qualityInspects.stream().filter(item -> item.getInspectType().equals(2)).map(QualityInspect::getQuantity).reduce(BigDecimal.ZERO, BigDecimal::add));
        List<QualityStatisticsItem> qualityStatisticsItems = new ArrayList<>();
        for (int j = 1; j < 8; j++) {
            LocalDate endTime = startOfWeek.plusDays(j);
            LocalDate startTime = endTime.minusDays(1);
            QualityStatisticsItem qualityStatisticsItem = new QualityStatisticsItem();
            qualityStatisticsItem.setDate(startTime.toString());
            qualityStatisticsItem.setSupplierNum(qualityInspects.stream()
                    .filter(item -> item.getInspectType().equals(0) && "不合格".equals(item.getCheckResult())
                            && (startTime.isEqual(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()) || startTime.isAfter(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
                            && endTime.isBefore(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
        BigDecimal supplierNum = new BigDecimal(0);
        BigDecimal factoryNum = new BigDecimal(0);
        BigDecimal processNum = new BigDecimal(0);
        // å¾ªçޝ4次,分别统计近4个月的数据(当前月、前1个月、前2个月、前3个月)
        for (int i = 0; i < 4; i++) {
            // è®¡ç®—当前循环对应的月份(i=0:当前月,i=1:前1个月,以此类推)
            LocalDate currentMonth = today.minusMonths(i);
            // å½“月的开始日期(每月1号)
            LocalDate monthStart = currentMonth.withDayOfMonth(1);
            // å½“月的结束日期(每月最后一天)
            LocalDate monthEnd = currentMonth.withDayOfMonth(currentMonth.lengthOfMonth());
            // æž„建当月的查询条件(如果想一次性查全4个月数据再内存筛选,可优化为先查全再循环筛选)
            LambdaQueryWrapper<QualityInspect> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.ge(QualityInspect::getCheckTime, monthStart)
                    .le(QualityInspect::getCheckTime, monthEnd); // ç­›é€‰å½“月数据
            List<QualityInspect> monthInspects = qualityStatisticsMapper.selectList(queryWrapper);
            supplierNum.add(supplierNum.add(monthInspects.stream()
                    .filter(inspect -> inspect.getInspectType().equals(0))
                    .map(QualityInspect::getQuantity)
                    .reduce(BigDecimal.ZERO, BigDecimal::add)
            );
            qualityStatisticsItem.setFactoryNum(qualityInspects.stream()
                    .filter(item -> item.getInspectType().equals(1) && "不合格".equals(item.getCheckResult())
                            && (startTime.isEqual(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()) || startTime.isAfter(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
                            && endTime.isBefore(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
                    .reduce(BigDecimal.ZERO, BigDecimal::add)));
            factoryNum.add(factoryNum.add(monthInspects.stream()
                    .filter(inspect -> inspect.getInspectType().equals(1))
                    .map(QualityInspect::getQuantity)
                    .reduce(BigDecimal.ZERO, BigDecimal::add)
            );
            qualityStatisticsItem.setProcessNum(qualityInspects.stream()
                    .filter(item -> item.getInspectType().equals(2) && "不合格".equals(item.getCheckResult())
                            && (startTime.isEqual(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()) || startTime.isAfter(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
                            && endTime.isBefore(item.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()))
                    .reduce(BigDecimal.ZERO, BigDecimal::add)));
            processNum.add(processNum.add(monthInspects.stream()
                    .filter(inspect -> inspect.getInspectType().equals(2))
                    .map(QualityInspect::getQuantity)
                    .reduce(BigDecimal.ZERO, BigDecimal::add));
            qualityStatisticsItems.add(qualityStatisticsItem);
                    .reduce(BigDecimal.ZERO, BigDecimal::add)));
            // æž„建当月统计项
            QualityStatisticsItem item = new QualityStatisticsItem();
            item.setDate(monthStart.format(monthFormatter)); // æ—¥æœŸæ˜¾ç¤ºä¸ºâ€œå¹´æœˆâ€ï¼ˆå¦‚ 2025-10)
            // 1. ä¾›åº”商检验(类型0)- åˆæ ¼æ•°é‡
            BigDecimal supplierQualified = monthInspects.stream()
                    .filter(inspect -> inspect.getInspectType().equals(0)
                            && "合格".equals(inspect.getCheckResult()))
                    .map(QualityInspect::getQuantity)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            item.setSupplierNum(supplierQualified);
            // 2. å·¥åºæ£€éªŒï¼ˆç±»åž‹1)- åˆæ ¼æ•°é‡
            BigDecimal processQualified = monthInspects.stream()
                    .filter(inspect -> inspect.getInspectType().equals(1)
                            && "合格".equals(inspect.getCheckResult()))
                    .map(QualityInspect::getQuantity)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            item.setProcessNum(processQualified);
            // 3. å·¥åŽ‚æ£€éªŒï¼ˆç±»åž‹2)- åˆæ ¼æ•°é‡
            BigDecimal factoryQualified = monthInspects.stream()
                    .filter(inspect -> inspect.getInspectType().equals(2)
                            && "合格".equals(inspect.getCheckResult()))
                    .map(QualityInspect::getQuantity)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            item.setFactoryNum(factoryQualified);
            qualityStatisticsItems.add(item);
        }
        // ç»Ÿè®¡è¿‘4个月总数据(所有月份汇总)
        qualityStatisticsDto.setProcessNum(processNum);
        qualityStatisticsDto.setSupplierNum(supplierNum);
        qualityStatisticsDto.setFactoryNum(factoryNum);
        qualityStatisticsDto.setItem(qualityStatisticsItems);
        return qualityStatisticsDto;
    }
@@ -404,4 +435,61 @@
        return statisticsReceivablePayableDto;
    }
    @Override
    public QualityProductQualifiedRateDto qualityProductQualifiedRate() {
        QualityProductQualifiedRateDto qualityProductQualifiedRateDto = new QualityProductQualifiedRateDto();
        List<QualityInspect> qualityInspects = qualityStatisticsMapper.selectList(null);
        if(!CollectionUtils.isEmpty(qualityInspects)){
            // åŽŸææ–™åˆæ ¼çŽ‡
            long rawwMaterialCount = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 0).count();
            long count = qualityInspects.stream().filter(qualityInspect -> "合格".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 0).count();
            if(count > 0){
                qualityProductQualifiedRateDto.setRawMaterialQualifiedRate(new BigDecimal(rawwMaterialCount)
                        .divide(new BigDecimal( count), 4, RoundingMode.HALF_UP)
                        .multiply(BigDecimal.valueOf(100.0)));
            }
            // è¿‡ç¨‹åˆæ ¼çއ
            long processCount = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 1).count();
            long countOne = qualityInspects.stream().filter(qualityInspect -> "合格".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 1).count();
            if(count > 0){
                qualityProductQualifiedRateDto.setRawMaterialQualifiedRate(new BigDecimal(processCount)
                        .divide(new BigDecimal( countOne), 4, RoundingMode.HALF_UP)
                        .multiply(BigDecimal.valueOf(100.0)));
            }
            // å‡ºåŽ‚åˆæ ¼çŽ‡
            long factoryCount = qualityInspects.stream().filter(qualityInspect -> qualityInspect.getInspectType() == 2).count();
            long countTwo = qualityInspects.stream().filter(qualityInspect -> "合格".equals(qualityInspect.getCheckResult()) && qualityInspect.getInspectType() == 2).count();
            if(count > 0){
                qualityProductQualifiedRateDto.setRawMaterialQualifiedRate(new BigDecimal(factoryCount)
                        .divide(new BigDecimal( countTwo), 4, RoundingMode.HALF_UP)
                        .multiply(BigDecimal.valueOf(100.0)));
            }
        }
        // åº“存周转率统计当月出库(使用)的物料总数量÷平均的库存物料总数量×100%。)
        // èŽ·å–å½“å‰æœˆ
        LocalDate today = LocalDate.now();
        LocalDate startDate = today.with(TemporalAdjusters.firstDayOfMonth());
        LocalDate endDate = today.with(TemporalAdjusters.lastDayOfMonth());
        // èŽ·å–å½“å‰æœˆå‡ºåº“ï¼ˆä½¿ç”¨ï¼‰çš„ç‰©æ–™æ€»æ•°é‡
        List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(new LambdaQueryWrapper<ProcurementRecordOut>()
                .ge(ProcurementRecordOut::getCreateTime, startDate)
                .lt(ProcurementRecordOut::getCreateTime, endDate));
        // èŽ·å–å½“å‰æœˆå…¥åº“çš„ç‰©æ–™æ€»æ•°é‡
        List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(new LambdaQueryWrapper<ProcurementRecordStorage>()
                .ge(ProcurementRecordStorage::getCreateTime, startDate)
                .lt(ProcurementRecordStorage::getCreateTime, endDate));
        BigDecimal reduce = procurementRecordOuts.stream()
                .map(ProcurementRecordOut::getInboundNum)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        BigDecimal reduceOne = procurementRecordStorages.stream()
                .map(ProcurementRecordStorage::getInboundNum)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        if(reduce.compareTo(BigDecimal.ZERO) > 0){
            qualityProductQualifiedRateDto.setInventoryTurnoverRate(reduce.divide(reduceOne, 4, RoundingMode.HALF_UP)
                    .multiply(BigDecimal.valueOf(100.0)));
        }
        return qualityProductQualifiedRateDto;
    }
}