doc/20260113-product_model.sql
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,6 @@ alter table product_model add product_code varchar(255) null comment '产åç¼ç '; alter table process_route add process_route_code varchar(255) null comment 'å·¥èºè·¯çº¿ç¼ç '; src/main/java/com/ruoyi/basic/controller/ProductController.java
@@ -1,5 +1,6 @@ package com.ruoyi.basic.controller; 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.ruoyi.basic.dto.ProductDto; @@ -12,9 +13,13 @@ 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.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerProductService; import com.ruoyi.sales.service.ISalesLedgerService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -28,8 +33,8 @@ private IProductService productService; private IProductModelService productModelService; @Autowired private ISalesLedgerProductService salesLedgerProductService; /** * æ¥è¯¢äº§å */ @@ -73,6 +78,13 @@ if (ids == null || ids.length == 0) { return AjaxResult.error("è¯·ä¼ å ¥è¦å é¤çID"); } // æ£æ¥æ¯å¦æéå®ååè®°å½å ³è该产å LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SalesLedgerProduct::getProductId, ids); List<SalesLedgerProduct> salesLedgerProductList = salesLedgerProductService.list(queryWrapper); if (salesLedgerProductList.size() > 0) { return AjaxResult.error("该产ååå¨éå®/éè´è®°å½ï¼ä¸è½å é¤"); } return toAjax(productService.delProductByIds(ids)); } @@ -85,6 +97,13 @@ if (ids == null || ids.length == 0) { return AjaxResult.error("è¯·ä¼ å ¥è¦å é¤çID"); } // æ£æ¥æ¯å¦æéå®ååè®°å½å ³è该产åè§æ ¼åå· LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(SalesLedgerProduct::getProductModelId, ids); List<SalesLedgerProduct> salesLedgerProductList = salesLedgerProductService.list(queryWrapper); if (salesLedgerProductList.size() > 0) { return AjaxResult.error("该产åè§æ ¼åå·åå¨éå®/éè´è®°å½ï¼ä¸è½å é¤"); } return toAjax(productModelService.delProductModel(ids)); } src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
@@ -16,4 +16,7 @@ public interface ProductModelMapper extends BaseMapper<ProductModel> { IPage<ProductModel> listPageProductModel(Page<ProductModel> page, @Param("c") ProductModel productModel); ProductModel selectLatestRecord(); } src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -27,6 +27,9 @@ @Excel(name = "产ååç§°") private String productName; @Excel(name = "产åç¼ç ") private String productCode; /** * è§æ ¼åå· */ src/main/java/com/ruoyi/basic/service/impl/ProductModelServiceImpl.java
@@ -14,12 +14,15 @@ import com.ruoyi.basic.service.IProductModelService; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.utils.uuid.IdUtils; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -45,12 +48,21 @@ if (productModelDto.getId() == null) { ProductModel productModel = new ProductModel(); BeanUtils.copyProperties(productModelDto,productModel); return productModelMapper.insert(productModel); productModelMapper.insert(productModel); String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); String idStr = String.format("%06d", productModel.getId()); // å ä½è¡¥0 String newProductCode = "BM" + dateStr + idStr; // æ´æ°æ°æ®åºä¸çproductCode productModel.setProductCode(newProductCode); return productModelMapper.updateById(productModel); } else { return productModelMapper.updateById(productModelDto); } } @Override public int delProductModel(Long[] ids) { List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new QueryWrapper<SalesLedgerProduct>() src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -49,7 +49,7 @@ */ private String customerName; private String salesLedgerProductId; private Long salesLedgerProductId; /** * åºå ¥åºæ°é src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
@@ -39,4 +39,6 @@ IPage<ProcurementPageDto> listPageByProduction(Page page, @Param("req") ProcurementPageDto procurementDto); IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, @Param("req") ProcurementPageDto procurementDto); IPage<ProcurementPageDtoCopy> listPagePRS(Page page, @Param("req") ProcurementPageDto procurementDto); } src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -593,7 +593,7 @@ @Override public IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, ProcurementPageDto procurementDto) { IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopyByProduction(page, procurementDto); IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPagePRS(page, procurementDto); List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords(); // 计ç®å¾ å ¥åºæ°é // æ¥è¯¢éè´è®°å½å·²å ¥åºæ°é @@ -601,38 +601,48 @@ if(CollectionUtils.isEmpty( collect)){ return procurementPageDtoCopyIPage; } LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>(); procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect); procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, 2); List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper); if(CollectionUtils.isEmpty( procurementRecords)){ return procurementPageDtoCopyIPage; } // 1. æ¥è¯¢éè´è®°å½å·²å ¥åºçåºåºè®°å½ï¼æstorageIdåç»ï¼ LambdaQueryWrapper<ProcurementRecordOut> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect); List<ProcurementRecordOut> recordOutList = procurementRecordOutMapper.selectList(queryWrapper); // 2. æSalesLedgerProductIdåç»ï¼ç»è®¡æ¯ä¸ªid对åºçå·²åºåºæ°éæ»å-å·²åºåºæ°é Map<Integer, BigDecimal> storageIdToTotalOutNumMap = recordOutList.stream() .collect(Collectors.groupingBy( ProcurementRecordOut::getSalesLedgerProductId, Collectors.reducing( BigDecimal.ZERO, ProcurementRecordOut::getInboundNum, (a, b) -> a.add(b == null ? BigDecimal.ZERO : b) ) )); // 2. procurementPageDtoCopyListæSalesLedgerProductIdåç»ï¼ç»è®¡æ¯ä¸ªid对åºçå·²åºåºæ°éæ»å-å ¥åºåºæ°é Map<Long, BigDecimal> storageIdToTotalintNumMap = procurementPageDtoCopyList.stream() .collect(Collectors.groupingBy( ProcurementPageDtoCopy::getSalesLedgerProductId, Collectors.reducing( BigDecimal.ZERO, ProcurementPageDtoCopy::getInboundNum, (a, b) -> a.add(b == null ? BigDecimal.ZERO : b) ) )); // 3. 循ç¯ç»dtoèµå¼ for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) { // æ ¹æ®éè´å°è´¦IDçé对åºçåºåºè®°å½ List<ProcurementRecordOut> collect1 = procurementRecords.stream() .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId())) .collect(Collectors.toList()); // å¦ææ²¡æç¸å ³çåºåºè®°å½ï¼è·³è¿è¯¥æ¡æ°æ® if(CollectionUtils.isEmpty(collect1)){ dto.setInboundNum0(dto.getInboundNum()); dto.setTotalInboundNum(BigDecimal.ZERO); continue; } // 计ç®å·²åºåºæ°éæ»åï¼å¹¶è®¾ç½®å¾ åºåºæ°é BigDecimal totalInboundNum = collect1.stream() .map(ProcurementRecordOut::getInboundNum) .reduce(BigDecimal.ZERO, BigDecimal::add); // åºåºæ°é = æ»æ°é - å¾ åºåºæ°é Integer storageId = dto.getId(); Integer salesLedgerProductId = Integer.valueOf(Math.toIntExact(dto.getSalesLedgerProductId())); // è·åå½åsalesLedgerProductId对åºçå·²åºåºæ»æ°ï¼é»è®¤0ï¼ BigDecimal totalInboundNum = storageIdToTotalOutNumMap.getOrDefault(salesLedgerProductId, BigDecimal.ZERO); // å·²åºåºæ°é dto.setTotalInboundNum(totalInboundNum); // å¾ åºåºæ°é = æ»æ°é - å·²åºåºæ°é dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum)); // åºåä»·å¼ if(dto.getUnitPrice() != null){ dto.setTotalPrice(dto.getTotalInboundNum().multiply(dto.getUnitPrice())); } // å¾ åºåºæ°é = æ»æ°é - å·²åºåºæ°éï¼æ»æ°é空å¼åé»è®¤0ï¼ // BigDecimal totalNum = dto.getInboundNum() == null ? BigDecimal.ZERO : dto.getInboundNum(); BigDecimal totalNum = storageIdToTotalintNumMap.getOrDefault(salesLedgerProductId, BigDecimal.ZERO); dto.setInboundNum(totalNum); dto.setInboundNum0(totalNum.subtract(totalInboundNum)); // åºåä»·å¼ = å·²åºåºæ°é * åä»·ï¼å价空å¼åé»è®¤0ï¼ BigDecimal unitPrice = dto.getUnitPrice() == null ? BigDecimal.ZERO : dto.getUnitPrice(); dto.setTotalPrice(totalInboundNum.multiply(unitPrice)); } return procurementPageDtoCopyIPage; } src/main/java/com/ruoyi/production/controller/ProcessRouteController.java
@@ -29,7 +29,7 @@ @ApiOperation("æ°å¢å·¥èºè·¯çº¿") @PostMapping () public R add(@RequestBody ProcessRoute processRoute) { return R.ok(processRouteService.save(processRoute)); return R.ok(processRouteService.saveProcessRoute(processRoute)); } @ApiOperation("ä¿®æ¹å·¥èºè·¯çº¿") @PutMapping () src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
@@ -32,4 +32,7 @@ @ApiModelProperty(value = "æ´æ°æ¶é´") @TableField(fill = FieldFill.UPDATE) private LocalDateTime updateTime; @ApiModelProperty(value = "å·¥èºè·¯çº¿ç¼ç ") private String processRouteCode; } src/main/java/com/ruoyi/production/service/ProcessRouteService.java
@@ -5,8 +5,11 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.production.dto.ProcessRouteDto; import com.ruoyi.production.pojo.ProcessRoute; import io.swagger.models.auth.In; public interface ProcessRouteService extends IService<ProcessRoute> { IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto); Integer saveProcessRoute(ProcessRoute processRoute); } src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -13,6 +13,9 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; import java.time.format.DateTimeFormatter; @Service @AllArgsConstructor @Slf4j @@ -26,4 +29,15 @@ return processRouteMapper.pageProcessRouteDto(page, processRouteDto); } @Override public Integer saveProcessRoute(ProcessRoute processRoute) { this.save(processRoute); String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")); String idStr = String.format("%06d", processRoute.getId()); String newProductCode = "GY" + dateStr + idStr; // æ´æ°æ°æ®åºä¸çproductCode processRoute.setProcessRouteCode(newProductCode); return processRouteMapper.updateById(processRoute); } } src/main/java/com/ruoyi/sales/controller/SalesLedgerProductController.java
@@ -52,10 +52,12 @@ procurementDto.setSalesLedgerProductId(item.getId()); procurementDto.setProductCategory(item.getProductCategory()); IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopyByProduction(new Page<>(1,-1), procurementDto); ProcurementPageDtoCopy procurementDtoCopy = result.getRecords().get(0); if(item.getQuantity().compareTo(procurementDtoCopy.getInboundNum0())>=0){ item.setApproveStatus(1); salesLedgerProductService.addOrUpdateSalesLedgerProduct(item); if(result.getRecords().size()>0) { ProcurementPageDtoCopy procurementDtoCopy = result.getRecords().get(0); if (item.getQuantity().compareTo(procurementDtoCopy.getInboundNum0()) >= 0) { item.setApproveStatus(1); salesLedgerProductService.addOrUpdateSalesLedgerProduct(item); } } }); return AjaxResult.success(list); src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java
@@ -78,6 +78,8 @@ invoiceRegistrationProduct.setSalesLedgerProductId(productDatum.getId().intValue()); invoiceRegistrationProductMapper.insert(invoiceRegistrationProduct); productDatum.setInvoiceNum(currentInvoiceNum); productDatum.setInvoiceAmount(productDatum.getCurrentInvoiceAmount()); salesLedgerProductMapper.updateById(productDatum); // æ°å¢ä¸æ¡å¼ç¥¨å°è´¦æ°æ® InvoiceLedger invoiceLedger = new InvoiceLedger(); src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -13,6 +13,7 @@ <result column="tenant_id" property="tenantId" /> <result column="product_name" property="productName" /> <result column="product_id" property="productId" /> <result column="product_code" property="productCode" /> </resultMap> <select id="listPageProductModel" resultType="com.ruoyi.basic.pojo.ProductModel"> select pm.*,p.product_name @@ -28,6 +29,11 @@ </where> order by pm.id </select> <select id="selectLatestRecord" resultType="com.ruoyi.basic.pojo.ProductModel"> SELECT * FROM product_model ORDER BY create_time DESC, id DESC LIMIT 1 </select> </mapper> src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -336,4 +336,21 @@ group by t2.product_category,t2.specification_model,t1.unit_price order by t1.create_time desc </select> <select id="listPagePRS" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy"> select * from procurement_record_storage t1 left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id <where> 1=1 <if test="req.productCategory != null and req.productCategory != ''"> and t2.product_category like concat('%',#{req.productCategory},'%') </if> <if test="req.timeStr != null and req.timeStr != ''"> and t1.create_time like concat('%',#{req.timeStr},'%') </if> <if test="req.salesLedgerProductId != null and req.salesLedgerProductId != ''"> and t1.sales_ledger_product_id = #{req.salesLedgerProductId} </if> </where> </select> </mapper>