From fb7f1be781366330b8cd2c5ac11258119ecc403f Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期六, 28 三月 2026 15:36:21 +0800
Subject: [PATCH] feat(procurement): 新增采购价格管理模块及自动价格变更处理

---
 src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java |   95 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 92 insertions(+), 3 deletions(-)

diff --git a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java b/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java
index e90a7a2..707f829 100644
--- a/src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java
+++ b/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 {
+        // 鏍规嵁渚涘簲鍟唅d 浜у搧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);
+    }
 }

--
Gitblit v1.9.3