From 7df528176008256c3b177526274f89d391c61526 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期五, 06 二月 2026 09:12:01 +0800
Subject: [PATCH] Merge branch 'dev_New' into pcdz

---
 src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml                  |   89 +++++----
 src/main/java/com/ruoyi/home/controller/HomeController.java                           |   43 +++-
 src/main/resources/mapper/production/ProductProcessMapper.xml                         |   33 +++
 src/main/java/com/ruoyi/home/annotation/DefaultType.java                              |   22 ++
 src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java |   14 +
 src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java            |    2 
 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/service/impl/HomeServiceImpl.java                        |  172 ++++++++++++++++--
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java         |    2 
 src/main/java/com/ruoyi/project/system/domain/SysMenu.java                            |   12 +
 src/main/java/com/ruoyi/home/service/HomeService.java                                 |    4 
 src/main/resources/mapper/system/SysMenuMapper.xml                                    |   12 
 src/main/resources/application-dev.yml                                                |    3 
 src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java              |    2 
 src/main/java/com/ruoyi/home/dto/processDataProductionStatisticsDto.java              |   40 ++++
 16 files changed, 408 insertions(+), 88 deletions(-)

diff --git a/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
index 102bcc4..20059d5 100644
--- a/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
@@ -10,7 +10,7 @@
     CUSTOMIZATION_STOCK_IN("0", "鍚堟牸鑷畾涔夊叆搴�"),
     PRODUCTION_REPORT_STOCK_IN("2", "鐢熶骇鎶ュ伐-鍏ュ簱"),
     PURCHASE_STOCK_IN("7", "閲囪喘-鍏ュ簱"),
-    QUALITYINSPECT_STOCK_IN("11", "璐ㄦ-鍚堟牸鍏ュ簱"),
+    QUALITYINSPECT_STOCK_IN("6", "璐ㄦ-鍚堟牸鍏ュ簱"),
     DEFECTIVE_PASS("11", "涓嶅悎鏍�-璁╂鏀捐");
 
 
diff --git a/src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java b/src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java
index ab6b041..d221461 100644
--- a/src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java
+++ b/src/main/java/com/ruoyi/common/enums/StockInUnQualifiedRecordTypeEnum.java
@@ -7,7 +7,7 @@
 public enum StockInUnQualifiedRecordTypeEnum implements BaseEnum<String> {
 
 
-    DEFECTIVE_SCRAP("5", "涓嶅悎鏍煎鐞�-鎶ュ簾"),
+    DEFECTIVE_SCRAP("4", "涓嶅悎鏍煎鐞�-鎶ュ簾"),
     PRODUCTION_SCRAP("5", "鐢熶骇鎶ュ伐-鎶ュ簾"),
     CUSTOMIZATION_UNSTOCK_IN("9", "涓嶅悎鏍艰嚜瀹氫箟鍏ュ簱"),
     QUALITYINSPECT_UNSTOCK_IN("12", "璐ㄦ-涓嶅悎鏍煎叆搴�");
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..fcdfc16 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;
@@ -72,21 +73,21 @@
     /********************************************************钀ラ攢閲囪喘绫�**************************************************/
     @GetMapping("/supplierPurchaseRanking")
     @ApiOperation("渚涘簲鍟嗛噰璐帓鍚�")
-    public AjaxResult supplierPurchaseRanking(@RequestParam(value = "type", defaultValue = "1") Integer type) {
+    public AjaxResult supplierPurchaseRanking(@DefaultType Integer type) {
         List<SupplierPurchaseRankingDto> list = homeService.supplierPurchaseRanking(type);
         return AjaxResult.success(list);
     }
 
     @GetMapping("/customerRevenueAnalysis")
     @ApiOperation("瀹㈡埛钀ユ敹璐$尞鏁板�煎垎鏋�")
-    public AjaxResult customerRevenueAnalysis(@RequestParam("customerId") Long customerId, @RequestParam(value = "type", defaultValue = "1") Integer type) {
+    public AjaxResult customerRevenueAnalysis(Long customerId, @DefaultType Integer type) {
         CustomerRevenueAnalysisDto dto = homeService.customerRevenueAnalysis(customerId, type);
         return AjaxResult.success(dto);
     }
 
     @GetMapping("/customerContributionRanking")
     @ApiOperation("瀹㈡埛閲戦璐$尞鎺掑悕")
-    public AjaxResult customerContributionRanking(@RequestParam(value = "type", defaultValue = "1") Integer type) {
+    public AjaxResult customerContributionRanking(@DefaultType Integer type) {
         List<CustomerContributionRankingDto> list = homeService.customerContributionRanking(type);
         return AjaxResult.success(list);
     }
@@ -124,28 +125,28 @@
     /********************************************************鐢熶骇绫�*****************************************************/
     @GetMapping("/inputOutputAnalysis")
     @ApiOperation("鎶曞叆浜у嚭鍒嗘瀽")
-    public AjaxResult inputOutputAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){
+    public AjaxResult inputOutputAnalysis(@DefaultType Integer type){
       List<InputOutputAnalysisDto> list = homeService.inputOutputAnalysis(type);
         return AjaxResult.success(list);
     }
 
     @GetMapping("/processOutputAnalysis")
     @ApiOperation("宸ュ簭浜у嚭鍒嗘瀽")
-    public AjaxResult processOutputAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){
+    public AjaxResult processOutputAnalysis(@DefaultType Integer type){
         List<MapDto> list = homeService.processOutputAnalysis(type);
         return AjaxResult.success(list);
     }
 
     @GetMapping("/workOrderEfficiencyAnalysis")
     @ApiOperation("宸ュ崟鎵ц鏁堢巼鍒嗘瀽")
-    public AjaxResult workOrderEfficiencyAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){
+    public AjaxResult workOrderEfficiencyAnalysis(@DefaultType Integer type){
         List<WorkOrderEfficiencyDto> list = homeService.workOrderEfficiencyAnalysis(type);
         return AjaxResult.success(list);
     }
 
     @GetMapping("/productionAccountingAnalysis")
     @ApiOperation("鐢熶骇鏍哥畻鍒嗘瀽")
-    public AjaxResult productionAccountingAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){
+    public AjaxResult productionAccountingAnalysis(@DefaultType Integer type){
         List<ProductionAccountingDto> list   = homeService.productionAccountingAnalysis(type);
         return AjaxResult.success(list);
     }
@@ -170,22 +171,29 @@
         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("鍘熸潗鏂欐娴�")
-    public AjaxResult rawMaterialDetection(@RequestParam(value = "type", defaultValue = "1") Integer type){
+    public AjaxResult rawMaterialDetection(@DefaultType Integer type){
         return AjaxResult.success(homeService.rawMaterialDetection(type));
     }
 
     @GetMapping("/processDetection")
     @ApiOperation("杩囩▼妫�娴�")
-    public AjaxResult processDetection(@RequestParam(value = "type", defaultValue = "1") Integer type){
+    public AjaxResult processDetection(@DefaultType Integer type){
         return AjaxResult.success(homeService.processDetection(type));
     }
 
     @GetMapping("/factoryDetection")
     @ApiOperation("鎴愬搧鍑哄巶妫�娴�")
-    public AjaxResult factoryDetection(@RequestParam(value = "type", defaultValue = "1") Integer type){
+    public AjaxResult factoryDetection(@DefaultType Integer type){
         return AjaxResult.success(homeService.factoryDetection(type));
     }
 
@@ -232,10 +240,17 @@
         return AjaxResult.success(qualityStatisticsDto);
     }
 
+    @GetMapping("/qualityInspectionStatistics")
+    @ApiOperation("璐ㄩ噺缁熻")
+    public AjaxResult qualityInspectionStatistics(@DefaultType Integer type) {
+       QualityStatisticsDto  dto = homeService.qualityInspectionStatistics(type);
+        return AjaxResult.success(dto);
+    }
+
     /********************************************************璐㈠姟绫�*****************************************************/
     @GetMapping("/incomeExpenseAnalysis")
     @ApiOperation("鏀敹瀵规瘮鍒嗘瀽")
-    public AjaxResult incomeExpenseAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type) {
+    public AjaxResult incomeExpenseAnalysis(@DefaultType Integer type) {
         List<Map<String, Object>> result = homeService.incomeExpenseAnalysis(type);
         return AjaxResult.success(result);
     }
@@ -249,7 +264,7 @@
 
     @GetMapping("/expenseCompositionAnalysis")
     @ApiOperation("鏋勬垚鍒嗘瀽")
-    public AjaxResult expenseCompositionAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type) {
+    public AjaxResult expenseCompositionAnalysis(@DefaultType Integer type) {
         List<MapDto> list = homeService.expenseCompositionAnalysis(type);
         return AjaxResult.success(list);
     }
@@ -271,7 +286,7 @@
     @GetMapping("/statisticsReceivablePayable")
     @Log(title = "搴旀敹搴斾粯缁熻", businessType = BusinessType.OTHER)
     @ApiOperation("搴旀敹搴斾粯缁熻")
-    public AjaxResult statisticsReceivablePayable(StatisticsReceivablePayableDto req, @RequestParam(value = "type", defaultValue = "1") Integer type ) {
+    public AjaxResult statisticsReceivablePayable(StatisticsReceivablePayableDto req, @DefaultType Integer type ) {
         StatisticsReceivablePayableDto statisticsReceivablePayable = homeService.statisticsReceivablePayable(type);
         return AjaxResult.success(statisticsReceivablePayable);
     }
@@ -294,7 +309,7 @@
 
     @GetMapping("/productInOutAnalysis")
     @ApiOperation("浜у搧鍑哄叆搴撳垎鏋�")
-    public AjaxResult productInOutAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){
+    public AjaxResult productInOutAnalysis(@DefaultType Integer type){
         List<Map<String, Object>> result = homeService.productInOutAnalysis(type);
         return AjaxResult.success(result);
     }
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..76e948d 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -33,17 +33,15 @@
 import com.ruoyi.production.dto.ProductOrderDto;
 import com.ruoyi.production.dto.ProductWorkOrderDto;
 import com.ruoyi.production.mapper.ProductOrderMapper;
+import com.ruoyi.production.mapper.ProductProcessMapper;
 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.pojo.ProductProcess;
 import com.ruoyi.production.pojo.ProductWorkOrder;
 import com.ruoyi.project.system.domain.SysDept;
-import com.ruoyi.project.system.domain.SysUser;
-import com.ruoyi.project.system.domain.SysUserDept;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
-import com.ruoyi.project.system.mapper.SysUserDeptMapper;
-import com.ruoyi.project.system.mapper.SysUserMapper;
 import com.ruoyi.purchase.mapper.PaymentRegistrationMapper;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
 import com.ruoyi.purchase.pojo.PaymentRegistration;
@@ -143,6 +141,9 @@
 
     @Autowired
     private QualityUnqualifiedMapper qualityUnqualifiedMapper;
+
+    @Autowired
+    private ProductProcessMapper productProcessMapper;
 
     @Override
     public HomeBusinessDto business() {
@@ -463,8 +464,8 @@
         }
         // 搴旀敹
         List<SalesLedger> salesLedgers = salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>()
-                // .ge(SalesLedger::getEntryDate, startDate)
-                // .lt(SalesLedger::getEntryDate, endDate)
+        // .ge(SalesLedger::getEntryDate, startDate)
+        // .lt(SalesLedger::getEntryDate, endDate)
         );
         // BigDecimal receivableMoney =
         // salesLedgers.stream().map(SalesLedger::getContractAmount).reduce(BigDecimal.ZERO,
@@ -473,8 +474,8 @@
         // 搴斾粯
         List<PurchaseLedger> procurementRecords = purchaseLedgerMapper
                 .selectList(new LambdaQueryWrapper<PurchaseLedger>()
-                        // .ge(PurchaseLedger::getEntryDate, startDate)
-                        // .lt(PurchaseLedger::getEntryDate, endDate)
+                // .ge(PurchaseLedger::getEntryDate, startDate)
+                // .lt(PurchaseLedger::getEntryDate, endDate)
                 );
         // BigDecimal payableMoney =
         // procurementRecords.stream().map(PurchaseLedger::getContractAmount).reduce(BigDecimal.ZERO,
@@ -482,8 +483,8 @@
         BigDecimal payableMoney = sumAmount(procurementRecords, PurchaseLedger::getContractAmount);
         // 棰勬敹
         List<ReceiptPayment> receiptPayments = receiptPaymentMapper.selectList(new LambdaQueryWrapper<ReceiptPayment>()
-                // .ge(ReceiptPayment::getReceiptPaymentDate, startDate)
-                // .lt(ReceiptPayment::getReceiptPaymentDate, endDate)
+        // .ge(ReceiptPayment::getReceiptPaymentDate, startDate)
+        // .lt(ReceiptPayment::getReceiptPaymentDate, endDate)
         );
         // BigDecimal advanceMoney =
         // receiptPayments.stream().map(ReceiptPayment::getReceiptPaymentAmount).reduce(BigDecimal.ZERO,
@@ -492,8 +493,8 @@
         // 棰勪粯
         List<PaymentRegistration> paymentRegistrations = paymentRegistrationMapper
                 .selectList(new LambdaQueryWrapper<PaymentRegistration>()
-                        // .ge(PaymentRegistration::getPaymentDate, startDate)
-                        // .lt(PaymentRegistration::getPaymentDate, endDate)
+                // .ge(PaymentRegistration::getPaymentDate, startDate)
+                // .lt(PaymentRegistration::getPaymentDate, endDate)
                 );
         // BigDecimal prepayMoney =
         // paymentRegistrations.stream().map(PaymentRegistration::getCurrentPaymentAmount).reduce(BigDecimal.ZERO,
@@ -557,7 +558,7 @@
         productionProgressDto.setCompletedOrderDetails(productOrderDtos);
         long totalCount = productOrderDtos.size();
         long count = productOrderDtos.stream().filter(
-                        productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(productOrderDto.getQuantity()) >= 0)
+                productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(productOrderDto.getQuantity()) >= 0)
                 .count();
         long count2 = productOrderDtos.stream()
                 .filter(productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(BigDecimal.ZERO) == 0)
@@ -1729,7 +1730,8 @@
                     BigDecimal finishQty = item.getQuantity() != null ? item.getQuantity() : BigDecimal.ZERO;
                     BigDecimal scrapQty = item.getScrapQty() != null ? item.getScrapQty() : BigDecimal.ZERO;
 
-                    dto.setFinishQuantity(dto.getFinishQuantity() != null ? dto.getFinishQuantity().add(finishQty) : finishQty);
+                    dto.setFinishQuantity(
+                            dto.getFinishQuantity() != null ? dto.getFinishQuantity().add(finishQty) : finishQty);
                 }
             }
 
@@ -1893,7 +1895,6 @@
         return dto;
     }
 
-
     @Override
     public QualityQualifiedAnalysisDto rawMaterialDetection(Integer type) {
         return commonDetection(type, 0);
@@ -1956,7 +1957,7 @@
                 endDate = today.with(DayOfWeek.SUNDAY);
         }
 
-        return new LocalDate[]{startDate, endDate};
+        return new LocalDate[] { startDate, endDate };
     }
 
     private QualityQualifiedAnalysisDto buildQualifiedAnalysis(List<QualityInspect> list) {
@@ -2218,7 +2219,7 @@
         LocalDateTime startTime = today.minusDays(6).atStartOfDay();
         LocalDateTime endTime = today.atTime(23, 59, 59);
 
-        return new LocalDateTime[]{startTime, endTime};
+        return new LocalDateTime[] { startTime, endTime };
     }
 
     @Override
@@ -2353,7 +2354,7 @@
             return new ArrayList<>();
         }
 
