From 43f0633906b9cadcfa2376494a9ee86e062a6f43 Mon Sep 17 00:00:00 2001
From: maven <2163098428@qq.com>
Date: 星期一, 16 三月 2026 11:40:48 +0800
Subject: [PATCH] yys  更新首页接口

---
 src/main/java/com/ruoyi/home/controller/HomeController.java              |   15 +++
 src/main/resources/mapper/production/ProductProcessMapper.xml            |   32 ++++++
 src/main/java/com/ruoyi/home/annotation/DefaultType.java                 |   22 ++++
 src/main/java/com/ruoyi/home/service/HomeService.java                    |    4 
 src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java      |    6 +
 src/main/java/com/ruoyi/home/aspectj/DefaultTypeAspect.java              |   40 ++++++++
 src/main/java/com/ruoyi/home/dto/processDataProductionStatisticsDto.java |   40 ++++++++
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java           |  141 +++++++++++++++++++++++++++-
 8 files changed, 295 insertions(+), 5 deletions(-)

diff --git a/src/main/java/com/ruoyi/home/annotation/DefaultType.java b/src/main/java/com/ruoyi/home/annotation/DefaultType.java
new file mode 100644
index 0000000..5a83486
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/annotation/DefaultType.java
@@ -0,0 +1,22 @@
+package com.ruoyi.home.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * <br>
+ * 缁熻绫诲瀷榛樿鍊兼敞瑙�
+ * 榛樿 type = 1
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/2/5
+ */
+
+@Target(ElementType.PARAMETER)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface DefaultType {
+
+    String value() default "1";
+}
diff --git a/src/main/java/com/ruoyi/home/aspectj/DefaultTypeAspect.java b/src/main/java/com/ruoyi/home/aspectj/DefaultTypeAspect.java
new file mode 100644
index 0000000..ac473d6
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/aspectj/DefaultTypeAspect.java
@@ -0,0 +1,40 @@
+package com.ruoyi.home.aspectj;
+
+import com.ruoyi.home.annotation.DefaultType;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Parameter;
+
+/**
+ * <br>
+ * 缁熻绫诲瀷榛樿鍊兼敞瑙e垏闈�
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/2/5
+ */
+
+@Aspect
+@Component
+public class DefaultTypeAspect {
+
+    @Around("execution(* com.ruoyi.home.controller.*.*(.., @com.ruoyi.home.annotation.DefaultType (*), ..))")
+    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
+        Object[] args = joinPoint.getArgs();
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Parameter[] parameters = signature.getMethod().getParameters();
+
+        for (int i = 0; i < parameters.length; i++) {
+            DefaultType annotation = parameters[i].getAnnotation(DefaultType.class);
+            if (annotation != null && args[i] == null) {
+                args[i] = Integer.parseInt(annotation.value());
+            }
+        }
+        return joinPoint.proceed(args);
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/home/controller/HomeController.java b/src/main/java/com/ruoyi/home/controller/HomeController.java
index 54fde04..4e01a04 100644
--- a/src/main/java/com/ruoyi/home/controller/HomeController.java
+++ b/src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -5,6 +5,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.annotation.DefaultType;
 import com.ruoyi.home.dto.*;
 import com.ruoyi.home.service.HomeService;
 import com.ruoyi.dto.MapDto;
@@ -170,6 +171,13 @@
         return AjaxResult.success(productionTurnoverDto);
     }
 
+    @GetMapping("/processDataProductionStatistics")
+    @ApiOperation("宸ュ簭鏁版嵁鐢熶骇缁熻鏁版嵁")
+    public AjaxResult processDataProductionStatistics(@DefaultType Integer type,@RequestParam(required = false) List<Long> processIds) {
+        List<processDataProductionStatisticsDto> list = homeService.processDataProductionStatistics(type, processIds);
+        return AjaxResult.success(list);
+    }
+
     /********************************************************璐ㄩ噺绫�*****************************************************/
     @GetMapping("/rawMaterialDetection")
     @ApiOperation("鍘熸潗鏂欐娴�")
