liding
4 天以前 18d292f1091b8b86ad29ba76e3cbe8ffaf2c222e
main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java
@@ -1,11 +1,29 @@
package com.ruoyi.business.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.basic.entity.CoalField;
import com.ruoyi.basic.entity.CoalValue;
import com.ruoyi.basic.mapper.CoalFieldMapper;
import com.ruoyi.basic.mapper.CoalValueMapper;
import com.ruoyi.business.dto.OfficialInventoryDto;
import com.ruoyi.business.entity.OfficialInventory;
import com.ruoyi.business.mapper.OfficialInventoryMapper;
import com.ruoyi.business.service.OfficialInventoryService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import com.ruoyi.business.vo.OfficialInventoryVo;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
 * <p>
@@ -19,4 +37,178 @@
@RequiredArgsConstructor
public class OfficialInventoryServiceImpl extends ServiceImpl<OfficialInventoryMapper, OfficialInventory> implements OfficialInventoryService {
    private final OfficialInventoryMapper officialInventoryMapper;
    private final CoalValueMapper coalValueMapper;
    private final CoalFieldMapper coalFieldMapper;
    @Override
    public IPage<OfficialInventoryDto> selectOfficialInventoryList(Page page, OfficialInventoryDto officialInventoryDto) {
        //  先查出原始数据(OfficialInventory)
        LambdaQueryWrapper<OfficialInventory> queryWrapper = new LambdaQueryWrapper<>();
        IPage<OfficialInventory> entityPage = officialInventoryMapper.selectPage(page, queryWrapper);
        //  创建一个新的 Dto 分页结果
        IPage<OfficialInventoryDto> dtoPage = new Page<>();
        BeanUtils.copyProperties(entityPage, dtoPage);
        List<OfficialInventoryDto> dtoList = new ArrayList<>();
        //  查询所有可用字段(CoalField)
        List<CoalField> coalFields = coalFieldMapper.selectList(null);
        List<String> allFieldNames = coalFields.stream()
                .map(CoalField::getFields)
                .distinct()
                .collect(Collectors.toList());
        //  遍历每条记录,进行转换并填充 fields
        for (OfficialInventory entity : entityPage.getRecords()) {
            OfficialInventoryDto dto = new OfficialInventoryDto();
            BeanUtils.copyProperties(entity, dto);
            List<CoalValue> coalValues;
            if (entity.getMergeId() == null) {
                coalValues = coalValueMapper.selectList(new LambdaQueryWrapper<CoalValue>()
                        .eq(CoalValue::getPlanId, entity.getPendingId())
                        .and(wrapper -> wrapper.ne(CoalValue::getType, "2").or().isNull(CoalValue::getType))
                );
            } else {
                coalValues = coalValueMapper.selectList(new LambdaQueryWrapper<CoalValue>()
                        .eq(CoalValue::getPlanId, entity.getId())
                        .eq(CoalValue::getType, "2")
                );
            }
            //  构建 Map<fieldName, value>
            Map<String, String> fieldValueMap = coalValues.stream()
                    .collect(Collectors.toMap(
                            CoalValue::getFields,
                            CoalValue::getCoalValue,
                            (existing, replacement) -> existing // 重复字段保留第一个
                    ));
            // 构造最终 fields 列表,包含所有字段名,并设置默认值 "-"
            List<Map<String, String>> fields = new ArrayList<>();
            for (String field : allFieldNames) {
                Map<String, String> fieldMap = new HashMap<>();
                fieldMap.put(field, fieldValueMap.getOrDefault(field, "-"));
                fields.add(fieldMap);
            }
            // 设置到 DTO 中
            dto.setFields(fields);
            dtoList.add(dto);
        }
        dtoPage.setRecords(dtoList); // 设置转换后的 DtoList
        return dtoPage;
    }
    @Override
    public int editOfficial(OfficialInventoryDto officialInventoryDto) {
        OfficialInventory officialInventory = new OfficialInventory();
        BeanUtils.copyProperties(officialInventoryDto, officialInventory);
        return officialInventoryMapper.updateById(officialInventory);
    }
    @Override
    public List<OfficialInventoryVo> selectOfficialList(OfficialInventoryVo officialInventoryVo) {
        List<OfficialInventory> officialInventories = officialInventoryMapper.selectList(null);
        return officialInventories.stream()
                .map(OI -> {
                    OfficialInventoryVo vo = new OfficialInventoryVo();
                    BeanUtils.copyProperties(OI, vo);
                    return vo;
                })
                .collect(Collectors.toList());
    }
    @Transactional
    @Override
    public int mergeAll(OfficialInventoryDto officialInventoryDto) {
        List<Long> ids = officialInventoryDto.getIds();
        // 校验参数
        if (CollectionUtils.isEmpty(ids) || ids.size() < 2) {
            throw new BaseException("请选中至少两条数据");
        }
        if (CollectionUtils.isEmpty(officialInventoryDto.getFields())) {
            throw new BaseException("字段值不能为空");
        }
        // 1. 批量标记删除旧数据
        LambdaUpdateWrapper<OfficialInventory> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.in(OfficialInventory::getId, ids)
                .set(OfficialInventory::getDeleted, 1);
        int rowsAffected = officialInventoryMapper.update(null, updateWrapper);
        if (rowsAffected == 0) {
            throw new BaseException("未找到匹配的数据,请确认选择是否正确");
        }
        // 2. 插入新库存记录
        OfficialInventory officialInventory = new OfficialInventory();
        BeanUtils.copyProperties(officialInventoryDto, officialInventory);
        officialInventory.setMergeId(ids.toString());
        officialInventory.setRegistrantId(SecurityUtils.getLoginUser().getUser().getUserName());
        if (officialInventoryMapper.insert(officialInventory) <= 0) {
            throw new BaseException("库存记录创建失败");
        }
        // 3. 批量处理字段值
        batchProcessCoalValues(officialInventory.getId(), officialInventoryDto.getFields());
        return rowsAffected;
    }
    private void batchProcessCoalValues(Long planId, List<Map<String, String>> fields) {
        // 1. 提取所有唯一字段标识
        Set<String> allFields = fields.stream()
                .flatMap(map -> map.keySet().stream())
                .collect(Collectors.toSet());
        // 2. 查询字段映射关系
        List<CoalField> coalFields = coalFieldMapper.selectList(
                new LambdaQueryWrapper<CoalField>().in(CoalField::getFields, allFields)
        );
        Map<String, String> fieldMap = coalFields.stream()
                .collect(Collectors.toMap(
                        CoalField::getFields,
                        CoalField::getFieldName
                ));
        // 3. 构造并插入每条记录
        CoalValue coalValueTemplate = new CoalValue();
        coalValueTemplate.setPlanId(planId);
        coalValueTemplate.setType("2");
        for (Map<String, String> fieldMapEntry : fields) {
            for (Map.Entry<String, String> entry : fieldMapEntry.entrySet()) {
                String key = entry.getKey();
                String value = entry.getValue();
                String fieldName = fieldMap.get(key);
                if (fieldName == null) {
                    throw new BaseException("字段名不存在: " + key);
                }
                CoalValue coalValue = new CoalValue();
                BeanUtils.copyProperties(coalValueTemplate, coalValue); // 复用模板属性
                coalValue.setId(null);
                coalValue.setCoalValue(value);
                coalValue.setType("2");
                coalValue.setPlanId(planId);
                coalValue.setFields(key);
                coalValue.setFieldName(fieldName);
                // 单条插入
                int result = coalValueMapper.insert(coalValue);
                if (result <= 0) {
                    throw new BaseException("字段值保存失败,字段:" + key);
                }
            }
        }
    }
}