From d9a63819279a0b17070d4af08d24f567ba8904e4 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期日, 28 九月 2025 22:40:53 +0800
Subject: [PATCH] 资产处置

---
 ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationDisposePageQuery.java          |   24 +++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/dispose/OaApprovalApplicationDisposeDTO.java          |   69 ++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationDisposeMapper.java            |   16 +
 ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationDisposeMapper.xml                  |   47 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java            |    7 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java      |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/dispose/OaApprovalApplicationDisposePageVO.java        |   57 +++++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java    |   75 +++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationAssetServiceImpl.java   |   26 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationDisposeService.java          |   24 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OaApprovalApplicationDisposeServiceImpl.java |  118 ++++++++++++++
 11 files changed, 464 insertions(+), 6 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java
index 4c7b34a..7f04abe 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationAssetController.java
@@ -163,6 +163,13 @@
         IPage<OaApprovalApplicationAssetPageVO> page = oaApprovalApplicationAssetService.getReturnNotifyPageList(pageQuery);
         return R.ok(page);
     }
+
+    @ApiOperation("获取资产归还详情")
+    @GetMapping("/detail/return/{id}")
+    public R<OaApprovalApplicationAssetDetailVO> getReturnDetail(@ApiParam(name = "id", value = "审批单ID", required = true) @PathVariable Integer id) {
+        OaApprovalApplicationAssetDetailVO detail = oaApprovalApplicationAssetService.getReturnDetail(id);
+        return R.ok(detail);
+    }
     @ApiOperation("删除/领用/借用/归还申请")
     @DeleteMapping("/{id}")
     public R<?> delete(@ApiParam(name = "id",value = "审批记录ID",required = true) @PathVariable Integer id){
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java
index ae7dca6..03bb7f9 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OaApprovalApplicationDisposeController.java
@@ -1,20 +1,91 @@
 package com.ruoyi.web.controller.api;
 
-
+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.dto.dispose.OaApprovalApplicationDisposeDTO;
+import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery;
+import com.ruoyi.system.service.OaApprovalApplicationDisposeService;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO;
+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>
- * 资产领用单明细表 前端控制器
+ * 资产处置单明细表 前端控制器
  * </p>
  *
  * @author WuGuanFengYue
  * @since 2025-09-15
  */
+@Validated
 @RestController
+@Api(tags = {"OA审批-资产处置相关接口"})
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
 @RequestMapping("/oa-approval-application-dispose")
 public class OaApprovalApplicationDisposeController {
+    
+    private final OaApprovalApplicationDisposeService oaApprovalApplicationDisposeService;
+    private final ISysUserService sysUserService;
 
+    @ApiOperation("提交资产处置申请")
+    @PostMapping("/submit-dispose")
+    @Log(title = "资产处置申请-提交", businessType = BusinessType.INSERT)
+    public R<Void> submitDispose(@Valid @RequestBody OaApprovalApplicationDisposeDTO dto) {
+        oaApprovalApplicationDisposeService.submitDispose(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("获取资产处置申请分页列表")
+    @PostMapping("/page-list")
+    public R<IPage<OaApprovalApplicationDisposePageVO>> getDisposePageList(@RequestBody OaApprovalApplicationDisposePageQuery pageQuery) {
+        // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据
+        Long userId = SecurityUtils.getUserId();
+        boolean isAdmin = SecurityUtils.isAdmin(userId);
+        
+        if (!isAdmin) {
+            try {
+                // 获取当前用户的部门名称
+                String deptName = sysUserService.selectUserById(userId).getDept().getDeptName();
+                
+                // 非超级管理员且非资产管理部,设置部门权限
+                if (!"资产管理部".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<OaApprovalApplicationDisposePageVO> page = oaApprovalApplicationDisposeService.getDisposePageList(pageQuery);
+        return R.ok(page);
+    }
+
+    @ApiOperation("删除处置申请")
+    @DeleteMapping("/{id}")
+    public R<?> deleteByApplicationId(@ApiParam(name = "id", value = "申请单ID", required = true) @PathVariable Integer id) {
+        oaApprovalApplicationDisposeService.deleteByApplicationId(id);
+        return R.ok();
+    }
 }
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/dispose/OaApprovalApplicationDisposeDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/dispose/OaApprovalApplicationDisposeDTO.java
new file mode 100644
index 0000000..9b75f6b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/dispose/OaApprovalApplicationDisposeDTO.java
@@ -0,0 +1,69 @@
+package com.ruoyi.system.dto.dispose;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+
+/**
+ * 资产处置申请 DTO
+ */
+@Data
+@ApiModel("资产处置申请DTO")
+public class OaApprovalApplicationDisposeDTO implements Serializable {
+    private static final long serialVersionUID = 2025092801L;
+
+    @ApiModelProperty("事项标题")
+    @NotNull(message = "事项标题不能为空")
+    private String title;
+
+    @ApiModelProperty("处置资产类型ID")
+    @NotNull(message = "处置资产类型不能为空")
+    private Integer assetTypeId;
+
+    @ApiModelProperty("处置日期")
+    @NotNull(message = "处置日期不能为空")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate disposeTime;
+
+    @ApiModelProperty("处置方式 0-报废,1-报损,2-捐赠")
+    @NotNull(message = "处置方式不能为空")
+    private Integer disposeType;
+
+    @ApiModelProperty("申请部门ID")
+    @NotNull(message = "申请部门不能为空")
+    private Integer deptId;
+
+    @ApiModelProperty("申请部门名称")
+    @NotNull(message = "申请部门名称不能为空")
+    private String deptName;
+
+    @ApiModelProperty("申请人用户ID")
+    @NotNull(message = "申请人不能为空")
+    private Integer applicantUserId;
+
+    @ApiModelProperty("申请人名称")
+    @NotNull(message = "申请人名称不能为空")
+    private String applicantName;
+
+    @ApiModelProperty("处置总金额(元)")
+    @NotNull(message = "处置总金额不能为空")
+    private BigDecimal disposeTotalAmount;
+
+    @ApiModelProperty("处置备注")
+    private String applicationReason;
+
+    @ApiModelProperty("附件URL,多个使用英文逗号拼接")
+    private String attachmentUrl;
+
+    @ApiModelProperty("资产列表")
+    @NotEmpty(message = "资产列表不能为空")
+    private List<Integer> assetMainIds;
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationDisposeMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationDisposeMapper.java
index f173c97..8211d62 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationDisposeMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/OaApprovalApplicationDisposeMapper.java
@@ -1,11 +1,16 @@
 package com.ruoyi.system.mapper;
 
-import com.ruoyi.system.model.OaApprovalApplicationDispose;
 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.system.model.OaApprovalApplicationDispose;
+import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery;
+import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
- * 资产领用单明细表 Mapper 接口
+ * 资产处置单明细表 Mapper 接口
  * </p>
  *
  * @author WuGuanFengYue
@@ -13,4 +18,11 @@
  */
 public interface OaApprovalApplicationDisposeMapper extends BaseMapper<OaApprovalApplicationDispose> {
 
+    /**
+     * 分页查询资产处置申请列表
+     * @param page 分页参数
+     * @param pageQuery 查询条件
+     * @return 分页结果
+     */
+    IPage<OaApprovalApplicationDisposePageVO> getDisposePageList(Page<OaApprovalApplicationDisposePageVO> page, @Param("query") OaApprovalApplicationDisposePageQuery pageQuery);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationDisposePageQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationDisposePageQuery.java
new file mode 100644
index 0000000..7214efa
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/OaApprovalApplicationDisposePageQuery.java
@@ -0,0 +1,24 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 资产处置申请分页查询参数
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "资产处置申请分页查询参数")
+public class OaApprovalApplicationDisposePageQuery extends BasePage {
+
+    private static final long serialVersionUID = 5275799518107306564L;
+
+    @ApiModelProperty(value = "标题/单号")
+    private String keyword;
+
+    @ApiModelProperty(value = "部门ID")
+    private Integer deptId;
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java
index f88ad32..f06d353 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationAssetService.java
@@ -87,6 +87,13 @@
     IPage<OaApprovalApplicationAssetPageVO> getReturnNotifyPageList(OaApprovalApplicationAssetPageQuery pageQuery);
 
     /**
+     * 获取归还单详情
+     * @param id
+     * @return
+     */
+    OaApprovalApplicationAssetDetailVO getReturnDetail(Integer id);
+
+    /**
      * 删除审批单相关的资产领用/借用/归还记录
      * @param applicationId
      */
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationDisposeService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationDisposeService.java
index a69aae6..2824162 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationDisposeService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OaApprovalApplicationDisposeService.java
@@ -1,11 +1,15 @@
 package com.ruoyi.system.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.dto.dispose.OaApprovalApplicationDisposeDTO;
 import com.ruoyi.system.model.OaApprovalApplicationDispose;
+import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery;
+import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO;
 
 /**
  * <p>
- * 资产领用单明细表 服务类
+ * 资产处置单明细表 服务类
  * </p>
  *
  * @author WuGuanFengYue
@@ -13,4 +17,22 @@
  */
 public interface OaApprovalApplicationDisposeService extends IService<OaApprovalApplicationDispose> {
 
+    /**
+     * 获取资产处置申请分页列表
+     * @param pageQuery 查询参数
+     * @return 分页结果
+     */
+    IPage<OaApprovalApplicationDisposePageVO> getDisposePageList(OaApprovalApplicationDisposePageQuery pageQuery);
+
+    /**
+     * 提交处置申请
+     * @param dto 处置申请数据
+     */
+    void submitDispose(OaApprovalApplicationDisposeDTO dto);
+
+    /**
+     * 删除审批单
+     * @param applicationId
+     */
+    void deleteByApplicationId(Integer applicationId);
 }
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 fdb9954..36986e6 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
@@ -316,10 +316,36 @@
         });
         return pageByType;
     }
+
+    @Override
+    public OaApprovalApplicationAssetDetailVO getReturnDetail(Integer id) {
+        OaApprovalApplications app = oaApprovalApplicationsService.getById(id);
+        if (app == null) {
+            throw new ServiceException("审批主记录不存在");
+        }
+        OaApprovalApplicationAsset detail = this.lambdaQuery().eq(OaApprovalApplicationAsset::getApprovalApplicationId, app.getId()).one();
+        if (detail == null) {
+            throw new ServiceException("记录不存在");
+        }
+        oaApprovalApplicationsService.assembleApplicationDetail(app);
+        List<Integer> assetMainIds = oaApprovalApplicationAssetItemService.lambdaQuery()
+                .eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, app.getId())
+                .list().stream().map(OaApprovalApplicationAssetItem::getAssetMainId)
+                .distinct().collect(Collectors.toList());
+
+        List<AssetMainVO> assetMainVOS = assetMainIds.isEmpty() ? Collections.emptyList() : assetMainService.getListByIds(assetMainIds);
+        OaApprovalApplicationAssetDetailVO vo = BeanUtil.copyProperties(app, OaApprovalApplicationAssetDetailVO.class);
+        vo.setTitle(detail.getTitle());
+        vo.setAssetTypeId(detail.getAssetTypeId());
+        vo.setOperateTime(detail.getOperateTime());
+        vo.setItems(assetMainVOS);
+        return vo;
+    }
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void deleteByApplicationId(Integer applicationId) {
         this.lambdaUpdate().eq(OaApprovalApplicationAsset::getApprovalApplicationId, applicationId).remove();
+        oaApprovalApplicationAssetItemService.lambdaUpdate().eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, applicationId).remove();
         oaApprovalApplicationsService.removeById(applicationId);
     }
 }
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 f1730ce..edd5be5 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
@@ -1,20 +1,136 @@
 package com.ruoyi.system.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+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.system.dto.dispose.OaApprovalApplicationDisposeDTO;
+import com.ruoyi.system.emums.ApprovalStatusEnum;
+import com.ruoyi.system.emums.ApprovalTypeEnum;
 import com.ruoyi.system.mapper.OaApprovalApplicationDisposeMapper;
+import com.ruoyi.system.model.OaApprovalApplicationAssetItem;
 import com.ruoyi.system.model.OaApprovalApplicationDispose;
+import com.ruoyi.system.model.OaApprovalApplications;
+import com.ruoyi.system.model.OaApprovalFlowNode;
+import com.ruoyi.system.query.OaApprovalApplicationDisposePageQuery;
+import com.ruoyi.system.service.OaApprovalApplicationAssetItemService;
 import com.ruoyi.system.service.OaApprovalApplicationDisposeService;
+import com.ruoyi.system.service.OaApprovalApplicationsService;
+import com.ruoyi.system.service.OaApprovalFlowNodeService;
+import com.ruoyi.system.service.OaApprovalTodoService;
+import com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * <p>
- * 资产领用单明细表 服务实现类
+ * 资产处置单明细表 服务实现类
  * </p>
  *
  * @author WuGuanFengYue
  * @since 2025-09-15
  */
 @Service
+@RequiredArgsConstructor
 public class OaApprovalApplicationDisposeServiceImpl extends ServiceImpl<OaApprovalApplicationDisposeMapper, OaApprovalApplicationDispose> implements OaApprovalApplicationDisposeService {
 
+    private final OaApprovalApplicationsService oaApprovalApplicationsService;
+    private final OaApprovalFlowNodeService oaApprovalFlowNodeService;
+    private final OaApprovalTodoService oaApprovalTodoService;
+    private final OaApprovalApplicationAssetItemService oaApprovalApplicationAssetItemService;
+
+    @Override
+    public IPage<OaApprovalApplicationDisposePageVO> getDisposePageList(OaApprovalApplicationDisposePageQuery pageQuery) {
+        Page<OaApprovalApplicationDisposePageVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
+        return this.baseMapper.getDisposePageList(page, pageQuery);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void submitDispose(OaApprovalApplicationDisposeDTO dto) {
+        if (CollUtil.isEmpty(dto.getAssetMainIds())) {
+            throw new ServiceException("资产ID列表不能为空");
+        }
+        
+        // 1. 构建并保存审批主表
+        OaApprovalApplications applications = buildOaApprovalApplications(dto);
+
+        // 2. 获取流程首节点,设置当前节点,并保存
+        OaApprovalFlowNode firstFlowNode = getFirstFlowNode(ApprovalTypeEnum.ASSET_DISPOSE.getCode());
+        applications.setCurrentFlowNodeId(firstFlowNode.getId());
+        oaApprovalApplicationsService.save(applications);
+
+        // 3. 创建待办
+        oaApprovalTodoService.createApprovalTodos(applications.getId(), applications.getApplicationCode(), firstFlowNode, dto.getDeptId());
+
+        // 4. 保存处置明细
+        OaApprovalApplicationDispose detail = buildOaApprovalApplicationDispose(dto, applications.getId());
+        this.save(detail);
+
+        // 5. 保存关联的资产项
+        List<OaApprovalApplicationAssetItem> items = dto.getAssetMainIds().stream()
+                .map(i -> {
+                    OaApprovalApplicationAssetItem item = new OaApprovalApplicationAssetItem();
+                    item.setApprovalApplicationId(applications.getId());
+                    item.setAssetMainId(i);
+                    return item;
+                })
+                .collect(Collectors.toList());
+        oaApprovalApplicationAssetItemService.saveBatch(items);
+    }
+
+    private OaApprovalApplications buildOaApprovalApplications(OaApprovalApplicationDisposeDTO dto) {
+        OaApprovalApplications applications = BeanUtil.copyProperties(dto, OaApprovalApplications.class);
+        applications.setApplicationCode(generateApplicationCode("CZ"));
+        applications.setApprovalId(ApprovalTypeEnum.ASSET_DISPOSE.getCode());
+        applications.setApplicationDate(LocalDate.now());
+        applications.setApprovalStatus(ApprovalStatusEnum.PENDING.getCode());
+        return applications;
+    }
+
+    private OaApprovalApplicationDispose buildOaApprovalApplicationDispose(OaApprovalApplicationDisposeDTO dto, Integer applicationId) {
+        OaApprovalApplicationDispose dispose = BeanUtil.copyProperties(dto, OaApprovalApplicationDispose.class);
+        dispose.setApprovalApplicationId(applicationId);
+        return dispose;
+    }
+
+    private OaApprovalFlowNode getFirstFlowNode(Integer approvalId) {
+        List<OaApprovalFlowNode> flowNodes = oaApprovalFlowNodeService.lambdaQuery()
+                .eq(OaApprovalFlowNode::getApprovalId, approvalId)
+                .eq(OaApprovalFlowNode::getStatus, 1)
+                .orderByAsc(OaApprovalFlowNode::getSortOrder)
+                .list();
+        if (CollectionUtils.isEmpty(flowNodes)) {
+            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
+    public void deleteByApplicationId(Integer applicationId) {
+        this.lambdaUpdate().eq(OaApprovalApplicationDispose::getApprovalApplicationId, applicationId).remove();
+        oaApprovalApplicationAssetItemService.lambdaUpdate().eq(OaApprovalApplicationAssetItem::getApprovalApplicationId, applicationId).remove();
+        oaApprovalApplicationsService.removeById(applicationId);
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/dispose/OaApprovalApplicationDisposePageVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/dispose/OaApprovalApplicationDisposePageVO.java
new file mode 100644
index 0000000..bea87a4
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/dispose/OaApprovalApplicationDisposePageVO.java
@@ -0,0 +1,57 @@
+package com.ruoyi.system.vo.dispose;
+
+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.LocalDate;
+
+/**
+ * 资产处置申请分页列表VO
+ */
+@Data
+@ApiModel(value = "资产处置申请分页列表VO")
+public class OaApprovalApplicationDisposePageVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "审批申请ID")
+    private Integer id;
+
+    @ApiModelProperty(value = "单据号")
+    private String applicationCode;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "申请人")
+    private String applicantName;
+
+    @ApiModelProperty(value = "处置日期")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private LocalDate disposeTime;
+
+    @ApiModelProperty(value = "处置方式 0-报废,1-报损,2-捐赠")
+    private Integer disposeType;
+
+    @ApiModelProperty(value = "处置方式名称")
+    private String disposeTypeName;
+
+    @ApiModelProperty(value = "处置金额")
+    private BigDecimal disposeTotalAmount;
+
+    @ApiModelProperty(value = "处置原因")
+    private String applicationReason;
+
+    @ApiModelProperty(value = "资产明细")
+    private String assetTypeDetail;
+
+    @ApiModelProperty(value = "审核状态 0-待审核,1-审核中,2-已通过,3-已拒绝")
+    private Integer approvalStatus;
+
+    @ApiModelProperty(value = "审核状态名称")
+    private String approvalStatusName;
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationDisposeMapper.xml b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationDisposeMapper.xml
index f854897..5beab85 100644
--- a/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationDisposeMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/OaApprovalApplicationDisposeMapper.xml
@@ -18,4 +18,51 @@
         id, approval_application_id, title, asset_type_id, dispose_time, dispose_type, dispose_total_amount
     </sql>
 
+    <!-- 分页查询资产处置申请列表 -->
+    <select id="getDisposePageList" resultType="com.ruoyi.system.vo.dispose.OaApprovalApplicationDisposePageVO">
+        SELECT 
+            app.id,
+            app.application_code AS applicationCode,
+            dispose.title,
+            u.nick_name AS applicantName,
+            dispose.dispose_time AS disposeTime,
+            dispose.dispose_type AS disposeType,
+            CASE dispose.dispose_type
+                WHEN 0 THEN '报废'
+                WHEN 1 THEN '报损'
+                WHEN 2 THEN '捐赠'
+                ELSE '未知'
+            END AS disposeTypeName,
+            dispose.dispose_total_amount AS disposeTotalAmount,
+            app.application_reason AS applicationReason,
+            CONCAT(
+                IFNULL(pt.type_name, ''),
+                CASE WHEN pt.type_name IS NOT NULL AND ct.type_name IS NOT NULL THEN '-' ELSE '' END,
+                IFNULL(ct.type_name, '')
+            ) AS assetTypeDetail,
+            app.approval_status AS approvalStatus,
+            CASE app.approval_status
+                WHEN 0 THEN '待审核'
+                WHEN 1 THEN '审核中'
+                WHEN 2 THEN '已通过'
+                WHEN 3 THEN '已拒绝'
+                ELSE '未知'
+            END AS approvalStatusName
+        FROM oa_approval_applications app
+        INNER JOIN oa_approval_application_dispose dispose ON app.id = dispose.approval_application_id
+        LEFT JOIN sys_user u ON app.applicant_user_id = u.user_id
+        LEFT JOIN asset_type ct ON dispose.asset_type_id = ct.id
+        LEFT JOIN asset_type pt ON ct.parent_id = pt.id
+        LEFT JOIN t_dept d ON app.dept_id = d.id
+        WHERE app.disabled = 0
+        <if test="query.keyword != null and query.keyword != ''">
+            AND (dispose.title LIKE CONCAT('%', #{query.keyword}, '%') 
+                 OR app.application_code LIKE CONCAT('%', #{query.keyword}, '%'))
+        </if>
+        <if test="query.deptId != null">
+            AND (d.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, d.ancestors))
+        </if>
+        ORDER BY app.create_time DESC
+    </select>
+
 </mapper>

--
Gitblit v1.7.1