@@ -177,6 +185,13 @@
         return AjaxResult.success(homeService.rawMaterialDetection(type));
     }
 
+    @GetMapping("/qualityInspectionStatistics")
+    @ApiOperation("璐ㄩ噺缁熻")
+    public AjaxResult qualityInspectionStatistics(@DefaultType Integer type) {
+        QualityStatisticsDto  dto = homeService.qualityInspectionStatistics(type);
+        return AjaxResult.success(dto);
+    }
+
     @GetMapping("/processDetection")
     @ApiOperation("杩囩▼妫�娴�")
     public AjaxResult processDetection(@RequestParam(value = "type", defaultValue = "1") Integer type){
diff --git a/src/main/java/com/ruoyi/home/dto/processDataProductionStatisticsDto.java b/src/main/java/com/ruoyi/home/dto/processDataProductionStatisticsDto.java
new file mode 100644
index 0000000..09b01a8
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/dto/processDataProductionStatisticsDto.java
@@ -0,0 +1,40 @@
+package com.ruoyi.home.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * <br>
+ * 宸ュ簭鏁版嵁鐢熶骇缁熻鏄庣粏Dto
+ * </br>
+ *
+ * @author deslrey
+ * @version 1.0
+ * @since 2026/2/5
+ */
+
+@Data
+public class processDataProductionStatisticsDto {
+
+    /**
+     * 宸ュ簭鍚嶇О
+     */
+    private String processName;
+
+    /**
+     * 绱鎬绘姇鍏�
+     */
+    private BigDecimal totalInput;
+
+    /**
+     * 绱姞鎬绘姤搴�
+     */
+    private BigDecimal totalScrap;
+
+    /**
+     * 绱姞鎬讳骇鍑�
+     */
+    private BigDecimal totalOutput;
+
+}
diff --git a/src/main/java/com/ruoyi/home/service/HomeService.java b/src/main/java/com/ruoyi/home/service/HomeService.java
index a2e113d..2c3c89b 100644
--- a/src/main/java/com/ruoyi/home/service/HomeService.java
+++ b/src/main/java/com/ruoyi/home/service/HomeService.java
@@ -91,4 +91,8 @@
     List<UnqualifiedProductRankDto> unqualifiedProductRanking();
 
     List<MapDto> unqualifiedProductProcessingAnalysis();
+
+    QualityStatisticsDto qualityInspectionStatistics(Integer type);
+
+    List<processDataProductionStatisticsDto> processDataProductionStatistics(Integer type, List<Long> processIds);
 }
diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index 265cbec..6b75167 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -32,11 +32,7 @@
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.dto.ProductOrderDto;
 import com.ruoyi.production.dto.ProductWorkOrderDto;
-import com.ruoyi.production.mapper.ProductOrderMapper;
-import com.ruoyi.production.mapper.ProductWorkOrderMapper;
-import com.ruoyi.production.mapper.ProductionProductInputMapper;
-import com.ruoyi.production.mapper.ProductionProductOutputMapper;
-import com.ruoyi.production.mapper.SalesLedgerProductionAccountingMapper;
+import com.ruoyi.production.mapper.*;
 import com.ruoyi.production.pojo.ProductWorkOrder;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
@@ -143,6 +139,9 @@
 
     @Autowired
     private QualityUnqualifiedMapper qualityUnqualifiedMapper;
+
+    @Autowired
+    private ProductProcessMapper productProcessMapper;
 
     @Override
     public HomeBusinessDto business() {
@@ -2411,4 +2410,136 @@
         return result;
     }
 
