package com.ruoyi.other.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.other.api.domain.TCompanyPreferential;
import com.ruoyi.other.api.domain.TGroupCompany;
import com.ruoyi.other.api.dto.CompanyPreferentialDTO;
import com.ruoyi.other.mapper.TCompanyPreferentialMapper;
import com.ruoyi.other.mapper.TGroupCompanyMapper;
import com.ruoyi.other.service.TCompanyPreferentialService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
/**
*
* 公司优惠设置 服务实现类
*
*
* @author mxcd
* @since 2026-09-28
*/
@Service
public class TCompanyPreferentialServiceImpl
extends ServiceImpl
implements TCompanyPreferentialService {
/** 公司 Mapper(校验配置所属公司是否存在) */
@Resource
private TGroupCompanyMapper groupCompanyMapper;
@Override
public CompanyPreferentialDTO getPreferential(Integer companyId) {
if (companyId == null) {
return null;
}
CompanyPreferentialDTO dto = new CompanyPreferentialDTO();
dto.setCompanyId(companyId);
// 未配置时优惠字段保持为空,由前端置默认值(不优惠)
TCompanyPreferential entity = getByCompanyId(companyId);
if (entity != null) {
dto.setPreferentialType(entity.getPreferentialType());
dto.setServiceDiscountRate(entity.getServiceDiscountRate());
dto.setBillingTemplateId(entity.getBillingTemplateId());
}
return dto;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Integer savePreferential(CompanyPreferentialDTO dto) {
if (dto == null || dto.getCompanyId() == null) {
throw new IllegalArgumentException("配置所属公司不能为空");
}
TGroupCompany company = groupCompanyMapper.selectById(dto.getCompanyId());
if (company == null) {
throw new IllegalArgumentException("公司不存在");
}
// 校验并规范化:仅保留当前优惠方式对应的字段,其余落库为 NULL(避免切换方式后残留旧配置)
int preferentialType = CompanyPreferentialSupport.normalizePreferentialType(dto.getPreferentialType());
BigDecimal serviceDiscountRate = CompanyPreferentialSupport
.normalizeDiscountRate(preferentialType, dto.getServiceDiscountRate());
Integer billingTemplateId = CompanyPreferentialSupport
.normalizeBillingTemplateId(preferentialType, dto.getBillingTemplateId());
// 一个公司一条配置:存在则覆盖,不存在则新增
TCompanyPreferential entity = getByCompanyId(dto.getCompanyId());
if (entity == null) {
entity = new TCompanyPreferential();
entity.setCompanyId(dto.getCompanyId());
entity.setDelFlag(false);
}
entity.setPreferentialType(preferentialType);
entity.setServiceDiscountRate(serviceDiscountRate);
entity.setBillingTemplateId(billingTemplateId);
saveOrUpdate(entity);
return entity.getId();
}
/**
* 按公司查询配置(唯一索引保障最多一条,多余数据取首条不抛异常)
*/
private TCompanyPreferential getByCompanyId(Integer companyId) {
return getOne(Wrappers.lambdaQuery()
.eq(TCompanyPreferential::getCompanyId, companyId), false);
}
}