-        //  缁熻姣忕澶勭悊缁撴灉鐨勬暟閲�
+        // 缁熻姣忕澶勭悊缁撴灉鐨勬暟閲�
         Map<String, BigDecimal> countMap = new HashMap<>();
         for (QualityUnqualified item : list) {
             if (StringUtils.isEmpty(item.getDealResult()) || item.getQuantity() == null) {
@@ -2366,7 +2367,7 @@
             return new ArrayList<>();
         }
 
-        //  璁$畻鎬绘暟
+        // 璁$畻鎬绘暟
         BigDecimal totalCount = countMap.values()
                 .stream()
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
@@ -2375,7 +2376,7 @@
             return new ArrayList<>();
         }
 
-        //  鎸夋暟閲忓�掑簭鎺掑簭
+        // 鎸夋暟閲忓�掑簭鎺掑簭
         List<Map.Entry<String, BigDecimal>> sortedList = countMap.entrySet()
                 .stream()
                 .sorted((a, b) -> b.getValue().compareTo(a.getValue()))
@@ -2411,4 +2412,135 @@
         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/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index 7a67d50..e24045c 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -207,7 +207,7 @@
                 }
             }else {
                 //鐩存帴鍏ュ簱
-                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productionProductOutput.getQuantity(), StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
+                stockUtils.addStock(productProcessRouteItem.getProductModelId(), productQty, StockInQualifiedRecordTypeEnum.PRODUCTION_REPORT_STOCK_IN.getCode(), productionProductMain.getId());
             }
             /*鏇存柊宸ュ崟鍜岀敓浜ц鍗�*/
             ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