+    @Override
+    public QualityStatisticsDto qualityInspectionStatistics(Integer type) {
+        LocalDate today = LocalDate.now();
+        LocalDate startDate;
+        LocalDate endDate;
+
+        switch (type) {
+            case 1: // 鏈懆
+                startDate = today.with(DayOfWeek.MONDAY);
+                endDate = today.with(DayOfWeek.SUNDAY);
+                break;
+            case 2: // 鏈湀
+                startDate = today.with(TemporalAdjusters.firstDayOfMonth());
+                endDate = today.with(TemporalAdjusters.lastDayOfMonth());
+                break;
+            case 3: // 鏈搴�
+                int currentMonth = today.getMonthValue();
+                int startMonth = ((currentMonth - 1) / 3) * 3 + 1;
+                startDate = LocalDate.of(today.getYear(), startMonth, 1);
+                endDate = startDate.plusMonths(2).with(TemporalAdjusters.lastDayOfMonth());
+                break;
+            default:
+                startDate = today.with(DayOfWeek.MONDAY);
+                endDate = today.with(DayOfWeek.SUNDAY);
+        }
+
+        List<QualityInspect> qualityInspectList = qualityInspectMapper
+                .selectList(new LambdaQueryWrapper<QualityInspect>()
+                        .ge(QualityInspect::getCheckTime, startDate)
+                        .le(QualityInspect::getCheckTime, endDate)
+                        .eq(QualityInspect::getInspectState, 1));
+
+        QualityStatisticsDto dto = new QualityStatisticsDto();
+        dto.setSupplierNum(sumQuantity(qualityInspectList, 0)); // 鍘熸潗鏂�
+        dto.setProcessNum(sumQuantity(qualityInspectList, 1)); // 杩囩▼
+        dto.setFactoryNum(sumQuantity(qualityInspectList, 2)); // 鍑哄巶
+
+        // 4. 澶勭悊鍥捐〃椤� (Item)
+        List<QualityStatisticsItem> itemList = new ArrayList<>();
+
+        Map<QualityInspect, LocalDate> dateMap = qualityInspectList.stream()
+                .collect(Collectors.toMap(
+                        i -> i,
+                        i -> i.getCheckTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()));
+        if (type == 3) {
+            // 瀛e害妯″紡锛氭寜鏈堝垎缁�
+            Map<String, List<QualityInspect>> groupByMonth = qualityInspectList.stream()
+                    .collect(Collectors.groupingBy(i -> {
+                        LocalDate ld = dateMap.get(i);
+                        return ld.format(DateTimeFormatter.ofPattern("yyyy-MM"));
+                    }));
+
+            for (int i = 0; i < 3; i++) {
+                LocalDate monthDate = startDate.plusMonths(i);
+                String monthStr = monthDate.format(DateTimeFormatter.ofPattern("yyyy-MM"));
+                itemList.add(buildItem(monthStr, groupByMonth.getOrDefault(monthStr, new ArrayList<>())));
+            }
+        } else {
+            // 鍛ㄦ垨鏈堟ā寮忥細鎸夊ぉ鍒嗙粍
+            Map<String, List<QualityInspect>> groupByDay = qualityInspectList.stream()
+                    .collect(Collectors.groupingBy(i -> {
+                        LocalDate ld = dateMap.get(i);
+                        return ld.format(DateTimeFormatter.ofPattern("MM/dd"));
+                    }));
+            long days = ChronoUnit.DAYS.between(startDate, endDate);
+            for (int i = 0; i <= days; i++) {
+                LocalDate tempDay = startDate.plusDays(i);
+                String dayStr = tempDay.format(DateTimeFormatter.ofPattern("MM/dd"));
+                itemList.add(buildItem(dayStr, groupByDay.getOrDefault(dayStr, new ArrayList<>())));
+            }
+        }
+
+        dto.setItem(itemList);
+        return dto;
+    }
+
+    private BigDecimal sumQuantity(List<QualityInspect> list, Integer type) {
+        return list.stream()
+                .filter(i -> i.getInspectType().equals(type))
+                .map(QualityInspect::getQuantity)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    private QualityStatisticsItem buildItem(String dateLabel, List<QualityInspect> list) {
+        QualityStatisticsItem item = new QualityStatisticsItem();
+        item.setDate(dateLabel);
+
+        item.setSupplierNum(list.stream().filter(i -> i.getInspectType() == 0).map(QualityInspect::getQuantity)
+                .reduce(BigDecimal.ZERO, BigDecimal::add));
+        item.setProcessNum(list.stream().filter(i -> i.getInspectType() == 1).map(QualityInspect::getQuantity)
+                .reduce(BigDecimal.ZERO, BigDecimal::add));
+        item.setFactoryNum(list.stream().filter(i -> i.getInspectType() == 2).map(QualityInspect::getQuantity)
+                .reduce(BigDecimal.ZERO, BigDecimal::add));
+
+        return item;
+    }
+
+    @Override
+    public List<processDataProductionStatisticsDto> processDataProductionStatistics(Integer type,
+                                                                                    List<Long> processIds) {
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        Long userId = SecurityUtils.isAdmin(loginUser.getUserId()) ? null : loginUser.getUserId();
+
+        LocalDate today = LocalDate.now();
+        LocalDate startDate;
+        LocalDate endDate;
+
+        switch (type) {
+            case 1:
+                startDate = today;
+                endDate = today;
+                break;
+            case 2:
+                startDate = today.with(DayOfWeek.MONDAY);
+                endDate = today.with(DayOfWeek.SUNDAY);
+                break;
+            case 3:
+                startDate = today.with(TemporalAdjusters.firstDayOfMonth());
+                endDate = today.with(TemporalAdjusters.lastDayOfMonth());
+                break;
+            default:
+                startDate = today;
+                endDate = today;
+        }
+
+        LocalDateTime startDateTime = startDate.atStartOfDay();
+        LocalDateTime endDateTime = endDate.atTime(LocalTime.MAX);
+
+        return productProcessMapper.calculateProductionStatistics(startDateTime, endDateTime, userId, processIds);
+    }
+
 }
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java
index f21c308..b2168c3 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java
@@ -3,12 +3,18 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.home.dto.processDataProductionStatisticsDto;
 import com.ruoyi.production.dto.ProductProcessDto;
 import com.ruoyi.production.pojo.ProductProcess;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.time.LocalDateTime;
