buhuazhen
2026-05-08 474ddd0b76f343b09038e6f60e2826684d5eecd2
Merge remote-tracking branch 'origin/dev_浪潮_pro' into dev_浪潮_pro
已添加17个文件
已修改7个文件
829 ■■■■■ 文件已修改
src/main/java/com/ruoyi/basic/controller/BusinessDescriptionController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/BusinessOpportunityController.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/CustomerContactController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/AreaDto.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/BusinessDescriptionDto.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/BusinessOpportunityDto.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/dto/ProductDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/AreaMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/BusinessDescriptionMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/mapper/BusinessOpportunityMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/Area.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/BusinessDescription.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/BusinessOpportunity.java 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/pojo/ProductModel.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/BusinessDescriptionService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/BusinessOpportunityService.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/BusinessDescriptionServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/BusinessOpportunityServiceImpl.java 157 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/FileNameType.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/BusinessDescriptionMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/BusinessOpportunityMapper.xml 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/basic/CustomerContactMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/controller/BusinessDescriptionController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.basic.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * å•†æœºå®¢æˆ·æè¿° å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-07 04:46:21
 */
@RestController
@RequestMapping("/businessDescription")
public class BusinessDescriptionController {
}
src/main/java/com/ruoyi/basic/controller/BusinessOpportunityController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,88 @@
package com.ruoyi.basic.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.BusinessDescriptionDto;
import com.ruoyi.basic.dto.BusinessOpportunityDto;
import com.ruoyi.basic.service.BusinessOpportunityService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import io.jsonwebtoken.lang.Collections;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * å•†æœºç®¡ç† å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-07 04:46:10
 */
@RestController
@RequestMapping("/businessOpportunity")
@AllArgsConstructor
@Tag(name = "商机管理")
public class BusinessOpportunityController {
    private final BusinessOpportunityService businessOpportunityService;
    @Operation(summary = "获取省级列表")
    @GetMapping("/getProvinceList")
    public R getProvinceList() {
        return R.ok(businessOpportunityService.getProvinceList());
    }
    @Operation(summary = "通过省级id获取城市列表")
    @GetMapping("/getCityList")
    public R getCityList(@RequestParam("provinceId") Integer provinceId) {
        return R.ok(businessOpportunityService.getCityList(provinceId));
    }
    @GetMapping("/listPage")
    @Operation(summary = "商机列表")
    public R listPage(Page page, BusinessOpportunityDto businessOpportunityDto) {
        IPage<BusinessOpportunityDto> businessOpportunityIPage = businessOpportunityService.listPage(page, businessOpportunityDto);
        return R.ok(businessOpportunityIPage);
    }
    @PostMapping("/add")
    @Operation(summary = "添加商机")
    @Log(title = "商机管理-添加商机", businessType = BusinessType.INSERT)
    @Transactional(rollbackFor = Exception.class)
    public R add(@RequestBody BusinessOpportunityDto businessOpportunity) throws Exception{
        return  businessOpportunityService.add(businessOpportunity);
    }
    @PostMapping("/addDescription")
    @Operation(summary = "添加商机描述")
    @Log(title = "商机管理-添加商机描述", businessType = BusinessType.INSERT)
    @Transactional(rollbackFor = Exception.class)
    public R addDescription(@RequestBody BusinessDescriptionDto businessDescription) throws  Exception{
      return businessOpportunityService.addDescription(businessDescription);
    }
    @PutMapping("/update")
    @Operation( summary = "修改商机")
    @Log(title = "商机管理-修改商机", businessType = BusinessType.UPDATE)
    @Transactional(rollbackFor = Exception.class)
    public R update(@RequestBody BusinessOpportunityDto businessOpportunity) throws  Exception{
        return businessOpportunityService.updateBusinessOpportunityById(businessOpportunity) ? R.ok() : R.fail();
    }
    @DeleteMapping("/delete")
    @Operation( summary = "删除商机")
    @Log(title = "商机管理-删除商机", businessType = BusinessType.DELETE)
    public R delete(@RequestBody List<Long> ids) {
        if(Collections.isEmpty(ids)) return R.fail("请选择要删除的商机");
        return businessOpportunityService.delete(ids) ? R.ok() : R.fail();
    }
}
src/main/java/com/ruoyi/basic/controller/CustomerContactController.java
@@ -9,6 +9,8 @@
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * å®¢æˆ·è”系人表 å‰ç«¯æŽ§åˆ¶å™¨
@@ -58,7 +60,7 @@
    @DeleteMapping("/delete")
    @Operation(summary = "删除")
    public R delete(@RequestBody CustomerContactDto customerContact) {
        return R.ok(customerContactService.removeById(customerContact));
    public R delete(@RequestBody List<Long> ids) {
        return R.ok(customerContactService.removeByIds(ids));
    }
}
src/main/java/com/ruoyi/basic/dto/AreaDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.basic.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import java.awt.geom.Area;
import java.util.List;
public class AreaDto extends Area {
    @TableField(exist = false)
    @Schema(hidden = true) // éšè—ä¸æ˜¾ç¤ºåœ¨æ–‡æ¡£ä¸­
    private List<Area> children;
}
src/main/java/com/ruoyi/basic/dto/BusinessDescriptionDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.BusinessDescription;
import lombok.Data;
import java.util.List;
@Data
public class BusinessDescriptionDto extends BusinessDescription {
    private List<StorageBlobDTO> storageBlobDTOS;
    private List<StorageBlobVO> storageBlobVO;
}
src/main/java/com/ruoyi/basic/dto/BusinessOpportunityDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.basic.dto;
import com.ruoyi.basic.pojo.BusinessDescription;
import com.ruoyi.basic.pojo.BusinessOpportunity;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class BusinessOpportunityDto extends BusinessOpportunity {
    @Schema(description = "文件id")
    private List<Long> FileIds;
    @Schema(description = "商机描述")
    private List<BusinessDescription> businessDescription;
    @ApiModelProperty(value = "开始时间")
    private String entryDateStart;
    @ApiModelProperty(value = "结束时间")
    private String entryDateEnd;
    private List<StorageBlobDTO> storageBlobDTOS;
    private List<StorageBlobVO> businessCommonFiles;
}
src/main/java/com/ruoyi/basic/dto/ProductDto.java
@@ -9,5 +9,8 @@
@Data
public class ProductDto extends Product {
    //浪潮用于区分成品和物料
    private String productType;
    private List<ProductModel> productModelList;
}
src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
@@ -208,6 +208,8 @@
    SALES_REFUND_AMOUNT_ORDER("sales_refund_amount_order"),
    SALES_RECEIPT_RETURN("sales_receipt_return"),
    ACCOUNT_EXPENSE("account_expense"),
    BUSINESS_OPPORTUNITY("business_opportunity"),
    BUSINESS_DESCRIPTION("business_description"),
    ACCOUNT_FILE("account_file");
    private final String type;
