feat(wms): 添加第二个表格统计功能

- 在 IWmsRawMaterialService 中新增 queryStatistics 方法用于统计原材料数据
- 在 WmsRawMaterialController 中添加 /statistics 接口端点
- 在 WmsRawMaterialMapper 中新增 selectStatistics 查询方法
- 在 XML 映射文件中实现统计查询的 SQL 语句
- 在服务实现类中完成统计逻辑,按厂家、材质、规格分组计算钢卷件数和重量
- 新增 ManufacturerStatisticsVo、MaterialStatisticsVo、SpecificationStatisticsVo 和 WmsRawMaterialStatisticsVo 数据传输对象
- 实现多层级数据聚合统计功能,包括厂家、材质、规格维度的数据汇总
This commit is contained in:
2026-03-03 15:24:50 +08:00
parent d927aa8647
commit 2df0bab257
9 changed files with 158 additions and 8 deletions

View File

@@ -6,7 +6,7 @@ import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
@@ -19,6 +19,7 @@ import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.domain.vo.WmsRawMaterialVo;
import com.klp.domain.vo.dashboard.ManufacturerStatisticsVo;
import com.klp.domain.bo.WmsRawMaterialBo;
import com.klp.service.IWmsRawMaterialService;
import com.klp.common.core.page.TableDataInfo;
@@ -127,4 +128,12 @@ public class WmsRawMaterialController extends BaseController {
public R<WmsRawMaterialBo> addWithBom(@Validated(AddGroup.class) @RequestBody WmsRawMaterialBo bo) {
return R.ok(iWmsRawMaterialService.insertByBo(bo));
}
/**
* 统计原材料按厂家、材质、规格的钢卷件数和重量
*/
@GetMapping("/statistics")
public R<List<ManufacturerStatisticsVo>> statistics() {
return R.ok(iWmsRawMaterialService.queryStatistics());
}
}

View File

@@ -0,0 +1,13 @@
package com.klp.domain.vo.dashboard;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class ManufacturerStatisticsVo {
private String manufacturer;
private Integer totalCoilCount;
private BigDecimal totalWeight;
private List<MaterialStatisticsVo> materials;
}

View File

@@ -0,0 +1,13 @@
package com.klp.domain.vo.dashboard;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class MaterialStatisticsVo {
private String material;
private Integer totalCoilCount;
private BigDecimal totalWeight;
private List<SpecificationStatisticsVo> specifications;
}

View File

@@ -0,0 +1,11 @@
package com.klp.domain.vo.dashboard;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class SpecificationStatisticsVo {
private String specification;
private Integer coilCount;
private BigDecimal totalWeight;
}

View File

@@ -0,0 +1,18 @@
package com.klp.domain.vo.dashboard;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class WmsRawMaterialStatisticsVo {
private String manufacturer;
private String material;
private String specification;
private Integer coilCount;
private BigDecimal totalWeight;
}

View File

@@ -2,8 +2,11 @@ package com.klp.mapper;
import com.klp.domain.WmsRawMaterial;
import com.klp.domain.vo.WmsRawMaterialVo;
import com.klp.domain.vo.dashboard.WmsRawMaterialStatisticsVo;
import com.klp.common.core.mapper.BaseMapperPlus;
import java.util.List;
/**
* 原材料Mapper接口
*
@@ -12,4 +15,5 @@ import com.klp.common.core.mapper.BaseMapperPlus;
*/
public interface WmsRawMaterialMapper extends BaseMapperPlus<WmsRawMaterialMapper, WmsRawMaterial, WmsRawMaterialVo> {
List<WmsRawMaterialStatisticsVo> selectStatistics();
}

View File

@@ -1,10 +1,10 @@
package com.klp.service;
import com.klp.domain.WmsRawMaterial;
import com.klp.domain.vo.WmsRawMaterialVo;
import com.klp.domain.bo.WmsRawMaterialBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.klp.domain.vo.dashboard.ManufacturerStatisticsVo;
import java.util.Collection;
import java.util.List;
@@ -56,4 +56,9 @@ public interface IWmsRawMaterialService {
* 查询原材料列表带BOM信息
*/
TableDataInfo<WmsRawMaterialVo> queryPageListWithBom(WmsRawMaterialBo bo, PageQuery pageQuery);
/**
* 统计原材料按厂家、材质、规格的钢卷件数和重量
*/
List<ManufacturerStatisticsVo> queryStatistics();
}

