6 天以前 1e123568c2f561013f5636e45dc0db30b17a3517
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
package com.ruoyi.production.service.impl;
 
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.mapper.ProductModelMapper;
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.mapper.PieceRateConfigMapper;
import com.ruoyi.production.pojo.PieceRateConfig;
import com.ruoyi.production.service.PieceRateConfigService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.math.BigDecimal;
 
@AllArgsConstructor
@Service
@Transactional(rollbackFor = Exception.class)
public class PieceRateConfigServiceImpl extends ServiceImpl<PieceRateConfigMapper, PieceRateConfig> implements PieceRateConfigService {
 
    private final ProductModelMapper productModelMapper;
 
    @Override
    public IPage<PieceRateConfig> listPage(Page<PieceRateConfig> page, PieceRateConfig query) {
        return this.page(page, Wrappers.<PieceRateConfig>lambdaQuery()
                .like(query.getOperationName() != null && !query.getOperationName().isEmpty(),
                        PieceRateConfig::getOperationName, query.getOperationName())
                .like(query.getProductModel() != null && !query.getProductModel().isEmpty(),
                        PieceRateConfig::getProductModel, query.getProductModel())
                .eq(query.getProductModelId() != null, PieceRateConfig::getProductModelId, query.getProductModelId())
                .eq(query.getStatus() != null, PieceRateConfig::getStatus, query.getStatus())
                .orderByDesc(PieceRateConfig::getId));
    }
 
    @Override
    public R add(PieceRateConfig config) {
        validate(config);
        checkDuplicate(config.getProductModelId(), config.getOperationName(), null);
        fillProductModel(config);
        if (config.getStatus() == null) {
            config.setStatus(1);
        }
        this.save(config);
        return R.ok();
    }
 
    @Override
    public R update(PieceRateConfig config) {
        if (config.getId() == null) {
            throw new ServiceException("参数错误:id不能为空");
        }
        PieceRateConfig exist = this.getById(config.getId());
        if (exist == null) {
            throw new ServiceException("计件单价配置不存在");
        }
        validate(config);
        checkDuplicate(config.getProductModelId(), config.getOperationName(), config.getId());
        fillProductModel(config);
        this.updateById(config);
        return R.ok();
    }
 
    @Override
    public R changeStatus(Long id, Integer status) {
        if (id == null || status == null || (status != 0 && status != 1)) {
            throw new ServiceException("参数错误:id与状态(0/1)必传");
        }
        PieceRateConfig exist = this.getById(id);
        if (exist == null) {
            throw new ServiceException("计件单价配置不存在");
        }
        PieceRateConfig update = new PieceRateConfig();
        update.setId(id);
        update.setStatus(status);
        this.updateById(update);
        return R.ok();
    }
 
    @Override
    public BigDecimal matchPrice(Long productModelId, String operationName) {
        if (productModelId == null || operationName == null || operationName.isEmpty()) {
            return null;
        }
        PieceRateConfig config = this.getOne(Wrappers.<PieceRateConfig>lambdaQuery()
                .eq(PieceRateConfig::getProductModelId, productModelId)
                .eq(PieceRateConfig::getOperationName, operationName)
                .eq(PieceRateConfig::getStatus, 1)
                .orderByDesc(PieceRateConfig::getId)
                .last("limit 1"), false);
        return config == null ? null : config.getUnitPrice();
    }
 
    private void validate(PieceRateConfig config) {
        if (config.getProductModelId() == null) {
            throw new ServiceException("请选择产品规格");
        }
        if (config.getOperationName() == null || config.getOperationName().trim().isEmpty()) {
            throw new ServiceException("工序名称不能为空");
        }
        config.setOperationName(config.getOperationName().trim());
        if (config.getUnitPrice() == null || config.getUnitPrice().compareTo(BigDecimal.ZERO) <= 0) {
            throw new ServiceException("计件单价必须大于0");
        }
    }
 
    private void checkDuplicate(Long productModelId, String operationName, Long excludeId) {
        long count = this.count(Wrappers.<PieceRateConfig>lambdaQuery()
                .eq(PieceRateConfig::getProductModelId, productModelId)
                .eq(PieceRateConfig::getOperationName, operationName)
                .ne(excludeId != null, PieceRateConfig::getId, excludeId));
        if (count > 0) {
            throw new ServiceException("该产品规格下工序[" + operationName + "]已存在计件单价配置");
        }
    }
 
    private void fillProductModel(PieceRateConfig config) {
        ProductModel model = productModelMapper.selectById(config.getProductModelId());
        if (model == null) {
            throw new ServiceException("产品规格不存在");
        }
        config.setProductModel(model.getModel());
    }
}