From 60afc1c228318d136a273cd0b389217f87583277 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期六, 11 十月 2025 11:29:33 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml                                      |   52 +++
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordAssetVO.java                     |   56 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java             |  185 ++++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java                              |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordDetailVO.java                    |   80 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java  |   24 -
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetRepairCompleteDTO.java                      |   34 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationsServiceImpl.java        |   20 +
 ruoyi-system/src/main/java/com/ruoyi/system/constants/ApprovalApplicationCodePrefix.java               |   17 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java                        |   54 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java  |   16 -
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetRepairRecordItem.java                           |   14 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordPageVO.java                      |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java                                |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java |   27 -
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetRepairRecordMapper.java                        |    8 
 ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java                              |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/service/AssetRepairRecordService.java                      |   31 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java    |   23 -
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRequestController.java               |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationsService.java                 |    7 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRecordController.java                |   39 ++
 ruoyi-system/src/main/resources/mapper/system/AssetRepairRecordMapper.xml                              |   27 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java   |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java                     |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/AssetRepairRecordAddDTO.java                           |   56 ++++
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetRepairRecord.java                               |    4 
 27 files changed, 710 insertions(+), 95 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java
index 4d1beb1..4ade46e 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetMainController.java
@@ -3,8 +3,11 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.constants.AssetDeptConstant;
 import com.ruoyi.system.query.AssetMainPageQuery;
 import com.ruoyi.system.service.AssetMainService;
+import com.ruoyi.system.service.ISysUserService;
 import com.ruoyi.system.vo.asset.AssetMainPageVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -30,13 +33,64 @@
 public class AssetMainController {
 
     private final AssetMainService assetMainService;
+    private final ISysUserService sysUserService;
 
     @ApiOperation("获取审批通过且可用的资产分页列表(排除已领用、已处置、未归还借用)")
     @PostMapping("/page-list")
     public R<IPage<AssetMainPageVO>> getApprovedAssetPageList(@RequestBody AssetMainPageQuery pageQuery) {
+        // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据
+        Long userId = SecurityUtils.getUserId();
+        boolean isAdmin = SecurityUtils.isAdmin(userId);
+
+        if (!isAdmin) {
+            try {
+                // 获取当前用户的部门名称
+                String deptName = sysUserService.selectUserById(userId).getDept().getDeptName();
+
+                // 非超级管理员且非资产管理部,设置部门权限
+                if (!AssetDeptConstant.ASSET_DEPARTMENT_NAME.equals(deptName)) {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                }
+            } catch (Exception e) {
+                // 如果获取部门信息失败,默认设置部门权限
+                try {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                } catch (Exception ex) {
+                    // ignore parse, leave null if cannot parse
+                }
+            }
+        }
         IPage<AssetMainPageVO> page = assetMainService.getApprovedPageList(pageQuery);
         return R.ok(page);
     }
 
+    @ApiOperation("获取已入库的资产列表")
+    @PostMapping("/page-list-all")
+    public R<IPage<AssetMainPageVO>> getAssetPageList(@RequestBody AssetMainPageQuery pageQuery) {
+        // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据
+        Long userId = SecurityUtils.getUserId();
+        boolean isAdmin = SecurityUtils.isAdmin(userId);
+
+        if (!isAdmin) {
+            try {
+                // 获取当前用户的部门名称
+                String deptName = sysUserService.selectUserById(userId).getDept().getDeptName();
+
+                // 非超级管理员且非资产管理部,设置部门权限
+                if (!AssetDeptConstant.ASSET_DEPARTMENT_NAME.equals(deptName)) {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                }
+            } catch (Exception e) {
+                // 如果获取部门信息失败,默认设置部门权限
+                try {
+                    pageQuery.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                } catch (Exception ex) {
+                    // ignore parse, leave null if cannot parse
+                }
+            }
+        }
+        IPage<AssetMainPageVO> page = assetMainService.getAssetPageList(pageQuery);
+        return R.ok(page);
+    }
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRecordController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRecordController.java
index 4d6acc7..0d9bfda 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRecordController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRecordController.java
@@ -2,23 +2,30 @@
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.domain.R;
-import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.constants.AssetDeptConstant;
+import com.ruoyi.system.dto.AssetRepairRecordAddDTO;
+import com.ruoyi.system.dto.asset.AssetRepairCompleteDTO;
 import com.ruoyi.system.query.AssetRepairRecordPageQuery;
 import com.ruoyi.system.service.AssetRepairRecordService;
 import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.vo.asset.AssetRepairRecordDetailVO;
 import com.ruoyi.system.vo.asset.AssetRepairRecordPageVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
 import lombok.RequiredArgsConstructor;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
 
 /**
  * <p>
@@ -28,6 +35,7 @@
  * @author WuGuanFengYue
  * @since 2025-09-15
  */
+@Validated
 @RestController
 @Api(tags = {"资产维修记录相关接口"})
 @RequiredArgsConstructor(onConstructor_ = {@Lazy})
@@ -67,5 +75,32 @@
         return R.ok(page);
     }
 
