From 92d4fac0b58498efc6be7764f00364535beb3d71 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期二, 08 七月 2025 18:02:00 +0800
Subject: [PATCH] 1.首页数据 2.装备数据

---
 main-business/src/main/java/com/ruoyi/business/controller/HomePageController.java                                 |   55 +++
 main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentManagementServiceImpl.java                   |   17 +
 main-business/src/main/resources/mapper/EquipmentUsageRecordMapper.xml                                            |   33 ++
 main-business/src/main/java/com/ruoyi/business/service/EquipmentUsageRecordService.java                           |   23 +
 main-business/src/main/java/com/ruoyi/business/entity/EquipmentUsageRecord.java                                   |   66 ++++
 main-business/src/main/java/com/ruoyi/business/service/EquipmentManagementService.java                            |    5 
 main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentUsageRecordServiceImpl.java                  |   84 ++++++
 main-business/src/main/java/com/ruoyi/business/mapper/EquipmentUsageRecordMapper.java                             |   18 +
 main-business/src/main/resources/db/migration/postgresql/V20250707155600__create_table_equipment_usage_record.sql |   39 ++
 main-business/src/main/java/com/ruoyi/business/dto/EquipmentUsageRecordDto.java                                   |   12 
 main-business/src/main/java/com/ruoyi/business/vo/EquipmentManagementVo.java                                      |   13 
 main-business/src/main/java/com/ruoyi/business/dto/YearlyQueryDto.java                                            |   26 +
 main-business/src/main/java/com/ruoyi/business/mapper/SalesRecordMapper.java                                      |    6 
 main-business/src/main/java/com/ruoyi/business/service/impl/OfficialInventoryServiceImpl.java                     |   24 +
 main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java                           |  286 ++++++++++++++++++++
 main-business/src/main/java/com/ruoyi/business/service/OfficialInventoryService.java                              |    4 
 main-business/src/main/resources/mapper/SalesRecordMapper.xml                                                     |   14 
 main-business/src/main/java/com/ruoyi/business/controller/EquipmentManagementController.java                      |   13 
 main-business/src/main/resources/db/migration/postgresql/V20250701142700__create_table_equipment_management.sql   |    4 
 main-business/src/main/java/com/ruoyi/business/service/SalesRecordService.java                                    |    8 
 main-business/src/main/java/com/ruoyi/business/dto/HomePageDto.java                                               |   31 ++
 main-business/src/main/java/com/ruoyi/business/entity/EquipmentManagement.java                                    |    4 
 main-business/src/main/java/com/ruoyi/business/controller/EquipmentUsageRecordController.java                     |   47 +++
 23 files changed, 825 insertions(+), 7 deletions(-)

diff --git a/main-business/src/main/java/com/ruoyi/business/controller/EquipmentManagementController.java b/main-business/src/main/java/com/ruoyi/business/controller/EquipmentManagementController.java
index 1a30f74..aa157c5 100644
--- a/main-business/src/main/java/com/ruoyi/business/controller/EquipmentManagementController.java
+++ b/main-business/src/main/java/com/ruoyi/business/controller/EquipmentManagementController.java
@@ -7,9 +7,13 @@
 import com.ruoyi.business.entity.EquipmentManagement;
 import com.ruoyi.business.entity.Production;
 import com.ruoyi.business.service.EquipmentManagementService;
+import com.ruoyi.business.vo.EquipmentManagementVo;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.bean.BeanUtils;
 import org.springframework.web.bind.annotation.*;
 import lombok.AllArgsConstructor;
