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。配煤到待入库

---
 basic-server/src/main/java/com/ruoyi/basic/mapper/CoalFieldMapper.java                        |    3 
 main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java  |  124 ++++++++++++++++
 basic-server/src/main/java/com/ruoyi/basic/dto/CoalFieldDto.java                              |   10 -
 main-business/src/main/java/com/ruoyi/business/controller/OfficialInventoryController.java    |    7 +
 basic-server/src/main/java/com/ruoyi/basic/mapper/CoalPlanMapper.java                         |    2 
 main-business/src/main/java/com/ruoyi/business/service/PendingInventoryService.java           |    2 
 basic-server/src/main/java/com/ruoyi/basic/service/CoalFieldService.java                      |    2 
 main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java |   41 +++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/init/MyStartupRunner.java                  |   74 ++++++++--
 basic-server/src/main/java/com/ruoyi/basic/service/CoalPlanService.java                       |    2 
 main-business/src/main/java/com/ruoyi/business/dto/OfficialInventoryDto.java                  |    5 
 main-business/src/main/java/com/ruoyi/business/service/OfficialInventoryService.java          |    2 
 basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalFieldServiceImpl.java             |   41 +++++
 ruoyi-common/src/main/java/com/ruoyi/common/handler/MyMetaObjectHandler.java                  |   48 +++++-
 basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalPlanServiceImpl.java              |   10 +
 basic-server/src/main/resources/mapper/CoalPlanMapper.xml                                     |   11 +
 basic-server/src/main/resources/mapper/CoalFieldMapper.xml                                    |   15 ++
 17 files changed, 353 insertions(+), 46 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/dto/CoalFieldDto.java b/basic-server/src/main/java/com/ruoyi/basic/dto/CoalFieldDto.java
index 3eae657..6824305 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/dto/CoalFieldDto.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/dto/CoalFieldDto.java
@@ -6,15 +6,5 @@
 @Data
 public class CoalFieldDto extends CoalField {
 
-    private String fieldName;
-
-    public CoalFieldDto(String name) {
-        this.fieldName = name;
-    }
-
-    public static CoalFieldDto from(String name) {
-        return new CoalFieldDto(name);
-    }
-
     private String searchAll;
 }
diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalFieldMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalFieldMapper.java
index 86f532d..53a7941 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalFieldMapper.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalFieldMapper.java
@@ -4,6 +4,7 @@
 import com.ruoyi.basic.entity.CoalField;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -18,4 +19,6 @@
 public interface CoalFieldMapper extends BaseMapper<CoalField> {
 
     Set<String> getFieldNamesByNames(Set<String> fieldNames);
+
+    List<CoalField> getFieldsByNames(Set<String> filteredNames);
 }
diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalPlanMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalPlanMapper.java
index 472e117..ccf281a 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalPlanMapper.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalPlanMapper.java
@@ -3,6 +3,7 @@
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ruoyi.basic.entity.CoalPlan;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -15,4 +16,5 @@
 @Mapper
 public interface CoalPlanMapper extends BaseMapper<CoalPlan> {
 
+    int existsFieldIds(@Param("fieldIds") String fieldIds);
 }
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/CoalFieldService.java b/basic-server/src/main/java/com/ruoyi/basic/service/CoalFieldService.java
index 1980cec..672076f 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/CoalFieldService.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/CoalFieldService.java
@@ -28,4 +28,6 @@
     List<CoalField> selectAllList(CoalFieldDto coalFieldDto);
 
     Set<String> getFieldNamesByNames(Set<String> collect);
+
+    List<CoalFieldDto> getFieldsByNames(Set<String> fieldNames);
 }
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/CoalPlanService.java b/basic-server/src/main/java/com/ruoyi/basic/service/CoalPlanService.java
index a52f24b..883f9eb 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/CoalPlanService.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/CoalPlanService.java
@@ -28,4 +28,6 @@
     List<CoalPlan> selectAllList();
 
     List<CoalFieldVo> selectCoalPlanById(Long id);
