| | |
| | | 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.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; |
| | | |
| | | /** |
| | |
| | | |
| | | private final CoalFieldMapper coalFieldMapper; |
| | | |
| | | private final PendingInventoryMapper pendingInventoryMapper; |
| | | |
| | | @Override |
| | | public IPage<OfficialInventoryDto> selectOfficialInventoryList(Page page, OfficialInventoryDto officialInventoryDto) { |
| | |
| | | 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) |
| | | 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() |
| | |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |