- 在WmsCoilWarehouseOperationLogBo中新增actualWarehouseIds字段用于存储逗号分隔的库区ID - 集成StringUtils工具类支持字符串判空处理 - 实现actualWarehouseId与actualWarehouseIds的统一查询逻辑 - 支持单值和多值库区ID的同时检索 - 添加数字格式验证避免解析异常 - 使用distinct去重确保查询条件的准确性
407 lines
18 KiB
Java
407 lines
18 KiB
Java
package com.klp.service.impl;
|
||
|
||
import cn.hutool.core.bean.BeanUtil;
|
||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||
import com.klp.common.core.page.TableDataInfo;
|
||
import com.klp.common.utils.StringUtils;
|
||
import com.klp.common.core.domain.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 com.klp.domain.WmsActualWarehouse;
|
||
import com.klp.domain.WmsMaterialCoil;
|
||
import com.klp.domain.bo.WmsMaterialCoilBo;
|
||
import com.klp.domain.vo.WmsActualWarehouseVo;
|
||
import com.klp.mapper.WmsActualWarehouseMapper;
|
||
import com.klp.service.IWmsMaterialCoilService;
|
||
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.WmsCoilWarehouseOperationLogStatisticsVo;
|
||
import java.math.BigDecimal;
|
||
import com.klp.domain.vo.WmsMaterialCoilVo;
|
||
import com.klp.domain.WmsCoilWarehouseOperationLog;
|
||
import com.klp.mapper.WmsCoilWarehouseOperationLogMapper;
|
||
import com.klp.service.IWmsCoilWarehouseOperationLogService;
|
||
|
||
import java.util.*;
|
||
import java.util.stream.Collectors;
|
||
|
||
/**
|
||
* 钢卷库区操作记录Service业务层处理
|
||
*
|
||
* @author klp
|
||
* @date 2026-03-05
|
||
*/
|
||
@RequiredArgsConstructor
|
||
@Service
|
||
public class WmsCoilWarehouseOperationLogServiceImpl implements IWmsCoilWarehouseOperationLogService {
|
||
|
||
private final WmsCoilWarehouseOperationLogMapper baseMapper;
|
||
private final WmsActualWarehouseMapper wmsActualWarehouseMapper;
|
||
private final IWmsMaterialCoilService wmsMaterialCoilService;
|
||
|
||
/**
|
||
* 查询钢卷库区操作记录
|
||
*/
|
||
@Override
|
||
public WmsCoilWarehouseOperationLogVo queryById(Long logId){
|
||
return baseMapper.selectVoById(logId);
|
||
}
|
||
|
||
/**
|
||
* 查询钢卷库区操作记录列表
|
||
*/
|
||
@Override
|
||
public TableDataInfo<WmsCoilWarehouseOperationLogVo> queryPageList(WmsCoilWarehouseOperationLogBo bo, PageQuery pageQuery) {
|
||
LambdaQueryWrapper<WmsCoilWarehouseOperationLog> lqw = buildQueryWrapper(bo);
|
||
Page<WmsCoilWarehouseOperationLogVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
|
||
|
||
List<WmsCoilWarehouseOperationLogVo> records = result.getRecords();
|
||
|
||
Set<Long> coilIds = records.stream()
|
||
.map(WmsCoilWarehouseOperationLogVo::getCoilId)
|
||
.filter(Objects::nonNull)
|
||
.collect(Collectors.toSet());
|
||
|
||
Set<Long> warehouseIds = records.stream()
|
||
.map(WmsCoilWarehouseOperationLogVo::getActualWarehouseId)
|
||
.filter(Objects::nonNull)
|
||
.collect(Collectors.toSet());
|
||
|
||
Map<Long, WmsMaterialCoilVo> coilMap = new HashMap<>();
|
||
if (!coilIds.isEmpty()) {
|
||
WmsMaterialCoilBo coilBo = new WmsMaterialCoilBo();
|
||
coilBo.setCoilIds(coilIds.stream().map(String::valueOf).collect(Collectors.joining(",")));
|
||
List<WmsMaterialCoilVo> coils = wmsMaterialCoilService.queryList(coilBo);
|
||
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);
|
||
}
|
||
}
|
||
|
||
for (WmsCoilWarehouseOperationLogVo vo : records) {
|
||
vo.setCoil(coilMap.get(vo.getCoilId()));
|
||
vo.setWarehouse(warehouseMap.get(vo.getActualWarehouseId()));
|
||
}
|
||
|
||
TableDataInfo<WmsCoilWarehouseOperationLogVo> tabledata = TableDataInfo.build(result);
|
||
return tabledata;
|
||
}
|
||
|
||
/**
|
||
* 查询钢卷库区操作记录列表
|
||
*/
|
||
@Override
|
||
public List<WmsCoilWarehouseOperationLogVo> queryList(WmsCoilWarehouseOperationLogBo bo) {
|
||
LambdaQueryWrapper<WmsCoilWarehouseOperationLog> lqw = buildQueryWrapper(bo);
|
||
return baseMapper.selectVoList(lqw);
|
||
}
|
||
|
||
private LambdaQueryWrapper<WmsCoilWarehouseOperationLog> buildQueryWrapper(WmsCoilWarehouseOperationLogBo bo) {
|
||
Map<String, Object> params = bo.getParams();
|
||
LambdaQueryWrapper<WmsCoilWarehouseOperationLog> lqw = Wrappers.lambdaQuery();
|
||
lqw.eq(bo.getCoilId() != null, WmsCoilWarehouseOperationLog::getCoilId, bo.getCoilId());
|
||
// 统一处理 actualWarehouseId 与 actualWarehouseIds(实际库区):单值和逗号分隔多值统一收集
|
||
List<Long> actualWarehouseIdList = new ArrayList<>();
|
||
if (bo.getActualWarehouseId() != null) {
|
||
actualWarehouseIdList.add(bo.getActualWarehouseId());
|
||
}
|
||
if (StringUtils.isNotBlank(bo.getActualWarehouseIds())) {
|
||
String[] actualWarehouseIdArray = bo.getActualWarehouseIds().split(",");
|
||
for (String actualWarehouseIdStr : actualWarehouseIdArray) {
|
||
if (StringUtils.isNotBlank(actualWarehouseIdStr)) {
|
||
try {
|
||
actualWarehouseIdList.add(Long.parseLong(actualWarehouseIdStr.trim()));
|
||
} catch (NumberFormatException ignore) {
|
||
}
|
||
}
|
||
}
|
||
}
|
||
if (!actualWarehouseIdList.isEmpty()) {
|
||
lqw.in(WmsCoilWarehouseOperationLog::getActualWarehouseId,
|
||
actualWarehouseIdList.stream().distinct().collect(Collectors.toList()));
|
||
}
|
||
lqw.eq(bo.getOperationType() != null, WmsCoilWarehouseOperationLog::getOperationType, bo.getOperationType());
|
||
lqw.eq(bo.getInOutType() != null, WmsCoilWarehouseOperationLog::getInOutType, bo.getInOutType());
|
||
lqw.eq(bo.getCreateBy() != null, WmsCoilWarehouseOperationLog::getCreateBy, bo.getCreateBy());
|
||
lqw.ge(bo.getCreateStartTime() != null, WmsCoilWarehouseOperationLog::getCreateTime, bo.getCreateStartTime());
|
||
lqw.le(bo.getCreateEndTime() != null, WmsCoilWarehouseOperationLog::getCreateTime, bo.getCreateEndTime());
|
||
return lqw;
|
||
}
|
||
|
||
/**
|
||
* 新增钢卷库区操作记录
|
||
*/
|
||
@Override
|
||
public Boolean insertByBo(WmsCoilWarehouseOperationLogBo bo) {
|
||
WmsCoilWarehouseOperationLog add = BeanUtil.toBean(bo, WmsCoilWarehouseOperationLog.class);
|
||
validEntityBeforeSave(add);
|
||
boolean flag = baseMapper.insert(add) > 0;
|
||
if (flag) {
|
||
bo.setLogId(add.getLogId());
|
||
}
|
||
return flag;
|
||
}
|
||
|
||
/**
|
||
* 修改钢卷库区操作记录
|
||
*/
|
||
@Override
|
||
public Boolean updateByBo(WmsCoilWarehouseOperationLogBo bo) {
|
||
WmsCoilWarehouseOperationLog update = BeanUtil.toBean(bo, WmsCoilWarehouseOperationLog.class);
|
||
validEntityBeforeSave(update);
|
||
return baseMapper.updateById(update) > 0;
|
||
}
|
||
|
||
/**
|
||
* 保存前的数据校验
|
||
*/
|
||
private void validEntityBeforeSave(WmsCoilWarehouseOperationLog entity){
|
||
//TODO 做一些数据校验,如唯一约束
|
||
}
|
||
|
||
/**
|
||
* 批量删除钢卷库区操作记录
|
||
*/
|
||
@Override
|
||
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
||
if(isValid){
|
||
//TODO 做一些业务上的校验,判断是否需要校验
|
||
}
|
||
return baseMapper.deleteBatchIds(ids) > 0;
|
||
}
|
||
|
||
@Override
|
||
public boolean deleteByCoilIdAndTypes(Long coilId, String operationType, String inOutType) {
|
||
LambdaQueryWrapper<WmsCoilWarehouseOperationLog> lqw = Wrappers.lambdaQuery();
|
||
lqw.eq(WmsCoilWarehouseOperationLog::getCoilId, coilId);
|
||
lqw.eq(WmsCoilWarehouseOperationLog::getOperationType, operationType);
|
||
lqw.eq(WmsCoilWarehouseOperationLog::getInOutType, inOutType);
|
||
return baseMapper.delete(lqw) > 0;
|
||
}
|
||
|
||
@Override
|
||
public List<WmsCoilWarehouseOperationLogVo> queryBySecondWarehouseIdAndTimeRange(Long secondWarehouseId, Integer operationType, Integer inOutType, Date startTime, Date endTime) {
|
||
Set<Long> warehouseIds = getAllChildWarehouseIds(secondWarehouseId);
|
||
if (warehouseIds.isEmpty()) {
|
||
return new ArrayList<>();
|
||
}
|
||
|
||
List<WmsCoilWarehouseOperationLogVo> list = baseMapper.selectVoListWithJoin(new ArrayList<>(warehouseIds), operationType, inOutType, startTime, endTime);
|
||
|
||
for (WmsCoilWarehouseOperationLogVo vo : list) {
|
||
if (vo.getCoil() != null) {
|
||
buildItemObjectFromJoin(vo.getCoil());
|
||
}
|
||
}
|
||
|
||
return list;
|
||
}
|
||
|
||
private void buildItemObjectFromJoin(WmsMaterialCoilVo vo) {
|
||
// no-op: WmsMaterialCoilVo 改为仅返回扁平字段,不再构建嵌套对象
|
||
}
|
||
|
||
private Set<Long> getAllChildWarehouseIds(Long parentId) {
|
||
Set<Long> result = new HashSet<>();
|
||
if (parentId == null) {
|
||
return result;
|
||
}
|
||
result.add(parentId);
|
||
LambdaQueryWrapper<WmsActualWarehouse> lqw = Wrappers.lambdaQuery();
|
||
lqw.select(WmsActualWarehouse::getActualWarehouseId, WmsActualWarehouse::getParentId);
|
||
List<WmsActualWarehouse> allWarehouses = wmsActualWarehouseMapper.selectList(lqw);
|
||
Map<Long, List<Long>> parentChildrenMap = allWarehouses.stream()
|
||
.filter(w -> w.getParentId() != null)
|
||
.collect(java.util.stream.Collectors.groupingBy(
|
||
WmsActualWarehouse::getParentId,
|
||
java.util.stream.Collectors.mapping(WmsActualWarehouse::getActualWarehouseId, java.util.stream.Collectors.toList())
|
||
));
|
||
java.util.Queue<Long> queue = new java.util.LinkedList<>();
|
||
queue.offer(parentId);
|
||
while (!queue.isEmpty()) {
|
||
Long currentId = queue.poll();
|
||
List<Long> children = parentChildrenMap.get(currentId);
|
||
if (children != null && !children.isEmpty()) {
|
||
result.addAll(children);
|
||
queue.addAll(children);
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
@Override
|
||
public List<WmsCoilWarehouseOperationLogVo> queryByCoilId(Long coilId, Integer operationType, Integer inOutType, Date startTime, Date endTime) {
|
||
LambdaQueryWrapper<WmsCoilWarehouseOperationLog> lqw = Wrappers.lambdaQuery();
|
||
lqw.eq(WmsCoilWarehouseOperationLog::getCoilId, coilId);
|
||
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());
|
||
|
||
Set<Long> warehouseIds = list.stream()
|
||
.map(WmsCoilWarehouseOperationLogVo::getActualWarehouseId)
|
||
.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);
|
||
}
|
||
}
|
||
|
||
for (WmsCoilWarehouseOperationLogVo vo : list) {
|
||
vo.setCoil(coilMap.get(vo.getCoilId()));
|
||
vo.setWarehouse(warehouseMap.get(vo.getActualWarehouseId()));
|
||
}
|
||
|
||
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() != null ? BigDecimal.valueOf(coil.getLength()) : null);
|
||
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);
|
||
}
|
||
}
|
||
|
||
@Override
|
||
public WmsCoilWarehouseOperationLogStatisticsVo statistics(WmsCoilWarehouseOperationLogBo bo) {
|
||
Long actualWarehouseId = bo.getActualWarehouseId();
|
||
Integer operationType = bo.getOperationType();
|
||
Integer inOutType = bo.getInOutType();
|
||
String createBy = bo.getCreateBy();
|
||
Date startTime = bo.getCreateStartTime();
|
||
Date endTime = bo.getCreateEndTime();
|
||
|
||
// 一次 RPC 内三次轻量 GROUP BY 查询,远比拉取全量 rows 再聚合快
|
||
WmsCoilWarehouseOperationLogStatisticsVo summary =
|
||
baseMapper.selectStatisticsSummary(actualWarehouseId, operationType, inOutType, createBy, startTime, endTime);
|
||
|
||
List<WmsCoilWarehouseOperationLogStatisticsVo.UserSummary> userSummary =
|
||
baseMapper.selectUserSummary(actualWarehouseId, operationType, inOutType, createBy, startTime, endTime);
|
||
|
||
List<WmsCoilWarehouseOperationLogStatisticsVo.TrendItem> trendData =
|
||
baseMapper.selectTrendData(actualWarehouseId, operationType, inOutType, createBy, startTime, endTime);
|
||
|
||
if (summary == null) {
|
||
summary = new WmsCoilWarehouseOperationLogStatisticsVo();
|
||
summary.setTotalCount(0);
|
||
summary.setTotalWeight(BigDecimal.ZERO);
|
||
summary.setWarehouseCount(0);
|
||
}
|
||
summary.setUserSummary(userSummary);
|
||
summary.setTrendData(trendData);
|
||
return summary;
|
||
}
|
||
}
|