src/main/java/com/ruoyi/basic/mapper/AreaMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.Area;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface AreaMapper extends BaseMapper<Area> {
}
src/main/java/com/ruoyi/basic/mapper/BusinessDescriptionMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.basic.pojo.BusinessDescription;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * å•†æœºå®¢æˆ·æè¿° Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-07 04:46:21
 */
@Mapper
public interface BusinessDescriptionMapper extends BaseMapper<BusinessDescription> {
}
src/main/java/com/ruoyi/basic/mapper/BusinessOpportunityMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.basic.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.BusinessOpportunityDto;
import com.ruoyi.basic.pojo.BusinessOpportunity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * <p>
 * å•†æœºç®¡ç† Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-07 04:46:10
 */
@Mapper
public interface BusinessOpportunityMapper extends BaseMapper<BusinessOpportunity> {
    IPage<BusinessOpportunityDto> listPage(Page page, @Param("businessOpportunityDto") BusinessOpportunityDto businessOpportunityDto);
}
src/main/java/com/ruoyi/basic/pojo/Area.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serializable;
@Data
@TableName("area")
@Schema(description = "区域表")
public class Area implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(type = IdType.AUTO)
    @Schema(description = "序号", example = "1")
    private Long id;
    @Schema(description = "父级ID:0=省,其他=对应上级ID", example = "0")
    private Integer parentId;
    @Schema(description = "区域名称(省/市/区县)", example = "北京市")
    private String name;
    @Schema(description = "层级:1=省,2=市,3=区县", minimum = "1", maximum = "3")
    private Integer level;
}
src/main/java/com/ruoyi/basic/pojo/BusinessDescription.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * å•†æœºå®¢æˆ·æè¿°
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-07 04:46:21
 */
