| | |
| | | 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.bean.dto.purchase.PurchaseInboundDto; |
| | | import com.ruoyi.account.bean.dto.purchase.PurchaseReturnDto; |
| | | import com.ruoyi.account.bean.dto.sales.SalesOutboundDto; |
| | | import com.ruoyi.account.bean.dto.sales.SalesReturnDto; |
| | | import com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo; |
| | | import com.ruoyi.account.bean.vo.purchase.PurchaseReturnVo; |
| | | import com.ruoyi.account.bean.vo.sales.SalesOutboundVo; |
| | | import com.ruoyi.account.bean.vo.sales.SalesReturnVo; |
| | | import com.ruoyi.account.mapper.AccountStatementMapper; |
| | | import com.ruoyi.account.mapper.purchase.AccountPurchasePaymentMapper; |
| | | import com.ruoyi.account.mapper.sales.AccountSalesCollectionMapper; |
| | | import com.ruoyi.account.pojo.AccountStatement; |
| | | import com.ruoyi.account.pojo.purchase.AccountPurchasePayment; |
| | | import com.ruoyi.account.pojo.sales.AccountSalesCollection; |
| | | import com.ruoyi.approve.mapper.ApproveProcessMapper; |
| | |
| | | import com.ruoyi.home.dto.*; |
| | | import com.ruoyi.home.mapper.HomeMapper; |
| | | import com.ruoyi.home.service.HomeService; |
| | | import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper; |
| | | 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.PurchaseLedgerMapper; |
| | | import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper; |
| | | import com.ruoyi.purchase.pojo.PurchaseLedger; |
| | | import com.ruoyi.quality.mapper.QualityInspectMapper; |
| | | import com.ruoyi.quality.mapper.QualityUnqualifiedMapper; |
| | |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | | import com.ruoyi.staff.mapper.StaffOnJobMapper; |
| | | import com.ruoyi.staff.pojo.StaffOnJob; |
| | | import com.ruoyi.stock.mapper.StockInRecordMapper; |
| | | import com.ruoyi.stock.mapper.StockInventoryMapper; |
| | | import com.ruoyi.stock.mapper.StockOutRecordMapper; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | |
| | | public class HomeServiceImpl implements HomeService { |
| | | |
| | | private final SalesLedgerMapper salesLedgerMapper; |
| | | private final StockOutRecordMapper stockOutRecordMapper; |
| | | private final ReturnManagementMapper returnManagementMapper; |
| | | private final StockInRecordMapper stockInRecordMapper; |
| | | private final PurchaseReturnOrdersMapper purchaseReturnOrdersMapper; |
| | | |
| | | private final PurchaseLedgerMapper purchaseLedgerMapper; |
| | | |
| | |
| | | homeBusinessDto.setMonthPurchaseMoney(receiveAmount.setScale(2, RoundingMode.HALF_UP).toString()); |
| | | homeBusinessDto.setMonthPurchaseHaveMoney(BigDecimal.ZERO.setScale(2, RoundingMode.HALF_UP).toString()); |
| | | } |
| | | |
| | | // 上月销售金额 |
| | | YearMonth lastMonth = currentMonth.minusMonths(1); |
| | | LambdaQueryWrapper<SalesLedger> lastMonthSalesWrapper = new LambdaQueryWrapper<>(); |
| | | lastMonthSalesWrapper.ge(SalesLedger::getEntryDate, lastMonth.atDay(1).atStartOfDay()) |
| | | .lt(SalesLedger::getEntryDate, lastMonth.plusMonths(1).atDay(1).atStartOfDay()); |
| | | List<SalesLedger> lastMonthSalesLedgers = salesLedgerMapper.selectList(lastMonthSalesWrapper); |
| | | if (!CollectionUtils.isEmpty(lastMonthSalesLedgers)) { |
| | | BigDecimal lastMonthContractAmount = lastMonthSalesLedgers.stream() |
| | | .map(SalesLedger::getContractAmount) |
| | | .filter(Objects::nonNull) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | homeBusinessDto.setLastMonthSaleMoney(lastMonthContractAmount.setScale(2, RoundingMode.HALF_UP).toString()); |
| | | } |
| | | |
| | | // 上月采购金额 |
| | | LambdaQueryWrapper<PurchaseLedger> lastMonthPurchaseWrapper = new LambdaQueryWrapper<>(); |
| | | lastMonthPurchaseWrapper.ge(PurchaseLedger::getEntryDate, lastMonth.atDay(1).atStartOfDay()) |
| | | .lt(PurchaseLedger::getEntryDate, lastMonth.plusMonths(1).atDay(1).atStartOfDay()); |
| | | List<PurchaseLedger> lastMonthPurchaseLedgers = purchaseLedgerMapper.selectList(lastMonthPurchaseWrapper); |
| | | if (!CollectionUtils.isEmpty(lastMonthPurchaseLedgers)) { |
| | | BigDecimal lastMonthPurchaseAmount = lastMonthPurchaseLedgers.stream() |
| | | .map(PurchaseLedger::getContractAmount) |
| | | .filter(Objects::nonNull) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | homeBusinessDto.setLastMonthPurchaseMoney(lastMonthPurchaseAmount.setScale(2, RoundingMode.HALF_UP).toString()); |
| | | } |
| | | |
| | | // 统计库存 |
| | | BigDecimal stockQuantityTotal = stockInventoryMapper.selectTotal(); |
| | | homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString()); |
| | |
| | | LocalDate startDate = range[0]; |
| | | LocalDate endDate = range[1]; |
| | | |
| | | //销售出库 |
| | | BigDecimal receivableBase = sumSalesContractAmount(startDate, endDate); |
| | | //销售退货 |
| | | BigDecimal salesReturnAmount = sumSalesReturnAmount(startDate, endDate); |
| | | //采购入库 |
| | | BigDecimal payableBase = sumPurchaseContractAmount(startDate, endDate); |
| | | //采购退货 |
| | | BigDecimal purchaseReturnAmount = sumPurchaseReturnAmount(startDate, endDate); |
| | | //收款 |
| | | BigDecimal advanceMoney = sumCollectionAmount(startDate, endDate); |
| | | //付款 |
| | | BigDecimal prepayMoney = sumPaymentAmount(startDate, endDate); |
| | | |
| | | dto.setReceivableMoney(scaleMoney(maxZero(receivableBase.subtract(advanceMoney)))); |
| | | dto.setPayableMoney(scaleMoney(maxZero(payableBase.subtract(prepayMoney)))); |
| | | //应收金额=销售出库-销售退货 |
| | | dto.setReceivableMoney(scaleMoney(maxZero(receivableBase.subtract(salesReturnAmount)))); |
| | | //应付金额=采购入库-采购退货 |
| | | dto.setPayableMoney(scaleMoney(maxZero(payableBase.subtract(purchaseReturnAmount)))); |
| | | //收款金额=收款单 |
| | | dto.setAdvanceMoney(scaleMoney(advanceMoney)); |
| | | //付款金额=付款单 |
| | | dto.setPrepayMoney(scaleMoney(prepayMoney)); |
| | | return dto; |
| | | } |
| | |
| | | YearMonth currentMonth = YearMonth.from(today); |
| | | LocalDate startDate = currentMonth.atDay(1); |
| | | LocalDate endDate = currentMonth.atEndOfMonth(); |
| | | |
| | | //收款 |
| | | BigDecimal monthlyIncome = sumCollectionAmount(startDate, endDate); |
| | | //销售出库 |
| | | BigDecimal receivableBase = sumSalesContractAmount(startDate, endDate); |
| | | String collectionRate = toRateString(monthlyIncome, receivableBase); |
| | | |
| | | String currentMonthText = currentMonth.toString(); |
| | | List<AccountStatement> receivableStatements = defaultList(accountStatementMapper.selectList( |
| | | new LambdaQueryWrapper<AccountStatement>() |
| | | .eq(AccountStatement::getAccountType, 1) |
| | | .le(AccountStatement::getStatementMonth, currentMonthText))); |
| | | |
| | | long overdueNum = receivableStatements.stream() |
| | | .filter(item -> item.getStatementMonth() != null && item.getStatementMonth().compareTo(currentMonthText) < 0) |
| | | .filter(item -> defaultDecimal(item.getClosingBalance()).compareTo(BigDecimal.ZERO) > 0) |
| | | .count(); |
| | | |
| | | long totalReceivableCount = receivableStatements.size(); |
| | | String overdueRate = totalReceivableCount == 0 |
| | | ? "0.00" |
| | | : BigDecimal.valueOf(overdueNum) |
| | | .multiply(BigDecimal.valueOf(100)) |
| | | .divide(BigDecimal.valueOf(totalReceivableCount), 2, RoundingMode.HALF_UP) |
| | | .toString(); |
| | | |
| | | //销售退货 |
| | | BigDecimal salesReturnAmount = sumSalesReturnAmount(startDate, endDate); |
| | | //回款率=收款/(销售出库-销售退货)应收 |
| | | String collectionRate = toRateString(monthlyIncome, receivableBase.subtract(salesReturnAmount)); |
| | | //逾期数=(销售出库金额-销售退货金额)应收金额-收款金额 |
| | | BigDecimal overdueAmount = receivableBase.subtract(salesReturnAmount).subtract(monthlyIncome); |
| | | //逾期率=逾期数/应收金额 |
| | | String overdueRate = toRateString(overdueAmount, receivableBase); |
| | | dto.setMonthlyIncome(scaleMoney(monthlyIncome)); |
| | | dto.setCollectionRate(collectionRate); |
| | | dto.setOverdueNum(BigDecimal.valueOf(overdueNum)); |
| | | dto.setOverdueNum(overdueAmount); |
| | | dto.setOverdueRate(overdueRate); |
| | | return dto; |
| | | } |
| | |
| | | YearMonth currentMonth = YearMonth.from(today); |
| | | LocalDate startDate = currentMonth.atDay(1); |
| | | LocalDate endDate = currentMonth.atEndOfMonth(); |
| | | |
| | | //支出 |
| | | BigDecimal monthlyExpenditure = sumPaymentAmount(startDate, endDate); |
| | | //采购入库 |
| | | BigDecimal payableBase = sumPurchaseContractAmount(startDate, endDate); |
| | | //采购退货 |
| | | BigDecimal purchaseReturnAmount = sumPurchaseReturnAmount(startDate, endDate); |
| | | //付款率=付款/(采购入库-采购退货)应付 |
| | | String paymentRate = toRateString(monthlyExpenditure, payableBase.subtract(purchaseReturnAmount)); |
| | | //收款 |
| | | BigDecimal monthlyIncome = sumCollectionAmount(startDate, endDate); |
| | | //毛利润= 收款-支出 |
| | | BigDecimal grossProfit = monthlyIncome.subtract(monthlyExpenditure); |
| | | //利润率=毛利润/收款 |
| | | String profitMarginRate = toRateString(grossProfit, monthlyIncome); |
| | | |
| | | dto.setMonthlyExpenditure(scaleMoney(monthlyExpenditure)); |
| | | dto.setPaymentRate(toRateString(monthlyExpenditure, payableBase)); |
| | | dto.setPaymentRate(paymentRate); |
| | | dto.setGrossProfit(scaleMoney(grossProfit)); |
| | | dto.setProfitMarginRate(toRateString(grossProfit, monthlyIncome)); |
| | | dto.setProfitMarginRate(profitMarginRate); |
| | | return dto; |
| | | } |
| | | |
| | |
| | | LocalDate endDate = range[1]; |
| | | |
| | | String startStr = startDate.toString(); |
| | | String endStr = endDate.toString(); |
| | | // 使用区间右开(< endDate + 1 天)保证检测时间含时分秒时也能覆盖到 endDate 当天 |
| | | String endExclusiveStr = endDate.plusDays(1).toString(); |
| | | |
| | | List<QualityInspect> list = qualityInspectMapper.selectList( |
| | | new LambdaQueryWrapper<QualityInspect>() |
| | | .eq(QualityInspect::getInspectType, inspectType) |
| | | .eq(QualityInspect::getInspectState, 1) |
| | | .ge(QualityInspect::getCheckTime, startStr) |
| | | .le(QualityInspect::getCheckTime, endStr)); |
| | | .lt(QualityInspect::getCheckTime, endExclusiveStr)); |
| | | |
| | | return buildQualifiedAnalysis(list); |
| | | } |
| | |
| | | QualityQualifiedAnalysisDto dto = new QualityQualifiedAnalysisDto(); |
| | | |
| | | if (CollectionUtils.isEmpty(list)) { |
| | | dto.setQualifiedCount(0); |
| | | dto.setUnqualifiedCount(0); |
| | | dto.setQualifiedCount(BigDecimal.valueOf(0)); |
| | | dto.setUnqualifiedCount(BigDecimal.valueOf(0)); |
| | | dto.setQualifiedRate(BigDecimal.ZERO.setScale(2)); |
| | | dto.setUnqualifiedRate(BigDecimal.ZERO.setScale(2)); |
| | | return dto; |
| | |
| | | |
| | | BigDecimal totalCount = qualifiedCount.add(unqualifiedCount); |
| | | |
| | | dto.setQualifiedCount(qualifiedCount.intValue()); |
| | | dto.setUnqualifiedCount(unqualifiedCount.intValue()); |
| | | dto.setQualifiedCount(qualifiedCount); |
| | | dto.setUnqualifiedCount(unqualifiedCount); |
| | | |
| | | if (totalCount.compareTo(BigDecimal.ZERO) == 0) { |
| | | dto.setQualifiedRate(BigDecimal.ZERO.setScale(2)); |
| | |
| | | |
| | | @Override |
| | | public QualityInspectionCountDto qualityInspectionCount() { |
| | | String todayStr = LocalDate.now().toString(); |
| | | String prevDayStr = LocalDate.now().minusDays(1).toString(); |
| | | // 查询出截止今日的总检验数 |
| | | List<QualityInspect> todayList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() |
| | | .le(QualityInspect::getCheckTime, todayStr)); |
| | | // 查询出截止前一天的总检验数 |
| | | List<QualityInspect> prevList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() |
| | | .le(QualityInspect::getCheckTime, prevDayStr)); |
| | | // 计算今日的总检验数 |
| | | BigDecimal todayCount = todayList.stream() |
| | | .map(QualityInspect::getQuantity) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | // 计算前一天的总检验数 |
| | | BigDecimal prevCount = prevList.stream() |
| | | .map(QualityInspect::getQuantity) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | LocalDate today = LocalDate.now(); |
| | | String todayStartStr = today.toString(); |
| | | String tomorrowStartStr = today.plusDays(1).toString(); |
| | | String yesterdayStartStr = today.minusDays(1).toString(); |
| | | |
| | | // 计算今日相对昨天的一个总比增长 |
| | | BigDecimal growthRate = calcGrowthRate(todayCount, prevCount); |
| | | // 累计总检验数(截止今日 24:00 之前的所有记录) |
| | | BigDecimal totalCount = sumInspectQuantity(null, tomorrowStartStr, null); |
| | | // 今日单日检验数 |
| | | BigDecimal todayCount = sumInspectQuantity(todayStartStr, tomorrowStartStr, null); |
| | | // 昨日单日检验数 |
| | | BigDecimal yesterdayCount = sumInspectQuantity(yesterdayStartStr, todayStartStr, null); |
| | | // 总检验数同比增长 = (今日单日 - 昨日单日) / 昨日单日 × 100% |
| | | BigDecimal growthRate = calcGrowthRate(todayCount, yesterdayCount); |
| | | |
| | | // 计算今天的待完成数量 |
| | | List<QualityInspect> todayPendingList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() |
| | | .eq(QualityInspect::getInspectState, 0) |
| | | .eq(QualityInspect::getCheckTime, todayStr)); |
| | | // 今日待完成(inspectState=0) |
| | | BigDecimal todayPendingCount = sumInspectQuantity(todayStartStr, tomorrowStartStr, 0); |
| | | BigDecimal yesterdayPendingCount = sumInspectQuantity(yesterdayStartStr, todayStartStr, 0); |
| | | BigDecimal todayPendingCountGrowthRate = calcGrowthRate(todayPendingCount, yesterdayPendingCount); |
| | | |
| | | // 计算前一天的待完成数量 |
| | | List<QualityInspect> prevPendingList = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() |
| | | .eq(QualityInspect::getInspectState, 0) |
| | | .eq(QualityInspect::getCheckTime, prevDayStr)); |
| | | // 计算今天的待完成数量 |
| | | BigDecimal todayPendingCount = todayPendingList.stream() |
| | | .map(QualityInspect::getQuantity) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | // 今日已完成(inspectState=1) |
| | | BigDecimal todayCompletedCount = sumInspectQuantity(todayStartStr, tomorrowStartStr, 1); |
| | | BigDecimal yesterdayCompletedCount = sumInspectQuantity(yesterdayStartStr, todayStartStr, 1); |
| | | BigDecimal todayCompletedCountGrowthRate = calcGrowthRate(todayCompletedCount, yesterdayCompletedCount); |
| | | |
| | | // 计算前一天的待完成数量 |
| | | 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) |
| | | .eq(QualityInspect::getCheckTime, todayStr)); |
| | | // 计算前一天的已完成数量 |
| | | List<QualityInspect> prevCompletedList = qualityInspectMapper |
| | | .selectList(new LambdaQueryWrapper<QualityInspect>() |
| | | .eq(QualityInspect::getInspectState, 1) |
| | | .eq(QualityInspect::getCheckTime, prevDayStr)); |
| | | // 计算今天的已完成数量 |
| | | 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.setTotalCount(totalCount); |
| | | dto.setTotalCountGrowthRate(growthRate); |
| | | dto.setTodayPendingCount(todayPendingCount); |
| | | dto.setTodayPendingCountGrowthRate(todayPendingCountGrowthRate); |
| | | dto.setTodayCompletedCount(todayCompletedCount); |
| | | dto.setTodayCompletedCountGrowthRate(todayCompletedCountGrowthRate); |
| | | return dto; |
| | | } |
| | | |
| | | /** |
| | | * 通过 SQL SUM 聚合 quality_inspect.quantity,避免把全表加载到内存 |
| | | */ |
| | | private BigDecimal sumInspectQuantity(String startInclusive, String endExclusive, Integer inspectState) { |
| | | QueryWrapper<QualityInspect> wrapper = new QueryWrapper<>(); |
| | | wrapper.select("COALESCE(SUM(quantity), 0) AS total"); |
| | | if (startInclusive != null) { |
| | | wrapper.ge("check_time", startInclusive); |
| | | } |
| | | if (endExclusive != null) { |
| | | wrapper.lt("check_time", endExclusive); |
| | | } |
| | | if (inspectState != null) { |
| | | wrapper.eq("inspect_state", inspectState); |
| | | } |
| | | List<Map<String, Object>> rows = qualityInspectMapper.selectMaps(wrapper); |
| | | if (rows == null || rows.isEmpty()) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | Object total = rows.get(0).get("total"); |
| | | if (total == null) { |
| | | return BigDecimal.ZERO; |
| | | } |
| | | return total instanceof BigDecimal ? (BigDecimal) total : new BigDecimal(total.toString()); |
| | | } |
| | | |
| | | private BigDecimal calcGrowthRate(BigDecimal today, BigDecimal prev) { |
| | |
| | | public NonComplianceWarningDto nonComplianceWarning() { |
| | | String[] range = lastSevenDaysDateRange(); |
| | | String startStr = range[0]; |
| | | String endStr = range[1]; |
| | | String endExclusiveStr = range[1]; |
| | | |
| | | // 查询近七天已处理不合格数据 |
| | | List<QualityUnqualified> list = qualityUnqualifiedMapper.selectList( |
| | | new LambdaQueryWrapper<QualityUnqualified>() |
| | | .eq(QualityUnqualified::getInspectState, 1) |
| | | .ge(QualityUnqualified::getCheckTime, startStr) |
| | | .le(QualityUnqualified::getCheckTime, endStr)); |
| | | .lt(QualityUnqualified::getCheckTime, endExclusiveStr)); |
| | | |
| | | NonComplianceWarningDto dto = new NonComplianceWarningDto(); |
| | | |
| | |
| | | } |
| | | |
| | | /** |
| | | * 获取近七天的日期区间(仅含年月日) |
| | | * 获取近七天的日期区间(仅含年月日):返回 [start, endExclusive] —— endExclusive 是今天 + 1 天,便于使用 lt 包含今天全部 |
| | | */ |
| | | public static String[] lastSevenDaysDateRange() { |
| | | LocalDate today = LocalDate.now(); |
| | | return new String[]{today.minusDays(6).toString(), today.toString()}; |
| | | return new String[]{today.minusDays(6).toString(), today.plusDays(1).toString()}; |
| | | } |
| | | |
| | | @Override |
| | | public List<CompletedInspectionCountDto> completedInspectionCount() { |
| | | String[] range = lastSevenDaysDateRange(); |
| | | String startStr = range[0]; |
| | | String endStr = range[1]; |
| | | String endExclusiveStr = range[1]; |
| | | |
| | | // 查询近七天已完成的检验数据 |
| | | List<QualityInspect> list = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() |
| | | .eq(QualityInspect::getInspectState, 1) |
| | | .ge(QualityInspect::getCheckTime, startStr) |
| | | .le(QualityInspect::getCheckTime, endStr)); |
| | | .lt(QualityInspect::getCheckTime, endExclusiveStr)); |
| | | |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd"); |
| | | |
| | |
| | | @Override |
| | | public List<UnqualifiedProductRankDto> unqualifiedProductRanking() { |
| | | |
| | | // 限定近 30 天,避免全表加载 |
| | | LocalDate today = LocalDate.now(); |
| | | String startStr = today.minusDays(29).toString(); |
| | | String endExclusiveStr = today.plusDays(1).toString(); |
| | | |
| | | List<QualityInspect> list = qualityInspectMapper.selectList(new LambdaQueryWrapper<QualityInspect>() |
| | | .eq(QualityInspect::getInspectState, 1)); |
| | | .eq(QualityInspect::getInspectState, 1) |
| | | .ge(QualityInspect::getCheckTime, startStr) |
| | | .lt(QualityInspect::getCheckTime, endExclusiveStr)); |
| | | |
| | | if (CollectionUtils.isEmpty(list)) { |
| | | return new ArrayList<>(); |
| | |
| | | List<QualityInspect> qualityInspectList = qualityInspectMapper |
| | | .selectList(new LambdaQueryWrapper<QualityInspect>() |
| | | .ge(QualityInspect::getCheckTime, startDate.toString()) |
| | | .le(QualityInspect::getCheckTime, endDate.toString()) |
| | | .lt(QualityInspect::getCheckTime, endDate.plusDays(1).toString()) |
| | | .eq(QualityInspect::getInspectState, 1)); |
| | | |
| | | QualityStatisticsDto dto = new QualityStatisticsDto(); |
| | |
| | | |
| | | // 统计每种检验类型的不合格数量 |
| | | item.setSupplierNum(list.stream() |
| | | .filter(i -> i.getInspectType() == 0) |
| | | .filter(i -> Objects.equals(i.getInspectType(), 0)) |
| | | .map(i -> i.getUnqualifiedQuantity() != null ? i.getUnqualifiedQuantity() : BigDecimal.ZERO) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add)); |
| | | item.setProcessNum(list.stream() |
| | | .filter(i -> i.getInspectType() == 1) |
| | | .filter(i -> Objects.equals(i.getInspectType(), 1)) |
| | | .map(i -> i.getUnqualifiedQuantity() != null ? i.getUnqualifiedQuantity() : BigDecimal.ZERO) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add)); |
| | | item.setFactoryNum(list.stream() |
| | | .filter(i -> i.getInspectType() == 2) |
| | | .filter(i -> Objects.equals(i.getInspectType(), 2)) |
| | | .map(i -> i.getUnqualifiedQuantity() != null ? i.getUnqualifiedQuantity() : BigDecimal.ZERO) |
| | | .reduce(BigDecimal.ZERO, BigDecimal::add)); |
| | | |
| | |
| | | return new LocalDate[]{startDate, endDate}; |
| | | } |
| | | |
| | | //计算日期内的销售出库金额 |
| | | private BigDecimal sumSalesContractAmount(LocalDate startDate, LocalDate endDate) { |
| | | List<SalesLedger> salesLedgers = defaultList(salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>() |
| | | .ge(SalesLedger::getEntryDate, toDate(startDate)) |
| | | .lt(SalesLedger::getEntryDate, toExclusiveEndDate(endDate)))); |
| | | return sumAmount(salesLedgers, SalesLedger::getContractAmount); |
| | | SalesOutboundDto salesOutboundDto = new SalesOutboundDto(); |
| | | salesOutboundDto.setStartDate(startDate); |
| | | salesOutboundDto.setEndDate(endDate); |
| | | List<SalesOutboundVo> salesOutboundVos = stockOutRecordMapper.listPageAccountSales(new Page(1, -1), salesOutboundDto).getRecords(); |
| | | return sumAmount(salesOutboundVos, SalesOutboundVo::getOutboundAmount); |
| | | } |
| | | |
| | | //计算日期内的销售退货金额 |
| | | private BigDecimal sumSalesReturnAmount(LocalDate startDate, LocalDate endDate) { |
| | | SalesReturnDto salesReturnDto = new SalesReturnDto(); |
| | | salesReturnDto.setStartDate(startDate); |
| | | salesReturnDto.setEndDate(endDate); |
| | | List<SalesReturnVo> salesReturnVos = returnManagementMapper.listPageAccountSalesReturn(new Page(1, -1), salesReturnDto).getRecords(); |
| | | return sumAmount(salesReturnVos, SalesReturnVo::getRefundAmount); |
| | | } |
| | | |
| | | //计算日期内的采购入库金额 |
| | | private BigDecimal sumPurchaseContractAmount(LocalDate startDate, LocalDate endDate) { |
| | | List<PurchaseLedger> purchaseLedgers = defaultList(purchaseLedgerMapper.selectList(new LambdaQueryWrapper<PurchaseLedger>() |
| | | .ge(PurchaseLedger::getEntryDate, toDate(startDate)) |
| | | .lt(PurchaseLedger::getEntryDate, toExclusiveEndDate(endDate)))); |
| | | return sumAmount(purchaseLedgers, PurchaseLedger::getContractAmount); |
| | | PurchaseInboundDto purchaseInboundDto = new PurchaseInboundDto(); |
| | | purchaseInboundDto.setStartDate(startDate); |
| | | purchaseInboundDto.setEndDate(endDate); |
| | | List<PurchaseInboundVo> purchaseInboundVos = stockInRecordMapper.listPageAccountPurchase(new Page(1, -1), purchaseInboundDto).getRecords(); |
| | | return sumAmount(purchaseInboundVos, PurchaseInboundVo::getInboundAmount); |
| | | } |
| | | |
| | | //计算日期内的采购退货金额 |
| | | private BigDecimal sumPurchaseReturnAmount(LocalDate startDate, LocalDate endDate) { |
| | | PurchaseReturnDto purchaseReturnDto = new PurchaseReturnDto(); |
| | | purchaseReturnDto.setStartDate(startDate); |
| | | purchaseReturnDto.setEndDate(endDate); |
| | | List<PurchaseReturnVo> purchaseReturnVos = purchaseReturnOrdersMapper.listPageAccountPurchaseReturn(new Page(1, -1), purchaseReturnDto).getRecords(); |
| | | return sumAmount(purchaseReturnVos, PurchaseReturnVo::getTotalAmount); |
| | | } |
| | | |
| | | //计算日期内的总收款金额 |
| | | private BigDecimal sumCollectionAmount(LocalDate startDate, LocalDate endDate) { |
| | | List<AccountSalesCollection> collections = defaultList(accountSalesCollectionMapper.selectList( |
| | | new LambdaQueryWrapper<AccountSalesCollection>() |
| | |
| | | return sumAmount(collections, AccountSalesCollection::getCollectionAmount); |
| | | } |
| | | |
| | | //计算日期内的总付款金额 |
| | | private BigDecimal sumPaymentAmount(LocalDate startDate, LocalDate endDate) { |
| | | List<AccountPurchasePayment> payments = defaultList(accountPurchasePaymentMapper.selectList( |
| | | new LambdaQueryWrapper<AccountPurchasePayment>() |