From 94509204d25f7c0ad213ae2322be2bd5bfd17424 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 14 七月 2025 16:30:28 +0800
Subject: [PATCH] 1.初始化配煤计算器数据 2。配煤到待入库

---
 main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java |  352 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 349 insertions(+), 3 deletions(-)

diff --git a/main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java b/main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java
index ac74173..cacd7f6 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java
@@ -3,19 +3,53 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 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.mchange.v2.lang.SystemUtils;
+import com.ruoyi.basic.dto.CoalFieldDto;
+import com.ruoyi.basic.entity.CoalField;
+import com.ruoyi.basic.entity.CoalInfo;
+import com.ruoyi.basic.entity.CoalPlan;
+import com.ruoyi.basic.entity.CoalValue;
 import com.ruoyi.basic.mapper.CoalFieldMapper;
+import com.ruoyi.basic.mapper.CoalInfoMapper;
+import com.ruoyi.basic.mapper.CoalPlanMapper;
 import com.ruoyi.basic.mapper.CoalValueMapper;
+import com.ruoyi.basic.service.CoalFieldService;
+import com.ruoyi.basic.service.CoalPlanService;
+import com.ruoyi.basic.service.CoalValueService;
 import com.ruoyi.business.dto.PendingInventoryDto;
+import com.ruoyi.business.entity.OfficialInventory;
 import com.ruoyi.business.entity.PendingInventory;
+import com.ruoyi.business.entity.SalesRecord;
+import com.ruoyi.business.mapper.InventorySummaryMapper;
+import com.ruoyi.business.mapper.OfficialInventoryMapper;
 import com.ruoyi.business.mapper.PendingInventoryMapper;
+import com.ruoyi.business.mapper.SalesRecordMapper;
+import com.ruoyi.business.service.InputInventoryRecordService;
+import com.ruoyi.business.service.InventorySummaryService;
 import com.ruoyi.business.service.PendingInventoryService;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.system.mapper.SysUserMapper;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
