package com.ruoyi.outsourcing.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.account.mapper.PaymentRecordMapper; import com.ruoyi.account.pojo.PaymentRecord; import com.ruoyi.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.outsourcing.dto.OutsourcingPartnerDto; import com.ruoyi.outsourcing.excel.OutsourcingPartnerExcelDto; import com.ruoyi.outsourcing.mapper.OutsourcingPartnerMapper; import com.ruoyi.outsourcing.mapper.OutsourcingOrderMapper; import com.ruoyi.outsourcing.pojo.OutsourcingOrder; import com.ruoyi.outsourcing.pojo.OutsourcingPartner; import com.ruoyi.outsourcing.service.IOutsourcingPartnerService; import com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsDetailsVo; import com.ruoyi.outsourcing.vo.OutsourcingPartnerTransactionsVo; import com.ruoyi.outsourcing.vo.OutsourcingPartnerVo; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; /** * 委外合作商档案 Service 实现 */ @Service @RequiredArgsConstructor public class OutsourcingPartnerServiceImpl extends ServiceImpl implements IOutsourcingPartnerService { private final OutsourcingPartnerMapper partnerMapper; private final OutsourcingOrderMapper outsourcingOrderMapper; private final PaymentRecordMapper paymentRecordMapper; private final FileUtil fileUtil; @Override @Transactional(rollbackFor = Exception.class) public Long savePartner(OutsourcingPartnerDto dto) { if (dto.getPartnerName() == null || dto.getPartnerName().trim().isEmpty()) { throw new ServiceException("请填写合作商名称"); } checkPartnerNameDuplicate(dto.getPartnerName(), null); OutsourcingPartner partner = new OutsourcingPartner(); BeanUtils.copyProperties(dto, partner); partner.setId(null); partner.setTenantId(null); partner.setDeptId(null); partner.setCreateUser(null); partner.setCreateTime(null); partner.setUpdateTime(null); if (partner.getMaintainTime() == null) { partner.setMaintainTime(LocalDate.now()); } if (partner.getMaintainUserId() == null) { partner.setMaintainUserId(SecurityUtils.getUserId()); } partnerMapper.insert(partner); fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.OUTSOURCING_PARTNER, partner.getId(), dto.getStorageBlobDTOS()); return partner.getId(); } @Override @Transactional(rollbackFor = Exception.class) public boolean updatePartner(OutsourcingPartnerDto dto) { if (dto.getId() == null) { throw new ServiceException("合作商id不能为空"); } if (partnerMapper.selectById(dto.getId()) == null) { throw new ServiceException("合作商不存在"); } checkPartnerNameDuplicate(dto.getPartnerName(), dto.getId()); OutsourcingPartner partner = new OutsourcingPartner(); BeanUtils.copyProperties(dto, partner); // 租户、创建信息由系统维护,置空后 MyBatis-Plus 不会更新这些列 partner.setTenantId(null); partner.setDeptId(null); partner.setCreateUser(null); partner.setCreateTime(null); partner.setUpdateTime(null); boolean updated = partnerMapper.updateById(partner) > 0; if (updated) { fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.OUTSOURCING_PARTNER, dto.getId(), dto.getStorageBlobDTOS()); } return updated; } @Override @Transactional(rollbackFor = Exception.class) public boolean delPartner(List ids) { if (CollectionUtils.isEmpty(ids)) { throw new ServiceException("请选择至少一条数据"); } Long orderCount = outsourcingOrderMapper.selectCount(Wrappers.lambdaQuery() .in(OutsourcingOrder::getPartnerId, ids)); if (orderCount != null && orderCount > 0) { throw new ServiceException("合作商已存在委外订单,不允许删除"); } Long paymentCount = paymentRecordMapper.selectCount(Wrappers.lambdaQuery() .eq(PaymentRecord::getPartyType, 3) .in(PaymentRecord::getPartyId, ids)); if (paymentCount != null && paymentCount > 0) { throw new ServiceException("合作商已存在往来收付款记录,不允许删除"); } fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordIds( ApplicationTypeEnum.FILE, RecordTypeEnum.OUTSOURCING_PARTNER, ids); return this.removeByIds(ids); } @Override public OutsourcingPartnerVo partnerDetail(Long id) { OutsourcingPartner partner = partnerMapper.selectById(id); if (partner == null) { throw new ServiceException("合作商不存在"); } OutsourcingPartnerVo vo = new OutsourcingPartnerVo(); BeanUtils.copyProperties(partner, vo); vo.setStorageBlobVOS(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId( ApplicationTypeEnum.FILE, RecordTypeEnum.OUTSOURCING_PARTNER, id)); return vo; } @Override public IPage partnerListPage(Page page, OutsourcingPartnerDto dto) { return partnerMapper.partnerListPage(page, dto); } @Override public void partnerExport(HttpServletResponse response, OutsourcingPartnerDto dto) { List list = partnerMapper.partnerExportList(dto); ExcelUtil util = new ExcelUtil<>(OutsourcingPartnerExcelDto.class); util.exportExcel(response, list, "合作商档案"); } @Override public Boolean importData(MultipartFile file) { try { ExcelUtil util = new ExcelUtil<>(OutsourcingPartnerExcelDto.class); List list = util.importExcel(file.getInputStream()); if (CollectionUtils.isEmpty(list)) { return false; } List partners = list.stream().map(excel -> { OutsourcingPartner partner = new OutsourcingPartner(); BeanUtils.copyProperties(excel, partner); partner.setMaintainUserId(SecurityUtils.getUserId()); partner.setMaintainTime(LocalDate.now()); return partner; }).collect(Collectors.toList()); return this.saveOrUpdateBatch(partners); } catch (Exception e) { throw new ServiceException("合作商导入失败:" + e.getMessage()); } } @Override public List options() { return partnerMapper.selectList(new LambdaQueryWrapper() .select(OutsourcingPartner::getId, OutsourcingPartner::getPartnerName) .orderByDesc(OutsourcingPartner::getId)); } @Override public IPage partnerTransactions(Page page, String partnerName) { return partnerMapper.partnerTransactions(page, partnerName); } @Override public IPage partnerTransactionsDetails(Page page, Long partnerId) { return partnerMapper.partnerTransactionsDetails(page, partnerId); } /** * 合作商名称在租户内唯一 */ private void checkPartnerNameDuplicate(String partnerName, Long excludeId) { if (partnerName == null || partnerName.trim().isEmpty()) { return; } Long tenantId = SecurityUtils.getLoginUser().getTenantId(); LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() .eq(tenantId != null, OutsourcingPartner::getTenantId, tenantId) .isNull(tenantId == null, OutsourcingPartner::getTenantId) .eq(OutsourcingPartner::getPartnerName, partnerName) .ne(excludeId != null, OutsourcingPartner::getId, excludeId); if (partnerMapper.selectCount(wrapper) > 0) { throw new ServiceException("合作商已存在"); } } }