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("草稿状态已变化,请刷新后重试");
|
}
|
}
|