src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import org.apache.ibatis.annotations.Param; @@ -17,6 +18,8 @@ IPage<ProductModel> listPageProductModel(Page<ProductModel> page, @Param("c") ProductModel productModel); IPage<ProductModel> listPageProductionStock(Page<ProductModel> page, @Param("req") ProcurementPageDto req); ProductModel selectLatestRecord(); } src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -6,6 +6,7 @@ import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @TableName("product_model") @@ -59,4 +60,7 @@ @TableField(exist = false) @Excel(name = "å©ä½åºå") private BigDecimal stockQuantity; @TableField(exist = false) private LocalDateTime createTime; } src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -99,7 +99,7 @@ @GetMapping("/workInProcessTurnover") @ApiOperation("å¨å¶åå¨è½¬æ åµ") public AjaxResult workInProcessTurnover(){ Map<Integer, List<ProductWorkOrderDto>> productWorkOrderDtoMap = homeService.workInProcessTurnover(); return AjaxResult.success(productWorkOrderDtoMap); ProductionTurnoverDto productionTurnoverDto = homeService.workInProcessTurnover(); return AjaxResult.success(productionTurnoverDto); } } src/main/java/com/ruoyi/home/dto/ProductionProgressDto.java
@@ -12,14 +12,14 @@ @ApiModel public class ProductionProgressDto { @ApiModelProperty("æ»è®¢åæ°") private Integer totalOrderCount; private Long totalOrderCount; @ApiModelProperty("å·²å®æè®¢åæ°") private Integer completedOrderCount; private Long completedOrderCount; @ApiModelProperty("æªå®æè®¢åæ°") private Integer uncompletedOrderCount; @ApiModelProperty("æ»ä½å®æè¿åº¦") private BigDecimal completedProgressCount; private Long uncompletedOrderCount; @ApiModelProperty("é¨åå®æè®¢åæ°") private Long partialCompletedOrderCount; @ApiModelProperty("订å详æ ") private List<ProductOrderDto> completedOrderDetails; } src/main/java/com/ruoyi/home/dto/ProductionTurnoverDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ package com.ruoyi.home.dto; import com.ruoyi.production.dto.ProductOrderDto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.List; @Data @ApiModel public class ProductionTurnoverDto { @ApiModelProperty("æ»å¨å¶æ°é") private Long totalOrderCount; @ApiModelProperty("å¹³åå¨è½¬å¤©æ°") private BigDecimal averageTurnoverDays; @ApiModelProperty("å¨è½¬æç") private BigDecimal turnoverEfficiency; @ApiModelProperty("å·¥åºè¯¦æ ") private List<String> processDetails; @ApiModelProperty("å·¥åºå¯¹åºçæ°é详æ ") private List<Long> processQuantityDetails; } src/main/java/com/ruoyi/home/service/HomeService.java
@@ -31,6 +31,6 @@ Long noticesCount(); ProductionProgressDto productionProgress(); Map<Integer, List<ProductWorkOrderDto>> workInProcessTurnover(); ProductionProgressDto productionProgress(); ProductionTurnoverDto workInProcessTurnover(); } src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -2,9 +2,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.ProductModelMapper; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.collaborativeApproval.mapper.NoticeMapper; import com.ruoyi.collaborativeApproval.pojo.Notice; import com.ruoyi.common.utils.SecurityUtils; @@ -24,13 +27,16 @@ 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.mapper.SysDeptMapper; @@ -57,6 +63,7 @@ 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; @@ -111,10 +118,13 @@ @Autowired private ProductOrderMapper productOrderMapper; @Autowired private ProductionProductMainMapper productionProductMainMapper; private ProductProcessMapper productProcessMapper; @Autowired private ProductWorkOrderMapper productWorkOrderMapper; @Autowired private ProductModelMapper productModelMapper; @Autowired private StockUtils stockUtils; @Override public HomeBusinessDto business() { // æå»ºç»æ @@ -167,23 +177,35 @@ homeBusinessDto.setMonthPurchaseHaveMoney(unReceiptPaymentAmount.setScale(2, RoundingMode.HALF_UP).toString()); } // ç»è®¡åºå List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(null); BigDecimal stockAmount = procurementRecordStorages.stream() .map(ProcurementRecordStorage::getInboundNum) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); // èªå®ä¹åºå List<CustomStorage> customStorages = customStorageMapper.selectList(null); BigDecimal customStockAmount = customStorages.stream() .map(CustomStorage::getInboundNum) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(null); BigDecimal outboundAmount = procurementRecordOuts.stream() .map(ProcurementRecordOut::getInboundNum) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal stock = stockAmount.add(customStockAmount).subtract(outboundAmount); // List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordStorageMapper.selectList(null); // BigDecimal stockAmount = procurementRecordStorages.stream() // .map(ProcurementRecordStorage::getInboundNum) // .filter(Objects::nonNull) // .reduce(BigDecimal.ZERO, BigDecimal::add); // // èªå®ä¹åºå // List<CustomStorage> customStorages = customStorageMapper.selectList(null); // BigDecimal customStockAmount = customStorages.stream() // .map(CustomStorage::getInboundNum) // .filter(Objects::nonNull) // .reduce(BigDecimal.ZERO, BigDecimal::add); // List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(null); // BigDecimal outboundAmount = procurementRecordOuts.stream() // .map(ProcurementRecordOut::getInboundNum) // .filter(Objects::nonNull) // .reduce(BigDecimal.ZERO, BigDecimal::add); // BigDecimal stock = stockAmount.add(customStockAmount).subtract(outboundAmount); IPage<ProductModel> productModelIPage = productModelMapper.listPageProductModel(new Page<>(1, -1), new ProductModel()); if(!CollectionUtils.isEmpty(productModelIPage.getRecords())){ //è·åè§æ ¼id List<Long> modelIds = productModelIPage.getRecords().stream().map(ProductModel::getId).collect(Collectors.toList()); BigDecimal stockQuantityTotal = modelIds.stream() .map(stockUtils::getStockQuantity) .map(map -> map.get("stockQuantity")) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); homeBusinessDto.setInventoryNum(stockQuantityTotal.setScale(2, RoundingMode.HALF_UP).toString()); } // è·åå½å¤©å ¥åºæ°é LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>(); procurementRecordStorageLambdaQueryWrapper.ge(ProcurementRecordStorage::getCreateTime, now) // 大äºçäºå½å¤© @@ -193,7 +215,7 @@ .map(ProcurementRecordStorage::getInboundNum) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); homeBusinessDto.setInventoryNum(stock.setScale(2, RoundingMode.HALF_UP).toString()); // homeBusinessDto.setInventoryNum(stock.setScale(2, RoundingMode.HALF_UP).toString()); homeBusinessDto.setTodayInventoryNum(stockAmount1.setScale(2, RoundingMode.HALF_UP).toString()); return homeBusinessDto; } @@ -510,37 +532,55 @@ @Override public ProductionProgressDto productionProgress() { ProductionProgressDto productionProgressDto = new ProductionProgressDto(); List<ProductOrder> productOrderList = productOrderMapper.selectList(new LambdaQueryWrapper<ProductOrder>()); List<ProductOrderDto> productOrderDtoList = new ArrayList<>(); productOrderList.forEach(productOrder -> { ProductOrderDto productOrderDto = productOrderMapper.productMainByOrderId(productOrder); // if (productOrderDto != null && productOrderDto.getPlanQuantity() != null && productOrderDto.getQuantity() != null) { // productOrderDto.setCompletionStatus((productOrderDto.getPlanQuantity().subtract(productOrderDto.getQuantity())).divide(productOrderDto.getPlanQuantity(), 2, RoundingMode.HALF_UP)); // } productOrderDtoList.add(productOrderDto); }); productionProgressDto.setCompletedOrderDetails(productOrderDtoList); // 1. æ¥è¯¢ææç产订åï¼å¯æ ¹æ®éæ±æ·»å è¿æ»¤æ¡ä»¶ï¼å¦æé¤å·²å é¤ã已忶ç订åï¼ IPage<ProductOrderDto> productOrderDtoIPage = productOrderMapper.pageProductOrder(new Page<>(1, -1), new ProductOrderDto()); // 2. åå§åæ±æ»æ°æ® int totalCount = productOrderDtoIPage.getRecords().size(); int completedCount = (int) productOrderDtoIPage.getRecords().stream().map(productOrderDto -> productOrderMapper.productMainByOrderId(productOrderDto)).filter(productOrderDto1 -> productOrderDto1.getQuantity() != null && productOrderDto1.getQuantity().compareTo(BigDecimal.ZERO) == 0).count(); // 6. èµå¼æ±æ»æ°æ® ProductOrderDto orderDto = new ProductOrderDto(); orderDto.setStartTime(LocalDateTime.now().minusMonths(1)); orderDto.setEndTime(LocalDateTime.now()); List<ProductOrderDto> productOrderDtos = productOrderMapper.pageProductOrder(new Page<>(1, -1), orderDto).getRecords(); productionProgressDto.setCompletedOrderDetails(productOrderDtos); long totalCount = productOrderDtos.size(); long count = productOrderDtos.stream().filter(productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(productOrderDto.getQuantity()) >= 0).count(); long count2 = productOrderDtos.stream().filter(productOrderDto -> productOrderDto.getCompleteQuantity().compareTo(BigDecimal.ZERO) == 0).count(); productionProgressDto.setTotalOrderCount(totalCount); productionProgressDto.setCompletedOrderCount(completedCount); productionProgressDto.setUncompletedOrderCount(totalCount - completedCount); productionProgressDto.setCompletedProgressCount(BigDecimal.valueOf(completedCount).divide(BigDecimal.valueOf(totalCount), 2, RoundingMode.HALF_UP)); productionProgressDto.setCompletedOrderCount(count); productionProgressDto.setUncompletedOrderCount(count2); productionProgressDto.setPartialCompletedOrderCount(totalCount-count-count2); return productionProgressDto; } @Override public Map<Integer, List<ProductWorkOrderDto>> workInProcessTurnover() { List<ProductWorkOrderDto> productWorkOrderDtoList = productWorkOrderMapper.selectProductWorkOrderDtoList(); //æ ¹æ®ç¶æåºåå·¥åçåä¸ªç¶æ Map<Integer, List<ProductWorkOrderDto>> productWorkOrderDtoMap = productWorkOrderDtoList.stream().collect(Collectors.groupingBy(ProductWorkOrderDto::getStatus)); return productWorkOrderDtoMap; public ProductionTurnoverDto workInProcessTurnover() { ProductionTurnoverDto productionTurnoverDto = new ProductionTurnoverDto(); ProductWorkOrderDto workOrder = new ProductWorkOrderDto(); workOrder.setPlanStartTime(LocalDate.now().minusMonths(1)); workOrder.setPlanEndTime(LocalDate.now()); List<ProductWorkOrderDto> productWorkOrders = productWorkOrderMapper.pageProductWorkOrder(new Page<>(1, -1), workOrder).getRecords(); long sum = productWorkOrders.stream() .filter(productWorkOrder -> productWorkOrder.getPlanQuantity().compareTo(productWorkOrder.getCompleteQuantity()) > 0) .map(ProductWorkOrder::getPlanQuantity) .mapToLong(BigDecimal::longValue) .sum(); if (sum == 0)return null; productionTurnoverDto.setTotalOrderCount(sum);//æ»å¨å¶åæ°é productionTurnoverDto.setAverageTurnoverDays(BigDecimal.valueOf(sum).divide(BigDecimal.valueOf(ChronoUnit.DAYS.between(LocalDateTime.now().minusMonths(1), LocalDateTime.now())),2,RoundingMode.HALF_UP)); long completeQuantity = productWorkOrders.stream() .filter(productWorkOrder -> productWorkOrder.getCompleteQuantity().compareTo(productWorkOrder.getPlanQuantity()) >= 0) .map(ProductWorkOrder::getCompleteQuantity) .mapToLong(BigDecimal::longValue) .sum(); productionTurnoverDto.setTurnoverEfficiency(BigDecimal.valueOf(completeQuantity).divide(BigDecimal.valueOf(sum),2,RoundingMode.HALF_UP)); Map<String, List<ProductWorkOrderDto>> map = productWorkOrders.stream() .filter(productWorkOrder -> productWorkOrder.getPlanQuantity().compareTo(productWorkOrder.getCompleteQuantity()) > 0) .collect(Collectors.groupingBy(ProductWorkOrderDto::getProcessName)); List<String> strings = new ArrayList<>(); List<Long> processQuantityDetails = new ArrayList<>(); map.entrySet().stream().forEach(entry -> { String key = entry.getKey(); long completeSum = entry.getValue().stream().map(ProductWorkOrderDto::getCompleteQuantity).mapToLong(BigDecimal::longValue).sum(); strings.add(key); processQuantityDetails.add(completeSum); }); productionTurnoverDto.setProcessDetails(strings); productionTurnoverDto.setProcessQuantityDetails(processQuantityDetails); return productionTurnoverDto; } } src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -237,8 +237,8 @@ @GetMapping("/listPageProductionStock") @Log(title = "åºå管ç-æååºå", businessType = BusinessType.OTHER) public AjaxResult listPageProductionStock(Page page) { IPage<ProductModel> result = procurementRecordService.listPageProductionStock(page); public AjaxResult listPageProductionStock(Page page, ProcurementPageDto procurementDto) { IPage<ProductModel> result = procurementRecordService.listPageProductionStock(page,procurementDto); return AjaxResult.success(result); } } src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -60,7 +60,7 @@ BigDecimal getProcurementAmount(Long salesProductId); InventoryInformationDto getReportList(); IPage<ProductModel> listPageProductionStock(Page page); IPage<ProductModel> listPageProductionStock(Page page, ProcurementPageDto procurementDto); IPage<ProcurementPageDto> listPageByProductProduction(Page page, ProcurementPageDto procurementDto); } src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -882,16 +882,10 @@ } return procurementPageDtoCopyIPage; } @Override public IPage<ProductModel> listPageProductionStock(Page page) { ProductModel productModel = new ProductModel(); IPage<ProductModel> iPage = productModelMapper.listPageProductModel(page, productModel); iPage.getRecords().forEach(item -> { item.setInboundNum(stockUtils.getStockQuantity(item.getId()).get("inboundNum")); item.setOutboundNum(stockUtils.getStockQuantity(item.getId()).get("outboundNum")); item.setStockQuantity(stockUtils.getStockQuantity(item.getId()).get("stockQuantity")); }); return iPage; public IPage<ProductModel> listPageProductionStock(Page page, ProcurementPageDto dto) { return productModelMapper.listPageProductionStock(page, dto); } @Override src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
@@ -17,5 +17,4 @@ IPage<ProductWorkOrderDto> pageProductWorkOrder(Page<ProductWorkOrderDto> page, @Param("c") ProductWorkOrderDto productWorkOrder); List<ProductWorkOrderDto> selectProductWorkOrderDtoList(); } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -24,6 +24,8 @@ import com.ruoyi.framework.security.LoginUser; import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.purchase.dto.PurchaseLedgerDto; @@ -108,6 +110,7 @@ private final QualityTestStandardParamMapper qualityTestStandardParamMapper; private final QualityInspectParamMapper qualityInspectParamMapper; private final ProcurementRecordMapper procurementRecordStorageMapper; @Value("${file.upload-dir}") private String uploadDir; @@ -409,6 +412,19 @@ if (ids == null || ids.length == 0) { throw new BaseException("请éä¸è³å°ä¸æ¡æ°æ®"); } // æ¹éå é¤å ³èçéè´å ¥åºè®°å½ LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductQueryWrapper = new LambdaQueryWrapper<>(); salesLedgerProductQueryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids) .eq(SalesLedgerProduct::getType, 2); List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(salesLedgerProductQueryWrapper); if (CollectionUtils.isNotEmpty(salesLedgerProducts)) { salesLedgerProducts.stream().forEach(salesLedgerProduct -> { // æ¹éå é¤å ³èçéè´å°è´¦äº§å LambdaQueryWrapper<ProcurementRecordStorage> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, salesLedgerProduct.getId()); procurementRecordStorageMapper.delete(queryWrapper); }); } // æ¹éå é¤å ³èçéè´å°è´¦äº§å LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SalesLedgerProduct::getSalesLedgerId, ids) src/main/java/com/ruoyi/quality/controller/QualityTestStandardController.java
@@ -1,12 +1,16 @@ package com.ruoyi.quality.controller; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.quality.pojo.QualityTestStandard; import com.ruoyi.quality.pojo.QualityTestStandardParam; import com.ruoyi.quality.service.IQualityTestStandardService; import com.ruoyi.quality.service.QualityTestStandardParamService; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Nonnull; import javax.annotation.Resource; import java.util.List; @@ -24,6 +28,9 @@ @Resource private IQualityTestStandardService qualityTestStandardService; @Resource private QualityTestStandardParamService qualityTestStandardParamService; /** @@ -46,7 +53,7 @@ if(CollectionUtils.isEmpty(ids)){ return AjaxResult.error("è¯·éæ©è³å°ä¸æ¡æ°æ®"); } return AjaxResult.success(qualityTestStandardService.removeBatchByIds(ids)); return AjaxResult.success(qualityTestStandardService.delQualityTestStandard(ids)); } /** @@ -90,4 +97,22 @@ return AjaxResult.success(qualityTestStandardService.updateBatchById(qualityTestStandards)); } /** * æ ¹æ®äº§åidæ¥è¯¢ç¸å ³çæ£éªæ å * @return */ @GetMapping("/getQualityTestStandardByProductId") public AjaxResult getQualityTestStandardByProductId(@Nonnull Long productId, @Nonnull Integer inspectType, String process) { return AjaxResult.success(qualityTestStandardService.getQualityTestStandardByProductId(productId,inspectType,process)); } /** * æ ¹æ®æ£æµæ åidæ¥è¯¢ç¸å ³çæ£éªæ ååæ° * @return */ @GetMapping("/getQualityTestStandardParamByTestStandardId") public AjaxResult getQualityTestStandardParamByTestStandardId(Long testStandardId) { return AjaxResult.success(qualityTestStandardParamService.list(Wrappers.<QualityTestStandardParam>lambdaQuery().eq(QualityTestStandardParam::getTestStandardId, testStandardId))); } } src/main/java/com/ruoyi/quality/mapper/QualityTestStandardMapper.java
@@ -7,6 +7,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * <p> * æ£æµæ å主表 Mapper æ¥å£ @@ -19,4 +21,6 @@ public interface QualityTestStandardMapper extends BaseMapper<QualityTestStandard> { IPage<QualityTestStandard> qualityTestStandardListPage(Page page, @Param("c") QualityTestStandard qualityTestStandard); List<QualityTestStandard> getQualityTestStandardByProductId(@Param("productId") Long productId, @Param("inspectType") Integer inspectType, @Param("process") String process); } src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -149,4 +149,7 @@ //ä¸åæ ¼ç°è±¡ private String defectivePhenomena; @ApiModelProperty("å ³èæ£æµæ å主表id") private Long testStandardId; } src/main/java/com/ruoyi/quality/service/IQualityTestStandardService.java
@@ -4,6 +4,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.quality.pojo.QualityTestStandard; import com.ruoyi.quality.pojo.QualityTestStandardParam; import java.util.List; /** * <p> @@ -19,4 +22,7 @@ int copyParam(QualityTestStandard qualityTestStandard); List<QualityTestStandard> getQualityTestStandardByProductId(Long productId, Integer inspectType,String process); int delQualityTestStandard(List<Integer> ids); } src/main/java/com/ruoyi/quality/service/impl/QualityTestStandardServiceImpl.java
@@ -1,11 +1,18 @@ package com.ruoyi.quality.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.mapper.ProductModelMapper; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.mapper.QualityTestStandardBindingMapper; import com.ruoyi.quality.mapper.QualityTestStandardParamMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityTestStandard; import com.ruoyi.quality.mapper.QualityTestStandardMapper; import com.ruoyi.quality.pojo.QualityTestStandardBinding; import com.ruoyi.quality.pojo.QualityTestStandardParam; import com.ruoyi.quality.service.IQualityTestStandardService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -37,9 +44,15 @@ @Autowired private QualityTestStandardParamService qualityTestStandardParamService; @Autowired private QualityTestStandardBindingMapper qualityTestStandardBindingMapper; @Autowired private QualityInspectMapper qualityInspectMapper; @Override public IPage<QualityTestStandard> qualityTestStandardListPage(Page page, QualityTestStandard qualityTestStandard) { return qualityTestStandardMapper.qualityTestStandardListPage(page,qualityTestStandard); return qualityTestStandardMapper.qualityTestStandardListPage(page, qualityTestStandard); } @Override @@ -52,11 +65,27 @@ qualityTestStandardMapper.insert(testStandard); List<QualityTestStandardParam> newQualityTestStandardParams = oldQualityTestStandardParams.stream().map(oldQualityTestStandardParam -> { oldQualityTestStandardParam.setTestStandardId(testStandard.getId()); oldQualityTestStandardParam.setId(null); return oldQualityTestStandardParam; }).collect(Collectors.toList()); qualityTestStandardParamService.saveBatch(newQualityTestStandardParams); return 0; } @Override public List<QualityTestStandard> getQualityTestStandardByProductId(Long productId, Integer inspectType, String process) { return qualityTestStandardMapper.getQualityTestStandardByProductId(productId, inspectType, process); } @Override public int delQualityTestStandard(List<Integer> ids) { //å æ¥è¯¢è¯¥æ£æµæ åæ¯å¦æè¢«å¼ç¨å¦æè¢«å¼ç¨å°±ä¸å 许å é¤ List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(Wrappers.<QualityInspect>lambdaQuery().in(QualityInspect::getTestStandardId, ids)); if (qualityInspects.size() > 0) { throw new RuntimeException("è¯¥æ£æµæ åæè¢«å¼ç¨ä¸å 许å é¤"); } return qualityTestStandardMapper.deleteBatchIds(ids); } } src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.R; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy; import com.ruoyi.procurementrecord.service.ProcurementRecordService; @@ -140,4 +141,10 @@ } return toAjax(salesLedgerProductService.deleteSalesLedgerProductByIds(ids)); } //æ ¹æ®äº§åidè·åbom夿åºåæ¯å¦å è¶³ @GetMapping("/judgmentInventory") public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) { return salesLedgerProductService.judgmentInventory(salesLedgerProduct); } } src/main/java/com/ruoyi/sales/service/ISalesLedgerProductService.java
@@ -3,6 +3,7 @@ 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.sales.dto.SalesLedgerProductDto; import com.ruoyi.sales.pojo.SalesLedgerProduct; @@ -27,4 +28,7 @@ IPage<SalesLedgerProductDto> listPage(Page page, SalesLedgerProductDto salesLedgerProduct); IPage<SalesLedgerProductDto> listPagePurchaseLedger(Page page, SalesLedgerProductDto salesLedgerProduct); R judgmentInventory(SalesLedgerProduct salesLedgerProduct); } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -8,6 +8,9 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.web.domain.R; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.production.dto.ProductStructureDto; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; @@ -31,6 +34,7 @@ import java.lang.reflect.Field; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; @@ -70,6 +74,13 @@ private ProductionProductOutputMapper productionProductOutputMapper; private ProductionProductInputMapper productionProductInputMapper; private QualityInspectMapper qualityInspectMapper; private StockUtils stockUtils; @Autowired private ProductStructureMapper productStructureMapper; @Override public SalesLedgerProduct selectSalesLedgerProductById(Long id) { @@ -478,4 +489,38 @@ throw new RuntimeException("å¨ææ´æ°ä¸»è¡¨éé¢å¤±è´¥", e); } } @Override public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) { //è·åäº§åææ°çå·¥èºè·¯çº¿ ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()).orderByDesc(ProcessRoute::getCreateTime).last("LIMIT 1")); if (processRoute == null) { return R.fail("请å 设置工èºè·¯çº¿"); } List<ProductStructureDto> productStructureDtos = productStructureMapper.listBybomId(processRoute.getBomId()); if (productStructureDtos.isEmpty()) { return R.fail("请å 设置产åç»æ"); } int count = 0; StringBuilder stringBuffer = new StringBuilder(); for (ProductStructureDto productStructureDto : productStructureDtos) { BigDecimal stockQuantity = stockUtils.getStockQuantity(productStructureDto.getProductModelId()).get("stockQuantity"); //æéæ°é BigDecimal multiply = salesLedgerProduct.getQuantity().multiply(productStructureDto.getUnitQuantity()); BigDecimal subtract =stockQuantity.subtract(multiply).divide(BigDecimal.ONE, 2, RoundingMode.CEILING); if (subtract.compareTo(BigDecimal.ZERO) <= 0) { count++; stringBuffer.append(productStructureDto.getProductName()) .append("-") .append(productStructureDto.getModel()) .append("åºåä¸è¶³ï¼å°") .append(subtract) .append(System.lineSeparator()); } } if (count>0) { return R.fail(stringBuffer.toString()); }else { return R.ok(); } } } src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -34,5 +34,68 @@ LIMIT 1 </select> <select id="listPageProductionStock" resultType="com.ruoyi.basic.pojo.ProductModel"> SELECT pm.id, pm.product_id, pm.model, pm.unit, p.product_name, GREATEST(s.last_in_time, o.last_out_time) AS create_time, COALESCE(s.inboundNum, 0) AS inboundNum, COALESCE(o.outboundNum, 0) AS outboundNum, COALESCE(s.inboundNum, 0) - COALESCE(o.outboundNum, 0) AS stockQuantity FROM product_model pm LEFT JOIN product p ON pm.product_id = p.id -- å ¥åºæ±æ» LEFT JOIN ( SELECT product_model_id, SUM(inbound_num) AS inboundNum, MAX(create_time) AS last_in_time FROM procurement_record_storage <where> <if test="req.timeStr != null and req.timeStr != ''"> AND create_time >= #{req.timeStr} AND create_time < DATE_ADD(#{req.timeStr}, INTERVAL 1 DAY) </if> </where> GROUP BY product_model_id ) s ON s.product_model_id = pm.id -- åºåºæ±æ» LEFT JOIN ( SELECT product_model_id, SUM(inbound_num) AS outboundNum, MAX(create_time) AS last_out_time FROM procurement_record_out <where> <if test="req.timeStr != null and req.timeStr != ''"> AND create_time >= #{req.timeStr} AND create_time < DATE_ADD(#{req.timeStr}, INTERVAL 1 DAY) </if> </where> GROUP BY product_model_id ) o ON o.product_model_id = pm.id <where> <if test="req.timeStr != null and req.timeStr != ''"> AND (s.product_model_id IS NOT NULL OR o.product_model_id IS NOT NULL) </if> <if test="req.productCategory != null and req.productCategory != ''"> AND EXISTS ( SELECT 1 FROM sales_ledger_product slp WHERE slp.product_id = p.id AND slp.product_category LIKE CONCAT('%', #{req.productCategory}, '%') ) </if> </where> ORDER BY pm.id DESC </select> </mapper> src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -43,6 +43,9 @@ <if test="c.specificationModel != null and c.specificationModel != ''"> and slp.specification_model like concat('%',#{c.specificationModel},'%') </if> <if test="c.startTime != null and c.endTime != null"> and po.create_time between #{c.startTime} and #{c.endTime} </if> </where> </select> <select id="productMainByOrderId" resultType="com.ruoyi.production.dto.ProductOrderDto"> src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -38,11 +38,9 @@ <if test="c.workOrderNo != null and c.workOrderNo != ''"> pwo.work_order_no like concat('%',#{c.workOrderNo},'%') </if> <if test="c.planStartTime != null and c.planEndTime != null"> and DATE(pwo.create_time) between #{c.planStartTime} and #{c.planEndTime} </if> </where> </select> <select id="selectProductWorkOrderDtoList" resultType="com.ruoyi.production.dto.ProductWorkOrderDto"> select * from product_work_order pwo left join product_order po on po.id = pwo.product_order_id </select> </mapper> src/main/resources/mapper/quality/QualityTestStandardMapper.xml
@@ -14,10 +14,21 @@ AND standard_name like concat('%',#{c.standardName},'%') </if> <if test="c.state != null and c.state != '' "> AND state = #{c.state} AND state =#{c.state} </if> <if test="c.inspectType != null and c.inspectType != '' "> AND inspect_type = #{c.inspectType} AND inspect_type =#{c.inspectType} </if> </select> <select id="getQualityTestStandardByProductId" resultType="com.ruoyi.quality.pojo.QualityTestStandard"> SELECT qts.* FROM quality_test_standard qts left join quality_test_standard_binding qtsb on qtsb.test_standard_id = qts.id left join product_process pp on qts.process_id = pp.id WHERE qtsb.product_id = #{productId} AND qts.inspect_type = #{inspectType} <if test="process!='' and process!=null"> and pp.name = #{process} </if> </select> </mapper>