From 4035416559e2002937806364b398df94587daaf2 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期四, 02 四月 2026 17:56:18 +0800
Subject: [PATCH] 增加领用记录列表接口,维修后生成领用记录

---
 doc/create_table_spare_parts_requisition_record.sql                                                        |   14 ++
 src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java                                   |   42 ++++++
 src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsRequisitionRecordDto.java                  |   15 ++
 src/main/java/com/ruoyi/common/enums/SparePartsRequisitionRecordSourceTypeEnum.java                        |   27 ++++
 src/main/java/com/ruoyi/device/pojo/DeviceRepair.java                                                      |   10 +
 src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsRequisitionRecordService.java          |   19 +++
 src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SparePartsRequisitionRecord.java                    |   64 ++++++++++
 src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java    |   40 ++++++
 src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsRequisitionRecordServiceImpl.java |   38 ++++++
 src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsRequisitionRecordMapper.java            |   25 ++++
 src/main/resources/mapper/measuringinstrumentledger/SparePartsRequisitionRecordMapper.xml                  |   36 ++++++
 11 files changed, 329 insertions(+), 1 deletions(-)

diff --git a/doc/create_table_spare_parts_requisition_record.sql b/doc/create_table_spare_parts_requisition_record.sql
new file mode 100644
index 0000000..3fbee8a
--- /dev/null
+++ b/doc/create_table_spare_parts_requisition_record.sql
@@ -0,0 +1,14 @@
+drop table if exists spare_parts_requisition_record;
+create table spare_parts_requisition_record
+(
+    id                  bigint auto_increment primary key,
+    source_type       smallint null comment '鏉ユ簮绫诲瀷(0 缁翠慨 1 淇濆吇)',
+    source_id     bigint not null default 0 comment '鏉ユ簮id',
+    device_ledger_id     bigint not null default 0 comment '璁惧id',
+    spare_parts_id     bigint not null default 0 comment '澶囦欢id',
+    quantity           int    not null default 0 comment '鏁伴噺',
+    create_user        bigint not null default 0 comment '鍒涘缓浜�',
+    tenant_id           bigint not null comment '绉熸埛id',
+    create_time         datetime null comment '褰曞叆鏃堕棿',
+    update_time         datetime null comment '鏇存柊鏃堕棿'
+);
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/common/enums/SparePartsRequisitionRecordSourceTypeEnum.java b/src/main/java/com/ruoyi/common/enums/SparePartsRequisitionRecordSourceTypeEnum.java
new file mode 100644
index 0000000..b9acc40
--- /dev/null
+++ b/src/main/java/com/ruoyi/common/enums/SparePartsRequisitionRecordSourceTypeEnum.java
@@ -0,0 +1,27 @@
+package com.ruoyi.common.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum SparePartsRequisitionRecordSourceTypeEnum implements BaseEnum<Integer> {
+    SparePartsRequisitionRecordSourceTypeRepair(0, "缁翠慨"),
+    SparePartsRequisitionRecordSourceTypeMaintenance(1, "淇濆吇");
+
+    private final Integer code;
+    private final String value;
+
+    SparePartsRequisitionRecordSourceTypeEnum(Integer code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+    public static SparePartsRequisitionRecordSourceTypeEnum getByCode(Integer code) {
+        for (SparePartsRequisitionRecordSourceTypeEnum type : SparePartsRequisitionRecordSourceTypeEnum.values()) {
+            if (type.getCode().equals(code)) {
+                return type;
+            }
+        }
+        return null;
+    }
+}
+
diff --git a/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java b/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
index 330b3a9..ae7efcf 100644
--- a/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
+++ b/src/main/java/com/ruoyi/device/pojo/DeviceRepair.java
@@ -81,4 +81,14 @@
     @ApiModelProperty("鏂囦欢鍒楄〃")
     @TableField(exist = false)
     private List<TempFile> fileList;
+
+    @ApiModelProperty("浣跨敤澶囦欢鍒楄〃")
+    @TableField(exist = false)
+    private List<SparePartUse> sparePartsUseList;
+
+    @Data
+    public static class SparePartUse {
+        private Long id;
+        private Integer quantity;
+    }
 }
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 a2a78f6..a2c3ee4 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -21,6 +21,8 @@
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
 import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
+import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
 import com.ruoyi.other.pojo.TempFile;
 import com.ruoyi.other.service.TempFileService;
 import com.ruoyi.sales.mapper.CommonFileMapper;
@@ -30,8 +32,10 @@
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -52,6 +56,8 @@
     private TempFileService tempFileService;
     @Autowired
     private CommonFileMapper commonFileMapper;