+
+import java.util.List;
 
 /**
  * <p>
@@ -52,5 +56,12 @@
         return R.ok(equipmentManagementService.delByIds(ids));
     }
 
-
+    /**
+     * 璁惧list
+     */
+    @GetMapping("/equipmentList")
+    public R<List<EquipmentManagementVo>> selectEquipmentList() {
+        List<EquipmentManagementVo> equipmentManagementVo = equipmentManagementService.selectEquipmentList();
+        return R.ok(equipmentManagementVo);
+    }
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/controller/EquipmentUsageRecordController.java b/main-business/src/main/java/com/ruoyi/business/controller/EquipmentUsageRecordController.java
new file mode 100644
index 0000000..f7f1b90
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/controller/EquipmentUsageRecordController.java
@@ -0,0 +1,47 @@
+package com.ruoyi.business.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.business.dto.EquipmentManagementDto;
+import com.ruoyi.business.dto.EquipmentUsageRecordDto;
+import com.ruoyi.business.entity.EquipmentManagement;
+import com.ruoyi.business.entity.EquipmentUsageRecord;
+import com.ruoyi.business.service.EquipmentUsageRecordService;
+import com.ruoyi.common.core.domain.R;
+import org.springframework.web.bind.annotation.*;
+import lombok.AllArgsConstructor;
+
+/**
+ * <p>
+ * 璁惧浣跨敤璁板綍琛� 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author ld
+ * @since 2025-07-07
+ */
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/equipmentUsageRecord")
+public class EquipmentUsageRecordController {
+
+    private EquipmentUsageRecordService equipmentUsageRecordService;
+
+    /**
+     * 璁惧浣跨敤璁板綍琛ㄦ煡璇�
+     */
+    @GetMapping("/list")
+    public R<IPage<EquipmentUsageRecordDto>> list(Page<EquipmentUsageRecord> page, EquipmentUsageRecordDto equipmentUsageRecordDto) {
+        IPage<EquipmentUsageRecordDto> list = equipmentUsageRecordService.selectUsageRecordList(page, equipmentUsageRecordDto);
+        return R.ok(list);
+    }
+
+    /**
+     * 璁惧浣跨敤璁板綍琛ㄦ柊澧炰慨鏀�
+     */
+    @PostMapping("/addOrEditUsageRecord")
+    public R addOrEditUsageRecord(@RequestBody EquipmentUsageRecordDto equipmentUsageRecordDto) {
+        return R.ok(equipmentUsageRecordService.addOrEditUsageRecord(equipmentUsageRecordDto));
+    }
+
+}
diff --git a/main-business/src/main/java/com/ruoyi/business/controller/HomePageController.java b/main-business/src/main/java/com/ruoyi/business/controller/HomePageController.java
new file mode 100644
index 0000000..d4f3814
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/controller/HomePageController.java
@@ -0,0 +1,55 @@
+package com.ruoyi.business.controller;
+
+import com.ruoyi.business.dto.HomePageDto;
+import com.ruoyi.business.dto.YearlyQueryDto;
+import com.ruoyi.business.service.OfficialInventoryService;
+import com.ruoyi.business.service.SalesRecordService;
+import com.ruoyi.common.core.domain.R;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/homePage")
+public class HomePageController {
+
+    private SalesRecordService salesRecordService;
+    
+    private OfficialInventoryService officialInventoryService;
+
+    @GetMapping("/allInfo")
+    private R<HomePageDto> homePageDto() {
+        HomePageDto homePageDto = new HomePageDto();
+        Map<String, Object> map = salesRecordService.selectAllInfo();
+        //钀ユ敹閲戦
+        homePageDto.setRevenueAmount((BigDecimal) map.get("revenueAmount"));
+        homePageDto.setChangeRate(map.get("changeRate").toString());
+        homePageDto.setTrend(map.get("trend").toString());
+        //渚涘簲閲�
+        homePageDto.setSaleQuantity((BigDecimal) map.get("saleQuantity"));
+        homePageDto.setSaleQuantityRate(map.get("saleQuantityRate").toString());
+        homePageDto.setTrendQuantity(map.get("trendQuantity").toString());
+        //钀ユ敹鍒嗗竷
+        homePageDto.setRevenueDistribution((Map<String, BigDecimal>) map.get("revenueDistribution"));
+        //搴撳瓨缁熻
+        Map<String, BigDecimal> maps = officialInventoryService.selectOfficialAllInfo();
+        homePageDto.setInventory(maps);
+        //鏈堝害缁熻
+
+        //閿�鍞暟鎹�
+        homePageDto.setSalesResults((List<Map<String, Object>>) map.get("salesResults"));
+
+        return R.ok(homePageDto);
+    }
+
+    @PostMapping("/yearlySales")
+    public R<Map<String, Object>> getYearlyMonthlySales(@RequestBody YearlyQueryDto query) {
+        Map<String, Object> data = salesRecordService.getYearlyMonthlySales(query);
+        return R.ok(data);
+    }
+
+}
diff --git a/main-business/src/main/java/com/ruoyi/business/dto/EquipmentUsageRecordDto.java b/main-business/src/main/java/com/ruoyi/business/dto/EquipmentUsageRecordDto.java
new file mode 100644
index 0000000..9710cd0
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/dto/EquipmentUsageRecordDto.java
@@ -0,0 +1,12 @@
+package com.ruoyi.business.dto;
+
+import com.ruoyi.business.entity.EquipmentUsageRecord;
+import lombok.Data;
+
+@Data
+public class EquipmentUsageRecordDto extends EquipmentUsageRecord {
+
+    private String equipmentNo; //璁惧缂栧彿
+
+    private String equipmentName; //璁惧鍚嶇О
+}
diff --git a/main-business/src/main/java/com/ruoyi/business/dto/HomePageDto.java b/main-business/src/main/java/com/ruoyi/business/dto/HomePageDto.java
new file mode 100644
index 0000000..152da9e
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/dto/HomePageDto.java
@@ -0,0 +1,31 @@
+package com.ruoyi.business.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class HomePageDto {
+
+    //钀ユ敹閲戦
+    private BigDecimal revenueAmount;
+    //钀ユ敹閲戦杈冩槰鏃�
+    private String changeRate;
+    //钀ユ敹瓒嬪娍
+    private String trend;
+    //閿�鍞暟閲忥紝渚涘簲閲�
+    private BigDecimal saleQuantity;
+    //渚涘簲閲忚緝鏄ㄦ棩
+    private String saleQuantityRate;
+    //渚涘簲瓒嬪娍
+    private String trendQuantity;
+    //钀ユ敹鍒嗗竷
+    private Map<String, BigDecimal> revenueDistribution;
+    //搴撳瓨缁熻
+    private Map<String, BigDecimal> inventory;
+    //閿�鍞暟鎹�
+    private List<Map<String, Object>> salesResults;
+
+}
diff --git a/main-business/src/main/java/com/ruoyi/business/dto/YearlyQueryDto.java b/main-business/src/main/java/com/ruoyi/business/dto/YearlyQueryDto.java
new file mode 100644
index 0000000..e3275a0
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/dto/YearlyQueryDto.java
@@ -0,0 +1,26 @@
+package com.ruoyi.business.dto;
+
+import jakarta.validation.constraints.*;
+import lombok.Data;
+
+import static com.ruoyi.common.utils.DateUtils.parseDate;
+
+@Data
+public class YearlyQueryDto {
+
+    @Size(min = 2, max = 2, message = "鏃堕棿鑼冨洿蹇呴』鍖呭惈寮�濮嬪拰缁撴潫鏃ユ湡")
+    private String[] timeRange;
+
+    @AssertTrue(message = "鏃ユ湡鏍煎紡蹇呴』涓篩YYY-MM")
+    public boolean isTimeRangeValid() {
+        try {
+            if (timeRange == null || timeRange.length != 2) return false;
+            parseDate(timeRange[0]);
+            parseDate(timeRange[1]);
+            return true;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+}
diff --git a/main-business/src/main/java/com/ruoyi/business/entity/EquipmentManagement.java b/main-business/src/main/java/com/ruoyi/business/entity/EquipmentManagement.java
index 4cb21c4..742d5c4 100644
--- a/main-business/src/main/java/com/ruoyi/business/entity/EquipmentManagement.java
+++ b/main-business/src/main/java/com/ruoyi/business/entity/EquipmentManagement.java
@@ -28,8 +28,8 @@
     /**
      * 璁惧缂栧彿
      */
-    @TableField(value = "equipment_id")
-    private String equipmentId;
+    @TableField(value = "equipment_no")
+    private String equipmentNo;
     /**
      * 璁惧鍚嶇О
      */
diff --git a/main-business/src/main/java/com/ruoyi/business/entity/EquipmentUsageRecord.java b/main-business/src/main/java/com/ruoyi/business/entity/EquipmentUsageRecord.java
new file mode 100644
index 0000000..b4d0fc3
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/entity/EquipmentUsageRecord.java
@@ -0,0 +1,66 @@
+package com.ruoyi.business.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import com.ruoyi.common.core.domain.MyBaseEntity;
+
+import java.time.LocalDate;
+
+/**
+ * 璁惧浣跨敤璁板綍琛� 瀹炰綋绫�
+ *
+ * @author ld
+ * @date 2025-07-07
+ */
+@Data
+@TableName("equipment_usage_record")
+public class EquipmentUsageRecord extends MyBaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 涓婚敭ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+    /**
+     * 璁惧ID
+     */
+    @TableField(value = "equipment_id")
+    private Long equipmentId;
+    /**
+     * 浣跨敤鏁伴噺
+     */
+    @TableField(value = "usage_quantity")
+    private Integer usageQuantity;
+    /**
+     * 浣跨敤浜篒D
+     */
+    @TableField(value = "user_id")
+    private Long userId;
+    /**
+     * 閮ㄩ棬ID
+     */
+    @TableField(value = "department_id")
+    private Long departmentId;
+    /**
+     * 璁惧鐘舵�侊紙姝e父/鏁呴殰/缁翠慨涓級
+     */
+    @TableField(value = "equipment_status")
+    private String equipmentStatus;
+    /**
+     * 浣跨敤寮�濮嬫椂闂�
+     */
+    @TableField(value = "usage_start_time")
+    private LocalDate usageStartTime;
+    /**
+     * 浣跨敤缁撴潫鏃堕棿
+     */
+    @TableField(value = "usage_end_time")
+    private LocalDate usageEndTime;
+    /**
+     * 澶囨敞淇℃伅
+     */
+    @TableField(value = "remarks")
+    private String remarks;
+}
\ No newline at end of file
diff --git a/main-business/src/main/java/com/ruoyi/business/mapper/EquipmentUsageRecordMapper.java b/main-business/src/main/java/com/ruoyi/business/mapper/EquipmentUsageRecordMapper.java
new file mode 100644
index 0000000..2d35200
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/mapper/EquipmentUsageRecordMapper.java
@@ -0,0 +1,18 @@
+package com.ruoyi.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.business.entity.EquipmentUsageRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 璁惧浣跨敤璁板綍琛� Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author ld
+ * @since 2025-07-07
+ */
+@Mapper
+public interface EquipmentUsageRecordMapper extends BaseMapper<EquipmentUsageRecord> {
+
+}
diff --git a/main-business/src/main/java/com/ruoyi/business/mapper/SalesRecordMapper.java b/main-business/src/main/java/com/ruoyi/business/mapper/SalesRecordMapper.java
index 57e6f8f..f71e69c 100644
--- a/main-business/src/main/java/com/ruoyi/business/mapper/SalesRecordMapper.java
+++ b/main-business/src/main/java/com/ruoyi/business/mapper/SalesRecordMapper.java
@@ -1,8 +1,13 @@
 package com.ruoyi.business.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.business.dto.SalesRecordDto;
 import com.ruoyi.business.entity.SalesRecord;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.time.LocalDate;
+import java.util.List;
 
 /**
  * <p>
@@ -15,4 +20,5 @@
 @Mapper
 public interface SalesRecordMapper extends BaseMapper<SalesRecord> {
 
+    List<SalesRecord> findByDateRange(@Param("startDate")LocalDate startDate, @Param("endDate") LocalDate endDate);
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/EquipmentManagementService.java b/main-business/src/main/java/com/ruoyi/business/service/EquipmentManagementService.java
index 2cbca4b..ef9a7db 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/EquipmentManagementService.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/EquipmentManagementService.java
@@ -5,6 +5,9 @@
 import com.ruoyi.business.dto.EquipmentManagementDto;
 import com.ruoyi.business.entity.EquipmentManagement;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.business.vo.EquipmentManagementVo;
+
+import java.util.List;
 
 /**
  * <p>
@@ -21,4 +24,6 @@
     int addOrEditEquipment(EquipmentManagementDto equipmentManagementDto);
 
     int delByIds(Long[] ids);
+
+    List<EquipmentManagementVo> selectEquipmentList();
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/EquipmentUsageRecordService.java b/main-business/src/main/java/com/ruoyi/business/service/EquipmentUsageRecordService.java
new file mode 100644
index 0000000..08af3cb
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/service/EquipmentUsageRecordService.java
@@ -0,0 +1,23 @@
+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.EquipmentUsageRecordDto;
+import com.ruoyi.business.entity.EquipmentManagement;
+import com.ruoyi.business.entity.EquipmentUsageRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 璁惧浣跨敤璁板綍琛� 鏈嶅姟绫�
+ * </p>
+ *
+ * @author ld
+ * @since 2025-07-07
+ */
+public interface EquipmentUsageRecordService extends IService<EquipmentUsageRecord> {
+
+    IPage<EquipmentUsageRecordDto> selectUsageRecordList(Page<EquipmentUsageRecord> page, EquipmentUsageRecordDto equipmentUsageRecordDto);
+
+    int addOrEditUsageRecord(EquipmentUsageRecordDto equipmentUsageRecordDto);
+}
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 392ef27..98d7270 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
@@ -7,7 +7,9 @@
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.business.vo.OfficialInventoryVo;
 
+import java.math.BigDecimal;
 import java.util.List;
+import java.util.Map;
 
 /**
  * <p>
@@ -28,4 +30,6 @@
     List<OfficialInventoryVo> selectOfficialList(OfficialInventoryVo officialInventoryVo);
 
     List<OfficialInventory> selectOfficialAll();
+
+    Map<String, BigDecimal> selectOfficialAllInfo();
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/SalesRecordService.java b/main-business/src/main/java/com/ruoyi/business/service/SalesRecordService.java
index 7786086..4a2f691 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/SalesRecordService.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/SalesRecordService.java
@@ -4,7 +4,11 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.business.dto.SalesRecordDto;
+import com.ruoyi.business.dto.YearlyQueryDto;
 import com.ruoyi.business.entity.SalesRecord;
+import jakarta.validation.Valid;
+
+import java.util.Map;
 
 /**
  * <p>
@@ -21,4 +25,8 @@
     int addOrEditSalesRecord(SalesRecordDto salesRecordDto);
 
     int delByIds(Long[] ids);
+
+    Map<String, Object> selectAllInfo();
+
+    Map<String, Object> getYearlyMonthlySales(@Valid YearlyQueryDto query);
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentManagementServiceImpl.java b/main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentManagementServiceImpl.java
index 1ac61c9..dbad9ab 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentManagementServiceImpl.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentManagementServiceImpl.java
@@ -10,11 +10,13 @@
 import com.ruoyi.business.mapper.EquipmentManagementMapper;
 import com.ruoyi.business.service.EquipmentManagementService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.business.vo.EquipmentManagementVo;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import org.springframework.stereotype.Service;
 import lombok.RequiredArgsConstructor;
 
 import java.util.Arrays;
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -35,7 +37,6 @@
         Page<EquipmentManagement> entityPage = equipmentManagementMapper.selectPage(page, null);
         IPage<EquipmentManagementDto> dtoPage = new Page<>();
         BeanUtils.copyProperties(entityPage, dtoPage);
-
         return dtoPage;
     }
 
@@ -51,6 +52,20 @@
     }
 
     @Override
+    public List<EquipmentManagementVo> selectEquipmentList() {
+        List<EquipmentManagement> equipmentManagements = equipmentManagementMapper.selectList(null);
+        return equipmentManagements.stream()
+                .map(equipment -> {
+                    EquipmentManagementVo vo = new EquipmentManagementVo();
+                    vo.setId(equipment.getId());               // 璁惧id
+                    vo.setEquipmentName(equipment.getEquipmentName()); // 璁惧鍚嶇О
+                    vo.setQuantity(equipment.getQuantity());    // 鏁伴噺
+                    return vo;
+                })
+                .toList();
+    }
+
+    @Override
     public int delByIds(Long[] ids) {
         return equipmentManagementMapper.deleteByIds(Arrays.asList(ids));
     }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentUsageRecordServiceImpl.java b/main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentUsageRecordServiceImpl.java
new file mode 100644
index 0000000..a1d8661
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/service/impl/EquipmentUsageRecordServiceImpl.java
@@ -0,0 +1,84 @@
+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.basic.entity.Supply;
+import com.ruoyi.business.dto.EquipmentManagementDto;
+import com.ruoyi.business.dto.EquipmentUsageRecordDto;
+import com.ruoyi.business.entity.EquipmentManagement;
+import com.ruoyi.business.entity.EquipmentUsageRecord;
+import com.ruoyi.business.mapper.EquipmentManagementMapper;
+import com.ruoyi.business.mapper.EquipmentUsageRecordMapper;
+import com.ruoyi.business.service.EquipmentUsageRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.bean.BeanUtils;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 璁惧浣跨敤璁板綍琛� 鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author ld
+ * @since 2025-07-07
+ */
+@Service
+@RequiredArgsConstructor
+public class EquipmentUsageRecordServiceImpl extends ServiceImpl<EquipmentUsageRecordMapper, EquipmentUsageRecord> implements EquipmentUsageRecordService {
+
+    private final EquipmentUsageRecordMapper equipmentUsageRecordMapper;
+
+    private  final EquipmentManagementMapper equipmentManagementMapper;
+
+    @Override
+    public IPage<EquipmentUsageRecordDto> selectUsageRecordList(Page<EquipmentUsageRecord> page, EquipmentUsageRecordDto equipmentUsageRecordDto) {
+        Page<EquipmentUsageRecord> entityPage = equipmentUsageRecordMapper.selectPage(page, null);
+        IPage<EquipmentUsageRecordDto> dtoPage = new Page<>();
+        BeanUtils.copyProperties(entityPage, dtoPage);
+
+        List<Long> eqIds = entityPage.getRecords().stream().map(EquipmentUsageRecord::getEquipmentId).toList();
+        //鎵归噺鏌ヨ
+        Map<Long, EquipmentManagement> equipmentManagementMap;
+        if (!eqIds.isEmpty()) {
+            List<EquipmentManagement> infos = equipmentManagementMapper.selectList(new LambdaQueryWrapper<EquipmentManagement>().in(EquipmentManagement::getId, eqIds));
+            equipmentManagementMap = infos.stream().collect(Collectors.toMap(EquipmentManagement::getId, Function.identity()));
+        } else {
+            equipmentManagementMap = new HashMap<>();
+        }
+        //鍖归厤鏁版嵁
+        List<EquipmentUsageRecordDto> dtoRecords = entityPage.getRecords().stream().map(entity -> {
+            EquipmentUsageRecordDto dto = new EquipmentUsageRecordDto();
+            BeanUtils.copyProperties(entity, dto);
+
+            EquipmentManagement equipment = equipmentManagementMap.get(entity.getEquipmentId());
+            if (equipment != null) {
+                dto.setEquipmentNo(equipment.getEquipmentNo());
+                dto.setEquipmentName(equipment.getEquipmentName());
+            }
+            return dto;
+        }).toList();
+
+        dtoPage.setRecords(dtoRecords);
+        return dtoPage;
+    }
+
+    @Override
+    public int addOrEditUsageRecord(EquipmentUsageRecordDto equipmentUsageRecordDto) {
+        EquipmentUsageRecord equipmentUsageRecord = new EquipmentUsageRecord();
+        BeanUtils.copyProperties(equipmentUsageRecordDto, equipmentUsageRecord);
+        if (Objects.isNull(equipmentUsageRecordDto.getId())) {
+            return equipmentUsageRecordMapper.insert(equipmentUsageRecord);
+        } else {
+            return equipmentUsageRecordMapper.updateById(equipmentUsageRecord);
+        }
+    }
+}
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 ceafff7..131b109 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
@@ -26,7 +26,9 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
 import java.util.*;
+import java.util.function.BiConsumer;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
@@ -330,4 +332,26 @@
         }
     }
 
