xiaoyi
4 天以前 fae95228037f0c1304c1917ae5fff452f2160c5a
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
package cn.iocoder.yudao.module.erp.service.finance;
 
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.erp.api.finance.AfterSaleFinanceDraftApi;
import cn.iocoder.yudao.module.erp.api.finance.dto.AfterSaleFinanceDraftCreateDTO;
import cn.iocoder.yudao.module.erp.api.finance.dto.AfterSaleFinanceReviewDTO;
import cn.iocoder.yudao.module.erp.dal.dataobject.finance.ErpAfterSaleFinanceDraftDO;
import cn.iocoder.yudao.module.erp.dal.mysql.finance.ErpAfterSaleFinanceDraftMapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import jakarta.annotation.Resource;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.Set;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.invalidParamException;
 
@Service
public class ErpAfterSaleFinanceDraftService implements AfterSaleFinanceDraftApi {
    @Resource private ErpAfterSaleFinanceDraftMapper mapper;
 
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createDraft(AfterSaleFinanceDraftCreateDTO input) {
        if (input == null || input.getCollaborationId() == null || input.getTicketId() == null || input.getBusinessApproverId() == null
                || input.getCategory() == null || !Set.of("QUALITY", "FINANCE", "SUPPLIER", "WARRANTY").contains(input.getCategory())
                || input.getDirection() == null || !Set.of("RECEIVABLE", "PAYABLE", "INTERNAL").contains(input.getDirection())
                || input.getAmount() == null || input.getAmount().signum() <= 0 || input.getAmount().stripTrailingZeros().scale() > 2
                || input.getAmount().compareTo(new BigDecimal("9999999999999999.99")) > 0
                || input.getDescription() == null || input.getDescription().isBlank() || input.getDescription().length() > 2000
                || (input.getPartyName() != null && input.getPartyName().length() > 200)
                || (!"INTERNAL".equals(input.getDirection()) && (input.getPartyName() == null || input.getPartyName().isBlank())))
            throw invalidParamException("财务草稿的金额、方向、往来方或来源不正确");
        var draft = new ErpAfterSaleFinanceDraftDO();
        draft.setCollaborationId(input.getCollaborationId()); draft.setTicketId(input.getTicketId());
        draft.setCategory(input.getCategory()); draft.setDirection(input.getDirection()); draft.setAmount(input.getAmount());
        draft.setPartyName(input.getPartyName()); draft.setDescription(input.getDescription());
        draft.setPartyType(input.getPartyType()); draft.setPartyId(input.getPartyId());
        draft.setBusinessApproverId(input.getBusinessApproverId()); draft.setStatus(0);
        try { mapper.insert(draft); }
        catch (DuplicateKeyException e) { throw invalidParamException("该协同事项已生成财务草稿"); }
        return draft.getId();
    }
 
    public PageResult<ErpAfterSaleFinanceDraftDO> page(PageParam page, Integer status) {
        if (status != null && !Set.of(0, 1, 2).contains(status)) throw invalidParamException("审核状态不正确");
        return mapper.selectPage(page, new LambdaQueryWrapperX<ErpAfterSaleFinanceDraftDO>()
                .eqIfPresent(ErpAfterSaleFinanceDraftDO::getStatus, status).orderByDesc(ErpAfterSaleFinanceDraftDO::getId));
    }
 
    @Override
    public Map<Long, AfterSaleFinanceReviewDTO> getReviewResults(List<Long> ids) {
        if (ids == null || ids.isEmpty()) return Map.of();
        return mapper.selectBatchIds(ids).stream().collect(Collectors.toMap(ErpAfterSaleFinanceDraftDO::getId, draft -> {
            var result = new AfterSaleFinanceReviewDTO(); result.setStatus(draft.getStatus());
            result.setRemark(draft.getReviewRemark()); result.setReviewTime(draft.getReviewTime()); return result;
        }));
    }
 
    @Transactional(rollbackFor = Exception.class)
    public void review(Long id, Long reviewerId, boolean approved, String remark) {
        if (id == null || reviewerId == null || (remark != null && remark.length() > 1000)
                || (!approved && (remark == null || remark.isBlank()))) throw invalidParamException("退回时请填写审核意见");
        var draft = mapper.selectById(id);
        if (draft == null || !Objects.equals(draft.getStatus(), 0)) throw invalidParamException("草稿不存在或已审核");
        if (mapper.update(null, new LambdaUpdateWrapper<ErpAfterSaleFinanceDraftDO>()
                .eq(ErpAfterSaleFinanceDraftDO::getId, id).eq(ErpAfterSaleFinanceDraftDO::getStatus, 0)
                .set(ErpAfterSaleFinanceDraftDO::getStatus, approved ? 1 : 2).set(ErpAfterSaleFinanceDraftDO::getReviewerId, reviewerId)
                .set(ErpAfterSaleFinanceDraftDO::getReviewRemark, remark).set(ErpAfterSaleFinanceDraftDO::getReviewTime, LocalDateTime.now())) != 1)
            throw invalidParamException("草稿状态已变化,请刷新后重试");
    }
}