@Getter
@Setter
@ToString
@TableName("business_description")
@ApiModel(value = "BusinessDescription对象", description = "商机客户描述")
public class BusinessDescription implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    /**
     * å•†æœºä¸»è¡¨id
     */
    @ApiModelProperty("商机主表id")
    private Long businessOpportunityId;
    /**
     * æè¿°
     */
    @ApiModelProperty("描述")
    private String description;
    /**
     * å½•入人
     */
    @ApiModelProperty("录入人")
    private String entryPerson;
    /**
     * å½•入时间
     */
    @ApiModelProperty("录入时间")
    private LocalDate entryDate;
    /**
     * çŠ¶æ€
     */
    @ApiModelProperty("状态")
    private String status;
    private Integer tenantId;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
src/main/java/com/ruoyi/basic/pojo/BusinessOpportunity.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,147 @@
package com.ruoyi.basic.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * å•†æœºç®¡ç†
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-07 04:46:10
 */
@Getter
@Setter
@ToString
@TableName("business_opportunity")
@ApiModel(value = "BusinessOpportunity对象", description = "商机管理")
public class BusinessOpportunity implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * çŠ¶æ€
     */
    @ApiModelProperty("状态")
    private String status;
    /**
     * çœä»½
     */
    @ApiModelProperty("省份")
    private String province;
    /**
     * åŸŽå¸‚
     */
    @ApiModelProperty("城市")
    private String city;
    /**
     * å®¢æˆ·åç§°
     */
    @ApiModelProperty("客户名称")
    private String customerName;
    /**
     * å•†æœºæ¥æº
     */
    @ApiModelProperty("商机来源")
    private String businessSource;
    /**
     * å½•入日期
     */
    @ApiModelProperty("录入日期")
    private LocalDate entryDate;
    /**
     * å½•入人
     */
    @ApiModelProperty("录入人")
    private String entryPerson;
    private Integer tenantId;
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ä¿¡æ¯åŒ–现状
     */
    @ApiModelProperty("信息化现状")
    private String informationState;
    /**
     * ä¸»è¥ä¸šåŠ¡æ”¶å…¥
     */
    @ApiModelProperty("主营业务收入")
    private String mainBusinessRevenue;
    /**
     * ä¸»è¥äº§å“
     */
    @ApiModelProperty("主营产品")
    private String mainProducts;
    /**
     * å®¢æˆ·è§„模
     */
    @ApiModelProperty("客户规模")
    private String customerScale;
    /**
     * è¡Œä¸š
     */
    @ApiModelProperty("行业")
    private String industry;
    /**
     * åˆåŒé‡‘额
     */
    @ApiModelProperty("合同金额")
    private BigDecimal contractAmount;
    /**
     * ä»˜æ¬¾æè¿°
     */
    @ApiModelProperty("付款描述")
    private String paymentDescription;
    /**
     * æ”¹é€ å†…容
     */
    @ApiModelProperty("改造内容")
    private String renContent;
    @Schema(description = "部门id")
    @TableField(fill = FieldFill.INSERT)
    private Long deptId;
}
src/main/java/com/ruoyi/basic/pojo/ProductModel.java
@@ -79,4 +79,10 @@
    @Schema(description = "顶部父产品id")
    @TableField(exist = false)
    private Long topProductParentId;
    /**
     * åº“存量
     */
    @Schema(description = "库存量")
    private BigDecimal stockInventory;
}
src/main/java/com/ruoyi/basic/service/BusinessDescriptionService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.basic.service;
import com.ruoyi.basic.pojo.BusinessDescription;
import com.baomidou.mybatisplus.extension.service.IService;
/**
 * <p>
 * å•†æœºå®¢æˆ·æè¿° æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-07 04:46:21
 */
public interface BusinessDescriptionService extends IService<BusinessDescription> {
}
src/main/java/com/ruoyi/basic/service/BusinessOpportunityService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.ruoyi.basic.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.basic.dto.BusinessDescriptionDto;
import com.ruoyi.basic.dto.BusinessOpportunityDto;
import com.ruoyi.basic.pojo.Area;
import com.ruoyi.basic.pojo.BusinessOpportunity;
import com.ruoyi.framework.web.domain.R;
import java.util.List;
/**
 * <p>
 * å•†æœºç®¡ç† æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-07 04:46:10
 */
