src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -1,7 +1,5 @@ package com.ruoyi.home.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.approve.pojo.ApproveProcess; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; @@ -9,9 +7,6 @@ import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.home.dto.*; import com.ruoyi.home.service.HomeService; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.ProductWorkOrderDto; import com.ruoyi.production.dto.SalesLedgerWorkDto; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; @@ -59,6 +54,47 @@ return AjaxResult.success(count); } @GetMapping("/deptStaffDistribution") @ApiOperation("åé¨é¨äººååå¸") public AjaxResult deptStaffDistribution() { DeptStaffDistributionDto dto = homeService.deptStaffDistribution(); return AjaxResult.success(dto); } @GetMapping("/summaryStatistics") @ApiOperation("åå·¥-客æ·-ä¾åºåæ»æ°") public AjaxResult summaryStatistics() { HomeSummaryDto homeSummaryDto = homeService.summaryStatistics(); return AjaxResult.success(homeSummaryDto); } @GetMapping("/supplierPurchaseRanking") @ApiOperation("ä¾åºåéè´æå") public AjaxResult supplierPurchaseRanking(@RequestParam(value = "type", defaultValue = "0") Integer type) { List<SupplierPurchaseRankingDto> list = homeService.supplierPurchaseRanking(type); return AjaxResult.success(list); } @GetMapping("/customerRevenueAnalysis") @ApiOperation("客æ·è¥æ¶è´¡ç®æ°å¼åæ") public AjaxResult customerRevenueAnalysis(@RequestParam("customerId") Long customerId, @RequestParam(value = "type", defaultValue = "0") Integer type) { CustomerRevenueAnalysisDto dto = homeService.customerRevenueAnalysis(customerId, type); return AjaxResult.success(dto); } @GetMapping("/productCategoryDistribution") @ApiOperation("产å大类åå¸") public AjaxResult productCategoryDistribution() { ProductCategoryDistributionDto dto = homeService.productCategoryDistribution(); return AjaxResult.success(dto); } @GetMapping("/customerContributionRanking") @ApiOperation("客æ·éé¢è´¡ç®æå") public AjaxResult customerContributionRanking(@RequestParam(value = "type", defaultValue = "1") Integer type) { List<CustomerContributionRankingDto> list = homeService.customerContributionRanking(type); return AjaxResult.success(list); } /********************************************************è¥ééè´ç±»**************************************************/ @GetMapping("/business") src/main/java/com/ruoyi/home/dto/CustomerContributionRankingDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.ruoyi.home.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * 客æ·éé¢è´¡ç®æåDTO */ @Data @ApiModel("客æ·éé¢è´¡ç®æå") public class CustomerContributionRankingDto { @ApiModelProperty("客æ·åç§°") private String customerName; @ApiModelProperty("ååæ»éé¢") private BigDecimal totalAmount; } src/main/java/com/ruoyi/home/dto/CustomerRevenueAnalysisDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ package com.ruoyi.home.dto; import com.ruoyi.dto.MapDto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * 客æ·è¥æ¶è´¡ç®æ°å¼åæDTO */ @Data @ApiModel("客æ·è¥æ¶è´¡ç®æ°å¼åæ") public class CustomerRevenueAnalysisDto { @ApiModelProperty("åææ¡ç®å表") private List<MapDto> items; } src/main/java/com/ruoyi/home/dto/DeptStaffDistributionDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.home.dto; import com.ruoyi.dto.MapDto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * é¨é¨äººååå¸ç»è®¡DTO */ @Data @ApiModel("é¨é¨äººååå¸ç»è®¡") public class DeptStaffDistributionDto { @ApiModelProperty("é¨é¨æ»äººæ°") private Long total; @ApiModelProperty("é¨é¨åå¸å表") private List<MapDto> items; } src/main/java/com/ruoyi/home/dto/HomeSummaryDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,31 @@ package com.ruoyi.home.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * é¦é¡µæ±æ»ç»è®¡DTO */ @Data @ApiModel("é¦é¡µæ±æ»ç»è®¡") public class HomeSummaryDto { @ApiModelProperty("æ»å·¥ä½äººå") private Long totalStaff; @ApiModelProperty("æ»å·¥ä½äººå忝å¢é¿ç") private String staffGrowthRate; @ApiModelProperty("æ»å®¢æ·æ°") private Long totalCustomer; @ApiModelProperty("æ»å®¢æ·åæ¯å¢é¿ç") private String customerGrowthRate; @ApiModelProperty("æ»ä¾åºåæ°") private Long totalSupplier; @ApiModelProperty("æ»ä¾åºå忝å¢é¿ç") private String supplierGrowthRate; } src/main/java/com/ruoyi/home/dto/ProductCategoryDistributionDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,49 @@ package com.ruoyi.home.dto; import com.ruoyi.dto.MapDto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * 产å大类åå¸ç»è®¡DTO */ @Data @ApiModel("产å大类åå¸ç»è®¡") public class ProductCategoryDistributionDto { @ApiModelProperty("大类åå¸å表") private List<MajorCategoryDto> items; @Data public static class MajorCategoryDto { @ApiModelProperty("大类åç§°") private String name; @ApiModelProperty("åºåæ»æ°") private String value; @ApiModelProperty("å æ¯") private String rate; @ApiModelProperty("å°ç±»åå¸è¯¦æ ") private List<MinorCategoryDto> children; } @Data public static class MinorCategoryDto { @ApiModelProperty("å°ç±»åç§°") private String name; @ApiModelProperty("åºåæ°é") private String value; @ApiModelProperty("å æ¯") private String rate; @ApiModelProperty("åå·åå¸è¯¦æ ") private List<MapDto> children; } } src/main/java/com/ruoyi/home/dto/SupplierPurchaseRankingDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.ruoyi.home.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * ä¾åºåéè´æåDTO */ @Data @ApiModel("ä¾åºåéè´æå") public class SupplierPurchaseRankingDto { @ApiModelProperty("ä¾åºååç§°") private String supplierName; @ApiModelProperty("éè´æ»éé¢") private BigDecimal totalAmount; } src/main/java/com/ruoyi/home/service/HomeService.java
@@ -33,4 +33,16 @@ ProductionProgressDto productionProgress(); ProductionTurnoverDto workInProcessTurnover(); DeptStaffDistributionDto deptStaffDistribution(); HomeSummaryDto summaryStatistics(); List<SupplierPurchaseRankingDto> supplierPurchaseRanking(Integer type); CustomerRevenueAnalysisDto customerRevenueAnalysis(Long customerId, Integer type); ProductCategoryDistributionDto productCategoryDistribution(); List<CustomerContributionRankingDto> customerContributionRanking(Integer type); } src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -1,45 +1,40 @@ package com.ruoyi.home.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.basic.pojo.ProductModel; import com.ruoyi.basic.pojo.SupplierManage; import com.ruoyi.collaborativeApproval.mapper.NoticeMapper; import com.ruoyi.collaborativeApproval.pojo.Notice; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.device.mapper.DeviceMaintenanceMapper; import com.ruoyi.device.mapper.DeviceRepairMapper; import com.ruoyi.device.pojo.DeviceMaintenance; 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.service.HomeService; import com.ruoyi.lavorissue.mapper.LavorIssueMapper; import com.ruoyi.lavorissue.pojo.LaborIssue; import com.ruoyi.procurementrecord.mapper.CustomStorageMapper; import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; import com.ruoyi.procurementrecord.pojo.CustomStorage; import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut; 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.dto.ProductionProductMainDto; import com.ruoyi.production.mapper.ProductOrderMapper; import com.ruoyi.production.mapper.ProductProcessMapper; import com.ruoyi.production.mapper.ProductWorkOrderMapper; import com.ruoyi.production.mapper.ProductionProductMainMapper; import com.ruoyi.production.pojo.ProductOrder; 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.SysUserDept; import com.ruoyi.project.system.mapper.SysDeptMapper; import com.ruoyi.project.system.mapper.SysUserDeptMapper; import com.ruoyi.purchase.mapper.PaymentRegistrationMapper; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PaymentRegistration; @@ -49,9 +44,13 @@ 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; import com.ruoyi.staff.mapper.StaffOnJobMapper; import com.ruoyi.staff.pojo.StaffOnJob; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -60,13 +59,11 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** @@ -87,13 +84,7 @@ private SalesLedgerProductMapper salesLedgerProductMapper; @Autowired private ProcurementRecordOutMapper procurementRecordOutMapper; @Autowired private ProcurementRecordMapper procurementRecordStorageMapper; @Autowired private CustomStorageMapper customStorageMapper; @Autowired private QualityInspectMapper qualityStatisticsMapper; @@ -108,9 +99,6 @@ private PaymentRegistrationMapper paymentRegistrationMapper; @Autowired private LavorIssueMapper lavorIssueMapper; @Autowired private SysDeptMapper sysDeptMapper; @Autowired @@ -118,13 +106,24 @@ @Autowired private ProductOrderMapper productOrderMapper; @Autowired private ProductProcessMapper productProcessMapper; @Autowired private ProductWorkOrderMapper productWorkOrderMapper; @Autowired private ProductModelMapper productModelMapper; @Autowired private ProductMapper productMapper; @Autowired private StockUtils stockUtils; @Autowired private StaffOnJobMapper staffOnJobMapper; @Autowired private CustomerMapper customerMapper; @Autowired private SupplierManageMapper supplierManageMapper; @Autowired private SysUserMapper sysUserMapper; @Autowired private SysUserDeptMapper sysUserDeptMapper; @Override public HomeBusinessDto business() { // æå»ºç»æ @@ -581,6 +580,398 @@ productionTurnoverDto.setProcessDetails(strings); productionTurnoverDto.setProcessQuantityDetails(processQuantityDetails); return productionTurnoverDto; } @Override public DeptStaffDistributionDto deptStaffDistribution() { DeptStaffDistributionDto dto = new DeptStaffDistributionDto(); List<MapDto> items = new ArrayList<>(); // æ¥è¯¢æææ£å¸¸ä¸æªå é¤çé¨é¨ List<SysDept> depts = sysDeptMapper.selectDeptList(new SysDept()); if (CollectionUtils.isEmpty(depts)) { dto.setItems(items); return dto; } long totalUsers = 0; List<Map<String, Object>> countsByDept = new ArrayList<>(); for (SysDept dept : depts) { if ("0".equals(dept.getStatus()) && "0".equals(dept.getDelFlag())) { Long count = sysUserDeptMapper.selectCount(new LambdaQueryWrapper<SysUserDept>() .eq(SysUserDept::getDeptId, dept.getDeptId())); if (count > 0) { Map<String, Object> map = new HashMap<>(); map.put("name", dept.getDeptName()); map.put("count", count); countsByDept.add(map); totalUsers += count; } } } if (totalUsers > 0) { BigDecimal total = BigDecimal.valueOf(totalUsers); for (Map<String, Object> map : countsByDept) { MapDto mapDto = new MapDto(); mapDto.setName((String) map.get("name")); Long count = (Long) map.get("count"); mapDto.setValue(count.toString()); mapDto.setRate(BigDecimal.valueOf(count).multiply(new BigDecimal("100")) .divide(total, 2, RoundingMode.HALF_UP).toString()); items.add(mapDto); } } dto.setTotal(totalUsers); dto.setItems(items); return dto; } @Override public HomeSummaryDto summaryStatistics() { HomeSummaryDto dto = new HomeSummaryDto(); LocalDate now = LocalDate.now(); YearMonth currentMonth = YearMonth.from(now); YearMonth prevMonth = currentMonth.minusMonths(1); LocalDateTime currentMonthEnd = currentMonth.atEndOfMonth().atTime(23, 59, 59); LocalDateTime prevMonthEnd = prevMonth.atEndOfMonth().atTime(23, 59, 59); // æ»å·¥ä½äººå Long currentStaff = countStaff(currentMonthEnd); Long prevStaff = countStaff(prevMonthEnd); dto.setTotalStaff(currentStaff); dto.setStaffGrowthRate(calculateMoM(currentStaff, prevStaff)); // æ»å®¢æ·æ° Long currentCustomers = countCustomers(currentMonthEnd); Long prevCustomers = countCustomers(prevMonthEnd); dto.setTotalCustomer(currentCustomers); dto.setCustomerGrowthRate(calculateMoM(currentCustomers, prevCustomers)); // æ»ä¾åºåæ° Long currentSuppliers = countSuppliers(currentMonthEnd); Long prevSuppliers = countSuppliers(prevMonthEnd); dto.setTotalSupplier(currentSuppliers); dto.setSupplierGrowthRate(calculateMoM(currentSuppliers, prevSuppliers)); return dto; } private Long countStaff(LocalDateTime dateTime) { Long sysUserCount = sysUserMapper.selectCount(new LambdaQueryWrapper<SysUser>() .eq(SysUser::getDelFlag, "0") .le(SysUser::getCreateTime, dateTime)); Long staffCountItem = staffOnJobMapper.selectCount(new LambdaQueryWrapper<StaffOnJob>() .le(StaffOnJob::getCreateTime, dateTime)); return sysUserCount + staffCountItem; } private Long countCustomers(LocalDateTime dateTime) { return customerMapper.selectCount(new LambdaQueryWrapper<Customer>() .le(Customer::getMaintenanceTime, dateTime.toLocalDate())); } private Long countSuppliers(LocalDateTime dateTime) { return supplierManageMapper.selectCount(new LambdaQueryWrapper<SupplierManage>() .le(SupplierManage::getCreateTime, dateTime)); } private String calculateMoM(Number current, Number prev) { BigDecimal curVal = new BigDecimal(current.toString()); BigDecimal prevVal = new BigDecimal(prev.toString()); if (prevVal.compareTo(BigDecimal.ZERO) == 0) { return curVal.compareTo(BigDecimal.ZERO) > 0 ? "100.00" : "0.00"; } return curVal.subtract(prevVal) .divide(prevVal, 4, RoundingMode.HALF_UP) .multiply(new BigDecimal("100")) .setScale(2, RoundingMode.HALF_UP) .toString(); } @Override public List<SupplierPurchaseRankingDto> supplierPurchaseRanking(Integer type) { LocalDate today = LocalDate.now(); LocalDate startDate; LocalDate endDate; switch (type) { case 0: // å¨ startDate = today.with(DayOfWeek.MONDAY); endDate = today.with(DayOfWeek.SUNDAY); break; case 1: // æ startDate = today.with(TemporalAdjusters.firstDayOfMonth()); endDate = today.with(TemporalAdjusters.lastDayOfMonth()); break; case 2: // å£åº¦ 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"); List<Map<String, Object>> maps = purchaseLedgerMapper.selectMaps(queryWrapper); return maps.stream().map(map -> { SupplierPurchaseRankingDto dto = new SupplierPurchaseRankingDto(); dto.setSupplierName(map.get("supplier_name") != null ? map.get("supplier_name").toString() : ""); Object amount = map.get("total_amount"); dto.setTotalAmount(amount != null ? new BigDecimal(amount.toString()) : BigDecimal.ZERO); return dto; }).collect(Collectors.toList()); } @Override public CustomerRevenueAnalysisDto customerRevenueAnalysis(Long customerId, Integer type) { CustomerRevenueAnalysisDto dto = new CustomerRevenueAnalysisDto(); List<MapDto> items = new ArrayList<>(); LocalDate today = LocalDate.now(); LocalDate start; LocalDate end; boolean groupByMonth = false; switch (type) { case 0: // å¨ start = today.with(DayOfWeek.MONDAY); end = today.with(DayOfWeek.SUNDAY); break; case 1: // æ start = today.with(TemporalAdjusters.firstDayOfMonth()); end = today.with(TemporalAdjusters.lastDayOfMonth()); break; case 2: // å£åº¦ Month firstMonthOfQuarter = today.getMonth().firstMonthOfQuarter(); start = today.withMonth(firstMonthOfQuarter.getValue()).with(TemporalAdjusters.firstDayOfMonth()); end = today.withMonth(firstMonthOfQuarter.plus(2).getValue()).with(TemporalAdjusters.lastDayOfMonth()); groupByMonth = true; break; default: dto.setItems(items); return dto; } List<SalesLedger> list = salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>() .eq(SalesLedger::getCustomerId, customerId) .ge(SalesLedger::getEntryDate, start) .le(SalesLedger::getEntryDate, end)); if (groupByMonth) { for (int i = 0; i < 3; i++) { LocalDate m = start.plusMonths(i); String monthName = m.getMonthValue() + "æ"; BigDecimal sum = list.stream() .filter(l -> l.getEntryDate() != null) .filter(l -> { LocalDate ld = l.getEntryDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); return ld.getMonth() == m.getMonth() && ld.getYear() == m.getYear(); }) .map(SalesLedger::getContractAmount) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); MapDto mapDto = new MapDto(); mapDto.setName(monthName); mapDto.setValue(sum.setScale(2, RoundingMode.HALF_UP).toString()); items.add(mapDto); } } else { long days = ChronoUnit.DAYS.between(start, end) + 1; for (int i = 0; i < days; i++) { LocalDate d = start.plusDays(i); String dayName = d.getMonthValue() + "/" + d.getDayOfMonth(); BigDecimal sum = list.stream() .filter(l -> l.getEntryDate() != null) .filter(l -> l.getEntryDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate().equals(d)) .map(SalesLedger::getContractAmount) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); MapDto mapDto = new MapDto(); mapDto.setName(dayName); mapDto.setValue(sum.setScale(2, RoundingMode.HALF_UP).toString()); items.add(mapDto); } } dto.setItems(items); return dto; } @Override public ProductCategoryDistributionDto productCategoryDistribution() { ProductCategoryDistributionDto dto = new ProductCategoryDistributionDto(); List<ProductCategoryDistributionDto.MajorCategoryDto> majorItems = new ArrayList<>(); // ææç产å大类åå°ç±» List<Product> allProducts = productMapper.selectList(new LambdaQueryWrapper<Product>()); 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()); // ä» 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")); 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; 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; 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()); } else { majorDto.setRate("0.00"); } majorDto.setChildren(minorDtos); majorItems.add(majorDto); } dto.setItems(majorItems); return dto; } @Override public List<CustomerContributionRankingDto> customerContributionRanking(Integer type) { LocalDate today = LocalDate.now(); LocalDate startDate = null; LocalDate endDate = null; switch (type) { case 0: startDate = today.with(DayOfWeek.MONDAY); endDate = today.with(DayOfWeek.SUNDAY); break; case 1: startDate = today.with(TemporalAdjusters.firstDayOfMonth()); endDate = today.with(TemporalAdjusters.lastDayOfMonth()); break; case 2: 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; } QueryWrapper<SalesLedger> queryWrapper = new QueryWrapper<>(); queryWrapper.select("customer_name", "SUM(contract_amount) as total_amount") .isNotNull("customer_name") .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<>(); for (Map<String, Object> map : maps) { CustomerContributionRankingDto rankingDto = new CustomerContributionRankingDto(); rankingDto.setCustomerName(map.get("customer_name").toString()); rankingDto.setTotalAmount(map.get("total_amount") != null ? new BigDecimal(map.get("total_amount").toString()) : BigDecimal.ZERO); result.add(rankingDto); } return result; } } src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -91,7 +91,7 @@ ProductWorkOrder productWorkOrder = new ProductWorkOrder(); productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(productOrder.getId()); ProductOrder order = productOrderMapper.selectById(productOrder); ProductOrder order = productOrderMapper.selectById(productOrder.getId()); productWorkOrder.setPlanQuantity(order.getQuantity()); productWorkOrder.setWorkOrderNo(workOrderNoStr); productWorkOrder.setStatus(1); src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -187,7 +187,7 @@ qualityInspect.setModel(productModel.getModel()); qualityInspect.setUnit(productModel.getUnit()); qualityInspect.setQuantity(productQty); qualityInspect.setProcess(productProcess.getName()); qualityInspect.setProcess(process); qualityInspect.setInspectState(0); qualityInspect.setInspectType(inspectType); qualityInspect.setProductMainId(productionProductMain.getId()); @@ -209,7 +209,7 @@ } /*æ´æ°å·¥ååç产订å*/ ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId()); productWorkOrder.setCompleteQuantity(productQty.add(dto.getQuantity())); productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(productQty)); if (ObjectUtils.isNull(productWorkOrder.getActualStartTime())) { productWorkOrder.setActualStartTime(LocalDate.now());//å®é å¼å§æ¶é´ } @@ -291,7 +291,7 @@ // å é¤äº§åºè®°å½ productionProductOutputMapper.delete(new LambdaQueryWrapper<ProductionProductOutput>() .eq(ProductionProductOutput::getProductMainId, productionProductMain.getId())); //å é¤å ¥åº //å é¤æå ¥è®°å½ productionProductInputMapper.delete(new LambdaQueryWrapper<ProductionProductInput>() .eq(ProductionProductInput::getProductMainId, productionProductMain.getId())); //å 餿¥åºçå ¥åºè®°å½ src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.math.LongMath; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.controller.BaseController; @@ -14,6 +15,7 @@ import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.service.ProcurementRecordOutService; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.sales.mapper.ShipmentApprovalMapper; import com.ruoyi.sales.mapper.ShippingInfoMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; @@ -47,9 +49,7 @@ @Autowired private ISalesLedgerProductService salesLedgerProductService; @Autowired private ProcurementRecordOutService procurementRecordOutService; @Autowired private ProcurementRecordService procurementRecordStorageService; private StockUtils stockUtils; @GetMapping("/listPage") @ApiOperation("å货审æ¹å表") @@ -99,18 +99,9 @@ // throw new ServiceException("éè´è®°å½ä¸åå¨ï¼å®¡æ¹åæ»"); // } // çæåºåºè®°å½ ProcurementRecordOutAdd procurementRecordOutAdd = new ProcurementRecordOutAdd(); // procurementRecordOutAdd.setId(procurementRecordStorage.getId()); procurementRecordOutAdd.setId(0); procurementRecordOutAdd.setProductModelId(salesLedgerProduct.getProductModelId()); procurementRecordOutAdd.setSalesLedgerProductId((long) Math.toIntExact(salesLedgerProduct.getId())); procurementRecordOutAdd.setType(2); procurementRecordOutAdd.setUserId(Math.toIntExact(getUserId())); procurementRecordOutAdd.setQuantity(salesLedgerProduct.getQuantity().toPlainString()); procurementRecordOutAdd.setTime(LocalDate.now().toString()); procurementRecordOutService.stockout(procurementRecordOutAdd); //åºåº stockUtils.addStock(salesLedgerProduct.getProductModelId(), salesLedgerProduct.getQuantity(), StockQualifiedRecordTypeEnum.SALE_SHIP_STOCK_OUT.getCode(), req.getId()); } return AjaxResult.success(); src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
@@ -6,7 +6,6 @@ import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.service.StockInRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.compensationperformance.pojo.CompensationPerformance; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.R; @@ -93,4 +92,16 @@ public R stockInAndOutRecord(StockInventoryDto stockInventoryDto,Page page) { return R.ok(stockInventoryService.stockInAndOutRecord(stockInventoryDto,page)); } @PostMapping("/frozenStock") @ApiOperation("å»ç»åºå") public R frozenStock(@RequestBody StockInventoryDto stockInventoryDto) { return R.ok(stockInventoryService.frozenStock(stockInventoryDto)); } @PostMapping("/thawStock") @ApiOperation("è§£å»åºå") public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) { return R.ok(stockInventoryService.thawStock(stockInventoryDto)); } } src/main/java/com/ruoyi/stock/controller/StockOutRecordController.java
@@ -5,9 +5,7 @@ import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockOutRecordDto; import com.ruoyi.stock.pojo.StockOutRecord; import com.ruoyi.stock.service.StockOutRecordService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; src/main/java/com/ruoyi/stock/controller/StockUninventoryController.java
@@ -2,9 +2,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockUnQualifiedRecordTypeEnum; import com.ruoyi.framework.web.domain.R; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.service.StockUninventoryService; import io.swagger.annotations.ApiOperation; @@ -57,4 +57,17 @@ stockUninventoryService.exportStockUninventory(response,stockUninventoryDto); } @PostMapping("/frozenStock") @ApiOperation("å»ç»åºå") public R frozenStock(@RequestBody StockInventoryDto stockInventoryDto) { return R.ok(stockUninventoryService.frozenStock(stockInventoryDto)); } @PostMapping("/thawStock") @ApiOperation("è§£å»åºå") public R thawStock(@RequestBody StockInventoryDto stockInventoryDto) { return R.ok(stockUninventoryService.thawStock(stockInventoryDto)); } } src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
@@ -1,6 +1,5 @@ package com.ruoyi.stock.dto; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import com.ruoyi.stock.pojo.StockInRecord; import lombok.Data; src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -37,4 +37,6 @@ private BigDecimal totalStockIn; private BigDecimal totalStockOut; private BigDecimal currentStock; private BigDecimal unLockedQuantity; } src/main/java/com/ruoyi/stock/dto/StockUninventoryDto.java
@@ -3,6 +3,8 @@ import com.ruoyi.stock.pojo.StockUninventory; import lombok.Data; import java.math.BigDecimal; @Data public class StockUninventoryDto extends StockUninventory { private String productName; @@ -15,4 +17,6 @@ //å ¥åºç±»å对åºçid private Long recordId; private BigDecimal unLockedQuantity; } src/main/java/com/ruoyi/stock/execl/StockInventoryExportData.java
@@ -1,14 +1,9 @@ package com.ruoyi.stock.execl; import com.alibaba.excel.annotation.ExcelProperty; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; @Data public class StockInventoryExportData { @@ -27,6 +22,12 @@ @Excel(name = "åºåæ°é") private BigDecimal qualitity; @Excel(name = "é¢è¦æ°é") private BigDecimal warnNum; @Excel(name = "å»ç»æ°é") private BigDecimal lockedQuantity; @Excel(name = "夿³¨") private String remark; // src/main/java/com/ruoyi/stock/execl/StockUnInventoryExportData.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,36 @@ package com.ruoyi.stock.execl; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; import java.math.BigDecimal; @Data public class StockUnInventoryExportData { @Excel(name = "产ååç§°") private String productName; @Excel(name = "è§æ ¼") private String model; @Excel(name = "åä½") private String unit; @Excel(name = "åºåæ°é") private BigDecimal qualitity; @Excel(name = "å»ç»æ°é") private BigDecimal lockedQuantity; @Excel(name = "夿³¨") private String remark; // // @Excel(name = "ææ°æ´æ°æ¶é´") // @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") // private LocalDateTime updateTime; } src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -1,12 +1,12 @@ package com.ruoyi.stock.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.execl.StockInventoryExportData; import com.ruoyi.stock.pojo.StockInventory; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; src/main/java/com/ruoyi/stock/mapper/StockUninventoryMapper.java
@@ -1,11 +1,11 @@ package com.ruoyi.stock.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.execl.StockInventoryExportData; import com.ruoyi.stock.execl.StockUnInventoryExportData; import com.ruoyi.stock.pojo.StockUninventory; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -28,5 +28,5 @@ int updateAddStockUnInventory(@Param("ew") StockUninventoryDto stockUninventoryDto); List<StockInventoryExportData> listStockInventoryExportData(@Param("ew") StockUninventoryDto stockUninventoryDto); List<StockUnInventoryExportData> listStockInventoryExportData(@Param("ew") StockUninventoryDto stockUninventoryDto); } src/main/java/com/ruoyi/stock/pojo/StockInventory.java
@@ -3,19 +3,17 @@ import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.lang.Nullable; import javax.validation.constraints.NotBlank; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <p> @@ -61,7 +59,7 @@ private BigDecimal lockedQuantity; @ApiModelProperty("é¢è¦æ°é") private Integer warnNum; private BigDecimal warnNum; @ApiModelProperty("夿³¨") private String remark; src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
@@ -3,13 +3,16 @@ import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <p> @@ -37,11 +40,15 @@ private BigDecimal qualitity; @TableField(fill = FieldFill.INSERT) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; @ApiModelProperty("æ´æ°æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private Integer updateTime; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime updateTime; @ApiModelProperty("çæ¬å·") private Integer version; @@ -49,4 +56,7 @@ @ApiModelProperty("夿³¨") private String remark; @ApiModelProperty("被订åé宿°é") private BigDecimal lockedQuantity; } src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -2,15 +2,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.framework.web.domain.R; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.pojo.StockInventory; import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.util.List; /** * <p> @@ -36,4 +35,7 @@ IPage<StockInventoryDto> stockInAndOutRecord(StockInventoryDto stockInventoryDto,Page page); Boolean frozenStock(StockInventoryDto stockInventoryDto); Boolean thawStock(StockInventoryDto stockInventoryDto); } src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
@@ -2,9 +2,10 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.pojo.StockUninventory; import com.baomidou.mybatisplus.extension.service.IService; import javax.servlet.http.HttpServletResponse; @@ -25,4 +26,8 @@ Integer subtractStockUninventory(StockUninventoryDto stockUninventoryDto); void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto); Boolean frozenStock(StockInventoryDto stockInventoryDto); Boolean thawStock(StockInventoryDto stockInventoryDto); } src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -11,12 +11,10 @@ import com.ruoyi.common.utils.OrderUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.staff.pojo.StaffOnJob; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.execl.StockInRecordExportData; import com.ruoyi.stock.execl.StockInventoryExportData; import com.ruoyi.stock.mapper.StockInRecordMapper; import com.ruoyi.stock.mapper.StockInventoryMapper; import com.ruoyi.stock.mapper.StockUninventoryMapper; @@ -25,7 +23,6 @@ import com.ruoyi.stock.pojo.StockUninventory; import com.ruoyi.stock.service.StockInRecordService; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockQualifiedRecordTypeEnum; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.R; @@ -13,11 +14,10 @@ import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockOutRecordDto; import com.ruoyi.stock.execl.StockInventoryExportData; import com.ruoyi.stock.pojo.StockInventory; import com.ruoyi.stock.mapper.StockInventoryMapper; import com.ruoyi.stock.pojo.StockInventory; import com.ruoyi.stock.service.StockInRecordService; import com.ruoyi.stock.service.StockInventoryService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.stock.service.StockOutRecordService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; @@ -70,6 +70,8 @@ newStockInventory.setQualitity(stockInventoryDto.getQualitity()); newStockInventory.setVersion(1); newStockInventory.setRemark(stockInventoryDto.getRemark()); newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity()); newStockInventory.setWarnNum(stockInventoryDto.getWarnNum()); stockInventoryMapper.insert(newStockInventory); }else { stockInventoryMapper.updateAddStockInventory(stockInventoryDto); @@ -90,6 +92,9 @@ stockOutRecordDto.setType("0"); stockOutRecordService.add(stockOutRecordDto); StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId())); if (stockInventoryDto.getQualitity().compareTo( oldStockInventory.getQualitity().subtract(oldStockInventory.getLockedQuantity()))>0) { throw new RuntimeException("åºåä¸è¶³æ æ³åºåº"); } if (ObjectUtils.isEmpty(oldStockInventory)) { throw new RuntimeException("产ååºåä¸åå¨"); }else { @@ -120,6 +125,11 @@ stockInventoryDto.setRecordType(StockQualifiedRecordTypeEnum.CUSTOMIZATION_STOCK_IN.getCode()); stockInventoryDto.setQualitity(dto.getQualitity()); stockInventoryDto.setRemark(dto.getRemark()); stockInventoryDto.setWarnNum(dto.getWarnNum()); if (ObjectUtils.isNotEmpty(dto.getLockedQuantity())&&dto.getLockedQuantity().compareTo(dto.getQualitity())>0) { throw new RuntimeException("å»ç»æ°éä¸è½è¶ è¿æ¬æ¬¡å¯¼å ¥çåºåæ°é"); } stockInventoryDto.setLockedQuantity(dto.getLockedQuantity()); stockInventoryDto.setProductModelId(item.getProductModelId()); this.addstockInventory(stockInventoryDto); matched = true; @@ -167,4 +177,28 @@ public IPage<StockInventoryDto> stockInAndOutRecord(StockInventoryDto stockInventoryDto, Page page) { return stockInventoryMapper.stockInAndOutRecord(stockInventoryDto,page); } @Override public Boolean frozenStock(StockInventoryDto stockInventoryDto) { StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId()); if (stockInventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity())<0) { throw new RuntimeException("å»ç»æ°éä¸è½è¶ è¿åºåæ°é"); } if (ObjectUtils.isEmpty(stockInventory.getLockedQuantity())) { stockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity()); }else { stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().add(stockInventoryDto.getLockedQuantity())); } return this.updateById(stockInventory); } @Override public Boolean thawStock(StockInventoryDto stockInventoryDto) { StockInventory stockInventory = stockInventoryMapper.selectById(stockInventoryDto.getId()); if (stockInventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity())<0) { throw new RuntimeException("è§£å»æ°éä¸è½è¶ è¿å»ç»æ°é"); } stockInventory.setLockedQuantity(stockInventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity())); return this.updateById(stockInventory); } } src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -14,7 +14,6 @@ import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockOutRecordDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.execl.StockInRecordExportData; import com.ruoyi.stock.execl.StockOutRecordExportData; import com.ruoyi.stock.mapper.StockInventoryMapper; import com.ruoyi.stock.mapper.StockOutRecordMapper; @@ -25,7 +24,6 @@ import com.ruoyi.stock.pojo.StockUninventory; import com.ruoyi.stock.service.StockOutRecordService; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletResponse; src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -4,18 +4,18 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockOutRecordDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.execl.StockInventoryExportData; import com.ruoyi.stock.pojo.StockInventory; import com.ruoyi.stock.pojo.StockUninventory; import com.ruoyi.stock.execl.StockUnInventoryExportData; import com.ruoyi.stock.mapper.StockUninventoryMapper; import com.ruoyi.stock.pojo.StockUninventory; import com.ruoyi.stock.service.StockInRecordService; import com.ruoyi.stock.service.StockOutRecordService; import com.ruoyi.stock.service.StockUninventoryService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -94,8 +94,32 @@ @Override public void exportStockUninventory(HttpServletResponse response, StockUninventoryDto stockUninventoryDto) { List<StockInventoryExportData> list = stockUninventoryMapper.listStockInventoryExportData(stockUninventoryDto); ExcelUtil<StockInventoryExportData> util = new ExcelUtil<>(StockInventoryExportData.class); List<StockUnInventoryExportData> list = stockUninventoryMapper.listStockInventoryExportData(stockUninventoryDto); ExcelUtil<StockUnInventoryExportData> util = new ExcelUtil<>(StockUnInventoryExportData.class); util.exportExcel(response,list, "ä¸åæ ¼åºåä¿¡æ¯"); } @Override public Boolean frozenStock(StockInventoryDto stockInventoryDto) { StockUninventory stockUninventory = stockUninventoryMapper.selectById(stockInventoryDto.getId()); if (stockUninventory.getQualitity().compareTo(stockInventoryDto.getLockedQuantity())<0) { throw new RuntimeException("å»ç»æ°éä¸è½è¶ è¿åºåæ°é"); } if (ObjectUtils.isEmpty(stockUninventory.getLockedQuantity())) { stockUninventory.setLockedQuantity(stockInventoryDto.getLockedQuantity()); }else { stockUninventory.setLockedQuantity(stockUninventory.getLockedQuantity().add(stockInventoryDto.getLockedQuantity())); } return this.updateById(stockUninventory); } @Override public Boolean thawStock(StockInventoryDto stockInventoryDto) { StockUninventory stockUninventory = stockUninventoryMapper.selectById(stockInventoryDto.getId()); if (stockUninventory.getLockedQuantity().compareTo(stockInventoryDto.getLockedQuantity())<0) { throw new RuntimeException("è§£å»æ°éä¸è½è¶ è¿å»ç»æ°é"); } stockUninventory.setLockedQuantity(stockUninventory.getLockedQuantity().subtract(stockInventoryDto.getLockedQuantity())); return this.updateById(stockUninventory); } } src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -25,6 +25,12 @@ <if test="ew.remark != null and ew.remark !=''"> remark = #{ew.remark}, </if> <if test="ew.warnNum != null and ew.warnNum !=''"> warn_num = #{ew.warnNum}, </if> <if test="ew.lockedQuantity != null and ew.lockedQuantity !=''"> locked_quantity = locked_quantity + #{ew.lockedQuantity}, </if> update_time = now() </set> where product_model_id = #{ew.productModelId} @@ -46,7 +52,15 @@ where product_model_id = #{ew.productModelId} and qualitity >= #{ew.qualitity} </update> <select id="pagestockInventory" resultType="com.ruoyi.stock.dto.StockInventoryDto"> select si.*, select si.id, si.qualitity, COALESCE(si.locked_quantity, 0) as locked_quantity, si.product_model_id, si.create_time, si.update_time, COALESCE(si.warn_num, 0) as warn_num, si.version, (si.qualitity - COALESCE(si.locked_quantity, 0)) as un_locked_quantity, pm.model, pm.unit, p.product_name @@ -63,6 +77,8 @@ pm.model, pm.unit, p.product_name, coalesce(si.warn_num, 0) as warn_num, coalesce(si.locked_quantity, 0) as locked_quantity, si.remark, si.update_time from stock_inventory si src/main/resources/mapper/stock/StockUninventoryMapper.xml
@@ -44,7 +44,15 @@ where product_model_id = #{ew.productModelId} </update> <select id="pageStockUninventory" resultType="com.ruoyi.stock.dto.StockUninventoryDto"> select su.*, select su.id, su.qualitity, COALESCE(su.locked_quantity, 0) as locked_quantity, su.product_model_id, su.create_time, su.update_time, su.version, su.update_time, (su.qualitity - COALESCE(su.locked_quantity, 0)) as un_locked_quantity, pm.model, pm.unit, p.product_name @@ -56,7 +64,7 @@ and p.product_name like concat('%',#{ew.productName},'%') </if> </select> <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData"> <select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockUnInventoryExportData"> select su.*, pm.model, pm.unit,