| src/main/java/com/ruoyi/home/controller/HomeController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/home/dto/processDataProductionStatisticsDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/home/service/HomeService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/production/ProductProcessMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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); } 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; } 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); } 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() { @@ -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); } } @@ -1892,7 +1894,6 @@ } return dto; } @Override public QualityQualifiedAnalysisDto rawMaterialDetection(Integer type) { @@ -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) { // å£åº¦æ¨¡å¼ï¼ææåç» 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); } } 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); } 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 >= #{startDateTime} </if> <if test="endDateTime != null"> AND ppo.create_time <= #{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>