| | |
| | | |
| | | 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.common.enums.ApproveTypeEnum; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.consumables.mapper.ConsumablesInventoryMapper; |
| | | import com.ruoyi.device.mapper.DeviceRepairMapper; |
| | | import com.ruoyi.device.pojo.DeviceRepair; |
| | | 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.mapper.*; |
| | | import com.ruoyi.production.pojo.ProductWorkOrder; |
| | | import com.ruoyi.project.system.domain.SysDept; |
| | | import com.ruoyi.project.system.mapper.SysDeptMapper; |
| | |
| | | import com.ruoyi.purchase.pojo.PurchaseLedger; |
| | | import com.ruoyi.quality.mapper.QualityInspectMapper; |
| | | import com.ruoyi.quality.mapper.QualityUnqualifiedMapper; |
| | | import com.ruoyi.quality.mapper.RawMaterialMapper; |
| | | import com.ruoyi.quality.pojo.QualityInspect; |
| | | import com.ruoyi.quality.pojo.QualityUnqualified; |
| | | import com.ruoyi.quality.pojo.RawMaterial; |
| | | import com.ruoyi.sales.mapper.ReceiptPaymentMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerProductMapper; |
| | |
| | | private StockInventoryMapper stockInventoryMapper; |
| | | |
| | | @Autowired |
| | | private ConsumablesInventoryMapper consumablesInventoryMapper; |
| | | |
| | | @Autowired |
| | | private QualityInspectMapper qualityStatisticsMapper; |
| | | |
| | | @Autowired |
| | |
| | | |
| | | @Autowired |
| | | private QualityInspectMapper qualityInspectMapper; |
| | | |
| | | @Autowired |
| | | private RawMaterialMapper rawMaterialMapper; |
| | | |
| | | @Autowired |
| | | private QualityUnqualifiedMapper qualityUnqualifiedMapper; |
| | |
| | | } |
| | | // 统计库存 |
| | | BigDecimal stockQuantityTotal = stockInventoryMapper.selectTotal(); |
| | | BigDecimal consumablesQuantityTotal = consumablesInventoryMapper.selectTotal(); |
| | | homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString()); |
| | | homeBusinessDto.setConsumablesQuantityTotal(consumablesQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString()); |
| | | |
| | | // 获取当天入库数量 |
| | | BigDecimal bigDecimal = stockInventoryMapper.selectTotalByDate(LocalDate.now()); |
| | | BigDecimal consumablesTodayNum = consumablesInventoryMapper.selectTotalByDate(LocalDate.now()); |
| | | homeBusinessDto.setTodayInventoryNum(bigDecimal.setScale(2, RoundingMode.HALF_UP).toString()); |
| | | homeBusinessDto.setConsumablesTodayNum(consumablesTodayNum.setScale(2, RoundingMode.HALF_UP).toString()); |
| | | return homeBusinessDto; |
| | | } |
| | | |
| | |
| | | endDate = today.with(DayOfWeek.SUNDAY); |
| | | } |
| | | |
| | | List<QualityInspect> qualityInspectList = qualityInspectMapper |
| | | .selectList(new LambdaQueryWrapper<QualityInspect>() |
| | | .ge(QualityInspect::getCheckTime, startDate.toString()) |
| | | .le(QualityInspect::getCheckTime, endDate.toString()) |
| | | .eq(QualityInspect::getInspectState, 1)); |
| | | List<RawMaterial> rawMaterialList = rawMaterialMapper |
| | | .selectList(new LambdaQueryWrapper<RawMaterial>() |
| | | .ge(RawMaterial::getCheckTime, startDate.toString()) |
| | | .le(RawMaterial::getCheckTime, endDate.toString()) |
| | | .eq(RawMaterial::getInspectState, 1)); |
| | | |
| | | QualityStatisticsDto dto = new QualityStatisticsDto(); |
| | | dto.setSupplierNum(sumQuantity(qualityInspectList, 0)); // 原材料 |
| | | dto.setProcessNum(sumQuantity(qualityInspectList, 1)); // 过程 |
| | | dto.setFactoryNum(sumQuantity(qualityInspectList, 2)); // 出厂 |
| | | Map<Integer, BigDecimal> countMap = rawMaterialList.stream() |
| | | .collect(Collectors.groupingBy( |
| | | RawMaterial::getCheckType, |
| | | Collectors.collectingAndThen( |
| | | Collectors.counting(), |
| | | count -> BigDecimal.valueOf(count) |
| | | ) |
| | | )); |
| | | |
| | | // 假设 qualityInspectList 是一个 List<QualityInspect> 类型的集合 |
| | | Map<String, List<QualityInspect>> groupedByCheckResult = qualityInspectList.stream() |
| | | .collect(Collectors.groupingBy(QualityInspect::getCheckResult)); |
| | | List<QualityInspect> qualityInspects = groupedByCheckResult.get("不合格"); |
| | | if (ObjectUtils.isNull(qualityInspects) || qualityInspects.size() == 0) { |
| | | return null; |
| | | } |
| | | dto.setSupplierNum(countMap.getOrDefault(0, BigDecimal.ZERO)); // 入厂 |
| | | dto.setProcessNum(countMap.getOrDefault(1, BigDecimal.ZERO)); // 车间 |
| | | dto.setFactoryNum(countMap.getOrDefault(2, BigDecimal.ZERO)); // 出厂 |
| | | |
| | | // 3. 筛选不合格的记录(check_result = 0) |
| | | List<RawMaterial> unqualifiedList = rawMaterialList.stream() |
| | | .filter(i -> i.getCheckResult() == 0) // 0表示不合格 |
| | | .collect(Collectors.toList()); |
| | | |
| | | // 4. 处理图表项 (Item) |
| | | List<QualityStatisticsItem> itemList = new ArrayList<>(); |
| | | List<RawMaterial> 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 = qualityInspects.stream() |
| | | .collect(Collectors.groupingBy(i -> { |
| | | LocalDate ld = dateMap.get(i); |
| | | return ld.format(DateTimeFormatter.ofPattern("yyyy-MM")); |
| | | })); |
| | | Map<String, List<RawMaterial>> groupByMonth = unqualifiedList.isEmpty() ? |
| | | new HashMap<>() : |
| | | unqualifiedList.stream() |
| | | .collect(Collectors.groupingBy(i -> { |
| | | LocalDate ld = i.getCheckTime().toInstant() |
| | | .atZone(ZoneId.systemDefault()).toLocalDate(); |
| | | 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<>()))); |
| | | List<RawMaterial> monthData = groupByMonth.getOrDefault(monthStr, new ArrayList<>()); |
| | | itemList.add(buildItem(monthStr, monthData)); |
| | | } |
| | | } else { |
| | | // 周或月模式:按天分组 |
| | | Map<String, List<QualityInspect>> groupByDay = qualityInspects.stream() |
| | | .collect(Collectors.groupingBy(i -> { |
| | | LocalDate ld = dateMap.get(i); |
| | | return ld.format(DateTimeFormatter.ofPattern("MM/dd")); |
| | | })); |
| | | Map<String, List<RawMaterial>> groupByDay = unqualifiedList.isEmpty() ? |
| | | new HashMap<>() : |
| | | unqualifiedList.stream() |
| | | .collect(Collectors.groupingBy(i -> { |
| | | LocalDate ld = i.getCheckTime().toInstant() |
| | | .atZone(ZoneId.systemDefault()).toLocalDate(); |
| | | 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<>()))); |
| | | List<RawMaterial> dayData = groupByDay.getOrDefault(dayStr, new ArrayList<>()); |
| | | itemList.add(buildItem(dayStr, dayData)); |
| | | } |
| | | } |
| | | |
| | | dto.setItem(itemList); |
| | | dto.setRawItem(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(); |
| | | private RawMaterial buildItem(String dateLabel, List<RawMaterial> list) { |
| | | RawMaterial item = new RawMaterial(); |
| | | 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)); |
| | | item.setSupplierNum( |
| | | BigDecimal.valueOf(list.stream().filter(i -> i.getCheckType() == 0).count()) |
| | | ); |
| | | item.setProcessNum( |
| | | BigDecimal.valueOf(list.stream().filter(i -> i.getCheckType() == 1).count()) |
| | | ); |
| | | item.setFactoryNum( |
| | | BigDecimal.valueOf(list.stream().filter(i -> i.getCheckType() == 2).count()) |
| | | ); |
| | | |
| | | return item; |
| | | } |