public interface BusinessOpportunityService extends IService<BusinessOpportunity> {
    IPage<BusinessOpportunityDto> listPage(Page page, BusinessOpportunityDto businessOpportunityDto);
    List<Area> getProvinceList();
    List<Area> getCityList(Integer provinceId);
    R add(BusinessOpportunityDto businessOpportunity);
    R addDescription(BusinessDescriptionDto businessDescription);
    boolean updateBusinessOpportunityById(BusinessOpportunityDto businessOpportunity);
    boolean delete(List<Long> ids);
}
src/main/java/com/ruoyi/basic/service/impl/BusinessDescriptionServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.basic.service.impl;
import com.ruoyi.basic.pojo.BusinessDescription;
import com.ruoyi.basic.mapper.BusinessDescriptionMapper;
import com.ruoyi.basic.service.BusinessDescriptionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
 * <p>
 * å•†æœºå®¢æˆ·æè¿° æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-07 04:46:21
 */
@Service
public class BusinessDescriptionServiceImpl extends ServiceImpl<BusinessDescriptionMapper, BusinessDescription> implements BusinessDescriptionService {
}
src/main/java/com/ruoyi/basic/service/impl/BusinessOpportunityServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,157 @@
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;
/**
 * <p>
 * å•†æœºç®¡ç† æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-07 04:46:10
 */
@Service
@RequiredArgsConstructor
public class BusinessOpportunityServiceImpl extends ServiceImpl<BusinessOpportunityMapper, BusinessOpportunity> 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<BusinessOpportunityDto> listPage(Page page, BusinessOpportunityDto businessOpportunityDto) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        IPage<BusinessOpportunityDto> 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<Area> getProvinceList() {
        return areaMapper.selectList(new LambdaQueryWrapper<Area>().eq(Area::getLevel,1).eq(Area::getParentId,0));
    }
    @Override
    public List<Area> getCityList(Integer provinceId) {
        return areaMapper.selectList(new LambdaQueryWrapper<Area>().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<StorageBlobDTO> 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<SysNotice> 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<SysNotice> 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<StorageBlobDTO> 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<Long> ids) {
        for (Long id : ids) {
            fileUtil.deleteStorageAttachmentsByApplicationAndRecordTypeAndRecordId(ApplicationTypeEnum.FILE, RecordTypeEnum.BUSINESS_OPPORTUNITY, id);
        }
        return this.removeBatchByIds(ids);
    }
}
src/main/java/com/ruoyi/basic/service/impl/ProductServiceImpl.java
@@ -14,11 +14,8 @@
import com.ruoyi.basic.service.IProductService;
import com.ruoyi.basic.vo.ProductModelVo;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.AjaxResult;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.Arrays;
@@ -42,6 +39,12 @@
        if (productDto.getProductName() != null && !productDto.getProductName().isEmpty()) {
            queryWrapper.like(Product::getProductName, productDto.getProductName());
        }
        // æµªæ½®ç”¨äºŽåŒºåˆ†æˆå“å’Œç‰©æ–™
        if (productDto.getProductType() != null && !productDto.getProductType().isEmpty()) {
            if (productDto.getProductType().equals("成品")){
                queryWrapper.eq(Product::getProductName, productDto.getProductType());
            }else queryWrapper.ne(Product::getProductName, "成品");
        }
        // æŸ¥è¯¢æ ¹èŠ‚ç‚¹åˆ—è¡¨
        List<Product> rootProducts = productMapper.selectList(queryWrapper);
src/main/java/com/ruoyi/common/enums/FileNameType.java
@@ -17,7 +17,8 @@
    INSPECTION_PRODUCTION_BEFORE(10),
    INSPECTION_PRODUCTION_AFTER(11),
    INSPECTION(12),//巡检 ç”Ÿäº§å‰
    APP(13);
    APP(13),
    BUSINESS_OPPORTUNITY(14);
    private final int value;