@@ -288,11 +288,17 @@
             ProductOrder productOrder = productOrderMapper.selectById(productWorkOrder.getProductOrderId());
             if (productOrder != null) {
                 BigDecimal orderCompleteQty = productOrder.getCompleteQuantity() == null ? BigDecimal.ZERO : productOrder.getCompleteQuantity();
-                BigDecimal outputQty = productionProductOutput.getQuantity() != null
-                        ? productionProductOutput.getQuantity() : BigDecimal.ZERO;
+                BigDecimal totalQty = productionProductOutput.getQuantity() != null ? productionProductOutput.getQuantity() : BigDecimal.ZERO;
+                BigDecimal scrapQty = productionProductOutput.getScrapQty() != null ? productionProductOutput.getScrapQty() : BigDecimal.ZERO;
 
-                productOrder.setCompleteQuantity(orderCompleteQty.subtract(outputQty));
+                BigDecimal actualQualifiedQty = totalQty.subtract(scrapQty);
+
+                BigDecimal newCompleteQty = orderCompleteQty.subtract(actualQualifiedQty);
+
+                productOrder.setCompleteQuantity(newCompleteQty.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : newCompleteQty);
+
                 productOrder.setEndTime(null);
+
                 productOrderMapper.updateById(productOrder);
             } else {
                 throw new ServiceException("鍏宠仈鐨勭敓浜ц鍗曚笉瀛樺湪");
diff --git a/src/main/java/com/ruoyi/project/system/domain/SysMenu.java b/src/main/java/com/ruoyi/project/system/domain/SysMenu.java
index d6e8b3a..683bdab 100644
--- a/src/main/java/com/ruoyi/project/system/domain/SysMenu.java
+++ b/src/main/java/com/ruoyi/project/system/domain/SysMenu.java
@@ -21,6 +21,14 @@
     /** 鑿滃崟ID */
     private Long menuId;
 
+    public String getAppComponent() {
+        return appComponent;
+    }
+
+    public void setAppComponent(String appComponent) {
+        this.appComponent = appComponent;
+    }
+
     /** 鑿滃崟鍚嶇О */
     private String menuName;
 
@@ -38,6 +46,9 @@
 
     /** 缁勪欢璺緞 */
     private String component;
+
+    /** APP缁勪欢璺緞 */
+    private String appComponent;
 
     /** 璺敱鍙傛暟 */
     private String query;
@@ -260,6 +271,7 @@
             .append("isFrame", getIsFrame())
             .append("IsCache", getIsCache())
             .append("menuType", getMenuType())
+            .append("appComponent", getAppComponent())
             .append("visible", getVisible())
             .append("status ", getStatus())
             .append("perms", getPerms())
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index 09fba03..68b52cb 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -445,7 +445,7 @@
         IPage<SalesLedgerProductDto> salesLedgerProductDtoIPage = salesLedgerProductMapper.listPagePurchaseLedger(page, salesLedgerProduct);
         salesLedgerProductDtoIPage.getRecords().forEach(item -> {
             // 鍒ゆ柇鐘舵��
-            if(item.getTaxInclusiveTotalPrice().compareTo(item.getInvoiceTotal()) == 0){
+            if(item.getTaxInclusiveTotalPrice().compareTo(item.getTicketsTotal()) == 0){
                 item.setStatusName("宸插畬鎴愪粯娆�");
             }else{
                 item.setStatusName("鏈畬鎴愪粯娆�");
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 86f7ec9..40dc00c 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -13,7 +13,8 @@
   addressEnabled: false
   # 楠岃瘉鐮佺被鍨� math 鏁板瓧璁$畻 char 瀛楃楠岃瘉
   captchaType: math
-
+  # 鍗忓悓瀹℃壒缂栧彿鍓嶇紑(閰嶇疆鏂囦欢鍚庣紑鍛藉悕)
+  approvalNumberPrefix: DEV
 # 寮�鍙戠幆澧冮厤缃�
 server:
   # 鏈嶅姟鍣ㄧ殑HTTP绔彛锛岄粯璁や负8080
diff --git a/src/main/resources/mapper/production/ProductProcessMapper.xml b/src/main/resources/mapper/production/ProductProcessMapper.xml
index a2292e2..f8ba285 100644
--- a/src/main/resources/mapper/production/ProductProcessMapper.xml
+++ b/src/main/resources/mapper/production/ProductProcessMapper.xml
@@ -17,4 +17,37 @@
         </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>
diff --git a/src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml b/src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml
index cfd47e5..fcaba49 100644
--- a/src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml
+++ b/src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml
@@ -61,65 +61,70 @@
 
     <select id="invoiceRegistrationProductPage" resultType="com.ruoyi.sales.dto.InvoiceRegistrationProductDto">
         SELECT
-            T1.id   ,
-            T1.sales_ledger_id           ,
-            T1.sales_ledger_product_id   ,
-            T1.invoice_registration_id   ,
-            T1.product_category          ,
-            T1.specification_model       ,
-            T1.unit                      ,
-            T1.quantity                  ,
-            T1.tax_rate                  ,
-            T1.tax_inclusive_unit_price  ,
-            T1.tax_inclusive_total_price ,
-            T1.tax_exclusive_total_price ,
-            T1.invoice_type              ,
-            T1.invoice_num               ,
-            T1.invoice_amount            ,
-            T1.no_invoice_num            ,
-            T1.no_invoice_amount         ,
-            T1.create_time               ,
-            T1.create_user               ,
-            T1.update_time               ,
-            T1.update_user               ,
-            T1.tenant_id,
-            T2.sales_contract_no,
-            T2.customer_contract_no,
-            T2.customer_name,
-            T3.invoice_no,
-            T3.id as invoice_ledger_id,
-            IFNULL(T3.invoice_total,0) AS invoice_total,
-            T3.invoice_person,
-            T3.invoice_date,
-            T4.invoiceFileName,
-            T2.project_name
+        T1.id ,
+        T1.sales_ledger_id ,
+        T1.sales_ledger_product_id ,
+        T1.invoice_registration_id ,
+        T1.product_category ,
+        T1.specification_model ,
+        T1.unit ,
+        T1.quantity ,
+        T1.tax_rate ,
+        T1.tax_inclusive_unit_price ,
+        T1.tax_inclusive_total_price ,
+        T1.tax_exclusive_total_price ,
+        T1.invoice_type ,
+        T1.invoice_num ,
+        T1.invoice_amount ,
+        T1.no_invoice_num ,
+        T1.no_invoice_amount ,
+        T1.create_time ,
+        T1.create_user ,
+        T1.update_time ,
+        T1.update_user ,
+        T1.tenant_id,
+        T2.sales_contract_no,
+        T2.customer_contract_no,
+        T2.customer_name,
+        T3.invoice_no,
+        T3.id as invoice_ledger_id,
+        IFNULL(T3.invoice_total,0) AS invoice_total,
+        T3.invoice_person,
+        T3.invoice_date,
+        T4.invoiceFileName,
+        T2.project_name,
+        u.nick_name as invoicePerson
         FROM invoice_registration_product T1
         LEFT JOIN sales_ledger T2 ON T1.sales_ledger_id = T2.id
+        LEFT JOIN sys_user u ON u.user_id = T1.create_user
         RIGHT JOIN invoice_ledger T3 ON T1.id = T3.invoice_registration_product_id
         LEFT JOIN (
-            SELECT
-                invoice_ledger_id,
-                GROUP_CONCAT( name ORDER BY id ASC SEPARATOR ' | ') AS invoiceFileName
-            FROM invoice_ledger_file GROUP BY invoice_ledger_id
+        SELECT
+        invoice_ledger_id,
+        GROUP_CONCAT( name ORDER BY id ASC SEPARATOR ' | ') AS invoiceFileName
+        FROM invoice_ledger_file GROUP BY invoice_ledger_id
         ) T4 ON T4.invoice_ledger_id = T3.id
         <where>
             <if test="invoiceRegistrationProductDto.searchText != null and invoiceRegistrationProductDto.searchText != '' ">
                 AND (T2.sales_contract_no LIKE CONCAT('%',#{invoiceRegistrationProductDto.searchText},'%')
-                         OR
-                     T2.customer_name LIKE CONCAT('%',#{invoiceRegistrationProductDto.searchText},'%')
-                     )
+                OR
+                T2.customer_name LIKE CONCAT('%',#{invoiceRegistrationProductDto.searchText},'%')
+                )
             </if>
             <if test="invoiceRegistrationProductDto.invoiceDateStart != null and invoiceRegistrationProductDto.invoiceDateStart != ''">
                 AND T3.invoice_date &gt;= str_to_date(#{invoiceRegistrationProductDto.invoiceDateStart}, '%Y-%m-%d')
             </if>
             <if test="invoiceRegistrationProductDto.invoiceDateEnd != null and invoiceRegistrationProductDto.invoiceDateEnd != ''">
-                AND T3.invoice_date &lt; date_add(str_to_date(#{invoiceRegistrationProductDto.invoiceDateEnd}, '%Y-%m-%d'), interval 1 day)
+                AND T3.invoice_date &lt; date_add(str_to_date(#{invoiceRegistrationProductDto.invoiceDateEnd},
+                '%Y-%m-%d'), interval 1 day)
             </if>
             <if test="invoiceRegistrationProductDto.createTimeStart != null ">
-                AND T1.create_time &gt;= date_format(#{invoiceRegistrationProductDto.createTimeStart}, '%Y-%m-%d %H:%i:%s')
+                AND T1.create_time &gt;= date_format(#{invoiceRegistrationProductDto.createTimeStart}, '%Y-%m-%d
+                %H:%i:%s')
             </if>
             <if test="invoiceRegistrationProductDto.createTimeEnd != null ">
-                AND T1.create_time &lt;= date_format(#{invoiceRegistrationProductDto.createTimeStart}, '%Y-%m-%d %H:%i:%s')+interval 1 day
+                AND T1.create_time &lt;= date_format(#{invoiceRegistrationProductDto.createTimeStart}, '%Y-%m-%d
+                %H:%i:%s')+interval 1 day
             </if>
         </where>
         ORDER BY T1.create_time DESC
diff --git a/src/main/resources/mapper/system/SysMenuMapper.xml b/src/main/resources/mapper/system/SysMenuMapper.xml
index a3b6426..aaf0cd4 100644
--- a/src/main/resources/mapper/system/SysMenuMapper.xml
+++ b/src/main/resources/mapper/system/SysMenuMapper.xml
@@ -11,6 +11,7 @@
 		<result property="parentId"       column="parent_id"      />
 		<result property="orderNum"       column="order_num"      />
 		<result property="path"           column="path"           />
+		<result property="appComponent"   column="app_component"  />
 		<result property="component"      column="component"      />
 		<result property="query"          column="query"          />
 		<result property="routeName"      column="route_name"     />
@@ -29,7 +30,7 @@
 	</resultMap>
 
 	<sql id="selectMenuVo">
-        select menu_id, menu_name, parent_id, order_num, path, component, `query`, route_name, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time 
+        select menu_id, menu_name, parent_id, order_num, path,app_component, component, `query`, route_name, is_frame, is_cache, menu_type, visible, status, ifnull(perms,'') as perms, icon, create_time
 		from sys_menu
     </sql>
     
@@ -50,13 +51,13 @@
 	</select>
 	
 	<select id="selectMenuTreeAll" resultMap="SysMenuResult">
-		select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
+		select distinct m.menu_id, m.parent_id, m.menu_name, m.path,m.app_component, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
 		from sys_menu m where m.menu_type in ('M', 'C') and m.status = 0
 		order by m.parent_id, m.order_num
 	</select>
 	
 	<select id="selectMenuListByUserId" parameterType="com.ruoyi.project.system.domain.SysMenu" resultMap="SysMenuResult">
-		select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
+		select distinct m.menu_id, m.parent_id, m.menu_name, m.path,m.app_component, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
 		from sys_menu m
 		left join sys_role_menu rm on m.menu_id = rm.menu_id
 		left join sys_user_role ur on rm.role_id = ur.role_id
@@ -75,7 +76,7 @@
 	</select>
     
     <select id="selectMenuTreeByUserId" parameterType="Long" resultMap="SysMenuResult">
-		select distinct m.menu_id, m.parent_id, m.menu_name, m.path, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
+		select distinct m.menu_id, m.parent_id, m.menu_name, m.path,m.app_component, m.component, m.`query`, m.route_name, m.visible, m.status, ifnull(m.perms,'') as perms, m.is_frame, m.is_cache, m.menu_type, m.icon, m.order_num, m.create_time
 		from sys_menu m
 			 left join sys_role_menu rm on m.menu_id = rm.menu_id
 			 left join sys_user_role ur on rm.role_id = ur.role_id
@@ -141,6 +142,7 @@
 			<if test="orderNum != null">order_num = #{orderNum},</if>
 			<if test="path != null and path != ''">path = #{path},</if>
 			<if test="component != null">component = #{component},</if>
+		    <if test="appComponent != null">app_component = #{appComponent},</if>
 			<if test="query != null">`query` = #{query},</if>
 			<if test="routeName != null">route_name = #{routeName},</if>
 			<if test="isFrame != null and isFrame != ''">is_frame = #{isFrame},</if>
@@ -164,6 +166,7 @@
 		<if test="menuName != null and menuName != ''">menu_name,</if>
 		<if test="orderNum != null">order_num,</if>
 		<if test="path != null and path != ''">path,</if>
+		<if test="appComponent != null and appComponent != ''">app_component,</if>
 		<if test="component != null and component != ''">component,</if>
 		<if test="query != null and query != ''">`query`,</if>
 		<if test="routeName != null">route_name,</if>
@@ -183,6 +186,7 @@
 		<if test="menuName != null and menuName != ''">#{menuName},</if>
 		<if test="orderNum != null">#{orderNum},</if>
 		<if test="path != null and path != ''">#{path},</if>
+		<if test="appComponent != null and appComponent != ''">#{appComponent},</if>
 		<if test="component != null and component != ''">#{component},</if>
 		<if test="query != null and query != ''">#{query},</if>
 		<if test="routeName != null">#{routeName},</if>

--
Gitblit v1.9.3