+import java.util.List;
+
 @Mapper
 public interface ProductProcessMapper extends BaseMapper<ProductProcess> {
     IPage<ProductProcessDto> listPage(Page page,@Param("productProcessDto") ProductProcessDto productProcessDto);
+
+    List<processDataProductionStatisticsDto> calculateProductionStatistics(LocalDateTime startDateTime, LocalDateTime endDateTime, Long userId, List<Long> processIds);
 }
diff --git a/src/main/resources/mapper/production/ProductProcessMapper.xml b/src/main/resources/mapper/production/ProductProcessMapper.xml
index a2292e2..704df24 100644
--- a/src/main/resources/mapper/production/ProductProcessMapper.xml
+++ b/src/main/resources/mapper/production/ProductProcessMapper.xml
@@ -17,4 +17,36 @@
         </where>
         order by p.id asc
     </select>
+    <select id="calculateProductionStatistics" resultType="com.ruoyi.home.dto.processDataProductionStatisticsDto">
+        SELECT
+        pp.name AS processName,
+        SUM((ppo.quantity + ppo.scrap_qty) * pp.salary_quota) AS totalInput,
+        SUM(ppo.scrap_qty * pp.salary_quota) AS totalScrap,
+        SUM(ppo.quantity * pp.salary_quota) AS totalOutput
+        FROM
+        production_product_output ppo
+        INNER JOIN production_product_main ppm ON ppo.product_main_id = ppm.id
+        INNER JOIN product_process_route_item ppri ON ppm.product_process_route_item_id = ppri.id
+        INNER JOIN product_process pp ON ppri.process_id = pp.id
+        <where>
+            <if test="startDateTime != null">
+                AND ppo.create_time &gt;= #{startDateTime}
+            </if>
+            <if test="endDateTime != null">
+                AND ppo.create_time &lt;= #{endDateTime}
+            </if>
+            <if test="userId != null">
+                AND ppm.user_id = #{userId}
+            </if>
+            <if test="processIds != null and processIds.size() > 0">
+                AND pp.id IN
+                <foreach collection="processIds" item="id" open="(" separator="," close=")">
+                    #{id}
+                </foreach>
+            </if>
+        </where>
+        GROUP BY
+        pp.id,
+        pp.name
+    </select>
 </mapper>

--
Gitblit v1.9.3