| | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.ruoyi.account.mapper.AccountExpenseMapper; |
| | | import com.ruoyi.account.mapper.AccountIncomeMapper; |
| | | import com.ruoyi.account.pojo.AccountExpense; |
| | | import com.ruoyi.home.mapper.HomeMapper; |
| | | import com.ruoyi.account.mapper.AccountExpenseMapper; |
| | | import com.ruoyi.approve.mapper.ApproveProcessMapper; |
| | | import com.ruoyi.approve.pojo.ApproveProcess; |
| | | import com.ruoyi.basic.mapper.CustomerMapper; |
| | | import com.ruoyi.basic.mapper.ProductMapper; |
| | | import com.ruoyi.basic.mapper.ProductModelMapper; |
| | | import com.ruoyi.basic.mapper.SupplierManageMapper; |
| | | import com.ruoyi.basic.pojo.Customer; |
| | | import com.ruoyi.basic.pojo.Product; |
| | |
| | | import com.ruoyi.dto.MapDto; |
| | | import com.ruoyi.framework.security.LoginUser; |
| | | import com.ruoyi.home.dto.*; |
| | | import com.ruoyi.home.mapper.HomeMapper; |
| | | import com.ruoyi.home.service.HomeService; |
| | | import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; |
| | | import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; |
| | | import com.ruoyi.procurementrecord.utils.StockUtils; |
| | | 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.production.bean.dto.ProductionProductOutputDto; |
| | | import com.ruoyi.production.mapper.*; |
| | | import com.ruoyi.project.system.domain.SysDept; |
| | | import com.ruoyi.project.system.mapper.SysDeptMapper; |
| | | import com.ruoyi.purchase.mapper.PaymentRegistrationMapper; |
| | |
| | | import com.ruoyi.staff.mapper.StaffOnJobMapper; |
| | | import com.ruoyi.staff.pojo.StaffOnJob; |
| | | import com.ruoyi.stock.mapper.StockInventoryMapper; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | |
| | | */ |
| | | @Service |
| | | @Slf4j |
| | | @RequiredArgsConstructor |
| | | public class HomeServiceImpl implements HomeService { |
| | | |
| | | @Autowired |
| | | private SalesLedgerMapper salesLedgerMapper; |
| | | private final SalesLedgerMapper salesLedgerMapper; |
| | | |
| | | @Autowired |
| | | private PurchaseLedgerMapper purchaseLedgerMapper; |
| | | private final PurchaseLedgerMapper purchaseLedgerMapper; |
| | | |
| | | @Autowired |
| | | private SalesLedgerProductMapper salesLedgerProductMapper; |
| | | private final SalesLedgerProductMapper salesLedgerProductMapper; |
| | | |
| | | @Autowired |
| | | private StockInventoryMapper stockInventoryMapper; |
| | | private final StockInventoryMapper stockInventoryMapper; |
| | | |
| | | @Autowired |
| | | private QualityInspectMapper qualityStatisticsMapper; |
| | | private final QualityInspectMapper qualityStatisticsMapper; |
| | | |
| | | @Autowired |
| | | private ApproveProcessMapper approveProcessMapper; |
| | | private final ApproveProcessMapper approveProcessMapper; |
| | | |
| | | @Autowired |
| | | private ReceiptPaymentMapper receiptPaymentMapper; |
| | | private final ReceiptPaymentMapper receiptPaymentMapper; |
| | | |
| | | @Autowired |
| | | private PaymentRegistrationMapper paymentRegistrationMapper; |
| | | private final PaymentRegistrationMapper paymentRegistrationMapper; |
| | | |
| | | @Autowired |
| | | private SysDeptMapper sysDeptMapper; |
| | | private final SysDeptMapper sysDeptMapper; |
| | | |
| | | @Autowired |
| | | private NoticeMapper noticeMapper; |
| | | private final NoticeMapper noticeMapper; |
| | | |
| | | @Autowired |
| | | private ProductOrderMapper productOrderMapper; |
| | | private final ProductionOrderMapper productionOrderMapper; |
| | | |
| | | @Autowired |
| | | private ProductWorkOrderMapper productWorkOrderMapper; |
| | | private final ProductMapper productMapper; |
| | | |
| | | @Autowired |
| | | private ProductMapper productMapper; |
| | | private final StaffOnJobMapper staffOnJobMapper; |
| | | |
| | | @Autowired |
| | | private StaffOnJobMapper staffOnJobMapper; |
| | | private final CustomerMapper customerMapper; |
| | | |
| | | @Autowired |
| | | private CustomerMapper customerMapper; |
| | | private final SupplierManageMapper supplierManageMapper; |
| | | |
| | | @Autowired |
| | | private SupplierManageMapper supplierManageMapper; |
| | | private final HomeMapper homeMapper; |
| | | |
| | | @Autowired |
| | | private HomeMapper homeMapper; |
| | | private final ProductionProductOutputMapper productionProductOutputMapper; |
| | | |
| | | @Autowired |
| | | private ProductionProductOutputMapper productionProductOutputMapper; |
| | | private final QualityInspectMapper qualityInspectMapper; |
| | | |
| | | @Autowired |
| | | private QualityInspectMapper qualityInspectMapper; |
| | | private final QualityUnqualifiedMapper qualityUnqualifiedMapper; |
| | | |
| | | @Autowired |
| | | private QualityUnqualifiedMapper qualityUnqualifiedMapper; |
| | | private final ProductionOperationTaskMapper productionOperationTaskMapper; |
| | | |
| | | @Autowired |
| | | private ProductProcessMapper productProcessMapper; |
| | | |
| | | @Autowired |
| | | private AccountExpenseMapper accountExpenseMapper; |
| | | private final AccountExpenseMapper accountExpenseMapper; |
| | | |
| | | @Autowired |
| | | private AccountIncomeMapper accountIncomeMapper; |
| | | private final AccountIncomeMapper accountIncomeMapper; |
| | | |
| | | private final ProductionAccountMapper productionAccountMapper; |
| | | |
| | | private final ProductionProductInputMapper productionProductInputMapper; |
| | | |
| | | @Override |
| | | public HomeBusinessDto business() { |
| | |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | } |
| | | |
| | | @Autowired |
| | | |
| | | private DeviceRepairMapper deviceRepairMapper; |
| | | |
| | | @Override |
| | |
| | | @Override |
| | | public ProductionProgressDto productionProgress() { |
| | | ProductionProgressDto productionProgressDto = new ProductionProgressDto(); |
| | | ProductOrderDto orderDto = new ProductOrderDto(); |
| | | orderDto.setStartTime(LocalDateTime.now().minusMonths(1)); |
| | | orderDto.setEndTime(LocalDateTime.now()); |
| | | List<ProductOrderDto> productOrderDtos = productOrderMapper.pageProductOrder(new Page<>(1, -1), orderDto) |
| | | .getRecords(); |
| | | productionProgressDto.setCompletedOrderDetails(productOrderDtos); |
| | | long totalCount = productOrderDtos.size(); |
| | | long count = productOrderDtos.stream().filter( |
| | | productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(productOrderDto.getQuantity()) >= 0) |
| | | List<ProductionProgressOrderDto> orderDetails = productionOrderMapper.selectProgressOrders( |
| | | LocalDateTime.now().minusMonths(1), LocalDateTime.now()); |
| | | productionProgressDto.setCompletedOrderDetails(orderDetails); |
| | | long totalCount = orderDetails.size(); |
| | | long count = orderDetails.stream().filter( |
| | | item -> defaultDecimal(item.getCompleteQuantity()).compareTo(defaultDecimal(item.getQuantity())) >= 0) |
| | | .count(); |
| | | long count2 = productOrderDtos.stream() |
| | | .filter(productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(BigDecimal.ZERO) == 0) |
| | | long count2 = orderDetails.stream() |
| | | .filter(item -> defaultDecimal(item.getCompleteQuantity()).compareTo(BigDecimal.ZERO) == 0) |
| | | .count(); |
| | | productionProgressDto.setTotalOrderCount(totalCount); |
| | | productionProgressDto.setCompletedOrderCount(count); |
| | |
| | | @Override |
| | | public ProductionTurnoverDto workInProcessTurnover() { |
| | | ProductionTurnoverDto productionTurnoverDto = new ProductionTurnoverDto(); |
| | | ProductWorkOrderDto workOrder = new ProductWorkOrderDto(); |
| | | workOrder.setPlanStartTime(LocalDate.now().minusMonths(1)); |
| | | workOrder.setPlanEndTime(LocalDate.now()); |
| | | List<ProductWorkOrderDto> productWorkOrders = productWorkOrderMapper |
| | | .pageProductWorkOrder(new Page<>(1, -1), workOrder).getRecords(); |
| | | long sum = productWorkOrders.stream() |
| | | .filter(productWorkOrder -> productWorkOrder.getPlanQuantity() |
| | | .compareTo(productWorkOrder.getCompleteQuantity()) > 0) |
| | | .map(ProductWorkOrder::getPlanQuantity) |
| | | List<ProductionTaskStatisticsDto> taskList = productionOperationTaskMapper |
| | | .selectTaskStatisticsByDate(LocalDate.now().minusMonths(1), LocalDate.now()); |
| | | long sum = taskList.stream() |
| | | .filter(task -> defaultDecimal(task.getPlanQuantity()).compareTo(defaultDecimal(task.getCompleteQuantity())) > 0) |
| | | .map(ProductionTaskStatisticsDto::getPlanQuantity) |
| | | .mapToLong(BigDecimal::longValue) |
| | | .sum(); |
| | | if (sum == 0) |
| | |
| | | productionTurnoverDto.setAverageTurnoverDays(BigDecimal.valueOf(sum).divide( |
| | | BigDecimal.valueOf(ChronoUnit.DAYS.between(LocalDateTime.now().minusMonths(1), LocalDateTime.now())), 2, |
| | | RoundingMode.HALF_UP)); |
| | | long completeQuantity = productWorkOrders.stream() |
| | | .filter(productWorkOrder -> productWorkOrder.getCompleteQuantity() |
| | | .compareTo(productWorkOrder.getPlanQuantity()) >= 0) |
| | | .map(ProductWorkOrder::getCompleteQuantity) |
| | | long completeQuantity = taskList.stream() |
| | | .filter(task -> defaultDecimal(task.getCompleteQuantity()).compareTo(defaultDecimal(task.getPlanQuantity())) >= 0) |
| | | .map(ProductionTaskStatisticsDto::getCompleteQuantity) |
| | | .mapToLong(BigDecimal::longValue) |
| | | .sum(); |
| | | productionTurnoverDto.setTurnoverEfficiency( |
| | | BigDecimal.valueOf(completeQuantity).divide(BigDecimal.valueOf(sum), 2, RoundingMode.HALF_UP)); |
| | | Map<String, List<ProductWorkOrderDto>> map = productWorkOrders.stream() |
| | | .filter(productWorkOrder -> productWorkOrder.getPlanQuantity() |
| | | .compareTo(productWorkOrder.getCompleteQuantity()) > 0) |
| | | .collect(Collectors.groupingBy(ProductWorkOrderDto::getProcessName)); |
| | | Map<String, List<ProductionTaskStatisticsDto>> map = taskList.stream() |
| | | .filter(task -> defaultDecimal(task.getPlanQuantity()).compareTo(defaultDecimal(task.getCompleteQuantity())) > 0) |
| | | .collect(Collectors.groupingBy(ProductionTaskStatisticsDto::getProcessName)); |
| | | List<String> strings = new ArrayList<>(); |
| | | List<Long> processQuantityDetails = new ArrayList<>(); |
| | | map.entrySet().stream().forEach(entry -> { |
| | | String key = entry.getKey(); |
| | | long completeSum = entry.getValue().stream().map(ProductWorkOrderDto::getCompleteQuantity) |
| | | long completeSum = entry.getValue().stream().map(ProductionTaskStatisticsDto::getCompleteQuantity) |
| | | .mapToLong(BigDecimal::longValue).sum(); |
| | | strings.add(key); |
| | | processQuantityDetails.add(completeSum); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<SupplierPurchaseRankingDto> supplierPurchaseRanking(Integer type) { |
| | | LocalDate today = LocalDate.now(); |
| | | public List<SupplierPurchaseRankingDto> supplierPurchaseRanking(Integer type, String startDateStr, String endDateStr) { |
| | | 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: // 季度 |
| | | Month currentMonth = today.getMonth(); |
| | | Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter(); |
| | | Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2); |
| | | |
| | | startDate = today.withMonth(firstMonthOfQuarter.getValue()).with(TemporalAdjusters.firstDayOfMonth()); |
| | | endDate = today.withMonth(lastMonthOfQuarter.getValue()).with(TemporalAdjusters.lastDayOfMonth()); |
| | | break; |
| | | default: |
| | | return new ArrayList<>(); |
| | | if (com.ruoyi.common.utils.StringUtils.isNotBlank(startDateStr) && com.ruoyi.common.utils.StringUtils.isNotBlank(endDateStr)) { |
| | | startDate = LocalDate.parse(startDateStr); |
| | | endDate = LocalDate.parse(endDateStr); |
| | | } else { |
| | | LocalDate today = LocalDate.now(); |
| | | 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: // 季度 |
| | | Month currentMonth = today.getMonth(); |
| | | Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter(); |
| | | Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2); |
| | | startDate = today.withMonth(firstMonthOfQuarter.getValue()).with(TemporalAdjusters.firstDayOfMonth()); |
| | | endDate = today.withMonth(lastMonthOfQuarter.getValue()).with(TemporalAdjusters.lastDayOfMonth()); |
| | | break; |
| | | default: |
| | | return new ArrayList<>(); |
| | | } |
| | | } |
| | | |
| | | QueryWrapper<PurchaseLedger> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.select("supplier_name", "SUM(contract_amount) as total_amount") |
| | | .ge("entry_date", startDate) |
| | | .le("entry_date", endDate) |
| | | // .ne("approval_status", 3) |
| | | .groupBy("supplier_name") |
| | | .orderByDesc("total_amount") |
| | | .last("LIMIT 5"); |
| | |
| | | majorDto.setRate("0.00"); |
| | | } |
| | | |
| | | // 查询各产品小类的采购数量 |
| | | Map<String, BigDecimal> purchaseDataMap = new java.util.HashMap<>(); |
| | | List<com.ruoyi.dto.MapDto> purchaseDistribution = homeMapper.selectPurchaseCategoryDistribution(); |
| | | if (purchaseDistribution != null) { |
| | | for (com.ruoyi.dto.MapDto item : purchaseDistribution) { |
| | | if (item.getName() != null && item.getValue() != null) { |
| | | purchaseDataMap.put(item.getName(), new BigDecimal(item.getValue())); |
| | | } |
| | | } |
| | | } |
| | | |
| | | BigDecimal majorTotalChildrenValue = BigDecimal.ZERO; |
| | | List<ProductCategoryDistributionDto.MinorCategoryDto> minorDtos = new ArrayList<>(); |
| | | for (Product minor : children) { |
| | | ProductCategoryDistributionDto.MinorCategoryDto minorDto = new ProductCategoryDistributionDto.MinorCategoryDto(); |
| | | minorDto.setName(minor.getProductName()); |
| | | minorDto.setValue("0"); |
| | | BigDecimal minorValue = purchaseDataMap.getOrDefault(minor.getProductName(), BigDecimal.ZERO); |
| | | minorDto.setValue(minorValue.toString()); |
| | | minorDto.setRate("0.00"); |
| | | minorDto.setChildren(new ArrayList<>()); |
| | | minorDtos.add(minorDto); |
| | | majorTotalChildrenValue = majorTotalChildrenValue.add(minorValue); |
| | | } |
| | | majorDto.setChildren(minorDtos); |
| | | // 使用实际采购数据更新大类的 value |
| | | if (majorTotalChildrenValue.compareTo(BigDecimal.ZERO) > 0) { |
| | | majorDto.setValue(majorTotalChildrenValue.toString()); |
| | | } |
| | | majorItems.add(majorDto); |
| | | |
| | | // 计算大类占比 |
| | | BigDecimal totalAllValue = BigDecimal.ZERO; |
| | | for (ProductCategoryDistributionDto.MajorCategoryDto m : majorItems) { |
| | | try { |
| | | totalAllValue = totalAllValue.add(new BigDecimal(m.getValue())); |
| | | } catch (NumberFormatException ignored) { |
| | | } |
| | | } |
| | | if (totalAllValue.compareTo(BigDecimal.ZERO) > 0) { |
| | | for (ProductCategoryDistributionDto.MajorCategoryDto m : majorItems) { |
| | | try { |
| | | BigDecimal val = new BigDecimal(m.getValue()); |
| | | m.setRate(val.divide(totalAllValue, 4, RoundingMode.HALF_UP) |
| | | .multiply(new BigDecimal("100")) |
| | | .setScale(2, RoundingMode.HALF_UP) |
| | | .toString()); |
| | | } catch (NumberFormatException ignored) { |
| | | } |
| | | } |
| | | } |
| | | // 计算小类占比(在同大类内) |
| | | for (ProductCategoryDistributionDto.MajorCategoryDto m : majorItems) { |
| | | if (m.getChildren() == null || m.getChildren().isEmpty()) { |
| | | continue; |
| | | } |
| | | BigDecimal parentVal = BigDecimal.ZERO; |
| | | for (ProductCategoryDistributionDto.MinorCategoryDto child : m.getChildren()) { |
| | | try { |
| | | parentVal = parentVal.add(new BigDecimal(child.getValue())); |
| | | } catch (NumberFormatException ignored) { |
| | | } |
| | | } |
| | | if (parentVal.compareTo(BigDecimal.ZERO) > 0) { |
| | | for (ProductCategoryDistributionDto.MinorCategoryDto child : m.getChildren()) { |
| | | try { |
| | | BigDecimal childVal = new BigDecimal(child.getValue()); |
| | | child.setRate(childVal.divide(parentVal, 4, RoundingMode.HALF_UP) |
| | | .multiply(new BigDecimal("100")) |
| | | .setScale(2, RoundingMode.HALF_UP) |
| | | .toString()); |
| | | } catch (NumberFormatException ignored) { |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | dto.setItems(majorItems); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<CustomerContributionRankingDto> customerContributionRanking(Integer type) { |
| | | LocalDate today = LocalDate.now(); |
| | | LocalDate startDate = null; |
| | | LocalDate endDate = null; |
| | | 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: |
| | | Month currentMonth = today.getMonth(); |
| | | Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter(); |
| | | Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2); |
| | | startDate = today.withMonth(firstMonthOfQuarter.getValue()).with(TemporalAdjusters.firstDayOfMonth()); |
| | | endDate = today.withMonth(lastMonthOfQuarter.getValue()).with(TemporalAdjusters.lastDayOfMonth()); |
| | | break; |
| | | public List<CustomerContributionRankingDto> customerContributionRanking(Integer type, String startDateStr, String endDateStr) { |
| | | LocalDate startDate; |
| | | LocalDate endDate; |
| | | if (com.ruoyi.common.utils.StringUtils.isNotBlank(startDateStr) && com.ruoyi.common.utils.StringUtils.isNotBlank(endDateStr)) { |
| | | startDate = LocalDate.parse(startDateStr); |
| | | endDate = LocalDate.parse(endDateStr); |
| | | } else { |
| | | LocalDate today = LocalDate.now(); |
| | | 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: |
| | | Month currentMonth = today.getMonth(); |
| | | Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter(); |
| | | Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2); |
| | | startDate = today.withMonth(firstMonthOfQuarter.getValue()).with(TemporalAdjusters.firstDayOfMonth()); |
| | | endDate = today.withMonth(lastMonthOfQuarter.getValue()).with(TemporalAdjusters.lastDayOfMonth()); |
| | | break; |
| | | default: |
| | | return new ArrayList<>(); |
| | | } |
| | | } |
| | | |
| | | QueryWrapper<SalesLedger> queryWrapper = new QueryWrapper<>(); |
| | | queryWrapper.select("customer_name", "SUM(contract_amount) as total_amount") |
| | | .isNotNull("customer_name") |
| | | .between("entry_date", startDate, endDate) |
| | | .groupBy("customer_name") |
| | | .orderByDesc("total_amount") |
| | | .last("LIMIT 5"); |
| | | |
| | | if (startDate != null && endDate != null) { |
| | | queryWrapper.between("entry_date", startDate, endDate); |
| | | } |
| | | |
| | | List<Map<String, Object>> maps = salesLedgerMapper.selectMaps(queryWrapper); |
| | | List<CustomerContributionRankingDto> result = new ArrayList<>(); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<MapDto> productSalesAnalysis() { |
| | | // 获取所有产品大类的销售额 |
| | | List<Map<String, Object>> analysisResults = salesLedgerProductMapper.selectProductSalesAnalysis(); |
| | | public List<MapDto> productSalesAnalysis(String startDateStr, String endDateStr) { |
| | | List<Map<String, Object>> analysisResults; |
| | | if (com.ruoyi.common.utils.StringUtils.isNotBlank(startDateStr) && com.ruoyi.common.utils.StringUtils.isNotBlank(endDateStr)) { |
| | | analysisResults = salesLedgerProductMapper.selectProductSalesAnalysisByDate(startDateStr, endDateStr); |
| | | } else { |
| | | analysisResults = salesLedgerProductMapper.selectProductSalesAnalysis(); |
| | | } |
| | | if (CollectionUtils.isEmpty(analysisResults)) { |
| | | return new ArrayList<>(); |
| | | } |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<MapDto> rawMaterialPurchaseAmountRatio() { |
| | | // 获取所有原材料的采购额 |
| | | List<Map<String, Object>> analysisResults = salesLedgerProductMapper.selectRawMaterialPurchaseAnalysis(); |
| | | public List<MapDto> rawMaterialPurchaseAmountRatio(String startDateStr, String endDateStr) { |
| | | List<Map<String, Object>> analysisResults; |
| | | if (com.ruoyi.common.utils.StringUtils.isNotBlank(startDateStr) && com.ruoyi.common.utils.StringUtils.isNotBlank(endDateStr)) { |
| | | analysisResults = salesLedgerProductMapper.selectRawMaterialPurchaseAnalysisByDate(startDateStr, endDateStr); |
| | | } else { |
| | | analysisResults = salesLedgerProductMapper.selectRawMaterialPurchaseAnalysis(); |
| | | } |
| | | if (CollectionUtils.isEmpty(analysisResults)) { |
| | | return new ArrayList<>(); |
| | | } |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<MapDto> salesPurchaseStorageProductCount() { |
| | | public List<MapDto> salesPurchaseStorageProductCount(String startDate, String endDate) { |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | LocalDateTime currentMonthStart = now.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN); |
| | | LocalDateTime lastMonth = now.minusMonths(1); |
| | | LocalDateTime lastMonthStart = lastMonth.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN); |
| | | LocalDateTime lastMonthEnd = lastMonth.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX); |
| | | LocalDateTime currentMonthStart; |
| | | LocalDateTime currentMonthEnd; |
| | | LocalDateTime lastMonthStart; |
| | | LocalDateTime lastMonthEnd; |
| | | |
| | | // 销售 |
| | | int currentSales = salesLedgerProductMapper.selectProductCountByTypeAndDate(1, currentMonthStart, now); |
| | | int lastSales = salesLedgerProductMapper.selectProductCountByTypeAndDate(1, lastMonthStart, lastMonthEnd); |
| | | // 采购 |
| | | int currentPurchase = salesLedgerProductMapper.selectProductCountByTypeAndDate(2, currentMonthStart, now); |
| | | if (StringUtils.isNotBlank(startDate) && StringUtils.isNotBlank(endDate)) { |
| | | LocalDate start = LocalDate.parse(startDate); |
| | | LocalDate end = LocalDate.parse(endDate); |
| | | currentMonthStart = start.atStartOfDay(); |
| | | currentMonthEnd = end.atTime(LocalTime.MAX); |
| | | long daysBetween = java.time.temporal.ChronoUnit.DAYS.between(start, end) + 1; |
| | | LocalDate lastStart = start.minusDays(daysBetween); |
| | | LocalDate lastEnd = start.minusDays(1); |
| | | lastMonthStart = lastStart.atStartOfDay(); |
| | | lastMonthEnd = lastEnd.atTime(LocalTime.MAX); |
| | | } else { |
| | | currentMonthStart = now.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN); |
| | | currentMonthEnd = now; |
| | | LocalDateTime lastMonth = now.minusMonths(1); |
| | | lastMonthStart = lastMonth.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN); |
| | | lastMonthEnd = lastMonth.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX); |
| | | } |
| | | |
| | | // 销售订单数(统计sales_ledger表) |
| | | int currentSales = Math.toIntExact(salesLedgerMapper.selectCount(new LambdaQueryWrapper<SalesLedger>() |
| | | .ge(SalesLedger::getEntryDate, currentMonthStart) |
| | | .le(SalesLedger::getEntryDate, currentMonthEnd))); |
| | | int lastSales = Math.toIntExact(salesLedgerMapper.selectCount(new LambdaQueryWrapper<SalesLedger>() |
| | | .ge(SalesLedger::getEntryDate, lastMonthStart) |
| | | .le(SalesLedger::getEntryDate, lastMonthEnd))); |
| | | // 采购产品数 |
| | | int currentPurchase = salesLedgerProductMapper.selectProductCountByTypeAndDate(2, currentMonthStart, currentMonthEnd); |
| | | int lastPurchase = salesLedgerProductMapper.selectProductCountByTypeAndDate(2, lastMonthStart, lastMonthEnd); |
| | | // 储存 |
| | | int currentStorage = stockInventoryMapper.selectStorageProductCountByDate(currentMonthStart, now); |
| | | // 储存产品数 |
| | | int currentStorage = stockInventoryMapper.selectStorageProductCountByDate(currentMonthStart, currentMonthEnd); |
| | | int lastStorage = stockInventoryMapper.selectStorageProductCountByDate(lastMonthStart, lastMonthEnd); |
| | | |
| | | List<MapDto> list = new ArrayList<>(); |
| | | list.add(createMapDto("销售产品数", currentSales, lastSales)); |
| | | list.add(createMapDto("销售订单数", currentSales, lastSales)); |
| | | list.add(createMapDto("采购产品数", currentPurchase, lastPurchase)); |
| | | list.add(createMapDto("储存产品数", currentStorage, lastStorage)); |
| | | |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<Map<String, Object>> productInOutAnalysis(Integer type) { |
| | | public List<Map<String, Object>> productInOutAnalysis(Integer type, String startDateStr, String endDateStr) { |
| | | String targetName; |
| | | if (type == 1) { |
| | | targetName = "原材料"; |
| | |
| | | LocalDate now = LocalDate.now(); |
| | | DateTimeFormatter displayDtf = DateTimeFormatter.ofPattern("M/d"); |
| | | |
| | | String startDate = now.minusDays(6).toString(); |
| | | String endDate = now.toString(); |
| | | LocalDate start; |
| | | LocalDate end; |
| | | if (com.ruoyi.common.utils.StringUtils.isNotBlank(startDateStr) && com.ruoyi.common.utils.StringUtils.isNotBlank(endDateStr)) { |
| | | start = LocalDate.parse(startDateStr); |
| | | end = LocalDate.parse(endDateStr); |
| | | } else { |
| | | end = now; |
| | | start = now.minusDays(6); |
| | | } |
| | | String startDate = start.toString(); |
| | | String endDate = end.toString(); |
| | | |
| | | List<Map<String, Object>> inCounts = stockInventoryMapper.selectDailyStockInCounts(rootCategoryId, startDate, |
| | | endDate + " 23:59:59"); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<MapDto> productTurnoverDays() { |
| | | public List<MapDto> productTurnoverDays(String startDateStr, String endDateStr) { |
| | | if (com.ruoyi.common.utils.StringUtils.isNotBlank(startDateStr) && com.ruoyi.common.utils.StringUtils.isNotBlank(endDateStr)) { |
| | | return homeMapper.productTurnoverDaysByDate(startDateStr, endDateStr); |
| | | } |
| | | return homeMapper.productTurnoverDays(); |
| | | } |
| | | |
| | |
| | | return dto; |
| | | } |
| | | |
| | | @Autowired |
| | | private ProductionProductInputMapper productionProductInputMapper; |
| | | |
| | | @Override |
| | | public List<InputOutputAnalysisDto> inputOutputAnalysis(Integer type) { |
| | | LocalDate today = LocalDate.now(); |
| | |
| | | String endStr = endDate.atStartOfDay() |
| | | .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); |
| | | |
| | | List<Map<String, Object>> inputList = productionProductInputMapper.selectInputStats(startStr, endStr); |
| | | // List<Map<String, Object>> inputList = productionProductInputMapper.selectInputStats(startStr, endStr); |
| | | List<Map<String, Object>> inputList = null; |
| | | List<Map<String, Object>> outputList = productionProductOutputMapper.selectDailyOutputStats(startStr, endStr); |
| | | |
| | | Map<String, InputOutputAnalysisDto> dateMap = new HashMap<>(); |
| | |
| | | break; |
| | | } |
| | | |
| | | ProductWorkOrderDto queryDto = new ProductWorkOrderDto(); |
| | | queryDto.setPlanStartTime(startDate); |
| | | queryDto.setPlanEndTime(endDate); |
| | | |
| | | List<ProductWorkOrderDto> list = productWorkOrderMapper.pageProductWorkOrder(new Page<>(1, -1), queryDto) |
| | | .getRecords(); |
| | | List<ProductionTaskStatisticsDto> list = productionOperationTaskMapper.selectTaskStatisticsByDate(startDate, endDate); |
| | | |
| | | if (CollectionUtils.isEmpty(list)) { |
| | | return new ArrayList<>(); |
| | |
| | | Map<String, BigDecimal> processOutputMap = list.stream() |
| | | .filter(item -> item.getProcessName() != null && item.getCompleteQuantity() != null) |
| | | .collect(Collectors.groupingBy( |
| | | ProductWorkOrderDto::getProcessName, |
| | | ProductionTaskStatisticsDto::getProcessName, |
| | | Collectors.reducing(BigDecimal.ZERO, |
| | | ProductWorkOrderDto::getCompleteQuantity, |
| | | ProductionTaskStatisticsDto::getCompleteQuantity, |
| | | BigDecimal::add))); |
| | | |
| | | BigDecimal total = processOutputMap.values().stream() |
| | |
| | | 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<ProductWorkOrderDto> startList = productWorkOrderMapper.selectWorkOrderStartStats(startStr, endStr); |
| | | List<ProductionTaskStatisticsDto> startList = productionOperationTaskMapper.selectTaskStartStats(startStr, endStr); |
| | | |
| | | List<com.ruoyi.production.dto.ProductionProductOutputDto> outputList = productionProductOutputMapper |
| | | List<ProductionProductOutputDto> outputList = productionProductOutputMapper |
| | | .selectOutputStats(startStr, endStr); |
| | | |
| | | Map<String, WorkOrderEfficiencyDto> dateMap = new HashMap<>(); |
| | | |
| | | if (!CollectionUtils.isEmpty(startList)) { |
| | | for (ProductWorkOrderDto item : startList) { |
| | | if (item.getPlanStartTime() != null) { |
| | | String date = item.getPlanStartTime().toString(); |
| | | for (ProductionTaskStatisticsDto item : startList) { |
| | | if (item.getActualStartTime() != null) { |
| | | String date = item.getActualStartTime().toString(); |
| | | WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto()); |
| | | dto.setDate(date); |
| | | BigDecimal qty = item.getPlanQuantity() != null ? item.getPlanQuantity() : BigDecimal.ZERO; |
| | |
| | | |
| | | // 完工数量和良品率 |
| | | if (!CollectionUtils.isEmpty(outputList)) { |
| | | for (com.ruoyi.production.dto.ProductionProductOutputDto item : outputList) { |
| | | for (ProductionProductOutputDto item : outputList) { |
| | | if (item.getCreateTime() != null) { |
| | | String date = item.getCreateTime().toLocalDate().toString(); |
| | | WorkOrderEfficiencyDto dto = dateMap.getOrDefault(date, new WorkOrderEfficiencyDto()); |
| | |
| | | .collect(Collectors.toList()); |
| | | } |
| | | |
| | | @Autowired |
| | | private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; |
| | | |
| | | @Override |
| | | public List<ProductionAccountingDto> productionAccountingAnalysis(Integer type) { |
| | |
| | | |
| | | String endStr = endDate.plusDays(1).atStartOfDay().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); |
| | | |
| | | List<Map<String, Object>> wagesList = salesLedgerProductionAccountingMapper.selectDailyWagesStats(startStr, |
| | | List<Map<String, Object>> wagesList = productionAccountMapper.selectDailyWagesStats(startStr, |
| | | endStr); |
| | | |
| | | if (CollectionUtils.isEmpty(wagesList)) { |
| | |
| | | String lastEnd = lastMonthDate.withDayOfMonth(lastMonthDate.lengthOfMonth()).atTime(LocalTime.MAX) |
| | | .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); |
| | | |
| | | int currentCreated = productOrderMapper.countCreated(currentStart, currentEnd); |
| | | int lastCreated = productOrderMapper.countCreated(lastStart, lastEnd); |
| | | int currentCreated = productionOrderMapper.countCreated(currentStart, currentEnd); |
| | | int lastCreated = productionOrderMapper.countCreated(lastStart, lastEnd); |
| | | MapDto createdDto = createOrderCountDto("生产订单数", currentCreated, lastCreated); |
| | | |
| | | int currentCompleted = productOrderMapper.countCompleted(currentStart, currentEnd); |
| | | int lastCompleted = productOrderMapper.countCompleted(lastStart, lastEnd); |
| | | int currentCompleted = productionOrderMapper.countCompleted(currentStart, currentEnd); |
| | | int lastCompleted = productionOrderMapper.countCompleted(lastStart, lastEnd); |
| | | MapDto completedDto = createOrderCountDto("已完成订单数", currentCompleted, lastCompleted); |
| | | |
| | | int currentPending = productOrderMapper.countPending(currentStart, currentEnd); |
| | | int lastPending = productOrderMapper.countPending(lastStart, lastEnd); |
| | | int currentPending = productionOrderMapper.countPending(currentStart, currentEnd); |
| | | int lastPending = productionOrderMapper.countPending(lastStart, lastEnd); |
| | | MapDto pendingDto = createOrderCountDto("待生产订单数", currentPending, lastPending); |
| | | |
| | | return Arrays.asList(createdDto, completedDto, pendingDto); |
| | |
| | | LocalDateTime startDateTime = startDate.atStartOfDay(); |
| | | LocalDateTime endDateTime = endDate.atTime(LocalTime.MAX); |
| | | |
| | | return productProcessMapper.calculateProductionStatistics(startDateTime, endDateTime, userId, processIds); |
| | | return productionOperationTaskMapper.calculateProductionStatistics(startDateTime, endDateTime, userId, processIds); |
| | | } |
| | | |
| | | private BigDecimal defaultDecimal(BigDecimal value) { |
| | | return value == null ? BigDecimal.ZERO : value; |
| | | } |
| | | } |