From 388bd216d4eb70b367ada95118d1087b45f07ae3 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 09 六月 2025 17:53:48 +0800
Subject: [PATCH] 1.煤质部分 2.代入库部分

---
 main-business/src/main/java/com/ruoyi/business/controller/PendingInventoryController.java            |   38 +
 basic-server/src/main/java/com/ruoyi/basic/mapper/CoalFieldMapper.java                               |   18 
 basic-server/src/main/resources/db/migration/postgresql/V20250606171000__create_table_coal_value.sql |   31 +
 main-business/src/main/java/com/ruoyi/business/controller/OfficialInventoryController.java           |   40 +
 main-business/pom.xml                                                                                |    4 
 main-business/src/main/java/com/ruoyi/business/service/PendingInventoryService.java                  |    8 
 basic-server/src/main/java/com/ruoyi/basic/entity/CoalField.java                                     |   45 ++
 basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalValueServiceImpl.java                    |   74 +++
 basic-server/src/main/java/com/ruoyi/basic/controller/CoalValueController.java                       |   54 ++
 basic-server/src/main/java/com/ruoyi/basic/service/CoalPlanService.java                              |   28 +
 main-business/src/main/java/com/ruoyi/business/dto/OfficialInventoryDto.java                         |    8 
 main-business/src/main/java/com/ruoyi/business/service/OfficialInventoryService.java                 |    4 
 basic-server/src/main/java/com/ruoyi/basic/controller/CoalPlanController.java                        |   63 +++
 basic-server/src/main/java/com/ruoyi/basic/entity/CoalPlan.java                                      |   40 ++
 basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalInfoServiceImpl.java                     |    2 
 basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalPlanServiceImpl.java                     |   68 +++
 basic-server/src/main/java/com/ruoyi/basic/mapper/CoalValueMapper.java                               |   18 
 main-business/src/main/java/com/ruoyi/business/entity/PendingInventory.java                          |    8 
 basic-server/src/main/java/com/ruoyi/basic/service/CoalValueService.java                             |   24 +
 basic-server/src/main/resources/mapper/CoalPlanMapper.xml                                            |   28 +
 basic-server/src/main/java/com/ruoyi/basic/entity/CoalValue.java                                     |   46 ++
 basic-server/src/main/resources/mapper/CoalFieldMapper.xml                                           |   28 +
 main-business/src/main/java/com/ruoyi/business/service/impl/PurchaseRegistrationServiceImpl.java     |   42 ++
 main-business/src/main/resources/mapper/PendingInventoryMapper.xml                                   |    4 
 main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java         |   51 ++
 basic-server/src/main/java/com/ruoyi/basic/dto/CoalFieldDto.java                                     |    8 
 basic-server/src/main/resources/mapper/CoalValueMapper.xml                                           |   28 +
 basic-server/src/main/java/com/ruoyi/basic/mapper/CoalPlanMapper.java                                |   18 
 basic-server/src/main/java/com/ruoyi/basic/dto/CoalValueDto.java                                     |   13 
 basic-server/src/main/java/com/ruoyi/basic/service/CoalFieldService.java                             |   28 +
 main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java        |   11 
 basic-server/src/main/java/com/ruoyi/basic/controller/CoalFieldController.java                       |   63 +++
 basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalFieldServiceImpl.java                    |  107 +++++
 main-business/src/main/java/com/ruoyi/business/dto/PendingInventoryDto.java                          |    8 
 basic-server/src/main/java/com/ruoyi/basic/dto/CoalPlanDto.java                                      |    8 
 basic-server/src/main/resources/db/migration/postgresql/V20250606170900__create_table_coal_plan.sql  |   27 +
 basic-server/src/main/resources/db/migration/postgresql/V20250606163300__create_table_coal_field.sql |   28 +
 37 files changed, 1,095 insertions(+), 26 deletions(-)

