8d28496c655e2585ab76c1e949d2532b52bfdf4b..b06a2928f34758ccef05650108e2b02d03962a63
2025-12-12 maven
yys 商机管理
b06a29 对比 | 目录
2025-12-12 maven
yys 商机管理
56a774 对比 | 目录
已添加7个文件
已修改5个文件
375 ■■■■■ 文件已修改
src/main/java/com/ruoyi/sales/controller/BusinessOpportunityController.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/CommonFileController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/BusinessDescriptionMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/BusinessOpportunityMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/BusinessDescription.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/BusinessOpportunity.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/CommonFile.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/BusinessOpportunityService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/BusinessOpportunityServiceImpl.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/BusinessOpportunityController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,97 @@
package com.ruoyi.sales.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.mapper.BusinessDescriptionMapper;
import com.ruoyi.sales.pojo.BusinessDescription;
import com.ruoyi.sales.pojo.BusinessOpportunity;
import com.ruoyi.sales.service.BusinessOpportunityService;
import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
import io.jsonwebtoken.lang.Collections;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/12/12 9:29
 */
@RestController
@RequestMapping("/businessOpportunity")
@Api(tags = "商机管理")
public class BusinessOpportunityController extends BaseController {
    @Autowired
    private BusinessOpportunityService businessOpportunityService;
    @Autowired
    private BusinessDescriptionMapper BusinessDescriptionMapper;
    @Autowired
    private CommonFileServiceImpl commonFileService;
    @GetMapping("/listPage")
    @ApiOperation("商机列表")
    public AjaxResult listPage(Page page, BusinessOpportunity businessOpportunity) {
        IPage<BusinessOpportunity> businessOpportunityIPage = businessOpportunityService.listPage(page, businessOpportunity);
        businessOpportunityIPage.getRecords().forEach(item -> {
            item.setBusinessCommonFiles(commonFileService.getFileList(item.getId(),9));
            item.setBusinessDescription(BusinessDescriptionMapper.selectList(Wrappers.lambdaQuery(BusinessDescription.class)
                    .eq(BusinessDescription::getBusinessOpportunityId, item.getId())));
        });
        return AjaxResult.success(businessOpportunityIPage);
    }
    @PostMapping("/add")
    @ApiOperation("添加商机")
    @Log(title = "商机管理-添加商机", businessType = BusinessType.INSERT)
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody BusinessOpportunity businessOpportunity) throws  Exception{
        businessOpportunityService.save(businessOpportunity);
        BusinessDescription businessDescription = new BusinessDescription();
        BeanUtils.copyProperties(businessOpportunity, businessDescription);
        businessDescription.setBusinessOpportunityId(businessOpportunity.getId());
        // è¿ç§»ä¸´æ—¶æ–‡ä»¶åˆ°æ­£å¼æ–‡ä»¶
        commonFileService.migrateTempFilesToFormal(businessOpportunity.getId(), businessOpportunity.getTempFileIds());
        return BusinessDescriptionMapper.insert(businessDescription) > 0 ? success() : error();
    }
    @PostMapping("/addDescription")
    @ApiOperation("添加商机描述")
    @Log(title = "商机管理-添加商机描述", businessType = BusinessType.INSERT)
    public AjaxResult addDescription(@RequestBody BusinessDescription businessDescription) throws  Exception{
        // è¿ç§»ä¸´æ—¶æ–‡ä»¶åˆ°æ­£å¼æ–‡ä»¶
        commonFileService.migrateTempFilesToFormal(businessDescription.getBusinessOpportunityId(), businessDescription.getTempFileIds());
        return BusinessDescriptionMapper.insert(businessDescription) > 0 ? success() : error();
    }
    @PostMapping("/update")
    @ApiOperation("修改商机")
    @Log(title = "商机管理-修改商机", businessType = BusinessType.UPDATE)
    public AjaxResult update(@RequestBody BusinessOpportunity businessOpportunity) throws  Exception{
        // è¿ç§»ä¸´æ—¶æ–‡ä»¶åˆ°æ­£å¼æ–‡ä»¶
        commonFileService.migrateTempFilesToFormal(businessOpportunity.getId(), businessOpportunity.getTempFileIds());
        return businessOpportunityService.updateById(businessOpportunity) ? success() : error();
    }
    @DeleteMapping("/delete")
    @ApiOperation("删除商机")
    @Log(title = "商机管理-删除商机", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(Collections.isEmpty(ids)) return error("请选择要删除的商机");
        return businessOpportunityService.removeBatchByIds(ids) ? success() : error();
    }
}
src/main/java/com/ruoyi/sales/controller/CommonFileController.java
@@ -33,9 +33,5 @@
        return toAjax(commonFileService.delCommonFileByIds(ids));
    }
    public void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds) throws IOException{
    }
}
src/main/java/com/ruoyi/sales/mapper/BusinessDescriptionMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.sales.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.sales.pojo.BusinessDescription;
/**
 * @author :yys
 * @date : 2025/12/12 11:38
 */