+    @Autowired
+    private SparePartsRequisitionRecordService sparePartsRequisitionRecordService;
 
     @Override
     public IPage<DeviceRepairDto> queryPage(Page page, DeviceRepairDto deviceRepairDto) {
@@ -133,7 +139,41 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public AjaxResult updateDeviceRepair(DeviceRepair deviceRepair) {
+        // 澶勭悊澶囦欢浣跨敤鎯呭喌
+        if (CollectionUtils.isNotEmpty(deviceRepair.getSparePartsUseList())) {
+            List<Long> sparePartIds = new ArrayList<>();
+            for (DeviceRepair.SparePartUse sparePartUse : deviceRepair.getSparePartsUseList()) {
+                // 鑾峰彇澶囦欢淇℃伅
+                SpareParts spareParts = sparePartsMapper.selectById(sparePartUse.getId());
+                if (spareParts != null) {
+                    // 妫�鏌ユ暟閲忔槸鍚﹁冻澶�
+                    if (spareParts.getQuantity().compareTo(new BigDecimal(sparePartUse.getQuantity())) >= 0) {
+                        // 鏇存柊鏁伴噺
+                        spareParts.setQuantity(spareParts.getQuantity().subtract(new BigDecimal(sparePartUse.getQuantity())));
+                        sparePartsMapper.updateById(spareParts);
+                        sparePartIds.add(sparePartUse.getId());
+                        
+                        // 鍒涘缓澶囦欢棰嗙敤璁板綍
+                        SparePartsRequisitionRecord record = new SparePartsRequisitionRecord();
+                        record.setSourceType(0); // 0 缁翠慨
+                        record.setSourceId(deviceRepair.getId());
+                        record.setDeviceLedgerId(deviceRepair.getDeviceLedgerId());
+                        record.setSparePartsId(sparePartUse.getId());
+                        record.setQuantity(sparePartUse.getQuantity());
+                        sparePartsRequisitionRecordService.save(record);
+                    } else {
+                        return AjaxResult.error("澶囦欢 " + spareParts.getName() + " 鏁伴噺涓嶈冻");
+                    }
+                }
+            }
+            // 鏇存柊澶囦欢IDs瀛楁
+            if (!sparePartIds.isEmpty()) {
+                deviceRepair.setSparePartsIds(StringUtils.join(sparePartIds, ","));
+            }
+        }
+        
         if (this.updateById(deviceRepair)) {
             if (CollectionUtils.isNotEmpty(deviceRepair.getFileList())) {
                 List<String> fileIds = deviceRepair.getFileList().stream()
@@ -205,4 +245,4 @@
         return deviceRepairDto;
     }
 
-}
+}
\ No newline at end of file
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..47447f1
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/controller/SparePartsRequisitionRecordController.java
@@ -0,0 +1,40 @@
+package com.ruoyi.measuringinstrumentledger.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.framework.web.domain.AjaxResult;
+import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto;
+import com.ruoyi.measuringinstrumentledger.dto.SparePartsRequisitionRecordDto;
+import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
+import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
+import com.ruoyi.measuringinstrumentledger.service.SparePartsService;
+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;
+
+/**
+ * <p>
+ *  鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-04-02 03:59:56
+ */
+@RestController
+@RequestMapping("/sparePartsRequisitionRecord")
+@Api(tags = "澶囦欢棰嗙敤璁板綍鎺ュ彛")
+public class SparePartsRequisitionRecordController {
+    @Autowired
+    private SparePartsRequisitionRecordService sparePartsRequisitionRecordService;
+
+    @GetMapping("/listPage")
+    @ApiOperation("澶囦欢鍒嗙被-鍒嗛〉鏌ヨ")
+    public AjaxResult listPage(Page page, SparePartsRequisitionRecordDto sparePartsRequisitionRecordDto){
+        IPage<SparePartsRequisitionRecordDto> listPage = sparePartsRequisitionRecordService.listPage(page, sparePartsRequisitionRecordDto);
+        return AjaxResult.success(listPage);
+    }
+}
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsRequisitionRecordDto.java b/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsRequisitionRecordDto.java
new file mode 100644
index 0000000..59b9517
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsRequisitionRecordDto.java
@@ -0,0 +1,15 @@
+package com.ruoyi.measuringinstrumentledger.dto;
+
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
+import lombok.Data;
+
+@Data
+public class SparePartsRequisitionRecordDto extends SparePartsRequisitionRecord {
+    private String sparePartsName;
+
+    private String deviceName;
+
+    private String sourceText;
+
+    private String operator;
+}
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..11dba94
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/mapper/SparePartsRequisitionRecordMapper.java
@@ -0,0 +1,25 @@
+package com.ruoyi.measuringinstrumentledger.mapper;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.measuringinstrumentledger.dto.SparePartsDto;
+import com.ruoyi.measuringinstrumentledger.dto.SparePartsRequisitionRecordDto;
+import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ *  Mapper 鎺ュ彛
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-04-02 03:59:56
+ */
+@Mapper
+public interface SparePartsRequisitionRecordMapper extends BaseMapper<SparePartsRequisitionRecord> {
+    IPage<SparePartsRequisitionRecordDto> listPage(Page page, @Param("params") SparePartsRequisitionRecordDto sparePartsRequisitionRecordDto);
+
+}
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..ba2f40b
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SparePartsRequisitionRecord.java
@@ -0,0 +1,64 @@
+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 java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-04-02 03:59:56
+ */
+@Getter
+@Setter
+@TableName("spare_parts_requisition_record")
+@ApiModel(value = "SparePartsRequisitionRecord瀵硅薄", description = "")
+public class SparePartsRequisitionRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("鏉ユ簮绫诲瀷(0 缁翠慨 1 淇濆吇)")
+    private Integer sourceType;
+
+    @ApiModelProperty("鏉ユ簮id")
+    private Long sourceId;
+
+    @ApiModelProperty("璁惧id")
+    private Long deviceLedgerId;
+
+    @ApiModelProperty("澶囦欢id")
+    private Long sparePartsId;
+
+    @ApiModelProperty("鏁伴噺")
+    private Integer quantity;
+
+    @ApiModelProperty("鍒涘缓浜�")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUser;
+
+    @ApiModelProperty("绉熸埛id")
+    @TableField(fill = FieldFill.INSERT)
+    private Long tenantId;
+
+    @ApiModelProperty("褰曞叆鏃堕棿")
+    @TableField(fill = FieldFill.INSERT)
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("鏇存柊鏃堕棿")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private LocalDateTime updateTime;
+}
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..243fb64
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/service/SparePartsRequisitionRecordService.java
@@ -0,0 +1,19 @@
+package com.ruoyi.measuringinstrumentledger.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.measuringinstrumentledger.dto.SparePartsRequisitionRecordDto;
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  鏈嶅姟绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-04-02 03:59:56
+ */
+public interface SparePartsRequisitionRecordService extends IService<SparePartsRequisitionRecord> {
+    IPage<SparePartsRequisitionRecordDto> listPage(Page page, SparePartsRequisitionRecordDto sparePartsRequisitionRecordDto);
+}
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..4309562
--- /dev/null
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/service/impl/SparePartsRequisitionRecordServiceImpl.java
@@ -0,0 +1,38 @@
+package com.ruoyi.measuringinstrumentledger.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.enums.SparePartsRequisitionRecordSourceTypeEnum;
+import com.ruoyi.measuringinstrumentledger.dto.SparePartsRequisitionRecordDto;
+import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
+import com.ruoyi.measuringinstrumentledger.mapper.SparePartsRequisitionRecordMapper;
+import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  鏈嶅姟瀹炵幇绫�
+ * </p>
+ *
+ * @author 鑺杞欢锛堟睙鑻忥級鏈夐檺鍏徃
+ * @since 2026-04-02 03:59:56
+ */
+@Service
+public class SparePartsRequisitionRecordServiceImpl extends ServiceImpl<SparePartsRequisitionRecordMapper, SparePartsRequisitionRecord> implements SparePartsRequisitionRecordService {
+    @Autowired
+    private SparePartsRequisitionRecordMapper sparePartsRequisitionRecordMapper;
+
+    @Override
+    public IPage<SparePartsRequisitionRecordDto> listPage(Page page, SparePartsRequisitionRecordDto sparePartsRequisitionRecordDto) {
+        IPage<SparePartsRequisitionRecordDto> result = sparePartsRequisitionRecordMapper.listPage(page, sparePartsRequisitionRecordDto);
+        // 澶勭悊鏉ユ簮绫诲瀷鏂囨湰
+        result.getRecords().forEach(record -> {
+            if (record.getSourceType() != null) {
+                record.setSourceText(SparePartsRequisitionRecordSourceTypeEnum.getByCode(record.getSourceType()).getValue());
+            }
+        });
+        return result;
+    }
+}
\ 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..2a4d5eb
--- /dev/null
+++ b/src/main/resources/mapper/measuringinstrumentledger/SparePartsRequisitionRecordMapper.xml
@@ -0,0 +1,36 @@
+<?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">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord">
+        <id column="id" property="id" />
+        <result column="source_type" property="sourceType" />
+        <result column="source_id" property="sourceId" />
+        <result column="device_ledger_id" property="deviceLedgerId" />
+        <result column="spare_parts_id" property="sparePartsId" />
+        <result column="quantity" property="quantity" />
+        <result column="create_user" property="createUser" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+    </resultMap>
+
+
+    <select id="listPage" resultType="com.ruoyi.measuringinstrumentledger.dto.SparePartsRequisitionRecordDto">
+        select sprr.*,sp.name as sparePartName, dl.name as deviceLedgerName, su.nick_name as operator
+        from spare_parts_requisition_record sprr
+        left join spare_parts sp on sp.id = sprr.spare_part_id
+        left join device_ledger dl on dl.id = sprr.device_ledger_id
+        left join sys_user su on su.id = sprr.create_user
+        <where>
+            <if test="params.sparePartsName != null and params.sparePartsName != ''">
+                and sp.name like concat('%',#{params.sparePartsName},'%')
+            </if>
+
+            <if test="params.sourceType != null and params.sourceType != ''">
+                and sprr.source_type = #{params.sourceType}
+            </if>
+        </where>
+    </select>
+</mapper>

--
Gitblit v1.9.3