diff --git a/basic-server/src/main/java/com/ruoyi/basic/controller/CoalFieldController.java b/basic-server/src/main/java/com/ruoyi/basic/controller/CoalFieldController.java
new file mode 100644
index 0000000..214c686
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/controller/CoalFieldController.java
@@ -0,0 +1,63 @@
+package com.ruoyi.basic.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.CoalFieldDto;
+import com.ruoyi.basic.entity.CoalField;
+import com.ruoyi.basic.service.CoalFieldService;
+import com.ruoyi.common.core.domain.R;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鐓よ川缁存姢瀛楁 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/coalField")
+public class CoalFieldController {
+
+    private CoalFieldService coalFieldService;
+
+    /**
+     * 鐓よ川缁存姢瀛楁鏌ヨ
+     */
+    @GetMapping("/list")
+    public R<IPage<CoalField>> list(Page page, CoalFieldDto coalFieldDto) {
+        IPage<CoalField> list = coalFieldService.selectCoalFieldList(page, coalFieldDto);
+        return R.ok(list);
+    }
+
+    /**
+     * All鐓よ川缁存姢瀛楁鏌ヨ 杩斿洖
+     */
+    @GetMapping("/coalFieldList")
+    public R<List<CoalField>> coalFieldList(CoalFieldDto coalFieldDto) {
+        return R.ok(coalFieldService.selectAllList(coalFieldDto));
+    }
+
+    /**
+     * 鐓よ川缁存姢瀛楁鏂板淇敼
+     */
+    @PostMapping("/addOrEditCoalField")
+    public R addOrEditCoalField(@RequestBody CoalFieldDto coalFieldDto) {
+        return R.ok(coalFieldService.addOrEditCoalField(coalFieldDto));
+    }
+
+    /**
+     * 鐓よ川缁存姢瀛楁鍒犻櫎
+     */
+    @DeleteMapping("/delCoalInfo")
+    public R remove(@RequestBody Long[] ids) {
+        return R.ok(coalFieldService.delCoalFieldByIds(ids));
+    }
+
+}
diff --git a/basic-server/src/main/java/com/ruoyi/basic/controller/CoalPlanController.java b/basic-server/src/main/java/com/ruoyi/basic/controller/CoalPlanController.java
new file mode 100644
index 0000000..363eb06
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/controller/CoalPlanController.java
@@ -0,0 +1,63 @@
+package com.ruoyi.basic.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.CoalPlanDto;
+import com.ruoyi.basic.entity.CoalPlan;
+import com.ruoyi.basic.service.CoalPlanService;
+import com.ruoyi.common.core.domain.R;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鐓よ川鏂规 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/coalPlan")
+public class CoalPlanController {
+
+    private CoalPlanService coalPlanService;
+
+    /**
+     * 鐓よ川鏂规鏌ヨ
+     */
+    @GetMapping("/list")
+    public R<IPage<CoalPlan>> list(Page page, CoalPlanDto coalPlanDto) {
+        IPage<CoalPlan> list = coalPlanService.selectCoalFieldList(page, coalPlanDto);
+        return R.ok(list);
+    }
+
+    /**
+     * All鐓よ川鏂规鏌ヨ 杩斿洖
+     */
+    @GetMapping("/coalPlanList")
+    public R<List<CoalPlan>> coalPlanList() {
+        return R.ok(coalPlanService.selectAllList());
+    }
+
+    /**
+     * 鐓よ川鏂规鏂板淇敼
+     */
+    @PostMapping("/addOrEditCoalPlan")
+    public R addOrEditCoalPlan(@RequestBody CoalPlanDto coalPlanDto) {
+        return R.ok(coalPlanService.addOrEditCoalPlan(coalPlanDto));
+    }
+
+    /**
+     * 鐓よ川鏂规瀛楁鍒犻櫎
+     */
+    @DeleteMapping("/delCoalPlan")
+    public R remove(@RequestBody Long[] ids) {
+        return R.ok(coalPlanService.delCoalPlanByIds(ids));
+    }
+
+}
diff --git a/basic-server/src/main/java/com/ruoyi/basic/controller/CoalValueController.java b/basic-server/src/main/java/com/ruoyi/basic/controller/CoalValueController.java
new file mode 100644
index 0000000..0a30a4c
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/controller/CoalValueController.java
@@ -0,0 +1,54 @@
+package com.ruoyi.basic.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.CoalValueDto;
+import com.ruoyi.basic.entity.CoalValue;
+import com.ruoyi.basic.service.CoalValueService;
+import com.ruoyi.common.core.domain.R;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/basic/coalValue")
+public class CoalValueController {
+
+    private CoalValueService coalValueService;
+
+    /**
+     * 鐓よ川鏂规鏌ヨ
+     */
+    @GetMapping("/list")
+    public R<IPage<CoalValue>> list(Page page, CoalValueDto coalValueDto) {
+        IPage<CoalValue> list = coalValueService.selectCoalFieldList(page, coalValueDto);
+        return R.ok(list);
+    }
+
+
+    /**
+     * 鐓よ川鏂规鍊兼柊澧炰慨鏀�
+     */
+    @PostMapping("/addOrEditCoalValue")
+    public R addOrEditCoalValue(@RequestBody CoalValueDto coalValueDto) {
+        return R.ok(coalValueService.addOrEditCoalValue(coalValueDto));
+    }
+
+    /**
+     * 鐓よ川鏂规瀛楁鍒犻櫎
+     */
+    @DeleteMapping("/delCoalValue")
+    public R remove(@RequestBody Long[] ids) {
+        return R.ok(coalValueService.delCoalValueByIds(ids));
+    }
+
+}
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
new file mode 100644
index 0000000..6defeca
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/dto/CoalFieldDto.java
@@ -0,0 +1,8 @@
+package com.ruoyi.basic.dto;
+
+import com.ruoyi.basic.entity.CoalField;
+import lombok.Data;
+
+@Data
+public class CoalFieldDto extends CoalField {
+}
diff --git a/basic-server/src/main/java/com/ruoyi/basic/dto/CoalPlanDto.java b/basic-server/src/main/java/com/ruoyi/basic/dto/CoalPlanDto.java
new file mode 100644
index 0000000..7282531
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/dto/CoalPlanDto.java
@@ -0,0 +1,8 @@
+package com.ruoyi.basic.dto;
+
+import com.ruoyi.basic.entity.CoalPlan;
+import lombok.Data;
+
+@Data
+public class CoalPlanDto extends CoalPlan {
+}
diff --git a/basic-server/src/main/java/com/ruoyi/basic/dto/CoalValueDto.java b/basic-server/src/main/java/com/ruoyi/basic/dto/CoalValueDto.java
new file mode 100644
index 0000000..55d2db8
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/dto/CoalValueDto.java
@@ -0,0 +1,13 @@
+package com.ruoyi.basic.dto;
+
+import com.ruoyi.basic.entity.CoalValue;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class CoalValueDto extends CoalValue {
+
+    private List<Map<String, String>> fieldValue;
+}
diff --git a/basic-server/src/main/java/com/ruoyi/basic/entity/CoalField.java b/basic-server/src/main/java/com/ruoyi/basic/entity/CoalField.java
new file mode 100644
index 0000000..567a88b
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/entity/CoalField.java
@@ -0,0 +1,45 @@
+package com.ruoyi.basic.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import com.ruoyi.common.core.domain.MyBaseEntity;
+
+/**
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� 瀹炰綋绫�
+ *
+ * @author ruoyi
+ * @date 2025-06-09
+ */
+@Data
+@TableName("coal_field")
+public class CoalField extends MyBaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 瀛楁
+     */
+    @TableField(value = "fields")
+    private String fields;
+    /**
+     * 瀛楁鍚�
+     */
+    @TableField(value = "field_name")
+    private String fieldName;
+
+    /**
+     * 瀛楁鍚嶆暟瀛�
+     */
+    @TableField(value = "field_name")
+    private String fieldNumber;
+    /**
+     * 瀛楁鎻忚堪
+     */
+    @TableField(value = "field_description")
+    private String fieldDescription;
+}
\ No newline at end of file
diff --git a/basic-server/src/main/java/com/ruoyi/basic/entity/CoalPlan.java b/basic-server/src/main/java/com/ruoyi/basic/entity/CoalPlan.java
new file mode 100644
index 0000000..0c097ff
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/entity/CoalPlan.java
@@ -0,0 +1,40 @@
+package com.ruoyi.basic.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import com.ruoyi.common.core.domain.MyBaseEntity;
+
+/**
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� 瀹炰綋绫�
+ *
+ * @author ruoyi
+ * @date 2025-06-09
+ */
+@Data
+@TableName("coal_plan")
+public class CoalPlan extends MyBaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 鐓よ川鏂规
+     */
+    @TableField(value = "plan")
+    private String plan;
+    /**
+     * 鐓よ川鏂规瀛楁
+     */
+    @TableField(value = "coal_fields")
+    private String coalFields;
+
+    /**
+     * 鐓よ川鏂规瀛楁
+     */
+    @TableField(value = "scheme_desc")
+    private String schemeDesc;
+}
\ No newline at end of file
diff --git a/basic-server/src/main/java/com/ruoyi/basic/entity/CoalValue.java b/basic-server/src/main/java/com/ruoyi/basic/entity/CoalValue.java
new file mode 100644
index 0000000..84b2a8c
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/entity/CoalValue.java
@@ -0,0 +1,46 @@
+package com.ruoyi.basic.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import com.ruoyi.common.core.domain.MyBaseEntity;
+
+/**
+ * 鐓よ川鏂规瀛楁鍊� 瀹炰綋绫�
+ *
+ * @author ruoyi
+ * @date 2025-06-09
+ */
+@Data
+@TableName("coal_value")
+public class CoalValue extends MyBaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 鍏宠仈閲囪喘鍏ュ簱涓婚敭ID
+     */
+    @TableField(value = "plan_id")
+    private Long planId;
+    /**
+     * 瀛楁鍊�
+     */
+    @TableField(value = "coal_value")
+    private String coalValue;
+    /**
+     * 瀛楁
+     */
+    @TableField(value = "fields")
+    private String fields;
+    /**
+     * 瀛楁鍚�
+     */
+    @TableField(value = "field_name")
+    private String fieldName;
+
+}
\ No newline at end of file
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
new file mode 100644
index 0000000..7a61957
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalFieldMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.basic.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.basic.entity.CoalField;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+@Mapper
+public interface CoalFieldMapper extends BaseMapper<CoalField> {
+
+}
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
new file mode 100644
index 0000000..472e117
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalPlanMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.basic.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.basic.entity.CoalPlan;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+@Mapper
+public interface CoalPlanMapper extends BaseMapper<CoalPlan> {
+
+}
diff --git a/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalValueMapper.java b/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalValueMapper.java
new file mode 100644
index 0000000..6865bf2
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/mapper/CoalValueMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.basic.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.basic.entity.CoalValue;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+@Mapper
+public interface CoalValueMapper extends BaseMapper<CoalValue> {
+
+}
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
new file mode 100644
index 0000000..574cc98
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/CoalFieldService.java
@@ -0,0 +1,28 @@
+package com.ruoyi.basic.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.CoalFieldDto;
+import com.ruoyi.basic.entity.CoalField;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+public interface CoalFieldService extends IService<CoalField> {
+
+    IPage<CoalField> selectCoalFieldList(Page page, CoalFieldDto coalFieldDto);
+
+    int addOrEditCoalField(CoalFieldDto coalFieldDto);
+
+    int delCoalFieldByIds(Long[] ids);
+
+    List<CoalField> selectAllList(CoalFieldDto coalFieldDto);
+}
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
new file mode 100644
index 0000000..0ff8f37
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/CoalPlanService.java
@@ -0,0 +1,28 @@
+package com.ruoyi.basic.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.basic.dto.CoalPlanDto;
+import com.ruoyi.basic.entity.CoalPlan;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+public interface CoalPlanService extends IService<CoalPlan> {
+
+    IPage<CoalPlan> selectCoalFieldList(Page page, CoalPlanDto coalPlanDto);
+
+    int addOrEditCoalPlan(CoalPlanDto coalPlanDto);
+
+    int delCoalPlanByIds(Long[] ids);
+
+    List<CoalPlan> selectAllList();
+}
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/CoalValueService.java b/basic-server/src/main/java/com/ruoyi/basic/service/CoalValueService.java
new file mode 100644
index 0000000..205c205
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/CoalValueService.java
@@ -0,0 +1,24 @@
+package com.ruoyi.basic.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.basic.dto.CoalValueDto;
+import com.ruoyi.basic.entity.CoalValue;
+
+/**
+ * <p>
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+public interface CoalValueService extends IService<CoalValue> {
+
+    IPage<CoalValue> selectCoalFieldList(Page page, CoalValueDto coalValueDto);
+
+    int addOrEditCoalValue(CoalValueDto coalValueDto);
+
+    int delCoalValueByIds(Long[] ids);
+}
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
new file mode 100644
index 0000000..e01e082
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalFieldServiceImpl.java
@@ -0,0 +1,107 @@
+package com.ruoyi.basic.service.impl;
+
+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.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.dto.CoalFieldDto;
+import com.ruoyi.basic.entity.CoalField;
+import com.ruoyi.basic.mapper.CoalFieldMapper;
+import com.ruoyi.basic.service.CoalFieldService;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * <p>
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+@Service
+@RequiredArgsConstructor
+public class CoalFieldServiceImpl extends ServiceImpl<CoalFieldMapper, CoalField> implements CoalFieldService {
+
+    private final CoalFieldMapper coalFieldMapper;
+
+    // 姝e垯琛ㄨ揪寮忥細鍖归厤 "fieldXX" 鏍煎紡锛孹X 涓轰袱浣嶆暟瀛�
+    private static final Pattern FIELD_PATTERN = Pattern.compile("^field(\\d{2})$");
+
+    @Override
+    public IPage<CoalField> selectCoalFieldList(Page page, CoalFieldDto coalFieldDto) {
+        LambdaQueryWrapper<CoalField> queryWrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.hasText(coalFieldDto.getFieldName())) {
+            queryWrapper.like(CoalField::getFieldName, coalFieldDto.getFieldName());
+        }
+        queryWrapper.orderByDesc(CoalField::getCreateTime);
+        return coalFieldMapper.selectPage(page, queryWrapper);
+    }
+
+    @Override
+    public int addOrEditCoalField(CoalFieldDto coalFieldDto) {
+        CoalField coalField = new CoalField();
+        BeanUtils.copyProperties(coalFieldDto, coalField);
+        if (Objects.isNull(coalFieldDto.getId())) {
+            // 鏂板鎿嶄綔锛氱敓鎴愬敮涓�鐨� fieldXX 缂栧彿
+            String nextFieldNumber = generateNextFieldNumber();
+            coalField.setFields(nextFieldNumber);
+            return coalFieldMapper.insert(coalField);
+        } else {
+            // 鏇存柊鎿嶄綔锛氫笉淇敼 fieldNumber
+            return coalFieldMapper.updateById(coalField);
+        }
+    }
+
+    @Override
+    public int delCoalFieldByIds(Long[] ids) {
+        // 妫�鏌ュ弬鏁�
+        if (ids == null || ids.length == 0) {
+            return 0;
+        }
+        // 鏋勯�犳洿鏂版潯浠�
+        UpdateWrapper<CoalField> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.in("id", ids)
+                .set("deleted", 1);  // 璁剧疆 deleted 涓� 1 琛ㄧず宸插垹闄�
+        // 鎵ц鎵归噺閫昏緫鍒犻櫎
+        return coalFieldMapper.update(null, updateWrapper);
+    }
+
+    @Override
+    public List<CoalField> selectAllList(CoalFieldDto coalFieldDto) {
+        return coalFieldMapper.selectList(null);
+    }
+
+    private String generateNextFieldNumber() {
+        // 鑾峰彇鎵�鏈夊凡瀛樺湪鐨� CoalField 璁板綍锛屽寘鎷凡鍒犻櫎鐨�
+        LambdaQueryWrapper<CoalField> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(CoalField::getDeleted, 0, 1);
+        List<CoalField> existingFields = coalFieldMapper.selectList(queryWrapper);
+
+        // 鎻愬彇骞惰В鏋愭墍鏈夊凡瀛樺湪鐨� fieldXX 缂栧彿
+        int maxNumber = 0;
+        for (CoalField field : existingFields) {
+            String fields = field.getFields();
+            if (fields != null) {
+                Matcher matcher = FIELD_PATTERN.matcher(fields);
+                if (matcher.matches()) {
+                    String numberPart = matcher.group(1);
+                    int currentNumber = Integer.parseInt(numberPart);
+                    maxNumber = Math.max(maxNumber, currentNumber);
+                }
+            }
+        }
+
+        // 鐢熸垚涓嬩竴涓紪鍙凤紙鏍煎紡涓轰袱浣嶆暟瀛楋紝涓嶈冻琛ラ浂锛�
+        int nextNumber = maxNumber + 1;
+        return String.format("field%02d", nextNumber);
+    }
+}
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalInfoServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalInfoServiceImpl.java
index 4b38b0e..a4ffd27 100644
--- a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalInfoServiceImpl.java
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalInfoServiceImpl.java
@@ -48,7 +48,7 @@
         BeanUtils.copyProperties(coalInfoDto, coalInfo);
         coalInfo.setMaintainerId(SecurityUtils.getUserId());
         coalInfo.setMaintenanceDate(DateUtils.getNowDate());
-        if (Objects.isNull(coalInfo.getId())) {
+        if (Objects.isNull(coalInfoDto.getId())) {
             return coalInfoMapper.insert(coalInfo);
         } else {
             return coalInfoMapper.updateById(coalInfo);
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
new file mode 100644
index 0000000..7c6e7f5
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalPlanServiceImpl.java
@@ -0,0 +1,68 @@
+package com.ruoyi.basic.service.impl;
+
+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.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.dto.CoalPlanDto;
+import com.ruoyi.basic.entity.CoalPlan;
+import com.ruoyi.basic.mapper.CoalPlanMapper;
+import com.ruoyi.basic.service.CoalPlanService;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+@Service
+@RequiredArgsConstructor
+public class CoalPlanServiceImpl extends ServiceImpl<CoalPlanMapper, CoalPlan> implements CoalPlanService {
+
+    private final CoalPlanMapper coalPlanMapper;
+
+    @Override
+    public IPage<CoalPlan> selectCoalFieldList(Page page, CoalPlanDto coalPlanDto) {
+        LambdaQueryWrapper<CoalPlan> queryWrapper = new LambdaQueryWrapper<>();
+        return coalPlanMapper.selectPage(page,queryWrapper);
+    }
+
+    @Override
+    public int addOrEditCoalPlan(CoalPlanDto coalPlanDto) {
+        CoalPlan coalPlan = new CoalPlan();
+        BeanUtils.copyProperties(coalPlanDto, coalPlan);
+        if (Objects.isNull(coalPlanDto.getId())) {
+            return coalPlanMapper.insert(coalPlan);
+        } else {
+            return coalPlanMapper.updateById(coalPlan);
+        }
+    }
+
+    @Override
+    public int delCoalPlanByIds(Long[] ids) {
+        // 妫�鏌ュ弬鏁�
+        if (ids == null || ids.length == 0) {
+            return 0;
+        }
+        // 鏋勯�犳洿鏂版潯浠�
+        UpdateWrapper<CoalPlan> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.in("id", ids)
+                .set("deleted", 1);  // 璁剧疆 deleted 涓� 1 琛ㄧず宸插垹闄�
+        // 鎵ц鎵归噺閫昏緫鍒犻櫎
+        return coalPlanMapper.update(null, updateWrapper);
+    }
+
+    @Override
+    public List<CoalPlan> selectAllList() {
+        return coalPlanMapper.selectList(null);
+    }
+}
diff --git a/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalValueServiceImpl.java b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalValueServiceImpl.java
new file mode 100644
index 0000000..b5e4eb4
--- /dev/null
+++ b/basic-server/src/main/java/com/ruoyi/basic/service/impl/CoalValueServiceImpl.java
@@ -0,0 +1,74 @@
+package com.ruoyi.basic.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.dto.CoalValueDto;
+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.basic.service.CoalValueService;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-09
+ */
+@Service
+@RequiredArgsConstructor
+public class CoalValueServiceImpl extends ServiceImpl<CoalValueMapper, CoalValue> implements CoalValueService {
+
+    private final CoalValueMapper coalValueMapper;
+
+    private final CoalFieldMapper coalFieldMapper;
+
+    @Override
+    public IPage<CoalValue> selectCoalFieldList(Page page, CoalValueDto coalValueDto) {
+        LambdaQueryWrapper<CoalValue> queryWrapper = new LambdaQueryWrapper<>();
+        return coalValueMapper.selectPage(page, queryWrapper);
+    }
+
+    @Override
+    public int addOrEditCoalValue(CoalValueDto coalValueDto) {
+        CoalValue coalValue = new CoalValue();
+        BeanUtils.copyProperties(coalValueDto, coalValue);
+        coalValue.setPlanId(coalValueDto.getPlanId());
+        int i = 0;
+        if (Objects.isNull(coalValueDto.getId())) {
+            List<Map<String, String>> fieldValue = coalValueDto.getFieldValue();
+            for (Map<String, String> field : fieldValue) {
+                for (Map.Entry<String, String> entry : field.entrySet()) {
+                    String key = entry.getKey();   // 鑾峰彇 key锛岃繖閲屼細寰楀埌 "field01"
+                    String value = entry.getValue(); // 鑾峰彇 value锛岃繖閲屼細寰楀埌 "99"
+                    LambdaQueryWrapper<CoalField> queryWrapper = new LambdaQueryWrapper<>();
+                    CoalField coalField = coalFieldMapper.selectOne(queryWrapper.eq(CoalField::getFields, key));
+                    coalValue.setCoalValue(value);
+                    coalValue.setFields(coalField.getFields());
+                    coalValue.setFieldName(coalField.getFieldName());
+                    coalValue.setId(null);
+                    i = coalValueMapper.insert(coalValue);
+                }
+            }
+            return i;
+        } else {
+            return coalValueMapper.updateById(coalValue);
+        }
+    }
+
+    @Override
+    public int delCoalValueByIds(Long[] ids) {
+        return 0;
+    }
+}
diff --git a/basic-server/src/main/resources/db/migration/postgresql/V20250606163300__create_table_coal_field.sql b/basic-server/src/main/resources/db/migration/postgresql/V20250606163300__create_table_coal_field.sql
new file mode 100644
index 0000000..6651721
--- /dev/null
+++ b/basic-server/src/main/resources/db/migration/postgresql/V20250606163300__create_table_coal_field.sql
@@ -0,0 +1,28 @@
+-- 鍒涘缓鐓よ川淇℃伅琛�
+CREATE TABLE coal_field
+(
+    id                BIGSERIAL PRIMARY KEY,                              -- 涓婚敭ID锛岃嚜鍔ㄩ�掑
+
+    fields            VARCHAR(255) NOT NULL,                              --鐓よ川瀛楁
+    field_name        VARCHAR(255) NOT NULL,                              -- 鐓よ川鎻忚堪
+    field_description VARCHAR(255) NOT NULL,                              -- 鐓よ川鎻忚堪
+
+    deleted           INT          NOT NULL    DEFAULT 0,                 -- 杞垹闄ゆ爣蹇楋細0=鏈垹闄わ紝1=宸插垹闄�
+    create_by         VARCHAR(255),                                       -- 鍒涘缓浜虹敤鎴峰悕
+    create_time       TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, -- 鍒涘缓鏃堕棿锛岄粯璁ゅ綋鍓嶆椂闂�
+    update_by         VARCHAR(255),                                       -- 鏈�鍚庢洿鏂颁汉鐢ㄦ埛鍚�
+    update_time       TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP  -- 鏈�鍚庢洿鏂版椂闂达紝榛樿褰撳墠鏃堕棿
+);
+
+-- 琛ㄦ敞閲�
+COMMENT ON TABLE coal_field IS '鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹�';
+
+-- 瀛楁娉ㄩ噴
+COMMENT ON COLUMN coal_field.id IS '涓婚敭ID';
+COMMENT ON COLUMN coal_field.fields IS '鐓ょ绫诲瀷id';
+COMMENT ON COLUMN coal_field.field_name IS '鐓ょ绫诲瀷';
+COMMENT ON COLUMN coal_field.deleted IS '杞垹闄ゆ爣蹇楋紝0=鏈垹闄わ紝1=宸插垹闄�';
+COMMENT ON COLUMN coal_field.create_by IS '鍒涘缓璇ヨ褰曠殑鐢ㄦ埛';
+COMMENT ON COLUMN coal_field.create_time IS '璁板綍鍒涘缓鏃堕棿';
+COMMENT ON COLUMN coal_field.update_by IS '鏈�鍚庝慨鏀硅璁板綍鐨勭敤鎴�';
+COMMENT ON COLUMN coal_field.update_time IS '璁板綍鏈�鍚庢洿鏂版椂闂�';
\ No newline at end of file
diff --git a/basic-server/src/main/resources/db/migration/postgresql/V20250606170900__create_table_coal_plan.sql b/basic-server/src/main/resources/db/migration/postgresql/V20250606170900__create_table_coal_plan.sql
new file mode 100644
index 0000000..9daa595
--- /dev/null
+++ b/basic-server/src/main/resources/db/migration/postgresql/V20250606170900__create_table_coal_plan.sql
@@ -0,0 +1,27 @@
+-- 鍒涘缓鐓よ川淇℃伅琛�
+CREATE TABLE coal_plan
+(
+    id          BIGSERIAL PRIMARY KEY,                              -- 涓婚敭ID锛岃嚜鍔ㄩ�掑
+
+    plan        VARCHAR(255) NOT NULL,                              --鐓よ川鏂规
+    coal_fields BIGINT       NOT NULL,                              -- 鐓よ川鏂规瀛楁
+
+    deleted     INT          NOT NULL    DEFAULT 0,                 -- 杞垹闄ゆ爣蹇楋細0=鏈垹闄わ紝1=宸插垹闄�
+    create_by   VARCHAR(255),                                       -- 鍒涘缓浜虹敤鎴峰悕
+    create_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, -- 鍒涘缓鏃堕棿锛岄粯璁ゅ綋鍓嶆椂闂�
+    update_by   VARCHAR(255),                                       -- 鏈�鍚庢洿鏂颁汉鐢ㄦ埛鍚�
+    update_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP  -- 鏈�鍚庢洿鏂版椂闂达紝榛樿褰撳墠鏃堕棿
+);
+
+-- 琛ㄦ敞閲�
+COMMENT ON TABLE coal_plan IS '鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹�';
+
+-- 瀛楁娉ㄩ噴
+COMMENT ON COLUMN coal_plan.id IS '涓婚敭ID';
+COMMENT ON COLUMN coal_plan.plan IS '鐓よ川鏂规';
+COMMENT ON COLUMN coal_plan.coal_fields IS '鐓よ川鏂规瀛楁';
+COMMENT ON COLUMN coal_plan.deleted IS '杞垹闄ゆ爣蹇楋紝0=鏈垹闄わ紝1=宸插垹闄�';
+COMMENT ON COLUMN coal_plan.create_by IS '鍒涘缓璇ヨ褰曠殑鐢ㄦ埛';
+COMMENT ON COLUMN coal_plan.create_time IS '璁板綍鍒涘缓鏃堕棿';
+COMMENT ON COLUMN coal_plan.update_by IS '鏈�鍚庝慨鏀硅璁板綍鐨勭敤鎴�';
+COMMENT ON COLUMN coal_plan.update_time IS '璁板綍鏈�鍚庢洿鏂版椂闂�';
\ No newline at end of file
diff --git a/basic-server/src/main/resources/db/migration/postgresql/V20250606171000__create_table_coal_value.sql b/basic-server/src/main/resources/db/migration/postgresql/V20250606171000__create_table_coal_value.sql
new file mode 100644
index 0000000..59d6491
--- /dev/null
+++ b/basic-server/src/main/resources/db/migration/postgresql/V20250606171000__create_table_coal_value.sql
@@ -0,0 +1,31 @@
+-- 鍒涘缓鐓よ川淇℃伅琛�
+CREATE TABLE coal_value
+(
+    id          BIGSERIAL PRIMARY KEY,                              -- 涓婚敭ID锛岃嚜鍔ㄩ�掑
+
+    plan_id     VARCHAR(255) NOT NULL,                              --鍏宠仈鐓よ川鏂规涓婚敭ID
+    coal_value  VARCHAR(255) NOT NULL,                              -- 瀛楁鍊�
+    fields      VARCHAR(255) NOT NULL,                              -- 瀛楁
+    field_name  VARCHAR(255) NOT NULL,                              -- 瀛楁鍚�
+
+    deleted     INT          NOT NULL    DEFAULT 0,                 -- 杞垹闄ゆ爣蹇楋細0=鏈垹闄わ紝1=宸插垹闄�
+    create_by   VARCHAR(255),                                       -- 鍒涘缓浜虹敤鎴峰悕
+    create_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, -- 鍒涘缓鏃堕棿锛岄粯璁ゅ綋鍓嶆椂闂�
+    update_by   VARCHAR(255),                                       -- 鏈�鍚庢洿鏂颁汉鐢ㄦ埛鍚�
+    update_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP  -- 鏈�鍚庢洿鏂版椂闂达紝榛樿褰撳墠鏃堕棿
+);
+
+-- 琛ㄦ敞閲�
+COMMENT ON TABLE coal_value IS '鐓よ川淇℃伅琛紝璁板綍鐓ょ偔璐ㄩ噺妫�娴嬬浉鍏虫暟鎹�';
+
+-- 瀛楁娉ㄩ噴
+COMMENT ON COLUMN coal_value.id IS '涓婚敭ID';
+COMMENT ON COLUMN coal_value.plan_id IS '鍏宠仈鐓よ川鏂规涓婚敭ID';
+COMMENT ON COLUMN coal_value.coal_value IS '瀛楁鍊�';
+COMMENT ON COLUMN coal_value.fields IS '瀛楁';
+COMMENT ON COLUMN coal_value.field_name IS '瀛楁鍚�';
+COMMENT ON COLUMN coal_value.deleted IS '杞垹闄ゆ爣蹇楋紝0=鏈垹闄わ紝1=宸插垹闄�';
+COMMENT ON COLUMN coal_value.create_by IS '鍒涘缓璇ヨ褰曠殑鐢ㄦ埛';
+COMMENT ON COLUMN coal_value.create_time IS '璁板綍鍒涘缓鏃堕棿';
+COMMENT ON COLUMN coal_value.update_by IS '鏈�鍚庝慨鏀硅璁板綍鐨勭敤鎴�';
+COMMENT ON COLUMN coal_value.update_time IS '璁板綍鏈�鍚庢洿鏂版椂闂�';
\ No newline at end of file
diff --git a/basic-server/src/main/resources/mapper/CoalFieldMapper.xml b/basic-server/src/main/resources/mapper/CoalFieldMapper.xml
new file mode 100644
index 0000000..55beb38
--- /dev/null
+++ b/basic-server/src/main/resources/mapper/CoalFieldMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.basic.mapper.CoalFieldMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.basic.entity.CoalField">
+        <id column="id" property="id"/>
+        <result column="deleted" property="deleted"/>
+        <result column="create_by" property="createBy"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_by" property="updateBy"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="fields" property="fields"/>
+        <result column="field_name" property="fieldName"/>
+        <result column="field_description" property="fieldDescription"/>
+    </resultMap>
+
+    <!-- 閫氱敤鏌ヨ缁撴灉鍒� -->
+    <sql id="Base_Column_List">
+        deleted,
+                create_by,
+                create_time,
+                update_by,
+                update_time,
+            id, fields, field_name, field_description
+    </sql>
+
+</mapper>
\ No newline at end of file
diff --git a/basic-server/src/main/resources/mapper/CoalPlanMapper.xml b/basic-server/src/main/resources/mapper/CoalPlanMapper.xml
new file mode 100644
index 0000000..1619359
--- /dev/null
+++ b/basic-server/src/main/resources/mapper/CoalPlanMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.basic.mapper.CoalPlanMapper">
+
+        <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+        <resultMap id="BaseResultMap" type="com.ruoyi.basic.entity.CoalPlan">
+                    <id column="id" property="id" />
+                <result column="deleted" property="deleted" />
+                <result column="create_by" property="createBy" />
+                <result column="create_time" property="createTime" />
+                <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" />
+        </resultMap>
+
+        <!-- 閫氱敤鏌ヨ缁撴灉鍒� -->
+        <sql id="Base_Column_List">
+                deleted,
+                create_by,
+                create_time,
+                update_by,
+                update_time,
+            id, plan, coal_field_id, field_names
+        </sql>
+
+</mapper>
\ No newline at end of file
diff --git a/basic-server/src/main/resources/mapper/CoalValueMapper.xml b/basic-server/src/main/resources/mapper/CoalValueMapper.xml
new file mode 100644
index 0000000..eed77d3
--- /dev/null
+++ b/basic-server/src/main/resources/mapper/CoalValueMapper.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.basic.mapper.CoalValueMapper">
+
+        <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+        <resultMap id="BaseResultMap" type="com.ruoyi.basic.entity.CoalValue">
+                    <id column="id" property="id" />
+                <result column="deleted" property="deleted" />
+                <result column="create_by" property="createBy" />
+                <result column="create_time" property="createTime" />
+                <result column="update_by" property="updateBy" />
+                <result column="update_time" property="updateTime" />
+                    <result column="fields" property="fields" />
+                    <result column="field_name" property="fieldName" />
+                    <result column="field_value" property="fieldValue" />
+        </resultMap>
+
+        <!-- 閫氱敤鏌ヨ缁撴灉鍒� -->
+        <sql id="Base_Column_List">
+                deleted,
+                create_by,
+                create_time,
+                update_by,
+                update_time,
+            id, fields, field_name, field_value
+        </sql>
+
+</mapper>
\ No newline at end of file
diff --git a/main-business/pom.xml b/main-business/pom.xml
index b2cc32b..c1f56f7 100644
--- a/main-business/pom.xml
+++ b/main-business/pom.xml
@@ -40,6 +40,10 @@
             <groupId>org.flywaydb</groupId>
             <artifactId>flyway-database-postgresql</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.ruoyi</groupId>
