feat(wms): 添加钢卷库区操作记录导出功能以及优化查询速率

- 在服务接口中新增 exportBySecondWarehouseIdAndTimeRange 方法用于导出功能
- 在控制器中新增 exportByWarehouseAndTime 接口支持报表导出
- 在映射器中新增 selectVoListWithJoin 查询方法优化关联查询
- 在 XML 映射文件中新增完整的关联查询 SQL 和结果映射配置
- 在服务实现类中重构查询逻辑使用新的关联查询方法
- 新增 WmsCoilWarehouseOperationLogExportVo 导出数据对象
- 实现导出逻辑将操作记录转换为 Excel 格式并支持多表关联
- 添加状态描述转换方法支持中文显示
- 更新 VO 类继承 BaseEntity 基础实体类
This commit is contained in:
2026-03-24 10:35:57 +08:00
parent 1fc85c990f
commit ad100083ed
7 changed files with 382 additions and 40 deletions

View File

@@ -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.WmsCoilWarehouseOperationLogVo;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogExportVo;
import com.klp.domain.bo.WmsCoilWarehouseOperationLogBo;
import com.klp.service.IWmsCoilWarehouseOperationLogService;
import com.klp.common.core.page.TableDataInfo;
@@ -151,4 +152,26 @@ public class WmsCoilWarehouseOperationLogController extends BaseController {
@RequestParam(required = false) Date endTime) {
return R.ok(iWmsCoilWarehouseOperationLogService.queryByCoilId(coilId, operationType, inOutType, startTime, endTime));
}
/**
* 导出钢卷库区操作记录(报表导出)
*
* @param secondWarehouseId 二级库区ID
* @param operationType 操作类型
* @param inOutType 出入库类型
* @param startTime 开始时间
* @param endTime 结束时间
*/
@Log(title = "钢卷库区操作记录导出", businessType = BusinessType.EXPORT)
@PostMapping("/exportByWarehouseAndTime")
public void exportByWarehouseAndTime(
@RequestParam Long secondWarehouseId,
@RequestParam(required = false) Integer operationType,
@RequestParam(required = false) Integer inOutType,
@RequestParam(required = false) Date startTime,
@RequestParam(required = false) Date endTime,
HttpServletResponse response) {
List<WmsCoilWarehouseOperationLogExportVo> list = iWmsCoilWarehouseOperationLogService.exportBySecondWarehouseIdAndTimeRange(secondWarehouseId, operationType, inOutType, startTime, endTime);
ExcelUtil.exportExcel(list, "钢卷库区操作记录导出", WmsCoilWarehouseOperationLogExportVo.class, response);
}
}

View File

@@ -0,0 +1,106 @@
package com.klp.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 钢卷库区操作记录导出VO
*
* @author klp
* @date 2026-03-24
*/
@Data
@ExcelIgnoreUnannotated
public class WmsCoilWarehouseOperationLogExportVo {
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "创建人")
private String createBy;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ExcelProperty(value = "创建时间")
private Date createTimeLog;
@ExcelProperty(value = "业务操作类型")
private String operationTypeDesc;
@ExcelProperty(value = "出入库方向")
private String inOutTypeDesc;
// 应该是被移动库区
@ExcelProperty(value = "库区")
private String warehouseName;
@ExcelProperty(value = "类型")
private String itemTypeDesc;
@ExcelProperty(value = "逻辑库区")
private String logicalWarehouseName;
@ExcelProperty(value = "钢卷当前实际库区")
private String actualWarehouseName;
@ExcelProperty(value = "入场卷号")
private String enterCoilNo;
@ExcelProperty(value = "厂家卷号")
private String supplierCoilNo;
@ExcelProperty(value = "成品卷号")
private String currentCoilNo;
@ExcelProperty(value = "日期")
private Date createTime;
@ExcelProperty(value = "重量")
private BigDecimal netWeight;
@ExcelProperty(value = "用途")
private String purpose;
@ExcelProperty(value = "切边要求")
private String trimmingRequirement;
@ExcelProperty(value = "包装种类")
private String packagingRequirement;
@ExcelProperty(value = "产品质量")
private String qualityStatus;
@ExcelProperty(value = "打包状态")
private String packingStatus;
@ExcelProperty(value = "库存状态")
private String statusDesc;
@ExcelProperty(value = "备注")
private String remark;
@ExcelProperty(value = "名称")
private String itemName;
@ExcelProperty(value = "规格")
private String specification;
@ExcelProperty(value = "长度")
private BigDecimal length;
@ExcelProperty(value = "材质")
private String material;
@ExcelProperty(value = "厂家")
private String manufacturer;
@ExcelProperty(value = "表面处理")
private String surfaceTreatmentDesc;
@ExcelProperty(value = "锌层")
private String zincLayer;
}