+    @ApiOperation("新增维修记录")
+    @PostMapping("/add")
+    public R<?> addRepairRecord(@Valid @RequestBody AssetRepairRecordAddDTO addDTO) {
+        assetRepairRecordService.addRepairRecord(addDTO);
+        return R.ok();
+    }
+
+    @ApiOperation("获取维修记录详情")
+    @PostMapping("/detail/{id}")
+    public R<AssetRepairRecordDetailVO> getRepairRecordDetail(  @ApiParam(name = "id",value = "维修记录ID") @PathVariable Integer id) {
+        AssetRepairRecordDetailVO detail = assetRepairRecordService.getRepairRecordDetail(id);
+        return R.ok(detail);
+    }
+
+    @ApiOperation("完成维修")
+    @PostMapping("/complete")
+    public R<?> completeRepair(@Valid @RequestBody AssetRepairCompleteDTO dto) {
+        assetRepairRecordService.completeRepair(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("删除")
+    @DeleteMapping("/{id}")
+    public R<?> deleteById(@ApiParam(name = "id",value = "维修记录ID")@PathVariable Integer id){
+        assetRepairRecordService.deleteById(id);
+        return R.ok();
+    }
 }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRequestController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRequestController.java
index 4f34495..1b64135 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRequestController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRequestController.java
@@ -18,6 +18,9 @@
 import com.ruoyi.system.query.AssetRepairRequestListQuery;
 import com.ruoyi.system.query.AssetStatisticsListQuery;
 import com.ruoyi.system.service.*;
+import com.ruoyi.system.service.AssetMainService;
+import com.ruoyi.system.service.AssetRepairRecordService;
+import com.ruoyi.system.service.TDeptService;
 import com.ruoyi.system.vo.AssetRepairListVO;
 import com.ruoyi.system.vo.AssetRepairRequestVO;
 import com.ruoyi.system.vo.AssetStatisticsVO;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/constants/ApprovalApplicationCodePrefix.java b/ruoyi-system/src/main/java/com/ruoyi/system/constants/ApprovalApplicationCodePrefix.java
new file mode 100644
index 0000000..d26387d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/constants/ApprovalApplicationCodePrefix.java
@@ -0,0 +1,17 @@
+package com.ruoyi.system.constants;
+
+/**
+ * @author mitao
+ * @date 2025/10/9
+ */
+public interface ApprovalApplicationCodePrefix {
+    /*资产相关*/
+    String ASSET_PURCHASE = "CG";  // 采购申请
+    String ASSET_STOCK_IN = "RK";  // 入库申请
+    String ASSET_RECEIVE = "LY";  // 领用申请
+    String ASSET_BORROW = "JY";  // 借用申请
+    String ASSET_RETURN = "GH";  // 归还申请
+    String ASSET_DISPOSE = "CZ";  // 处置申请
+    String ASSET_CHANGE = "BG";  // 变更申请
+    String ASSET_REPAIR = "WX";  // 维修申请
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/AssetRepairRecordAddDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/AssetRepairRecordAddDTO.java
new file mode 100644
index 0000000..66571e5
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/AssetRepairRecordAddDTO.java
@@ -0,0 +1,56 @@
+package com.ruoyi.system.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * <p>
+ * 新增维修记录DTO
+ * </p>
+ *
+ * @author WuGuanFengYue
+ * @since 2025-10-09
+ */
+@Data
+@ApiModel(value="AssetRepairRecordAddDTO对象", description="新增维修记录DTO")
+public class AssetRepairRecordAddDTO {
+
+    @ApiModelProperty(value = "事项标题", required = true)
+    @NotBlank(message = "事项标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "维护资产类型ID", required = true)
+    @NotBlank(message = "维护资产类型ID不能为空")
+    private String assetTypeId;
+
+    @ApiModelProperty(value = "当前维修状态:0-维修中,1-无需维修,2-维修完成", required = true)
+    @NotNull(message = "维修状态不能为空")
+    private Integer repairStatus;
+
+    @ApiModelProperty(value = "维修费用", required = true)
+    @NotNull(message = "维修费用不能为空")
+    private BigDecimal totalFee;
+
+    @ApiModelProperty(value = "维修人", required = true)
+    @NotBlank(message = "维修人不能为空")
+    private String repairBy;
+
+    @ApiModelProperty(value = "附件URL列表(多个附件使用英文逗号拼接)")
+    private String attachmentUrls;
+
+    @ApiModelProperty(value = "维修备注")
+    private String repairRemarks;
+
+    @ApiModelProperty(value = "关联报修单号(非必填,保存时需要校验报修单是否存在)")
+    private String repairRequestNo;
+
+    @ApiModelProperty(value = "维修资产ID列表", required = true)
+    @NotNull(message = "维修资产ID列表不能为空")
+    private List<Integer> assetMainIds;
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetRepairCompleteDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetRepairCompleteDTO.java
new file mode 100644
index 0000000..ccbb246
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetRepairCompleteDTO.java
@@ -0,0 +1,34 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author mitao
+ * @date 2025/10/9
+ */
+@Data
+@ApiModel(value = "资产维修完成DTO")
+public class AssetRepairCompleteDTO {
+    @ApiModelProperty(value = "维修记录ID")
+    @NotNull(message = "维修记录ID不能为空")
+    private Integer repairRecordId;
+
+    @ApiModelProperty(value = "维修资产ID")
+    @NotNull(message = "维修资产ID不能为空")
+    private Integer assetMainId;
+
+    @ApiModelProperty(value = "维修花费" )
+    @NotNull(message = "维修花费不能为空")
+    private BigDecimal repairFee;
+
+    @ApiModelProperty(value = "维修完成时间")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime repairFinishTime;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java
index 3abb27a..681a043 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetMainMapper.java
@@ -23,4 +23,11 @@
      */
     IPage<AssetMainPageVO> selectApprovedAssetPage(Page<?> page, @Param("query") AssetMainPageQuery query);
 
+    /**
+     * 获取已入库的资产列表
+     * @param page
+     * @param pageQuery
+     * @return
+     */
+    IPage<AssetMainPageVO> getAssetPageList(Page<AssetMainPageVO> page, @Param("query") AssetMainPageQuery pageQuery);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetRepairRecordMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetRepairRecordMapper.java
index fe565f7..8bcddd2 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetRepairRecordMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetRepairRecordMapper.java
@@ -9,6 +9,7 @@
 import com.ruoyi.system.query.AssetRepairRequestListQuery;
 import com.ruoyi.system.query.AssetStatisticsListQuery;
 import com.ruoyi.system.vo.AssetRepairRequestVO;
+import com.ruoyi.system.vo.asset.AssetRepairRecordAssetVO;
 import com.ruoyi.system.vo.asset.AssetRepairRecordPageVO;
 import org.apache.ibatis.annotations.Param;
 
@@ -34,5 +35,12 @@
      */
     IPage<AssetRepairRecordPageVO> getRepairRecordPageList(Page<AssetRepairRecordPageVO> page, @Param("query") AssetRepairRecordPageQuery pageQuery);
 
+    /**
+     * 查询维修记录关联的资产列表
+     * @param repairRecordId 维修记录ID
+     * @return 维修资产列表
+     */
+    List<AssetRepairRecordAssetVO> getRepairAssetList(@Param("repairRecordId") Integer repairRecordId);
+
     List<AssetRepairRequestVO> listAll(@Param("query")AssetRepairRequestListQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetRepairRecord.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetRepairRecord.java
index 42b6d44..ce2dca4 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetRepairRecord.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetRepairRecord.java
@@ -33,7 +33,7 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
-    @ApiModelProperty(value = "保修单ID")
+    @ApiModelProperty(value = "报修单ID")
     @TableField("repair_request_id")
     private Integer repairRequestId;
 
@@ -67,7 +67,7 @@
 
     @ApiModelProperty(value = "报修状态:0-维修中,1-无需维修,2-维修完成")
     @TableField("repair_status")
-    private Boolean repairStatus;
+    private Integer repairStatus;
 
     @ApiModelProperty(value = "维修费用")
     @TableField("total_fee")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetRepairRecordItem.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetRepairRecordItem.java
index 3d56f2a..98f6aa5 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetRepairRecordItem.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetRepairRecordItem.java
@@ -10,6 +10,8 @@
 import lombok.EqualsAndHashCode;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
 
 /**
  * <p>
@@ -39,5 +41,17 @@
     @TableField("asset_main_id")
     private Integer assetMainId;
 
+    @ApiModelProperty(value = "维修完成时间")
+    @TableField("repair_finish_time")
+    private LocalDateTime repairFinishTime;
+
+    @ApiModelProperty(value = "维修花费" )
+    @TableField("repair_fee")
+    private BigDecimal repairFee;
+
+    @ApiModelProperty(value = "维修状态:0-维修中,1-维修完成")
+    @TableField("status")
+    private Integer status;
+
 
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java
index b5af8fa..ada367e 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java
@@ -26,5 +26,8 @@
 
     @ApiModelProperty("关键字(资产名称/资产编码)")
     private String keyword;
+
+    @ApiModelProperty("所属部门ID,前端不传")
+    private Integer deptId;
 }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java
index ba22234..3c3eec9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetMainService.java
@@ -42,4 +42,11 @@
      * @return
      */
     List<AssetMainVO> getListByIds(List<Integer> assetMainIds);
+
+    /**
+     * 获取所有资产分页列表
+     * @param pageQuery
+     * @return
+     */
+    IPage<AssetMainPageVO> getAssetPageList(AssetMainPageQuery pageQuery);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetRepairRecordService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetRepairRecordService.java
index 08bf94b..0b24b6f 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetRepairRecordService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetRepairRecordService.java
@@ -3,12 +3,13 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ruoyi.common.basic.PageInfo;
+import com.ruoyi.system.dto.AssetRepairRecordAddDTO;
+import com.ruoyi.system.dto.asset.AssetRepairCompleteDTO;
 import com.ruoyi.system.model.AssetRepairRecord;
 import com.ruoyi.system.query.AssetRepairRecordPageQuery;
 import com.ruoyi.system.query.AssetRepairRequestListQuery;
-import com.ruoyi.system.query.AssetStatisticsListQuery;
 import com.ruoyi.system.vo.AssetRepairRequestVO;
-import com.ruoyi.system.vo.AssetStatisticsVO;
+import com.ruoyi.system.vo.asset.AssetRepairRecordDetailVO;
 import com.ruoyi.system.vo.asset.AssetRepairRecordPageVO;
 
 import java.util.List;
@@ -32,5 +33,31 @@
      */
     IPage<AssetRepairRecordPageVO> getRepairRecordPageList(AssetRepairRecordPageQuery pageQuery);
 
+    /**
+     * 新增维修记录
+     *
+     * @param addDTO 新增维修记录DTO
+     */
+    void addRepairRecord(AssetRepairRecordAddDTO addDTO);
+
+    /**
+     * 获取维修记录详情
+     *
+     * @param id
+     * @return 维修记录详情
+     */
+    AssetRepairRecordDetailVO getRepairRecordDetail(Integer id);
+
+    /**
+     * 完成维修
+     * @param dto
+     */
+    void completeRepair(AssetRepairCompleteDTO dto);
+
+    /**
+     * 删除
+     * @param id
+     */
+    void deleteById(Integer id);
     List<AssetRepairRequestVO> listAll(AssetRepairRequestListQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationsService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationsService.java
index 89dd256..3a82b69 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationsService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationsService.java
@@ -22,4 +22,11 @@
      * @param app
      */
     void assembleApplicationDetail(OaApprovalApplications app);
+
+    /**
+     * 生成申请单编号
+     * @param prefix
+     * @return
+     */
+    String generateApplicationCode(String prefix);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java
index 0e8b51d..323ecf7 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetMainServiceImpl.java
@@ -312,4 +312,10 @@
         }
         return Collections.emptyList();
     }
+
+    @Override
+    public IPage<AssetMainPageVO> getAssetPageList(AssetMainPageQuery pageQuery) {
+        Page<AssetMainPageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
+        return this.baseMapper.getAssetPageList(page, pageQuery);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java
index 604de85..4593555 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetRepairRecordServiceImpl.java
@@ -1,25 +1,41 @@
 package com.ruoyi.system.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 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.basic.PageInfo;
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.constants.ApprovalApplicationCodePrefix;
+import com.ruoyi.system.dto.AssetRepairRecordAddDTO;
+import com.ruoyi.system.dto.asset.AssetRepairCompleteDTO;
 import com.ruoyi.system.mapper.AssetRepairRecordMapper;
 import com.ruoyi.system.model.AssetRepairRecord;
-import com.ruoyi.system.model.AssetType;
+import com.ruoyi.system.model.AssetRepairRecordItem;
+import com.ruoyi.system.model.AssetRepairRequest;
 import com.ruoyi.system.query.AssetRepairRecordPageQuery;
 import com.ruoyi.system.query.AssetRepairRequestListQuery;
-import com.ruoyi.system.query.AssetStatisticsListQuery;
+import com.ruoyi.system.service.AssetRepairRecordItemService;
 import com.ruoyi.system.service.AssetRepairRecordService;
-import com.ruoyi.system.vo.AssetIdleListVO;
+import com.ruoyi.system.service.AssetRepairRequestService;
+import com.ruoyi.system.service.AssetTypeService;
 import com.ruoyi.system.vo.AssetRepairRequestVO;
-import com.ruoyi.system.vo.AssetStatisticsVO;
+import com.ruoyi.system.vo.asset.AssetRepairRecordAssetVO;
+import com.ruoyi.system.vo.asset.AssetRepairRecordDetailVO;
 import com.ruoyi.system.vo.asset.AssetRepairRecordPageVO;
+import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
 
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
+import java.util.Objects;
 
 /**
  * <p>
@@ -30,7 +46,12 @@
  * @since 2025-09-15
  */
 @Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class AssetRepairRecordServiceImpl extends ServiceImpl<AssetRepairRecordMapper, AssetRepairRecord> implements AssetRepairRecordService {
+
+    private final AssetRepairRequestService assetRepairRequestService;
+    private final AssetRepairRecordItemService assetRepairRecordItemService;
+    private final AssetTypeService assetTypeService;
 
     @Override
     public PageInfo<AssetRepairRequestVO> pageList(AssetRepairRequestListQuery query) {
@@ -47,6 +68,158 @@
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void addRepairRecord(AssetRepairRecordAddDTO addDTO) {
+        // 1. 生成维修单号
+        String repairNo = generateRepairNo();
+
+        // 2. 校验报修单是否存在(如果提供了报修单号)
+        Integer repairRequestId = null;
+        if (StringUtils.hasText(addDTO.getRepairRequestNo())) {
+            repairRequestId = validateRepairRequest(addDTO.getRepairRequestNo());
+        }
+
+        // 3. 创建维修记录实体
+        AssetRepairRecord repairRecord = new AssetRepairRecord();
+        repairRecord.setRepairNo(repairNo);
+        repairRecord.setRepairRequestId(repairRequestId);
+        BeanUtil.copyProperties(addDTO, repairRecord);
+        repairRecord.setCreateBy(SecurityUtils.getUsername());
+
+        // 4. 保存维修记录主表
+        boolean saved = this.save(repairRecord);
+        if (!saved) {
+            throw new RuntimeException("保存维修记录失败");
+        }
+
+        // 5. 保存维修资产关联关系
+        saveRepairRecordItems(repairRecord.getId(), addDTO.getAssetMainIds());
+    }
+
+    /**
+     * 生成维修单号
+     * 格式:WX + 日期 + 4位序号
+     */
+    private String generateRepairNo() {
+        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+
+        // 查询当天已生成的维修单号数量
+        Long count = this.lambdaQuery()
+                .likeRight(AssetRepairRecord::getRepairNo, ApprovalApplicationCodePrefix.ASSET_REPAIR)
+                .ge(AssetRepairRecord::getCreateTime, LocalDate.now().atStartOfDay())
+                .lt(AssetRepairRecord::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay())
+                .count();
+
+        // 生成4位序号,从0001开始
+        int sequence = (count != null ? count.intValue() : 0) + 1;
+        String sequenceStr = String.format("%04d", sequence);
+
+        return ApprovalApplicationCodePrefix.ASSET_REPAIR + dateStr + sequenceStr;
+    }
+
+    /**
+     * 校验报修单是否存在
+     * @param repairRequestNo 报修单号
+     * @return 报修单ID
+     */
+    private Integer validateRepairRequest(String repairRequestNo) {
+        AssetRepairRequest repairRequest = assetRepairRequestService.lambdaQuery()
+                .eq(AssetRepairRequest::getRepairNo, repairRequestNo)
+                .eq(AssetRepairRequest::getDisabled, false)
+                .one();
+
+        if (repairRequest == null) {
+            throw new RuntimeException("报修单不存在:" + repairRequestNo);
+        }
+
+        return repairRequest.getId();
+    }
+
+    /**
+     * 保存维修记录资产关联关系
+     * @param repairRecordId 维修记录ID
+     * @param assetMainIds 资产ID列表
+     */
+    private void saveRepairRecordItems(Integer repairRecordId, List<Integer> assetMainIds) {
+        if (assetMainIds == null || assetMainIds.isEmpty()) {
+            throw new RuntimeException("维修资产ID列表不能为空");
+        }
+
+        List<AssetRepairRecordItem> items = new ArrayList<>();
+        for (Integer assetMainId : assetMainIds) {
+            AssetRepairRecordItem item = new AssetRepairRecordItem();
+            item.setRepairRecordId(repairRecordId);
+            item.setAssetMainId(assetMainId);
+            items.add(item);
+        }
+
+        boolean saved = assetRepairRecordItemService.saveBatch(items);
+        if (!saved) {
+            throw new RuntimeException("保存维修资产关联关系失败");
+        }
+    }
+
+    @Override
+    public AssetRepairRecordDetailVO getRepairRecordDetail(Integer id) {
+        // 1. 查询主表信息
+        AssetRepairRecord repairRecord = this.getById(id);
+        if (repairRecord == null) {
+            throw new RuntimeException("维修记录不存在");
+        }
+
+        // 2. 转换主表信息到VO
+        AssetRepairRecordDetailVO detailVO = new AssetRepairRecordDetailVO();
+        BeanUtil.copyProperties(repairRecord, detailVO);
+
+        // 4. 查询关联的资产列表
+        List<AssetRepairRecordAssetVO> assetList = this.baseMapper.getRepairAssetList(id);
+        detailVO.setAssetList(assetList);
+
+        return detailVO;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void completeRepair(AssetRepairCompleteDTO dto) {
+        //查询维修记录资产关联表
+        AssetRepairRecordItem item = assetRepairRecordItemService.lambdaQuery().eq(AssetRepairRecordItem::getRepairRecordId, dto.getRepairRecordId())
+                .eq(AssetRepairRecordItem::getAssetMainId, dto.getAssetMainId()).one();
+        if (Objects.isNull(item)) {
+            throw new ServiceException("维修记录不存在");
+        }
+        item.setRepairFinishTime(Objects.nonNull(dto.getRepairFinishTime()) ? dto.getRepairFinishTime() : LocalDateTime.now());
+        item.setRepairFee(dto.getRepairFee());
+        item.setStatus(1);
+        assetRepairRecordItemService.updateById(item);
+        //统计未维修的资产数量 TODO 待验证
+        Long count = assetRepairRecordItemService.lambdaQuery()
+                .eq(AssetRepairRecordItem::getRepairRecordId, dto.getRepairRecordId()).eq(AssetRepairRecordItem::getStatus, 0)
+                .count();
+        if (count.equals(0L)) {
+            //更新主表状态
+            AssetRepairRecord repairRecord = this.getById(dto.getRepairRecordId());
+            repairRecord.setRepairStatus(2);
+            this.updateById(repairRecord);
+            //查询关联保修单
+            if (Objects.nonNull(repairRecord.getRepairRequestId())) {
+                //更新关联报修单状态
+                assetRepairRequestService.lambdaUpdate().set(AssetRepairRequest::getRepairStatus, 1)
+                        .eq(AssetRepairRequest::getId, repairRecord.getRepairRequestId())
+                        .update();
+            }
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void deleteById(Integer id) {
+        this.removeById(id);
+        assetRepairRecordItemService.lambdaUpdate()
+                .eq(AssetRepairRecordItem::getRepairRecordId, id)
+                .remove();
+    }
+
+    @Override
     public List<AssetRepairRequestVO> listAll(AssetRepairRequestListQuery query) {
         List<AssetRepairRequestVO> list = this.baseMapper.listAll(query);
         return list;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java
index 0232b33..17cfd99 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java
@@ -8,6 +8,7 @@
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.system.bo.OaApprovalApplicationAssetReturnBO;
+import com.ruoyi.system.constants.ApprovalApplicationCodePrefix;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReceiveDTO;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationAssetReturnDTO;
 import com.ruoyi.system.emums.ApprovalStatusEnum;
@@ -36,7 +37,6 @@
 import org.springframework.util.CollectionUtils;
 
 import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
@@ -109,7 +109,8 @@
 
     private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationAssetReceiveDTO dto) {
         OaApprovalApplications applications = new OaApprovalApplications();
-        applications.setApplicationCode(generateApplicationCode(dto.getType().equals(0) ? "LY" : "JY"));
+        applications.setApplicationCode(oaApprovalApplicationsService.generateApplicationCode(dto.getType().equals(0) ?
+                ApprovalApplicationCodePrefix.ASSET_RECEIVE : ApprovalApplicationCodePrefix.ASSET_BORROW));
         applications.setApprovalId(dto.getType().equals(0) ? ApprovalTypeEnum.GRAB.getCode() : ApprovalTypeEnum.BORROW.getCode());
         applications.setApplicantUserId(dto.getApplicantUserId());
         applications.setApplicantName(dto.getApplicantName());
@@ -128,22 +129,6 @@
         asset.setApprovalApplicationId(applicationId);
         asset.setType(dto.getType());
         return asset;
-    }
-
-    /**
-     * 生成申请单号:LY + yyyyMMdd + 3位序号
-     */
-    private String generateApplicationCode(String prefix) {
-        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        prefix = prefix + dateStr;
-        Long count = oaApprovalApplicationsService.lambdaQuery()
-                .like(OaApprovalApplications::getApplicationCode, prefix)
-                .ge(OaApprovalApplications::getCreateTime, LocalDate.now().atStartOfDay())
-                .lt(OaApprovalApplications::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay())
-                .count();
-        int sequence = (count != null ? count.intValue() : 0) + 1;
-        String sequenceStr = String.format("%03d", sequence);
-        return prefix + sequenceStr;
     }
 
     @Override
@@ -257,7 +242,7 @@
         oaApprovalApplicationAssetItemService.validateAssetStatus(dto.getAssetMainIds());
         // 1. 构建并保存审批主表
         OaApprovalApplications applications = BeanUtil.copyProperties(dto, OaApprovalApplications.class);
-        applications.setApplicationCode(generateApplicationCode("GH"));
+        applications.setApplicationCode(oaApprovalApplicationsService.generateApplicationCode(ApprovalApplicationCodePrefix.ASSET_RETURN));
         applications.setApprovalId(ApprovalTypeEnum.RETURN.getCode());
         applications.setApplicationDate(LocalDate.now());
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java
index 5caf438..b626667 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationChangeServiceImpl.java
@@ -6,6 +6,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.constants.ApprovalApplicationCodePrefix;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationChangeDTO;
 import com.ruoyi.system.emums.ApprovalStatusEnum;
 import com.ruoyi.system.emums.ApprovalTypeEnum;
@@ -88,7 +89,7 @@
 
     private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationChangeDTO dto) {
         OaApprovalApplications applications = BeanUtil.copyProperties(dto, OaApprovalApplications.class);
-        applications.setApplicationCode(generateApplicationCode("BG"));
+        applications.setApplicationCode(oaApprovalApplicationsService.generateApplicationCode(ApprovalApplicationCodePrefix.ASSET_CHANGE));
         applications.setApprovalId(ApprovalTypeEnum.ASSET_CHANGE.getCode());
         applications.setApplicationDate(LocalDate.now());
         applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java
index 15a4143..d0c21e9 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java
@@ -5,6 +5,7 @@
 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.system.constants.ApprovalApplicationCodePrefix;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationDisposeDTO;
 import com.ruoyi.system.emums.ApprovalStatusEnum;
 import com.ruoyi.system.emums.ApprovalTypeEnum;
@@ -29,7 +30,6 @@
 import org.springframework.util.CollectionUtils;
 
 import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
 import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -93,7 +93,7 @@
 
     private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationDisposeDTO dto) {
         OaApprovalApplications applications = BeanUtil.copyProperties(dto, OaApprovalApplications.class);
-        applications.setApplicationCode(generateApplicationCode("CZ"));
+        applications.setApplicationCode(oaApprovalApplicationsService.generateApplicationCode(ApprovalApplicationCodePrefix.ASSET_DISPOSE));
         applications.setApprovalId(ApprovalTypeEnum.ASSET_DISPOSE.getCode());
         applications.setApplicationDate(LocalDate.now());
         applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
@@ -116,18 +116,6 @@
             throw new ServiceException("未找到有效的审批流程配置");
         }
         return flowNodes.get(0);
-    }
-
-    /**
-     * 生成申请单号:CZ + yyyyMMdd + 3位序号
-     */
-    private String generateApplicationCode(String prefix) {
-        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        prefix = prefix + dateStr;
-        Long count = oaApprovalApplicationsService.lambdaQuery()
-                .like(OaApprovalApplications::getApplicationCode, prefix)
-                .count();
-        return prefix + String.format("%03d", count + 1);
     }
 
     @Override
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java
index 33e9534..3a08cd6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationPurchaseServiceImpl.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.system.constants.ApprovalApplicationCodePrefix;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationPurchaseDTO;
 import com.ruoyi.system.emums.ApprovalStatusEnum;
 import com.ruoyi.system.emums.ApprovalTypeEnum;
@@ -20,8 +21,6 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 /**
@@ -87,7 +86,7 @@
      */
     private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationPurchaseDTO dto) {
         OaApprovalApplications applications = new OaApprovalApplications();
-        applications.setApplicationCode(generateApplicationCode());
+        applications.setApplicationCode(oaApprovalApplicationsService.generateApplicationCode(ApprovalApplicationCodePrefix.ASSET_PURCHASE));
         applications.setApprovalId(ApprovalTypeEnum.PURCHASE.getCode());
         applications.setApplicantUserId(dto.getApplicantUserId());
         applications.setApplicantName(dto.getApplicantName());
@@ -134,27 +133,5 @@
                     return purchaseItem;
                 })
                 .collect(java.util.stream.Collectors.toList());
-    }
-
-    /**
-     * 生成申请单号
-     * 格式:CG + 年月日 + 3位序号
-     */
-    private String generateApplicationCode() {
-        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        String prefix = "CG" + dateStr;
-        
-        // 查询当天已生成的申请单号数量
-        Long count = oaApprovalApplicationsService.lambdaQuery()
-                .like(OaApprovalApplications::getApplicationCode, prefix)
-                .ge(OaApprovalApplications::getCreateTime, LocalDate.now().atStartOfDay())
-                .lt(OaApprovalApplications::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay())
-                .count();
-        
-        // 生成3位序号,从001开始
-        int sequence = (count != null ? count.intValue() : 0) + 1;
-        String sequenceStr = String.format("%03d", sequence);
-        
-        return prefix + sequenceStr;
     }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java
index 97d8f45..1602eac 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationStorageServiceImpl.java
@@ -8,6 +8,7 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.entity.TDept;
 import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.system.constants.ApprovalApplicationCodePrefix;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationStorageGeneralDTO;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationStoragePropertyDTO;
 import com.ruoyi.system.dto.asset.OaApprovalApplicationStorageVehicleDTO;
@@ -47,7 +48,6 @@
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -369,7 +369,7 @@
         }
         applications.setApprovalId(ApprovalTypeEnum.IN_STOCK.getCode());
         applications.setApplicationDate(LocalDate.now());
-        applications.setApplicationCode(generateApplicationCode());
+        applications.setApplicationCode(oaApprovalApplicationsService.generateApplicationCode(ApprovalApplicationCodePrefix.ASSET_STOCK_IN));
         applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
         return applications;
     }
@@ -393,26 +393,6 @@
         }
         
         return storage;
-    }
-
-    /**
-     * 生成申请单号
-     * 格式:RK + 年月日 + 3位序号
-     */
-    private String generateApplicationCode() {
-        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
-        String prefix = "RK" + dateStr;
-        
-        Long count = oaApprovalApplicationsService.lambdaQuery()
-                .like(OaApprovalApplications::getApplicationCode, prefix)
-                .ge(OaApprovalApplications::getCreateTime, LocalDate.now().atStartOfDay())
-                .lt(OaApprovalApplications::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay())
-                .count();
-        
-        int sequence = (count != null ? count.intValue() : 0) + 1;
-        String sequenceStr = String.format("%03d", sequence);
-        
-        return prefix + sequenceStr;
     }
 
     @Override
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationsServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationsServiceImpl.java
index 3748ef0..ffb53ed 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationsServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationsServiceImpl.java
@@ -14,6 +14,8 @@
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.List;
 import java.util.Objects;
 
@@ -51,4 +53,22 @@
             app.setDeptName(dept.getDeptName());
         }
     }
