فهرست منبع

zl-12-30-后端

林小张 3 ماه پیش
والد
کامیت
6f5d861de0
12فایلهای تغییر یافته به همراه733 افزوده شده و 4 حذف شده
  1. 106 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductWarehouseInventoryController.java
  2. 87 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductWarehouseInventory.java
  3. 87 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductWarehouseInventoryBo.java
  4. 111 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductWarehouseInventoryVo.java
  5. 30 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductWarehouseInventoryMapper.java
  6. 70 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductWarehouseInventoryService.java
  7. 14 1
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductGiftFloorLinkServiceImpl.java
  8. 37 1
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductThemeGroupLinkServiceImpl.java
  9. 140 0
      ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductWarehouseInventoryServiceImpl.java
  10. 9 1
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductBaseMapper.xml
  11. 2 1
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductGiftFloorLinkMapper.xml
  12. 40 0
      ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductWarehouseInventoryMapper.xml

+ 106 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/controller/ProductWarehouseInventoryController.java

@@ -0,0 +1,106 @@
+package org.dromara.product.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+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.ProductWarehouseInventoryVo;
+import org.dromara.product.domain.bo.ProductWarehouseInventoryBo;
+import org.dromara.product.service.IProductWarehouseInventoryService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 仓库库存明细
+ * 前端访问路由地址为:/product/warehouseInventory
+ *
+ * @author LionLi
+ * @date 2025-12-31
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/warehouseInventory")
+public class ProductWarehouseInventoryController extends BaseController {
+
+    private final IProductWarehouseInventoryService productWarehouseInventoryService;
+
+    /**
+     * 查询仓库库存明细列表
+     */
+    @SaCheckPermission("product:warehouseInventory:list")
+    @GetMapping("/list")
+    public TableDataInfo<ProductWarehouseInventoryVo> list(ProductWarehouseInventoryBo bo, PageQuery pageQuery) {
+        return productWarehouseInventoryService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出仓库库存明细列表
+     */
+    @SaCheckPermission("product:warehouseInventory:export")
+    @Log(title = "仓库库存明细", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(ProductWarehouseInventoryBo bo, HttpServletResponse response) {
+        List<ProductWarehouseInventoryVo> list = productWarehouseInventoryService.queryList(bo);
+        ExcelUtil.exportExcel(list, "仓库库存明细", ProductWarehouseInventoryVo.class, response);
+    }
+
+    /**
+     * 获取仓库库存明细详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("product:warehouseInventory:query")
+    @GetMapping("/{id}")
+    public R<ProductWarehouseInventoryVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable("id") Long id) {
+        return R.ok(productWarehouseInventoryService.queryById(id));
+    }
+
+    /**
+     * 新增仓库库存明细
+     */
+    @SaCheckPermission("product:warehouseInventory:add")
+    @Log(title = "仓库库存明细", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody ProductWarehouseInventoryBo bo) {
+        return toAjax(productWarehouseInventoryService.insertByBo(bo));
+    }
+
+    /**
+     * 修改仓库库存明细
+     */
+    @SaCheckPermission("product:warehouseInventory:edit")
+    @Log(title = "仓库库存明细", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody ProductWarehouseInventoryBo bo) {
+        return toAjax(productWarehouseInventoryService.updateByBo(bo));
+    }
+
+    /**
+     * 删除仓库库存明细
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("product:warehouseInventory:remove")
+    @Log(title = "仓库库存明细", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable("ids") Long[] ids) {
+        return toAjax(productWarehouseInventoryService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 87 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/ProductWarehouseInventory.java

@@ -0,0 +1,87 @@
+package org.dromara.product.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 仓库库存明细对象 product_warehouse_inventory
+ *
+ * @author LionLi
+ * @date 2025-12-31
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("product_warehouse_inventory")
+public class ProductWarehouseInventory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
+    /**
+     * SKU ID
+     */
+    private Long skuId;
+
+    /**
+     * 规格型号
+     */
+    private String specModel;
+
+    /**
+     * 仓库ID
+     */
+    private Long warehouseId;
+
+    /**
+     * 仓库编号
+     */
+    private String warehouseNo;
+
+    /**
+     * 仓库名称
+     */
+    private String warehouseName;
+
+    /**
+     * 可用库存
+     */
+    private Long nowInventory;
+
+    /**
+     * 锁定库存
+     */
+    private Long lockInventory;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private String delFlag;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 87 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/bo/ProductWarehouseInventoryBo.java

@@ -0,0 +1,87 @@
+package org.dromara.product.domain.bo;
+
+import org.dromara.product.domain.ProductWarehouseInventory;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 仓库库存明细业务对象 product_warehouse_inventory
+ *
+ * @author LionLi
+ * @date 2025-12-31
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = ProductWarehouseInventory.class, reverseConvertGenerate = false)
+public class ProductWarehouseInventoryBo extends BaseEntity {
+
+    /**
+     * ID
+     */
+    private Long id;
+
+    /**
+     * 商品ID
+     */
+    private Long productId;
+
+    /**
+     * SKU ID
+     */
+//    @NotNull(message = "SKU ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long skuId;
+
+    /**
+     * 规格型号
+     */
+//    @NotBlank(message = "规格型号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String specModel;
+
+    /**
+     * 仓库ID
+     */
+    private Long warehouseId;
+
+    /**
+     * 仓库编号
+     */
+//    @NotBlank(message = "仓库编号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String warehouseNo;
+
+    /**
+     * 仓库名称
+     */
+//    @NotBlank(message = "仓库名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String warehouseName;
+
+    /**
+     * 可用库存
+     */
+//    @NotNull(message = "可用库存不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long nowInventory;
+
+    /**
+     * 锁定库存
+     */
+//    @NotNull(message = "锁定库存不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Long lockInventory;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+//    @NotBlank(message = "状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String status;
+
+    /**
+     * 备注
+     */
+//    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 111 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/domain/vo/ProductWarehouseInventoryVo.java

@@ -0,0 +1,111 @@
+package org.dromara.product.domain.vo;
+
+import org.dromara.product.domain.ProductWarehouseInventory;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+
+
+/**
+ * 仓库库存明细视图对象 product_warehouse_inventory
+ *
+ * @author LionLi
+ * @date 2025-12-31
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = ProductWarehouseInventory.class)
+public class ProductWarehouseInventoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * ID
+     */
+    @ExcelProperty(value = "ID")
+    private Long id;
+
+    /**
+     * 商品ID
+     */
+    @ExcelProperty(value = "商品ID")
+    private Long productId;
+
+    /**
+     * 商品编号
+     */
+    @ExcelProperty(value = "商品编号")
+    private String productNo;
+
+    /**
+     * 商品名称
+     */
+    @ExcelProperty(value = "商品名称")
+    private String productName;
+
+    /**
+     * SKU ID
+     */
+    @ExcelProperty(value = "SKU ID")
+    private Long skuId;
+
+    /**
+     * 规格型号
+     */
+    @ExcelProperty(value = "规格型号")
+    private String specModel;
+
+    /**
+     * 仓库ID
+     */
+    @ExcelProperty(value = "仓库ID")
+    private Long warehouseId;
+
+    /**
+     * 仓库编号
+     */
+    @ExcelProperty(value = "仓库编号")
+    private String warehouseNo;
+
+    /**
+     * 仓库名称
+     */
+    @ExcelProperty(value = "仓库名称")
+    private String warehouseName;
+
+    /**
+     * 可用库存
+     */
+    @ExcelProperty(value = "可用库存")
+    private Long nowInventory;
+
+    /**
+     * 锁定库存
+     */
+    @ExcelProperty(value = "锁定库存")
+    private Long lockInventory;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+    private String status;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+
+}

+ 30 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/mapper/ProductWarehouseInventoryMapper.java

@@ -0,0 +1,30 @@
+package org.dromara.product.mapper;
+
+import org.apache.ibatis.annotations.Param;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.product.domain.ProductWarehouseInventory;
+import org.dromara.product.domain.bo.ProductWarehouseInventoryBo;
+import org.dromara.product.domain.vo.ProductWarehouseInventoryVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import java.util.List;
+
+/**
+ * 仓库库存明细Mapper接口
+ *
+ * @author LionLi
+ * @date 2025-12-31
+ */
+public interface ProductWarehouseInventoryMapper extends BaseMapperPlus<ProductWarehouseInventory, ProductWarehouseInventoryVo> {
+
+    /**
+     * 查询仓库库存明细列表(关联商品信息)
+     */
+    Page<ProductWarehouseInventoryVo> selectWarehouseInventoryList(Page<ProductWarehouseInventoryVo> page, @Param("bo") ProductWarehouseInventoryBo bo);
+
+    /**
+     * 查询仓库库存明细列表(不分页)
+     */
+    List<ProductWarehouseInventoryVo> selectWarehouseInventoryList(@Param("bo") ProductWarehouseInventoryBo bo);
+}

+ 70 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/IProductWarehouseInventoryService.java

@@ -0,0 +1,70 @@
+package org.dromara.product.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.dromara.product.domain.ProductWarehouseInventory;
+import org.dromara.product.domain.vo.ProductWarehouseInventoryVo;
+import org.dromara.product.domain.bo.ProductWarehouseInventoryBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 仓库库存明细Service接口
+ *
+ * @author LionLi
+ * @date 2025-12-31
+ */
+public interface IProductWarehouseInventoryService extends IService<ProductWarehouseInventory>{
+
+    /**
+     * 查询仓库库存明细
+     *
+     * @param id 主键
+     * @return 仓库库存明细
+     */
+    ProductWarehouseInventoryVo queryById(Long id);
+
+    /**
+     * 分页查询仓库库存明细列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 仓库库存明细分页列表
+     */
+    TableDataInfo<ProductWarehouseInventoryVo> queryPageList(ProductWarehouseInventoryBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的仓库库存明细列表
+     *
+     * @param bo 查询条件
+     * @return 仓库库存明细列表
+     */
+    List<ProductWarehouseInventoryVo> queryList(ProductWarehouseInventoryBo bo);
+
+    /**
+     * 新增仓库库存明细
+     *
+     * @param bo 仓库库存明细
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(ProductWarehouseInventoryBo bo);
+
+    /**
+     * 修改仓库库存明细
+     *
+     * @param bo 仓库库存明细
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(ProductWarehouseInventoryBo bo);
+
+    /**
+     * 校验并批量删除仓库库存明细信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 14 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductGiftFloorLinkServiceImpl.java

@@ -16,6 +16,7 @@ import org.dromara.product.domain.vo.ProductGiftFloorLinkVo;
 import org.dromara.product.domain.ProductGiftFloorLink;
 import org.dromara.product.mapper.ProductGiftFloorLinkMapper;
 import org.dromara.product.service.IProductGiftFloorLinkService;
+import org.dromara.common.core.exception.ServiceException;
 
 import java.util.List;
 import java.util.Map;
@@ -117,7 +118,19 @@ public class ProductGiftFloorLinkServiceImpl  extends ServiceImpl<ProductGiftFlo
      * 保存前的数据校验
      */
     private void validEntityBeforeSave(ProductGiftFloorLink entity){
-        //TODO 做一些数据校验,如唯一约束
+        // 校验同一楼层下商品是否已存在
+        if (entity.getFloorId() != null && entity.getProductId() != null) {
+            LambdaQueryWrapper<ProductGiftFloorLink> lqw = Wrappers.lambdaQuery();
+            lqw.eq(ProductGiftFloorLink::getFloorId, entity.getFloorId());
+            lqw.eq(ProductGiftFloorLink::getProductId, entity.getProductId());
+            // 如果是更新操作,排除自身
+            if (entity.getId() != null) {
+                lqw.ne(ProductGiftFloorLink::getId, entity.getId());
+            }
+            if (baseMapper.exists(lqw)) {
+                throw new ServiceException("该商品已存在于当前楼层,请勿重复添加");
+            }
+        }
     }
 
     /**

+ 37 - 1
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductThemeGroupLinkServiceImpl.java

@@ -14,7 +14,9 @@ import org.springframework.stereotype.Service;
 import org.dromara.product.domain.bo.ProductThemeGroupLinkBo;
 import org.dromara.product.domain.vo.ProductThemeGroupLinkVo;
 import org.dromara.product.domain.ProductThemeGroupLink;
+import org.dromara.product.domain.ProductThemeGroup;
 import org.dromara.product.mapper.ProductThemeGroupLinkMapper;
+import org.dromara.product.mapper.ProductThemeGroupMapper;
 import org.dromara.product.service.IProductThemeGroupLinkService;
 
 import org.dromara.common.core.exception.ServiceException;
@@ -35,6 +37,7 @@ import java.util.Collection;
 public class ProductThemeGroupLinkServiceImpl  extends ServiceImpl<ProductThemeGroupLinkMapper, ProductThemeGroupLink> implements IProductThemeGroupLinkService {
 
     private final ProductThemeGroupLinkMapper baseMapper;
+    private final ProductThemeGroupMapper groupMapper;
 
     /**
      * 查询主题分组商品关联
@@ -98,6 +101,8 @@ public class ProductThemeGroupLinkServiceImpl  extends ServiceImpl<ProductThemeG
         boolean flag = baseMapper.insert(add) > 0;
         if (flag) {
             bo.setId(add.getId());
+            // 更新分组的商品数量
+            updateGroupProductCount(bo.getGroupId());
         }
         return flag;
     }
@@ -146,6 +151,37 @@ public class ProductThemeGroupLinkServiceImpl  extends ServiceImpl<ProductThemeG
         if(isValid){
             //TODO 做一些业务上的校验,判断是否需要校验
         }
-        return baseMapper.deleteByIds(ids) > 0;
+        // 先获取要删除的记录,拿到groupId
+        List<ProductThemeGroupLink> links = baseMapper.selectByIds(ids);
+        boolean flag = baseMapper.deleteByIds(ids) > 0;
+        if (flag) {
+            // 更新涉及的分组的商品数量
+            links.stream()
+                .map(ProductThemeGroupLink::getGroupId)
+                .distinct()
+                .forEach(this::updateGroupProductCount);
+        }
+        return flag;
+    }
+
+    /**
+     * 更新分组的商品数量
+     *
+     * @param groupId 分组ID
+     */
+    private void updateGroupProductCount(Long groupId) {
+        if (groupId == null) {
+            return;
+        }
+        // 统计该分组下的商品数量
+        Long count = baseMapper.selectCount(
+            Wrappers.<ProductThemeGroupLink>lambdaQuery()
+                .eq(ProductThemeGroupLink::getGroupId, groupId)
+        );
+        // 更新分组表的商品数量
+        ProductThemeGroup group = new ProductThemeGroup();
+        group.setId(groupId);
+        group.setProductCount(count);
+        groupMapper.updateById(group);
     }
 }

+ 140 - 0
ruoyi-modules/ruoyi-product/src/main/java/org/dromara/product/service/impl/ProductWarehouseInventoryServiceImpl.java

@@ -0,0 +1,140 @@
+package org.dromara.product.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+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.springframework.stereotype.Service;
+import org.dromara.product.domain.bo.ProductWarehouseInventoryBo;
+import org.dromara.product.domain.vo.ProductWarehouseInventoryVo;
+import org.dromara.product.domain.ProductWarehouseInventory;
+import org.dromara.product.mapper.ProductWarehouseInventoryMapper;
+import org.dromara.product.service.IProductWarehouseInventoryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 仓库库存明细Service业务层处理
+ *
+ * @author LionLi
+ * @date 2025-12-31
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class ProductWarehouseInventoryServiceImpl  extends ServiceImpl<ProductWarehouseInventoryMapper, ProductWarehouseInventory> implements IProductWarehouseInventoryService {
+
+    private final ProductWarehouseInventoryMapper baseMapper;
+
+    /**
+     * 查询仓库库存明细
+     *
+     * @param id 主键
+     * @return 仓库库存明细
+     */
+    @Override
+    public ProductWarehouseInventoryVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 分页查询仓库库存明细列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 仓库库存明细分页列表
+     */
+    @Override
+    public TableDataInfo<ProductWarehouseInventoryVo> queryPageList(ProductWarehouseInventoryBo bo, PageQuery pageQuery) {
+        Page<ProductWarehouseInventoryVo> result = baseMapper.selectWarehouseInventoryList(pageQuery.build(), bo);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的仓库库存明细列表
+     *
+     * @param bo 查询条件
+     * @return 仓库库存明细列表
+     */
+    @Override
+    public List<ProductWarehouseInventoryVo> queryList(ProductWarehouseInventoryBo bo) {
+        return baseMapper.selectWarehouseInventoryList(bo);
+    }
+
+    private LambdaQueryWrapper<ProductWarehouseInventory> buildQueryWrapper(ProductWarehouseInventoryBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<ProductWarehouseInventory> lqw = Wrappers.lambdaQuery();
+        lqw.orderByAsc(ProductWarehouseInventory::getId);
+        lqw.eq(bo.getProductId() != null, ProductWarehouseInventory::getProductId, bo.getProductId());
+        lqw.eq(bo.getSkuId() != null, ProductWarehouseInventory::getSkuId, bo.getSkuId());
+        lqw.eq(StringUtils.isNotBlank(bo.getSpecModel()), ProductWarehouseInventory::getSpecModel, bo.getSpecModel());
+        lqw.eq(bo.getWarehouseId() != null, ProductWarehouseInventory::getWarehouseId, bo.getWarehouseId());
+        lqw.eq(StringUtils.isNotBlank(bo.getWarehouseNo()), ProductWarehouseInventory::getWarehouseNo, bo.getWarehouseNo());
+        lqw.like(StringUtils.isNotBlank(bo.getWarehouseName()), ProductWarehouseInventory::getWarehouseName, bo.getWarehouseName());
+        lqw.eq(bo.getNowInventory() != null, ProductWarehouseInventory::getNowInventory, bo.getNowInventory());
+        lqw.eq(bo.getLockInventory() != null, ProductWarehouseInventory::getLockInventory, bo.getLockInventory());
+        lqw.eq(StringUtils.isNotBlank(bo.getStatus()), ProductWarehouseInventory::getStatus, bo.getStatus());
+        lqw.eq(StringUtils.isNotBlank(bo.getPlatformCode()), ProductWarehouseInventory::getPlatformCode, bo.getPlatformCode());
+        return lqw;
+    }
+
+    /**
+     * 新增仓库库存明细
+     *
+     * @param bo 仓库库存明细
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(ProductWarehouseInventoryBo bo) {
+        ProductWarehouseInventory add = MapstructUtils.convert(bo, ProductWarehouseInventory.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改仓库库存明细
+     *
+     * @param bo 仓库库存明细
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(ProductWarehouseInventoryBo bo) {
+        ProductWarehouseInventory update = MapstructUtils.convert(bo, ProductWarehouseInventory.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(ProductWarehouseInventory entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 校验并批量删除仓库库存明细信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteByIds(ids) > 0;
+    }
+}

+ 9 - 1
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductBaseMapper.xml

@@ -6,7 +6,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <!-- 站点产品列表查询(联表查询) -->
     <select id="selectSiteProductPage" resultType="org.dromara.product.domain.vo.SiteProductVo">
-        SELECT DISTINCT
+        SELECT
             b.id,
             b.product_no AS productNo,
             b.item_name AS productName,
@@ -31,6 +31,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             mc.category_name AS mediumCategoryName,
             b.bottom_category_id AS bottomCategoryId,
             bc.category_name AS bottomCategoryName,
+            GROUP_CONCAT(DISTINCT gcl.category_name) AS giftCategoryName,
             b.remark
         FROM product_base b
         LEFT JOIN product_price_inventory p ON b.id = p.product_id AND p.del_flag = '0'
@@ -38,6 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         LEFT JOIN product_category tc ON b.top_category_id = tc.id AND tc.del_flag = '0'
         LEFT JOIN product_category mc ON b.medium_category_id = mc.id AND mc.del_flag = '0'
         LEFT JOIN product_category bc ON b.bottom_category_id = bc.id AND bc.del_flag = '0'
+        LEFT JOIN product_gift_category_link gcl ON b.id = gcl.product_id AND gcl.del_flag = '0'
         <where>
             b.del_flag = '0'
             <if test="bo.keyword != null and bo.keyword != ''">
@@ -65,6 +67,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND b.product_status = #{bo.productStatus}
             </if>
         </where>
+        GROUP BY b.id, b.product_no, b.item_name, b.product_image, b.is_self, 
+                 b.product_review_status, b.product_status, b.brand_id, 
+                 b.top_category_id, b.medium_category_id, b.bottom_category_id, b.remark,
+                 p.market_price, p.member_price, p.min_selling_price, p.purchasing_price,
+                 p.max_purchase_price, p.total_inventory, p.now_inventory, p.virtual_inventory,
+                 p.min_order_quantity, br.brand_name, tc.category_name, mc.category_name, bc.category_name
         ORDER BY b.create_time DESC
     </select>
 

+ 2 - 1
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductGiftFloorLinkMapper.xml

@@ -16,9 +16,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             l.remark,
             p.item_name,
             p.product_image,
-            p.min_selling_price
+            ppi.min_selling_price
         FROM product_gift_floor_link l
         LEFT JOIN product_base p ON l.product_id = p.id
+        LEFT JOIN product_price_inventory ppi ON p.id = ppi.product_id
         WHERE l.del_flag = '0'
         <if test="floorId != null">
             AND l.floor_id = #{floorId}

+ 40 - 0
ruoyi-modules/ruoyi-product/src/main/resources/mapper/product/ProductWarehouseInventoryMapper.xml

@@ -0,0 +1,40 @@
+<?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="org.dromara.product.mapper.ProductWarehouseInventoryMapper">
+
+    <!-- 查询仓库库存明细列表(关联商品信息) -->
+    <select id="selectWarehouseInventoryList" resultType="org.dromara.product.domain.vo.ProductWarehouseInventoryVo">
+        SELECT
+            wi.id,
+            wi.product_id AS productId,
+            pb.product_no AS productNo,
+            pb.item_name AS productName,
+            wi.sku_id AS skuId,
+            wi.spec_model AS specModel,
+            wi.warehouse_id AS warehouseId,
+            wi.warehouse_no AS warehouseNo,
+            wi.warehouse_name AS warehouseName,
+            wi.now_inventory AS nowInventory,
+            wi.lock_inventory AS lockInventory,
+            wi.status,
+            wi.remark
+        FROM product_warehouse_inventory wi
+        LEFT JOIN product_base pb ON wi.product_id = pb.id AND pb.del_flag = '0'
+        <where>
+            wi.del_flag = '0'
+            <if test="bo.productId != null">
+                AND wi.product_id = #{bo.productId}
+            </if>
+            <if test="bo.warehouseId != null">
+                AND wi.warehouse_id = #{bo.warehouseId}
+            </if>
+            <if test="bo.warehouseNo != null and bo.warehouseNo != ''">
+                AND wi.warehouse_no = #{bo.warehouseNo}
+            </if>
+        </where>
+        ORDER BY wi.create_time DESC
+    </select>
+
+</mapper>