+            <artifactId>basic-server</artifactId>
+        </dependency>
     </dependencies>
 
     <properties>
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 dd4b2e8..b9cac2d 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
@@ -1,21 +1,39 @@
 package com.ruoyi.business.controller;
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.business.dto.OfficialInventoryDto;
+import com.ruoyi.business.entity.OfficialInventory;
+import com.ruoyi.business.service.OfficialInventoryService;
+import com.ruoyi.common.core.domain.R;
 import lombok.AllArgsConstructor;
-    import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 
 /**
-* <p>
-    * 姝e紡搴撳瓨琛� 鍓嶇鎺у埗鍣�
-    * </p>
-*
-* @author ruoyi
-* @since 2025-06-04
-*/
+ * <p>
+ * 姝e紡搴撳瓨琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author ruoyi
+ * @since 2025-06-04
+ */
 
 @RestController
 @AllArgsConstructor
-@RequestMapping("/business/officialInventory")
-        public class OfficialInventoryController {
+@RequestMapping("/officialInventory")
+public class OfficialInventoryController {
 
+    private OfficialInventoryService officialInventoryService;
+
+    /**
+     * 姝e紡搴撳簱琛ㄦ煡璇�
+     */
+    @GetMapping("/list")
+    public R<IPage<OfficialInventory>> list(Page page, OfficialInventoryDto officialInventoryDto) {
+        IPage<OfficialInventory> list = officialInventoryService.selectOfficialInventoryList(page,officialInventoryDto);
+        return R.ok(list);
     }
+
+}
diff --git a/main-business/src/main/java/com/ruoyi/business/controller/PendingInventoryController.java b/main-business/src/main/java/com/ruoyi/business/controller/PendingInventoryController.java
index 1aac7da..0968c40 100644
--- a/main-business/src/main/java/com/ruoyi/business/controller/PendingInventoryController.java
+++ b/main-business/src/main/java/com/ruoyi/business/controller/PendingInventoryController.java
@@ -1,8 +1,13 @@
 package com.ruoyi.business.controller;
 
-import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.business.dto.PendingInventoryDto;
+import com.ruoyi.business.entity.PendingInventory;
+import com.ruoyi.business.service.PendingInventoryService;
+import com.ruoyi.common.core.domain.R;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * <p>
@@ -15,7 +20,34 @@
 
 @RestController
 @AllArgsConstructor
-@RequestMapping("/business/pendingInventory")
+@RequestMapping("/pendingInventory")
 public class PendingInventoryController {
 
+        private PendingInventoryService pendingInventoryService;
+
+    /**
+     * 寰呭叆搴撹〃鏌ヨ
+     */
+    @GetMapping("/list")
+    public R<IPage<PendingInventory>> list(Page page, PendingInventoryDto pendingInventoryDto) {
+        IPage<PendingInventory> list = pendingInventoryService.selectPendingInventoryList(page,pendingInventoryDto);
+        return R.ok(list);
+    }
+
+    /**
+     * 鏂板淇敼
+     */
+    @PostMapping("/addOrEditPending")
+    public R addOrEditPending(@RequestBody PendingInventoryDto pendingInventoryDto) {
+        return R.ok(pendingInventoryService.addOrEditPending(pendingInventoryDto));
+    }
+
+    /**
+     * 鍒犻櫎
+     */
+    @DeleteMapping("/delPending")
+    public R remove(@RequestBody Long[] ids) {
+        return R.ok(pendingInventoryService.delByIds(ids));
+    }
+
 }
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
new file mode 100644
index 0000000..9d668b7
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/dto/OfficialInventoryDto.java
@@ -0,0 +1,8 @@
+package com.ruoyi.business.dto;
+
+import com.ruoyi.business.entity.OfficialInventory;
+import lombok.Data;
+
+@Data
+public class OfficialInventoryDto extends OfficialInventory {
+}
diff --git a/main-business/src/main/java/com/ruoyi/business/dto/PendingInventoryDto.java b/main-business/src/main/java/com/ruoyi/business/dto/PendingInventoryDto.java
new file mode 100644
index 0000000..01a78a7
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/dto/PendingInventoryDto.java
@@ -0,0 +1,8 @@
+package com.ruoyi.business.dto;
+
+import com.ruoyi.business.entity.PendingInventory;
+import lombok.Data;
+
+@Data
+public class PendingInventoryDto extends PendingInventory {
+}
diff --git a/main-business/src/main/java/com/ruoyi/business/entity/PendingInventory.java b/main-business/src/main/java/com/ruoyi/business/entity/PendingInventory.java
index 943b592..c30d533 100644
--- a/main-business/src/main/java/com/ruoyi/business/entity/PendingInventory.java
+++ b/main-business/src/main/java/com/ruoyi/business/entity/PendingInventory.java
@@ -35,8 +35,8 @@
     /**
      * 鐓ょ
      */
-    @TableField(value = "coal_type")
-    private String coalType;
+    @TableField(value = "coal")
+    private String coal;
     /**
      * 鍗曚綅
      */
@@ -65,8 +65,8 @@
     /**
      * 鐧昏浜�
      */
-    @TableField(value = "registrant")
-    private String registrant;
+    @TableField(value = "registrant_id")
+    private String registrantId;
     /**
      * 鐧昏鏃堕棿
      */
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 ae1dc65..4d7a915 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
@@ -1,5 +1,8 @@
 package com.ruoyi.business.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.business.dto.OfficialInventoryDto;
 import com.ruoyi.business.entity.OfficialInventory;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,4 +16,5 @@
  */
 public interface OfficialInventoryService extends IService<OfficialInventory> {
 
+    IPage<OfficialInventory> selectOfficialInventoryList(Page page, OfficialInventoryDto officialInventoryDto);
 }
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 aed794e..1d12d25 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
@@ -1,5 +1,8 @@
 package com.ruoyi.business.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.business.dto.PendingInventoryDto;
 import com.ruoyi.business.entity.PendingInventory;
 import com.baomidou.mybatisplus.extension.service.IService;
 
@@ -13,4 +16,9 @@
  */
 public interface PendingInventoryService extends IService<PendingInventory> {
 
+    IPage<PendingInventory> selectPendingInventoryList(Page page, PendingInventoryDto pendingInventoryDto);
+
+    int addOrEditPending(PendingInventoryDto pendingInventoryDto);
+
+    int delByIds(Long[] ids);
 }
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 516da13..fdc9186 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,5 +1,9 @@
 package com.ruoyi.business.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.business.dto.OfficialInventoryDto;
 import com.ruoyi.business.entity.OfficialInventory;
 import com.ruoyi.business.mapper.OfficialInventoryMapper;
 import com.ruoyi.business.service.OfficialInventoryService;
@@ -19,4 +23,11 @@
 @RequiredArgsConstructor
 public class OfficialInventoryServiceImpl extends ServiceImpl<OfficialInventoryMapper, OfficialInventory> implements OfficialInventoryService {
 
+    private final OfficialInventoryMapper officialInventoryMapper;
+
+    @Override
+    public IPage<OfficialInventory> selectOfficialInventoryList(Page page, OfficialInventoryDto officialInventoryDto) {
+        LambdaQueryWrapper<OfficialInventory> queryWrapper = new LambdaQueryWrapper<>();
+        return officialInventoryMapper.selectPage(page, queryWrapper);
+    }
 }
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 820e71a..ac74173 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
@@ -1,11 +1,21 @@
 package com.ruoyi.business.service.impl;
 
+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.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.basic.mapper.CoalFieldMapper;
+import com.ruoyi.basic.mapper.CoalValueMapper;
+import com.ruoyi.business.dto.PendingInventoryDto;
 import com.ruoyi.business.entity.PendingInventory;
 import com.ruoyi.business.mapper.PendingInventoryMapper;
 import com.ruoyi.business.service.PendingInventoryService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.stereotype.Service;
+import com.ruoyi.common.utils.bean.BeanUtils;
 import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
 
 /**
  * <p>
@@ -19,4 +29,41 @@
 @RequiredArgsConstructor
 public class PendingInventoryServiceImpl extends ServiceImpl<PendingInventoryMapper, PendingInventory> implements PendingInventoryService {
 
+    private final PendingInventoryMapper pendingInventoryMapper;
+
+    private final CoalValueMapper coalValueMapper;
+
+    private final CoalFieldMapper coalFieldMapper;
+
+    @Override
+    public IPage<PendingInventory> selectPendingInventoryList(Page page, PendingInventoryDto pendingInventoryDto) {
+        LambdaQueryWrapper<PendingInventory> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.orderByDesc(PendingInventory::getCreateTime);
+        return pendingInventoryMapper.selectPage(page, queryWrapper);
+    }
+
+    @Override
+    public int addOrEditPending(PendingInventoryDto pendingInventoryDto) {
+        PendingInventory pendingInventory = new PendingInventory();
+        BeanUtils.copyProperties(pendingInventoryDto, pendingInventory);
+        if (Objects.isNull(pendingInventoryDto.getId())) {
+            return pendingInventoryMapper.insert(pendingInventory);
+        } else {
+            return pendingInventoryMapper.updateById(pendingInventory);
+        }
+    }
+
+    @Override
+    public int delByIds(Long[] ids) {
+        // 妫�鏌ュ弬鏁�
+        if (ids == null || ids.length == 0) {
+            return 0;
+        }
+        // 鏋勯�犳洿鏂版潯浠�
+        UpdateWrapper<PendingInventory> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.in("id", ids)
+                .set("deleted", 1);  // 璁剧疆 deleted 涓� 1 琛ㄧず宸插垹闄�
+        // 鎵ц鎵归噺閫昏緫鍒犻櫎
+        return pendingInventoryMapper.update(null, updateWrapper);
+    }
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/impl/PurchaseRegistrationServiceImpl.java b/main-business/src/main/java/com/ruoyi/business/service/impl/PurchaseRegistrationServiceImpl.java
index 642cfea..54b2b7b 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/impl/PurchaseRegistrationServiceImpl.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/impl/PurchaseRegistrationServiceImpl.java
@@ -6,12 +6,16 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.business.dto.PurchaseRegistrationDto;
+import com.ruoyi.business.entity.PendingInventory;
 import com.ruoyi.business.entity.PurchaseRegistration;
+import com.ruoyi.business.mapper.PendingInventoryMapper;
 import com.ruoyi.business.mapper.PurchaseRegistrationMapper;
 import com.ruoyi.business.service.PurchaseRegistrationService;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.Assert;
 
 import java.util.Objects;
 
@@ -30,6 +34,8 @@
 
     private final PurchaseRegistrationMapper purchaseRegistrationMapper;
 
+    private final PendingInventoryMapper pendingInventoryMapper;
+
     @Override
     public IPage<PurchaseRegistration> selectPurchaseRegistrationList(Page page, PurchaseRegistrationDto purchaseRegistrationDto) {
         LambdaQueryWrapper<PurchaseRegistration> queryWrapper = new LambdaQueryWrapper<>();
@@ -38,17 +44,47 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public int addOrEditPR(PurchaseRegistrationDto purchaseRegistrationDto) {
+        // 鍙傛暟鏍¢獙
+        Assert.notNull(purchaseRegistrationDto, "閲囪喘鐧昏淇℃伅涓嶈兘涓虹┖");
+
+        // 鍒涘缓閲囪喘鐧昏瀹炰綋骞跺鍒跺睘鎬�
         PurchaseRegistration purchaseRegistration = new PurchaseRegistration();
-        BeanUtils.copyProperties(purchaseRegistrationDto,purchaseRegistration);
-        
+        BeanUtils.copyProperties(purchaseRegistrationDto, purchaseRegistration);
+
         if (Objects.isNull(purchaseRegistrationDto.getId())) {
-            return purchaseRegistrationMapper.insert(purchaseRegistration);
+            // 鏂板閲囪喘鐧昏
+            int insertCount = purchaseRegistrationMapper.insert(purchaseRegistration);
+            if (insertCount > 0) {
+                // 閲囪喘鐧昏鎴愬姛锛屽悓姝ュ垱寤哄緟鍏ュ簱璁板綍
+                PendingInventory pendingInventory = createPendingInventory(purchaseRegistration);
+                return pendingInventoryMapper.insert(pendingInventory);
+            }
+            return insertCount;
         } else {
+            // 鏇存柊閲囪喘鐧昏
             return purchaseRegistrationMapper.updateById(purchaseRegistration);
         }
     }
 
+    /**
+     * 鏍规嵁閲囪喘鐧昏淇℃伅鍒涘缓寰呭叆搴撹褰�
+     * @param purchaseRegistration 閲囪喘鐧昏瀹炰綋
+     * @return 寰呭叆搴撳疄浣�
+     */
+    private PendingInventory createPendingInventory(PurchaseRegistration purchaseRegistration) {
+        PendingInventory pendingInventory = new PendingInventory();
+        // 澶嶅埗鍩烘湰灞炴��
+        BeanUtils.copyProperties(purchaseRegistration, pendingInventory);
+
+        // 璁剧疆寰呭叆搴撹褰曠壒鏈夌殑灞炴�э紙濡傛灉鏈夛級
+        // pendingInventory.setStatus(InventoryStatus.PENDING);
+        // pendingInventory.setCreateTime(LocalDateTime.now());
+
+        return pendingInventory;
+    }
+
     @Override
     public int delByIds(Long[] ids) {
         // 妫�鏌ュ弬鏁�
diff --git a/main-business/src/main/resources/mapper/PendingInventoryMapper.xml b/main-business/src/main/resources/mapper/PendingInventoryMapper.xml
index dc8d8bd..384f9ef 100644
--- a/main-business/src/main/resources/mapper/PendingInventoryMapper.xml
+++ b/main-business/src/main/resources/mapper/PendingInventoryMapper.xml
@@ -11,13 +11,13 @@
                 <result column="update_by" property="updateBy" />
                 <result column="update_time" property="updateTime" />
                     <result column="supplier_name" property="supplierName" />
-                    <result column="coal_type" property="coalType" />
+                    <result column="coal" property="coal" />
                     <result column="unit" property="unit" />
                     <result column="inventory_quantity" property="inventoryQuantity" />
                     <result column="price_including_tax" property="priceIncludingTax" />
                     <result column="total_price_including_tax" property="totalPriceIncludingTax" />
                     <result column="cost_per_unit" property="costPerUnit" />
-                    <result column="registrant" property="registrant" />
+                    <result column="registrant_id" property="registrantId" />
                     <result column="registration_time" property="registrationTime" />
         </resultMap>
 

--
Gitblit v1.9.3