From dc9010b9fc4ca6929992bfc3cc4fa110ebc24b2c Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期四, 12 六月 2025 17:45:39 +0800
Subject: [PATCH] 采购优化

---
 main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java |  194 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 190 insertions(+), 4 deletions(-)

diff --git a/main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java b/main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java
index fdc9186..76ef631 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java
@@ -1,15 +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>
@@ -25,9 +39,181 @@
 
     private final OfficialInventoryMapper officialInventoryMapper;
 
+    private final CoalValueMapper coalValueMapper;
+
+    private final CoalFieldMapper coalFieldMapper;
+
+
     @Override
-    public IPage<OfficialInventory> selectOfficialInventoryList(Page page, OfficialInventoryDto officialInventoryDto) {
+    public IPage<OfficialInventoryDto> selectOfficialInventoryList(Page page, OfficialInventoryDto officialInventoryDto) {
+
+        //  鍏堟煡鍑哄師濮嬫暟鎹紙OfficialInventory锛�
         LambdaQueryWrapper<OfficialInventory> queryWrapper = new LambdaQueryWrapper<>();
-        return officialInventoryMapper.selectPage(page, queryWrapper);
+        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());
+    }
+
+    @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("鏈壘鍒板尮閰嶇殑鏁版嵁锛岃纭閫夋嫨鏄惁姝g‘");
+        }
+
+        // 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);
+                }
+            }
+        }
     }
 }

--
Gitblit v1.9.3