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.core.toolkit.Wrappers; 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(item -> { item.setBusinessCommonFiles(fileUtil.getStorageBlobVOsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.BUSINESS_OPPORTUNITY, item.getId())); item.setBusinessDescription(businessDescriptionMapper.selectList(Wrappers.lambdaQuery(BusinessDescription.class) .eq(BusinessDescription::getBusinessOpportunityId, item.getId()) .orderByDesc(BusinessDescription::getCreateTime))); }); 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, businessDescription.getBusinessOpportunityId(), businessDescription.getStorageBlobDTOS()); 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); } }