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);
}
}