| 2026-02-02 | gongchunyi | ![]() |
| 2026-02-02 | zss | ![]() |
| 2026-02-02 | gongchunyi | ![]() |
| 2026-02-02 | gongchunyi | ![]() |
| 2026-02-02 | maven | ![]() |
| 2026-02-02 | maven | ![]() |
| 2026-02-02 | zss | ![]() |
| 2026-02-02 | zss | ![]() |
| 2026-02-02 | zss | ![]() |
| 2026-02-02 | gongchunyi | ![]() |
| 2026-02-02 | gongchunyi | ![]() |
| 2026-02-02 | zss | ![]() |
| 2026-02-02 | zss | ![]() |
| 2026-02-02 | gongchunyi | ![]() |
| 2026-02-02 | gongchunyi | ![]() |
| 2026-02-02 | liyong | ![]() |
| 2026-02-02 | liyong | ![]() |
src/main/java/com/ruoyi/approve/controller/ApproveProcessController.java
@@ -182,4 +182,14 @@ ExcelUtil<ApproveProcess> util = new ExcelUtil<ApproveProcess>(ApproveProcess.class); util.exportExcel(response, accountExpenses, "åå审æ¹å¯¼åº"); } @ApiOperation(value = "å±é©ä½ä¸å®¡æ¹å¯¼åº") @PostMapping("/exportEight") public void exportEight(HttpServletResponse response) { List<ApproveProcess> accountExpenses = approveProcessService.list(new LambdaQueryWrapper<ApproveProcess>() .eq(ApproveProcess::getApproveDelete, 0) .eq(ApproveProcess::getApproveType, 8)); ExcelUtil<ApproveProcess> util = new ExcelUtil<ApproveProcess>(ApproveProcess.class); util.exportExcel(response, accountExpenses, "å±é©ä½ä¸å®¡æ¹å¯¼åº"); } } src/main/java/com/ruoyi/collaborativeApproval/controller/SealApplicationManagementController.java
@@ -43,7 +43,7 @@ sealApplicationManagementService.save(sealApplicationManagement); //æ¶æ¯éç¥ sysNoticeService.simpleNoticeByUser("ç¨å°å®¡æ¹", "ç³è¯·ç¼å·ï¼"+sealApplicationManagement.getApplicationNum()+"\n" "ç³è¯·ç¼å·ï¼"+sealApplicationManagement.getApplicationNum()+"\t" +"ç³è¯·æ é¢ï¼"+sealApplicationManagement.getTitle(), Arrays.asList(sealApplicationManagement.getApproveUserId()), "/collaborativeApproval/sealManagement?applicationNum="+sealApplicationManagement.getApplicationNum()); src/main/java/com/ruoyi/collaborativeApproval/service/impl/MeetingServiceImpl.java
@@ -182,8 +182,8 @@ if (!userIds.isEmpty()) { sysNoticeService.simpleNoticeByUser( "ä¼è®®éç¥", "ä¼è®®ä¸»é¢ï¼" + application.getTitle() + "\n" + "ä¼è®®æ¶é´ï¼" + application.getStartTime() + "-" + application.getEndTime() + "\n" + "ä¼è®®ä¸»é¢ï¼" + application.getTitle() + "\t" + "ä¼è®®æ¶é´ï¼" + application.getStartTime() + "-" + application.getEndTime() + "\t" + "å起人ï¼" + application.getApplicant(), userIds, "" src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -192,7 +192,7 @@ @GetMapping("/productionAccountingAnalysis") @ApiOperation("çäº§æ ¸ç®åæ") public AjaxResult productionAccountingAnalysis(@RequestParam(value = "type", defaultValue = "1") Integer type){ List<MapDto> list = homeService.productionAccountingAnalysis(type); List<ProductionAccountingDto> list = homeService.productionAccountingAnalysis(type); return AjaxResult.success(list); } @@ -202,6 +202,59 @@ return AjaxResult.success(homeService.orderCount()); } @GetMapping("/rawMaterialDetection") @ApiOperation("åæææ£æµ") public AjaxResult rawMaterialDetection(@RequestParam(value = "type", defaultValue = "1") Integer type){ return AjaxResult.success(homeService.rawMaterialDetection(type)); } @GetMapping("/processDetection") @ApiOperation("è¿ç¨æ£æµ") public AjaxResult processDetection(@RequestParam(value = "type", defaultValue = "1") Integer type){ return AjaxResult.success(homeService.processDetection(type)); } @GetMapping("/factoryDetection") @ApiOperation("æååºåæ£æµ") public AjaxResult factoryDetection(@RequestParam(value = "type", defaultValue = "1") Integer type){ return AjaxResult.success(homeService.factoryDetection(type)); } @GetMapping("/qualityInspectionCount") @ApiOperation("è´¨éæ£éªæ°é") public AjaxResult qualityInspectionCount(){ QualityInspectionCountDto qualityInspectionCountDto = homeService.qualityInspectionCount(); return AjaxResult.success(qualityInspectionCountDto); } @GetMapping("/nonComplianceWarning") @ApiOperation("ä¸åæ ¼é¢è¦") public AjaxResult nonComplianceWarning(){ NonComplianceWarningDto nonComplianceWarningDto = homeService.nonComplianceWarning(); return AjaxResult.success(nonComplianceWarningDto); } @GetMapping("/completedInspectionCount") @ApiOperation("宿æ£éªæ°") public AjaxResult completedInspectionCount(){ List<CompletedInspectionCountDto> list = homeService.completedInspectionCount(); return AjaxResult.success(list); } @GetMapping("/unqualifiedProductRanking") @ApiOperation("ä¸åæ ¼äº§åæå") public AjaxResult unqualifiedProductRanking(){ List<UnqualifiedProductRankDto> list = homeService.unqualifiedProductRanking(); return AjaxResult.success(list); } @GetMapping("/unqualifiedProductProcessingAnalysis") @ApiOperation("ä¸åæ ¼æ£åå¤çåæ") public AjaxResult unqualifiedProductProcessingAnalysis(){ List<MapDto> list = homeService.unqualifiedProductProcessingAnalysis(); return AjaxResult.success(list); } /********************************************************è¥ééè´ç±»**************************************************/ @GetMapping("/business") @Log(title = "éå®-éè´-åºåæ°æ®", businessType = BusinessType.OTHER) src/main/java/com/ruoyi/home/dto/CompletedInspectionCountDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ package com.ruoyi.home.dto; import java.math.BigDecimal; import lombok.Data; /** * <br> * 宿æ£éªæ° * </br> * * @author deslrey * @version 1.0 * @since 2026/2/2 */ @Data public class CompletedInspectionCountDto { /** * æ¥æ */ private String dateStr; /** * åæ ¼æ° */ private BigDecimal qualifiedCount; /** * ä¸åæ ¼æ° */ private BigDecimal unqualifiedCount; /** * åæ ¼ç */ private BigDecimal passRate; } src/main/java/com/ruoyi/home/dto/NonComplianceWarningDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,64 @@ package com.ruoyi.home.dto; import java.math.BigDecimal; import java.util.List; import lombok.Data; /** * <br> * ä¸åæ ¼é¢è¦ * </br> * * @author deslrey * @version 1.0 * @since 2026/2/2 */ @Data public class NonComplianceWarningDto { /** * åææå æ¯ */ private BigDecimal rawMaterialRatio; /** * åæåå æ¯ */ private BigDecimal semiFinishedProductRatio; /** * æåå æ¯ */ private BigDecimal finishedProductRatio; /** * æ°æ® */ private List<Item> children; @Data public static class Item { /** * ç¶ç±»äº§åæ é¢ */ private String parentProductTitle; /** * äº§åæ é¢ */ private String productTitle; /** * æè¿° */ private String description; /** * æ¥æ */ private String date; } } src/main/java/com/ruoyi/home/dto/ProductionAccountingDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,30 @@ package com.ruoyi.home.dto; import java.math.BigDecimal; import lombok.Data; @Data public class ProductionAccountingDto { /** * æ¥æ */ private String dateStr; /** * 宿æ°é */ private Integer numberOfCompleted; /** * éé¢ */ private BigDecimal amount; /** * åæ ¼ç */ private BigDecimal passRate; } src/main/java/com/ruoyi/home/dto/QualityInspectionCountDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ package com.ruoyi.home.dto; import java.math.BigDecimal; import lombok.Data; /** * <br> * æ£éªæ°é * </br> * * @author deslrey * @version 1.0 * @since 2026/2/2 */ @Data public class QualityInspectionCountDto { /** * æ»æ£éªæ° */ private BigDecimal totalCount; /** * æ»æ£éªæ°åæ¯å¢é¿ */ private BigDecimal totalCountGrowthRate; /** * 仿¥å¾ å®ææ° */ private BigDecimal todayPendingCount; /** * 仿¥å¾ 宿æ°åæ¯å¢é¿ */ private BigDecimal todayPendingCountGrowthRate; /** * 仿¥å·²å®ææ° */ private BigDecimal todayCompletedCount; /** * 仿¥å·²å®ææ°åæ¯å¢é¿ */ private BigDecimal todayCompletedCountGrowthRate; } src/main/java/com/ruoyi/home/dto/QualityQualifiedAnalysisDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.ruoyi.home.dto; import lombok.Data; import java.math.BigDecimal; /** * <br> * è´¨éææ åæ ¼åæ * </br> * * @author deslrey * @version 1.0 * @since 2026/2/2 */ @Data public class QualityQualifiedAnalysisDto { /** * åæ ¼æ° */ private int qualifiedCount; /** * ä¸åæ ¼æ° */ private int unqualifiedCount; /** * åæ ¼æ¯ä¾ */ private BigDecimal qualifiedRate; /** * ä¸åæ ¼æ¯ä¾ */ private BigDecimal unqualifiedRate; } src/main/java/com/ruoyi/home/dto/UnqualifiedProductRankDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,39 @@ package com.ruoyi.home.dto; import java.math.BigDecimal; import lombok.Data; /** * <br> * ä¸åæ ¼äº§åæå * </br> * * @author deslrey * @version 1.0 * @since 2026/2/2 */ @Data public class UnqualifiedProductRankDto { /** * 产ååç§° */ private String productName; /** * æ»å®ææ°é */ private BigDecimal totalCount; /** * 已宿æ°é */ private BigDecimal completedCount; /** * åæ ¼ç */ private BigDecimal passRate; } src/main/java/com/ruoyi/home/service/HomeService.java
@@ -31,6 +31,7 @@ Long noticesCount(); ProductionProgressDto productionProgress(); ProductionTurnoverDto workInProcessTurnover(); DeptStaffDistributionDto deptStaffDistribution(); @@ -71,7 +72,23 @@ List<WorkOrderEfficiencyDto> workOrderEfficiencyAnalysis(Integer type); List<MapDto> productionAccountingAnalysis(Integer type); List<ProductionAccountingDto> productionAccountingAnalysis(Integer type); List<MapDto> orderCount(); QualityQualifiedAnalysisDto rawMaterialDetection(Integer type); QualityQualifiedAnalysisDto processDetection(Integer type); QualityQualifiedAnalysisDto factoryDetection(Integer type); QualityInspectionCountDto qualityInspectionCount(); NonComplianceWarningDto nonComplianceWarning(); List<CompletedInspectionCountDto> completedInspectionCount(); List<UnqualifiedProductRankDto> unqualifiedProductRanking(); List<MapDto> unqualifiedProductProcessingAnalysis(); } src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -20,6 +20,7 @@ import com.ruoyi.collaborativeApproval.pojo.Notice; import com.ruoyi.common.enums.ApproveTypeEnum; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.device.mapper.DeviceRepairMapper; import com.ruoyi.device.pojo.DeviceRepair; import com.ruoyi.dto.MapDto; @@ -35,6 +36,7 @@ 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.ProductWorkOrder; import com.ruoyi.project.system.domain.SysDept; import com.ruoyi.project.system.domain.SysUser; @@ -47,7 +49,9 @@ import com.ruoyi.purchase.pojo.PaymentRegistration; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityUnqualifiedMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityUnqualified; import com.ruoyi.sales.mapper.ReceiptPaymentMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; @@ -93,9 +97,6 @@ private StockInventoryMapper stockInventoryMapper; @Autowired private ProcurementRecordMapper procurementRecordStorageMapper; @Autowired private QualityInspectMapper qualityStatisticsMapper; @Autowired @@ -112,32 +113,36 @@ @Autowired private NoticeMapper noticeMapper; @Autowired private ProductOrderMapper productOrderMapper; @Autowired private ProductWorkOrderMapper productWorkOrderMapper; @Autowired private ProductModelMapper productModelMapper; @Autowired private ProductMapper productMapper; @Autowired private StockUtils stockUtils; @Autowired private StaffOnJobMapper staffOnJobMapper; @Autowired private CustomerMapper customerMapper; @Autowired private SupplierManageMapper supplierManageMapper; @Autowired private SysUserMapper sysUserMapper; @Autowired private SysUserDeptMapper sysUserDeptMapper; @Autowired private HomeMapper homeMapper; @Autowired private ProductionProductOutputMapper productionProductOutputMapper; @Autowired private QualityInspectMapper qualityInspectMapper; @Autowired private QualityUnqualifiedMapper qualityUnqualifiedMapper; @Override public HomeBusinessDto business() { @@ -263,8 +268,8 @@ .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal subtract1 = todayContractAmount.subtract(lastYearYesterdayContractAmount); // ä¿®æ¹ï¼ä½¿ç¨ // todayContractAmount è䏿¯ // yesterdayContractAmount // todayContractAmount è䏿¯ // yesterdayContractAmount // æ¥ç¯æ¯ String chain = ""; if (subtract1.compareTo(BigDecimal.ZERO) == 0 @@ -458,8 +463,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, @@ -468,8 +473,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, @@ -477,8 +482,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, @@ -487,8 +492,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, @@ -552,7 +557,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) @@ -1787,10 +1792,10 @@ } @Autowired private com.ruoyi.production.mapper.SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; @Override public List<MapDto> productionAccountingAnalysis(Integer type) { public List<ProductionAccountingDto> productionAccountingAnalysis(Integer type) { LocalDate today = LocalDate.now(); LocalDate startDate; LocalDate endDate = today; @@ -1812,8 +1817,9 @@ break; } String startStr = startDate.atStartOfDay().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); String endStr = endDate.atTime(LocalTime.MAX).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); String startStr = startDate.atStartOfDay().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); String endStr = endDate.plusDays(1).atStartOfDay().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); List<Map<String, Object>> wagesList = salesLedgerProductionAccountingMapper.selectDailyWagesStats(startStr, endStr); @@ -1822,16 +1828,17 @@ return new ArrayList<>(); } List<MapDto> result = new ArrayList<>(); List<ProductionAccountingDto> result = new ArrayList<>(); for (Map<String, Object> map : wagesList) { MapDto dto = new MapDto(); dto.setName((String) map.get("date")); BigDecimal wages = (BigDecimal) map.get("wages"); dto.setValue(wages != null ? wages.toString() : "0"); ProductionAccountingDto dto = new ProductionAccountingDto(); dto.setDateStr(map.get("dateStr").toString()); dto.setNumberOfCompleted(((BigDecimal) map.get("numberOfCompleted")).intValue()); dto.setAmount(map.get("amount") != null ? (BigDecimal) map.get("amount") : BigDecimal.ZERO); dto.setPassRate(map.get("passRate") != null ? (BigDecimal) map.get("passRate") : BigDecimal.ZERO); result.add(dto); } result.sort(Comparator.comparing(MapDto::getName)); result.sort(Comparator.comparing(ProductionAccountingDto::getDateStr)); return result; } @@ -1885,4 +1892,522 @@ return dto; } } @Override public QualityQualifiedAnalysisDto rawMaterialDetection(Integer type) { return commonDetection(type, 0); } @Override public QualityQualifiedAnalysisDto processDetection(Integer type) { return commonDetection(type, 1); } @Override public QualityQualifiedAnalysisDto factoryDetection(Integer type) { return commonDetection(type, 2); } private QualityQualifiedAnalysisDto commonDetection(Integer type, Integer inspectType) { LocalDate[] range = calcDateRange(type); LocalDate startDate = range[0]; LocalDate endDate = range[1]; String startStr = startDate.atStartOfDay() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); String endStr = endDate.atTime(LocalTime.MAX) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); List<QualityInspect> list = qualityInspectMapper.selectList( new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectType, inspectType) .eq(QualityInspect::getInspectState, 1) .ge(QualityInspect::getCheckTime, startStr) .le(QualityInspect::getCheckTime, endStr)); return buildQualifiedAnalysis(list); } private LocalDate[] calcDateRange(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 = LocalDate.of(today.getYear(), startMonth + 2, 1) .with(TemporalAdjusters.lastDayOfMonth()); break; default: startDate = today.with(DayOfWeek.MONDAY); endDate = today.with(DayOfWeek.SUNDAY); } return new LocalDate[]{startDate, endDate}; } private QualityQualifiedAnalysisDto buildQualifiedAnalysis(List<QualityInspect> list) { List<QualityQualifiedAnalysisDto> result = new ArrayList<>(); QualityQualifiedAnalysisDto dto = new QualityQualifiedAnalysisDto(); if (CollectionUtils.isEmpty(list)) { dto.setQualifiedCount(0); dto.setUnqualifiedCount(0); dto.setQualifiedRate(BigDecimal.ZERO.setScale(2)); dto.setUnqualifiedRate(BigDecimal.ZERO.setScale(2)); return dto; } BigDecimal qualifiedCount = BigDecimal.ZERO; BigDecimal unqualifiedCount = BigDecimal.ZERO; for (QualityInspect item : list) { if ("åæ ¼".equals(item.getCheckResult())) { qualifiedCount = qualifiedCount.add(item.getQuantity()); } else { unqualifiedCount = unqualifiedCount.add(item.getQuantity()); } } BigDecimal totalCount = qualifiedCount.add(unqualifiedCount); dto.setQualifiedCount(qualifiedCount.intValue()); dto.setUnqualifiedCount(unqualifiedCount.intValue()); if (totalCount.compareTo(BigDecimal.ZERO) == 0) { dto.setQualifiedRate(BigDecimal.ZERO.setScale(2)); dto.setUnqualifiedRate(BigDecimal.ZERO.setScale(2)); return dto; } BigDecimal hundred = BigDecimal.valueOf(100); dto.setQualifiedRate(qualifiedCount.divide(totalCount, 4, RoundingMode.HALF_UP) .multiply(hundred) .setScale(2, RoundingMode.HALF_UP)); dto.setUnqualifiedRate(unqualifiedCount.divide(totalCount, 4, RoundingMode.HALF_UP) .multiply(hundred) .setScale(2, RoundingMode.HALF_UP)); return dto; } @Override public QualityInspectionCountDto qualityInspectionCount() { // è·åä»å¤©çå¼å§åç»ææ¥æ,å 嫿¶åç§ LocalDateTime todayStart = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0); LocalDateTime todayEnd = LocalDateTime.now().withHour(23).withMinute(59).withSecond(59).withNano(0); // è·ååä¸å¤©çå¼å§åç»ææ¥æ,å 嫿¶åç§ LocalDateTime prevStart = todayStart.minusDays(1); LocalDateTime prevEnd = todayEnd.minusDays(1); // æ¥è¯¢åºæªæ¢ä»æ¥çæ»æ£éªæ° List<QualityInspect> todayList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() // .eq(QualityInspect::getInspectState, 1) .le(QualityInspect::getCheckTime, todayEnd)); // æ¥è¯¢åºæªæ¢åä¸å¤©çæ»æ£éªæ° List<QualityInspect> prevList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() // .eq(QualityInspect::getInspectState, 1) .le(QualityInspect::getCheckTime, prevEnd)); // 计ç®ä»æ¥çæ»æ£éªæ° BigDecimal todayCount = todayList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®åä¸å¤©çæ»æ£éªæ° BigDecimal prevCount = prevList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®ä»æ¥ç¸å¯¹æ¨å¤©çä¸ä¸ªæ»æ¯å¢é¿ BigDecimal growthRate = calcGrowthRate(todayCount, prevCount); // 计ç®ä»å¤©çå¾ å®ææ°é List<QualityInspect> todayPendingList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 0) .ge(QualityInspect::getCheckTime, todayStart) .le(QualityInspect::getCheckTime, todayEnd)); // 计ç®åä¸å¤©çå¾ å®ææ°é List<QualityInspect> prevPendingList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 0) .ge(QualityInspect::getCheckTime, prevStart) .le(QualityInspect::getCheckTime, prevEnd)); // 计ç®ä»å¤©çå¾ å®ææ°é BigDecimal todayPendingCount = todayPendingList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®åä¸å¤©çå¾ å®ææ°é BigDecimal prevPendingCount = prevPendingList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®ä»å¤©çå¾ å®ææ°éç¸å¯¹æ¨å¤©çä¸ä¸ªåæ¯å¢é¿ BigDecimal todayPendingCountGrowthRate = calcGrowthRate(todayPendingCount, prevPendingCount); // 计ç®ä»å¤©ç已宿æ°é List<QualityInspect> todayCompletedList = qualityInspectMapper .selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 1) .ge(QualityInspect::getCheckTime, todayStart) .le(QualityInspect::getCheckTime, todayEnd)); // 计ç®åä¸å¤©ç已宿æ°é List<QualityInspect> prevCompletedList = qualityInspectMapper .selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 1) .ge(QualityInspect::getCheckTime, prevStart) .le(QualityInspect::getCheckTime, prevEnd)); // 计ç®ä»å¤©ç已宿æ°é BigDecimal todayCompletedCount = todayCompletedList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®åä¸å¤©ç已宿æ°é BigDecimal prevCompletedCount = prevCompletedList.stream() .map(QualityInspect::getQuantity) .reduce(BigDecimal.ZERO, BigDecimal::add); // 计ç®ä»å¤©ç已宿æ°éç¸å¯¹æ¨å¤©çä¸ä¸ªåæ¯å¢é¿ BigDecimal todayCompletedCountGrowthRate = calcGrowthRate(todayCompletedCount, prevCompletedCount); QualityInspectionCountDto dto = new QualityInspectionCountDto(); dto.setTotalCount(todayCount); dto.setTotalCountGrowthRate(growthRate); dto.setTodayPendingCount(todayPendingCount); dto.setTodayPendingCountGrowthRate(todayPendingCountGrowthRate); dto.setTodayCompletedCount(todayCompletedCount); dto.setTodayCompletedCountGrowthRate(todayCompletedCountGrowthRate); return dto; } private BigDecimal calcGrowthRate(BigDecimal today, BigDecimal prev) { if (prev == null || prev.compareTo(BigDecimal.ZERO) == 0) { return BigDecimal.ZERO.setScale(2); } return today.subtract(prev) .divide(prev, 4, RoundingMode.HALF_UP) .multiply(BigDecimal.valueOf(100)) .setScale(2, RoundingMode.HALF_UP); } @Override public NonComplianceWarningDto nonComplianceWarning() { // è¿ä¸å¤©æ¶é´åºé´ LocalDateTime[] range = lastSevenDaysRange(); LocalDateTime startTime = range[0]; LocalDateTime endTime = range[1]; // æ¥è¯¢è¿ä¸å¤©å·²å¤çä¸åæ ¼æ°æ® List<QualityUnqualified> list = qualityUnqualifiedMapper.selectList( new LambdaQueryWrapper<QualityUnqualified>() .eq(QualityUnqualified::getInspectState, 1) .ge(QualityUnqualified::getCheckTime, startTime) .le(QualityUnqualified::getCheckTime, endTime)); NonComplianceWarningDto dto = new NonComplianceWarningDto(); if (CollectionUtils.isEmpty(list)) { dto.setRawMaterialRatio(BigDecimal.ZERO); dto.setSemiFinishedProductRatio(BigDecimal.ZERO); dto.setFinishedProductRatio(BigDecimal.ZERO); dto.setChildren(new ArrayList<>()); return dto; } // æ¥è¯¢ææäº§å List<Product> products = productMapper.selectList(null); Map<Long, Product> productMap = products.stream() .collect(Collectors.toMap(Product::getId, p -> p)); BigDecimal rawMaterialCount = BigDecimal.ZERO; BigDecimal semiFinishedCount = BigDecimal.ZERO; BigDecimal finishedCount = BigDecimal.ZERO; List<NonComplianceWarningDto.Item> children = new ArrayList<>(); for (QualityUnqualified item : list) { BigDecimal quantity = item.getQuantity(); Long productId = item.getProductId(); Product product = productMap.get(productId); if (product == null) { continue; } // æ¾å°äº§å大类 Product parent = product.getParentId() == null ? product : productMap.get(product.getParentId()); if (parent == null) { continue; } switch (parent.getProductName()) { case "åææ": rawMaterialCount = rawMaterialCount.add(quantity); break; case "åæå": semiFinishedCount = semiFinishedCount.add(quantity); break; case "æå": finishedCount = finishedCount.add(quantity); break; default: break; } // ç»è£ æç» NonComplianceWarningDto.Item child = new NonComplianceWarningDto.Item(); // child.setProductTitle(item.getProductName()); child.setParentProductTitle(parent.getProductName()); child.setProductTitle(item.getProductName()); child.setDescription(item.getDefectivePhenomena()); child.setDate(formatDate(item.getCheckTime())); children.add(child); } BigDecimal total = rawMaterialCount .add(semiFinishedCount) .add(finishedCount); dto.setRawMaterialRatio(calcRate(rawMaterialCount, total)); dto.setSemiFinishedProductRatio(calcRate(semiFinishedCount, total)); dto.setFinishedProductRatio(calcRate(finishedCount, total)); dto.setChildren(children); return dto; } private BigDecimal calcRate(BigDecimal part, BigDecimal total) { if (total == null || total.compareTo(BigDecimal.ZERO) == 0) { return BigDecimal.ZERO.setScale(2); } return part.divide(total, 4, RoundingMode.HALF_UP) .multiply(BigDecimal.valueOf(100)) .setScale(2, RoundingMode.HALF_UP); } public static String formatDate(Date date) { if (date == null) { return null; } return date.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate() .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); } /** * è·åè¿ä¸å¤©çæ¶é´åºé´ï¼å å«ä»å¤©ï¼ */ public static LocalDateTime[] lastSevenDaysRange() { LocalDate today = LocalDate.now(); LocalDateTime startTime = today.minusDays(6).atStartOfDay(); LocalDateTime endTime = today.atTime(23, 59, 59); return new LocalDateTime[]{startTime, endTime}; } @Override public List<CompletedInspectionCountDto> completedInspectionCount() { // è¿ä¸å¤©æ¶é´åºé´ LocalDateTime[] range = lastSevenDaysRange(); LocalDateTime startTime = range[0]; LocalDateTime endTime = range[1]; // æ¥è¯¢è¿ä¸å¤©å·²å®æçæ£éªæ°æ® List<QualityInspect> list = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 1) .ge(QualityInspect::getCheckTime, startTime) .le(QualityInspect::getCheckTime, endTime)); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd"); Map<String, CompletedInspectionCountDto> resultMap = new LinkedHashMap<>(); for (int i = 6; i >= 0; i--) { LocalDate date = LocalDate.now().minusDays(i); String dateStr = date.format(formatter); CompletedInspectionCountDto dto = new CompletedInspectionCountDto(); dto.setDateStr(dateStr); dto.setQualifiedCount(BigDecimal.ZERO); dto.setUnqualifiedCount(BigDecimal.ZERO); dto.setPassRate(BigDecimal.ZERO); resultMap.put(dateStr, dto); } // ç´¯å åæ ¼ / ä¸åæ ¼æ°é for (QualityInspect item : list) { String dateStr = item.getCheckTime() .toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate() .format(formatter); CompletedInspectionCountDto dto = resultMap.get(dateStr); if (dto == null) { continue; } BigDecimal quantity = item.getQuantity(); if ("åæ ¼".equals(item.getCheckResult())) { dto.setQualifiedCount(dto.getQualifiedCount().add(quantity)); } else { dto.setUnqualifiedCount(dto.getUnqualifiedCount().add(quantity)); } } // 计ç®åæ ¼ç for (CompletedInspectionCountDto dto : resultMap.values()) { BigDecimal total = dto.getQualifiedCount().add(dto.getUnqualifiedCount()); dto.setPassRate(calcRate(dto.getQualifiedCount(), total)); } return new ArrayList<>(resultMap.values()); } @Override public List<UnqualifiedProductRankDto> unqualifiedProductRanking() { List<QualityInspect> list = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getInspectState, 1)); if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); } Map<Long, String> productNameMap = productMapper.selectList(null) .stream() .collect(Collectors.toMap(Product::getId, Product::getProductName)); Map<Long, List<QualityInspect>> groupMap = list.stream() .collect(Collectors.groupingBy(QualityInspect::getProductId)); List<UnqualifiedProductRankDto> resultList = new ArrayList<>(); for (Map.Entry<Long, List<QualityInspect>> entry : groupMap.entrySet()) { Long productId = entry.getKey(); List<QualityInspect> items = entry.getValue(); BigDecimal totalCount = BigDecimal.ZERO; BigDecimal qualifiedCount = BigDecimal.ZERO; BigDecimal unqualifiedCount = BigDecimal.ZERO; for (QualityInspect item : items) { BigDecimal qty = item.getQuantity(); totalCount = totalCount.add(qty); if ("åæ ¼".equals(item.getCheckResult())) { qualifiedCount = qualifiedCount.add(qty); } else { unqualifiedCount = unqualifiedCount.add(qty); } } if (totalCount.compareTo(BigDecimal.ZERO) == 0) { continue; } BigDecimal passRate = qualifiedCount .divide(totalCount, 4, RoundingMode.HALF_UP) .multiply(new BigDecimal("100")) .setScale(2, RoundingMode.HALF_UP); UnqualifiedProductRankDto dto = new UnqualifiedProductRankDto(); dto.setProductName(productNameMap.get(productId)); dto.setTotalCount(totalCount); dto.setCompletedCount(qualifiedCount); dto.setPassRate(passRate); resultList.add(dto); } resultList.sort(Comparator.comparing(UnqualifiedProductRankDto::getPassRate)); return resultList.stream().limit(5).collect(Collectors.toList()); } @Override public List<MapDto> unqualifiedProductProcessingAnalysis() { List<QualityUnqualified> list = qualityUnqualifiedMapper.selectList(null); if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(); } // ç»è®¡æ¯ç§å¤çç»æçæ°é Map<String, BigDecimal> countMap = new HashMap<>(); for (QualityUnqualified item : list) { if (StringUtils.isEmpty(item.getDealResult()) || item.getQuantity() == null) { continue; } countMap.merge(item.getDealResult(), item.getQuantity(), BigDecimal::add); } if (countMap.isEmpty()) { return new ArrayList<>(); } // è®¡ç®æ»æ° BigDecimal totalCount = countMap.values() .stream() .reduce(BigDecimal.ZERO, BigDecimal::add); if (totalCount.compareTo(BigDecimal.ZERO) == 0) { return new ArrayList<>(); } // ææ°éååºæåº List<Map.Entry<String, BigDecimal>> sortedList = countMap.entrySet() .stream() .sorted((a, b) -> b.getValue().compareTo(a.getValue())) .collect(Collectors.toList()); List<MapDto> result = new ArrayList<>(); int limit = Math.min(3, sortedList.size()); BigDecimal otherCount = BigDecimal.ZERO; for (int i = 0; i < sortedList.size(); i++) { Map.Entry<String, BigDecimal> entry = sortedList.get(i); if (i < limit) { MapDto dto = new MapDto(); dto.setName(entry.getKey()); dto.setValue(entry.getValue().setScale(2, RoundingMode.HALF_UP).toPlainString()); dto.setRate(calcRate(entry.getValue(), totalCount).toString()); result.add(dto); } else { otherCount = otherCount.add(entry.getValue()); } } if (otherCount.compareTo(BigDecimal.ZERO) > 0) { MapDto otherDto = new MapDto(); otherDto.setName("å ¶ä»"); otherDto.setValue(otherCount.setScale(2, RoundingMode.HALF_UP).toPlainString()); otherDto.setRate(calcRate(otherCount, totalCount).toString()); result.add(otherDto); } return result; } } src/main/java/com/ruoyi/measuringinstrumentledger/controller/MeasuringInstrumentLedgerRecordController.java
@@ -25,7 +25,7 @@ */ @RestController @Api(tags = "计éå¨å ·å°è´¦è®°å½") @RequestMapping("Record") @RequestMapping("/measuringInstrumentLedgerRecord") public class MeasuringInstrumentLedgerRecordController extends BaseController { @Autowired src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -50,7 +50,8 @@ @DeleteMapping("/delete") @Transactional(rollbackFor = Exception.class) public R delete(@RequestBody ProductionProductMainDto productionProductMainDto) { return R.ok(productionProductMainService.removeProductMain(productionProductMainDto)); return R.ok(productionProductMainService.removeProductMain(productionProductMainDto.getId())); } src/main/java/com/ruoyi/production/dto/ProductProcessRouteItemDto.java
@@ -24,4 +24,6 @@ private String productName; private String model; private Boolean isComplete; } src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -40,4 +40,7 @@ @ApiModelProperty(value = "æ¥åºæ°é") private BigDecimal scrapQty; @ApiModelProperty(value = "å·¥åç±»å æ£å¸¸ /è¿å·¥è¿ä¿®") private String workOrderType; } src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
@@ -3,17 +3,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.production.dto.ProcessRouteItemDto; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductionProductMainDto; import com.ruoyi.production.pojo.ProductionProductMain; import java.util.List; public interface ProductionProductMainService extends IService<ProductionProductMain> { IPage<ProductionProductMainDto> listPageProductionProductMainDto(Page page, ProductionProductMainDto productionProductMainDto); Boolean addProductMain(ProductionProductMainDto productionProductMainDto); Boolean removeProductMain(ProductionProductMainDto productionProductMainDto); Boolean removeProductMain(Long id); } src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
@@ -6,9 +6,11 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.dto.ProductProcessRouteItemDto; import com.ruoyi.production.dto.ProductionProductMainDto; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.production.service.ProductProcessRouteItemService; import com.ruoyi.production.service.ProductionProductMainService; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; @@ -20,6 +22,7 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -34,6 +37,7 @@ public class ProductProcessRouteItemServiceImpl extends ServiceImpl<ProductProcessRouteItemMapper, ProductProcessRouteItem> implements ProductProcessRouteItemService { private ProductionProductMainService productionProductMainService; private ProductProcessRouteItemMapper productProcessRouteItemMapper; private ProductionProductMainMapper productionProductMainMapper; @@ -73,6 +77,9 @@ if (productWorkOrder == null) { throw new RuntimeException("å é¤å¤±è´¥ï¼æªæ¾å°å ³èçç产工å"); } if (BigDecimal.ZERO.compareTo(productWorkOrder.getCompleteQuantity()) < 0) { throw new RuntimeException("å é¤å¤±è´¥ï¼è¯¥å·¥åå·²å¼å§ç产ï¼è¯·å å é¤ç产æ¥å·¥"); } Long workOrderId = productWorkOrder.getId(); Long productOrderId = productWorkOrder.getProductOrderId(); // æ¥è¯¢ç产主表 @@ -83,21 +90,19 @@ if (!productionProductMains.isEmpty()) { // æ¹éå é¤å表 for (ProductionProductMain main : productionProductMains) { Long mainId = main.getId(); // å é¤æå ¥ productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>() .eq(ProductionProductInput::getProductMainId, mainId)); // å é¤äº§åº productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>() .eq(ProductionProductOutput::getProductMainId, mainId)); // å é¤è´¨æ£ qualityInspectMapper.delete(new LambdaQueryWrapper<QualityInspect>() .eq(QualityInspect::getProductMainId, mainId)); productionProductMainService.removeProductMain(main.getId()); // Long mainId = main.getId(); // // å é¤æå ¥ // productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>() // .eq(ProductionProductInput::getProductMainId, mainId)); // // å é¤äº§åº // productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>() // .eq(ProductionProductOutput::getProductMainId, mainId)); // // å é¤è´¨æ£ // qualityInspectMapper.delete(new LambdaQueryWrapper<QualityInspect>() // .eq(QualityInspect::getProductMainId, mainId)); } } // å 餿¥å·¥ï¼çäº§ä¸»è¡¨ï¼ productionProductMainMapper.delete(new LambdaQueryWrapper<ProductionProductMain>() .eq(ProductionProductMain::getWorkOrderId, workOrderId)); // æ¥è¯¢è®¢å + å 餿 ¸ç® ProductOrder productOrder = productOrderMapper.selectById(productOrderId); if (productOrder != null && productOrder.getSalesLedgerId() != null) { src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -240,7 +240,7 @@ } //妿æ¥åºæ°é>0,éè¦è¿å ¥æ¥åºçåºå if (ObjectUtils.isNotEmpty(dto.getScrapQty())) { if (BigDecimal.ZERO.compareTo(dto.getScrapQty()) > 0) { if (dto.getScrapQty().compareTo(BigDecimal.ZERO) > 0) { stockUtils.addUnStock(productModel.getId(), dto.getScrapQty(), StockUnQualifiedRecordTypeEnum.PRODUCTION_SCRAP.getCode(), productionProductMain.getId()); } } @@ -248,8 +248,8 @@ } @Override public Boolean removeProductMain(ProductionProductMainDto dto) { ProductionProductMain productionProductMain = productionProductMainMapper.selectById(dto.getId()); public Boolean removeProductMain(Long id) { ProductionProductMain productionProductMain = productionProductMainMapper.selectById(id); //该æ¥å·¥å¯¹åºçå·¥èºè·¯çº¿è¯¦æ ProductProcessRouteItem productProcessRouteItem = productProcessRouteItemMapper.selectById(productionProductMain.getProductProcessRouteItemId()); ProductionProductOutput productionProductOutput = productionProductOutputMapper.selectList(Wrappers.<ProductionProductOutput>lambdaQuery().eq(ProductionProductOutput::getProductMainId, productionProductMain.getId())).get(0); @@ -271,7 +271,6 @@ productOrder.setEndTime(null); productOrderMapper.updateById(productOrder); } /*å é¤äº§åº*/ //å é¤è´¨æ£ qualityInspectMapper.selectList( new LambdaQueryWrapper<QualityInspect>() src/main/java/com/ruoyi/quality/controller/QualityReportController.java
@@ -74,8 +74,8 @@ */ @ApiOperation("è·åçç¹æ£æµææ ç»è®¡") @GetMapping("/getTopParameters") public AjaxResult getTopParameters(@RequestParam("inspectType") Integer inspectType) { return AjaxResult.success(qualityReportService.getTopParameters(inspectType)); public AjaxResult getTopParameters(@RequestParam("modelType") Integer modelType) { return AjaxResult.success(qualityReportService.getTopParameters(modelType)); } } src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
@@ -40,9 +40,11 @@ */ @DeleteMapping("/del") public AjaxResult delQualityUnqualified(@RequestBody List<Integer> ids) { if(CollectionUtils.isEmpty(ids)){ return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); } qualityUnqualifiedService.listByIds(ids).stream().forEach(qualityUnqualified -> { if (qualityUnqualified.getInspectState()==1){ throw new RuntimeException("该ä¸åæ ¼æ°æ®å·²ç»å¤çæ æ³å é¤!"); } }); return AjaxResult.success(qualityUnqualifiedService.removeBatchByIds(ids)); } src/main/java/com/ruoyi/quality/dto/QualityInspectStatDto.java
@@ -13,8 +13,8 @@ private static final long serialVersionUID = 1L; @ApiModelProperty(value = "ç±»å«(0:åæææ£éª;1:è¿ç¨æ£éª;2:åºåæ£éª)") private Integer inspectType; @ApiModelProperty(value = "ç±»å«(0:åææ;1:åæå;2:æå)") private Integer modelType; @ApiModelProperty(value = "æ»æ°é") private BigDecimal totalCount; src/main/java/com/ruoyi/quality/dto/QualityMonthlyDetailDto.java
@@ -18,12 +18,12 @@ @ApiModelProperty(value = "æä»½") private String month; @ApiModelProperty(value = "åæææ£éªå®ææ°") @ApiModelProperty(value = "åææ") private BigDecimal rawMaterialCount; @ApiModelProperty(value = "è¿ç¨æ£éªå®ææ°") @ApiModelProperty(value = "åæå") private BigDecimal processCount; @ApiModelProperty(value = "åºåæ£éªå®ææ°") @ApiModelProperty(value = "æå") private BigDecimal outgoingCount; } src/main/java/com/ruoyi/quality/dto/QualityMonthlyPassRateDto.java
@@ -18,8 +18,8 @@ @ApiModelProperty(value = "æä»½(䏿, äºæ...)") private String month; @ApiModelProperty(value = "ç±»å«(0:åæææ£éª;1:è¿ç¨æ£éª;2:åºåæ£éª)") private Integer inspectType; @ApiModelProperty(value = "ç±»å«(0:åææ;1:åæå;2:æå)") private Integer modelType; @ApiModelProperty(value = "æ»æ°é") private BigDecimal totalCount; src/main/java/com/ruoyi/quality/dto/QualityMonthlyPassRateWrapperDto.java
@@ -17,12 +17,12 @@ @ApiModelProperty(value = "æä»½") private String month; @ApiModelProperty(value = "åæææ£éªæ°æ®") @ApiModelProperty(value = "åææ") private QualityPassRateDto rawMaterial; @ApiModelProperty(value = "è¿ç¨æ£éªæ°æ®") @ApiModelProperty(value = "åæå") private QualityPassRateDto process; @ApiModelProperty(value = "åºåæ£éªæ°æ®") @ApiModelProperty(value = "æå") private QualityPassRateDto outgoing; } src/main/java/com/ruoyi/quality/dto/QualityPassRateDto.java
@@ -16,8 +16,8 @@ private static final long serialVersionUID = 1L; @ApiModelProperty(value = "ç±»å«(0:åæææ£éª;1:è¿ç¨æ£éª;2:åºåæ£éª)") private Integer inspectType; @ApiModelProperty(value = "ç±»å«(0:åææ;1:åæå;2:æå)") private Integer modelType; @ApiModelProperty(value = "æ»æ°é") private BigDecimal totalCount; src/main/java/com/ruoyi/quality/mapper/QualityInspectMapper.java
@@ -3,15 +3,10 @@ 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.quality.dto.*; import com.ruoyi.quality.pojo.QualityInspect; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import com.ruoyi.quality.dto.QualityInspectStatDto; import com.ruoyi.quality.dto.QualityPassRateDto; import com.ruoyi.quality.dto.QualityMonthlyPassRateDto; import com.ruoyi.quality.dto.QualityMonthlyDetailDto; import com.ruoyi.quality.dto.QualityParameterStatDto; import java.util.List; @@ -56,5 +51,5 @@ /** * è·åçç¹æ£æµææ Top 4 + å ¶ä» */ List<QualityParameterStatDto> getTopParameters(@Param("inspectType") Integer inspectType); List<QualityParameterStatDto> getTopParameters(@Param("modelType") Integer modelType); } src/main/java/com/ruoyi/quality/service/impl/QualityReportServiceImpl.java
@@ -1,13 +1,10 @@ package com.ruoyi.quality.service.impl; import com.ruoyi.basic.service.IProductModelService; import com.ruoyi.basic.service.IProductService; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.quality.dto.QualityPassRateDto; import com.ruoyi.quality.dto.QualityInspectStatDto; import com.ruoyi.quality.dto.QualityMonthlyPassRateDto; import com.ruoyi.quality.dto.QualityMonthlyDetailDto; import com.ruoyi.quality.dto.QualityParameterStatDto; import com.ruoyi.quality.dto.QualityMonthlyPassRateWrapperDto; import com.ruoyi.quality.dto.QualityTopParameterDto; import com.ruoyi.production.service.ProductOrderService; import com.ruoyi.quality.dto.*; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.service.QualityReportService; import org.springframework.beans.BeanUtils; @@ -59,11 +56,11 @@ QualityPassRateDto passRateDto = new QualityPassRateDto(); BeanUtils.copyProperties(dto, passRateDto); if (dto.getInspectType() == 0) { if (dto.getModelType() == 0) { wrapper.setRawMaterial(passRateDto); } else if (dto.getInspectType() == 1) { } else if (dto.getModelType() == 1) { wrapper.setProcess(passRateDto); } else if (dto.getInspectType() == 2) { } else if (dto.getModelType() == 2) { wrapper.setOutgoing(passRateDto); } } @@ -90,11 +87,11 @@ } @Override public QualityTopParameterDto getTopParameters(Integer inspectType) { if (inspectType == null) { public QualityTopParameterDto getTopParameters(Integer modelType) { if (modelType == null) { return new QualityTopParameterDto(); } List<QualityParameterStatDto> list = qualityInspectMapper.getTopParameters(inspectType); List<QualityParameterStatDto> list = qualityInspectMapper.getTopParameters(modelType); BigDecimal total = list.stream() .map(QualityParameterStatDto::getCount) src/main/java/com/ruoyi/safe/controller/SafeHazardController.java
@@ -50,7 +50,7 @@ @ApiOperation("å é¤å±é©æºå°è´¦") @DeleteMapping("/{ids}") public R delSafeHazard(@RequestBody List<Integer> ids) { return R.ok(safeHazardService.removeBatchByIds(ids)); return R.ok(safeHazardService.delSafeHazard(ids)); } } src/main/java/com/ruoyi/safe/service/SafeHazardService.java
@@ -5,6 +5,8 @@ import com.ruoyi.safe.pojo.SafeHazard; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; /** * <p> * å®å ¨ç产--å±é©æºå°è´¦ æå¡ç±» @@ -16,4 +18,6 @@ public interface SafeHazardService extends IService<SafeHazard> { IPage<SafeHazard> pageSafeHazard(Page page, SafeHazard safeHazard); int delSafeHazard(List<Integer> ids); } src/main/java/com/ruoyi/safe/service/impl/SafeHazardServiceImpl.java
@@ -1,13 +1,18 @@ package com.ruoyi.safe.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.safe.mapper.SafeHazardRecordMapper; import com.ruoyi.safe.pojo.SafeHazard; import com.ruoyi.safe.mapper.SafeHazardMapper; import com.ruoyi.safe.pojo.SafeHazardRecord; import com.ruoyi.safe.service.SafeHazardService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * <p> @@ -23,8 +28,24 @@ @Autowired private SafeHazardMapper safeHazardMapper; @Autowired private SafeHazardRecordMapper safeHazardRecordMapper; @Override public IPage<SafeHazard> pageSafeHazard(Page page, SafeHazard safeHazard) { return safeHazardMapper.pageSafeHazard(page, safeHazard); } @Override public int delSafeHazard(List<Integer> ids) { //夿æ¯å¦ææ£å¨é¢ç¨çå±é©æº List<SafeHazardRecord> safeHazardRecords = safeHazardRecordMapper.selectList(Wrappers.<SafeHazardRecord>lambdaQuery() .in(SafeHazardRecord::getSafeHazardId, ids) .isNull(SafeHazardRecord::getReturnUserId)); if (safeHazardRecords.size()>0){ throw new RuntimeException("该å±é©æºå·²ç»é¢ç¨,æ æ³å é¤,çå½è¿ä¹ååè¿è¡å é¤!"); } safeHazardMapper.deleteBatchIds(ids); return 0; } } src/main/java/com/ruoyi/safe/service/impl/SafeHiddenServiceImpl.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.project.system.domain.SysNotice; import com.ruoyi.project.system.mapper.SysNoticeMapper; import com.ruoyi.project.system.service.ISysDictDataService; import com.ruoyi.project.system.service.ISysNoticeService; import com.ruoyi.project.system.service.impl.SysNoticeServiceImpl; import com.ruoyi.safe.dto.SafeHiddenDto; @@ -38,6 +39,9 @@ @Autowired private ISysNoticeService sysNoticeService; @Autowired private ISysDictDataService sysDictDataService; @Override public IPage<SafeHiddenDto> pageSafeHidden(Page page, SafeHiddenDto safeHiddenDto) { @@ -51,12 +55,14 @@ String no = "YH" + String.format("%s%03d", datePrefix, safeHidden.getId()); safeHidden.setHiddenCode(no); safeHiddenMapper.updateById(safeHidden); //è·åéæ£ç±»åçåå ¸ String type = sysDictDataService.selectDictLabel("hidden_danger_type", safeHidden.getType()); //æ¶æ¯éç¥ sysNoticeService.simpleNoticeByUser("éæ£ææ¥ä¸æ¥æ´æ¹", "éæ£ç±»åï¼"+safeHidden.getType()+"\n"+ "鿣é£é©ç级ï¼"+safeHidden.getRiskLevel()+"\n"+ "éæ£å ·ä½ä½ç½®ï¼"+safeHidden.getLocation()+"\n"+ "鿣æè¿°ï¼"+safeHidden.getHiddenDesc()+"\n"+ "éæ£ç±»åï¼"+type+"\t"+ "鿣é£é©ç级ï¼"+safeHidden.getRiskLevel()+"\t"+ "éæ£å ·ä½ä½ç½®ï¼"+safeHidden.getLocation()+"\t"+ "鿣æè¿°ï¼"+safeHidden.getHiddenDesc()+"\t"+ "æ´æ¹å®ææé(æ¥æ)ï¼"+safeHidden.getRectifyTime(), Arrays.asList(Long.valueOf(safeHidden.getRectifyUserId())), "/safeProduction/dangerInvestigation?id=" + safeHidden.getId()); src/main/java/com/ruoyi/safe/service/impl/SafeTrainingServiceImpl.java
@@ -67,7 +67,7 @@ @Override public int addOrUpdate(SafeTraining safeTraining) { if (ObjectUtils.isNull(safeTraining.getId())) { String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd")); String datePrefix ="KC-"+ LocalDate.now().format(DateTimeFormatter.ofPattern("yyMMdd")); // æ¥è¯¢ä»æ¥å·²åå¨çæå¤§è¯¾ç¨ç¼å· QueryWrapper<SafeTraining> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("course_code", datePrefix) @@ -87,7 +87,7 @@ } } // çæå®æ´ç课ç¨ç¼å· String no = "KC-" + String.format("%s%03d", datePrefix, sequenceNumber); String no = String.format("%s%03d", datePrefix, sequenceNumber); safeTraining.setCourseCode(no); } //æ ¹æ®æ¶é´å¤æå¹è®ç¶æ src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -173,6 +173,14 @@ product.setTempNoInvoiceNum(product.getNoInvoiceNum()); product.setRegister(SecurityUtils.getLoginUser().getUser().getNickName()); product.setRegisterDate(LocalDateTime.now()); // åè´§ä¿¡æ¯ ShippingInfo shippingInfo = shippingInfoMapper.selectOne(new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getSalesLedgerProductId, product.getId()) .orderByDesc(ShippingInfo::getCreateTime) .last("limit 1")); if(shippingInfo != null){ product.setShippingStatus(shippingInfo.getStatus()); } } // 3.æ¥è¯¢ä¸ä¼ æä»¶ @@ -542,7 +550,7 @@ } // å é¤åè´§å°è´¦è®°å½ List<ShippingInfo> shippingInfos = shippingInfoMapper.selectList(new LambdaQueryWrapper<ShippingInfo>() .eq(ShippingInfo::getSalesLedgerId, idList)); .in(ShippingInfo::getSalesLedgerId, idList)); if(CollectionUtils.isNotEmpty(shippingInfos)){ shippingInfoServiceImpl.delete(shippingInfos.stream().map(ShippingInfo::getId).collect(Collectors.toList())); } src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml
@@ -15,11 +15,13 @@ pp.name as process_name, pm.model, pm.unit, p.product_name p.product_name, case when pwo.complete_quantity>0 then true else false end as is_complete from product_process_route_item ppri left join product_model pm on ppri.product_model_id = pm.id left join product p on pm.product_id = p.id left join product_process pp on pp.id = ppri.process_id left join product_work_order pwo on pwo.product_process_route_item_id = ppri.id where ppri.product_order_id = #{orderId} order by ppri.drag_sort </select> src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -26,7 +26,11 @@ pm.unit, p.product_name AS productName, po.nps_no AS productOrderNpsNo, ROUND(pwo.complete_quantity / pwo.plan_quantity * 100, 2) AS completionStatus ROUND(pwo.complete_quantity / pwo.plan_quantity * 100, 2) AS completionStatus, CASE WHEN pwo.work_order_no LIKE 'FG%' THEN 'è¿å·¥è¿ä¿®' ELSE 'æ£å¸¸' END AS work_order_type FROM product_work_order pwo LEFT JOIN product_process_route_item ppri ON ppri.id = pwo.product_process_route_item_id src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
@@ -88,18 +88,23 @@ </select> <select id="selectDailyWagesStats" resultType="java.util.Map"> SELECT DATE_FORMAT(scheduling_date, '%Y-%m-%d') as date, SUM(finished_num * work_hours) as wages FROM sales_ledger_production_accounting WHERE scheduling_date >= #{startDate} AND scheduling_date <= #{endDate} GROUP BY scheduling_date SELECT DATE(ppout.create_time) AS dateStr, SUM(ppout.quantity - IFNULL(ppout.scrap_qty, 0)) AS numberOfCompleted, SUM((ppout.quantity - IFNULL(ppout.scrap_qty, 0)) * IFNULL(pp.salary_quota, 0)) AS amount, ROUND( SUM(ppout.quantity - IFNULL(ppout.scrap_qty, 0)) * 100 / NULLIF(SUM(ppout.quantity), 0), 2 ) AS passRate FROM production_product_output ppout LEFT JOIN production_product_main ppm ON ppm.id = ppout.product_main_id LEFT JOIN product_process_route_item ppri ON ppri.id = ppm.product_process_route_item_id LEFT JOIN product_process pp ON pp.id = ppri.process_id WHERE ppout.create_time >= #{startDate} AND ppout.create_time < #{endDate} GROUP BY DATE(ppout.create_time) ORDER BY DATE(ppout.create_time); </select> </mapper> src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -56,84 +56,123 @@ </delete> <select id="getInspectStatistics" resultType="com.ruoyi.quality.dto.QualityInspectStatDto"> SELECT 0 AS inspectType, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 1), 0) + COALESCE((SELECT SUM(quantity) FROM quality_unqualified WHERE inspect_type = 0), 0) AS totalCount, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 1 AND quality_inspect_id != 0 AND quality_inspect_id IS NOT NULL), 0) + COALESCE((SELECT SUM(quantity) FROM quality_unqualified WHERE inspect_type = 0), 0) AS completedCount UNION ALL SELECT 1 AS inspectType, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 2 AND sales_ledger_product_id = 0), 0) AS totalCount, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 2 AND sales_ledger_product_id = 0 AND quality_inspect_id != 0 AND quality_inspect_id IS NOT NULL), 0) AS completedCount UNION ALL SELECT 2 AS inspectType, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 2 AND sales_ledger_product_id != 0), 0) AS totalCount, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 2 AND sales_ledger_product_id != 0 AND quality_inspect_id != 0 AND quality_inspect_id IS NOT NULL), 0) AS completedCount SELECT CASE pp.product_name WHEN 'åææ' THEN 0 WHEN 'åæå' THEN 1 WHEN 'æå' THEN 2 END AS modelType, IFNULL(SUM(qi.quantity), 0) AS totalCount, IFNULL(SUM(CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END), 0) AS completedCount FROM product p INNER JOIN product pp ON p.parent_id = pp.id LEFT JOIN product_model pm ON pm.product_id = p.id LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id WHERE pp.product_name IN ('åææ', 'åæå', 'æå') GROUP BY pp.product_name </select> <select id="getPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto"> SELECT t.inspectType, COALESCE(prs.totalCount, 0) AS totalCount, COALESCE(qi.completedCount, 0) AS completedCount, COALESCE(qi.qualifiedCount, 0) AS qualifiedCount, COALESCE(qi.unqualifiedCount, 0) AS unqualifiedCount, IF(COALESCE(prs.totalCount, 0) = 0, 0, ROUND(COALESCE(qi.completedCount, 0) / prs.totalCount * 100, 2)) AS completionRate, IF(COALESCE(qi.completedCount, 0) = 0, 0, ROUND(COALESCE(qi.qualifiedCount, 0) / qi.completedCount * 100, 2)) AS passRate FROM (SELECT 0 AS inspectType SELECT t.modelType, COALESCE(SUM(qi.quantity), 0) AS totalCount, COALESCE(SUM( CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END ), 0) AS completedCount, COALESCE(SUM( CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'åæ ¼' THEN qi.quantity ELSE 0 END ), 0) AS qualifiedCount, COALESCE(SUM( CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'ä¸åæ ¼' THEN qi.quantity ELSE 0 END ), 0) AS unqualifiedCount, /* 宿ç */ IF(COALESCE(SUM(qi.quantity), 0) = 0, 0, ROUND( COALESCE(SUM( CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END ), 0) / SUM(qi.quantity) * 100, 2) ) AS completionRate, /* åæ ¼ç */ IF(COALESCE(SUM( CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END ), 0) = 0, 0, ROUND( COALESCE(SUM( CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'åæ ¼' THEN qi.quantity ELSE 0 END ), 0) / COALESCE(SUM( CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END ), 0) * 100, 2) ) AS passRate FROM (SELECT 0 AS modelType UNION ALL SELECT 1 UNION ALL SELECT 2) t LEFT JOIN (SELECT inspect_type, SUM(quantity) AS completedCount, SUM(IF(check_result = 'åæ ¼', quantity, 0)) AS qualifiedCount, SUM(IF(check_result = 'ä¸åæ ¼', quantity, 0)) AS unqualifiedCount FROM quality_inspect WHERE inspect_state = 1 GROUP BY inspect_type) qi ON t.inspectType = qi.inspect_type LEFT JOIN (SELECT 0 AS inspectType, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 1), 0) + COALESCE((SELECT SUM(quantity) FROM quality_unqualified WHERE inspect_type = 0), 0) AS totalCount UNION ALL SELECT 1 AS inspectType, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 2 AND sales_ledger_product_id = 0), 0) AS totalCount UNION ALL SELECT 2 AS inspectType, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 2 AND sales_ledger_product_id != 0), 0) AS totalCount) prs ON t.inspectType = prs.inspectType ORDER BY t.inspectType; LEFT JOIN product p ON 1 = 1 LEFT JOIN product pp ON p.parent_id = pp.id LEFT JOIN product_model pm ON pm.product_id = p.id LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id AND ( (pp.product_name = 'åææ' AND t.modelType = 0) OR (pp.product_name = 'åæå' AND t.modelType = 1) OR (pp.product_name = 'æå' AND t.modelType = 2) ) GROUP BY t.modelType ORDER BY t.modelType; </select> <select id="getMonthlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityMonthlyPassRateDto"> WITH RECURSIVE @@ -142,50 +181,15 @@ SELECT month_num + 1 FROM months WHERE month_num < 12), types AS (SELECT 0 AS inspectType types AS (SELECT 0 AS modelType UNION ALL SELECT 1 UNION ALL SELECT 2), base AS (SELECT m.month_num, t.inspectType FROM months m, types t), qi_data AS (SELECT MONTH(check_time) AS month_num, inspect_type, SUM(quantity) AS completedCount, SUM(CASE WHEN check_result = 'åæ ¼' THEN quantity ELSE 0 END) AS qualifiedCount, SUM(CASE WHEN check_result = 'ä¸åæ ¼' THEN quantity ELSE 0 END) AS unqualifiedCount FROM quality_inspect WHERE YEAR(check_time) = #{year} AND inspect_state = 1 GROUP BY MONTH(check_time), inspect_type), prs_data AS (SELECT month_num, inspectType, SUM(totalCount) AS totalCount FROM (SELECT MONTH(create_time) AS month_num, 0 AS inspectType, inbound_num AS totalCount FROM procurement_record_storage WHERE type = 1 AND YEAR(create_time) = #{year} UNION ALL SELECT MONTH(check_time) AS month_num, 0 AS inspectType, quantity AS totalCount FROM quality_unqualified WHERE inspect_type = 0 AND YEAR(check_time) = #{year} UNION ALL SELECT MONTH(create_time) AS month_num, CASE WHEN sales_ledger_product_id = 0 THEN 1 ELSE 2 END AS inspectType, inbound_num AS totalCount FROM procurement_record_storage WHERE type = 2 AND YEAR(create_time) = #{year}) sub GROUP BY month_num, inspectType) base AS (SELECT m.month_num, t.modelType FROM months m CROSS JOIN types t) SELECT CASE b.month_num WHEN 1 THEN '䏿' WHEN 2 THEN 'äºæ' @@ -199,96 +203,121 @@ WHEN 10 THEN 'åæ' WHEN 11 THEN 'å䏿' WHEN 12 THEN 'åäºæ' END AS month, b.inspectType, COALESCE(p.totalCount, 0) AS totalCount, COALESCE(q.completedCount, 0) AS completedCount, COALESCE(q.qualifiedCount, 0) AS qualifiedCount, COALESCE(q.unqualifiedCount, 0) AS unqualifiedCount, CASE WHEN COALESCE(p.totalCount, 0) = 0 THEN 0 ELSE ROUND(COALESCE(q.completedCount, 0) / p.totalCount * 100, 2) END AS completionRate, CASE WHEN COALESCE(q.completedCount, 0) = 0 THEN 0 ELSE ROUND(COALESCE(q.qualifiedCount, 0) / q.completedCount * 100, 2) END AS passRate END AS month, b.modelType, /* æ»æ°é */ COALESCE(SUM(qi.quantity), 0) AS totalCount, /* 已宿 */ COALESCE(SUM( CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END ), 0) AS completedCount, /* åæ ¼ */ COALESCE(SUM( CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'åæ ¼' THEN qi.quantity ELSE 0 END ), 0) AS qualifiedCount, /* ä¸åæ ¼ */ COALESCE(SUM( CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'ä¸åæ ¼' THEN qi.quantity ELSE 0 END ), 0) AS unqualifiedCount, /* 宿ç */ IF(COALESCE(SUM(qi.quantity), 0) = 0, 0, ROUND( COALESCE(SUM( CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END ), 0) / SUM(qi.quantity) * 100, 2 ) ) AS completionRate, /* åæ ¼ç */ IF(COALESCE(SUM( CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END ), 0) = 0, 0, ROUND( COALESCE(SUM( CASE WHEN qi.inspect_state = 1 AND qi.check_result = 'åæ ¼' THEN qi.quantity ELSE 0 END ), 0) / COALESCE(SUM( CASE WHEN qi.inspect_state = 1 THEN qi.quantity ELSE 0 END ), 0) * 100, 2 ) ) AS passRate FROM base b LEFT JOIN qi_data q ON b.month_num = q.month_num AND b.inspectType = q.inspect_type LEFT JOIN prs_data p ON b.month_num = p.month_num AND b.inspectType = p.inspectType ORDER BY b.month_num, b.inspectType LEFT JOIN product p ON 1 = 1 LEFT JOIN product pp ON p.parent_id = pp.id LEFT JOIN product_model pm ON pm.product_id = p.id LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id AND YEAR(qi.check_time) = #{year} AND MONTH(qi.check_time) = b.month_num AND ( (pp.product_name = 'åææ' AND b.modelType = 0) OR (pp.product_name = 'åæå' AND b.modelType = 1) OR (pp.product_name = 'æå' AND b.modelType = 2) ) GROUP BY b.month_num, b.modelType ORDER BY b.month_num, b.modelType; </select> <select id="getYearlyPassRateStatistics" resultType="com.ruoyi.quality.dto.QualityPassRateDto"> SELECT t.inspectType, COALESCE(prs.totalCount, 0) AS totalCount, COALESCE(qi.completedCount, 0) AS completedCount, COALESCE(qi.qualifiedCount, 0) AS qualifiedCount, COALESCE(qi.unqualifiedCount, 0) AS unqualifiedCount, CASE WHEN COALESCE(prs.totalCount, 0) = 0 THEN 0 ELSE ROUND(COALESCE(qi.completedCount, 0) / prs.totalCount * 100, 2) END AS completionRate, CASE WHEN COALESCE(qi.completedCount, 0) = 0 THEN 0 ELSE ROUND(COALESCE(qi.qualifiedCount, 0) / qi.completedCount * 100, 2) END AS passRate FROM (SELECT 0 AS inspectType SELECT t.modelType, COALESCE(SUM( CASE WHEN pp.product_name = 'åææ' AND t.modelType = 0 THEN qi.quantity WHEN pp.product_name = 'åæå' AND t.modelType = 1 THEN qi.quantity WHEN pp.product_name = 'æå' AND t.modelType = 2 THEN qi.quantity ELSE 0 END ), 0) AS totalCount FROM (SELECT 0 AS modelType UNION ALL SELECT 1 UNION ALL SELECT 2) t LEFT JOIN (SELECT inspect_type, SUM(quantity) AS completedCount, SUM(CASE WHEN check_result = 'åæ ¼' THEN quantity ELSE 0 END) AS qualifiedCount, SUM(CASE WHEN check_result = 'ä¸åæ ¼' THEN quantity ELSE 0 END) AS unqualifiedCount FROM quality_inspect WHERE YEAR(check_time) = #{year} AND inspect_state = 1 GROUP BY inspect_type) qi ON t.inspectType = qi.inspect_type LEFT JOIN (SELECT 0 AS inspectType, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 1 AND YEAR(create_time) = #{year}), 0) + COALESCE((SELECT SUM(quantity) FROM quality_unqualified WHERE inspect_type = 0 AND YEAR(check_time) = #{year}), 0) AS totalCount UNION ALL SELECT 1 AS inspectType, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 2 AND sales_ledger_product_id = 0 AND YEAR(create_time) = #{year}), 0) AS totalCount UNION ALL SELECT 2 AS inspectType, COALESCE((SELECT SUM(inbound_num) FROM procurement_record_storage WHERE type = 2 AND sales_ledger_product_id != 0 AND YEAR(create_time) = #{year}), 0) AS totalCount) prs ON t.inspectType = prs.inspectType ORDER BY t.inspectType LEFT JOIN product p ON 1 = 1 LEFT JOIN product pp ON p.parent_id = pp.id LEFT JOIN product_model pm ON pm.product_id = p.id LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id AND YEAR(qi.check_time) = #{year} AND qi.inspect_state = 1 AND qi.check_result = 'åæ ¼' GROUP BY t.modelType ORDER BY t.modelType; </select> <select id="getMonthlyCompletionDetails" resultType="com.ruoyi.quality.dto.QualityMonthlyDetailDto"> WITH RECURSIVE months AS (SELECT 1 AS month_num UNION ALL SELECT month_num + 1 FROM months WHERE month_num < 12), qi_data AS (SELECT MONTH(check_time) AS month_num, SUM(CASE WHEN inspect_type = 0 THEN quantity ELSE 0 END) AS rawMaterialCount, SUM(CASE WHEN inspect_type = 1 THEN quantity ELSE 0 END) AS processCount, SUM(CASE WHEN inspect_type = 2 THEN quantity ELSE 0 END) AS outgoingCount FROM quality_inspect WHERE YEAR(check_time) = #{year} AND inspect_state = 1 GROUP BY MONTH(check_time)) WITH RECURSIVE months AS (SELECT 1 AS month_num UNION ALL SELECT month_num + 1 FROM months WHERE month_num < 12) SELECT CASE m.month_num WHEN 1 THEN '䏿' WHEN 2 THEN 'äºæ' @@ -302,21 +331,66 @@ WHEN 10 THEN 'åæ' WHEN 11 THEN 'å䏿' WHEN 12 THEN 'åäºæ' END AS month, COALESCE(d.rawMaterialCount, 0) AS rawMaterialCount, COALESCE(d.processCount, 0) AS processCount, COALESCE(d.outgoingCount, 0) AS outgoingCount END AS month, /* åææ */ COALESCE(SUM( CASE WHEN pp.product_name = 'åææ' THEN qi.quantity ELSE 0 END ), 0) AS rawMaterialCount, /* åæå */ COALESCE(SUM( CASE WHEN pp.product_name = 'åæå' THEN qi.quantity ELSE 0 END ), 0) AS processCount, /* æå */ COALESCE(SUM( CASE WHEN pp.product_name = 'æå' THEN qi.quantity ELSE 0 END ), 0) AS outgoingCount FROM months m LEFT JOIN qi_data d ON m.month_num = d.month_num ORDER BY m.month_num LEFT JOIN product p ON 1 = 1 LEFT JOIN product pp ON p.parent_id = pp.id LEFT JOIN product_model pm ON pm.product_id = p.id LEFT JOIN quality_inspect qi ON qi.product_model_id = pm.id AND qi.inspect_state = 1 AND YEAR(qi.check_time) = #{year} AND MONTH(qi.check_time) = m.month_num GROUP BY m.month_num ORDER BY m.month_num; </select> <select id="getTopParameters" resultType="com.ruoyi.quality.dto.QualityParameterStatDto"> WITH parameter_counts AS (SELECT qip.parameter_item AS name, SUM(COALESCE(qi.quantity, 0)) AS count FROM quality_inspect qi JOIN quality_inspect_param qip ON qip.inspect_id = qi.id WHERE qi.inspect_type = #{inspectType} WITH parameter_counts AS (SELECT qip.parameter_item AS name, COUNT(*) AS count FROM quality_inspect_param qip JOIN quality_inspect qi ON qip.inspect_id = qi.id JOIN product p ON qi.product_id = p.id JOIN product pp ON p.parent_id = pp.id WHERE qi.inspect_state = 1 AND ( (#{modelType} = 1 AND pp.product_name = 'åææ') OR (#{modelType} = 2 AND pp.product_name = 'åæå') OR (#{modelType} = 3 AND pp.product_name = 'æå') ) GROUP BY qip.parameter_item), ranked AS (SELECT name, count, @@ -324,6 +398,7 @@ FROM parameter_counts), total AS (SELECT SUM(count) AS total_count FROM parameter_counts) SELECT name, count, CASE @@ -333,14 +408,18 @@ FROM (SELECT name, count, rn FROM ranked WHERE rn <= 4 UNION ALL SELECT 'å ¶ä»æ£æµ' AS name, SUM(count) AS count, 5 AS rn FROM ranked WHERE rn > 4 HAVING SUM(count) > 0) t ORDER BY rn WHERE rn > 4 HAVING SUM(count) > 0) t ORDER BY rn; </select> </mapper> src/main/resources/mapper/safe/SafeTrainingMapper.xml
@@ -38,6 +38,7 @@ left join safe_training_details std on std.safe_training_id = st.id left join sys_user su on st.assessment_user_id = su.user_id where st.state = #{c.state} GROUP BY st.id <if test="c.placeTraining != null and c.placeTraining != ''"> and st.place_training like concat('%', #{c.placeTraining}, '%') </if>