From 0ac445694a8ffc0e26e54d788d889b3797edf7a0 Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期五, 26 六月 2026 09:48:33 +0800
Subject: [PATCH] feat: 添加备件领用记录功能,包括数据库表

---
 src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java                           |    2 
 src/main/java/com/ruoyi/device/pojo/DeviceRepair.java                                                      |   11 +
 src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java                             |    8 +
 src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsRequisitionRecordService.java          |   17 ++
 src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java                     |    6 +
 src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsRequisitionRecordServiceImpl.java |   78 +++++++++++++
 src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsUseDto.java                                |   16 ++
 src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsRequisitionRecordMapper.java            |   14 ++
 src/main/resources/mapper/measuringinstrumentledger/SparePartsRequisitionRecordMapper.xml                  |   19 +++
 src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java                                   |   12 ++
 src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml                                   |    8 +
 doc/spare_parts_requisition_record.sql                                                                     |   23 +++
 src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SparePartsRequisitionRecord.java                    |   71 +++++++++++
 src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java                              |   17 ++
 src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java    |   35 +++++
 src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java                  |    8 +
 src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java                                                 |   10 +
 17 files changed, 353 insertions(+), 2 deletions(-)

diff --git a/doc/spare_parts_requisition_record.sql b/doc/spare_parts_requisition_record.sql
new file mode 100644
index 0000000..701feeb
--- /dev/null
+++ b/doc/spare_parts_requisition_record.sql
@@ -0,0 +1,23 @@
+CREATE TABLE IF NOT EXISTS `spare_parts_requisition_record`
+(
+    `id`               bigint NOT NULL AUTO_INCREMENT COMMENT '涓婚敭',
+    `spare_parts_id`   bigint         DEFAULT NULL COMMENT '澶囦欢ID',
+    `spare_parts_name` varchar(255)   DEFAULT NULL COMMENT '澶囦欢鍚嶇О',
+    `quantity`         decimal(18, 2) DEFAULT NULL COMMENT '棰嗙敤鏁伴噺',
+    `device_ledger_id` bigint         DEFAULT NULL COMMENT '璁惧鍙拌处ID',
+    `device_name`      varchar(255)   DEFAULT NULL COMMENT '璁惧鍚嶇О',
+    `source_type`      int            DEFAULT NULL COMMENT '鏉ユ簮绫诲瀷 0缁翠慨 1淇濆吇',
+    `source_text`      varchar(32)    DEFAULT NULL COMMENT '鏉ユ簮鏂囨湰',
+    `source_id`        bigint         DEFAULT NULL COMMENT '鏉ユ簮鍗曟嵁ID',
+    `operator`         varchar(64)    DEFAULT NULL COMMENT '鎿嶄綔浜�',
+    `dept_id`          bigint         DEFAULT NULL COMMENT '閮ㄩ棬ID',
+    `create_user`      int            DEFAULT NULL COMMENT '鍒涘缓浜�',
+    `create_time`      datetime       DEFAULT NULL COMMENT '鍒涘缓鏃堕棿',
+    `update_user`      int            DEFAULT NULL COMMENT '鏇存柊浜�',
+    `update_time`      datetime       DEFAULT NULL COMMENT '鏇存柊鏃堕棿',
+    `tenant_id`        bigint         DEFAULT NULL COMMENT '绉熸埛ID',
+    PRIMARY KEY (`id`),
+    KEY `idx_spare_parts_id` (`spare_parts_id`),
+    KEY `idx_source` (`source_type`, `source_id`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='澶囦欢棰嗙敤璁板綍';
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java b/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
index 57148c7..00a1066 100644
--- a/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
+++ b/src/main/java/com/ruoyi/device/pojo/DeviceMaintenance.java
@@ -12,6 +12,8 @@
 import java.time.LocalDateTime;
 import java.util.List;
 
+import com.ruoyi.measuringinstrumentledger.dto.SparePartsUseDto;
+
 @Data
 @TableName("device_maintenance")
 @ApiModel("璁惧淇濆吇璁板綍")
@@ -101,4 +103,12 @@
     @ApiModelProperty("涓存椂鏂囦欢ID鍒楄〃")
     @TableField(exist = false)
     private List<String> tempFileIds;
+
+    @ApiModelProperty("澶囦欢ID闆嗗悎锛堥�楀彿鍒嗛殧锛�")
+    @TableField(exist = false)
+    private String sparePartsIds;
+
+    @ApiModelProperty("澶囦欢棰嗙敤鏄庣粏")
+    @TableField(exist = false)
+    private List<SparePartsUseDto> sparePartsUseList;
 }
diff --git a/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java b/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
index b125e31..67148e1 100644
--- a/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
+++ b/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
@@ -10,6 +10,9 @@
 
 import java.time.LocalDateTime;
 import java.util.Date;
+import java.util.List;
+
+import com.ruoyi.measuringinstrumentledger.dto.SparePartsUseDto;
 
 @Data
 @TableName("device_repair")
@@ -83,5 +86,13 @@
     @TableField(fill = FieldFill.INSERT)
     private Long tenantId;
 
+    @ApiModelProperty("澶囦欢ID闆嗗悎锛堥�楀彿鍒嗛殧锛�")
+    @TableField(exist = false)
+    private String sparePartsIds;
+
+    @ApiModelProperty("澶囦欢棰嗙敤鏄庣粏")
+    @TableField(exist = false)
+    private List<SparePartsUseDto> sparePartsUseList;
+
 
 }
diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
index 6eb0871..4f3963e 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -13,6 +13,7 @@
 import com.ruoyi.device.service.DeviceMaintenanceFileService;
 import com.ruoyi.device.service.IDeviceMaintenanceService;
 import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -32,6 +33,9 @@
 
     @Autowired
     private DeviceMaintenanceFileService deviceMaintenanceFileService;
+
+    @Autowired
+    private SparePartsRequisitionRecordService sparePartsRequisitionRecordService;
 
     @Override
     public IPage<DeviceMaintenanceDto> queryPage(Page page, DeviceMaintenanceDto deviceMaintenanceDto) {
@@ -65,6 +69,10 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public AjaxResult updateDeviceDeviceMaintenance(DeviceMaintenance deviceMaintenance) {
+        DeviceMaintenance existing = this.getById(deviceMaintenance.getId());
+        if (existing == null) {
+            return AjaxResult.error("淇濆吇璁板綍涓嶅瓨鍦�");
+        }
         // 澶勭悊涓存椂鏂囦欢鍏宠仈
         if (deviceMaintenance.getTempFileIds() != null && !deviceMaintenance.getTempFileIds().isEmpty()) {
             for (String tempId : deviceMaintenance.getTempFileIds()) {
@@ -77,6 +85,15 @@
         }
 
         if (this.updateById(deviceMaintenance)) {
+            if (deviceMaintenance.getSparePartsUseList() != null && !deviceMaintenance.getSparePartsUseList().isEmpty()) {
+                sparePartsRequisitionRecordService.processSparePartsUse(
+                        existing.getDeviceLedgerId(),
+                        existing.getDeviceName(),
+                        existing.getId(),
+                        1,
+                        "淇濆吇",
+                        deviceMaintenance.getSparePartsUseList());
+            }
             return AjaxResult.success();
         }
         return AjaxResult.error();
diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
index 23ec164..5c300a2 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -19,6 +19,7 @@
 import com.ruoyi.device.service.DeviceDefectRecordService;
 import com.ruoyi.device.service.IDeviceLedgerService;
 import com.ruoyi.device.service.IDeviceRepairService;
+import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
 import com.ruoyi.other.service.TempFileService;
 import com.ruoyi.sales.mapper.CommonFileMapper;
 import com.ruoyi.sales.pojo.CommonFile;
@@ -58,6 +59,9 @@
     @Autowired
     private TempFileService tempFileService;
 
+    @Autowired
+    private SparePartsRequisitionRecordService sparePartsRequisitionRecordService;
+
     @Override
     public IPage<DeviceRepairDto> queryPage(Page page, DeviceRepairDto deviceRepairDto) {
 
@@ -94,6 +98,7 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public void submitDeviceMaintain(DeviceRepair deviceRepair) {
         if (deviceRepair == null || deviceRepair.getId() == null) {
             throw new ServiceException("鎶ヤ慨鍗旾D涓嶈兘涓虹┖");
@@ -127,6 +132,13 @@
         if (!this.updateById(existing)) {
             throw new ServiceException("鎻愪氦缁翠慨澶辫触");
         }
+        sparePartsRequisitionRecordService.processSparePartsUse(
+                existing.getDeviceLedgerId(),
+                existing.getDeviceName(),
+                existing.getId(),
+                0,
+                "缁翠慨",
+                deviceRepair.getSparePartsUseList());
         clearDefectRecordsIfNeeded(existing.getId());
     }
 
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java
index 599c116..72be4b8 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsController.java
@@ -58,4 +58,10 @@
         return AjaxResult.success(sparePartsService.removeById(id));
     }
 
+    @GetMapping("/listByDevice/{deviceLedgerId}")
+    @ApiOperation("澶囦欢鍒嗙被-鎸夎澶囨煡璇�")
+    public AjaxResult listByDevice(@PathVariable Long deviceLedgerId) {
+        return AjaxResult.success(sparePartsService.listByDeviceLedgerId(deviceLedgerId));
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java
new file mode 100644
index 0000000..a79789c
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java
@@ -0,0 +1,35 @@
+package com.ruoyi.measuringinstrumentledger.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
+import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/sparePartsRequisitionRecord")
+@Api(tags = "澶囦欢棰嗙敤璁板綍")
+public class SparePartsRequisitionRecordController {
+
+    @Autowired
+    private SparePartsRequisitionRecordService sparePartsRequisitionRecordService;
+
+    @GetMapping("/listPage")
+    @ApiOperation("澶囦欢棰嗙敤璁板綍-鍒嗛〉鏌ヨ")
+    @Log(title = "澶囦欢棰嗙敤璁板綍-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
+    public AjaxResult listPage(Page page, SparePartsRequisitionRecord query) {
+        if (query == null) {
+            query = new SparePartsRequisitionRecord();
+        }
+        IPage<SparePartsRequisitionRecord> result = sparePartsRequisitionRecordService.listPage(page, query);
+        return AjaxResult.success(result);
+    }
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsUseDto.java b/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsUseDto.java
new file mode 100644
index 0000000..117f93d
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsUseDto.java
@@ -0,0 +1,16 @@
+package com.ruoyi.measuringinstrumentledger.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class SparePartsUseDto {
+
+    @ApiModelProperty("澶囦欢ID")
+    private Long id;
+
+    @ApiModelProperty("棰嗙敤鏁伴噺")
+    private BigDecimal quantity;
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java b/src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java
index fa52570..8e7de1f 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsMapper.java
@@ -5,10 +5,14 @@
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto;
 import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
-import io.lettuce.core.dynamic.annotation.Param;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @Mapper
 public interface SparePartsMapper extends BaseMapper<SpareParts> {
-    IPage<SparePartsDto> listPage(Page page,@Param("spareParts") SpareParts spareParts);
+    IPage<SparePartsDto> listPage(Page page, SpareParts spareParts);
+
+    List<SparePartsDto> listByDeviceLedgerId(@Param("deviceLedgerId") Long deviceLedgerId);
 }
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsRequisitionRecordMapper.java b/src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsRequisitionRecordMapper.java
new file mode 100644
index 0000000..82e5cf2
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsRequisitionRecordMapper.java
@@ -0,0 +1,14 @@
+package com.ruoyi.measuringinstrumentledger.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface SparePartsRequisitionRecordMapper extends BaseMapper<SparePartsRequisitionRecord> {
+
+    IPage<SparePartsRequisitionRecord> listPage(Page page, @Param("query") SparePartsRequisitionRecord query);
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SparePartsRequisitionRecord.java b/src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SparePartsRequisitionRecord.java
new file mode 100644
index 0000000..5c6ba9d
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SparePartsRequisitionRecord.java
@@ -0,0 +1,71 @@
+package com.ruoyi.measuringinstrumentledger.pojo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@TableName("spare_parts_requisition_record")
+public class SparePartsRequisitionRecord {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("澶囦欢ID")
+    private Long sparePartsId;
+
+    @ApiModelProperty("澶囦欢鍚嶇О")
+    private String sparePartsName;
+
+    @ApiModelProperty("棰嗙敤鏁伴噺")
+    private BigDecimal quantity;
+
+    @ApiModelProperty("璁惧鍙拌处ID")
+    private Long deviceLedgerId;
+
+    @ApiModelProperty("璁惧鍚嶇О")
+    private String deviceName;
+
+    @ApiModelProperty("鏉ユ簮绫诲瀷 0缁翠慨 1淇濆吇")
+    private Integer sourceType;
+
+    @ApiModelProperty("鏉ユ簮鏂囨湰")
+    private String sourceText;
+
+    @ApiModelProperty("鏉ユ簮鍗曟嵁ID")
+    private Long sourceId;
+
+    @ApiModelProperty("鎿嶄綔浜�")
+    private String operator;
+
+    @ApiModelProperty("閮ㄩ棬ID")
+    private Long deptId;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Integer createUser;
+
+    @TableField(fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime createTime;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Integer updateUser;
+
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateTime;
+
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsRequisitionRecordService.java b/src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsRequisitionRecordService.java
new file mode 100644
index 0000000..2c83ad9
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsRequisitionRecordService.java
@@ -0,0 +1,17 @@
+package com.ruoyi.measuringinstrumentledger.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.measuringinstrumentledger.dto.SparePartsUseDto;
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
+
+import java.util.List;
+
+public interface SparePartsRequisitionRecordService extends IService<SparePartsRequisitionRecord> {
+
+    IPage<SparePartsRequisitionRecord> listPage(Page page, SparePartsRequisitionRecord query);
+
+    void processSparePartsUse(Long deviceLedgerId, String deviceName, Long sourceId,
+                              Integer sourceType, String sourceText, List<SparePartsUseDto> useList);
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java b/src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java
index 6185db4..df361ad 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsService.java
@@ -13,4 +13,6 @@
     IPage<SparePartsDto> listPage(Page page, SpareParts spareParts);
 
     List<SparePartsDto> getTree();
+
+    List<SparePartsDto> listByDeviceLedgerId(Long deviceLedgerId);
 }
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsRequisitionRecordServiceImpl.java b/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsRequisitionRecordServiceImpl.java
new file mode 100644
index 0000000..6b4792c
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsRequisitionRecordServiceImpl.java
@@ -0,0 +1,78 @@
+package com.ruoyi.measuringinstrumentledger.service.impl;
+
+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.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.measuringinstrumentledger.dto.SparePartsUseDto;
+import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
+import com.ruoyi.measuringinstrumentledger.mapper.SparePartsRequisitionRecordMapper;
+import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
+import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Service
+public class SparePartsRequisitionRecordServiceImpl
+        extends ServiceImpl<SparePartsRequisitionRecordMapper, SparePartsRequisitionRecord>
+        implements SparePartsRequisitionRecordService {
+
+    @Autowired
+    private SparePartsRequisitionRecordMapper sparePartsRequisitionRecordMapper;
+
+    @Autowired
+    private SparePartsMapper sparePartsMapper;
+
+    @Override
+    public IPage<SparePartsRequisitionRecord> listPage(Page page, SparePartsRequisitionRecord query) {
+        return sparePartsRequisitionRecordMapper.listPage(page, query);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void processSparePartsUse(Long deviceLedgerId, String deviceName, Long sourceId,
+                                     Integer sourceType, String sourceText,
+                                     List<SparePartsUseDto> useList) {
+        if (useList == null || useList.isEmpty()) {
+            return;
+        }
+        String operator = SecurityUtils.getLoginUser().getNickName();
+        for (SparePartsUseDto useItem : useList) {
+            if (useItem == null || useItem.getId() == null) {
+                continue;
+            }
+            BigDecimal quantity = useItem.getQuantity();
+            if (quantity == null || quantity.compareTo(BigDecimal.ZERO) <= 0) {
+                throw new ServiceException("棰嗙敤鏁伴噺蹇呴』澶т簬0");
+            }
+            SpareParts sparePart = sparePartsMapper.selectById(useItem.getId());
+            if (sparePart == null) {
+                throw new ServiceException("澶囦欢涓嶅瓨鍦�");
+            }
+            if (sparePart.getQuantity() == null || sparePart.getQuantity().compareTo(quantity) < 0) {
+                throw new ServiceException("澶囦欢[" + sparePart.getName() + "]搴撳瓨涓嶈冻");
+            }
+            sparePart.setQuantity(sparePart.getQuantity().subtract(quantity));
+            sparePartsMapper.updateById(sparePart);
+
+            SparePartsRequisitionRecord record = new SparePartsRequisitionRecord();
+            record.setSparePartsId(sparePart.getId());
+            record.setSparePartsName(sparePart.getName());
+            record.setQuantity(quantity);
+            record.setDeviceLedgerId(deviceLedgerId);
+            record.setDeviceName(deviceName);
+            record.setSourceId(sourceId);
+            record.setSourceType(sourceType);
+            record.setSourceText(StringUtils.isNotEmpty(sourceText) ? sourceText : (sourceType == 0 ? "缁翠慨" : "淇濆吇"));
+            record.setOperator(operator);
+            sparePartsRequisitionRecordMapper.insert(record);
+        }
+    }
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java b/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java
index 5f329e8..9d84ab7 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsServiceImpl.java
@@ -52,6 +52,14 @@
         return buildTree(records);
     }
 
+    @Override
+    public List<SparePartsDto> listByDeviceLedgerId(Long deviceLedgerId) {
+        if (deviceLedgerId == null) {
+            return new ArrayList<>();
+        }
+        return sparePartsMapper.listByDeviceLedgerId(deviceLedgerId);
+    }
+
 
     /**
      * 灏嗘墎骞崇粨鏋勬暟鎹浆鎹负鏍戝舰缁撴瀯
diff --git a/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml b/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
index 611d51e..475cd9c 100644
--- a/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
+++ b/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
@@ -11,4 +11,12 @@
             </if>
         </where>
     </select>
+
+    <select id="listByDeviceLedgerId" resultType="com.ruoyi.measuringinstrumentledger.dto.SparePartsDto">
+        select sp.*
+        from spare_parts sp
+        where sp.status = '姝e父'
+          and FIND_IN_SET(#{deviceLedgerId}, sp.device_ids) > 0
+        order by sp.id desc
+    </select>
 </mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/measuringinstrumentledger/SparePartsRequisitionRecordMapper.xml b/src/main/resources/mapper/measuringinstrumentledger/SparePartsRequisitionRecordMapper.xml
new file mode 100644
index 0000000..e6d8189
--- /dev/null
+++ b/src/main/resources/mapper/measuringinstrumentledger/SparePartsRequisitionRecordMapper.xml
@@ -0,0 +1,19 @@
+<?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.measuringinstrumentledger.mapper.SparePartsRequisitionRecordMapper">
+
+    <select id="listPage" resultType="com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord">
+        SELECT *
+        FROM spare_parts_requisition_record
+        <where>
+            <if test="query.sparePartsName != null and query.sparePartsName != ''">
+                AND spare_parts_name LIKE CONCAT('%', #{query.sparePartsName}, '%')
+            </if>
+            <if test="query.sourceType != null">
+                AND source_type = #{query.sourceType}
+            </if>
+        </where>
+        ORDER BY create_time DESC
+    </select>
+</mapper>

--
Gitblit v1.9.3