+
+    boolean checkPlanExists(String fieldIds);
 }
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalFieldServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalFieldServiceImpl.java
index 73d18d2..e476244 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalFieldServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalFieldServiceImpl.java
@@ -9,16 +9,19 @@
 import com.ruoyi.basic.entity.CoalField;
 import com.ruoyi.basic.mapper.CoalFieldMapper;
 import com.ruoyi.basic.service.CoalFieldService;
+import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -82,6 +85,44 @@
     }
 
     @Override
+    public List<CoalFieldDto> getFieldsByNames(Set<String> fieldNames) {
+        // 1. 鍙傛暟鏍¢獙
+        if (fieldNames == null || fieldNames.isEmpty()) {
+            throw new IllegalArgumentException("瀛楁鍚嶉泦鍚堜笉鑳戒负绌�");
+        }
+
+        // 2. 杩囨护绌哄��
+        Set<String> filteredNames = fieldNames.stream()
+                .filter(name -> name != null && !name.trim().isEmpty())
+                .collect(Collectors.toSet());
+
+        if (filteredNames.isEmpty()) {
+            return Collections.emptyList();
+        }
+
+        // 3. 鏌ヨ鏁版嵁搴�
+        try {
+            List<CoalField> entities = coalFieldMapper.getFieldsByNames(filteredNames);
+
+            // 4. 瀹炰綋杞珼TO
+            return entities.stream()
+                    .map(this::convertToDto)
+                    .collect(Collectors.toList());
+
+        } catch (Exception e) {
+            throw new BaseException("鏌ヨ鐓よ川瀛楁淇℃伅澶辫触锛岃绋嶅悗閲嶈瘯");
+        }
+    }
+
+    private CoalFieldDto convertToDto(CoalField entity) {
+        CoalFieldDto dto = new CoalFieldDto();
+        dto.setId(entity.getId());
+        dto.setFields(entity.getFields());
+        dto.setFieldName(entity.getFieldName());
+        return dto;
+    }
+
+    @Override
     public Set<String> getFieldNamesByNames(Set<String> fieldNames) {
         return coalFieldMapper.getFieldNamesByNames(fieldNames);
     }
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalPlanServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalPlanServiceImpl.java
index 5aa8eaa..3d6b7eb 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalPlanServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalPlanServiceImpl.java
@@ -78,6 +78,16 @@
     }
 
     @Override
