Selaa lähdekoodia

feat(product): 添加产品审核和导航功能

- 新增PoolAuditBo用于审核池商品筛选条件
- 添加产品审核相关字段包括审核编号、商品编号等
- 实现审核池出池商品列表查询功能
- 添加方案商品导出功能
- 实现头部导航获取接口
- 完善产品基础信息中的采购相关信息
- 优化审核状态多选查询功能
- 添加平台导航上级ID字段支持
- 实现不同类型的审核池商品查询逻辑
- 完善商品审核流程中的编号生成机制
肖路 4 päivää sitten
vanhempi
sitoutus
7699e4c1b5
30 muutettua tiedostoa jossa 694 lisäystä ja 70 poistoa
  1. 9 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductPoolAuditController.java
  2. 17 1
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductPptTemplateController.java
  3. 3 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductBaseAudit.java
  4. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductExtend.java
  5. 7 2
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductPoolAudit.java
  6. 47 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/PoolAuditBo.java
  7. 8 4
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBaseAuditBo.java
  8. 27 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBaseBo.java
  9. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPoolAuditBo.java
  10. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPptTemplateBo.java
  11. 2 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseAuditVo.java
  12. 68 40
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseVo.java
  13. 6 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductPoolAuditVo.java
  14. 65 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/SchemeProductExportVo.java
  15. 9 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductPoolAuditService.java
  16. 9 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProuctPptSchemeService.java
  17. 29 1
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseAuditServiceImpl.java
  18. 17 7
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java
  19. 202 3
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductPoolAuditServiceImpl.java
  20. 5 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductPptTemplateServiceImpl.java
  21. 22 10
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProtocolInfoServiceImpl.java
  22. 58 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProuctPptSchemeServiceImpl.java
  23. 14 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/pc/IndexSystemController.java
  24. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/PlatformNavigation.java
  25. 14 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTaxCode.java
  26. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/PlatformNavigationBo.java
  27. 11 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTaxCodeBo.java
  28. 5 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/PlatformNavigationVo.java
  29. 10 0
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTaxCodeVo.java
  30. 5 1
      ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaxCodeServiceImpl.java

+ 9 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductPoolAuditController.java

@@ -8,6 +8,7 @@ import jakarta.servlet.http.HttpServletResponse;
 import jakarta.validation.constraints.*;
 import org.dromara.product.domain.ProductPoolAudit;
 import org.dromara.product.domain.ProductPoolLinkAudit;
+import org.dromara.product.domain.bo.PoolAuditBo;
 import org.dromara.product.domain.bo.ProductBaseBo;
 import org.dromara.product.domain.bo.ProductPoolAuditBatchBo;
 import org.dromara.product.domain.vo.ProductBaseVo;
@@ -129,6 +130,14 @@ public class ProductPoolAuditController extends BaseController {
         return productPoolAuditService.getPoolAuditProductPage(bo, pageQuery);
     }
 
+    /**
+    * 获取审核池出池的商品列表
+    * */
+    @GetMapping("/getPoolAuditProducts")
+    public TableDataInfo<ProductBaseVo> getPoolAuditProducts(PoolAuditBo bo, PageQuery pageQuery) {
+        return productPoolAuditService.getPoolAuditProducts(bo, pageQuery);
+    }
+
     /**
      * 批量审核产品池商品
      */

+ 17 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductPptTemplateController.java

@@ -18,8 +18,11 @@ import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.excel.utils.ExcelUtil;
 import org.dromara.product.domain.vo.ProductPptTemplateVo;
+import org.dromara.product.domain.vo.SchemeProductExportVo;
 import org.dromara.product.domain.bo.ProductPptTemplateBo;
+import org.dromara.product.domain.bo.ProuctPptSchemeBo;
 import org.dromara.product.service.IProductPptTemplateService;
+import org.dromara.product.service.IProuctPptSchemeService;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 
 /**
@@ -36,6 +39,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 public class ProductPptTemplateController extends BaseController {
 
     private final IProductPptTemplateService productPptTemplateService;
+    private final IProuctPptSchemeService prouctPptSchemeService;
 
     /**
      * 查询PPT 模板库(公共底版)列表
@@ -65,7 +69,7 @@ public class ProductPptTemplateController extends BaseController {
     //@SaCheckPermission("product:pptTemplate:query")
     @GetMapping("/{id}")
     public R<ProductPptTemplateVo> getInfo(@NotNull(message = "主键不能为空")
-                                     @PathVariable("id") Long id) {
+                                           @PathVariable("id") Long id) {
         return R.ok(productPptTemplateService.queryById(id));
     }
 
@@ -103,4 +107,16 @@ public class ProductPptTemplateController extends BaseController {
                           @PathVariable("ids") Long[] ids) {
         return toAjax(productPptTemplateService.deleteWithValidByIds(List.of(ids), true));
     }
+
+    /**
+    * 方案商品的导出接口
+    * */
+    @Log(title = "方案商品", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportSchemeProducts")
+    public void exportSchemeProducts(ProuctPptSchemeBo bo, HttpServletResponse response) {
+        List<SchemeProductExportVo> list = prouctPptSchemeService.exportSchemeProducts(bo);
+        ExcelUtil.exportExcel(list, "方案商品", SchemeProductExportVo.class, response);
+    }
+
+
 }

+ 3 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductBaseAudit.java