+
+    @Override
+    public String generateApplicationCode(String prefix) {
+        String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+
+        // 查询当天已生成的申请单号数量
+        Long count = this.lambdaQuery()
+                .likeRight(OaApprovalApplications::getApplicationCode, prefix)
+                .ge(OaApprovalApplications::getCreateTime, LocalDate.now().atStartOfDay())
+                .lt(OaApprovalApplications::getCreateTime, LocalDate.now().plusDays(1).atStartOfDay())
+                .count();
+
+        // 生成4位序号,从0001开始
+        int sequence = (count != null ? count.intValue() : 0) + 1;
+        String sequenceStr = String.format("%04d", sequence);
+
+        return prefix + dateStr + sequenceStr;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordAssetVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordAssetVO.java
new file mode 100644
index 0000000..5b54ffe
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordAssetVO.java
@@ -0,0 +1,56 @@
+package com.ruoyi.system.vo.asset;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * <p>
+ * 资产维修记录资产项VO
+ * </p>
+ *
+ * @author WuGuanFengYue
+ * @since 2025-10-09
+ */
+@Data
+@ApiModel(value="AssetRepairRecordAssetVO对象", description="资产维修记录资产项VO")
+public class AssetRepairRecordAssetVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "资产ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "资产编码")
+    private String assetCode;
+
+    @ApiModelProperty(value = "资产名称")
+    private String assetName;
+
+    @ApiModelProperty(value = "所属部门")
+    private String deptName;
+
+    @ApiModelProperty(value = "资产大类(关联的资产类型的父级类型)")
+    private String parentAssetType;
+
+    @ApiModelProperty(value = "资产小类(关联的资产类型)")
+    private String assetType;
+
+    @ApiModelProperty(value = "资产状态")
+    private String assetStatus;
+
+    @ApiModelProperty(value = "维修完成时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime repairFinishTime;
+
+    @ApiModelProperty(value = "维修花费")
+    private BigDecimal repairFee;
+
+    @ApiModelProperty(value = "维修状态")
+    private Integer status;
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordDetailVO.java
new file mode 100644
index 0000000..c12e603
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordDetailVO.java
@@ -0,0 +1,80 @@
+package com.ruoyi.system.vo.asset;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ * 资产维修记录详情VO
+ * </p>
+ *
+ * @author WuGuanFengYue
+ * @since 2025-10-09
+ */
+@Data
+@ApiModel(value="AssetRepairRecordDetailVO对象", description="资产维修记录详情VO")
+public class AssetRepairRecordDetailVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "维修记录ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "维修单号")
+    private String repairNo;
+
+    @ApiModelProperty(value = "事项标题")
+    private String title;
+
+    @ApiModelProperty(value = "维修资产类型")
+    private String assetTypeName;
+
+    @ApiModelProperty(value = "维修资产一级类型")
+    private String assetTypeFirstLevel;
+
+    @ApiModelProperty(value = "维修开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime repairTime;
+
+    @ApiModelProperty(value = "当前维修状态:0-维修中,1-无需维修,2-维修完成")
+    private Integer repairStatus;
+
+    @ApiModelProperty(value = "维修人")
+    private String repairBy;
+
+    @ApiModelProperty(value = "维修费用")
+    private BigDecimal totalFee;
+
+    @ApiModelProperty(value = "维修备注")
+    private String repairRemarks;
+
+    @ApiModelProperty(value = "附件URL列表(多个附件使用英文逗号拼接)")
+    private String attachmentUrls;
+
+    @ApiModelProperty(value = "关联报修单ID")
+    private Integer repairRequestId;
+
+    @ApiModelProperty(value = "维修资产列表")
+    private List<AssetRepairRecordAssetVO> assetList;
+
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+
+    @ApiModelProperty(value = "更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordPageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordPageVO.java
index 209612b..0da1ddd 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordPageVO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetRepairRecordPageVO.java
@@ -41,5 +41,5 @@
     private LocalDateTime repairTime;
 
     @ApiModelProperty(value = "处理状态:0-维修中,1-无需维修,2-维修完成")
-    private Boolean repairStatus;
+    private Integer repairStatus;
 }
\ No newline at end of file
diff --git a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
index 6927d64..5ecaeba 100644
--- a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
@@ -92,6 +92,58 @@
                 AND (am.asset_name LIKE CONCAT('%', #{query.keyword}, '%')
                 OR am.asset_code LIKE CONCAT('%', #{query.keyword}, '%'))
             </if>
+            <if test="query.deptId != null">
+                AND (od.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, od.parent_id))
+            </if>
+        </where>
+        ORDER BY COALESCE(oas.storage_time, DATE(am.create_time)) DESC, am.id DESC
+    </select>
+    <select id="getAssetPageList" resultType="com.ruoyi.system.vo.asset.AssetMainPageVO">
+        SELECT
+        am.id AS id,
+        am.asset_code AS assetCode,
+        am.asset_name AS assetName,
+        at.type_name AS assetTypeName,
+        od.dept_name AS ownershipDeptName,
+        am.asset_status AS assetStatus,
+        oas.storage_time AS storageTime,
+        CASE
+        WHEN am.address_type = 0 THEN
+        ud.dept_name
+        WHEN am.address_type = 1 THEN
+        am.warehouse_name
+        WHEN am.address_type = 2 THEN
+        am.address
+        ELSE ''
+        END AS useDeptOrLocation
+        FROM asset_main am
+        INNER JOIN oa_approval_applications aaa ON aaa.id = am.approval_application_id
+        LEFT JOIN oa_approval_application_storage oas ON oas.approval_application_id = am.approval_application_id
+        LEFT JOIN asset_type at ON at.id = am.asset_type_id
+        LEFT JOIN t_dept od ON od.id = am.ownership_dept_id
+        LEFT JOIN t_dept ud ON ud.id = am.use_dept_id
+        LEFT JOIN oa_approval_application_asset_item oaaai ON oaaai.asset_main_id = am.id
+        LEFT JOIN oa_approval_applications oaa ON oaa.id = oaaai.approval_application_id
+        <where>
+            AND IFNULL(am.disabled, 0) = 0
+            AND IFNULL(aaa.disabled, 0) = 0
+            AND aaa.approval_status = 2 AND aaa.approval_id = '${@com.ruoyi.system.emums.ApprovalTypeEnum@IN_STOCK.getCode()}'
+            <if test="query != null and query.assetTypeId != null">
+                AND am.asset_type_id = #{query.assetTypeId}
+            </if>
+            <if test="query != null and query.ownershipDeptId != null">
+                AND am.ownership_dept_id = #{query.ownershipDeptId}
+            </if>
+            <if test="query != null and query.assetStatus != null and query.assetStatus != ''">
+                AND am.asset_status = #{query.assetStatus}
+            </if>
+            <if test="query != null and query.keyword != null and query.keyword != ''">
+                AND (am.asset_name LIKE CONCAT('%', #{query.keyword}, '%')
+                OR am.asset_code LIKE CONCAT('%', #{query.keyword}, '%'))
+            </if>
+            <if test="query.deptId != null">
+                AND (od.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, od.parent_id))
+            </if>
         </where>
         ORDER BY COALESCE(oas.storage_time, DATE(am.create_time)) DESC, am.id DESC
     </select>
diff --git a/ruoyi-system/src/main/resources/mapper/system/AssetRepairRecordMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AssetRepairRecordMapper.xml
index 84761b5..b42e869 100644
--- a/ruoyi-system/src/main/resources/mapper/system/AssetRepairRecordMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/AssetRepairRecordMapper.xml
@@ -14,6 +14,7 @@
         <result column="repair_remarks" property="repairRemarks" />
         <result column="attachment_urls" property="attachmentUrls" />
         <result column="repair_status" property="repairStatus" />
+        <result column="total_fee" property="totalFee" />
         <result column="create_time" property="createTime" />
         <result column="create_by" property="createBy" />
         <result column="update_time" property="updateTime" />
@@ -23,7 +24,7 @@
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, repair_request_id, repair_no, title, repair_time, repair_by, asset_type_id, repair_remarks, attachment_urls, repair_status, create_time, create_by, update_time, update_by, disabled
+        id, repair_request_id, repair_no, title, repair_time, repair_by, asset_type_id, repair_remarks, attachment_urls, repair_status, total_fee, create_time, create_by, update_time, update_by, disabled
     </sql>
     <select id="pageList" resultType="com.ruoyi.system.vo.AssetRepairRequestVO">
         select t1.*,t2.asset_main_id as assetMainId,t3.nick_name as reporterName from asset_repair_request t1
@@ -93,4 +94,28 @@
         order by t1.repair_status, t1.urgency_level asc
     </select>
 
+    <!-- 查询维修记录关联的资产列表 -->
+    <select id="getRepairAssetList" resultType="com.ruoyi.system.vo.asset.AssetRepairRecordAssetVO">
+        SELECT
+            am.id,
+            am.asset_code,
+            am.asset_name,
+            dept.dept_name,
+            parent_type.type_name AS parentAssetType,
+            current_type.type_name AS assetType,
+            am.asset_status,
+            arri.repair_finish_time,
+            arri.repair_fee,
+            arri.status
+        FROM asset_repair_record_item arri
+        LEFT JOIN asset_main am ON arri.asset_main_id = am.id
+        LEFT JOIN asset_type current_type ON am.asset_type_id = current_type.id
+        LEFT JOIN asset_type parent_type ON current_type.parent_id = parent_type.id
+        LEFT JOIN t_dept dept ON am.use_dept_id = dept.dept_id
+        LEFT JOIN asset_repair_record arr ON arri.repair_record_id = arr.id
+        WHERE arri.repair_record_id = #{repairRecordId}
+          AND am.disabled = 0
+        ORDER BY am.asset_code
+    </select>
+
 </mapper>

--
Gitblit v1.7.1