+    public boolean checkPlanExists(String fieldIds) {
+        if (StringUtils.isBlank(fieldIds)) {
+            return false;
+        }
+
+        // 鏌ヨ鏁版嵁搴�
+        return coalPlanMapper.existsFieldIds(fieldIds) > 0;
+    }
+
+    @Override
     public List<CoalFieldVo> selectCoalPlanById(Long id) {
         CoalPlan coalPlan = coalPlanMapper.selectById(id);
         LambdaQueryWrapper<CoalField> coalFieldLambdaQueryWrapper = new LambdaQueryWrapper<>();
diff --git a/basic-server/src/main/resources/mapper/CoalFieldMapper.xml b/basic-server/src/main/resources/mapper/CoalFieldMapper.xml
index d945f3f..6be4060 100644
--- a/basic-server/src/main/resources/mapper/CoalFieldMapper.xml
+++ b/basic-server/src/main/resources/mapper/CoalFieldMapper.xml
@@ -27,7 +27,20 @@
     <select id="getFieldNamesByNames" resultType="java.lang.String">
         SELECT field_name FROM coal_field WHERE field_name IN
         <foreach collection="fieldNames" item="name" open="(" separator="," close=")">
-            #{fieldNames}
+            #{name}
+        </foreach>
+    </select>
+    <select id="getFieldsByNames" resultType="com.ruoyi.basic.entity.CoalField">
+        SELECT
+        id,
+        field_name AS fieldName,
+        fields AS fields
+        FROM
+        coal_field
+        WHERE
+        field_name IN
+        <foreach collection="filteredNames" item="name" open="(" separator="," close=")">
+            #{name}
         </foreach>
     </select>
 
diff --git a/basic-server/src/main/resources/mapper/CoalPlanMapper.xml b/basic-server/src/main/resources/mapper/CoalPlanMapper.xml
index 1619359..89f9048 100644
--- a/basic-server/src/main/resources/mapper/CoalPlanMapper.xml
+++ b/basic-server/src/main/resources/mapper/CoalPlanMapper.xml
@@ -11,8 +11,9 @@
                 <result column="update_by" property="updateBy" />
                 <result column="update_time" property="updateTime" />
                     <result column="plan" property="plan" />
-                    <result column="coal_field_id" property="coalFieldId" />
-                    <result column="field_names" property="fieldNames" />
+                    <result column="coal_fields" property="coalFields" />
+                    <result column="field_ids" property="fieldIds" />
+                    <result column="scheme_desc" property="schemeDesc" />
         </resultMap>
 
         <!-- 閫氱敤鏌ヨ缁撴灉鍒� -->
@@ -24,5 +25,11 @@
                 update_time,
             id, plan, coal_field_id, field_names
         </sql>
+    <select id="existsFieldIds" resultType="java.lang.Integer">
+        SELECT COUNT(1)
+        FROM coal_plan
+        WHERE field_ids = #{fieldIds}
+          AND deleted = 0
+    </select>
 
 </mapper>
\ No newline at end of file
diff --git a/main-business/src/main/java/com/ruoyi/business/controller/OfficialInventoryController.java b/main-business/src/main/java/com/ruoyi/business/controller/OfficialInventoryController.java
index 4dca675..ab16d4f 100644
--- a/main-business/src/main/java/com/ruoyi/business/controller/OfficialInventoryController.java
+++ b/main-business/src/main/java/com/ruoyi/business/controller/OfficialInventoryController.java
@@ -69,4 +69,11 @@
         return R.ok(officialInventoryService.mergeAll(officialInventoryDto));
     }
 
+    /**
+     * 閰嶇叅璁$畻鍣ㄩ�夋嫨list
+     */
+    @GetMapping("/coalBlendingList")
+    public R<List<OfficialInventoryDto>> coalBlendingList() {
+        return R.ok(officialInventoryService.coalBlendingList());
+    }
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/dto/OfficialInventoryDto.java b/main-business/src/main/java/com/ruoyi/business/dto/OfficialInventoryDto.java
index 79b234f..d381090 100644
--- a/main-business/src/main/java/com/ruoyi/business/dto/OfficialInventoryDto.java
+++ b/main-business/src/main/java/com/ruoyi/business/dto/OfficialInventoryDto.java
@@ -1,5 +1,6 @@
 package com.ruoyi.business.dto;
 
+import com.ruoyi.basic.entity.CoalValue;
 import com.ruoyi.business.entity.OfficialInventory;
 import lombok.Data;
 
@@ -17,4 +18,8 @@
 
     private String supplierName; //渚涘簲鍟�
 
+    private String supplierCoal; //渚涘簲鍟� + 鐓ょ
+
+    private List<CoalValue> coalValues; //濯掕川鏂规瀛楁鍊�
+
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/OfficialInventoryService.java b/main-business/src/main/java/com/ruoyi/business/service/OfficialInventoryService.java
index 98d7270..5036b83 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/OfficialInventoryService.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/OfficialInventoryService.java
@@ -32,4 +32,6 @@
     List<OfficialInventory> selectOfficialAll();
 
     Map<String, BigDecimal> selectOfficialAllInfo();
+
+    List<OfficialInventoryDto> coalBlendingList();
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/PendingInventoryService.java b/main-business/src/main/java/com/ruoyi/business/service/PendingInventoryService.java
index 6a93210..1d761b3 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/PendingInventoryService.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/PendingInventoryService.java
@@ -24,5 +24,5 @@
 
     int addOrEditCoalValue(PendingInventoryDto pendingInventoryDto);
 
