From 6733a32d4bcd7ad3ec3f109da0f3d2524766f7bb Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期二, 15 七月 2025 15:54:33 +0800
Subject: [PATCH] 1.数据优化 2.配煤计算器入库优化

---
 main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java |  243 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 243 insertions(+), 0 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 5e340eb..1e6c5ad 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
@@ -6,32 +6,51 @@
 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 lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
 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>
@@ -42,6 +61,7 @@
  * @since 2025-06-04
  */
 @Service
+@Slf4j
 @RequiredArgsConstructor
 public class PendingInventoryServiceImpl extends ServiceImpl<PendingInventoryMapper, PendingInventory> implements PendingInventoryService {
 
@@ -60,11 +80,34 @@
     private final InputInventoryRecordService inputInventoryRecordService;
 
     private final InventorySummaryService inventorySummaryService;
+    private final CoalPlanMapper coalPlanMapper;
+    private final CoalValueService coalValueService;
 
     @Override
     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);
 
         // 2. 鎵ц涓昏〃鍒嗛〉鏌ヨ
@@ -233,6 +276,7 @@
             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());
@@ -242,8 +286,11 @@
                 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());
@@ -253,4 +300,200 @@
         }
         return i;
     }
+
+    @Override
+    @Transactional
+    public boolean addPending(PendingInventoryDto pendingInventoryDto) {
+        try {
+            // 1. 鑾峰彇閰嶇叅璁$畻鍣ㄦ柟妗�
+            CoalPlan coalPlan = coalPlanMapper.selectOne(
+                    new LambdaQueryWrapper<CoalPlan>().eq(CoalPlan::getPlan, "閰嶇叅璁$畻鍣ㄦ柟妗�"));
+            if (coalPlan == null) {
+                log.error("閰嶇叅璁$畻鍣ㄦ柟妗堜笉瀛樺湪");
+                return false;
+            }
+
+            // 2. 鍑嗗寰呭叆搴撹褰�
+            Long userId = SecurityUtils.getUserId();
+            PendingInventory pendingInventory = new PendingInventory();
+            pendingInventory.setUnit("t");
+            pendingInventory.setRegistrantId(userId);
+            pendingInventory.setRegistrationDate(LocalDate.now());
+            pendingInventory.setSupplierName("閰嶇叅璁$畻鍣ㄦ柟妗堝叆搴�");
+            pendingInventory.setCoalPlanId(coalPlan.getId());
+
+            // 3. 瀹夊叏鑾峰彇瀛楁缁撴灉
+            Map<String, Object> map = Optional.ofNullable(pendingInventoryDto.getFieldsResultList())
+                    .orElseThrow(() -> new BaseException("瀛楁缁撴灉鍒楄〃涓嶈兘涓虹┖"));
+
+            // 4. 澶勭悊鐓ょ偔ID
+            if (map.get("coalId") == null) {
+                String coalName = safeGetString(map, "createCoal");
+                if (coalName == null || coalName.isEmpty()) {
+                    throw new BaseException("鐓ょ偔鍚嶇О涓嶈兘涓虹┖");
+                }
+
+                CoalInfo coalInfo = new CoalInfo();
+                coalInfo.setCoal(coalName);
+                coalInfo.setMaintainerId(userId);
+                coalInfo.setMaintenanceDate(LocalDate.now());
+                if (coalInfoMapper.insert(coalInfo) <= 0) {
+                    log.error("鍒涘缓鐓ょ偔淇℃伅澶辫触");
+                    return false;
+                }
+                pendingInventory.setCoalId(coalInfo.getId());
+            } else {
+                Long coalId = safeGetLong(map, "coalId");
+                if (coalId == null) {
+                    throw new BaseException("鐓ょ偔ID鏍煎紡閿欒");
+                }
+                pendingInventory.setCoalId(coalId);
+            }
+
+            // 5. 璁剧疆浠锋牸鍜屾暟閲�
+            BigDecimal cost = safeGetBigDecimal(map, "cost");
+            BigDecimal tonnage = safeGetBigDecimal(map, "totalTonnage");
+
+            if (cost == null || tonnage == null) {
+                throw new BaseException("鎴愭湰鎴栧惃浣嶄笉鑳戒负绌�");
+            }
+
+            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));
+
+            // 6. 澶勭悊鐓よ川瀛楁鍊�
+            String coalFields = coalPlan.getCoalFields();
+            if (coalFields == null || coalFields.isEmpty()) {
+                throw new BaseException("鐓よ川瀛楁閰嶇疆涓嶈兘涓虹┖");
+            }
+
+            String[] coalFieldList = coalFields.split(",");
+            for (String field : coalFieldList) {
+                CoalField coalField = coalFieldMapper.selectOne(
+                        new LambdaQueryWrapper<CoalField>().eq(CoalField::getFields, field));
+                if (coalField == null) {
+                    log.warn("鏈壘鍒扮叅璐ㄥ瓧娈甸厤缃�: {}", field);
+                    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(safeGetString(map, "cv"));
+                        break;
+                    case "纭垎":
+                        coalValue.setCoalValue(safeGetString(map, "sulfur"));
+                        break;
+                    case "鐏板垎":
+                        coalValue.setCoalValue(safeGetString(map, "ash"));
+                        break;
+                    case "姘村垎":
+                        coalValue.setCoalValue(safeGetString(map, "moisture"));
+                        break;
+                    default:
+                        log.warn("鏈煡鐓よ川瀛楁: {}", coalField.getFieldName());
+                        continue;
+                }
+
+                if (coalValueMapper.insert(coalValue) <= 0) {
+                    log.error("淇濆瓨鐓よ川鍊煎け璐�: {}", field);
+                    return false;
+                }
+            }
+
+            // 7. 鎻掑叆寰呭叆搴撹褰�
+            if (pendingInventoryMapper.insert(pendingInventory) <= 0) {
+                log.error("鎻掑叆寰呭叆搴撹褰曞け璐�");
+                return false;
+            }
+
+            // 8. 鏇存柊姝e紡搴�
+            List<Map<String, Object>> coalResults = Optional.ofNullable(pendingInventoryDto.getCoalResultList())
+                    .orElseThrow(() -> new BaseException("鐓ょ偔缁撴灉鍒楄〃涓嶈兘涓虹┖"));
+
+            for (Map<String, Object> coalResult : coalResults) {
+                Long officialId = safeGetLong(coalResult, "officialId");
+                BigDecimal quantity = safeGetBigDecimal(coalResult, "quantity");
+
+                if (officialId == null || quantity == null) {
+                    throw new BaseException("姝e紡搴撳瓨ID鎴栨暟閲忎笉鑳戒负绌�");
+                }
+
+                OfficialInventory officialInventory = officialInventoryMapper.selectById(officialId);
+                if (officialInventory == null) {
+                    throw new BaseException("鎵句笉鍒版寮忓簱瀛樿褰�: " + officialId);
+                }
+
+                if (officialInventory.getInventoryQuantity().compareTo(quantity) < 0) {
+                    throw new BaseException("搴撳瓨鏁伴噺涓嶈冻锛屾坊鍔犺嚦寰呭叆搴撳け璐�");
+                }
+
+                officialInventory.setInventoryQuantity(officialInventory.getInventoryQuantity().subtract(quantity));
+                if (officialInventoryMapper.updateById(officialInventory) <= 0) {
+                    log.error("鏇存柊姝e紡搴撳瓨澶辫触: {}", officialId);
+                    return false;
+                }
+            }
+
+            return true;
+        } catch (Exception e) {
+            log.error("娣诲姞寰呭叆搴撳け璐�", e);
+            throw new BaseException("娣诲姞寰呭叆搴撳け璐�: " + e.getMessage());
+        }
+    }
+
+    // 瀹夊叏绫诲瀷杞崲杈呭姪鏂规硶
+    private String safeGetString(Map<String, Object> map, String key) {
+        Object value = map.get(key);
+        if (value == null) {
+            return null;
+        }
+        return value.toString();
+    }
+
+    private Long safeGetLong(Map<String, Object> map, String key) {
+        Object value = map.get(key);
+        if (value == null) {
+            return null;
+        }
+        if (value instanceof Number) {
+            return ((Number) value).longValue();
+        }
+        try {
+            return Long.parseLong(value.toString());
+        } catch (NumberFormatException e) {
+            log.warn("鏃犳硶杞崲涓篖ong: key={}, value={}", key, value);
+            return null;
+        }
+    }
+
+    private BigDecimal safeGetBigDecimal(Map<String, Object> map, String key) {
+        Object value = map.get(key);
+        if (value == null) {
+            return null;
+        }
+        if (value instanceof BigDecimal) {
+            return (BigDecimal) value;
+        }
+        if (value instanceof Number) {
+            return BigDecimal.valueOf(((Number) value).doubleValue());
+        }
+        try {
+            return new BigDecimal(value.toString());
+        } catch (NumberFormatException e) {
+            log.warn("鏃犳硶杞崲涓築igDecimal: key={}, value={}", key, value);
+            return null;
+        }
+    }
 }

--
Gitblit v1.9.3