-import java.util.Objects;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.format.DateTimeParseException;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
 
 /**
  * <p>
@@ -31,15 +65,137 @@
 
     private final PendingInventoryMapper pendingInventoryMapper;
 
+    private final OfficialInventoryMapper officialInventoryMapper;
+
     private final CoalValueMapper coalValueMapper;
 
     private final CoalFieldMapper coalFieldMapper;
 
+    private final CoalInfoMapper coalInfoMapper;
+
+    private final SysUserMapper sysUserMapper;
+
+    private final InputInventoryRecordService inputInventoryRecordService;
+
+    private final InventorySummaryService inventorySummaryService;
+    private final CoalPlanMapper coalPlanMapper;
+    private final CoalValueService coalValueService;
+
     @Override
-    public IPage<PendingInventory> selectPendingInventoryList(Page page, PendingInventoryDto pendingInventoryDto) {
+    public IPage<PendingInventoryDto> selectPendingInventoryList(Page page, PendingInventoryDto pendingInventoryDto) {
+        // 1. 鏋勫缓涓绘煡璇�
         LambdaQueryWrapper<PendingInventory> queryWrapper = new LambdaQueryWrapper<>();
+        if (pendingInventoryDto.getRegistrationDate() != null) {
+            queryWrapper.eq(PendingInventory::getRegistrationDate, pendingInventoryDto.getRegistrationDate());
+        }
+
+        // 鎸夌叅绉嶅悕绉版煡璇�
+        if (StringUtils.isNotBlank(pendingInventoryDto.getCoal())) {
+            LambdaQueryWrapper<CoalInfo> coalQueryWrapper = new LambdaQueryWrapper<>();
+            coalQueryWrapper.like(CoalInfo::getCoal, pendingInventoryDto.getCoal());
+            List<CoalInfo> coalInfos = coalInfoMapper.selectList(coalQueryWrapper);
+
+            if (!coalInfos.isEmpty()) {
+                List<Long> coalIds = coalInfos.stream()
+                        .map(CoalInfo::getId)
+                        .collect(Collectors.toList());
+                queryWrapper.in(PendingInventory::getCoalId, coalIds);
+            } else {
+                // 濡傛灉娌℃湁鍖归厤鐨勭叅绉嶏紝鐩存帴杩斿洖绌虹粨鏋�
+                queryWrapper.eq(PendingInventory::getCoalId, -1L); // 浣跨敤涓嶅彲鑳藉瓨鍦ㄧ殑ID
+            }
+        }
+
         queryWrapper.orderByDesc(PendingInventory::getCreateTime);
-        return pendingInventoryMapper.selectPage(page, queryWrapper);
+
+        // 2. 鎵ц涓昏〃鍒嗛〉鏌ヨ
+        IPage<PendingInventory> pendingInventoryPage = pendingInventoryMapper.selectPage(page, queryWrapper);
+
+        // 3. 鏃犳暟鎹揩閫熻繑鍥�
+        if (CollectionUtils.isEmpty(pendingInventoryPage.getRecords())) {
+            return new Page<>(page.getCurrent(), page.getSize(), pendingInventoryPage.getTotal());
+        }
+
+        // 4. 鎻愬彇鎵�鏈夊緟澶勭悊搴撳瓨ID
+        List<Long> pendingIds = pendingInventoryPage.getRecords().stream()
+                .map(PendingInventory::getId)
+                .collect(Collectors.toList());
+
+        // 5. 鎵归噺鏌ヨ鍏宠仈鐨勭叅鐐俊鎭拰姝e紡搴撳瓨淇℃伅
+        List<Long> coalIds = pendingInventoryPage.getRecords().stream()
+                .map(PendingInventory::getCoalId)
+                .distinct()
+                .collect(Collectors.toList());
+
+        // 鎵归噺鏌ヨCoalInfo
+        Map<Long, CoalInfo> coalInfoMap;
+        if (!coalIds.isEmpty()) {
+            List<CoalInfo> coalInfos = coalInfoMapper.selectList(new LambdaQueryWrapper<CoalInfo>().in(CoalInfo::getId, coalIds));
+            coalInfoMap = coalInfos.stream().collect(Collectors.toMap(CoalInfo::getId, Function.identity()));
+        } else {
+            coalInfoMap = new HashMap<>();
+        }
+
+        // 5. 鎵归噺鏌ヨ鐧昏浜篿d
+        List<Long> registrantIds = pendingInventoryPage.getRecords().stream()
+                .map(PendingInventory::getRegistrantId)
+                .distinct()
+                .toList();
+        // 鎵归噺鏌ヨ鐧昏浜�
+        Map<Long, SysUser> sysUserMap;
+        if (!registrantIds.isEmpty()) {
+            List<SysUser> sysUsers = sysUserMapper.selectList(registrantIds);
+            sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
+        } else {
+            sysUserMap = new HashMap<>();
+        }
+
+        // 鎵归噺鏌ヨ姝e紡搴撳瓨淇℃伅
+        Map<Long, Long> pendingToOfficialMap = getOfficialInventoryMap(pendingIds);
+
+        // 6. 杞崲DTO骞惰缃浉鍏冲瓧娈�
+        return pendingInventoryPage.convert(record -> {
+            PendingInventoryDto dto = new PendingInventoryDto();
+            BeanUtils.copyProperties(record, dto);
+
+            // 璁剧疆Coal淇℃伅
+            CoalInfo coalInfo = coalInfoMap.get(record.getCoalId());
+            if (coalInfo != null) {
+                dto.setCoal(coalInfo.getCoal());
+            }
+
+            // 璁剧疆鐧昏浜�
+            SysUser sysUser = sysUserMap.get(record.getRegistrantId());
+            if (sysUser != null) {
+                dto.setRegistrant(sysUser.getNickName());
+            }
+
+            // 浠庨鍔犺浇鐨凪ap涓幏鍙杘fficialId
+            dto.setOfficialId(pendingToOfficialMap.getOrDefault(record.getId(), null));
+
+            return dto;
+        });
+    }
+
+
+    // 鎵归噺鑾峰彇寰呭鐞嗗簱瀛樹笌姝e紡搴撳瓨鐨勬槧灏勫叧绯�
+    private Map<Long, Long> getOfficialInventoryMap(List<Long> pendingIds) {
+        if (CollectionUtils.isEmpty(pendingIds)) {
+            return Collections.emptyMap();
+        }
+
+        // 鏌ヨ鍏宠仈鐨勬寮忓簱瀛樻暟鎹�
+        LambdaQueryWrapper<OfficialInventory> wrapper = new LambdaQueryWrapper<>();
+        wrapper.select(OfficialInventory::getId, OfficialInventory::getPendingId)
+                .in(OfficialInventory::getPendingId, pendingIds);
+
+        return officialInventoryMapper.selectList(wrapper)
+                .stream()
+                .collect(Collectors.toMap(
+                        OfficialInventory::getPendingId,
+                        OfficialInventory::getId,
+                        (existing, replacement) -> existing // 濡傛灉鏈夐噸澶嶏紝淇濈暀绗竴涓�
+                ));
     }
 
     @Override
@@ -66,4 +222,194 @@
         // 鎵ц鎵归噺閫昏緫鍒犻櫎
         return pendingInventoryMapper.update(null, updateWrapper);
     }
+
+    @Transactional
+    @Override
+    public int addOrEditCoalValue(PendingInventoryDto pendingInventoryDto) {
+        // Step 1: 鍒犻櫎鍘熸湁 planId 鐩稿叧鏁版嵁
+        coalValueMapper.delete(new LambdaQueryWrapper<CoalValue>()
+                .eq(CoalValue::getPlanId, pendingInventoryDto.getPId()));
+        // Step 2: 鏋勫缓鍩虹 CoalValue 瀵硅薄
+        CoalValue coalValue = new CoalValue();
+        BeanUtils.copyProperties(coalValue, pendingInventoryDto);
+        coalValue.setPlanId(pendingInventoryDto.getPId());
+        List<Map<String, String>> fieldValue = pendingInventoryDto.getFieldValue();
+        if (CollectionUtils.isEmpty(fieldValue)) {
+            throw new BaseException("瀛楁鍊间笉鑳戒负绌�");
+        }
+        // Step 3: 鎻愬墠鑾峰彇鎵�鏈� field -> CoalField 鏄犲皠锛岄伩鍏嶉噸澶嶆煡搴�
+        Set<String> allFields = fieldValue.stream()
+                .flatMap(map -> map.keySet().stream())
+                .collect(Collectors.toSet());
+        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));
+        // Step 4: 鎵归噺鎻掑叆
+        int i = 0;
+        for (Map<String, String> fieldMapEntry : fieldValue) {
+            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("瀛楁鍚嶄笉瀛樺湪");
+                }
+                coalValue.setId(null); // 娓呯┖ id锛岀‘淇濇瘡娆¢兘鏄柊璁板綍
+                coalValue.setCoalValue(value);
+                coalValue.setFields(key);
+                coalValue.setFieldName(fieldName);
+                coalValue.setType(String.valueOf(1));
+                i = coalValueMapper.insert(coalValue);
+            }
+        }
+        if (i > 0) {
+            BigDecimal quantity = pendingInventoryDto.getInventoryQuantity();
+            PendingInventory pendingInventory = pendingInventoryMapper.selectById(pendingInventoryDto.getPId());
+            if (pendingInventory == null) {
+                throw new BaseException("寰呭叆搴撹褰曚笉瀛樺湪");
+            }
+            BigDecimal left = pendingInventory.getInventoryQuantity().subtract(quantity);
+            if (left.compareTo(BigDecimal.ZERO) > 0) {
+                pendingInventory.setInventoryQuantity(left);
+                pendingInventory.setCoalPlanId(pendingInventoryDto.getCoalPlanId());
+                pendingInventoryMapper.updateById(pendingInventory);
+            } else {
+                pendingInventoryMapper.deleteById(pendingInventoryDto.getPId());
+            }
+            //姝e紡搴�
+            if (pendingInventoryDto.getOfficialId() == null) {
+                OfficialInventory officialInventory = new OfficialInventory();
+                BeanUtils.copyProperties(pendingInventory, officialInventory);
+                officialInventory.setId(null);
+                officialInventory.setCoalPlanId(pendingInventoryDto.getCoalPlanId());
+                officialInventory.setPendingId(pendingInventoryDto.getPId());
+                officialInventory.setInventoryQuantity(quantity);
+                officialInventory.setRegistrantId(1L);
+                officialInventory.setSupplierId(pendingInventoryDto.getSupplierId());
+                officialInventoryMapper.insert(officialInventory);
+            } else {
+                OfficialInventory officialInventory = officialInventoryMapper.selectById(pendingInventoryDto.getOfficialId());
+                officialInventory.setInventoryQuantity(quantity.add(officialInventory.getInventoryQuantity()));
+                officialInventoryMapper.updateById(officialInventory);
+            }
+        }
+        return i;
+    }
+
+    @Override
+    @Transactional
+    public boolean addPending(PendingInventoryDto pendingInventoryDto) {
+        try {
+            CoalPlan coalPlan = coalPlanMapper.selectOne(new LambdaQueryWrapper<CoalPlan>().eq(CoalPlan::getPlan, "閰嶇叅璁$畻鍣ㄦ柟妗�"));
+            if (coalPlan == null) {
+                return false;
+            }
+
+            // 娣诲姞鍒板緟鍏ュ簱
+            Long userId = SecurityUtils.getUserId();
+            PendingInventory pendingInventory = new PendingInventory();
+            pendingInventory.setUnit("t");
+            pendingInventory.setRegistrantId(userId);
+            pendingInventory.setRegistrationDate(LocalDate.now());
+
+            for (Map<String, Object> map : pendingInventoryDto.getFieldsResultList()) {
+                pendingInventory.setSupplierName("閰嶇叅璁$畻鍣ㄦ柟妗堝叆搴�");
+
+                // 澶勭悊鐓ょ偔ID
+                if (map.get("coalId") == null) {
+                    CoalInfo coalInfo = new CoalInfo();
+                    coalInfo.setCoal((String) map.get("createCoal"));
+                    coalInfo.setMaintainerId(userId);
+                    coalInfo.setMaintenanceDate(LocalDate.now());
+                    if (coalInfoMapper.insert(coalInfo) <= 0) {
+                        return false;
+                    }
+                    pendingInventory.setCoalId(coalInfo.getId());
+                } else {
+                    pendingInventory.setCoalId((Long) map.get("coalId"));
+                }
+
+                // 璁剧疆浠锋牸鍜屾暟閲�
+                BigDecimal cost = BigDecimal.valueOf((Double) map.get("cost"));
+                BigDecimal tonnage = BigDecimal.valueOf((Double) map.get("totalTonnage"));
+
+                pendingInventory.setPriceIncludingTax(cost);
+                pendingInventory.setInventoryQuantity(tonnage);
+                pendingInventory.setTotalPriceIncludingTax(cost.multiply(tonnage));
+
+                BigDecimal costExcludingTax = cost.divide(BigDecimal.valueOf(1.13), 2, RoundingMode.HALF_UP);
+                pendingInventory.setPriceExcludingTax(costExcludingTax);
+                pendingInventory.setTotalPriceExcludingTax(costExcludingTax.multiply(tonnage));
+                pendingInventory.setCoalPlanId(coalPlan.getId());
+
+                // 鐓よ川瀛楁鍊�
+                String coalFields = coalPlan.getCoalFields();
+                List<String> coalFieldList = Arrays.asList(coalFields.split(","));
+
+                for (String field : coalFieldList) {
+                    CoalField coalField = coalFieldMapper.selectOne(
+                            new LambdaQueryWrapper<CoalField>().eq(CoalField::getFields, field));
+                    if (coalField == null) {
+                        continue;
+                    }
+
+                    CoalValue coalValue = new CoalValue();
+                    coalValue.setPlanId(coalPlan.getId());
+                    coalValue.setFields(field);
+                    coalValue.setFieldName(coalField.getFieldName());
+                    coalValue.setType("1");
+
+                    switch (coalField.getFieldName()) {
+                        case "鍙戠儹閲�":
+                            coalValue.setCoalValue((String) map.get("cv"));
+                            break;
+                        case "纭垎":
+                            coalValue.setCoalValue((String) map.get("sulfur"));
+                            break;
+                        case "鐏板垎":
+                            coalValue.setCoalValue((String) map.get("ash"));
+                            break;
+                        case "姘村垎":
+                            coalValue.setCoalValue((String) map.get("moisture"));
+                            break;
+                    }
+
+                    // 淇濆瓨鐓よ川鍊�
+                    if (coalValueMapper.insert(coalValue) <= 0) {
+                        return false;
+                    }
+                }
+            }
+
+            // 鎻掑叆寰呭叆搴撹褰�
+            if (pendingInventoryMapper.insert(pendingInventory) <= 0) {
+                return false;
+            }
+
+            // 鏇存柊姝e紡搴�
+            for (Map<String, Object> coalResult : pendingInventoryDto.getCoalResultList()) {
+                Long officialId = (Long) coalResult.get("officialId");
+                BigDecimal quantity = (BigDecimal) coalResult.get("quantity");
+                OfficialInventory officialInventory = officialInventoryMapper.selectById(officialId);
+
+                if (officialInventory == null || officialInventory.getInventoryQuantity().compareTo(quantity) < 0) {
+                    throw new BaseException("搴撳瓨鏁伴噺涓嶈冻锛屾坊鍔犺嚦寰呭叆搴撳け璐�");
+                }
+
+                officialInventory.setInventoryQuantity(officialInventory.getInventoryQuantity().subtract(quantity));
+                if (officialInventoryMapper.updateById(officialInventory) <= 0) {
+                    return false;
+                }
+            }
+
+            return true;
+        } catch (Exception e) {
+            // 璁板綍鏃ュ織
+            log.error("娣诲姞寰呭叆搴撳け璐�", e);
+            throw new BaseException("娣诲姞寰呭叆搴撳け璐�: " + e.getMessage());
+        }
+    }
 }

--
Gitblit v1.9.3