-    int addPending(PendingInventoryDto pendingInventoryDto);
+    boolean addPending(PendingInventoryDto pendingInventoryDto);
 }
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 131b109..ab87226 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
@@ -333,6 +333,47 @@
     }
 
     @Override
+    public List<OfficialInventoryDto> coalBlendingList() {
+        // 1. 鏌ヨ鍩虹搴撳瓨鏁版嵁
+        List<OfficialInventory> officialInventories = officialInventoryMapper.selectList(null);
+        // 2. 鏀堕泦鎵�鏈夐渶瑕佹煡璇㈢殑ID
+        Set<Long> coalIds = new HashSet<>();
+        Set<Long> supplierIds = new HashSet<>();
+        Set<Long> planIds = new HashSet<>();
+
+        officialInventories.forEach(inventory -> {
+            coalIds.add(inventory.getCoalId());
+            supplierIds.add(inventory.getSupplierId());
+            planIds.add(inventory.getCoalPlanId());
+        });
+        // 3. 鎵归噺鏌ヨ鍏宠仈鏁版嵁
+        Map<Long, CoalInfo> coalInfoMap = coalInfoMapper.selectByIds(coalIds).stream()
+                .collect(Collectors.toMap(CoalInfo::getId, Function.identity()));
+
+        Map<Long, Supply> supplyMap = supplyMapper.selectByIds(supplierIds).stream()
+                .collect(Collectors.toMap(Supply::getId, Function.identity()));
+
+        List<CoalValue> coalValues = coalValueMapper.selectList(
+                new LambdaQueryWrapper<CoalValue>().in(CoalValue::getPlanId, planIds));
+        // 4. 缁勮DTO
+        return officialInventories.stream()
+                .map(inventory -> {
+                    OfficialInventoryDto dto = new OfficialInventoryDto();
+                    BeanUtils.copyProperties(inventory, dto);
+                    // 璁剧疆鐓ょ淇℃伅
+                    CoalInfo coalInfo = coalInfoMap.get(inventory.getCoalId());
+                    Supply supply = supplyMap.get(inventory.getSupplierId());
+                    if (coalInfo != null && supply != null) {
+                        dto.setSupplierCoal(supply.getSupplierName() + " - " + coalInfo.getCoal());
+                    }
+                    // 璁剧疆鐓よ川鏁版嵁
+                    dto.setCoalValues(coalValues);
+                    return dto;
+                })
+                .collect(Collectors.toList());
+    }
+
+    @Override
     public Map<String, BigDecimal> selectOfficialAllInfo() {
         // 1. 鏌ヨ official_inventory 琛ㄦ暟鎹�
         List<OfficialInventory> officialInventories = officialInventoryMapper.selectList(null);
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 275e084..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
@@ -6,9 +6,11 @@
 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;
@@ -16,6 +18,7 @@
 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;
@@ -29,6 +32,7 @@
 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;
@@ -38,11 +42,13 @@
 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;
 
 /**
@@ -72,10 +78,8 @@
     private final InputInventoryRecordService inputInventoryRecordService;
 
     private final InventorySummaryService inventorySummaryService;
-
-    private final CoalFieldService coalFieldService;
-
-    private final CoalPlanService coalPlanService;
+    private final CoalPlanMapper coalPlanMapper;
+    private final CoalValueService coalValueService;
 
     @Override
     public IPage<PendingInventoryDto> selectPendingInventoryList(Page page, PendingInventoryDto pendingInventoryDto) {
@@ -297,7 +301,115 @@
 
     @Override
     @Transactional
-    public int addPending(PendingInventoryDto pendingInventoryDto) {
-      return 1;
+    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());
+        }
     }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/init/MyStartupRunner.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/init/MyStartupRunner.java
index 321646e..771817d 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/init/MyStartupRunner.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/init/MyStartupRunner.java
@@ -2,14 +2,14 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ruoyi.basic.dto.CoalFieldDto;
+import com.ruoyi.basic.dto.CoalPlanDto;
 import com.ruoyi.basic.entity.City;
-import com.ruoyi.basic.entity.CoalField;
 import com.ruoyi.basic.entity.District;
 import com.ruoyi.basic.entity.Province;
 import com.ruoyi.basic.mapper.*;
 import com.ruoyi.basic.service.CoalFieldService;
 import com.ruoyi.basic.service.CoalPlanService;
-import com.ruoyi.common.utils.bean.BeanUtils;
+import com.ruoyi.common.exception.base.BaseException;
 import com.ruoyi.web.controller.init.dto.AreaDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -18,9 +18,9 @@
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -48,7 +48,7 @@
     public void run(String... args) throws Exception {
         // 鍒濆鍖栫渷甯傚尯
         initRegion();
-        // 鍒濆鏂板閰嶇叅璁$畻鍣ㄤ腑鐨勫瓧娈靛拰鏂规
+        // 鍒濆鏂板閰嶇叅璁$畻鍣ㄤ腑鐨勭叅绉嶅瓧娈靛拰鏂规
         initCoalFields();
     }
 
@@ -120,19 +120,63 @@
     }
 
     private void initCoalFields() {
+        try {
+            // 1. 鍒濆鍖栧瓧娈甸�昏緫
+            Supplier<CoalFieldDto> dtoSupplier = CoalFieldDto::new; // 鍋囪瀛樺湪鏃犲弬鏋勯�犲嚱鏁�
 
-        List<CoalFieldDto> fields = Stream.of("鍙戠儹閲�", "纭垎", "鐏板垎", "姘村垎")
-                .map(CoalFieldDto::from)
-                .toList();
-        // 鎵归噺鑾峰彇宸插瓨鍦ㄧ殑 fieldNames
-        Set<String> existingFieldNames = coalFieldService.getFieldNamesByNames(
-                fields.stream().map(CoalFieldDto::getFieldName).collect(Collectors.toSet())
-        );
+            List<CoalFieldDto> fields = Stream.of("鍙戠儹閲�", "纭垎", "鐏板垎", "姘村垎")
+                    .map(fieldName -> {
+                        CoalFieldDto dto = dtoSupplier.get();
+                        dto.setFieldName(fieldName); // 鍋囪瀛樺湪 setFieldName 鏂规硶
+                        dto.setFieldDescription("閰嶇叅璁$畻鍣ㄥ獟璐ㄥ瓧娈�");
+                        return dto;
+                    })
+                    .toList();
 
-        fields.forEach(field -> {
-            if (!existingFieldNames.contains(field.getFieldName())) {
-                coalFieldService.addOrEditCoalField(field);
+            // 2. 淇濆瓨瀛楁锛堝鏋滀笉瀛樺湪锛�
+            Set<String> existingNames = coalFieldService.getFieldNamesByNames(
+                    fields.stream().map(CoalFieldDto::getFieldName).collect(Collectors.toSet())
+            );
+
+            fields.forEach(field -> {
+                if (!existingNames.contains(field.getFieldName())) {
+                    coalFieldService.addOrEditCoalField(field);
+                }
+            });
+
+            // 3. 鏌ヨ鎵�鏈夊瓧娈礗D
+            List<CoalFieldDto> allFields = coalFieldService.getFieldsByNames(
+                    fields.stream().map(CoalFieldDto::getFieldName).collect(Collectors.toSet())
+            );
+
+            // 4. 鍒涘缓鏂规
+
+            String planName = "閰嶇叅璁$畻鍣ㄦ柟妗�";
+            boolean planExists = coalPlanService.checkPlanExists(allFields.stream()
+                    .map(f -> f.getId().toString())
+                    .collect(Collectors.joining(",")));
+
+            if (!planExists) {
+                // 鍒涘缓鏂版柟妗�
+                CoalPlanDto planDto = new CoalPlanDto();
+                planDto.setPlan(planName);
+                planDto.setCoalFields(allFields.stream()
+                        .map(CoalFieldDto::getFields)
+                        .collect(Collectors.joining(",")));
+                planDto.setFieldIds(allFields.stream()
+                        .map(f -> f.getId().toString())
+                        .collect(Collectors.joining(",")));
+                planDto.setSchemeDesc("绯荤粺鐢熸垚閰嶇叅璁$畻鍣ㄦ墍闇�瀛楁鏂规");
+
+                coalPlanService.addOrEditCoalPlan(planDto);
+                log.info("鎴愬姛鍒涘缓閰嶇叅璁$畻鍣ㄦ柟妗�");
+            } else {
+                log.info("閰嶇叅璁$畻鍣ㄦ柟妗堝凡瀛樺湪锛岃烦杩囧垱寤�");
             }
-        });
+        } catch (Exception e) {
+            // 璁板綍绯荤粺寮傚父鏃ュ織锛屽苟杞崲涓轰笟鍔″紓甯告姏鍑猴紙瑙﹀彂鍥炴粴锛�
+            log.error("閰嶇叅璁$畻鍣ㄥ垵濮嬪寲澶辫触", e);
+            throw new BaseException("鍒濆鍖栭厤鐓ゆ柟妗堝け璐ワ紝璇风◢鍚庨噸璇�");
+        }
     }
 }
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/handler/MyMetaObjectHandler.java b/ruoyi-common/src/main/java/com/ruoyi/common/handler/MyMetaObjectHandler.java
index 1ec12de..da15fc7 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/handler/MyMetaObjectHandler.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/handler/MyMetaObjectHandler.java
@@ -10,27 +10,53 @@
 @Component
 public class MyMetaObjectHandler implements MetaObjectHandler {
 
+    private static final String SYSTEM_USER = "system";
+
     @Override
     public void insertFill(MetaObject meta) {
         LocalDateTime now = LocalDateTime.now();
-        Long uid = SecurityUtils.getLoginUser().getUserId();
-        if (uid != null) {
-            strictInsertFill(meta, "createBy", String.class, uid.toString());
-            strictInsertFill(meta, "updateBy", String.class, uid.toString());
+        String userId = getUserId();
+
+        if (hasField(meta, "createBy")) {
+            strictInsertFill(meta, "createBy", String.class, userId);
         }
-        strictInsertFill(meta, "createTime", LocalDateTime.class, now);
-        strictInsertFill(meta, "updateTime", LocalDateTime.class, now);
+        if (hasField(meta, "updateBy")) {
+            strictInsertFill(meta, "updateBy", String.class, userId);
+        }
+        if (hasField(meta, "createTime")) {
+            strictInsertFill(meta, "createTime", LocalDateTime.class, now);
+        }
+        if (hasField(meta, "updateTime")) {
+            strictInsertFill(meta, "updateTime", LocalDateTime.class, now);
+        }
     }
 
     @Override
     public void updateFill(MetaObject meta) {
         LocalDateTime now = LocalDateTime.now();
-        Long uid = SecurityUtils.getLoginUser().getUserId();
-        if (uid != null) {
-            strictUpdateFill(meta, "updateBy", String.class, uid.toString());
+        String userId = getUserId();
+
+        if (hasField(meta, "updateBy")) {
+            strictUpdateFill(meta, "updateBy", String.class, userId);
         }
-        // 寮哄埗瑕嗙洊 updateTime
-        setFieldValByName("updateTime", now, meta);
+        if (hasField(meta, "updateTime")) {
+            setFieldValByName("updateTime", now, meta);
+        }
     }
 
+    private String getUserId() {
+        try {
+            Long uid = SecurityUtils.getLoginUser().getUserId();
+            return uid != null ? uid.toString() : SYSTEM_USER;
+        } catch (Exception e) {
+            return SYSTEM_USER;
+        }
+    }
+
+    private boolean hasField(MetaObject meta, String fieldName) {
+        if (meta == null || fieldName == null) {
+            return false;
+        }
+        return meta.hasGetter(fieldName) || meta.hasSetter(fieldName);
+    }
 }
\ No newline at end of file

--
Gitblit v1.9.3