+    @Override
+    public Map<String, BigDecimal> selectOfficialAllInfo() {
+        // 1. 鏌ヨ official_inventory 琛ㄦ暟鎹�
+        List<OfficialInventory> officialInventories = officialInventoryMapper.selectList(null);
+
+        // 鐢ㄤ簬瀛樺偍鏈�缁堢粨鏋滐紝key 涓虹叅绉嶅悕绉帮紝value 涓哄簱瀛樻暟閲忔嫾鎺モ�滃惃鈥�
+        Map<String, BigDecimal> resultMap = new LinkedHashMap<>();
+
+        // 2. 閬嶅巻鏌ヨ缁撴灉锛屽叧鑱� coalInfo 鑾峰彇鐓ょ鍚嶇О骞剁粍瑁呮暟鎹�
+        for (OfficialInventory inventory : officialInventories) {
+            Long coalId = inventory.getCoalId();
+            // 鏍规嵁 coalId 鍒� coalInfoMapper 鏌ヨ鐓ょ鍚嶇О
+            CoalInfo coalInfo = coalInfoMapper.selectById(coalId);
+            if (coalInfo != null) {
+                String coalName = coalInfo.getCoal(); // 鍋囪 CoalInfo 鏈� getCoalName 鏂规硶鑾峰彇鐓ょ鍚嶇О
+                BigDecimal quantity = inventory.getInventoryQuantity();
+                resultMap.put(coalName, quantity);
+            }
+        }
+        return resultMap;
+    }
+
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java b/main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java
index 46d6e5b..2f162a7 100644
--- a/main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java
+++ b/main-business/src/main/java/com/ruoyi/business/service/impl/SalesRecordServiceImpl.java
@@ -1,6 +1,7 @@
 package com.ruoyi.business.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,6 +11,7 @@
 import com.ruoyi.basic.mapper.CoalInfoMapper;
 import com.ruoyi.basic.mapper.CustomerMapper;
 import com.ruoyi.business.dto.SalesRecordDto;
