package com.ruoyi.basic.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.dto.BusinessDescriptionDto; import com.ruoyi.basic.dto.BusinessOpportunityDto; import com.ruoyi.basic.dto.StorageBlobDTO; import com.ruoyi.basic.dto.StorageBlobVO; import com.ruoyi.basic.enums.ApplicationTypeEnum; import com.ruoyi.basic.enums.RecordTypeEnum; import com.ruoyi.basic.mapper.AreaMapper; import com.ruoyi.basic.mapper.BusinessDescriptionMapper; import com.ruoyi.basic.mapper.BusinessOpportunityMapper; import com.ruoyi.basic.pojo.Area; import com.ruoyi.basic.pojo.BusinessDescription; import com.ruoyi.basic.pojo.BusinessOpportunity; import com.ruoyi.basic.service.BusinessOpportunityService; import com.ruoyi.basic.utils.FileUtil; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.framework.security.LoginUser; import com.ruoyi.framework.web.domain.R; import com.ruoyi.project.system.domain.SysNotice; import com.ruoyi.project.system.mapper.SysNoticeMapper; import com.ruoyi.project.system.service.impl.UnipushService; import lombok.RequiredArgsConstructor; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import java.util.ArrayList; import java.util.List; /** *

* 商机管理 服务实现类 *

* * @author 芯导软件(江苏)有限公司 * @since 2026-05-07 04:46:10 */ @Service @RequiredArgsConstructor public class BusinessOpportunityServiceImpl extends ServiceImpl implements BusinessOpportunityService { private final BusinessOpportunityMapper businessOpportunityMapper; private final AreaMapper areaMapper; private final BusinessDescriptionMapper businessDescriptionMapper; private final UnipushService unipushService; private final SysNoticeMapper sysNoticeMapper; private final FileUtil fileUtil; @Override public IPage listPage(Page page, BusinessOpportunityDto businessOpportunityDto) { LoginUser loginUser = SecurityUtils.getLoginUser(); IPage businessOpportunityDtoIPage = businessOpportunityMapper.listPage(page, businessOpportunityDto); businessOpportunityDtoIPage.getRecords().forEach(opportunity -> { ArrayList storageBlobVOS = new ArrayList<>(); // 查询业务描述列表 List businessDescriptions = businessDescriptionMapper.selectList( new LambdaQueryWrapper() .eq(BusinessDescription::getBusinessOpportunityId, opportunity.getId()) .orderByDesc(BusinessDescription::getCreateTime) ); // 收集每个业务描述的文件 if (businessDescriptions != null && !businessDescriptions.isEmpty()) { businessDescriptions.forEach(description -> { List files = fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId( ApplicationTypeEnum.FILE, RecordTypeEnum.BUSINESS_DESCRIPTION, Long.valueOf(description.getId()) ); if (files != null && !files.isEmpty()) { storageBlobVOS.addAll(files); } }); } // 查询商机主表的文件 List opportunityFiles = fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId( ApplicationTypeEnum.FILE, RecordTypeEnum.BUSINESS_OPPORTUNITY, opportunity.getId() ); if (opportunityFiles != null && !opportunityFiles.isEmpty()) { storageBlobVOS.addAll(opportunityFiles); } opportunity.setBusinessCommonFiles(storageBlobVOS); opportunity.setBusinessDescription(businessDescriptions); }); return businessOpportunityDtoIPage; } @Override public List getProvinceList() { return areaMapper.selectList(new LambdaQueryWrapper().eq(Area::getLevel,1).eq(Area::getParentId,0)); } @Override public List getCityList(Integer provinceId) { return areaMapper.selectList(new LambdaQueryWrapper().eq(Area::getLevel,2).eq(Area::getParentId,provinceId)); } @Override public R add(BusinessOpportunityDto businessOpportunity) { this.save(businessOpportunity); BusinessDescription businessDescription = new BusinessDescription(); BeanUtils.copyProperties(businessOpportunity, businessDescription); businessDescription.setBusinessOpportunityId(businessOpportunity.getId()); // 迁移临时文件到正式文件 // commonFileService.migrateTempFilesToFormal(businessOpportunity.getId(), businessOpportunity.getTempFileIds()); ArrayList storageBlobDTOS = new ArrayList<>(); for (StorageBlobVO businessCommonFile : businessOpportunity.getBusinessCommonFiles()) { StorageBlobDTO storageBlobDTO = new StorageBlobDTO(); BeanUtils.copyProperties(businessCommonFile, storageBlobDTO); storageBlobDTOS.add(storageBlobDTO); } fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.BUSINESS_OPPORTUNITY, businessOpportunity.getId(), storageBlobDTOS); // 推送消息 List sysNoticeList = new ArrayList<>(); SysNotice sysNotice = new SysNotice(); sysNotice.setNoticeTitle("业务员 "+ businessOpportunity.getEntryPerson()); sysNotice.setNoticeContent("新增客户 " + businessOpportunity.getCustomerName() + " 金额 "+ businessOpportunity.getContractAmount()); sysNotice.setNoticeType("1"); sysNotice.setStatus("0"); sysNotice.setSenderId(SecurityUtils.getUserId()); // 推送给谁 需要待定 sysNotice.setConsigneeId(105L); sysNotice.setAppJumpPath("pages/opportunityManagement/index"); sysNoticeMapper.insert(sysNotice); sysNoticeList.add(sysNotice); unipushService.sendClientMessage(sysNoticeList); return businessDescriptionMapper.insert(businessDescription) > 0 ? R.ok() : R.fail(); } @Override public R addDescription(BusinessDescriptionDto businessDescription) { // 迁移临时文件到正式文件 BusinessOpportunity byId = this.getById(businessDescription.getBusinessOpportunityId()); if(byId != null){ byId.setStatus(businessDescription.getStatus()); this.updateById(byId); // 推送消息 List sysNoticeList = new ArrayList<>(); SysNotice sysNotice = new SysNotice(); sysNotice.setNoticeTitle("业务员 "+ businessDescription.getEntryPerson()); sysNotice.setNoticeContent("客户 " + byId.getCustomerName() + " 金额 "+ byId.getContractAmount() + " 状态 " + businessDescription.getStatus()); sysNotice.setNoticeType("1"); sysNotice.setStatus("0"); sysNotice.setSenderId(SecurityUtils.getUserId()); sysNotice.setConsigneeId(105L); sysNotice.setAppJumpPath("pages/opportunityManagement/index"); sysNoticeMapper.insert(sysNotice); sysNoticeList.add(sysNotice); unipushService.sendClientMessage(sysNoticeList); } int insert = businessDescriptionMapper.insert(businessDescription); fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.BUSINESS_DESCRIPTION, Long.valueOf(businessDescription.getId()), businessDescription.getBusinessCommonFiles()); return insert > 0 ? R.ok() : R.fail(); } @Override public boolean updateBusinessOpportunityById(BusinessOpportunityDto businessOpportunity) { ArrayList storageBlobDTOS = new ArrayList<>(); for (StorageBlobVO businessCommonFile : businessOpportunity.getBusinessCommonFiles()) { StorageBlobDTO storageBlobDTO = new StorageBlobDTO(); BeanUtils.copyProperties(businessCommonFile, storageBlobDTO); storageBlobDTOS.add(storageBlobDTO); } fileUtil.saveStorageAttachment(ApplicationTypeEnum.FILE, RecordTypeEnum.BUSINESS_OPPORTUNITY, businessOpportunity.getId(), storageBlobDTOS); return this.updateById(businessOpportunity); } @Override public boolean delete(List ids) { for (Long id : ids) { fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.BUSINESS_OPPORTUNITY, id); } return this.removeBatchByIds(ids); } }