View File

@@ -5,6 +5,7 @@ import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.klp.common.annotation.ExcelDictFormat;
import com.klp.common.convert.ExcelDictConvert;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@@ -18,7 +19,7 @@ import java.util.Date;
*/
@Data
@ExcelIgnoreUnannotated
public class WmsCoilWarehouseOperationLogVo {
public class WmsCoilWarehouseOperationLogVo extends BaseEntity {
private static final long serialVersionUID = 1L;

View File

@@ -3,6 +3,10 @@ package com.klp.mapper;
import com.klp.domain.WmsCoilWarehouseOperationLog;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogVo;
import com.klp.common.core.mapper.BaseMapperPlus;
import org.apache.ibatis.annotations.Param;
import java.util.Date;
import java.util.List;
/**
* 钢卷库区操作记录Mapper接口
@@ -12,4 +16,9 @@ import com.klp.common.core.mapper.BaseMapperPlus;
*/
public interface WmsCoilWarehouseOperationLogMapper extends BaseMapperPlus<WmsCoilWarehouseOperationLogMapper, WmsCoilWarehouseOperationLog, WmsCoilWarehouseOperationLogVo> {
List<WmsCoilWarehouseOperationLogVo> selectVoListWithJoin(@Param("warehouseIds") List<Long> warehouseIds,
@Param("operationType") Integer operationType,
@Param("inOutType") Integer inOutType,
@Param("startTime") Date startTime,
@Param("endTime") Date endTime);
}

View File

@@ -8,6 +8,7 @@ import com.klp.common.core.domain.PageQuery;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogExportVo;
import java.util.Date;
import java.util.List;
@@ -72,4 +73,16 @@ public interface IWmsCoilWarehouseOperationLogService {
* @return 操作记录列表(含钢卷信息和库区信息)
*/
List<WmsCoilWarehouseOperationLogVo> queryByCoilId(Long coilId, Integer operationType, Integer inOutType, Date startTime, Date endTime);
/**
* 导出钢卷库区操作记录(报表导出)
*
* @param secondWarehouseId 二级库区ID
* @param operationType 操作类型
* @param inOutType 出入库类型
* @param startTime 开始时间
* @param endTime 结束时间
* @return 导出数据列表
*/
List<WmsCoilWarehouseOperationLogExportVo> exportBySecondWarehouseIdAndTimeRange(Long secondWarehouseId, Integer operationType, Integer inOutType, Date startTime, Date endTime);
}

View File

@@ -17,7 +17,10 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.domain.bo.WmsCoilWarehouseOperationLogBo;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogVo;
import com.klp.domain.vo.WmsCoilWarehouseOperationLogExportVo;
import com.klp.domain.vo.WmsMaterialCoilVo;
import com.klp.domain.vo.WmsRawMaterialVo;
import com.klp.domain.vo.WmsProductVo;
import com.klp.domain.WmsCoilWarehouseOperationLog;
import com.klp.mapper.WmsCoilWarehouseOperationLogMapper;
import com.klp.service.IWmsCoilWarehouseOperationLogService;
@@ -134,52 +137,49 @@ public class WmsCoilWarehouseOperationLogServiceImpl implements IWmsCoilWarehous
return new ArrayList<>();
}
LambdaQueryWrapper<WmsCoilWarehouseOperationLog> lqw = Wrappers.lambdaQuery();
lqw.in(WmsCoilWarehouseOperationLog::getActualWarehouseId, warehouseIds);
lqw.eq(operationType != null, WmsCoilWarehouseOperationLog::getOperationType, operationType);
lqw.eq(inOutType != null, WmsCoilWarehouseOperationLog::getInOutType, inOutType);
lqw.ge(startTime != null, WmsCoilWarehouseOperationLog::getCreateTime, startTime);
lqw.le(endTime != null, WmsCoilWarehouseOperationLog::getCreateTime, endTime);
lqw.orderByDesc(WmsCoilWarehouseOperationLog::getCreateTime);
List<WmsCoilWarehouseOperationLogVo> list = baseMapper.selectVoList(lqw);
Set<Long> coilIds = list.stream()
.map(WmsCoilWarehouseOperationLogVo::getCoilId)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
Map<Long, WmsMaterialCoilVo> coilMap = new HashMap<>();
if (!coilIds.isEmpty()) {
WmsMaterialCoilBo bo = new WmsMaterialCoilBo();
bo.setCoilIds(coilIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
List<WmsMaterialCoilVo> coils = wmsMaterialCoilService.queryList(bo);
for (WmsMaterialCoilVo coil : coils) {
coilMap.put(coil.getCoilId(), coil);
}
}
Map<Long, WmsActualWarehouseVo> warehouseMap = new HashMap<>();
if (!warehouseIds.isEmpty()) {
LambdaQueryWrapper<WmsActualWarehouse> warehouseQuery = Wrappers.lambdaQuery();
warehouseQuery.in(WmsActualWarehouse::getActualWarehouseId, warehouseIds);
List<WmsActualWarehouse> warehouses = wmsActualWarehouseMapper.selectList(warehouseQuery);
for (WmsActualWarehouse warehouse : warehouses) {
WmsActualWarehouseVo vo = BeanUtil.toBean(warehouse, WmsActualWarehouseVo.class);
warehouseMap.put(warehouse.getActualWarehouseId(), vo);
}
}
List<WmsCoilWarehouseOperationLogVo> list = baseMapper.selectVoListWithJoin(new ArrayList<>(warehouseIds), operationType, inOutType, startTime, endTime);
for (WmsCoilWarehouseOperationLogVo vo : list) {
vo.setCoil(coilMap.get(vo.getCoilId()));
vo.setWarehouse(warehouseMap.get(vo.getActualWarehouseId()));
if (vo.getCoil() != null) {
buildItemObjectFromJoin(vo.getCoil());
}
}
return list;
}
private void buildItemObjectFromJoin(WmsMaterialCoilVo vo) {
if (vo.getItemId() == null || vo.getItemType() == null) {
return;
}
if ("raw_material".equals(vo.getItemType())) {
WmsRawMaterialVo rawMaterial = new WmsRawMaterialVo();
rawMaterial.setRawMaterialId(vo.getItemId());
rawMaterial.setRawMaterialCode(vo.getItemCode());
rawMaterial.setRawMaterialName(vo.getItemName());
rawMaterial.setSpecification(vo.getSpecification());
rawMaterial.setMaterial(vo.getMaterial());
rawMaterial.setManufacturer(vo.getManufacturer());
rawMaterial.setSurfaceTreatmentDesc(vo.getSurfaceTreatmentDesc());
rawMaterial.setZincLayer(vo.getZincLayer());
vo.setRawMaterial(rawMaterial);
}
if ("product".equals(vo.getItemType())) {
WmsProductVo product = new WmsProductVo();
product.setProductId(vo.getItemId());
product.setProductCode(vo.getItemCode());
product.setProductName(vo.getItemName());
product.setSpecification(vo.getSpecification());
product.setMaterial(vo.getMaterial());
product.setManufacturer(vo.getManufacturer());
product.setSurfaceTreatmentDesc(vo.getSurfaceTreatmentDesc());
product.setZincLayer(vo.getZincLayer());
vo.setProduct(product);
}
}
private Set<Long> getAllChildWarehouseIds(Long parentId) {
Set<Long> result = new HashSet<>();
if (parentId == null) {
@@ -258,4 +258,84 @@ public class WmsCoilWarehouseOperationLogServiceImpl implements IWmsCoilWarehous
return list;
}
@Override
public List<WmsCoilWarehouseOperationLogExportVo> exportBySecondWarehouseIdAndTimeRange(Long secondWarehouseId, Integer operationType, Integer inOutType, Date startTime, Date endTime) {
List<WmsCoilWarehouseOperationLogVo> voList = queryBySecondWarehouseIdAndTimeRange(secondWarehouseId, operationType, inOutType, startTime, endTime);
List<WmsCoilWarehouseOperationLogExportVo> exportList = new ArrayList<>();
for (WmsCoilWarehouseOperationLogVo vo : voList) {
WmsCoilWarehouseOperationLogExportVo exportVo = new WmsCoilWarehouseOperationLogExportVo();
WmsMaterialCoilVo coil = vo.getCoil();
if (coil != null) {
exportVo.setEnterCoilNo(coil.getEnterCoilNo());
exportVo.setCurrentCoilNo(coil.getCurrentCoilNo());
exportVo.setSupplierCoilNo(coil.getSupplierCoilNo());
exportVo.setNetWeight(coil.getNetWeight());
exportVo.setItemTypeDesc(coil.getItemType());
exportVo.setPurpose(coil.getBusinessPurpose());
exportVo.setTrimmingRequirement(coil.getTrimmingRequirement());
exportVo.setPackagingRequirement(coil.getPackagingRequirement());
exportVo.setQualityStatus(coil.getQualityStatus());
exportVo.setPackingStatus(coil.getPackingStatus());
exportVo.setStatusDesc(getStatusDesc(coil.getStatus()));
exportVo.setItemName(coil.getItemName());
exportVo.setSpecification(coil.getSpecification());
exportVo.setLength(coil.getLength());
exportVo.setMaterial(coil.getMaterial());
exportVo.setManufacturer(coil.getManufacturer());
exportVo.setSurfaceTreatmentDesc(coil.getSurfaceTreatmentDesc());
exportVo.setZincLayer(coil.getZincLayer());
exportVo.setCreateTime(coil.getCreateTime());
exportVo.setLogicalWarehouseName(coil.getWarehouseName());
exportVo.setActualWarehouseName(coil.getActualWarehouseName());
}
WmsActualWarehouseVo warehouse = vo.getWarehouse();
if (warehouse != null) {
exportVo.setWarehouseName(warehouse.getActualWarehouseName());
}
exportVo.setOperationTypeDesc(getOperationTypeDesc(vo.getOperationType()));
exportVo.setInOutTypeDesc(getInOutTypeDesc(vo.getInOutType()));
exportVo.setCreateBy(vo.getCreateBy());
exportVo.setCreateTimeLog(vo.getCreateTime());
exportVo.setRemark(vo.getRemark());
exportList.add(exportVo);
}
return exportList;
}
private String getStatusDesc(Integer status) {
if (status == null) return null;
switch (status) {
case 0: return "在库";
case 1: return "在途";
case 2: return "已出库";
default: return String.valueOf(status);
}
}
private String getOperationTypeDesc(Integer operationType) {
if (operationType == null) return null;
switch (operationType) {
case 1: return "收货";
case 2: return "加工";
case 3: return "调拨";
case 4: return "发货";
default: return String.valueOf(operationType);
}
}
private String getInOutTypeDesc(Integer inOutType) {
if (inOutType == null) return null;
switch (inOutType) {
case 1: return "入库";
case 2: return "出库";
default: return String.valueOf(inOutType);
}
}
}