feat(bid): 完成物料管理模块全功能开发

1. 新增物料详情页路由、菜单与接口,支持查看物料报价与信息
2. 重构物料列表页面,新增品牌筛选、表格样式优化与详情跳转
3. 扩展物料实体与数据库字段,新增材质、用途、性能参数等字段
4. 新增供应商/甲方报价查询、批量对比、同名称物料匹配接口
5. 新增物料详情组件,包含基础信息、供应商报价、甲方报价标签页
6. 修复比价路由跳转路径错误,调整数据库密码配置
7. 新增物料相关SQL脚本与初始化数据
This commit is contained in:
2026-05-29 08:58:58 +08:00
parent c718ec4076
commit e521b0dfeb
26 changed files with 4871 additions and 41 deletions

View File

@@ -9,7 +9,6 @@ public class BizMaterial extends BaseEntity {
private String materialCode;
private String materialName;
private String spec;
private String modelNo;
private String unit;
private String brand;
private String description;
@@ -17,6 +16,12 @@ public class BizMaterial extends BaseEntity {
// search helper
private String categoryName;
// 新增字段
private String performanceParams;
private String material;
private String purpose;
private String imageUrl;
public Long getMaterialId() { return materialId; }
public void setMaterialId(Long materialId) { this.materialId = materialId; }
public Long getTenantId() { return tenantId; }
@@ -29,8 +34,6 @@ public class BizMaterial extends BaseEntity {
public void setMaterialName(String materialName) { this.materialName = materialName; }
public String getSpec() { return spec; }
public void setSpec(String spec) { this.spec = spec; }
public String getModelNo() { return modelNo; }
public void setModelNo(String modelNo) { this.modelNo = modelNo; }
public String getUnit() { return unit; }
public void setUnit(String unit) { this.unit = unit; }
public String getBrand() { return brand; }
@@ -41,4 +44,12 @@ public class BizMaterial extends BaseEntity {
public void setStatus(String status) { this.status = status; }
public String getCategoryName() { return categoryName; }
public void setCategoryName(String categoryName) { this.categoryName = categoryName; }
public String getPerformanceParams() { return performanceParams; }
public void setPerformanceParams(String performanceParams) { this.performanceParams = performanceParams; }
public String getMaterial() { return material; }
public void setMaterial(String material) { this.material = material; }
public String getPurpose() { return purpose; }
public void setPurpose(String purpose) { this.purpose = purpose; }
public String getImageUrl() { return imageUrl; }
public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; }
}

View File

@@ -1,7 +1,9 @@
package com.ruoyi.system.mapper.bid;
import com.ruoyi.system.domain.bid.BizMaterial;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface BizMaterialMapper {
List<BizMaterial> selectBizMaterialList(BizMaterial query);
@@ -10,4 +12,21 @@ public interface BizMaterialMapper {
int updateBizMaterial(BizMaterial record);
int deleteBizMaterialById(Long id);
int deleteBizMaterialByIds(Long[] ids);
// 物料详情页
List<Map<String, Object>> selectSupplierQuotesByMaterialId(Long materialId);
// 批量物料对比
List<BizMaterial> selectBizMaterialByIds(List<Long> materialIds);
List<Map<String, Object>> selectSupplierPriceSummaryByMaterialIds(List<Long> materialIds);
List<Map<String, Object>> selectBestSupplierOfferByMaterialIds(List<Long> materialIds);
List<Map<String, Object>> selectClientQuotesByMaterialId(Long materialId);
List<String> selectManufacturerList();
// 同类型物料横向对比
List<BizMaterial> selectMaterialsWithSupplierQuotes();
List<Map<String, Object>> selectSupplierQuoteComparison(List<Long> materialIds);
// 根据物料名称精确匹配(同名称不同规格/品牌对比)
List<BizMaterial> selectMaterialsByExactName(@Param("materialName") String materialName, @Param("excludeId") Long excludeId);
}

View File

@@ -2,6 +2,7 @@ package com.ruoyi.system.service.bid;
import com.ruoyi.system.domain.bid.BizMaterial;
import java.util.List;
import java.util.Map;
public interface IBizMaterialService {
List<BizMaterial> selectBizMaterialList(BizMaterial query);
@@ -10,4 +11,18 @@ public interface IBizMaterialService {
int updateBizMaterial(BizMaterial record);
int deleteBizMaterialById(Long id);
int deleteBizMaterialByIds(Long[] ids);
List<Map<String, Object>> selectSupplierQuotesByMaterialId(Long materialId);
List<Map<String, Object>> selectClientQuotesByMaterialId(Long materialId);
List<String> selectManufacturerList();
// 批量物料对比
Map<String, Object> compareMaterials(List<Long> materialIds);
// 同类型物料横向对比
List<BizMaterial> selectMaterialsWithSupplierQuotes();
List<Map<String, Object>> selectSupplierQuoteComparison(List<Long> materialIds);
// 根据物料名称精确匹配(同名称不同规格/品牌对比)
List<BizMaterial> selectMaterialsByExactName(String materialName, Long excludeId);
}

View File

@@ -5,7 +5,8 @@ import com.ruoyi.system.mapper.bid.BizMaterialMapper;
import com.ruoyi.system.service.bid.IBizMaterialService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class BizMaterialServiceImpl implements IBizMaterialService {
@@ -41,4 +42,70 @@ public class BizMaterialServiceImpl implements IBizMaterialService {
public int deleteBizMaterialByIds(Long[] ids) {
return mapper.deleteBizMaterialByIds(ids);
}
@Override
public List<Map<String, Object>> selectSupplierQuotesByMaterialId(Long materialId) {
return mapper.selectSupplierQuotesByMaterialId(materialId);
}
@Override
public List<Map<String, Object>> selectClientQuotesByMaterialId(Long materialId) {
return mapper.selectClientQuotesByMaterialId(materialId);
}
@Override
public List<String> selectManufacturerList() {
return mapper.selectManufacturerList();
}
@Override
public Map<String, Object> compareMaterials(List<Long> materialIds) {
if (materialIds == null || materialIds.isEmpty()) {
return Collections.emptyMap();
}
// 1. 获取物料基本信息
List<BizMaterial> materials = mapper.selectBizMaterialByIds(materialIds);
// 2. 获取供应商报价汇总
List<Map<String, Object>> priceSummaries = mapper.selectSupplierPriceSummaryByMaterialIds(materialIds);
Map<Long, Map<String, Object>> priceMap = new HashMap<>();
for (Map<String, Object> row : priceSummaries) {
Long mid = ((Number) row.get("material_id")).longValue();
priceMap.put(mid, row);
}
// 3. 获取最优报价详情
List<Map<String, Object>> bestOffers = mapper.selectBestSupplierOfferByMaterialIds(materialIds);
Map<Long, Map<String, Object>> bestOfferMap = new HashMap<>();
for (Map<String, Object> row : bestOffers) {
Long mid = ((Number) row.get("material_id")).longValue();
bestOfferMap.put(mid, row);
}
Map<String, Object> result = new HashMap<>();
result.put("materials", materials);
result.put("priceMap", priceMap);
result.put("bestOfferMap", bestOfferMap);
return result;
}
@Override
public List<BizMaterial> selectMaterialsWithSupplierQuotes() {
return mapper.selectMaterialsWithSupplierQuotes();
}
@Override
public List<Map<String, Object>> selectSupplierQuoteComparison(List<Long> materialIds) {
if (materialIds == null || materialIds.isEmpty()) {
return Collections.emptyList();
}
return mapper.selectSupplierQuoteComparison(materialIds);
}
@Override
public List<BizMaterial> selectMaterialsByExactName(String materialName, Long excludeId) {
return mapper.selectMaterialsByExactName(materialName, excludeId);
}
}