+import com.ruoyi.business.dto.YearlyQueryDto;
 import com.ruoyi.business.entity.OfficialInventory;
 import com.ruoyi.business.entity.SalesRecord;
 import com.ruoyi.business.mapper.OfficialInventoryMapper;
@@ -23,12 +25,21 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.DecimalFormat;
 import java.time.LocalDate;
+import java.time.YearMonth;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+import java.time.temporal.TemporalAdjusters;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.*;
 
 /**
  * <p>
@@ -218,4 +229,279 @@
         // 鎵ц鎵归噺閫昏緫鍒犻櫎
         return salesRecordMapper.update(null, updateWrapper);
     }
+
+    @Override
+    public Map<String, Object> getYearlyMonthlySales(YearlyQueryDto query) {
+        // 1. 澶勭悊榛樿鏌ヨ锛堜笉浼犲弬鏁版椂锛�
+        if (query == null || query.getTimeRange() == null || query.getTimeRange().length == 0) {
+            query = getDefaultQuery();
+        }
+
+        // 2. 瑙f瀽鏃堕棿鑼冨洿
+        LocalDate[] dateRange = parseAndValidateDateRange(query.getTimeRange());
+        LocalDate startDate = dateRange[0];
+        LocalDate endDate = dateRange[1];
+
+        // 3. 鏌ヨ鏁版嵁
+        List<SalesRecord> records = salesRecordMapper.findByDateRange(
+                startDate.withDayOfMonth(1),
+                endDate.withDayOfMonth(1).with(TemporalAdjusters.lastDayOfMonth())
+        );
+
+        // 4. 鏋勫缓鍝嶅簲
+        return buildResponse(query.getTimeRange(), records, startDate, endDate);
+    }
+
+    // 鑾峰彇榛樿鏌ヨ锛堝綋鍓嶅勾搴︽渶杩�6涓湀锛�
+    private YearlyQueryDto getDefaultQuery() {
+        LocalDate now = LocalDate.now();
+        LocalDate startDate = now.minusMonths(5).withDayOfMonth(1);
+
+        String[] timeRange = {
+                startDate.format(DateTimeFormatter.ofPattern("yyyy-MM")),
+                now.format(DateTimeFormatter.ofPattern("yyyy-MM"))
+        };
+
+        YearlyQueryDto defaultQuery = new YearlyQueryDto();
+        defaultQuery.setTimeRange(timeRange);
+        return defaultQuery;
+    }
+
+    // 瑙f瀽骞堕獙璇佹棩鏈熻寖鍥�
+    private LocalDate[] parseAndValidateDateRange(String[] timeRange) {
+        if (timeRange == null || timeRange.length != 2) {
+            throw new IllegalArgumentException("鏃堕棿鑼冨洿鍙傛暟鏍煎紡涓嶆纭�");
+        }
+
+        LocalDate startDate = parseDate(timeRange[0]);
+        LocalDate endDate = parseDate(timeRange[1]);
+
+        if (startDate.isAfter(endDate)) {
+            throw new IllegalArgumentException("寮�濮嬫棩鏈熶笉鑳芥櫄浜庣粨鏉熸棩鏈�");
+        }
+
+        return new LocalDate[]{startDate, endDate};
+    }
+
+    // 瑙f瀽鏃ユ湡锛堟牸寮忥細yyyy-MM锛�
+    private LocalDate parseDate(String dateStr) {
+        try {
+            return YearMonth.parse(dateStr).atDay(1);
+        } catch (DateTimeParseException e) {
+            throw new IllegalArgumentException("鏃ユ湡鏍煎紡涓嶆纭紝搴斾负 yyyy-MM", e);
+        }
+    }
+
+    // 鏋勫缓鍝嶅簲鏁版嵁
+    private Map<String, Object> buildResponse(String[] timeRange,
+                                              List<SalesRecord> records,
+                                              LocalDate startDate,
+                                              LocalDate endDate) {
+        Map<String, Object> response = new LinkedHashMap<>();
+        response.put("timeRange", timeRange);
+        response.put("data", formatMonthlyData(records, startDate, endDate));
+        response.put("isDefaultQuery", timeRange.equals(getDefaultQuery().getTimeRange()));
+        return response;
+    }
+
+    // 鏍煎紡鍖栨湀搴︽暟鎹�
+    private Map<String, Integer> formatMonthlyData(List<SalesRecord> records,
+                                                   LocalDate startDate,
+                                                   LocalDate endDate) {
+        // 棰勫畾涔夋牸寮忓寲鍣�
+        DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("yyyy-MM");
+
+        // 浣跨敤 TreeMap 鑷姩鎸夐敭鎺掑簭
+        Map<String, Integer> monthlyData = records.stream()
+                .collect(Collectors.groupingBy(
+                        r -> r.getSaleDate().format(monthFormatter),
+                        TreeMap::new,
+                        // 鍏抽敭淇敼锛氬鐞� saleQuantity 涓� null 鐨勬儏鍐碉紝榛樿鎸� 0 璁$畻
+                        Collectors.summingInt(r -> {
+                            BigDecimal quantity = r.getSaleQuantity();
+                            return quantity != null ? quantity.intValue() : 0; // 涓夌洰杩愮畻绗﹀垽鏂�
+                        })
+                ));
+
+        // 濉厖缂哄け鏈堜唤
+        YearMonth start = YearMonth.from(startDate);
+        YearMonth end = YearMonth.from(endDate);
+
+        for (YearMonth month = start; !month.isAfter(end); month = month.plusMonths(1)) {
+            String monthKey = month.format(monthFormatter);
+            monthlyData.putIfAbsent(monthKey, 0);
+        }
+
+        return monthlyData;
+    }
+
+    @Override
+    public Map<String, Object> selectAllInfo() {
+        Map<String, Object> result = new LinkedHashMap<>();
+
+        //钀ユ敹閲戦
+        LocalDate today = LocalDate.now();
+        LocalDate yesterday = today.minusDays(1);
+
+        BigDecimal revenueAmount;
+        List<SalesRecord> salesRecords = salesRecordMapper.selectList(null);
+        revenueAmount = salesRecords.stream()
+                .map(SalesRecord::getTotalAmount)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        //浠婃棩钀ユ敹
+        BigDecimal todayRevenue = salesRecords.stream()
+                .filter(record -> today.equals(record.getSaleDate()))
+                .map(SalesRecord::getTotalAmount)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        //鏄ㄦ棩钀ユ敹
+        BigDecimal yesterdayRevenue = salesRecords.stream()
+                .filter(record -> yesterday.equals(record.getSaleDate()))
+                .map(SalesRecord::getTotalAmount)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        // 璁$畻澧為暱鐧惧垎姣�
+        BigDecimal increases = BigDecimal.ZERO;
+        String trend = "+";
+
+        if (yesterdayRevenue.compareTo(BigDecimal.ZERO) != 0) {
+            increases = todayRevenue.subtract(yesterdayRevenue)
+                    .divide(yesterdayRevenue, 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal(100));
+
+            if (increases.compareTo(BigDecimal.ZERO) > 0) {
+                trend = "+";
+            } else if (increases.compareTo(BigDecimal.ZERO) < 0) {
+                trend = "鈥�";
+            }
+        }
+
+        // 6. 鏍煎紡鍖栫櫨鍒嗘瘮鏄剧ず
+        DecimalFormat formatNo = new DecimalFormat("0.00%");
+        String changeRate = formatNo.format(increases.divide(new BigDecimal(100), 4, RoundingMode.HALF_UP));
+
+        //渚涘簲閲�
+        BigDecimal saleQuantity = salesRecords.stream()
+                .map(SalesRecord::getSaleQuantity)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        //浠婃棩渚涘簲閲�
+        BigDecimal todaySaleQuantity = salesRecords.stream()
+                .filter(record -> today.equals(record.getSaleDate()))
+                .map(SalesRecord::getSaleQuantity)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        //鏄ㄦ棩渚涘簲閲�
+        BigDecimal yesterdaySaleQuantity = salesRecords.stream()
+                .filter(record -> yesterday.equals(record.getSaleDate()))
+                .map(SalesRecord::getSaleQuantity)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        // 璁$畻澧為暱鐧惧垎姣�
+        BigDecimal increasesQuantity = BigDecimal.ZERO;
+        String trendQuantity = "+";
+
+        if (yesterdaySaleQuantity.compareTo(BigDecimal.ZERO) != 0) {
+            increasesQuantity = todaySaleQuantity.subtract(yesterdaySaleQuantity)
+                    .divide(yesterdaySaleQuantity, 4, RoundingMode.HALF_UP)
+                    .multiply(new BigDecimal(100));
+
+            if (increasesQuantity.compareTo(BigDecimal.ZERO) > 0) {
+                trendQuantity = "+";
+            } else if (increasesQuantity.compareTo(BigDecimal.ZERO) < 0) {
+                trendQuantity = "鈥�";
+            }
+        }
+
+        // 鏍煎紡鍖栨暟閲忕櫨鍒嗘瘮鏄剧ず
+        DecimalFormat formatNoQuantity = new DecimalFormat("0.00%");
+        String saleQuantityRate = formatNoQuantity.format(increasesQuantity.divide(new BigDecimal(100), 4, RoundingMode.HALF_UP));
+
+        //钀ユ敹鍒嗗竷
+        //鑾峰彇鎵�鏈夌叅绉嶄俊鎭�(id鍜屽悕绉扮殑鏄犲皠)
+        Map<Long, String> coalIdToNameMap = coalInfoMapper.selectList(null).stream()
+                .collect(Collectors.toMap(
+                        CoalInfo::getId,
+                        CoalInfo::getCoal
+                ));
+
+        // 3. 鎸夌叅绉岻D缁熻鎬婚噾棰�
+        Map<Long, BigDecimal> revenueByCoalId = salesRecords.stream()
+                .collect(Collectors.groupingBy(
+                        SalesRecord::getCoalId,
+                        Collectors.reducing(
+                                BigDecimal.ZERO,
+                                SalesRecord::getTotalAmount,
+                                BigDecimal::add
+                        )
+                ));
+
+        // 鐓ょ閿�鍞垎甯冿紙鍗曠嫭浣滀负涓�涓瓙Map锛�
+        Map<String, BigDecimal> revenueDistribution = new LinkedHashMap<>();
+        coalIdToNameMap.forEach((id, name) -> {
+            BigDecimal amount = revenueByCoalId.getOrDefault(id, BigDecimal.ZERO)
+                    .setScale(2, RoundingMode.HALF_UP);
+            if (amount.compareTo(BigDecimal.ZERO) > 0) {
+                revenueDistribution.put(name, amount);
+            }
+        });
+
+        //閿�鍞暟鎹�
+        // 鎸塩oalId鍒嗙粍骞跺悎骞舵暟閲忓拰閲戦
+        Map<Long, Map<String, Object>> resultMap = new LinkedHashMap<>();
+
+        for (SalesRecord record : salesRecords) {
+            Long coalId = record.getCoalId();
+
+            // 灏嗘暟閲忓拰閲戦杞崲涓築igDecimal
+            BigDecimal quantity = record.getInventoryQuantity();
+            BigDecimal amount = record.getTotalAmount();
+
+            if (resultMap.containsKey(coalId)) {
+                Map<String, Object> existing = resultMap.get(coalId);
+
+                // 鑾峰彇鐜版湁鐨凚igDecimal鍊�
+                BigDecimal existingQuantity = (BigDecimal) existing.get("inventoryQuantity");
+                BigDecimal existingAmount = (BigDecimal) existing.get("totalAmount");
+
+                // 浣跨敤BigDecimal杩涜鍔犳硶杩愮畻
+                existing.put("inventoryQuantity", existingQuantity.add(quantity));
+                existing.put("totalAmount", existingAmount.add(amount));
+            } else {
+                Map<String, Object> newRecord = new HashMap<>();
+                newRecord.put("coalId", coalId);
+                newRecord.put("inventoryQuantity", quantity);
+                newRecord.put("totalAmount", amount);
+                resultMap.put(coalId, newRecord);
+            }
+        }
+
+        // 3. 鑾峰彇鎵�鏈夋秹鍙婄殑coalId
+        List<Long> coalIds = new ArrayList<>(resultMap.keySet());
+
+        // 4. 鎵归噺鏌ヨ鐓ょ淇℃伅骞跺~鍏呭埌缁撴灉涓�
+        if (!coalIds.isEmpty()) {
+            List<CoalInfo> coalInfos = coalInfoMapper.selectBatchIds(coalIds);
+            for (CoalInfo coalInfo : coalInfos) {
+                Map<String, Object> record = resultMap.get(coalInfo.getId());
+                if (record != null) {
+                    record.put("coalName", coalInfo.getCoal());
+                }
+            }
+        }
+
+        // 鏈�缁堢粨鏋滄槸涓�涓狶ist<Map>锛屾瘡涓狹ap鍖呭惈鍚堝苟鍚庣殑閿�鍞暟鎹拰瀵瑰簲鐨勭叅绉嶄俊鎭�
+        List<Map<String, Object>> results = new ArrayList<>(resultMap.values());
+        result.put("revenueAmount", revenueAmount.setScale(2, RoundingMode.HALF_UP));
+        result.put("changeRate", changeRate);
+        result.put("trend", trend);
+        result.put("saleQuantity", saleQuantity);
+        result.put("saleQuantityRate", saleQuantityRate);
+        result.put("trendQuantity", trendQuantity);
+        result.put("revenueDistribution", revenueDistribution);
+        result.put("salesResults", results);
+
+        return result;
+    }
 }
diff --git a/main-business/src/main/java/com/ruoyi/business/vo/EquipmentManagementVo.java b/main-business/src/main/java/com/ruoyi/business/vo/EquipmentManagementVo.java
new file mode 100644
index 0000000..3ec641c
--- /dev/null
+++ b/main-business/src/main/java/com/ruoyi/business/vo/EquipmentManagementVo.java
@@ -0,0 +1,13 @@
+package com.ruoyi.business.vo;
+
+import lombok.Data;
+
+@Data
+public class EquipmentManagementVo {
+
+    private Long id; //璁惧id
+
+    private String equipmentName; //璁惧鍚嶇О
+
+    private Integer quantity; //鏁伴噺
+}
diff --git a/main-business/src/main/resources/db/migration/postgresql/V20250701142700__create_table_equipment_management.sql b/main-business/src/main/resources/db/migration/postgresql/V20250701142700__create_table_equipment_management.sql
index 0abb2b1..a682429 100644
--- a/main-business/src/main/resources/db/migration/postgresql/V20250701142700__create_table_equipment_management.sql
+++ b/main-business/src/main/resources/db/migration/postgresql/V20250701142700__create_table_equipment_management.sql
@@ -3,7 +3,7 @@
 CREATE TABLE equipment_management
 (
     id               BIGSERIAL PRIMARY KEY,           -- 涓婚敭 ID
-    equipment_id     VARCHAR(50)  NOT NULL,           -- 璁惧缂栧彿
+    equipment_no     VARCHAR(50)  NOT NULL,           -- 璁惧缂栧彿
     equipment_name   VARCHAR(100) NOT NULL,           -- 璁惧鍚嶇О
     quantity         INT          NOT NULL DEFAULT 0, -- 鏁伴噺
     specification    VARCHAR(50)  NOT NULL,           -- 瑙勬牸鍨嬪彿
@@ -27,7 +27,7 @@
 COMMENT
 ON COLUMN equipment_management.id IS ' 涓婚敭 ID';
 COMMENT
-ON COLUMN equipment_management.equipment_id IS ' 璁惧缂栧彿 ';
+ON COLUMN equipment_management.equipment_no IS ' 璁惧缂栧彿 ';
 COMMENT
 ON COLUMN equipment_management.equipment_name IS ' 璁惧鍚嶇О ';
 COMMENT
diff --git a/main-business/src/main/resources/db/migration/postgresql/V20250707155600__create_table_equipment_usage_record.sql b/main-business/src/main/resources/db/migration/postgresql/V20250707155600__create_table_equipment_usage_record.sql
new file mode 100644
index 0000000..eb2446d
--- /dev/null
+++ b/main-business/src/main/resources/db/migration/postgresql/V20250707155600__create_table_equipment_usage_record.sql
@@ -0,0 +1,39 @@
+-- 鍒涘缓璁惧浣跨敤璁板綍琛� equipment_usage_record
+CREATE TABLE equipment_usage_record
+(
+id                   BIGSERIAL          PRIMARY KEY,        -- 涓婚敭ID锛岃嚜鍔ㄩ�掑
+    equipment_id         BIGINT         NOT NULL,           -- 璁惧ID锛屽叧鑱旇澶囦俊鎭〃锛屼笉鍏佽涓虹┖
+    usage_quantity       INT            NOT NULL,           -- 浣跨敤鏁伴噺锛屼笉鍏佽涓虹┖
+    user_id              BIGINT         NOT NULL,           -- 浣跨敤浜篒D锛屽叧鑱旂敤鎴疯〃锛屼笉鍏佽涓虹┖
+    department_id        BIGINT         ,                   -- 閮ㄩ棬ID锛屽叧鑱旈儴闂ㄨ〃锛屼笉鍏佽涓虹┖
+    equipment_status     VARCHAR(50)    NOT NULL,           -- 璁惧鐘舵�侊紙濡傦細姝e父銆佹晠闅溿�佺淮淇腑锛夛紝涓嶅厑璁镐负绌�
+    usage_start_time     TIMESTAMP      NOT NULL,           -- 浣跨敤寮�濮嬫椂闂达紝涓嶅厑璁镐负绌�
+    usage_end_time       TIMESTAMP,                         -- 浣跨敤缁撴潫鏃堕棿锛屽彲涓虹┖锛堟湭褰掕繕鏃讹級
+    remarks              VARCHAR(1000),                     -- 澶囨敞淇℃伅锛屽彲涓虹┖
+
+    deleted              INT            NOT NULL DEFAULT 0, -- 杞垹闄ゆ爣蹇楋細0=鏈垹闄わ紝1=宸插垹闄�
+    create_by            VARCHAR(255),                      -- 鍒涘缓浜虹敤鎴峰悕
+    create_time          TIMESTAMP WITHOUT TIME ZONE,       -- 鍒涘缓鏃堕棿锛岄粯璁ゅ綋鍓嶆椂闂�
+    update_by            VARCHAR(255),                      -- 鏈�鍚庢洿鏂颁汉鐢ㄦ埛鍚�
+    update_time          TIMESTAMP WITHOUT TIME ZONE        -- 鏈�鍚庢洿鏂版椂闂�
+);
+
+-- 涓鸿〃娣诲姞娉ㄩ噴
+COMMENT ON TABLE equipment_usage_record IS '璁惧浣跨敤璁板綍琛�';
+
+-- 涓哄瓧娈垫坊鍔犳敞閲�
+COMMENT ON COLUMN equipment_usage_record.id IS '涓婚敭ID';
+COMMENT ON COLUMN equipment_usage_record.equipment_id IS '璁惧ID';
+COMMENT ON COLUMN equipment_usage_record.usage_quantity IS '浣跨敤鏁伴噺';
+COMMENT ON COLUMN equipment_usage_record.user_id IS '浣跨敤浜篒D';
+COMMENT ON COLUMN equipment_usage_record.department_id IS '閮ㄩ棬ID';
+COMMENT ON COLUMN equipment_usage_record.equipment_status IS '璁惧鐘舵�侊紙姝e父/鏁呴殰/缁翠慨涓級';
+COMMENT ON COLUMN equipment_usage_record.usage_start_time IS '浣跨敤寮�濮嬫椂闂�';
+COMMENT ON COLUMN equipment_usage_record.usage_end_time IS '浣跨敤缁撴潫鏃堕棿';
+COMMENT ON COLUMN equipment_usage_record.remarks IS '澶囨敞淇℃伅';
+
+COMMENT ON COLUMN equipment_usage_record.deleted IS '杞垹闄ゆ爣蹇楋紝0=鏈垹闄わ紝1=宸插垹闄�';
+COMMENT ON COLUMN equipment_usage_record.create_by IS '鍒涘缓璇ヨ褰曠殑鐢ㄦ埛';
+COMMENT ON COLUMN equipment_usage_record.create_time IS '璁板綍鍒涘缓鏃堕棿';
+COMMENT ON COLUMN equipment_usage_record.update_by IS '鏈�鍚庝慨鏀硅璁板綍鐨勭敤鎴�';
+COMMENT ON COLUMN equipment_usage_record.update_time IS '璁板綍鏈�鍚庢洿鏂版椂闂�';
\ No newline at end of file
diff --git a/main-business/src/main/resources/mapper/EquipmentUsageRecordMapper.xml b/main-business/src/main/resources/mapper/EquipmentUsageRecordMapper.xml
new file mode 100644
index 0000000..a0dc897
--- /dev/null
+++ b/main-business/src/main/resources/mapper/EquipmentUsageRecordMapper.xml
@@ -0,0 +1,33 @@
+<?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.business.mapper.EquipmentUsageRecordMapper">
+
+        <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+        <resultMap id="BaseResultMap" type="com.ruoyi.business.entity.EquipmentUsageRecord">
+                    <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="equipment_id" property="equipmentId" />
+                    <result column="usage_quantity" property="usageQuantity" />
+                    <result column="user_id" property="userId" />
+                    <result column="department_id" property="departmentId" />
+                    <result column="equipment_status" property="equipmentStatus" />
+                    <result column="usage_start_time" property="usageStartTime" />
+                    <result column="usage_end_time" property="usageEndTime" />
+                    <result column="remarks" property="remarks" />
+        </resultMap>
+
+        <!-- 閫氱敤鏌ヨ缁撴灉鍒� -->
+        <sql id="Base_Column_List">
+                deleted,
+                create_by,
+                create_time,
+                update_by,
+                update_time,
+            id, equipment_id, usage_quantity, user_id, department_id, equipment_status, usage_start_time, usage_end_time, remarks
+        </sql>
+
+</mapper>
\ No newline at end of file
diff --git a/main-business/src/main/resources/mapper/SalesRecordMapper.xml b/main-business/src/main/resources/mapper/SalesRecordMapper.xml
index d284f8a..3eb8495 100644
--- a/main-business/src/main/resources/mapper/SalesRecordMapper.xml
+++ b/main-business/src/main/resources/mapper/SalesRecordMapper.xml
@@ -14,7 +14,6 @@
                     <result column="customer_id" property="customerId" />
                     <result column="customer" property="customer" />
                     <result column="coal_id" property="coalId" />
-                    <result column="coal" property="coal" />
                     <result column="price_including_tax" property="priceIncludingTax" />
                     <result column="inventory_quantity" property="inventoryQuantity" />
                     <result column="unit" property="unit" />
@@ -39,5 +38,18 @@
                 deleted,
             id, sale_date, customer_id, customer, coal_id, coal, price_including_tax, inventory_quantity, unit, sale_quantity, sale_price, total_amount, tax_coal, tax_trans, gross_profit, net_profit, registrant_id, registrant, registration_date
         </sql>
+    <select id="findByDateRange" resultType="com.ruoyi.business.entity.SalesRecord">
+        SELECT
+            sale_date,
+            SUM(sale_quantity) AS saleQuantity
+        FROM
+            sales_record
+        WHERE
+            sale_date BETWEEN #{startDate}::date AND #{endDate}::date
+        GROUP BY
+            sale_date
+        ORDER BY
+            sale_date ASC
+    </select>
 
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.3