| | |
| | | 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; |
| | |
| | | |
| | | @Autowired |
| | | private QualityUnqualifiedMapper qualityUnqualifiedMapper; |
| | | |
| | | @Autowired |
| | | private ProductProcessMapper productProcessMapper; |
| | | |
| | | @Override |
| | | public HomeBusinessDto business() { |
| | |
| | | } |
| | | // 应收 |
| | | 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, |
| | |
| | | // 应付 |
| | | 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, |
| | |
| | | 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, |
| | |
| | | // 预付 |
| | | 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, |
| | |
| | | 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) |
| | |
| | | .filter(i -> i.getCreateTime() != null) |
| | | .collect(Collectors.groupingBy( |
| | | i -> i.getCreateTime().toLocalDate().toString(), |
| | | Collectors.reducing(BigDecimal.ZERO, |
| | | i -> i.getQuantity() != null ? i.getQuantity() : BigDecimal.ZERO, |
| | | BigDecimal::add))); |
| | | Collectors.reducing(BigDecimal.ZERO, i -> { |
| | | BigDecimal qty = (i.getQuantity() != null) ? i.getQuantity() : BigDecimal.ZERO; |
| | | BigDecimal scrap = (i.getScrapQty() != null) ? i.getScrapQty() : BigDecimal.ZERO; |
| | | return qty.subtract(scrap); |
| | | }, BigDecimal::add))); |
| | | |
| | | finishMap.forEach((date, qty) -> { |
| | | WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto()); |
| | |
| | | return dto; |
| | | } |
| | | |
| | | |
| | | @Override |
| | | public QualityQualifiedAnalysisDto rawMaterialDetection(Integer type) { |
| | | return commonDetection(type, 0); |
| | |
| | | endDate = today.with(DayOfWeek.SUNDAY); |
| | | } |
| | | |
| | | return new LocalDate[]{startDate, endDate}; |
| | | return new LocalDate[] { startDate, endDate }; |
| | | } |
| | | |
| | | private QualityQualifiedAnalysisDto buildQualifiedAnalysis(List<QualityInspect> list) { |
| | |
| | | LocalDateTime startTime = today.minusDays(6).atStartOfDay(); |
| | | LocalDateTime endTime = today.atTime(23, 59, 59); |
| | | |
| | | return new LocalDateTime[]{startTime, endTime}; |
| | | return new LocalDateTime[] { startTime, endTime }; |
| | | } |
| | | |
| | | @Override |
| | |
| | | return new ArrayList<>(); |
| | | } |
| | | |
| | | // 统计每种处理结果的数量 |
| | | // 统计每种处理结果的数量 |
| | | Map<String, BigDecimal> countMap = new HashMap<>(); |
| | | for (QualityUnqualified item : list) { |
| | | if (StringUtils.isEmpty(item.getDealResult()) || item.getQuantity() == null) { |
| | |
| | | return new ArrayList<>(); |
| | | } |
| | | |
| | | // 计算总数 |
| | | // 计算总数 |
| | | BigDecimal totalCount = countMap.values() |
| | | .stream() |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | |
| | | return new ArrayList<>(); |
| | | } |
| | | |
| | | // 按数量倒序排序 |
| | | // 按数量倒序排序 |
| | | List<Map.Entry<String, BigDecimal>> sortedList = countMap.entrySet() |
| | | .stream() |
| | | .sorted((a, b) -> b.getValue().compareTo(a.getValue())) |
| | |
| | | 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); |
| | | } |
| | | } |