package com.label.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.label.common.exception.BusinessException; import com.label.common.result.PageResult; import com.label.entity.SysCompany; import com.label.mapper.SysCompanyMapper; import com.label.mapper.SysUserMapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Slf4j @Service @RequiredArgsConstructor public class CompanyService { private final SysCompanyMapper companyMapper; private final SysUserMapper userMapper; public PageResult list(int page, int pageSize, String status) { pageSize = Math.min(pageSize, 100); LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .orderByDesc(SysCompany::getCreatedAt); if (status != null && !status.isBlank()) { wrapper.eq(SysCompany::getStatus, status); } Page result = companyMapper.selectPage(new Page<>(page, pageSize), wrapper); return PageResult.of(result.getRecords(), result.getTotal(), page, pageSize); } @Transactional public SysCompany create(String companyName, String companyCode) { String normalizedName = requireText(companyName, "公司名称不能为空"); String normalizedCode = normalizeCode(companyCode); ensureUniqueCode(null, normalizedCode); ensureUniqueName(null, normalizedName); SysCompany company = new SysCompany(); company.setCompanyName(normalizedName); company.setCompanyCode(normalizedCode); company.setStatus("ACTIVE"); companyMapper.insert(company); log.info("公司已创建: id={}, code={}", company.getId(), normalizedCode); return company; } @Transactional public SysCompany update(Long companyId, String companyName, String companyCode) { SysCompany company = getExistingCompany(companyId); String normalizedName = requireText(companyName, "公司名称不能为空"); String normalizedCode = normalizeCode(companyCode); ensureUniqueCode(companyId, normalizedCode); ensureUniqueName(companyId, normalizedName); company.setCompanyName(normalizedName); company.setCompanyCode(normalizedCode); companyMapper.updateById(company); return company; } @Transactional public void updateStatus(Long companyId, String status) { SysCompany company = getExistingCompany(companyId); if (!"ACTIVE".equals(status) && !"DISABLED".equals(status)) { throw new BusinessException("INVALID_COMPANY_STATUS", "公司状态不合法", HttpStatus.BAD_REQUEST); } company.setStatus(status); companyMapper.updateById(company); } @Transactional public void delete(Long companyId) { getExistingCompany(companyId); Long userCount = userMapper.countByCompanyId(companyId); if (userCount != null && userCount > 0) { throw new BusinessException("COMPANY_HAS_USERS", "公司下仍存在用户,无法删除", HttpStatus.CONFLICT); } companyMapper.deleteById(companyId); } private SysCompany getExistingCompany(Long companyId) { SysCompany company = companyMapper.selectById(companyId); if (company == null) { throw new BusinessException("NOT_FOUND", "公司不存在: " + companyId, HttpStatus.NOT_FOUND); } return company; } private void ensureUniqueCode(Long companyId, String companyCode) { SysCompany existing = companyMapper.selectByCompanyCode(companyCode); if (existing != null && !existing.getId().equals(companyId)) { throw new BusinessException("DUPLICATE_COMPANY_CODE", "公司代码已存在", HttpStatus.CONFLICT); } } private void ensureUniqueName(Long companyId, String companyName) { SysCompany existing = companyMapper.selectOne(new LambdaQueryWrapper() .eq(SysCompany::getCompanyName, companyName) .last("LIMIT 1")); if (existing != null && !existing.getId().equals(companyId)) { throw new BusinessException("DUPLICATE_COMPANY_NAME", "公司名称已存在", HttpStatus.CONFLICT); } } private String requireText(String text, String message) { if (text == null || text.isBlank()) { throw new BusinessException("INVALID_COMPANY_FIELD", message, HttpStatus.BAD_REQUEST); } return text.trim(); } private String normalizeCode(String companyCode) { return requireText(companyCode, "公司代码不能为空").toUpperCase(); } }