View File

@@ -7,22 +7,20 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import com.klp.domain.WmsProduct;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import com.klp.domain.bo.WmsRawMaterialBo;
import com.klp.domain.vo.WmsRawMaterialVo;
import com.klp.domain.vo.dashboard.WmsRawMaterialStatisticsVo;
import com.klp.domain.vo.dashboard.ManufacturerStatisticsVo;
import com.klp.domain.vo.dashboard.MaterialStatisticsVo;
import com.klp.domain.vo.dashboard.SpecificationStatisticsVo;
import com.klp.domain.WmsRawMaterial;
import com.klp.mapper.WmsRawMaterialMapper;
import com.klp.service.IWmsRawMaterialService;
import com.klp.service.IWmsStockService;
import com.klp.service.IWmsOrderDetailService;
import com.klp.service.IWmsOrderService;
import com.klp.domain.bo.WmsOrderDetailBo;
import com.klp.domain.vo.WmsOrderDetailVo;
import com.klp.domain.vo.WmsOrderVo;
import com.klp.service.IWmsBomService;
import com.klp.service.IWmsBomItemService;
import com.klp.domain.bo.WmsBomBo;
@@ -35,6 +33,8 @@ import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.ArrayList;
/**
* 原材料Service业务层处理
@@ -365,4 +365,65 @@ public class WmsRawMaterialServiceImpl implements IWmsRawMaterialService {
}
return baseMapper.deleteBatchIds(ids) > 0;
}
/**
* 统计原材料按厂家、材质、规格的钢卷件数和重量
*/
@Override
public List<ManufacturerStatisticsVo> queryStatistics() {
List<WmsRawMaterialStatisticsVo> flatList = baseMapper.selectStatistics();
Map<String, List<WmsRawMaterialStatisticsVo>> byManufacturer = flatList.stream()
.collect(Collectors.groupingBy(s -> s.getManufacturer() == null ? "空置" : s.getManufacturer()));
List<ManufacturerStatisticsVo> result = new ArrayList<>();
for (Map.Entry<String, List<WmsRawMaterialStatisticsVo>> manuEntry : byManufacturer.entrySet()) {
ManufacturerStatisticsVo manuVo = new ManufacturerStatisticsVo();
manuVo.setManufacturer(manuEntry.getKey());
List<WmsRawMaterialStatisticsVo> manuList = manuEntry.getValue();
Map<String, List<WmsRawMaterialStatisticsVo>> byMaterial = manuList.stream()
.collect(Collectors.groupingBy(s -> s.getMaterial() == null ? "空置" : s.getMaterial()));
List<MaterialStatisticsVo> materialVoList = new ArrayList<>();
int totalCoilCount = 0;
BigDecimal totalWeight = BigDecimal.ZERO;
for (Map.Entry<String, List<WmsRawMaterialStatisticsVo>> matEntry : byMaterial.entrySet()) {
MaterialStatisticsVo matVo = new MaterialStatisticsVo();
matVo.setMaterial(matEntry.getKey());
List<SpecificationStatisticsVo> specVoList = new ArrayList<>();
int matCoilCount = 0;
BigDecimal matWeight = BigDecimal.ZERO;
for (WmsRawMaterialStatisticsVo item : matEntry.getValue()) {
SpecificationStatisticsVo specVo = new SpecificationStatisticsVo();
specVo.setSpecification(item.getSpecification() == null ? "空置" : item.getSpecification());
specVo.setCoilCount(item.getCoilCount() == null ? 0 : item.getCoilCount());
specVo.setTotalWeight(item.getTotalWeight() == null ? BigDecimal.ZERO : item.getTotalWeight());
specVoList.add(specVo);
matCoilCount += item.getCoilCount() == null ? 0 : item.getCoilCount();
matWeight = matWeight.add(item.getTotalWeight() == null ? BigDecimal.ZERO : item.getTotalWeight());
}
matVo.setSpecifications(specVoList);
matVo.setTotalCoilCount(matCoilCount);
matVo.setTotalWeight(matWeight);
materialVoList.add(matVo);
totalCoilCount += matCoilCount;
totalWeight = totalWeight.add(matWeight);
}
manuVo.setMaterials(materialVoList);
manuVo.setTotalCoilCount(totalCoilCount);
manuVo.setTotalWeight(totalWeight);
result.add(manuVo);
}
return result;
}
}