zss
2 天以前 ba0dd873d9843fd219cf3776e7eaff33b6bb98dd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
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.exception.ServiceException;
import com.ruoyi.common.utils.poi.ExcelUtil;
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;
 
/**
 * @author :yys
 * @date : 2025/9/17 15:07
 */
@Service
@Slf4j
public class ProcurementPriceManagementServiceImpl extends ServiceImpl<ProcurementPriceManagementMapper, ProcurementPriceManagement> implements ProcurementPriceManagementService {
 
 
    @Autowired
    private ProcurementPriceManagementMapper procurementPriceManagementMapper;
 
 
    @Override
    public IPage<ProcurementPriceManagement> listPage(Page page, ProcurementPriceManagement procurementPriceManagement) {
        IPage<ProcurementPriceManagement> result = procurementPriceManagementMapper.listPage(page, procurementPriceManagement);
        // 根据生效时间,失效时间判断状态 有效,待生效,已过期
        for (ProcurementPriceManagement record : result.getRecords()) {
            if (record.getEffectiveTime() != null) {
                if (record.getEffectiveTime().getTime() <= System.currentTimeMillis()) {
                    record.setStatus("active");
                }
            }
            if (record.getEffectiveTime() != null) {
                if (record.getEffectiveTime().getTime() > System.currentTimeMillis()) {
                    record.setStatus("pending");
                }
            }
            if (record.getExpireTime() != null) {
                if (record.getExpireTime().getTime() <= System.currentTimeMillis()) {
                    record.setStatus("expired");
                }
            }
        }
        return result;
    }
 
    @Override
    public void export(HttpServletResponse response) {
        List<ProcurementPriceManagement> procurementPriceManagements = procurementPriceManagementMapper.selectList(null);
        for (ProcurementPriceManagement procurementPriceManagement : procurementPriceManagements) {
            if (procurementPriceManagement.getEffectiveTime() != null) {
                if (procurementPriceManagement.getEffectiveTime().getTime() <= System.currentTimeMillis()) {
                    procurementPriceManagement.setStatus("有效");
                }
            }
            if (procurementPriceManagement.getEffectiveTime() != null) {
                if (procurementPriceManagement.getEffectiveTime().getTime() > System.currentTimeMillis()) {
                    procurementPriceManagement.setStatus("待生效");
                }
            }
            if (procurementPriceManagement.getExpireTime() != null) {
                if (procurementPriceManagement.getExpireTime().getTime() <= System.currentTimeMillis()) {
                    procurementPriceManagement.setStatus("已过期");
                }
            }
        }
        ExcelUtil<ProcurementPriceManagement> util = new ExcelUtil<ProcurementPriceManagement>(ProcurementPriceManagement.class);
        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);
    }
}