| src/main/java/com/ruoyi/procurementrecord/DiscountTypeEnum.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/procurementrecord/dto/SimplePP.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPriceManagement.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/procurementrecord/service/ProcurementPriceManagementService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/resources/mapper/procurementrecord/ProcurementPriceManagementMapper.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/ruoyi/procurementrecord/DiscountTypeEnum.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ package com.ruoyi.procurementrecord; import lombok.Getter; /** * @author buhuazhen * @date 2026/3/28 * @email 3038525872@qq.com */ @Getter public enum DiscountTypeEnum{ DISCOUNT_TYPE_NONE("", "æ ææ£"), DISCOUNT_TYPE_PERCENTAGE("percentage", "ç¾åæ¯ææ£"), DISCOUNT_TYPE_FIXED("fixed", "åºå®éé¢"); private final String code; private final String description; DiscountTypeEnum(String code, String description) { this.code = code; this.description = description; } } src/main/java/com/ruoyi/procurementrecord/dto/SimplePP.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,37 @@ package com.ruoyi.procurementrecord.dto; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.NonNull; import java.io.Serializable; import java.math.BigDecimal; /** * ç¨äºèªå¨çæéè´ä»·æ ¼ç®¡ççç®åDTO * ä¸ä¸ * @author buhuazhen * @date 2026/3/28 * @email 3038525872@qq.com */ @Data @AllArgsConstructor @NoArgsConstructor public class SimplePP implements Serializable { private String productName; private Long productId; private String specification; private String supplierName; private Long supplierId; private String remark; private String unit; // æç»ä»·æ ¼ è¦æ±ä¸å«ç¨çåä»· private BigDecimal finalPrice; } src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementPriceManagement.java
@@ -8,6 +8,8 @@ import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.Date; @@ -18,7 +20,7 @@ @Data @TableName("procurement_price_management") @ApiModel public class ProcurementPriceManagement { public class ProcurementPriceManagement implements Serializable { private static final long serialVersionUID = 1L; /** @@ -31,8 +33,14 @@ @Excel(name = "åååç§°") private String productName; @TableField(value = "product_id") private Long productId; /** * æ æåæ®µ å¯ä»¥ä½ä¸ºåä½åæ®µä½¿ç¨ */ @ApiModelProperty(value = "ååç¼ç ") @Excel(name = "ååç¼ç ") // @Excel(name = "ååç¼ç ") private String productCode; @ApiModelProperty(value = "è§æ ¼åå·") @@ -43,9 +51,17 @@ @Excel(name = "ä¾åºååç§°") private String supplierName; @TableField(value = "supplier_id") private Long supplierId; @ApiModelProperty(value = "åºç¡ä»·æ ¼") @Excel(name = "åºç¡ä»·æ ¼") private String basePrice; @ApiModelProperty(value = "å®é ä»·æ ¼") @TableField(value = "actually_price") @Excel private BigDecimal actuallyPrice; @ApiModelProperty(value = "ç¶æ") @TableField(exist = false) @@ -76,6 +92,8 @@ @Excel(name = "æé«ä»·æ ¼") private String maxPrice; @ApiModelProperty(value = "é¢è¦éå¼(%)") private String warningThreshold; src/main/java/com/ruoyi/procurementrecord/service/ProcurementPriceManagementService.java
@@ -3,9 +3,12 @@ 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.common.exception.ServiceException; import com.ruoyi.procurementrecord.dto.SimplePP; import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotNull; /** * @author :yys @@ -23,4 +26,10 @@ IPage<ProcurementPriceManagement> listPage(Page page, ProcurementPriceManagement procurementPriceManagement); void export(HttpServletResponse response); /** * èªå¨çæä»·æ ¼ç®¡çå¹¶ä¸å¯¹æ¯ä¸ä¸æ¬¡ä»·æ ¼æ°æ® * @param simplePP éé¢åæ®µç¦æ¢ä¸ºç©º */ void autoCreateRecord(@NotNull SimplePP simplePP) throws ServiceException; } src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java
@@ -1,19 +1,27 @@ package com.ruoyi.procurementrecord.service.impl; 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.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.excel.ExcelUtils; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; import com.ruoyi.procurementrecord.DiscountTypeEnum; import com.ruoyi.procurementrecord.dto.SimplePP; import com.ruoyi.procurementrecord.mapper.ProcurementPriceManagementMapper; import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement; import com.ruoyi.procurementrecord.service.ProcurementPriceManagementService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Calendar; import java.util.Date; import java.util.List; /** @@ -74,5 +82,86 @@ } } ExcelUtil<ProcurementPriceManagement> util = new ExcelUtil<ProcurementPriceManagement>(ProcurementPriceManagement.class); util.exportExcel(response, procurementPriceManagements, "éè´ä»·æ ¼ç®¡ç");} util.exportExcel(response, procurementPriceManagements, "éè´ä»·æ ¼ç®¡ç"); } @Override @Transactional public void autoCreateRecord(SimplePP simplePP) throws ServiceException { // æ ¹æ®ä¾åºåid 产åid æ¥è¯¢åºæè¿ä¿®æ¹ç䏿¡è®°å½è¿è¡æ¯å¯¹ ProcurementPriceManagement insertPriceManagement = new ProcurementPriceManagement(); BeanUtils.copyProperties(simplePP, insertPriceManagement); LambdaQueryWrapper<ProcurementPriceManagement> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(ProcurementPriceManagement::getSupplierId, simplePP.getSupplierId()) .eq(ProcurementPriceManagement::getProductId, simplePP.getProductId()) .orderByDesc(ProcurementPriceManagement::getUpdateTime).last("limit 1"); ProcurementPriceManagement lastRecord = procurementPriceManagementMapper.selectOne(queryWrapper); insertPriceManagement.setActuallyPrice(simplePP.getFinalPrice()); insertPriceManagement.setDiscountType(DiscountTypeEnum.DISCOUNT_TYPE_NONE.getCode()); insertPriceManagement.setDiscountValue("0"); // ä½¿ç¨ Calendar è®¾ç½®è¿ææ¥æ (9999-12-31) Calendar calendar = Calendar.getInstance(); calendar.set(2099, Calendar.DECEMBER, 31); insertPriceManagement.setDiscountEndTime(calendar.getTime()); insertPriceManagement.setEffectiveTime(new Date()); insertPriceManagement.setExpireTime(calendar.getTime()); insertPriceManagement.setReason("other"); // è¿è¡å嫿 åµ BigDecimal currentPrice = simplePP.getFinalPrice(); if (lastRecord == null) { insertPriceManagement.setBasePrice(currentPrice.toString()); insertPriceManagement.setMinPrice(null); insertPriceManagement.setMaxPrice(null); procurementPriceManagementMapper.insert(insertPriceManagement); return; } int compareTo = lastRecord.getActuallyPrice().compareTo(currentPrice); if (compareTo == 0) { log.info("ä»·æ ¼æªååï¼æ éå建记å½"); return; } // ð ä»·æ ¼ååé»è¾ insertPriceManagement.setBasePrice(String.valueOf(lastRecord.getActuallyPrice())); insertPriceManagement.setMaxPrice(lastRecord.getMaxPrice()); insertPriceManagement.setMinPrice(lastRecord.getMinPrice()); // è®¡ç®ææ£ // if(compareTo > 0){ BigDecimal basePrice = new BigDecimal(insertPriceManagement.getBasePrice()); BigDecimal actuallyPrice = insertPriceManagement.getActuallyPrice(); // 鲿¢é¤0 if (basePrice.compareTo(BigDecimal.ZERO) == 0) { insertPriceManagement.setDiscountValue("0"); return; } // ææ£ = (åä»· - ç°ä»·) / åä»· BigDecimal discount = basePrice.subtract(actuallyPrice) .divide(basePrice, 8, RoundingMode.HALF_UP); if(discount.compareTo(new BigDecimal("0.01")) < 0 && discount.compareTo(new BigDecimal("0")) > 0){ // 转为åºå®éé¢ insertPriceManagement.setDiscountValue(String.valueOf(basePrice.subtract(actuallyPrice))); insertPriceManagement.setDiscountType(DiscountTypeEnum.DISCOUNT_TYPE_FIXED.getCode()); }else { insertPriceManagement.setDiscountType(DiscountTypeEnum.DISCOUNT_TYPE_PERCENTAGE.getCode()); // 转ç¾åæ¯ï¼Ã100ï¼ BigDecimal percent = discount.multiply(new BigDecimal("100")); // ä¿ç2ä½å°æ° percent = percent.setScale(2, RoundingMode.HALF_UP); // 设置å¼ï¼æ¯å¦ï¼20.00%ï¼ insertPriceManagement.setDiscountValue(String.valueOf(percent)); } // } // final insert procurementPriceManagementMapper.insert(insertPriceManagement); } } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -27,6 +27,8 @@ import com.ruoyi.framework.security.LoginUser; import com.ruoyi.other.mapper.TempFileMapper; import com.ruoyi.other.pojo.TempFile; import com.ruoyi.procurementrecord.dto.SimplePP; import com.ruoyi.procurementrecord.service.ProcurementPriceManagementService; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.purchase.dto.PurchaseLedgerDto; @@ -53,6 +55,7 @@ import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -102,6 +105,8 @@ private final StringRedisTemplate redisTemplate; private final IApproveProcessService approveProcessService; private final ProcurementPriceManagementService procurementPriceManagementService; @Value("${file.upload-dir}") private String uploadDir; @@ -212,7 +217,7 @@ if (products == null || products.isEmpty()) { throw new BaseException("产åä¿¡æ¯ä¸åå¨"); } PurchaseLedger ledger = purchaseLedgerMapper.selectById(salesLedgerId); // æåæ¶éææéè¦æ¥è¯¢çID Set<Long> productIds = products.stream() .map(SalesLedgerProduct::getProductId) @@ -279,6 +284,28 @@ } } updateList.addAll(insertList); updateList.forEach(it->{ SimplePP simplePP = new SimplePP(); simplePP.setProductId(it.getProductId()); simplePP.setSupplierName(ledger.getSupplierName()); simplePP.setSupplierId(ledger.getSupplierId()); simplePP.setUnit(it.getUnit()); simplePP.setProductName(it.getProductCategory()); simplePP.setSpecification(it.getSpecificationModel()); simplePP.setFinalPrice(it.getTaxInclusiveUnitPrice().divide( BigDecimal.ONE.add(it.getTaxRate().divide(new BigDecimal("100"), 4, RoundingMode.HALF_UP)), 2, // ä¿ç4ä½ï¼å¯æ ¹æ®ä¸å¡è°æ´ï¼ RoundingMode.HALF_UP )); simplePP.setRemark( "ç³»ç»æ ¹æ®éè´æäº¤èªå¨çæãéè´ååå·ä¸º:" + purchaseLedger.getPurchaseContractNumber() + "ã" ); procurementPriceManagementService.autoCreateRecord(simplePP); }); // è®¡ç®æ»å«ç¨éé¢ BigDecimal totalTaxInclusiveAmount = products.stream() .map(SalesLedgerProduct::getTaxInclusiveTotalPrice) src/main/resources/mapper/procurementrecord/ProcurementPriceManagementMapper.xml
@@ -11,6 +11,13 @@ <if test="req.supplierName != null and req.supplierName != ''"> AND supplier_name = #{req.supplierName} </if> <if test="req.supplierId != null"> AND supplier_id = #{req.supplierId} </if> <if test="req.productId != null"> AND product_id = #{req.productId} </if> </where> order by update_time desc </select> </mapper>