From 12f0d998913119295fb3e3a851d925e7cf704fe5 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期四, 05 二月 2026 10:24:25 +0800
Subject: [PATCH] feat: 首页工序数据生产统计明细、质量统计接口
---
src/main/java/com/ruoyi/home/controller/HomeController.java | 43 +++++--
src/main/resources/mapper/production/ProductProcessMapper.xml | 33 ++++++
src/main/java/com/ruoyi/home/service/HomeService.java | 4
src/main/java/com/ruoyi/production/mapper/ProductProcessMapper.java | 6 +
src/main/java/com/ruoyi/home/dto/processDataProductionStatisticsDto.java | 40 ++++++++
src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java | 172 ++++++++++++++++++++++++++++++----
6 files changed, 264 insertions(+), 34 deletions(-)
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/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 >= #{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>
--
Gitblit v1.9.3