public interface BusinessDescriptionMapper extends BaseMapper<BusinessDescription> {
}
src/main/java/com/ruoyi/sales/mapper/BusinessOpportunityMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.sales.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.sales.pojo.BusinessOpportunity;
/**
 * @author :yys
 * @date : 2025/12/12 9:27
 */
public interface BusinessOpportunityMapper extends BaseMapper<BusinessOpportunity> {
}
src/main/java/com/ruoyi/sales/pojo/BusinessDescription.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
package com.ruoyi.sales.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/12/12 11:36
 */
@Data
@TableName("business_description")
@ApiModel
public class BusinessDescription {
    private static final long serialVersionUID = 1L;
    @TableField(exist = false)
    @ApiModelProperty(value = "临时文件id")
    private List<String> tempFileIds;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "商机主表id")
    private Long businessOpportunityId;
    @ApiModelProperty(value = "状态")
    private String status;
    @ApiModelProperty(value = "客户描述")
    private String description;
    @ApiModelProperty(value = "录入人")
    private String entryPerson;
    @ApiModelProperty(value = "录入日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date entryDate;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/sales/pojo/BusinessOpportunity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,87 @@
package com.ruoyi.sales.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.dto.DateQueryDto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/12/12 9:21
 */
@Data
@TableName("business_opportunity")
@ApiModel
public class BusinessOpportunity extends DateQueryDto {
    private static final long serialVersionUID = 1L;
    @TableField(exist = false)
    @ApiModelProperty(value = "附件")
    private List<CommonFile> businessCommonFiles;
    @TableField(exist = false)
    @ApiModelProperty(value = "临时文件id")
    private List<String> tempFileIds;
    @ApiModelProperty(value = "商机描述")
    @TableField(exist = false)
    private List<BusinessDescription> businessDescription;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "状态")
    private String status;
    @ApiModelProperty(value = "省份")
    private String province;
    @ApiModelProperty(value = "客户名称")
    private String customerName;
    @ApiModelProperty(value = "客户描述")
    @TableField(exist = false)
    private String description;
    @ApiModelProperty(value = "商机来源")
    private String businessSource;
    @ApiModelProperty(value = "录入人")
    private String entryPerson;
    @ApiModelProperty(value = "录入日期")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date entryDate;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/sales/pojo/CommonFile.java
@@ -1,6 +1,7 @@
package com.ruoyi.sales.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.ruoyi.common.enums.FileNameType;
import lombok.Data;
import java.time.LocalDateTime;
@@ -27,9 +28,12 @@
    /** æ–‡ä»¶è·¯å¾„ */
    private String url;
    /** å…³è”表 */
    /** å…³è”表类型FileNameType
     * 1:销售 2:采购 3:发票 4:采购台账 5:计量器具台账 6:计量器具台账记录 7:协同审批节点审核 8:协同审批主数据 9: å•†æœº
     * */
    private Integer type;
    /** åˆ›å»ºæ—¶é—´ */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
src/main/java/com/ruoyi/sales/service/BusinessOpportunityService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package com.ruoyi.sales.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.sales.pojo.BusinessOpportunity;
/**
 * @author :yys
 * @date : 2025/12/12 9:28
 */
public interface BusinessOpportunityService extends IService<BusinessOpportunity> {
    /**
     * å•†æœºåˆ—表分页查询
     * @param page
     * @param businessOpportunity
     * @return
     */
    IPage<BusinessOpportunity> listPage(Page page, BusinessOpportunity businessOpportunity);
}
src/main/java/com/ruoyi/sales/service/impl/BusinessOpportunityServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,41 @@
package com.ruoyi.sales.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.common.utils.StringUtils;
import com.ruoyi.sales.mapper.BusinessOpportunityMapper;
import com.ruoyi.sales.pojo.BusinessOpportunity;
import com.ruoyi.sales.service.BusinessOpportunityService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author :yys
 * @date : 2025/12/12 9:28
 */
@Service
@Slf4j
public class BusinessOpportunityServiceImpl extends ServiceImpl<BusinessOpportunityMapper, BusinessOpportunity> implements BusinessOpportunityService {
    @Autowired
    private BusinessOpportunityMapper businessOpportunityMapper;
    @Override
    public IPage<BusinessOpportunity> listPage(Page page, BusinessOpportunity businessOpportunity) {
        LambdaQueryWrapper<BusinessOpportunity> businessOpportunityLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if(businessOpportunity != null){
            if(StringUtils.isNotEmpty(businessOpportunity.getCustomerName())){
                businessOpportunityLambdaQueryWrapper.like(BusinessOpportunity::getCustomerName,businessOpportunity.getCustomerName());
            }
            if(StringUtils.isNotEmpty(businessOpportunity.getEntryDateStart()) && StringUtils.isNotEmpty(businessOpportunity.getEntryDateEnd())){
                businessOpportunityLambdaQueryWrapper.ge(BusinessOpportunity::getEntryDate,businessOpportunity.getEntryDateStart())
                        .le(BusinessOpportunity::getEntryDate,businessOpportunity.getEntryDateEnd());
            }
        }
        businessOpportunityLambdaQueryWrapper.orderByDesc(BusinessOpportunity::getEntryDate);
        return businessOpportunityMapper.selectPage(page,businessOpportunityLambdaQueryWrapper);
    }
}
src/main/java/com/ruoyi/sales/service/impl/CommonFileServiceImpl.java
@@ -1,5 +1,6 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.other.mapper.TempFileMapper;
@@ -38,6 +39,13 @@
    @Value("${file.upload-dir}")
    private String uploadDir;
    public List<CommonFile> getFileList(Long id,Integer type) {
        LambdaQueryWrapper<CommonFile> commonFileLambdaQueryWrapper = new LambdaQueryWrapper<>();
        commonFileLambdaQueryWrapper.eq(CommonFile::getCommonId, id)
                .eq(CommonFile::getType, type);
        return list(commonFileLambdaQueryWrapper);
    }
    @Override
@@ -122,13 +130,6 @@
            Path formalFilePath = formalDirPath.resolve(formalFilename);
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
//                Files.move(
//                        Paths.get(tempFile.getTempPath()),
//                        formalFilePath,
//                        StandardCopyOption.REPLACE_EXISTING,
//                        StandardCopyOption.ATOMIC_MOVE
//                );
                // åŽŸå­ç§»åŠ¨å¤±è´¥ï¼Œä½¿ç”¨å¤åˆ¶+删除
                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
@@ -142,6 +143,7 @@
                fileRecord.setCreateTime(LocalDateTime.now());
                fileRecord.setType(tempFile.getType());
                commonFileMapper.insert(fileRecord);
                tempFileMapper.deleteById(tempFileId);
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
            } catch (IOException e) {
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -480,13 +480,6 @@
            Path formalFilePath = formalDirPath.resolve(formalFilename);
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
//                Files.move(
//                        Paths.get(tempFile.getTempPath()),
//                        formalFilePath,
//                        StandardCopyOption.REPLACE_EXISTING,
//                        StandardCopyOption.ATOMIC_MOVE
//                );
                // åŽŸå­ç§»åŠ¨å¤±è´¥ï¼Œä½¿ç”¨å¤åˆ¶+删除
                Files.copy(Paths.get(tempFile.getTempPath()), formalFilePath, StandardCopyOption.REPLACE_EXISTING);
                Files.deleteIfExists(Paths.get(tempFile.getTempPath()));
src/main/resources/application.yml
@@ -1,4 +1,4 @@
# Spring配置
spring:
  profiles:
    active: demo
    active: dev