doc/20260119-procurement_record_storage.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,2 @@ alter table procurement_record_storage add quality_inspect_id bigint null comment 'è´¨æ£id'; 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/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/procurementrecord/controller/ProcurementRecordController.java
@@ -235,8 +235,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/dto/ProcurementAddDto.java
@@ -22,6 +22,7 @@ private String typeName; private Integer purchaseLedgerId; private Long qualityInspectId; private Long qualityInspectId; src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -101,6 +101,5 @@ */ private Long productModelId; private Long qualityInspectId; } 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
@@ -885,15 +885,8 @@ } @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); } src/main/java/com/ruoyi/production/controller/ProductBomController.java
@@ -9,10 +9,12 @@ import com.ruoyi.production.dto.ProductBomDto; import com.ruoyi.production.pojo.ProcessRoute; import com.ruoyi.production.pojo.ProductBom; import com.ruoyi.production.pojo.ProductProcess; import com.ruoyi.production.pojo.ProductProcessRoute; import com.ruoyi.production.service.ProcessRouteService; import com.ruoyi.production.service.ProductBomService; import com.ruoyi.production.service.ProductProcessRouteService; import com.ruoyi.production.service.ProductProcessService; import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -4,6 +4,7 @@ import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.domain.R; import com.ruoyi.production.dto.ProductionProductMainDto; import com.ruoyi.production.dto.SalesLedgerProductionAccountingDto; import com.ruoyi.production.service.ProductionProductMainService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -12,6 +13,7 @@ import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.List; @RequestMapping("productionProductMain") src/main/java/com/ruoyi/production/controller/SalesLedgerProductionAccountingController.java
@@ -2,11 +2,13 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.account.pojo.AccountExpense; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.production.dto.ProductOrderDto; import com.ruoyi.production.dto.SalesLedgerProductionAccountingDto; import com.ruoyi.production.service.impl.SalesLedgerProductionAccountingServiceImpl; import io.swagger.annotations.Api; src/main/java/com/ruoyi/production/service/ProcessRouteService.java
@@ -8,6 +8,8 @@ import java.util.List; import java.util.List; public interface ProcessRouteService extends IService<ProcessRoute> { IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto); src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -8,9 +8,14 @@ import com.ruoyi.production.mapper.ProcessRouteItemMapper; import com.ruoyi.production.mapper.ProcessRouteMapper; import com.ruoyi.production.mapper.ProductOrderMapper; import com.ruoyi.production.mapper.ProductOrderMapper; import com.ruoyi.production.mapper.ProductProcessRouteMapper; import com.ruoyi.production.pojo.ProcessRoute; import com.ruoyi.production.pojo.ProcessRouteItem; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.pojo.ProcessRouteItem; import com.ruoyi.production.pojo.ProductOrder; import com.ruoyi.production.pojo.ProductProcessRoute; import com.ruoyi.production.service.ProcessRouteService; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -20,6 +25,8 @@ import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Arrays; import java.util.List; @Service @AllArgsConstructor src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -32,6 +32,8 @@ import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.ruoyi.production.mapper.ProductionProductMainMapper; import oshi.driver.mac.net.NetStat; import java.math.BigDecimal; import java.time.LocalDate; src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; @@ -24,6 +25,7 @@ import java.io.IOException; import java.math.BigDecimal; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** @@ -192,14 +194,26 @@ */ @GetMapping("/listPage") public AjaxResult listPage(Page page, PurchaseLedgerDto purchaseLedger) { IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerService.selectPurchaseLedgerListPage(page ,purchaseLedger); //è¿æ»¤æapprovalStatus=3çè®°å½ purchaseLedgerDtoIPage.getRecords().removeIf(purchaseLedgerDto -> purchaseLedgerDto.getApprovalStatus() == 3); purchaseLedgerDtoIPage.getRecords().forEach(purchaseLedgerDto -> { if (purchaseLedgerDto.getUnReceiptPaymentAmount().compareTo(BigDecimal.ZERO) == 0) { purchaseLedgerDto.setUnReceiptPaymentAmount(purchaseLedgerDto.getContractAmount()); IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = Optional.ofNullable( purchaseLedgerService.selectPurchaseLedgerListPage(page, purchaseLedger) ).orElse(new Page<>()); // å¤çnull Optional.ofNullable(purchaseLedgerDtoIPage.getRecords()) .filter(CollectionUtils::isNotEmpty) .ifPresent(records -> { // è¿æ»¤approvalStatus=3çè®°å½ records.removeIf(dto -> dto != null && dto.getApprovalStatus() == 3); // ä¿®æ£æªæ¶ä»æ¬¾éé¢ records.forEach(dto -> { if (dto == null) return; BigDecimal unReceiptAmt = Optional.ofNullable(dto.getUnReceiptPaymentAmount()).orElse(BigDecimal.ZERO); if (unReceiptAmt.compareTo(BigDecimal.ZERO) == 0) { dto.setUnReceiptPaymentAmount(Optional.ofNullable(dto.getContractAmount()).orElse(BigDecimal.ZERO)); } }); }); return AjaxResult.success(purchaseLedgerDtoIPage); } 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; @@ -111,6 +113,7 @@ private final QualityTestStandardMapper qualityTestStandardMapper; private final QualityInspectParamMapper qualityInspectParamMapper; private final ProcurementRecordMapper procurementRecordStorageMapper; @Value("${file.upload-dir}") private String uploadDir; @@ -238,10 +241,12 @@ handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType()); } //æ°å¢åæææ£éª if (productList != null) { for (SalesLedgerProduct saleProduct : productList) { //æ¯å¦æ¨éè´¨æ£ï¼å¦ætrue就添å if (saleProduct.getIsChecked()) { addQualityInspect(purchaseLedger, saleProduct); } } } // 5. è¿ç§»ä¸´æ¶æä»¶å°æ£å¼ç®å½ @@ -256,8 +261,8 @@ QualityInspect qualityInspect = new QualityInspect(); qualityInspect.setInspectType(0); qualityInspect.setSupplier(purchaseLedger.getSupplierName()); qualityInspect.setPurchaseLedgerId(purchaseLedger.getId()); qualityInspect.setProductId(saleProduct.getId()); qualityInspect.setPurchaseLedgerId(saleProduct.getId()); qualityInspect.setProductId(saleProduct.getProductId()); qualityInspect.setProductName(saleProduct.getProductCategory()); qualityInspect.setModel(saleProduct.getSpecificationModel()); qualityInspect.setProductModelId(saleProduct.getProductModelId()); @@ -445,6 +450,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/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -1,6 +1,7 @@ package com.ruoyi.purchase.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; @@ -29,6 +30,7 @@ import com.ruoyi.sales.mapper.CommonFileMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.CommonFile; import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; import lombok.RequiredArgsConstructor; @@ -48,10 +50,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; @@ -163,6 +162,14 @@ productRecord.setPurchaseLedgerId(ticketRegistrationDto.getPurchaseLedgerId()); productRecord.setCreatedAt(DateUtils.getNowDate()); BeanUtils.copyProperties(salesLedgerProduct, productRecord); //åæ¥æ´æ°å ¶ä»å©ä½æ°éåéé¢ productRecordMapper.update( null, new LambdaUpdateWrapper<ProductRecord>() .eq(ProductRecord::getPurchaseLedgerId, ticketRegistrationDto.getPurchaseLedgerId()) .set(ProductRecord::getFutureTickets, salesLedgerProduct.getFutureTickets()) .set(ProductRecord::getFutureTicketsAmount, salesLedgerProduct.getFutureTicketsAmount()) ); productRecord.setSaleLedgerProjectId(salesLedgerProduct.getId()); productRecord.setId(null); productRecord.setType("2"); @@ -249,50 +256,119 @@ @Override @Transactional(rollbackFor = Exception.class) public int delRegistration(Long[] ids) { // å é¤éè´å°è´¦äº§åå¼ç¥¨è®°å½å¯¹è±¡ LambdaQueryWrapper<ProductRecord> productRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); productRecordLambdaQueryWrapper.in(ProductRecord::getId, Arrays.asList(ids)); List<ProductRecord> productRecords = productRecordMapper.selectList(productRecordLambdaQueryWrapper); // æ¥è¯¢è¦å é¤çäº§åæ¥ç¥¨è®°å½ LambdaQueryWrapper<ProductRecord> productWrapper = new LambdaQueryWrapper<>(); productWrapper.in(ProductRecord::getId, Arrays.asList(ids)); List<ProductRecord> productRecords = productRecordMapper.selectList(productWrapper); if(CollectionUtils.isEmpty(productRecords)){ return 0; } LambdaQueryWrapper<TicketRegistration> ticketRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>(); ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getId, productRecords.stream().map(ProductRecord::getTicketRegistrationId).collect(Collectors.toList())); List<TicketRegistration> ticketRegistrations = ticketRegistrationMapper.selectList(ticketRegistrationLambdaQueryWrapper); // ä¿®æ¹äº§åä¿¡æ¯ for (ProductRecord productRecord : productRecords) { BigDecimal subtract = ticketRegistrations.get(0).getInvoiceAmount().subtract(productRecords.get(0).getTicketsAmount()); // å°äºçäº0å é¤ ï¼å¤§äº0ä¿®æ¹ if(subtract.compareTo(BigDecimal.ZERO) <= 0){ ticketRegistrationMapper.deleteById(ticketRegistrations.get(0)); // å é¤ä»æ¬¾æµæ°´è®°å½ paymentRegistrationMapper.delete(new LambdaQueryWrapper<PaymentRegistration>().eq(PaymentRegistration::getTicketRegistrationId, ticketRegistrations.get(0).getId())); }else if(subtract.compareTo(BigDecimal.ZERO) > 0){ ticketRegistrations.get(0).setInvoiceAmount(subtract); ticketRegistrationMapper.updateById(ticketRegistrations.get(0)); // æ¶éå ³èID Set<Long> ticketRegistrationIds = productRecords.stream() .map(ProductRecord::getTicketRegistrationId) .collect(Collectors.toSet()); Set<Long> salesLedgerProductIds = productRecords.stream() .map(ProductRecord::getSaleLedgerProjectId) .collect(Collectors.toSet()); // æ¥è¯¢æ¥ç¥¨ç»è®° List<TicketRegistration> ticketRegistrations = ticketRegistrationMapper.selectBatchIds(ticketRegistrationIds); // å¤çæ¥ç¥¨ç»è®°éé¢ã仿¬¾æµæ°´ for (TicketRegistration ticket : ticketRegistrations) { // 该æ¥ç¥¨ç»è®°ä¸ææäº§åè®°å½ List<ProductRecord> recordsOfTicket = productRecords.stream() .filter(r -> r.getTicketRegistrationId().equals(ticket.getId())) .collect(Collectors.toList()); // 计ç®è¦åéçéé¢ BigDecimal rollbackAmount = recordsOfTicket.stream() .map(ProductRecord::getTicketsAmount) .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal remain = ticket.getInvoiceAmount().subtract(rollbackAmount); if (remain.compareTo(BigDecimal.ZERO) <= 0) { // å 餿¥ç¥¨ç»è®° ticketRegistrationMapper.deleteById(ticket.getId()); // å é¤ä»æ¬¾æµæ°´ paymentRegistrationMapper.delete( new LambdaQueryWrapper<PaymentRegistration>() .eq(PaymentRegistration::getTicketRegistrationId, ticket.getId()) ); } else { ticket.setInvoiceAmount(remain); ticketRegistrationMapper.updateById(ticket); } LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>(); salesLedgerProductLambdaQueryWrapper.eq(SalesLedgerProduct::getId, productRecord.getSaleLedgerProjectId()) } // åééå®å°è´¦äº§åçæªæ¥ç¥¨ for (ProductRecord record : productRecords) { LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SalesLedgerProduct::getId, record.getSaleLedgerProjectId()) .eq(SalesLedgerProduct::getType, 2); List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(salesLedgerProductLambdaQueryWrapper); if(!CollectionUtils.isEmpty(salesLedgerProducts)){ for (SalesLedgerProduct salesLedgerProduct : salesLedgerProducts) { salesLedgerProduct.setFutureTickets(salesLedgerProduct.getFutureTickets().add(productRecord.getTicketsNum())); salesLedgerProduct.setFutureTicketsAmount(salesLedgerProduct.getFutureTicketsAmount().add(productRecord.getTicketsAmount())); salesLedgerProduct.setTicketsAmount(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getFutureTicketsAmount())); salesLedgerProduct.setTicketsNum(salesLedgerProduct.getQuantity().subtract(salesLedgerProduct.getFutureTickets())); salesLedgerProductMapper.updateById(salesLedgerProduct); SalesLedgerProduct product = salesLedgerProductMapper.selectOne(wrapper); if (product != null) { product.setFutureTickets( product.getFutureTickets().add(record.getTicketsNum()) ); product.setFutureTicketsAmount( product.getFutureTicketsAmount().add(record.getTicketsAmount()) ); salesLedgerProductMapper.updateById(product); } } // å é¤äº§åæ¥ç¥¨è®°å½ productRecordMapper.delete(productWrapper); // éæ°è®¡ç® currentInvoiceAmount for (Long productId : salesLedgerProductIds) { refreshCurrentInvoiceAmount(productId); } // å é¤éè´å°è´¦äº§åå¼ç¥¨è®°å½ productRecordMapper.delete(productRecordLambdaQueryWrapper); return 1; } private void refreshCurrentInvoiceAmount(Long salesLedgerProductId) { // æ¥è¯¢è¯¥äº§åææ°ä¸æ¡æ¥ç¥¨è®°å½ LambdaQueryWrapper<ProductRecord> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(ProductRecord::getSaleLedgerProjectId, salesLedgerProductId) .orderByDesc(ProductRecord::getCreatedAt) .last("limit 1"); ProductRecord latestRecord = productRecordMapper.selectOne(wrapper); SalesLedgerProduct product = salesLedgerProductMapper.selectById(salesLedgerProductId); if (product == null) { return; } if (latestRecord == null) { // 没æä»»ä½æ¥ç¥¨è®°å½ product.setTicketsAmount(BigDecimal.ZERO); } else { // æ°¸è¿åææ°ä¸æ¡ product.setTicketsAmount(latestRecord.getTicketsAmount()); } salesLedgerProductMapper.updateById(product); } @Override public TicketRegistrationDto getRegistrationById(TicketRegistrationDto ticketRegistrationDto) { TicketRegistration ticketRegistration = ticketRegistrationMapper.selectById(ticketRegistrationDto.getId()); src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -3,6 +3,9 @@ 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.procurementrecord.pojo.ProcurementRecordStorage; import com.ruoyi.procurementrecord.service.ProcurementRecordService; import com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl; import com.ruoyi.quality.dto.QualityInspectDto; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.quality.pojo.QualityInspectFile; @@ -12,6 +15,7 @@ import com.ruoyi.quality.service.IQualityInspectParamService; import com.ruoyi.quality.service.IQualityInspectService; import com.ruoyi.quality.service.IQualityUnqualifiedService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; @@ -34,6 +38,8 @@ @Resource private IQualityInspectFileService qualityInspectFileService; @Autowired private ProcurementRecordService procurementRecordService; /** @@ -62,6 +68,8 @@ //å 餿£éªéä»¶ qualityInspectFileService.remove(Wrappers.<QualityInspectFile>lambdaQuery() .in(QualityInspectFile::getInspectId,ids)); //å é¤å ¥åºè®°å½ procurementRecordService.remove(Wrappers.<ProcurementRecordStorage>lambdaQuery().in(ProcurementRecordStorage::getQualityInspectId,ids)); //å 餿£éªå return AjaxResult.success(qualityInspectService.removeBatchByIds(ids)); } src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -138,6 +138,7 @@ */ private Integer inspectState; //éè´å°è´¦äº§åid private Long purchaseLedgerId; /** src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -98,6 +98,8 @@ public int submit(QualityInspect inspect) { QualityInspect qualityInspect = qualityInspectMapper.selectById(inspect.getId()); /*夿ä¸åæ ¼*/ LoginUser loginUser = SecurityUtils.getLoginUser(); if (ObjectUtils.isNotNull(qualityInspect.getCheckResult()) && qualityInspect.getCheckResult().equals("ä¸åæ ¼")){ QualityUnqualified qualityUnqualified = new QualityUnqualified(); BeanUtils.copyProperties(qualityInspect,qualityUnqualified); @@ -106,20 +108,19 @@ String text = inspectParams.stream().map(QualityInspectParam::getParameterItem).collect(Collectors.joining(",")); qualityUnqualified.setDefectivePhenomena(text+"è¿äºææ ä¸åå¨ä¸åæ ¼");//ä¸åæ ¼ç°è±¡ qualityUnqualifiedMapper.insert(qualityUnqualified); } } else { LoginUser loginUser = SecurityUtils.getLoginUser(); if (qualityInspect.getInspectType() == 0) { if ("åæ ¼".equals(qualityInspect.getCheckResult())) { ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto(); procurementRecordOutAdd.setType(1); procurementRecordOutAdd.setTypeName("éè´å ¥åº"); procurementRecordOutAdd.setTypeName("éè´åæææ£éªåæ ¼å ¥åº"); procurementRecordOutAdd.setNickName(loginUser.getNickName()); procurementRecordOutAdd.setPurchaseLedgerId(Math.toIntExact(qualityInspect.getPurchaseLedgerId())); if (qualityInspect.getPurchaseLedgerId() == null) { throw new BaseException("è¯·éæ©éè´å"); } SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(qualityInspect.getProductId()); SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(qualityInspect.getPurchaseLedgerId()); ArrayList<Details> detailss = new ArrayList<>(); Details details = new Details(); @@ -131,13 +132,14 @@ details.setProductModelId(qualityInspect.getProductModelId()); detailss.add( details); procurementRecordOutAdd.setDetails(detailss); procurementRecordOutAdd.setQualityInspectId(qualityInspect.getId()); procurementRecordService.add(procurementRecordOutAdd); } }else if (qualityInspect.getInspectType() == 1) { //æ¥è¯¢UnitPrice/TotalPrice ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto(); procurementRecordOutAdd.setType(2); procurementRecordOutAdd.setTypeName("çäº§å ¥åº"); procurementRecordOutAdd.setTypeName("ç产è¿ç¨æ£éªåæ ¼å ¥åº"); procurementRecordOutAdd.setNickName(loginUser.getNickName()); List<Details> details = new ArrayList<>(); Details details1 = new Details(); @@ -158,9 +160,9 @@ .updateTime(LocalDateTime.now()) .updateUser(loginUser.getUserId()) .createBy(procurementRecordOutAdd.getNickName()) .productModelId(details1.getProductModelId()); .productModelId(details1.getProductModelId()) .qualityInspectId(qualityInspect.getId()); procurementRecordService.save(procurementRecordBuilder.build()); }else if (qualityInspect.getInspectType() == 2) { @@ -168,7 +170,7 @@ SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectSalesLedgerProductByMainId(qualityInspect.getProductMainId()); ProcurementAddDto procurementRecordOutAdd = new ProcurementAddDto(); procurementRecordOutAdd.setType(2); procurementRecordOutAdd.setTypeName("çäº§å ¥åº"); procurementRecordOutAdd.setTypeName("ç产åºåæ£éªåæ ¼å ¥åº"); procurementRecordOutAdd.setNickName(loginUser.getNickName()); List<Details> details = new ArrayList<>(); Details details1 = new Details(); @@ -179,8 +181,11 @@ details1.setProductModelId(salesLedgerProduct.getProductModelId()); details.add(details1); procurementRecordOutAdd.setDetails(details); procurementRecordOutAdd.setQualityInspectId(qualityInspect.getId()); procurementRecordService.add(procurementRecordOutAdd); } } qualityInspect.setInspectState(1);//å·²æäº¤ return qualityInspectMapper.updateById(qualityInspect); } src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -65,7 +65,7 @@ BigDecimal stockQuantity = stockUtils.getStockQuantity(item.getProductModelId()).get("stockQuantity"); if(stockQuantity != null) { // ProcurementPageDtoCopy procurementDtoCopy = result.getRecords().get(0); if (item.getQuantity().compareTo(stockQuantity) >= 0 && item.getApproveStatus() == 0) { if (item.getQuantity().compareTo(stockQuantity) <= 0 && item.getApproveStatus() == 0) { item.setApproveStatus(1); salesLedgerProductService.addOrUpdateSalesLedgerProduct(item); } src/main/java/com/ruoyi/sales/controller/ShipmentApprovalController.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.exception.ServiceException; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.web.controller.BaseController; @@ -88,20 +89,22 @@ // 审æ¹éè¿ if (req.getApproveStatus() == 3) { // æ¥è¯¢éè´å ¥åºè®°å½ LambdaQueryWrapper<ProcurementRecordStorage> lambdaQueryWrapper = new LambdaQueryWrapper<ProcurementRecordStorage>() .eq(ProcurementRecordStorage::getSalesLedgerProductId, req.getSalesLedgerProductId()); ProcurementRecordStorage procurementRecordStorage = procurementRecordStorageService.getOne(lambdaQueryWrapper); if (procurementRecordStorage == null) { // ä¿è¯åé¢çä¿®æ¹å ¨é¨åæ» throw new ServiceException("éè´è®°å½ä¸åå¨ï¼å®¡æ¹åæ»"); } // // æ¥è¯¢éè´å ¥åºè®°å½ // LambdaQueryWrapper<ProcurementRecordStorage> lambdaQueryWrapper = new LambdaQueryWrapper<ProcurementRecordStorage>() // .eq(ProcurementRecordStorage::getSalesLedgerProductId, req.getSalesLedgerProductId()); // ProcurementRecordStorage procurementRecordStorage = procurementRecordStorageService.getOne(lambdaQueryWrapper); // // if (procurementRecordStorage == null) { // // ä¿è¯åé¢çä¿®æ¹å ¨é¨åæ» // throw new ServiceException("éè´è®°å½ä¸åå¨ï¼å®¡æ¹åæ»"); // } // çæåºåºè®°å½ ProcurementRecordOutAdd procurementRecordOutAdd = new ProcurementRecordOutAdd(); procurementRecordOutAdd.setId(procurementRecordStorage.getId()); procurementRecordOutAdd.setSalesLedgerProductId(salesLedgerProduct.getId()); // 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()); src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java
@@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -70,6 +72,13 @@ invoiceAmountTotal = invoiceAmountTotal.add(currentInvoiceNum); InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct(); BeanUtils.copyProperties(productDatum, invoiceRegistrationProduct); //æ´æ°å·²å¼ç¥¨å©ä½æªå¼ç¥¨æ° invoiceRegistrationProductMapper.update( null, new LambdaUpdateWrapper<InvoiceRegistrationProduct>() .eq(InvoiceRegistrationProduct::getSalesLedgerId, salesLedgerDto.getId()) .set(InvoiceRegistrationProduct::getNoInvoiceAmount, productDatum.getNoInvoiceAmount()) ); invoiceRegistrationProduct.setId(null); invoiceRegistrationProduct.setSalesLedgerId(salesLedgerDto.getId().intValue()); invoiceRegistrationProduct.setInvoiceRegistrationId(invoiceRegistration.getId()); src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -3,11 +3,14 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.production.mapper.*; import com.ruoyi.production.pojo.*; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.quality.mapper.QualityInspectMapper; import com.ruoyi.quality.pojo.QualityInspect; import com.ruoyi.sales.dto.InvoiceRegistrationProductDto; import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; @@ -42,6 +45,7 @@ public class SalesLedgerProductServiceImpl extends ServiceImpl<SalesLedgerProductMapper, SalesLedgerProduct> implements ISalesLedgerProductService { private SalesLedgerProductMapper salesLedgerProductMapper; private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper; private SalesLedgerMapper salesLedgerMapper; @@ -59,6 +63,10 @@ private ProductProcessRouteMapper productProcessRouteMapper; private ProductWorkOrderMapper productWorkOrderMapper; private ProductionProductMainMapper productionProductMainMapper; private ProductionProductOutputMapper productionProductOutputMapper; private ProductionProductInputMapper productionProductInputMapper; private QualityInspectMapper qualityInspectMapper; @Override public SalesLedgerProduct selectSalesLedgerProductById(Long id) { @@ -87,10 +95,10 @@ if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){ invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum()); invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount()); } } noInvoiceNum = ledgerProduct.getQuantity().subtract(invoiceNum); noInvoiceAmount = ledgerProduct.getTaxInclusiveTotalPrice().subtract(invoiceAmount); } } ledgerProduct.setInvoiceNum(invoiceNum); ledgerProduct.setInvoiceAmount(invoiceAmount); ledgerProduct.setNoInvoiceNum(noInvoiceNum); @@ -193,6 +201,54 @@ if (salesLedgerProduct.getId() == null) { salesLedgerProduct.setRegisterDate(LocalDateTime.now()); result = salesLedgerProductMapper.insert(salesLedgerProduct); addProductionData(salesLedgerProduct); } else { //æ¥è¯¢åæ¬ç产ååå·id salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity()); result = salesLedgerProductMapper.updateById(salesLedgerProduct); /*å é¤å¯¹åºççäº§æ°æ®å¹¶éæ°æ°å¢*/ deleteProductionData(Arrays.asList(salesLedgerProduct.getId())); // å é¤çäº§æ ¸ç®æ°æ® LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>(); reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, salesLedgerId); salesLedgerProductionAccountingMapper.delete(reportWrapper); addProductionData(salesLedgerProduct); } // 妿æå ¥ææ´æ°æåï¼å¹¶ä¸æ salesLedgerIdï¼æç»§ç»æ´æ°ä¸»è¡¨éé¢ if (result > 0 && salesLedgerId != null) { // æ¥è¯¢è¯¥ä¸»è¡¨ä¸çææåè¡¨æ°æ® LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId) .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType()); List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(wrapper); if (salesLedgerProduct.getType() == 1) { // è°ç¨éç¨æ¹æ³æ´æ°ä¸»è¡¨éé¢ updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, salesLedgerMapper, SalesLedger.class ); } else { // è°ç¨éç¨æ¹æ³æ´æ°ä¸»è¡¨éé¢ updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, purchaseLedgerMapper, PurchaseLedger.class ); } } return result; } /** * æ°å¢çäº§æ°æ® */ public void addProductionData(SalesLedgerProduct salesLedgerProduct) { ProductOrder productOrder = new ProductOrder(); productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); productOrder.setProductModelId(salesLedgerProduct.getId()); @@ -201,8 +257,11 @@ productOrder.setCompleteQuantity(BigDecimal.ZERO);//宿æ°é productOrderMapper.insert(productOrder); ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())); if (processRoute != null) { List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda() .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()) .orderByDesc(ProcessRoute::getCreateTime)); if (processRoutes.size()>0){ ProcessRoute processRoute = processRoutes.get(0); //æ°å¢ç产订åå·¥èºè·¯çº¿ä¸»è¡¨ ProductProcessRoute productProcessRoute = new ProductProcessRoute(); productProcessRoute.setProductModelId(processRoute.getProductModelId()); @@ -220,6 +279,7 @@ productProcessRouteItem.setProcessId(processRouteItem.getProcessId()); productProcessRouteItem.setProductOrderId(productOrder.getId()); productProcessRouteItem.setProductRouteId(productProcessRoute.getId()); productProcessRouteItem.setDragSort(processRouteItem.getDragSort()); int insert = productProcessRouteItemMapper.insert(productProcessRouteItem); if (insert > 0) { // æ¥è¯¢ä»æ¥å·²åå¨çæå¤§å·¥åå· @@ -258,41 +318,90 @@ productOrder.setRouteId(processRoute.getId()); productOrderMapper.updateById(productOrder); } } else { salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity()); result = salesLedgerProductMapper.updateById(salesLedgerProduct); } // 妿æå ¥ææ´æ°æåï¼å¹¶ä¸æ salesLedgerIdï¼æç»§ç»æ´æ°ä¸»è¡¨éé¢ if (result > 0 && salesLedgerId != null) { // æ¥è¯¢è¯¥ä¸»è¡¨ä¸çææåè¡¨æ°æ® LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId) .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType()); List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(wrapper); if (salesLedgerProduct.getType() == 1) { // è°ç¨éç¨æ¹æ³æ´æ°ä¸»è¡¨éé¢ updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, salesLedgerMapper, SalesLedger.class /** * å é¤çäº§æ°æ® */ public void deleteProductionData(List<Long> productIds) { //æ¹éæ¥è¯¢productOrder List<ProductOrder> productOrders = productOrderMapper.selectList( new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds) ); } else { // è°ç¨éç¨æ¹æ³æ´æ°ä¸»è¡¨éé¢ updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, purchaseLedgerMapper, PurchaseLedger.class if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) { List<Long> orderIds = productOrders.stream() .map(ProductOrder::getId) .collect(Collectors.toList()); // æ¹éæ¥è¯¢processRouteItems List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList( new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds) ); if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(allRouteItems)) { // è·åè¦å é¤çå·¥åºé¡¹ID List<Long> routeItemIds = allRouteItems.stream() .map(ProductProcessRouteItem::getId) .collect(Collectors.toList()); // æ¥è¯¢å ³èçå·¥åID List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList( new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds) ); if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(workOrders)) { List<Long> workOrderIds = workOrders.stream() .map(ProductWorkOrder::getId) .collect(Collectors.toList()); // æ¥è¯¢å ³èçç产主表ID List<ProductionProductMain> productMains = productionProductMainMapper.selectList( new LambdaQueryWrapper<ProductionProductMain>() .in(ProductionProductMain::getWorkOrderId, workOrderIds) ); List<Long> productMainIds = productMains.stream() .map(ProductionProductMain::getId) .collect(Collectors.toList()); // å é¤äº§åºè¡¨ãæå ¥è¡¨æ°æ® if (!com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(productMainIds)) { productionProductOutputMapper.deleteByProductMainIds(productMainIds); productionProductInputMapper.deleteByProductMainIds(productMainIds); List<QualityInspect> qualityInspects = qualityInspectMapper.selectList( new LambdaQueryWrapper<QualityInspect>() .in(QualityInspect::getProductMainId, productMainIds) ); qualityInspects.forEach(qualityInspect -> { //inspectState=1 å·²æäº¤ ä¸è½å é¤ if (qualityInspect.getInspectState() == 1) { throw new RuntimeException("å·²æäº¤çæ£éªåä¸è½å é¤"); } }); qualityInspectMapper.deleteByProductMainIds(productMainIds); } // å é¤çäº§ä¸»è¡¨æ°æ® productionProductMainMapper.deleteByWorkOrderIds(workOrderIds); // å é¤å·¥åæ°æ® productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)); } } return result; // æ¹éå é¤processRouteItem productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds)); // æ¹éå é¤productProcessRoute productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>() .in(ProductProcessRoute::getProductOrderId, orderIds)); // æ¹éå é¤productOrder productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds)); } } /** src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -32,6 +32,7 @@ import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.mapper.*; import com.ruoyi.sales.pojo.*; import com.ruoyi.sales.service.ISalesLedgerProductService; import com.ruoyi.sales.service.ISalesLedgerService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -77,6 +78,7 @@ private final CustomerMapper customerMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; private final SalesLedgerProductServiceImpl salesLedgerProductServiceImpl; private final CommonFileMapper commonFileMapper; @@ -178,7 +180,7 @@ @Override public List<Map<String, Object>> getSalesNo() { LambdaQueryWrapper<SalesLedger> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.select(SalesLedger::getId, SalesLedger::getSalesContractNo, SalesLedger::getProjectName); queryWrapper.select(SalesLedger::getId, SalesLedger::getSalesContractNo); // è·ååå§æ¥è¯¢ç»æ List<Map<String, Object>> result = salesLedgerMapper.selectMaps(queryWrapper); @@ -393,86 +395,8 @@ List<Long> productIds = products.stream() .map(SalesLedgerProduct::getId) .collect(Collectors.toList()); //æ¹éæ¥è¯¢productOrder List<ProductOrder> productOrders = productOrderMapper.selectList( new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds) ); if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) { List<Long> orderIds = productOrders.stream() .map(ProductOrder::getId) .collect(Collectors.toList()); // æ¹éæ¥è¯¢processRouteItems List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList( new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds) ); if (!CollectionUtils.isEmpty(allRouteItems)) { // è·åè¦å é¤çå·¥åºé¡¹ID List<Long> routeItemIds = allRouteItems.stream() .map(ProductProcessRouteItem::getId) .collect(Collectors.toList()); // æ¥è¯¢å ³èçå·¥åID List<ProductWorkOrder> workOrders = productWorkOrderMapper.selectList( new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds) ); if (!CollectionUtils.isEmpty(workOrders)) { List<Long> workOrderIds = workOrders.stream() .map(ProductWorkOrder::getId) .collect(Collectors.toList()); // æ¥è¯¢å ³èçç产主表ID List<ProductionProductMain> productMains = productionProductMainMapper.selectList( new LambdaQueryWrapper<ProductionProductMain>() .in(ProductionProductMain::getWorkOrderId, workOrderIds) ); List<Long> productMainIds = productMains.stream() .map(ProductionProductMain::getId) .collect(Collectors.toList()); // å é¤äº§åºè¡¨ãæå ¥è¡¨æ°æ® if (!CollectionUtils.isEmpty(productMainIds)) { productionProductOutputMapper.deleteByProductMainIds(productMainIds); productionProductInputMapper.deleteByProductMainIds(productMainIds); List<QualityInspect> qualityInspects = qualityInspectMapper.selectList( new LambdaQueryWrapper<QualityInspect>() .in(QualityInspect::getProductMainId, productMainIds) ); qualityInspects.forEach(qualityInspect -> { //inspectState=1 å·²æäº¤ ä¸è½å é¤ if(qualityInspect.getInspectState() == 1){ throw new RuntimeException("å·²æäº¤çæ£éªåä¸è½å é¤"); } }); qualityInspectMapper.deleteByProductMainIds(productMainIds); } // å é¤çäº§ä¸»è¡¨æ°æ® productionProductMainMapper.deleteByWorkOrderIds(workOrderIds); // å é¤å·¥åæ°æ® productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>() .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds)); } } // æ¹éå é¤processRouteItem productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>() .in(ProductProcessRouteItem::getProductOrderId, orderIds)); // æ¹éå é¤productProcessRoute productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>() .in(ProductProcessRoute::getProductOrderId, orderIds)); // æ¹éå é¤productOrder productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>() .in(ProductOrder::getProductModelId, productIds)); } //å é¤çäº§æ°æ® salesLedgerProductServiceImpl.deleteProductionData(productIds); // æ¹éå é¤äº§åå表 if (!productIds.isEmpty()) { @@ -512,7 +436,7 @@ LambdaQueryWrapper<SalesLedgerWork> workOrderWrapper = new LambdaQueryWrapper<>(); workOrderWrapper.in(SalesLedgerWork::getSalesLedgerId, idList); salesLedgerWorkMapper.delete(workOrderWrapper); // å é¤ç产æ¥å·¥æ°æ® // å é¤çäº§æ ¸ç®æ°æ® LambdaQueryWrapper<SalesLedgerProductionAccounting> reportWrapper = new LambdaQueryWrapper<>(); reportWrapper.in(SalesLedgerProductionAccounting::getSalesLedgerId, idList); salesLedgerProductionAccountingMapper.delete(reportWrapper); @@ -693,73 +617,8 @@ salesLedgerProduct.setNoInvoiceNum(salesLedgerProduct.getQuantity()); salesLedgerProduct.setNoInvoiceAmount(salesLedgerProduct.getTaxInclusiveTotalPrice()); salesLedgerProductMapper.insert(salesLedgerProduct); ProductOrder productOrder = new ProductOrder(); productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId()); productOrder.setProductModelId(salesLedgerProduct.getId()); productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId())); productOrder.setQuantity(salesLedgerProduct.getQuantity());//éæ±æ°é productOrder.setCompleteQuantity(BigDecimal.ZERO);//宿æ°é productOrderMapper.insert(productOrder); ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())); if (processRoute != null) { //æ°å¢ç产订åå·¥èºè·¯çº¿ä¸»è¡¨ ProductProcessRoute productProcessRoute = new ProductProcessRoute(); productProcessRoute.setProductModelId(processRoute.getProductModelId()); productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode()); productProcessRoute.setProductOrderId(productOrder.getId()); productProcessRoute.setBomId(processRoute.getBomId()); productProcessRouteMapper.insert(productProcessRoute); //æ°å¢ç产订åå·¥èºè·¯çº¿å表 List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId())); // çæå½åæ¥æçåç¼ï¼å¹´ææ¥ String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); for (ProcessRouteItem processRouteItem : processRouteItems) { ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem(); productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId()); productProcessRouteItem.setProcessId(processRouteItem.getProcessId()); productProcessRouteItem.setProductOrderId(productOrder.getId()); productProcessRouteItem.setProductRouteId(productProcessRoute.getId()); productProcessRouteItem.setDragSort(processRouteItem.getDragSort()); int insert = productProcessRouteItemMapper.insert(productProcessRouteItem); if (insert > 0) { // æ¥è¯¢ä»æ¥å·²åå¨çæå¤§å·¥åå· QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>(); queryWrapper.likeRight("work_order_no", datePrefix) .orderByDesc("work_order_no") .last("LIMIT 1"); ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper); int sequenceNumber = 1; // é»è®¤åºå· if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) { String lastNo = lastWorkOrder.getWorkOrderNo().toString(); if (lastNo.startsWith(datePrefix)) { String seqStr = lastNo.substring(datePrefix.length()); try { sequenceNumber = Integer.parseInt(seqStr) + 1; } catch (NumberFormatException e) { sequenceNumber = 1; } } } // çæå®æ´çå·¥åå· String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber); ProductWorkOrder productWorkOrder = new ProductWorkOrder(); if (Objects.equals(productProcessRouteItem.getProductModelId(), salesLedgerProduct.getProductModelId())) { productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity()); } productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId()); productWorkOrder.setProductOrderId(productOrder.getId()); productWorkOrder.setWorkOrderNo(workOrderNoStr); productWorkOrder.setStatus(1); productWorkOrderMapper.insert(productWorkOrder); } } productOrder.setRouteId(processRoute.getId()); productOrderMapper.updateById(productOrder); } // æ·»å çäº§æ°æ® salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct); } } } src/main/resources/application-dev.yml
@@ -63,9 +63,9 @@ druid: # ä¸»åºæ°æ®æº master: url: jdbc:mysql://localhost:3306/product-inventory-management-hckx?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://114.132.189.42:9099/product-inventory-management-sqd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 password: xd@123456.. # ä»åºæ°æ®æº slave: # 仿°æ®æºå¼å ³/é»è®¤å ³é @@ -143,7 +143,7 @@ database: 0 # å¯ç # password: root2022! password: password: 123456 # è¿æ¥è¶ æ¶æ¶é´ timeout: 10s src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -33,5 +33,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/procurementrecord/ProcurementRecordMapper.xml
@@ -371,6 +371,7 @@ <select id="listPageByProductProduction" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto"> select t1.*, t1.inbound_num as inboundNum0, t2.model as specification_model , t2.unit, t3.product_name as product_category 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/ProductStructureMapper.xml
@@ -25,7 +25,7 @@ where ps.bom_id = #{bomId} order by ps.id </select> <select id="listByproductModelId" resultType="com.ruoyi.production.dto.ProductStructureDto"> <select id="listBybomAndProcess" resultType="com.ruoyi.production.dto.ProductStructureDto"> select ps.*, p.product_name, pp.name as process_name, @@ -33,11 +33,11 @@ pm.model from product_structure ps left join product_bom pb on ps.bom_id = pb.id left join product_model pm on ps.product_model_id = pm.id left join product p on pm.product_id = p.id left join product_process pp on ps.process_id = pp.id where pb.product_model_id = #{productModelId} where ps.bom_id = #{bomId} and ps.process_id=#{processId} order by ps.id </select> <select id="listBybomAndProcess" resultType="com.ruoyi.production.dto.ProductStructureDto"> src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -38,33 +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> <update id="updatePlanQuantity" parameterType="java.util.Map"> UPDATE product_work_order SET report_work = #{reportWork}, plan_quantity = plan_quantity - #{deductQuantity} WHERE id = #{workOrderId} </update> <update id="rollbackPlanQuantity" parameterType="java.lang.Long"> UPDATE product_work_order pwo INNER JOIN production_product_main ppm ON pwo.id = ppm.work_order_id AND ppm.id = #{productMainId} INNER JOIN production_product_output ppo ON ppo.product_main_id = ppm.id SET pwo.plan_quantity = pwo.plan_quantity + ppo.quantity, pwo.report_work = 0, pwo.quantity = 0 WHERE pwo.id = ppm.work_order_id </update> </mapper> src/main/resources/mapper/production/ProductionProductInputMapper.xml
@@ -13,11 +13,14 @@ <select id="listPageProductionProductInputDto" resultType="com.ruoyi.production.dto.ProductionProductInputDto"> select ppi.*, pm.model as model, ppm.product_no as productNo ppm.product_no as productNo, p.product_name, pm.unit from production_product_input ppi left join production_product_main ppm on ppm.id = ppi.product_main_id left join product_model pm on pm.id = ppi.product_model_id left join product p on p.id = pm.product_id <where> <if test="c.productMainId != null and c.productMainId > 0"> and ppm.id = #{c.productMainId} src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -16,10 +16,20 @@ select ppm.*, pwo.work_order_no as workOrderNo, pwo.status as workOrderStatus, u.nick_name as nickName u.nick_name as nickName, p.product_name as productName, pm.model as productModelName, ppo.quantity, pm.unit, sl.sales_contract_no salesContractNo from production_product_main ppm left join product_work_order pwo on pwo.id = ppm.work_order_id left join product_order po on po.id = pwo.product_order_id left join production_product_output ppo on ppm.id = ppo.product_main_id left join product_model pm on pm.id = ppo.product_model_id left join product p on p.id = pm.product_id left join sales_ledger sl on sl.id = po.sales_ledger_id left join sys_user u on u.user_id = ppm.user_id <where> <if test="c.nickName != null and c.nickName != ''"> @@ -36,6 +46,7 @@ </if> </where> order by ppm.id </select> <delete id="deleteByWorkOrderIds" parameterType="java.util.List">