| | |
| | | import com.ruoyi.basic.pojo.SupplierManage; |
| | | import com.ruoyi.collaborativeApproval.mapper.NoticeMapper; |
| | | import com.ruoyi.collaborativeApproval.pojo.Notice; |
| | | import com.ruoyi.common.enums.ApproveTypeEnum; |
| | | import com.ruoyi.common.utils.SecurityUtils; |
| | | import com.ruoyi.device.mapper.DeviceRepairMapper; |
| | | import com.ruoyi.device.pojo.DeviceRepair; |
| | |
| | | import com.ruoyi.production.mapper.ProductWorkOrderMapper; |
| | | 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; |
| | |
| | | import com.ruoyi.sales.mapper.ReceiptPaymentMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerMapper; |
| | | import com.ruoyi.sales.mapper.SalesLedgerProductMapper; |
| | | import com.ruoyi.project.system.domain.SysUser; |
| | | import com.ruoyi.project.system.mapper.SysUserMapper; |
| | | import com.ruoyi.sales.pojo.ReceiptPayment; |
| | | import com.ruoyi.sales.pojo.SalesLedger; |
| | | import com.ruoyi.sales.pojo.SalesLedgerProduct; |
| | |
| | | if(CollectionUtils.isEmpty(approveProcesses)){ |
| | | approveProcesses = new ArrayList<>(); |
| | | } |
| | | |
| | | approveProcesses.forEach(a -> { |
| | | if (a.getApproveType() != null) { |
| | | a.setApproveTypeName(ApproveTypeEnum.getNameByCode(a.getApproveType())); |
| | | } |
| | | }); |
| | | // // æ¥è¯¢æªé¢ç¨å³ä¿è®°å½ |
| | | // SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
| | | // |
| | |
| | | // approveProcesses.add(approveProcess); |
| | | // } |
| | | // } |
| | | |
| | | |
| | | return approveProcesses; |
| | | } |
| | | |
| | |
| | | LocalDate startDate; |
| | | LocalDate endDate; |
| | | switch (type) { |
| | | case 0: // å¨ |
| | | case 1: // å¨ |
| | | startDate = today.with(DayOfWeek.MONDAY); |
| | | endDate = today.with(DayOfWeek.SUNDAY); |
| | | break; |
| | | case 1: // æ |
| | | case 2: // æ |
| | | startDate = today.with(TemporalAdjusters.firstDayOfMonth()); |
| | | endDate = today.with(TemporalAdjusters.lastDayOfMonth()); |
| | | break; |
| | | case 2: // å£åº¦ |
| | | case 3: // å£åº¦ |
| | | Month currentMonth = today.getMonth(); |
| | | Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter(); |
| | | Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2); |
| | |
| | | boolean groupByMonth = false; |
| | | |
| | | switch (type) { |
| | | case 0: // å¨ |
| | | case 1: // å¨ |
| | | start = today.with(DayOfWeek.MONDAY); |
| | | end = today.with(DayOfWeek.SUNDAY); |
| | | break; |
| | | case 1: // æ |
| | | case 2: // æ |
| | | start = today.with(TemporalAdjusters.firstDayOfMonth()); |
| | | end = today.with(TemporalAdjusters.lastDayOfMonth()); |
| | | break; |
| | | case 2: // å£åº¦ |
| | | case 3: // å£åº¦ |
| | | Month firstMonthOfQuarter = today.getMonth().firstMonthOfQuarter(); |
| | | start = today.withMonth(firstMonthOfQuarter.getValue()).with(TemporalAdjusters.firstDayOfMonth()); |
| | | end = today.withMonth(firstMonthOfQuarter.plus(2).getValue()).with(TemporalAdjusters.lastDayOfMonth()); |
| | |
| | | ProductCategoryDistributionDto dto = new ProductCategoryDistributionDto(); |
| | | List<ProductCategoryDistributionDto.MajorCategoryDto> majorItems = new ArrayList<>(); |
| | | |
| | | // ææç产å大类åå°ç±» |
| | | List<Product> allProducts = productMapper.selectList(new LambdaQueryWrapper<Product>()); |
| | | // æ¥è¯¢ææç产åç±»å« |
| | | List<Product> allProducts = productMapper.selectList(new LambdaQueryWrapper<>()); |
| | | if (CollectionUtils.isEmpty(allProducts)) { |
| | | dto.setItems(majorItems); |
| | | return dto; |
| | | } |
| | | |
| | | List<Product> majorCategories = allProducts.stream().filter(p -> p.getParentId() == null).collect(Collectors.toList()); |
| | | List<Product> minorCategories = allProducts.stream().filter(p -> p.getParentId() != null).collect(Collectors.toList()); |
| | | // å离大类åå°ç±» |
| | | List<Product> majorCategories = allProducts.stream() |
| | | .filter(p -> p.getParentId() == null) |
| | | .collect(Collectors.toList()); |
| | | List<Product> minorCategories = allProducts.stream() |
| | | .filter(p -> p.getParentId() != null) |
| | | .collect(Collectors.toList()); |
| | | |
| | | // ä» sales_ledger_product æ¿å°æ¯ä¸ªäº§åçåå·åºå |
| | | // éå
å«è§æ ¼åå·ä»¥æ¯æä¸çº§åå¸ |
| | | List<Map<String, Object>> quantityMaps = salesLedgerProductMapper.selectMaps(new QueryWrapper<SalesLedgerProduct>() |
| | | .select("product_id", "specification_model", "type", "SUM(quantity) as sum_qty") |
| | | .isNotNull("product_id") |
| | | .groupBy("product_id", "specification_model", "type")); |
| | | // æç¶ç±»ID对å°ç±»è¿è¡åç» |
| | | Map<Long, List<Product>> minorGroupMap = minorCategories.stream() |
| | | .collect(Collectors.groupingBy(Product::getParentId)); |
| | | |
| | | Map<Long, Map<String, Map<Integer, BigDecimal>>> modelStockGroups = new HashMap<>(); |
| | | for (Map<String, Object> map : quantityMaps) { |
| | | Long productId = Long.parseLong(map.get("product_id").toString()); |
| | | String model = map.get("specification_model") != null ? map.get("specification_model").toString() : "æªç¥åå·"; |
| | | Integer type = Integer.parseInt(map.get("type").toString()); |
| | | BigDecimal sum = map.get("sum_qty") != null ? new BigDecimal(map.get("sum_qty").toString()) : BigDecimal.ZERO; |
| | | int totalMinorCount = minorCategories.size(); |
| | | |
| | | modelStockGroups.computeIfAbsent(productId, k -> new HashMap<>()) |
| | | .computeIfAbsent(model, k -> new HashMap<>()) |
| | | .put(type, sum); |
| | | } |
| | | |
| | | // åºåå¹¶æ±æ» |
| | | Map<Long, List<MapDto>> productModelsMap = new HashMap<>(); |
| | | Map<Long, BigDecimal> productTotalStockMap = new HashMap<>(); |
| | | |
| | | for (Long pid : modelStockGroups.keySet()) { |
| | | Map<String, Map<Integer, BigDecimal>> models = modelStockGroups.get(pid); |
| | | BigDecimal productStock = BigDecimal.ZERO; |
| | | List<MapDto> modelDtos = new ArrayList<>(); |
| | | |
| | | for (String modelName : models.keySet()) { |
| | | Map<Integer, BigDecimal> types = models.get(modelName); |
| | | BigDecimal procurement = types.getOrDefault(2, BigDecimal.ZERO); |
| | | BigDecimal sales = types.getOrDefault(1, BigDecimal.ZERO); |
| | | BigDecimal stock = procurement.subtract(sales); |
| | | if (stock.compareTo(BigDecimal.ZERO) < 0) stock = BigDecimal.ZERO; |
| | | |
| | | MapDto modelDto = new MapDto(); |
| | | modelDto.setName(modelName); |
| | | modelDto.setValue(stock.stripTrailingZeros().toPlainString()); |
| | | modelDtos.add(modelDto); |
| | | productStock = productStock.add(stock); |
| | | } |
| | | productModelsMap.put(pid, modelDtos); |
| | | productTotalStockMap.put(pid, productStock); |
| | | } |
| | | |
| | | BigDecimal totalInventory = productTotalStockMap.values().stream().reduce(BigDecimal.ZERO, BigDecimal::add); |
| | | |
| | | // åå·å æ¯ |
| | | if (totalInventory.compareTo(BigDecimal.ZERO) > 0) { |
| | | for (List<MapDto> dtos : productModelsMap.values()) { |
| | | for (MapDto m : dtos) { |
| | | BigDecimal val = new BigDecimal(m.getValue()); |
| | | m.setRate(val.multiply(new BigDecimal("100")) |
| | | .divide(totalInventory, 2, RoundingMode.HALF_UP).toString()); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // å屿°æ® |
| | | for (Product major : majorCategories) { |
| | | ProductCategoryDistributionDto.MajorCategoryDto majorDto = new ProductCategoryDistributionDto.MajorCategoryDto(); |
| | | majorDto.setName(major.getProductName()); |
| | | |
| | | List<ProductCategoryDistributionDto.MinorCategoryDto> minorDtos = new ArrayList<>(); |
| | | BigDecimal majorStock = BigDecimal.ZERO; |
| | | List<Product> children = minorGroupMap.getOrDefault(major.getId(), new ArrayList<>()); |
| | | int childrenSize = children.size(); |
| | | // 设置å°ç±»çæ»æ° |
| | | majorDto.setValue(String.valueOf(childrenSize)); |
| | | |
| | | for (Product minor : minorCategories) { |
| | | if (major.getId().equals(minor.getParentId())) { |
| | | BigDecimal stock = productTotalStockMap.getOrDefault(minor.getId(), BigDecimal.ZERO); |
| | | ProductCategoryDistributionDto.MinorCategoryDto minorDto = new ProductCategoryDistributionDto.MinorCategoryDto(); |
| | | minorDto.setName(minor.getProductName()); |
| | | minorDto.setValue(stock.stripTrailingZeros().toPlainString()); |
| | | |
| | | if (totalInventory.compareTo(BigDecimal.ZERO) > 0) { |
| | | minorDto.setRate(stock.multiply(new BigDecimal("100")) |
| | | .divide(totalInventory, 2, RoundingMode.HALF_UP).toString()); |
| | | } else { |
| | | minorDto.setRate("0.00"); |
| | | } |
| | | |
| | | minorDto.setChildren(productModelsMap.getOrDefault(minor.getId(), new ArrayList<>())); |
| | | minorDtos.add(minorDto); |
| | | majorStock = majorStock.add(stock); |
| | | } |
| | | } |
| | | |
| | | majorDto.setValue(majorStock.stripTrailingZeros().toPlainString()); |
| | | |
| | | if (totalInventory.compareTo(BigDecimal.ZERO) > 0) { |
| | | majorDto.setRate(majorStock.multiply(new BigDecimal("100")) |
| | | .divide(totalInventory, 2, RoundingMode.HALF_UP).toString()); |
| | | // 计ç®å æ¯ |
| | | if (totalMinorCount > 0) { |
| | | BigDecimal rate = BigDecimal.valueOf(childrenSize) |
| | | .multiply(new BigDecimal("100")) |
| | | .divide(BigDecimal.valueOf(totalMinorCount), 2, RoundingMode.HALF_UP); |
| | | majorDto.setRate(rate.toString()); |
| | | } else { |
| | | majorDto.setRate("0.00"); |
| | | } |
| | | |
| | | List<ProductCategoryDistributionDto.MinorCategoryDto> minorDtos = new ArrayList<>(); |
| | | for (Product minor : children) { |
| | | ProductCategoryDistributionDto.MinorCategoryDto minorDto = new ProductCategoryDistributionDto.MinorCategoryDto(); |
| | | minorDto.setName(minor.getProductName()); |
| | | minorDto.setValue("0"); |
| | | minorDto.setRate("0.00"); |
| | | minorDto.setChildren(new ArrayList<>()); |
| | | minorDtos.add(minorDto); |
| | | } |
| | | majorDto.setChildren(minorDtos); |
| | | majorItems.add(majorDto); |
| | |
| | | LocalDate startDate = null; |
| | | LocalDate endDate = null; |
| | | switch (type) { |
| | | case 0: |
| | | case 1: |
| | | startDate = today.with(DayOfWeek.MONDAY); |
| | | endDate = today.with(DayOfWeek.SUNDAY); |
| | | break; |
| | | case 1: |
| | | case 2: |
| | | startDate = today.with(TemporalAdjusters.firstDayOfMonth()); |
| | | endDate = today.with(TemporalAdjusters.lastDayOfMonth()); |
| | | break; |
| | | case 2: |
| | | case 3: |
| | | Month currentMonth = today.getMonth(); |
| | | Month firstMonthOfQuarter = currentMonth.firstMonthOfQuarter(); |
| | | Month lastMonthOfQuarter = Month.of(firstMonthOfQuarter.getValue() + 2); |