@@ -29,6 +29,9 @@ public class ProductBaseAudit extends TenantEntity {
     @TableId(value = "id")
     private Long id;
 
+
+    private String productNo;
+
     /**
      * 商品id
      */

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductExtend.java

@@ -59,6 +59,11 @@ public class ProductExtend extends TenantEntity {
      */
     private String productDescription;
 
+    /**
+     * 产品说明
+     * */
+    private String productExplain;
+
     /**
      * 产品重量
      */

+ 7 - 2
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductPoolAudit.java

@@ -28,6 +28,11 @@ public class ProductPoolAudit extends TenantEntity {
     @TableId(value = "id")
     private Long id;
 
+    /**
+     * 审核编号(6位数)
+     */
+    private String poolAuditNo;
+
     /**
      * 池名称
      */
@@ -79,12 +84,12 @@ public class ProductPoolAudit extends TenantEntity {
 
     /**
      * 附件
-     * */
+     */
     private String attachment;
 
     /**
      * 申请类型 0更新,1移出
-     * */
+     */
     private Integer applyType;
 
 

+ 47 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/PoolAuditBo.java

@@ -0,0 +1,47 @@
+package org.dromara.product.domain.bo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author
+ * @date 2026/5/25 上午2:02
+ */
+@Data
+public class PoolAuditBo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 池id
+     */
+    //@NotNull(message = "池id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long poolId;
+
+    /**
+     * 项目id
+     */
+    //@NotNull(message = "项目id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long itemId;
+
+    /**
+     * 产品池类型 0自营产品池,1精选产品池,2协议产品池,3项目产品池,4营销产品池
+     */
+    //@NotBlank(message = "产品池类型 0自营产品池,1精选产品池,2协议产品池,3项目产品池,4营销产品池不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String type;
+
+    /**
+     * 协议id
+     */
+    //@NotNull(message = "协议id不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long protocolId;
+
+    /**
+    * 商品编号
+    * */
+    private String productNo;
+    /**
+    * 商品名称
+    * */
+    private String productName;
+}

+ 8 - 4
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBaseAuditBo.java

@@ -30,6 +30,8 @@ public class ProductBaseAuditBo extends BaseEntity {
      */
     private Long id;
 
+    private String productNo;
+
     /**
      * 商品id
      */
@@ -52,6 +54,12 @@ public class ProductBaseAuditBo extends BaseEntity {
     //@NotNull(message = "审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回,4=营销审核,5运营审核不能为空", groups = { AddGroup.class, EditGroup.class })
     private Long auditStatus;
 
+    /**
+     * 审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回,4=营销审核,5运营审核
+     */
+    //@NotNull(message = "审核状态 0=待提交,1=待审核,2=审核通过,3=审核驳回,4=营销审核,5运营审核不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String auditStatuss;
+
     /**
      * 审核原因
      */
@@ -88,10 +96,6 @@ public class ProductBaseAuditBo extends BaseEntity {
     //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
-    /**
-     * 产品编号
-     */
-    private String productNo;
 
     /**
      * 项目名称

+ 27 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductBaseBo.java

@@ -379,6 +379,31 @@ public class ProductBaseBo extends BaseEntity {
     * */
     private String productDescription;
 
+    /**
+     * 产品说明
+     * */
+    private String productExplain;
+
+    /**
+     * 采购编号
+     */
+    private String purchaseNo;
+
+    /**
+     * 采购名称
+     */
+    private String purchaseName;
+
+    /**
+     * 采购负责人编号
+     */
+    private String purchaseManagerNo;
+
+    /**
+     * 采购负责人姓名
+     */
+    private String purchaseManagerName;
+
     /**
      * 是否可定制
      */
@@ -469,4 +494,6 @@ public class ProductBaseBo extends BaseEntity {
 
 
 
+
+
 }

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPoolAuditBo.java

@@ -31,6 +31,11 @@ public class ProductPoolAuditBo extends BaseEntity {
      */
     private Long id;
 
+    /**
+     * 审核编号(6位数)
+     */
+    private String poolAuditNo;
+
     /**
      * 池名称
      */

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductPptTemplateBo.java

@@ -114,5 +114,10 @@ public class ProductPptTemplateBo extends BaseEntity {
     //@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
     private String remark;
 
+    /**
+    * 查询我创建的模板
+    * */
+    private String myTemplate;
+
 
 }

+ 2 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseAuditVo.java

@@ -36,6 +36,8 @@ public class ProductBaseAuditVo implements Serializable {
     @ExcelProperty(value = "")
     private Long id;
 
+    private String productNo;
+
     /**
      * 商品id
      */

+ 68 - 40
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductBaseVo.java

@@ -91,6 +91,10 @@ public class ProductBaseVo implements Serializable {
     @ExcelProperty(value = "底层分类id")
     private Long bottomCategoryId;
 
+    /*
+     *
+     * */
+
     /**
      * 分类名称(底级分类)
      */
@@ -142,7 +146,7 @@ public class ProductBaseVo implements Serializable {
 
     /**
      * 商品类型 1=默认类型,2精选商品,3=停售商品
-     * */
+     */
     private Integer productCategory;
 
     /**
@@ -152,8 +156,8 @@ public class ProductBaseVo implements Serializable {
     private Integer productReviewStatus;
 
     /**
-    * 审核意见
-    * */
+     * 审核意见
+     */
     @ExcelProperty(value = "审核意见")
     private String reviewComments;
 
@@ -206,8 +210,8 @@ public class ProductBaseVo implements Serializable {
     private String dataSource;
 
     /**
-    * 市场价
-    * */
+     * 市场价
+     */
     @ExcelProperty(value = "市场价")
     private BigDecimal marketPrice;
 
@@ -246,8 +250,8 @@ public class ProductBaseVo implements Serializable {
 
 
     /**
-    * 暂估毛利率
-    * */
+     * 暂估毛利率
+     */
     @ExcelProperty(value = "暂估毛利率")
     private BigDecimal tempGrossMargin;
 
@@ -386,8 +390,8 @@ public class ProductBaseVo implements Serializable {
     private String purchasingPersonnel;
 
     /**
-    * 商品多图
-    * */
+     * 商品多图
+     */
     @ExcelProperty(value = "商品多图")
     private String imageUrl;
 
@@ -423,29 +427,52 @@ public class ProductBaseVo implements Serializable {
 
     /**
      * 是否可定制 0:不可定制 1:可定制
-     * */
+     */
     private String isCustomize;
 
     /**
      * 总库存
-     * */
+     */
     private Long totalInventory;
     /**
      * 当前可用库存
-     * */
+     */
     private Long nowInventory;
 
     /**
      * 虚拟库存
-     * */
+     */
     private Long virtualInventory;
 
     /**
      * 产品描述
-     * */
+     */
     private String productDescription;
 
+    /**
+    * 产品说明
+    * */
+    private String productExplain;
+
+    /**
+     * 采购编号
+     */
+    private String purchaseNo;
+
+    /**
+     * 采购名称
+     */
+    private String purchaseName;
 
+    /**
+     * 采购负责人编号
+     */
+    private String purchaseManagerNo;
+
+    /**
+     * 采购负责人姓名
+     */
+    private String purchaseManagerName;
     /**
      * 定制说明
      */
@@ -468,7 +495,7 @@ public class ProductBaseVo implements Serializable {
 
     /**
      * diy商品属性
-     * */
+     */
     private List<ProductClassificationDiy> diyAttributesList;
 
     /**
@@ -492,40 +519,40 @@ public class ProductBaseVo implements Serializable {
     private Long pushStatus;
 
     /**
-    * 上架审核评论
-    * */
+     * 上架审核评论
+     */
     private String shelfComments;
 
     /**
-    * 协议价
-    * */
+     * 协议价
+     */
     private BigDecimal agreementPrice;
     /**
-    * 创建时间
-    * */
+     * 创建时间
+     */
     private Date createTime;
     /**
-    * 更新时间
-    * */
+     * 更新时间
+     */
     private Date updateTime;
     /**
-    * 供货时间
-    * */
+     * 供货时间
+     */
     private String deliveryTime;
 
     /**
-    * 审核状态 产品审核状态:0=待提交,1=待审核,2=审核通过,3=审核驳回
-    * */
+     * 审核状态 产品审核状态:0=待提交,1=待审核,2=审核通过,3=审核驳回
+     */
     private Integer auditStatus;
 
     /**
-    * 审核意见
-    * */
+     * 审核意见
+     */
     private String auditReason;
 
     /**
-    * 第三方价格
-    * */
+     * 第三方价格
+     */
     private BigDecimal externalPrice;
 
     /**
@@ -534,14 +561,13 @@ public class ProductBaseVo implements Serializable {
     private Integer connectStatus;
 
     /**
-    * 税收编码id
-     *
-    * */
+     * 税收编码id
+     */
     private Long taxationId;
 
     /**
-    * 税收编码code
-    * */
+     * 税收编码code
+     */
     private String taxCode;
 
     /**
@@ -550,12 +576,14 @@ public class ProductBaseVo implements Serializable {
     private String promotionTitle;
 
     /**
-    * 产品池审核商品id
-    * */
+     * 产品池审核商品id
+     */
     private Long poolAuditProductId;
 
     /**
-    * 供应商id
-    * */
+     * 供应商id
+     */
     private String supplierNo;
+
+
 }

+ 6 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductPoolAuditVo.java

@@ -35,6 +35,12 @@ public class ProductPoolAuditVo implements Serializable {
     @ExcelProperty(value = "主键ID")
     private Long id;
 
+    /**
+     * 审核编号(6位数)
+     */
+    @ExcelProperty(value = "审核编号")
+    private String poolAuditNo;
+
     /**
      * 池名称
      */

+ 65 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/SchemeProductExportVo.java

@@ -0,0 +1,65 @@
+package org.dromara.product.domain.vo;
+
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 方案商品导出对象
+ *
+ * @author LionLi
+ * @date 2026-05-25
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class SchemeProductExportVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 商品编号
+     */
+    @ExcelProperty(value = "商品编号", index = 0)
+    private String productNo;
+
+    /**
+     * 商品名称
+     */
+    @ExcelProperty(value = "商品名称", index = 1)
+    private String itemName;
+
+    /**
+     * 规格型号
+     */
+    @ExcelProperty(value = "规格型号", index = 2)
+    private String specificationsCode;
+
+    /**
+     * 单位
+     */
+    @ExcelProperty(value = "单位", index = 3)
+    private String unitName;
+
+    /**
+     * 市场价
+     */
+    @ExcelProperty(value = "市场价", index = 4)
+    private BigDecimal marketPrice;
+
+    /**
+     * 官网价
+     */
+    @ExcelProperty(value = "官网价", index = 5)
+    private BigDecimal memberPrice;
+
+    /**
+     * 起订量
+     */
+    @ExcelProperty(value = "起订量", index = 6)
+    private Long minOrderQuantity;
+}

+ 9 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductPoolAuditService.java

@@ -2,6 +2,7 @@ package org.dromara.product.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.dromara.product.domain.ProductPoolAudit;
+import org.dromara.product.domain.bo.PoolAuditBo;
 import org.dromara.product.domain.bo.ProductBaseBo;
 import org.dromara.product.domain.bo.ProductPoolAuditBatchBo;
 import org.dromara.product.domain.vo.ProductBaseVo;
@@ -114,4 +115,12 @@ public interface IProductPoolAuditService extends IService<ProductPoolAudit>{
      * @return 是否审核成功
      */
     void auditProduct(ProductPoolAuditBatchBo bo);
+
+    /**
+     * 获取审核池出池的商品列表
+     *
+     * @param bo 筛选条件
+     * @return 审核池商品列表
+     */
+    TableDataInfo<ProductBaseVo> getPoolAuditProducts(PoolAuditBo bo, PageQuery pageQuery);
 }

+ 9 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProuctPptSchemeService.java

@@ -3,6 +3,7 @@ package org.dromara.product.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import org.dromara.product.domain.ProuctPptScheme;
 import org.dromara.product.domain.vo.ProuctPptSchemeVo;
+import org.dromara.product.domain.vo.SchemeProductExportVo;
 import org.dromara.product.domain.bo.ProuctPptSchemeBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -72,4 +73,12 @@ public interface IProuctPptSchemeService extends IService<ProuctPptScheme>{
     * 分享方案
     * */
     void share(ProuctPptSchemeBo bo);
+
+    /**
+     * 导出方案商品列表
+     *
+     * @param bo 查询条件
+     * @return 方案商品导出列表
+     */
+    List<SchemeProductExportVo> exportSchemeProducts(ProuctPptSchemeBo bo);
 }

+ 29 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseAuditServiceImpl.java

@@ -17,6 +17,7 @@ import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.product.domain.ProductBase;
 import org.dromara.product.domain.ProductBaseAudit;
 import org.dromara.product.domain.bo.ProductAuditBo;
 import org.dromara.product.domain.bo.ProductBaseAuditBo;
@@ -130,6 +131,9 @@ public class ProductBaseAuditServiceImpl extends ServiceImpl<ProductBaseAuditMap
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<ProductBaseAudit> lqw = Wrappers.lambdaQuery();
         lqw.eq(bo.getProductId() != null, ProductBaseAudit::getProductId, bo.getProductId());
+        if(ObjectUtil.isNotEmpty(bo.getAuditStatuss())){
+            lqw.in(ProductBaseAudit::getAuditStatus, bo.getAuditStatuss().split( ","));
+        }
         lqw.eq(bo.getAuditStatus() != null, ProductBaseAudit::getAuditStatus, bo.getAuditStatus());
         lqw.eq(StringUtils.isNotBlank(bo.getAuditReason()), ProductBaseAudit::getAuditReason, bo.getAuditReason());
         lqw.eq(bo.getAuditUserId() != null, ProductBaseAudit::getAuditUserId, bo.getAuditUserId());
@@ -173,7 +177,7 @@ public class ProductBaseAuditServiceImpl extends ServiceImpl<ProductBaseAuditMap
             lqw.eq(bo.getQueryType()==2,ProductBaseAudit::getCreateByType,2);
             lqw.eq(bo.getQueryType()==2,ProductBaseAudit::getCreateById,LoginHelper.getLoginUser().getPartnerId());
         }else{
-            if(bo.getAuditStatus()==0){
+            if(ObjectUtil.isNotEmpty(bo.getAuditStatus()) && bo.getAuditStatus()==0){
                 lqw.eq(ProductBaseAudit::getCreateByType,0);
                 lqw.eq(ProductBaseAudit::getCreateById,LoginHelper.getUserId());
             }
@@ -213,6 +217,30 @@ public class ProductBaseAuditServiceImpl extends ServiceImpl<ProductBaseAuditMap
             add.setCreateByType(0);
         }
         validEntityBeforeSave(add);
+        ProductBaseVo productBaseVo = JSONObject.parseObject(add.getProductData(), ProductBaseVo.class);
+        if(ObjectUtil.isEmpty(productBaseVo.getProductNo())) {
+            //获取商品编号最大值,需要查询ProductBase和ProductBaseAudit的productNo字段,取最大值+1
+            ProductBase base = productBaseService.getOne(Wrappers.lambdaQuery(ProductBase.class).orderByDesc(ProductBase::getProductNo).last("limit 1"));
+            ProductBaseAudit baseAudit = this.getOne(Wrappers.lambdaQuery(ProductBaseAudit.class).orderByDesc(ProductBaseAudit::getProductNo).last("limit 1"));
+            //比较商品编号大小
+            String productNo = "";
+            if(ObjectUtil.isNotEmpty(base) && ObjectUtil.isNotEmpty(baseAudit)){
+                if(base.getProductNo().compareTo(baseAudit.getProductNo())>0){
+                    productNo = base.getProductNo();
+                }else{
+                    productNo = baseAudit.getProductNo();
+                }
+            }else if(ObjectUtil.isNotEmpty(base)){
+                productNo = base.getProductNo();
+            }else if(ObjectUtil.isNotEmpty(baseAudit)){
+                productNo = baseAudit.getProductNo();
+            }
+            productBaseVo.setProductNo(productNo);
+            add.setProductNo(NumberGeneratorUtil.generateNumber(productNo));
+            add.setProductData(JSONObject.toJSONString(productBaseVo));
+        }else {
+            productBaseVo.setProductNo(add.getProductNo());
+        }
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setId(add.getId());

+ 17 - 7
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductBaseServiceImpl.java

@@ -265,10 +265,12 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
             vo.setSpecificationsCode(extend.getSpecificationsCode());
             vo.setDeliveryTime(extend.getDeliveryTime());
             vo.setShelfComments(extend.getShelfComments());
-            vo.setProductNature(extend.getPurchaseManagerNo());
-            vo.setPurchasingPersonnel(extend.getPurchaseNo());
             vo.setSupplierNo(extend.getSupplierNo());
             vo.setProductDescription(extend.getProductDescription());
+            vo.setPurchaseName(extend.getPurchaseName());
+            vo.setPurchaseNo(extend.getPurchaseNo());
+            vo.setPurchaseManagerName(extend.getPurchaseManagerName());
+            vo.setPurchaseManagerNo(extend.getPurchaseManagerNo());
         }
 
         // 3. 查询并填充价格库存信息(product_price_inventory表)
@@ -610,9 +612,9 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
             ProductBase productBase = MapstructUtils.convert(bo, ProductBase.class);
             validEntityBeforeSave(productBase);
             //查询最大productNo生成productNo
-            ProductBase one = baseMapper.selectOne(Wrappers.lambdaQuery(ProductBase.class).orderByDesc(ProductBase::getProductNo).last("limit 1"));
-            String string = NumberGeneratorUtil.generateNumber(one.getProductNo());
-            productBase.setProductNo(string);
+//            ProductBase one = baseMapper.selectOne(Wrappers.lambdaQuery(ProductBase.class).orderByDesc(ProductBase::getProductNo).last("limit 1"));
+//            String string = NumberGeneratorUtil.generateNumber(one.getProductNo());
+//            productBase.setProductNo(string);
 
             // 设置默认值
             setDefaultValues(productBase);
@@ -793,9 +795,12 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
         extend.setIsInstallService(bo.getFreeInstallation());
         extend.setSalesVolume(bo.getSalesVolume());
         extend.setShelfComments(bo.getShelfComments());
-        extend.setPurchaseManagerNo(bo.getProductNature());
-        extend.setPurchaseNo(bo.getPurchasingPersonnel());
         extend.setProductDescription(bo.getProductDescription());
+        extend.setProductExplain(bo.getProductExplain());
+        extend.setPurchaseName(bo.getPurchaseName());
+        extend.setPurchaseNo(bo.getPurchaseNo());
+        extend.setPurchaseManagerName(bo.getPurchaseManagerName());
+        extend.setPurchaseManagerNo(bo.getPurchaseManagerNo());
         extendMapper.insert(extend);
     }
 
@@ -880,6 +885,11 @@ public class ProductBaseServiceImpl extends ServiceImpl<ProductBaseMapper, Produ
             if (bo.getPurchasingPersonnel() != null) existing.setPurchaseNo(bo.getPurchasingPersonnel());
             if (bo.getSupplierNo() != null) existing.setSupplierNo(bo.getSupplierNo());
             if (bo.getProductDescription() != null) existing.setProductDescription(bo.getProductDescription());
+            if (bo.getProductExplain() != null) existing.setProductProfit(bo.getProductExplain());
+            if (bo.getPurchaseName() != null)existing.setPurchaseName(bo.getPurchaseName());
+            if (bo.getPurchaseNo() != null)existing.setPurchaseNo(bo.getPurchaseNo());
+            if (bo.getPurchaseManagerName() != null)existing.setPurchaseManagerName(bo.getPurchaseManagerName());
+            if (bo.getPurchaseManagerNo() != null)existing.setPurchaseManagerNo(bo.getPurchaseManagerNo());
             extendMapper.updateById(existing);
         } else {
             // 不存在则新增

+ 202 - 3
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductPoolAuditServiceImpl.java

@@ -27,6 +27,7 @@ import org.dromara.external.api.domain.ExternalProductDto;
 import org.dromara.external.api.service.RemoteExternalItemService;
 import org.dromara.external.api.service.RemoteExternalProductService;
 import org.dromara.product.domain.*;
+import org.dromara.product.domain.bo.PoolAuditBo;
 import org.dromara.product.domain.bo.ProductBaseBo;
 import org.dromara.product.domain.bo.ProductPoolAuditBatchBo;
 import org.dromara.product.domain.vo.ProductBaseVo;
@@ -75,6 +76,8 @@ public class ProductPoolAuditServiceImpl  extends ServiceImpl<ProductPoolAuditMa
     private final ProductEsMapper productEsMapper;
     //商品
     private final ProductBaseMapper productBaseMapper;
+    //采购项目产品关联
+    private final ProcurementProgramProductMapper procurementProgramProductMapper;
 
     @DubboReference
     private RemoteCustomerService remoteCustomerService;
@@ -147,6 +150,43 @@ public class ProductPoolAuditServiceImpl  extends ServiceImpl<ProductPoolAuditMa
                     item.setAuditByName(AuditByName);
                 }
             }
+            String name = null;
+            if(Objects.equals(item.getType(),"0")){
+                name = "自营产品池";
+            }else if(Objects.equals(item.getType(),"1")){
+                name = "标准产品池";
+            }else if(Objects.equals(item.getType(),"2")){
+                //先获取协议信息
+                ProtocolInfo  protocolInfo= protocolInfoMapper.selectById(item.getProtocolId());
+                if (ObjectUtil.isNotEmpty(protocolInfo)){
+                    //获取客户信息
+                    CustomerInfoDTO customerInfoDTO = remoteCustomerService.selectCustomerInfoById(protocolInfo.getCustomerId());
+                    if(customerInfoDTO != null){
+                        name = customerInfoDTO.getCustomerName();
+                    }else{
+                        name = "未知协议产品池";
+                    }
+                }else{
+                    name = "未知协议产品池";
+                }
+            }else if(Objects.equals(item.getType(),"3")){
+                //获取项目信息
+                ExternalItemDto itemInfo = remoteExternalItemService.getItemInfo(item.getItemId());
+                if(itemInfo != null){
+                    name = itemInfo.getItemName();
+                }else{
+                    name = "未知项目产品池";
+                }
+            }else if(Objects.equals(item.getType(),"4")){
+                //获取营销信息
+                ProductPool productPool = productPoolMapper.selectById(item.getPoolId());
+                if(productPool != null){
+                    name = productPool.getName();
+                }else{
+                    name = "未知营销产品池";
+                }
+            }
+            item.setPoolName(name);
         });
         return TableDataInfo.build(result);
     }
@@ -173,9 +213,30 @@ public class ProductPoolAuditServiceImpl  extends ServiceImpl<ProductPoolAuditMa
         lqw.eq(StringUtils.isNotBlank(bo.getType()), ProductPoolAudit::getType, bo.getType());
         lqw.eq(bo.getProtocolId() != null, ProductPoolAudit::getProtocolId, bo.getProtocolId());
         lqw.eq(bo.getCustomerId() != null, ProductPoolAudit::getCustomerId, bo.getCustomerId());
-        lqw.eq(StringUtils.isNotBlank(bo.getProductReviewStatus()), ProductPoolAudit::getProductReviewStatus, bo.getProductReviewStatus());
+        if(ObjectUtil.isNotEmpty(bo.getProductReviewStatus())){
+            lqw.in( ProductPoolAudit::getProductReviewStatus, bo.getProductReviewStatus().split(","));
+        }
+
         lqw.eq(StringUtils.isNotBlank(bo.getReviewReason()), ProductPoolAudit::getReviewReason, bo.getReviewReason());
         lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ProductPoolAudit::getPlatformCode, bo.getPlatformCode());
+        // 申请时间筛选
+        Object beginCreateTime = params.get("beginCreateTime");
+        Object endCreateTime = params.get("endCreateTime");
+        if (beginCreateTime != null) {
+            lqw.ge(ProductPoolAudit::getCreateTime, beginCreateTime);
+        }
+        if (endCreateTime != null) {
+            lqw.le(ProductPoolAudit::getCreateTime, endCreateTime);
+        }
+        // 审核时间筛选
+        Object beginAuditTime = params.get("beginAuditTime");
+        Object endAuditTime = params.get("endAuditTime");
+        if (beginAuditTime != null) {
+            lqw.ge(ProductPoolAudit::getAuditTime, beginAuditTime);
+        }
+        if (endAuditTime != null) {
+            lqw.le(ProductPoolAudit::getAuditTime, endAuditTime);
+        }
         return lqw;
     }
 
@@ -189,10 +250,16 @@ public class ProductPoolAuditServiceImpl  extends ServiceImpl<ProductPoolAuditMa
     @Transactional(rollbackFor = Exception.class)
     public Boolean insertByBo(ProductPoolAuditBo bo) {
         ProductPoolAudit add = MapstructUtils.convert(bo, ProductPoolAudit.class);
+        
+        // 生成6位数的审核编号
+        String poolAuditNo = generatePoolAuditNo();
+        add.setPoolAuditNo(poolAuditNo);
+        
         validEntityBeforeSave(add);
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setId(add.getId());
+            bo.setPoolAuditNo(poolAuditNo);
             // 保存产品池和产品关联审核数据
             if (ObjectUtil.isNotEmpty(bo.getProducts())) {
                 savePoolLinkAudits(bo);
@@ -234,6 +301,36 @@ public class ProductPoolAuditServiceImpl  extends ServiceImpl<ProductPoolAuditMa
         //TODO 做一些数据校验,如唯一约束
     }
 
+    /**
+     * 生成6位数的产品池审核编号
+     *
+     * @return 6位数审核编号
+     */
+    private String generatePoolAuditNo() {
+        // 查询当前最大的审核编号
+        ProductPoolAudit maxAudit = baseMapper.selectOne(
+            Wrappers.lambdaQuery(ProductPoolAudit.class)
+                .orderByDesc(ProductPoolAudit::getPoolAuditNo)
+                .last("limit 1")
+        );
+        
+        String nextNo;
+        if (maxAudit != null && StringUtils.isNotBlank(maxAudit.getPoolAuditNo())) {
+            // 如果存在最大编号,则 +1
+            nextNo = org.dromara.common.core.utils.NumberGeneratorUtil.generateNumber(maxAudit.getPoolAuditNo());
+        } else {
+            // 如果不存在,从 000001 开始
+            nextNo = "000001";
+        }
+        
+        // 确保是6位数,不足补零
+        if (nextNo.length() < 6) {
+            nextNo = String.format("%06d", Long.parseLong(nextNo));
+        }
+        
+        return nextNo;
+    }
+
     /**
      * 保存产品池和产品关联审核数据
      *
@@ -281,7 +378,7 @@ public class ProductPoolAuditServiceImpl  extends ServiceImpl<ProductPoolAuditMa
     public TableDataInfo<ProductBaseVo> getPoolAuditProductPage(ProductBaseBo bo, PageQuery pageQuery) {
         List<ProductPoolLinkAuditVo> productPoolLinkAuditVos = productPoolLinkAuditMapper.selectVoList(Wrappers.lambdaQuery(ProductPoolLinkAudit.class)
             .eq(ProductPoolLinkAudit::getPoolAuditId, bo.getPoolAuditId())
-            .eq(ObjectUtil.isNotEmpty(bo.getAuditStatus()),ProductPoolLinkAudit::getProductReviewStatus, bo.getAuditStatus())
+            .eq(ObjectUtil.isNotEmpty(bo.getProductReviewStatus()),ProductPoolLinkAudit::getProductReviewStatus, bo.getProductReviewStatus())
         );
         if (CollUtil.isEmpty(productPoolLinkAuditVos)) {
             return TableDataInfo.build();
@@ -298,7 +395,6 @@ public class ProductPoolAuditServiceImpl  extends ServiceImpl<ProductPoolAuditMa
             .eq(ObjectUtil.isNotEmpty(bo.getUnitId()), ProductBaseVo::getUnitId, bo.getUnitId())
             .eq(ObjectUtil.isNotEmpty(bo.getProductStatus()), ProductBaseVo::getProductStatus, bo.getProductStatus())
             .eq(ObjectUtil.isNotEmpty(bo.getIsSelf()), ProductBaseVo::getIsSelf, bo.getIsSelf())
-            .eq(ObjectUtil.isNotEmpty(bo.getProductReviewStatus()), ProductBaseVo::getProductReviewStatus, bo.getProductReviewStatus())
             .eq(ObjectUtil.isNotEmpty(bo.getDataSource()), ProductBaseVo::getDataSource, bo.getDataSource())
             .eq(ObjectUtil.isNotEmpty(bo.getProductCategory()), ProductBaseVo::getProductCategory, bo.getProductCategory())
             .orderByDesc(ProductBaseVo::getCreateTime)
@@ -723,5 +819,108 @@ public class ProductPoolAuditServiceImpl  extends ServiceImpl<ProductPoolAuditMa
         // 改变审核商品表状态
         changeProductStatus(linkAudits, bo.getAuditStatus(), bo.getReason(), currentUserId);
     }
+
+    /**
+     * 获取审核池出池的商品列表
+     *
+     * @param bo        筛选条件
+     * @param pageQuery
+     * @return 审核池商品列表
+     */
+    @Override
+    public TableDataInfo<ProductBaseVo> getPoolAuditProducts(PoolAuditBo bo, PageQuery pageQuery) {
+        // 构建查询条件
+        LambdaEsQueryWrapper<ProductBaseVo> esQueryWrapper = new LambdaEsQueryWrapper<>();
+
+        // 添加基本筛选条件:编号和名称
+        if (StringUtils.isNotBlank(bo.getProductNo())) {
+            esQueryWrapper.eq(ProductBaseVo::getProductNo, bo.getProductNo());
+        }
+        if (StringUtils.isNotBlank(bo.getProductName())) {
+            esQueryWrapper.like(ProductBaseVo::getItemName, bo.getProductName());
+        }
+
+        // 根据不同的池类型和申请类型获取不同的商品列表
+        String type = bo.getType();
+        Long poolId = bo.getPoolId();
+        Long itemId = bo.getItemId();
+        Long protocolId = bo.getProtocolId();
+
+        // 根据不同的池类型进行过滤,只查询池中已存在的商品
+        if ("0".equals(type)) {
+            // 自营产品池:只查询自营商品
+            esQueryWrapper.eq(ProductBaseVo::getIsSelf, 1);
+        } else if ("1".equals(type)) {
+            // 精选产品池:只查询精选商品
+            esQueryWrapper.eq(ProductBaseVo::getProductCategory, 2);
+        } else if ("2".equals(type)) {
+            // 协议产品池:查询协议中已存在的商品
+            if (ObjectUtil.isNotEmpty(protocolId)) {
+                List<ProtocolProducts> existingProducts = protocolProductsMapper.selectList(
+                    Wrappers.lambdaQuery(ProtocolProducts.class)
+                        .eq(ProtocolProducts::getProtocolId, protocolId)
+                );
+                if (CollUtil.isNotEmpty(existingProducts)) {
+                    List<Long> existingProductIds = existingProducts.stream()
+                        .map(ProtocolProducts::getProductId)
+                        .collect(Collectors.toList());
+                    esQueryWrapper.in(ProductBaseVo::getId, existingProductIds);
+                } else {
+                    // 如果协议中没有商品,返回空结果
+                    esQueryWrapper.eq(ProductBaseVo::getId, -1L);
+                }
+            } else {
+                // 如果没有指定协议ID,返回空结果
+                esQueryWrapper.eq(ProductBaseVo::getId, -1L);
+            }
+        } else if ("3".equals(type)) {
+            // 项目产品池:查询项目中已存在的商品
+            if (ObjectUtil.isNotEmpty(itemId)) {
+                // 查询项目中已存在的商品ID
+                List<ExternalProductDto> externalProductList = remoteExternalProductService.getExternalProductList(itemId);
+                if (CollUtil.isNotEmpty(externalProductList)) {
+                    List<Long> existingProductIds = externalProductList.stream()
+                        .map(ExternalProductDto::getProductId)
+                        .collect(Collectors.toList());
+                    esQueryWrapper.in(ProductBaseVo::getId, existingProductIds);
+                } else {
+                    // 如果项目中没有商品,返回空结果
+                    esQueryWrapper.eq(ProductBaseVo::getId, -1L);
+                }
+            } else {
+                // 如果没有指定项目ID,返回空结果
+                esQueryWrapper.eq(ProductBaseVo::getId, -1L);
+            }
+        } else if ("4".equals(type)) {
+            // 营销产品池:查询池中已存在的商品
+            if (ObjectUtil.isNotEmpty(poolId)) {
+                List<ProductPoolLink> existingLinks = productPoolLinkMapper.selectList(
+                    Wrappers.lambdaQuery(ProductPoolLink.class)
+                        .eq(ProductPoolLink::getPoolId, poolId)
+                );
+                if (CollUtil.isNotEmpty(existingLinks)) {
+                    List<Long> existingProductIds = existingLinks.stream()
+                        .map(ProductPoolLink::getProductId)
+                        .collect(Collectors.toList());
+                    esQueryWrapper.in(ProductBaseVo::getId, existingProductIds);
+                } else {
+                    // 如果池中没有商品,返回空结果
+                    esQueryWrapper.eq(ProductBaseVo::getId, -1L);
+                }
+            } else {
+                // 如果没有指定池ID,返回空结果
+                esQueryWrapper.eq(ProductBaseVo::getId, -1L);
+            }
+        }
+
+        // 按创建时间倒序排列
+        esQueryWrapper.orderByDesc(ProductBaseVo::getCreateTime);
+
+        // 执行分页查询
+        EsPageInfo<ProductBaseVo> esPageInfo = productEsMapper.pageQuery(esQueryWrapper, pageQuery.getPageNum(), pageQuery.getPageSize());
+        TableDataInfo<ProductBaseVo> tableDataInfo = TableDataInfo.build(esPageInfo.getList());
+        tableDataInfo.setTotal(esPageInfo.getTotal());
+        return tableDataInfo;
+    }
 }
 

+ 5 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductPptTemplateServiceImpl.java

@@ -1,5 +1,6 @@
 package org.dromara.product.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.StringUtils;
@@ -10,6 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.dromara.common.satoken.utils.LoginHelper;
 import org.springframework.stereotype.Service;
 import org.dromara.product.domain.bo.ProductPptTemplateBo;
 import org.dromara.product.domain.vo.ProductPptTemplateVo;
@@ -90,6 +92,9 @@ public class ProductPptTemplateServiceImpl  extends ServiceImpl<ProductPptTempla
         lqw.eq(StringUtils.isNotBlank(bo.getContentTitle()), ProductPptTemplate::getContentTitle, bo.getContentTitle());
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ProductPptTemplate::getStatus, bo.getStatus());
         lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ProductPptTemplate::getPlatformCode, bo.getPlatformCode());
+        if(ObjectUtil.isNotEmpty(bo.getMyTemplate())){
+            lqw.eq(ProductPptTemplate::getCreateBy, LoginHelper.getUserId());
+        }
         return lqw;
     }
 

+ 22 - 10
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProtocolInfoServiceImpl.java

@@ -57,16 +57,21 @@ public class ProtocolInfoServiceImpl  extends ServiceImpl<ProtocolInfoMapper, Pr
     public ProtocolInfoVo queryById(Long id){
         ProtocolInfoVo item = baseMapper.selectVoById(id);
         if(ObjectUtil.isNotEmpty(item.getSalesmanId()) && ObjectUtil.isNotEmpty(item.getServiceId())){
-            Map<Long, String> staffMap = remoteComStaffService.selectStaffNameByIds(Set.of(item.getSalesmanId(), item.getServiceId()));
+            Set<Long> staffIds = new HashSet<>();
+            staffIds.add(item.getSalesmanId());
+            staffIds.add(item.getServiceId());
+            Map<Long, String> staffMap = remoteComStaffService.selectStaffNameByIds(staffIds);
             item.setSalesmanName(staffMap.get(item.getSalesmanId()));
             item.setServiceName(staffMap.get(item.getServiceId()));
         }
         //获取客户信息
         if (ObjectUtil.isNotEmpty(item.getCustomerId())){
             CustomerInfoDTO customerInfoDTO = remoteCustomerService.selectCustomerInfoById(item.getCustomerId());
+            if(ObjectUtil.isNotEmpty(customerInfoDTO)){
+                item.setCustomerName(customerInfoDTO.getCustomerName());
+                item.setCustomerNo(customerInfoDTO.getCustomerNo());
+            }
 
-            item.setCustomerName(customerInfoDTO.getCustomerName());
-            item.setCustomerNo(customerInfoDTO.getCustomerNo());
         }
         return item;
     }
@@ -83,16 +88,23 @@ public class ProtocolInfoServiceImpl  extends ServiceImpl<ProtocolInfoMapper, Pr
         LambdaQueryWrapper<ProtocolInfo> lqw = buildQueryWrapper(bo);
         Page<ProtocolInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
         result.getRecords().forEach(item -> {
-            java.util.Set<Long> staffIds = new java.util.HashSet<>();
-            if (item.getSalesmanId() != null) {
+            if(ObjectUtil.isNotEmpty(item.getSalesmanId()) && ObjectUtil.isNotEmpty(item.getServiceId())){
+                Set<Long> staffIds = new HashSet<>();
                 staffIds.add(item.getSalesmanId());
-            }
-            if (item.getServiceId() != null) {
                 staffIds.add(item.getServiceId());
+                Map<Long, String> staffMap = remoteComStaffService.selectStaffNameByIds(staffIds);
+                item.setSalesmanName(staffMap.get(item.getSalesmanId()));
+                item.setServiceName(staffMap.get(item.getServiceId()));
+            }
+            //获取客户信息
+            if (ObjectUtil.isNotEmpty(item.getCustomerId())){
+                CustomerInfoDTO customerInfoDTO = remoteCustomerService.selectCustomerInfoById(item.getCustomerId());
+                if(ObjectUtil.isNotEmpty(customerInfoDTO)){
+                    item.setCustomerName(customerInfoDTO.getCustomerName());
+                    item.setCustomerNo(customerInfoDTO.getCustomerNo());
+                }
+
             }
-            Map<Long, String> staffMap = remoteComStaffService.selectStaffNameByIds(staffIds);
-            item.setSalesmanName(staffMap.get(item.getSalesmanId()));
-            item.setServiceName(staffMap.get(item.getServiceId()));
             item.setProductNum(protocolProductsMapper.selectCount(Wrappers.lambdaQuery(ProtocolProducts.class)
                 .eq(ProtocolProducts::getProtocolId, item.getId()))
             );

+ 58 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProuctPptSchemeServiceImpl.java

@@ -17,8 +17,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.easyes.core.conditions.select.LambdaEsQueryWrapper;
 import org.dromara.product.domain.ProductBase;
 import org.dromara.product.domain.vo.ProductBaseVo;
+import org.dromara.product.esmapper.ProductEsMapper;
 import org.dromara.product.mapper.ProductBaseMapper;
 import org.dromara.product.service.IProductBaseService;
 import org.dromara.system.api.RemoteUserService;
@@ -26,6 +28,7 @@ import org.dromara.system.api.domain.vo.RemoteUserVo;
 import org.springframework.stereotype.Service;
 import org.dromara.product.domain.bo.ProuctPptSchemeBo;
 import org.dromara.product.domain.vo.ProuctPptSchemeVo;
+import org.dromara.product.domain.vo.SchemeProductExportVo;
 import org.dromara.product.domain.ProuctPptScheme;
 import org.dromara.product.mapper.ProuctPptSchemeMapper;
 import org.dromara.product.service.IProuctPptSchemeService;
@@ -50,6 +53,8 @@ public class ProuctPptSchemeServiceImpl  extends ServiceImpl<ProuctPptSchemeMapp
     private final ProuctPptSchemeMapper baseMapper;
 
     private final IProductBaseService productBaseService;
+
+    private final ProductEsMapper productEsMapper;
     @DubboReference
     private RemoteUserService remoteUserService;
 
@@ -217,4 +222,57 @@ public class ProuctPptSchemeServiceImpl  extends ServiceImpl<ProuctPptSchemeMapp
         }).collect(Collectors.toList());
         baseMapper.insertBatch(prouctPptSchemes);
     }
+
+    /**
+     * 导出方案商品列表
+     *
+     * @param bo 查询条件
+     * @return 方案商品导出列表
+     */
+    @Override
+    public List<SchemeProductExportVo> exportSchemeProducts(ProuctPptSchemeBo bo) {
+        // 查询方案列表
+        List<ProuctPptSchemeVo> schemeList = queryList(bo);
+
+        // 收集所有方案中的商品ID
+        List<Long> allProductIds = schemeList.stream()
+            .filter(scheme -> StringUtils.isNotBlank(scheme.getProductData()))
+            .flatMap(scheme -> {
+                try {
+                    List<ProductBaseVo> products = JSONUtil.toList(
+                        JSONUtil.parseArray(scheme.getProductData()),
+                        ProductBaseVo.class
+                    );
+                    return products.stream().map(ProductBaseVo::getId);
+                } catch (Exception e) {
+                    log.error("解析方案商品数据失败,方案ID: {}", scheme.getId(), e);
+                    return java.util.stream.Stream.empty();
+                }
+            })
+            .distinct()
+            .collect(Collectors.toList());
+
+        if (ObjectUtil.isEmpty(allProductIds)) {
+            return List.of();
+        }
+
+        // 批量查询商品信息
+        List<ProductBaseVo> productBaseVos = productEsMapper.selectList(new LambdaEsQueryWrapper<ProductBaseVo>().in(ProductBaseVo::getId, allProductIds));
+
+
+        // 转换为导出对象
+        return productBaseVos.stream()
+            .map(product -> {
+                SchemeProductExportVo exportVo = new SchemeProductExportVo();
+                exportVo.setProductNo(product.getProductNo());
+                exportVo.setItemName(product.getItemName());
+                exportVo.setSpecificationsCode(product.getSpecificationsCode());
+                exportVo.setUnitName(product.getUnitName());
+                exportVo.setMarketPrice(product.getMarketPrice());
+                exportVo.setMemberPrice(product.getMemberPrice());
+                exportVo.setMinOrderQuantity(product.getMinOrderQuantity());
+                return exportVo;
+            })
+            .collect(Collectors.toList());
+    }
 }

+ 14 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/pc/IndexSystemController.java

@@ -107,6 +107,20 @@ public class IndexSystemController {
         return R.ok(list);
     }
 
+    /**
+    * 头部导航
+    * */
+    @GetMapping("/getHeaderNav")
+    public R<List<PlatformNavigation>> getHeaderNav(@RequestParam(value = "title", required = false) String title) {
+        List<PlatformNavigation> list = platformNavigationService.list(Wrappers.<PlatformNavigation>lambdaQuery(PlatformNavigation.class)
+            .eq(PlatformNavigation::getNavType, "setting_float")
+            .eq(StringUtils.isNotBlank(title), PlatformNavigation::getTitle, title)
+            .eq(PlatformNavigation::getIsEnable, SysPlatformYesNo.YES.getCode())
+            .orderByAsc(PlatformNavigation::getSort)
+        );
+        return R.ok(list);
+    }
+
     /**
      * 轮播广告(平台装修-轮播广告)
      */

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/PlatformNavigation.java

@@ -27,6 +27,11 @@ public class PlatformNavigation extends TenantEntity {
     @TableId(value = "id")
     private Long id;
 
+    /**
+     * 上级id
+     * */
+    private Long parentId;
+
     /**
      * 导航类型:home=首页导航, inner=内页导航, search=搜索导航, footer=底部导航, float=浮动导航
      */

+ 14 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTaxCode.java

@@ -1,11 +1,14 @@
 package org.dromara.system.domain;
 
 import org.dromara.common.tenant.core.TenantEntity;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
 import java.io.Serial;
+import java.math.BigDecimal;
 
 /**
  * 税收编码对象 sys_tax_code
@@ -77,5 +80,15 @@ public class SysTaxCode extends TenantEntity {
      * */
     private String isBottom;
 
+    /**
+    * 税率
+    * */
+    private BigDecimal taxrate;
+    /**
+    * 说明
+    * */
+    @TableField("`explain`")
+    private String explain;
+
 
 }

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/PlatformNavigationBo.java

@@ -25,6 +25,11 @@ public class PlatformNavigationBo extends BaseEntity {
      */
     private Long id;
 
+    /**
+     * 上级id
+     * */
+    private Long parentId;
+
     /**
      * 导航类型:home=首页导航, inner=内页导航, search=搜索导航, footer=底部导航, float=浮动导航
      */

+ 11 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTaxCodeBo.java

@@ -9,6 +9,8 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import jakarta.validation.constraints.*;
 
+import java.math.BigDecimal;
+
 /**
  * 税收编码业务对象 sys_tax_code
  *
@@ -84,5 +86,14 @@ public class SysTaxCodeBo extends BaseEntity {
     * */
     private String isBottom;
 
+    /**
+     * 税率
+     * */
+    private BigDecimal taxrate;
+    /**
+     * 说明
+     * */
+    private String explain;
+
 
 }

+ 5 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/PlatformNavigationVo.java

@@ -33,6 +33,11 @@ public class PlatformNavigationVo implements Serializable {
     @ExcelProperty(value = "导航ID")
     private Long id;
 
+    /**
+    * 上级id
+    * */
+    private Long parentId;
+
     /**
      * 导航类型:home=首页导航, inner=内页导航, search=搜索导航, footer=底部导航, float=浮动导航
      */

+ 10 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTaxCodeVo.java

@@ -10,6 +10,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.Date;
 
 
@@ -94,5 +95,14 @@ public class SysTaxCodeVo implements Serializable {
      * */
     private String isBottom;
 
+    /**
+     * 税率
+     * */
+    private BigDecimal taxrate;
+    /**
+     * 说明
+     * */
+    private String explain;
+
 
 }

+ 5 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTaxCodeServiceImpl.java

@@ -91,7 +91,11 @@ public class SysTaxCodeServiceImpl  extends ServiceImpl<SysTaxCodeMapper, SysTax
         lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysTaxCode::getStatus, bo.getStatus());
         lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), SysTaxCode::getPlatformCode, bo.getPlatformCode());
         lqw.eq(StringUtils.isNotBlank(bo.getIsBottom()), SysTaxCode::getIsBottom, bo.getIsBottom());
-        lqw.apply(ObjectUtil.isNotEmpty(bo.getParentId()),DataBaseHelper.findInSet(bo.getParentId(), "ancestors"));
+        if (ObjectUtil.isNotEmpty(bo.getParentId())) {
+            lqw.and(w -> w.apply(DataBaseHelper.findInSet(bo.getParentId(), "ancestors"))
+                .or()
+                .eq(SysTaxCode::getId, bo.getParentId()));
+        }
         return lqw;
     }