src/main/resources/mapper/basic/BusinessDescriptionMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.basic.mapper.BusinessDescriptionMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.BusinessDescription">
        <id column="id" property="id" />
        <result column="business_opportunity_id" property="businessOpportunityId" />
        <result column="description" property="description" />
        <result column="entry_person" property="entryPerson" />
        <result column="entry_date" property="entryDate" />
        <result column="status" property="status" />
        <result column="tenant_id" property="tenantId" />
        <result column="create_user" property="createUser" />
        <result column="create_time" property="createTime" />
        <result column="update_user" property="updateUser" />
        <result column="update_time" property="updateTime" />
    </resultMap>
</mapper>
src/main/resources/mapper/basic/BusinessOpportunityMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.basic.mapper.BusinessOpportunityMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.basic.pojo.BusinessOpportunity">
        <id column="id" property="id" />
        <result column="status" property="status" />
        <result column="province" property="province" />
        <result column="city" property="city" />
        <result column="customer_name" property="customerName" />
        <result column="business_source" property="businessSource" />
        <result column="entry_date" property="entryDate" />
        <result column="entry_person" property="entryPerson" />
        <result column="tenant_id" property="tenantId" />
        <result column="create_user" property="createUser" />
        <result column="create_time" property="createTime" />
        <result column="update_user" property="updateUser" />
        <result column="update_time" property="updateTime" />
        <result column="information_state" property="informationState" />
        <result column="main_business_revenue" property="mainBusinessRevenue" />
        <result column="main_products" property="mainProducts" />
        <result column="customer_scale" property="customerScale" />
        <result column="industry" property="industry" />
        <result column="contract_amount" property="contractAmount" />
        <result column="payment_description" property="paymentDescription" />
        <result column="ren_content" property="renContent" />
    </resultMap>
    <select id="listPage" resultType="com.ruoyi.basic.dto.BusinessOpportunityDto">
        select * from
        business_opportunity bo
        <where>
            <if test="businessOpportunityDto.customerName != null">
                and bo.customer_name = #{businessOpportunityDto.customerName}
            </if>
            <if test="businessOpportunityDto.city != null">
                and bo.city = #{businessOpportunityDto.city}
            </if>
            <if test="businessOpportunityDto.entryPerson != null">
                and bo.entry_person = #{businessOpportunityDto.entryPerson}
            </if>
            <if test="businessOpportunityDto.status != null">
                and bo.status = #{businessOpportunityDto.status}
            </if>
            <if test="businessOpportunityDto.customerName != null">
                and bo.customer_name = #{businessOpportunityDto.customerName}
            </if>
            <if test="businessOpportunityDto.entryDateStart != null">
                and bo.entry_date &gt;= STR_TO_DATE(#{businessOpportunityDto.entryDateStart}, '%Y-%m-%d')
            </if>
            <if test="businessOpportunityDto.entryDateEnd != null">
                and bo.entry_date &lt;= STR_TO_DATE(#{businessOpportunityDto.entryDateEnd}, '%Y-%m-%d')
            </if>
        </where>
        order by bo.entry_date desc
    </select>
</mapper>
src/main/resources/mapper/basic/CustomerContactMapper.xml
@@ -17,22 +17,28 @@
        <result column="del_flag" property="delFlag" />
    </resultMap>
    <select id="listPage" resultType="com.ruoyi.basic.dto.CustomerContactDto">
        select * from (
        SELECT
        cc.*,
        c.*,
        (
        SELECT GROUP_CONCAT(ci.customer_name SEPARATOR ',')
        FROM customer ci
        WHERE FIND_IN_SET(ci.id, cc.customer_id)
        WHERE FIND_IN_SET(ci.id, c.customer_id)
        ) AS customer_names
        FROM customer_contact cc
        FROM customer_contact c
        ) as cc
        <where>
            cc.del_flag = 0
            <if test="customerContactDto.contactPerson != null and customerContactDto.contactPerson !=''">
                and cc.contact_person = #{customerContactDto.contactPerson}
                and cc.contact_person like concat('%',#{customerContactDto.contactPerson},'%')
            </if>
            <if test="customerContactDto.contactPhone != null and customerContactDto.contactPhone !=''">
                and cc.contact_phone = #{customerContactDto.contactPhone}
                and cc.contact_phone like concat('%',#{customerContactDto.contactPhone},'%')
            </if>
            <if test="customerContactDto.customerId != null and customerContactDto.customerId !=''">
                and FIND_IN_SET(#{customerContactDto.customerId}, cc.customer_id)
            </if>
        </where>
    </select>
</mapper>