liding
3 天以前 dc9010b9fc4ca6929992bfc3cc4fa110ebc24b2c
main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java
@@ -1,7 +1,9 @@
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;
@@ -11,16 +13,16 @@
import com.ruoyi.business.dto.OfficialInventoryDto;
import com.ruoyi.business.entity.OfficialInventory;
import com.ruoyi.business.mapper.OfficialInventoryMapper;
import com.ruoyi.business.mapper.PendingInventoryMapper;
import com.ruoyi.business.service.OfficialInventoryService;
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.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -41,7 +43,6 @@
    private final CoalFieldMapper coalFieldMapper;
    private final PendingInventoryMapper pendingInventoryMapper;
    @Override
    public IPage<OfficialInventoryDto> selectOfficialInventoryList(Page page, OfficialInventoryDto officialInventoryDto) {
@@ -66,14 +67,19 @@
        //  遍历每条记录,进行转换并填充 fields
        for (OfficialInventory entity : entityPage.getRecords()) {
            OfficialInventoryDto dto = new OfficialInventoryDto();
            BeanUtils.copyProperties(entity, dto);
            Long pendingId = entity.getPendingId();
            //  查询该 pendingId 对应的 CoalValue 数据
            List<CoalValue> coalValues = coalValueMapper.selectList(
                    new LambdaQueryWrapper<CoalValue>().eq(CoalValue::getPlanId, pendingId)
            );
            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()
@@ -99,4 +105,115 @@
        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());
    }
    @Override
    public List<OfficialInventory> selectOfficialAll() {
        return officialInventoryMapper.selectList(null);
    }
    @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);
                }
            }
        }
    }
}