From c3a11538b96aeac198fbaa467210ef8754773ad1 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期五, 24 十月 2025 18:14:06 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-system/src/main/resources/mapper/system/AssetAdMaterialSporadicSettlementMapper.xml                      |   25 +
 ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml                                              |   18 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdController.java                                  |   28 -
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementServiceImpl.java     |  212 +++++++++++
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdDTO.java                                          |    2 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialPriceDTO.java                             |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialSporadicSettlement.java                       |    7 
 ruoyi-system/src/main/java/com/ruoyi/system/utils/FastExcelUtil.java                                           |   63 +++
 ruoyi-system/src/main/java/com/ruoyi/system/utils/ExcelImportValid.java                                        |   33 +
 ruoyi-system/src/main/resources/mapper/system/AssetAdMaterialPriceMapper.xml                                   |   28 
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialIntegralSettlement.java                       |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetHouseInspectionItemController.java                 |   32 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/OssService.java                                            |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialSporadicSettlementController.java        |  103 +++++
 ruoyi-system/src/main/java/com/ruoyi/system/query/AssetMainPageQuery.java                                      |    3 
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialQuotation.java                                |    3 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetRepairRequestController.java                       |   31 +
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetAdMaterialSporadicSettlementVO.java                  |   37 +
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementInfoDTO.java            |   69 +++
 ruoyi-system/src/main/java/com/ruoyi/system/annotation/ExcelValid.java                                         |   14 
 ruoyi-system/src/main/java/com/ruoyi/system/export/AssetAdMaterialSporadicSettlementImport.java                |   71 +++
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementInfoServiceImpl.java |   16 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementImportDTO.java          |   29 +
 ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetAdMaterialSporadicSettlementMapper.java                |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/AddAssetRepairRequestDTO.java                                  |    4 
 ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetAdMaterialSporadicSettlementDetailVO.java            |   21 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialPriceController.java                     |   21 
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialQuotationController.java                 |    6 
 ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementDTO.java                |   43 ++
 ruoyi-system/src/main/java/com/ruoyi/system/service/AssetAdMaterialSporadicSettlementService.java              |   49 ++
 /dev/null                                                                                                      |   34 -
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OssServiceImpl.java                                   |   33 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/AssetAdMaterialSporadicSettlementInfoService.java          |    5 
 ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialSporadicSettlementInfo.java                   |   11 
 ruoyi-system/src/main/java/com/ruoyi/system/query/AssetAdMaterialSporadicSettlementQuery.java                  |   25 +
 35 files changed, 965 insertions(+), 125 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdController.java
index 0a860f6..9941ebd 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdController.java
@@ -1,7 +1,7 @@
 package com.ruoyi.web.controller.api;
 
 
-import cn.idev.excel.FastExcel;
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.domain.R;
@@ -12,9 +12,9 @@
 import com.ruoyi.system.query.AssetAdQuery;
 import com.ruoyi.system.service.AssetAdRentalRecordService;
 import com.ruoyi.system.service.AssetAdService;
+import com.ruoyi.system.utils.FastExcelUtil;
 import com.ruoyi.system.vo.asset.AssetAdDetailVO;
 import com.ruoyi.system.vo.asset.AssetAdVO;
-import com.ruoyi.web.controller.listener.AssetAdValidatorListener;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
@@ -36,9 +36,7 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
-import java.net.URLEncoder;
 import java.util.Collections;
-import java.util.List;
 
 /**
  * <p>
@@ -90,18 +88,7 @@
     @ApiOperation("下载导入模板")
     @GetMapping("/template")
     public void getTemplate(HttpServletResponse response){
-        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
-        response.setCharacterEncoding("utf-8");
-        String fileName = null;
-        try {
-            fileName = URLEncoder.encode("广告无形资产导入模板", "UTF-8").replaceAll("\\+", "%20");
-            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
-            FastExcel.write(response.getOutputStream(), AssetAdDTO.class)
-                    .sheet("广告无形资产")
-                    .doWrite(Collections.emptyList());
-        } catch (IOException e) {
-            log.error("下载导入模板异常", e);
-        }
+        FastExcelUtil.exportData(response, "广告无形资产导入模板", "广告无形资产", AssetAdDTO.class, Collections.emptyList());
     }
 
     @ApiOperation("导入")
@@ -112,14 +99,15 @@
             return R.fail("请选择一个文件上传!");
         }
         try {
-            List<AssetAdDTO> list = FastExcel.read(file.getInputStream(), AssetAdDTO.class, new AssetAdValidatorListener())
-                    .sheet()
-                    .doReadSync();
-            assetAdService.importAssetAd(list);
+            //List<AssetAdDTO> list = FastExcelUtil.readMultipartFile(file.getInputStream(), AssetAdDTO.class);
+            //assetAdService.importAssetAd(list);
+            ExcelImportUtil.importExcel(file.getInputStream(), AssetAdDTO.class, null);
             return R.ok();
         } catch (IOException e) {
             log.error("文件处理失败", e);
             return R.fail("文件处理失败!");
+        } catch (Exception e) {
+            throw new RuntimeException(e);
         }
     }
 
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialPriceController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialPriceController.java
index e5716e8..284bb88 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialPriceController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialPriceController.java
@@ -1,6 +1,5 @@
 package com.ruoyi.web.controller.api;
 
-import cn.idev.excel.FastExcel;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.domain.R;
@@ -8,6 +7,7 @@
 import com.ruoyi.system.dto.asset.AssetAdMaterialPriceDTO;
 import com.ruoyi.system.query.AssetAdMaterialPriceQuery;
 import com.ruoyi.system.service.AssetAdMaterialPriceService;
+import com.ruoyi.system.utils.FastExcelUtil;
 import com.ruoyi.system.vo.asset.AssetAdMaterialPriceVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -30,7 +30,6 @@
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
-import java.net.URLEncoder;
 import java.util.Collections;
 import java.util.List;
 
@@ -91,18 +90,7 @@
     @ApiOperation("下载导入模板")
     @GetMapping("/template")
     public void getTemplate(HttpServletResponse response){
-        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
-        response.setCharacterEncoding("utf-8");
-        String fileName = null;
-        try {
-            fileName = URLEncoder.encode("广告物料单价导入模板", "UTF-8").replaceAll("\\+", "%20");
-            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
-            FastExcel.write(response.getOutputStream(), AssetAdMaterialPriceDTO.class)
-                    .sheet("广告物料单价")
-                    .doWrite(Collections.emptyList());
-        } catch (IOException e) {
-            log.error("下载导入模板异常", e);
-        }
+        FastExcelUtil.exportData(response, "广告物料单价导入模板", "广告物料单价", AssetAdMaterialPriceDTO.class, Collections.emptyList());
     }
 
     @ApiOperation("导入")
@@ -113,10 +101,7 @@
             return R.fail("请选择一个文件上传!");
         }
         try {
-            List<AssetAdMaterialPriceDTO> list = FastExcel.read(file.getInputStream())
-                    .head(AssetAdMaterialPriceDTO.class)
-                    .sheet()
-                    .doReadSync();
+            List<AssetAdMaterialPriceDTO> list = FastExcelUtil.readMultipartFile(file.getInputStream(), AssetAdMaterialPriceDTO.class);
             assetAdMaterialPriceService.importAssetAdMaterialPrice(list);
             return R.ok();
         } catch (IOException e) {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialQuotationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialQuotationController.java
index e4fdd9d..05b1d49 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialQuotationController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialQuotationController.java
@@ -1,6 +1,9 @@
 package com.ruoyi.web.controller.api;
 
 
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
@@ -13,6 +16,9 @@
  * @author mitao
  * @since 2025-10-17
  */
+@Slf4j
+@Validated
+@Api(tags = {"广告物料报价表相关接口"})
 @RestController
 @RequestMapping("/asset-ad-material-quotation")
 public class AssetAdMaterialQuotationController {
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialSporadicSettlementController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialSporadicSettlementController.java
index ae6035f..b816333 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialSporadicSettlementController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetAdMaterialSporadicSettlementController.java
@@ -1,9 +1,41 @@
 package com.ruoyi.web.controller.api;
 
 
+import cn.afterturn.easypoi.excel.ExcelExportUtil;
+import cn.afterturn.easypoi.excel.entity.ExportParams;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.google.common.collect.Lists;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.system.dto.asset.AssetAdMaterialSporadicSettlementDTO;
+import com.ruoyi.system.dto.asset.AssetAdMaterialSporadicSettlementImportDTO;
+import com.ruoyi.system.export.AssetAdMaterialSporadicSettlementImport;
+import com.ruoyi.system.query.AssetAdMaterialSporadicSettlementQuery;
+import com.ruoyi.system.service.AssetAdMaterialSporadicSettlementService;
+import com.ruoyi.system.vo.asset.AssetAdMaterialSporadicSettlementDetailVO;
+import com.ruoyi.system.vo.asset.AssetAdMaterialSporadicSettlementVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.ss.usermodel.Workbook;
+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.GetMapping;
+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.RequestPart;
 import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.io.IOException;
+import java.net.URLEncoder;
 
 /**
  * <p>
@@ -13,8 +45,77 @@
  * @author mitao
  * @since 2025-10-17
  */
+@Slf4j
+@Validated
+@Api(tags = {"广告物料零星结算相关接口"})
 @RestController
 @RequestMapping("/asset-ad-material-sporadic-settlement")
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class AssetAdMaterialSporadicSettlementController {
 
+    private final AssetAdMaterialSporadicSettlementService assetAdMaterialSporadicSettlementService;
+
+    @ApiOperation("下载导入模板")
+    @GetMapping("/template")
+    public void downloadTemplate(HttpServletResponse response) {
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), AssetAdMaterialSporadicSettlementImport.class,
+                Lists.newArrayList(new AssetAdMaterialSporadicSettlementImport()));
+        ServletOutputStream outputStream = null;
+        try {
+            String fileName = URLEncoder.encode("广告物料零星结算导入模板.xls", "utf-8");
+            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
+            response.setHeader("content-Type", "application/vnd.ms-excel");
+            response.setHeader("Pragma", "no-cache");
+            response.setHeader("Cache-Control", "no-cache");
+            outputStream = response.getOutputStream();
+            workbook.write(outputStream);
+        } catch (IOException e) {
+            log.error("房屋巡检导入模板下载失败!", e);
+        } finally {
+            try {
+                outputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    @ApiOperation("导入零星资产结算数据")
+    @PostMapping("/import")
+    public R<?> importData(@RequestPart("file") MultipartFile file, @Valid AssetAdMaterialSporadicSettlementImportDTO dto) {
+        assetAdMaterialSporadicSettlementService.importData(file, dto);
+        return R.ok();
+    }
+
+    @ApiOperation("分页列表")
+    @PostMapping("/page")
+    public R<IPage<AssetAdMaterialSporadicSettlementVO>> getPageList(@RequestBody AssetAdMaterialSporadicSettlementQuery query){
+        return R.ok(assetAdMaterialSporadicSettlementService.getPageList(query));
+    }
+
+    @ApiOperation("新增")
+    @PostMapping("/add")
+    public R<Boolean> add(@Valid @RequestBody AssetAdMaterialSporadicSettlementDTO dto){
+        return R.ok(assetAdMaterialSporadicSettlementService.add(dto));
+    }
+
+    @ApiOperation("编辑")
+    @PostMapping("/edit")
+    public R<?> edit(@Valid @RequestBody AssetAdMaterialSporadicSettlementDTO dto){
+        assetAdMaterialSporadicSettlementService.edit(dto);
+        return R.ok();
+    }
+
+    @ApiOperation("删除")
+    @DeleteMapping("/{id}")
+    public R<?> deleteById(@ApiParam(name = "id", value = "主键") @PathVariable Integer id) {
+        assetAdMaterialSporadicSettlementService.deleteById(id);
+        return R.ok();
+    }
+
+    @ApiOperation("详情")
+    @GetMapping("/detail/{id}")
+    public R<AssetAdMaterialSporadicSettlementDetailVO> getDetail(@ApiParam(name = "id", value = "主键") @PathVariable Integer id) {
+        return R.ok(assetAdMaterialSporadicSettlementService.getDetail(id));
+    }
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetHouseInspectionItemController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetHouseInspectionItemController.java
index 2eea89d..35f9633 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetHouseInspectionItemController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/AssetHouseInspectionItemController.java
@@ -6,7 +6,6 @@
 import cn.afterturn.easypoi.excel.entity.ExportParams;
 import cn.afterturn.easypoi.excel.entity.ImportParams;
 import cn.hutool.json.JSONObject;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.basic.PageInfo;
@@ -19,27 +18,40 @@
 import com.ruoyi.common.utils.WebUtils;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.dto.AddAssetHouseInspection;
-import com.ruoyi.system.dto.AddAssetRepairRequestDTO;
 import com.ruoyi.system.export.AssetHouseInspectionImport;
-import com.ruoyi.system.model.*;
+import com.ruoyi.system.model.AssetHouseInspectionDetail;
+import com.ruoyi.system.model.AssetHouseInspectionItem;
+import com.ruoyi.system.model.AssetHouseInspectionRecord;
+import com.ruoyi.system.model.AssetMain;
+import com.ruoyi.system.model.AssetPropertyExt;
+import com.ruoyi.system.model.AssetType;
 import com.ruoyi.system.query.AssetHouseInspectionRecordListQuery;
-import com.ruoyi.system.query.AssetRepairRequestListQuery;
-import com.ruoyi.system.service.*;
+import com.ruoyi.system.service.AssetHouseInspectionDetailService;
+import com.ruoyi.system.service.AssetHouseInspectionItemService;
+import com.ruoyi.system.service.AssetHouseInspectionRecordService;
+import com.ruoyi.system.service.AssetMainService;
+import com.ruoyi.system.service.AssetPropertyExtService;
+import com.ruoyi.system.service.AssetTypeService;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.TDeptService;
 import com.ruoyi.system.vo.AssetHouseInspectionVO;
-import com.ruoyi.system.vo.AssetRepairRequestVO;
 import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.models.auth.In;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.usermodel.Workbook;
-import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RequestPart;
+import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.ServletOutputStream;
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 1b64135..f352ecf 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
@@ -6,37 +6,41 @@
 import com.ruoyi.common.basic.PageInfo;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.common.core.domain.entity.TDept;
-import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.enums.BusinessType;
 import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.system.dto.AddAssetRepairRequestDTO;
-import com.ruoyi.system.dto.AddContractDTO;
 import com.ruoyi.system.model.AssetMain;
 import com.ruoyi.system.model.AssetRepairRequest;
 import com.ruoyi.system.model.AssetRepairRequestItem;
+import com.ruoyi.system.model.AssetType;
 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.AssetRepairRequestItemService;
+import com.ruoyi.system.service.AssetRepairRequestService;
+import com.ruoyi.system.service.AssetTypeService;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.OaApprovalApplicationAssetItemService;
 import com.ruoyi.system.service.TDeptService;
 import com.ruoyi.system.vo.AssetRepairListVO;
 import com.ruoyi.system.vo.AssetRepairRequestVO;
-import com.ruoyi.system.vo.AssetStatisticsVO;
-import com.ruoyi.system.vo.GrabListVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.models.auth.In;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -68,6 +72,8 @@
     private ISysUserService sysUserService;
     @Resource
     private AssetMainService assetMainService;
+    @Autowired
+    private AssetTypeService assetTypeService;
 
     @ApiOperation("资产报修分页列表")
     @PostMapping("/pageList")
@@ -141,6 +147,11 @@
         AddAssetRepairRequestDTO res = new AddAssetRepairRequestDTO();
         AssetRepairRequest assetRepairRequest = assetRepairRequestService.getById(id);
         BeanUtils.copyProperties(assetRepairRequest, res);
+        //查询类型名称
+        AssetType assetType = assetTypeService.getById(assetRepairRequest.getAssetTypeId());
+        if (Objects.nonNull(assetType)) {
+            res.setAssetTypeName(assetType.getTypeName());
+        }
         List<AssetRepairListVO> items = assetRepairRequestItemService.listDetail(id);
         res.setListDetail(items);
         SysUser sysUser = sysUserService.selectUserById(Long.valueOf(assetRepairRequest.getReporterId()));
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/listener/AssetAdValidatorListener.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/listener/AssetAdValidatorListener.java
deleted file mode 100644
index 9aaecc6..0000000
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/listener/AssetAdValidatorListener.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.ruoyi.web.controller.listener;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.idev.excel.context.AnalysisContext;
-import cn.idev.excel.event.AnalysisEventListener;
-import com.ruoyi.common.exception.ServiceException;
-import com.ruoyi.common.utils.StringUtils;
-import com.ruoyi.system.dto.asset.AssetAdDTO;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author mitao
- * @date 2025/10/21
- */
-public class AssetAdValidatorListener extends AnalysisEventListener<AssetAdDTO> {
-    private List<String> errList = new ArrayList<>();
-    @Override
-    public void invoke(AssetAdDTO assetAdDTO, AnalysisContext analysisContext) {
-        Integer rowIndex = analysisContext.readRowHolder().getRowIndex();
-        rowIndex += 1;
-        if (StringUtils.isBlank(assetAdDTO.getAssetName())) {
-            errList.add(String.format("第%d行", rowIndex));
-        }
-    }
-
-    @Override
-    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
-        if (CollUtil.isNotEmpty(errList)) {
-            throw new ServiceException(String.format("%s,资产名称不能为空",String.join(",", errList)));
-        }
-    }
-}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/annotation/ExcelValid.java b/ruoyi-system/src/main/java/com/ruoyi/system/annotation/ExcelValid.java
new file mode 100644
index 0000000..b1b88e5
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/annotation/ExcelValid.java
@@ -0,0 +1,14 @@
+package com.ruoyi.system.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+/**
+* <p>Excel导入必填校验注解</p>
+*/
+@Target({ ElementType.FIELD, ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+public @interface ExcelValid {
+   String message() default "导入有未填入的字段";
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/AddAssetRepairRequestDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/AddAssetRepairRequestDTO.java
index 3c983c0..031d519 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/AddAssetRepairRequestDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/AddAssetRepairRequestDTO.java
@@ -3,12 +3,10 @@
 import com.ruoyi.system.model.AssetRepairRequest;
 import com.ruoyi.system.model.AssetRepairRequestItem;
 import com.ruoyi.system.vo.AssetRepairListVO;
-import com.ruoyi.system.vo.GrabListVO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.io.Serializable;
 import java.util.List;
 
 @Data
@@ -18,6 +16,8 @@
 
     @ApiModelProperty(value = "报修人")
     private String reporterName;
+    @ApiModelProperty(value = "报修资产类型名称")
+    private String assetTypeName;
     @ApiModelProperty(value = "新增使用报修资产列表")
     private List<AssetRepairRequestItem> list;
     @ApiModelProperty(value = "详情使用报修资产列表")
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdDTO.java
index e3ef974..4d952e6 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdDTO.java
@@ -3,6 +3,7 @@
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
 import cn.idev.excel.annotation.write.style.ColumnWidth;
+import com.ruoyi.system.annotation.ExcelValid;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -24,6 +25,7 @@
     @ApiModelProperty(value = "资产名称")
     @ExcelProperty("资产名称")
     @ColumnWidth(11)
+    @ExcelValid(message = "名称不能为空")
     @NotBlank(message = "资产名称")
     private String assetName;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialPriceDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialPriceDTO.java
index d707a51..6b6c811 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialPriceDTO.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialPriceDTO.java
@@ -3,6 +3,7 @@
 import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
 import cn.idev.excel.annotation.ExcelProperty;
 import cn.idev.excel.annotation.write.style.ColumnWidth;
+import com.ruoyi.system.annotation.ExcelValid;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -29,6 +30,7 @@
     @ApiModelProperty(value = "物料名称")
     @ExcelProperty("物料名称")
     @ColumnWidth(15)
+    @ExcelValid(message = "名称不能为空")
     @NotBlank(message = "物料名称不能为空")
     private String materialName;
 
@@ -36,12 +38,14 @@
     @ExcelProperty("单价")
     @ColumnWidth(10)
     @NotNull(message = "单价不能为空")
+    @ExcelValid(message = "单价不能为空")
     @DecimalMin(value = "0.01", message = "单价必须大于0")
     private BigDecimal unitPrice;
 
     @ApiModelProperty(value = "单位(元、平方米等)")
     @ExcelProperty("单位")
     @ColumnWidth(8)
+    @ExcelValid(message = "单位不能为空")
     @NotBlank(message = "单位不能为空")
     private String priceUnit;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementDTO.java
new file mode 100644
index 0000000..87cbca0
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementDTO.java
@@ -0,0 +1,43 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2025/10/22
+ */
+@Data
+@ApiModel("广告物料零星结算表数据传输对象")
+public class AssetAdMaterialSporadicSettlementDTO {
+
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @ApiModelProperty(value = "标题")
+    @NotBlank(message = "标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "结算项目")
+    @NotBlank(message = "结算项目不能为空")
+    private String settlementProject;
+
+    @ApiModelProperty(value = "结算单位")
+    @NotBlank(message = "结算单位不能为空")
+    private String settlementInstitution;
+
+    @ApiModelProperty(value = "合计金额")
+    @NotNull(message = "合计金额不能为空")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "明细列表")
+    @NotEmpty(message = "明细列表不能为空")
+    private List<AssetAdMaterialSporadicSettlementInfoDTO> infos;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementImportDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementImportDTO.java
new file mode 100644
index 0000000..1e5725b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementImportDTO.java
@@ -0,0 +1,29 @@
+package com.ruoyi.system.dto.asset;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author mitao
+ * @date 2025/10/22
+ */
+@Data
+@ApiModel("广告物料零星结算表导入数据传输对象")
+public class AssetAdMaterialSporadicSettlementImportDTO {
+
+    @ApiModelProperty(value = "标题")
+    @NotBlank(message = "标题不能为空")
+    private String title;
+
+    @ApiModelProperty(value = "结算项目")
+    @NotBlank(message = "结算项目不能为空")
+    private String settlementProject;
+
+    @ApiModelProperty(value = "结算单位")
+    @NotBlank(message = "结算单位不能为空")
+    private String settlementInstitution;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementInfoDTO.java b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementInfoDTO.java
new file mode 100644
index 0000000..e74915b
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/dto/asset/AssetAdMaterialSporadicSettlementInfoDTO.java
@@ -0,0 +1,69 @@
+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.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 广告物料零星结算表关联表
+ * </p>
+ *
+ * @author mitao
+ * @since 2025-10-17
+ */
+@Data
+@ApiModel(value="广告物料零星结算表明细数据传输对象")
+public class AssetAdMaterialSporadicSettlementInfoDTO {
+
+    @ApiModelProperty(value = "日期")
+    @DateTimeFormat(pattern = "yyyy-MM-dd")
+    private LocalDate settlementDate;
+
+    @ApiModelProperty(value = "安装地点")
+    private String address;
+
+    @ApiModelProperty(value = "名称")
+    @NotBlank(message = "名称不能为空")
+    private String adName;
+
+    @ApiModelProperty(value = "材质工艺")
+    private String material;
+
+    @ApiModelProperty(value = "设计图例")
+    private String designLegend;
+
+    @ApiModelProperty(value = "安装图例")
+    private String installationLegend;
+
+    @ApiModelProperty(value = "长(米)")
+    private Double length;
+
+    @ApiModelProperty(value = "高(米)")
+    private Double height;
+
+    @ApiModelProperty(value = "数量")
+    @NotNull(message = "数量不能为空")
+    private Integer quantity;
+
+    @ApiModelProperty(value = "小计")
+    private String subtotal;
+
+    @ApiModelProperty(value = "单价(元)")
+    @NotNull(message = "单价不能为空")
+    private BigDecimal unitPrice;
+
+    @ApiModelProperty(value = "金额(元)")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/export/AssetAdMaterialSporadicSettlementImport.java b/ruoyi-system/src/main/java/com/ruoyi/system/export/AssetAdMaterialSporadicSettlementImport.java
new file mode 100644
index 0000000..351a8b2
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/export/AssetAdMaterialSporadicSettlementImport.java
@@ -0,0 +1,71 @@
+package com.ruoyi.system.export;
+
+import cn.afterturn.easypoi.excel.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+/**
+ * <p>
+ * 广告物料零星结算表关联表
+ * </p>
+ *
+ * @author mitao
+ * @since 2025-10-17
+ */
+@Data
+@ApiModel(value="AssetAdMaterialSporadicSettlementInfo对象", description="广告物料零星结算表关联表")
+public class AssetAdMaterialSporadicSettlementImport {
+
+    @Excel(name = "日期", width = 20)
+    private LocalDate settlementDate;
+
+    @Excel(name = "安装地点", width = 20)
+    private String address;
+
+    @Excel(name = "名称", width = 20)
+    private String adName;
+
+    @Excel(name = "材质工艺", width = 20)
+    private String material;
+
+    /**
+     * 设计图例oss地址
+     */
+    private String designLegend;
+
+    @Excel(name = "设计图例",type = 2, width = 20)
+    private String designLegendTemp;
+
+    /**
+     * 安装图例oss地址
+     */
+    private String installationLegend;
+
+    @Excel(name = "安装图例",type = 2, width = 20)
+    private String installationLegendTemp;
+
+    @Excel(name = "长(米)", width = 20)
+    private Double length;
+
+    @Excel(name = "高(米)", width = 20)
+    private Double height;
+
+    @Excel(name = "数量", width = 20)
+    private Integer quantity;
+
+    @Excel(name = "小计", width = 20)
+    private String subtotal;
+
+    @Excel(name = "单价(元)", width = 20)
+    private BigDecimal unitPrice;
+
+    @Excel(name = "金额(元)", width = 20)
+    private BigDecimal amount;
+
+    @Excel(name = "备注", width = 20)
+    private String remark;
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetAdMaterialSporadicSettlementMapper.java b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetAdMaterialSporadicSettlementMapper.java
index f55c563..c7e3278 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetAdMaterialSporadicSettlementMapper.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/mapper/AssetAdMaterialSporadicSettlementMapper.java
@@ -1,7 +1,10 @@
 package com.ruoyi.system.mapper;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ruoyi.system.model.AssetAdMaterialSporadicSettlement;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.system.query.AssetAdMaterialSporadicSettlementQuery;
+import com.ruoyi.system.vo.asset.AssetAdMaterialSporadicSettlementVO;
 
 /**
  * <p>
@@ -13,4 +16,5 @@
  */
 public interface AssetAdMaterialSporadicSettlementMapper extends BaseMapper<AssetAdMaterialSporadicSettlement> {
 
+    IPage<AssetAdMaterialSporadicSettlementVO> getPageList(AssetAdMaterialSporadicSettlementQuery query);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialIntegralSettlement.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialIntegralSettlement.java
index 7fe32ff..c542705 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialIntegralSettlement.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialIntegralSettlement.java
@@ -35,6 +35,9 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
+    @ApiModelProperty(value = "所属部门ID")
+    private Integer deptId;
+
     @ApiModelProperty(value = "标题")
     private String title;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialQuotation.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialQuotation.java
index 196e85d..0847f74 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialQuotation.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialQuotation.java
@@ -34,6 +34,9 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
+    @ApiModelProperty(value = "所属部门ID")
+    private Integer deptId;
+
     @ApiModelProperty(value = "标题")
     private String title;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialSporadicSettlement.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialSporadicSettlement.java
index c3829ab..b646b03 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialSporadicSettlement.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialSporadicSettlement.java
@@ -11,6 +11,7 @@
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 
 /**
@@ -34,6 +35,9 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Integer id;
 
+    @ApiModelProperty(value = "所属部门ID")
+    private Integer deptId;
+
     @ApiModelProperty(value = "标题")
     private String title;
 
@@ -43,6 +47,9 @@
     @ApiModelProperty(value = "结算单位")
     private String settlementInstitution;
 
+    @ApiModelProperty(value = "合计金额")
+    private BigDecimal totalAmount;
+
     @ApiModelProperty(value = "创建时间")
     private LocalDateTime createTime;
 
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialSporadicSettlementInfo.java b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialSporadicSettlementInfo.java
index fcf2dcd..d08e75b 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialSporadicSettlementInfo.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/model/AssetAdMaterialSporadicSettlementInfo.java
@@ -1,16 +1,17 @@
 package com.ruoyi.system.model;
 
-import java.math.BigDecimal;
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
-import java.time.LocalDate;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.io.Serializable;
+import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
 
 /**
  * <p>
@@ -70,7 +71,7 @@
     private BigDecimal unitPrice;
 
     @ApiModelProperty(value = "金额(元)")
-    private BigDecimal totalAmount;
+    private BigDecimal amount;
 
     @ApiModelProperty(value = "备注")
     private String remark;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetAdMaterialSporadicSettlementQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetAdMaterialSporadicSettlementQuery.java
new file mode 100644
index 0000000..1fb19ad
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/AssetAdMaterialSporadicSettlementQuery.java
@@ -0,0 +1,25 @@
+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;
+
+/**
+ * @author mitao
+ * @date 2025/10/23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("广告物料零星结算查询对象")
+public class AssetAdMaterialSporadicSettlementQuery extends BasePage {
+
+    private static final long serialVersionUID = 5372773098625060538L;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty("部门ID(非管理员时作为数据权限过滤),前端不传")
+    private Integer deptId;
+}
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 ada367e..0d8a410 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
@@ -27,6 +27,9 @@
     @ApiModelProperty("关键字(资产名称/资产编码)")
     private String keyword;
 
+    @ApiModelProperty("使用部门")
+    private String useDeptOrLocation;
+
     @ApiModelProperty("所属部门ID,前端不传")
     private Integer deptId;
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetAdMaterialSporadicSettlementInfoService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetAdMaterialSporadicSettlementInfoService.java
index 390baf7..1c325e2 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetAdMaterialSporadicSettlementInfoService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetAdMaterialSporadicSettlementInfoService.java
@@ -3,6 +3,8 @@
 import com.ruoyi.system.model.AssetAdMaterialSporadicSettlementInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import java.util.List;
+
 /**
  * <p>
  * 广告物料零星结算表关联表 服务类
@@ -13,4 +15,7 @@
  */
 public interface AssetAdMaterialSporadicSettlementInfoService extends IService<AssetAdMaterialSporadicSettlementInfo> {
 
+    void removeBySettlementId(Integer id);
+
+    List<AssetAdMaterialSporadicSettlementInfo> getBySettlementId(Integer id);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetAdMaterialSporadicSettlementService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetAdMaterialSporadicSettlementService.java
index 8008405..3c9aeed 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetAdMaterialSporadicSettlementService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/AssetAdMaterialSporadicSettlementService.java
@@ -1,7 +1,14 @@
 package com.ruoyi.system.service;
 
-import com.ruoyi.system.model.AssetAdMaterialSporadicSettlement;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.system.dto.asset.AssetAdMaterialSporadicSettlementDTO;
+import com.ruoyi.system.dto.asset.AssetAdMaterialSporadicSettlementImportDTO;
+import com.ruoyi.system.model.AssetAdMaterialSporadicSettlement;
+import com.ruoyi.system.query.AssetAdMaterialSporadicSettlementQuery;
+import com.ruoyi.system.vo.asset.AssetAdMaterialSporadicSettlementDetailVO;
+import com.ruoyi.system.vo.asset.AssetAdMaterialSporadicSettlementVO;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * <p>
@@ -12,5 +19,45 @@
  * @since 2025-10-17
  */
 public interface AssetAdMaterialSporadicSettlementService extends IService<AssetAdMaterialSporadicSettlement> {
+    /**
+     * 导入
+     * @param file
+     * @param dto
+     */
+    void importData(MultipartFile file, AssetAdMaterialSporadicSettlementImportDTO dto);
 
+    /**
+     * 分页列表查询
+     * @param query
+     * @return
+     */
+    IPage<AssetAdMaterialSporadicSettlementVO> getPageList(AssetAdMaterialSporadicSettlementQuery query);
+
+    /**
+     * 新增
+     *
+     * @param dto
+     * @return
+     */
+    Boolean add(AssetAdMaterialSporadicSettlementDTO dto);
+
+    /**
+     * 编辑
+     * @param dto
+     */
+    Boolean edit(AssetAdMaterialSporadicSettlementDTO dto);
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    Boolean deleteById(Integer id);
+
+    /**
+     * 详情
+     *
+     * @return
+     */
+    AssetAdMaterialSporadicSettlementDetailVO getDetail(Integer id);
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/OssService.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/OssService.java
index 2b6d049..df07888 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/OssService.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/OssService.java
@@ -3,6 +3,7 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.io.InputStream;
 
 /**
  * @author mitao
@@ -25,4 +26,6 @@
      * @return
      */
     String upload(String storagePath, MultipartFile file) throws IOException;
+
+    String uploadByInputStream(InputStream inputStream);
 }
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementInfoServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementInfoServiceImpl.java
index 2690a4f..77b0974 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementInfoServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementInfoServiceImpl.java
@@ -1,10 +1,12 @@
 package com.ruoyi.system.service.impl;
 
-import com.ruoyi.system.model.AssetAdMaterialSporadicSettlementInfo;
-import com.ruoyi.system.mapper.AssetAdMaterialSporadicSettlementInfoMapper;
-import com.ruoyi.system.service.AssetAdMaterialSporadicSettlementInfoService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.system.mapper.AssetAdMaterialSporadicSettlementInfoMapper;
+import com.ruoyi.system.model.AssetAdMaterialSporadicSettlementInfo;
+import com.ruoyi.system.service.AssetAdMaterialSporadicSettlementInfoService;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * <p>
@@ -16,5 +18,13 @@
  */
 @Service
 public class AssetAdMaterialSporadicSettlementInfoServiceImpl extends ServiceImpl<AssetAdMaterialSporadicSettlementInfoMapper, AssetAdMaterialSporadicSettlementInfo> implements AssetAdMaterialSporadicSettlementInfoService {
+    @Override
+    public void removeBySettlementId(Integer id) {
+        lambdaUpdate().eq(AssetAdMaterialSporadicSettlementInfo::getAdMaterialSporadicSettlementId, id).remove();
+    }
 
+    @Override
+    public List<AssetAdMaterialSporadicSettlementInfo> getBySettlementId(Integer id) {
+        return lambdaQuery().eq(AssetAdMaterialSporadicSettlementInfo::getAdMaterialSporadicSettlementId, id).list();
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementServiceImpl.java
index 5936b4a..211858c 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/AssetAdMaterialSporadicSettlementServiceImpl.java
@@ -1,10 +1,43 @@
 package com.ruoyi.system.service.impl;
 
-import com.ruoyi.system.model.AssetAdMaterialSporadicSettlement;
-import com.ruoyi.system.mapper.AssetAdMaterialSporadicSettlementMapper;
-import com.ruoyi.system.service.AssetAdMaterialSporadicSettlementService;
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
+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.core.exception.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.system.constants.AssetDeptConstant;
+import com.ruoyi.system.dto.asset.AssetAdMaterialSporadicSettlementDTO;
+import com.ruoyi.system.dto.asset.AssetAdMaterialSporadicSettlementImportDTO;
+import com.ruoyi.system.export.AssetAdMaterialSporadicSettlementImport;
+import com.ruoyi.system.mapper.AssetAdMaterialSporadicSettlementMapper;
+import com.ruoyi.system.model.AssetAdMaterialSporadicSettlement;
+import com.ruoyi.system.model.AssetAdMaterialSporadicSettlementInfo;
+import com.ruoyi.system.query.AssetAdMaterialSporadicSettlementQuery;
+import com.ruoyi.system.service.AssetAdMaterialSporadicSettlementInfoService;
+import com.ruoyi.system.service.AssetAdMaterialSporadicSettlementService;
+import com.ruoyi.system.service.ISysUserService;
+import com.ruoyi.system.service.OssService;
+import com.ruoyi.system.vo.asset.AssetAdMaterialSporadicSettlementDetailVO;
+import com.ruoyi.system.vo.asset.AssetAdMaterialSporadicSettlementVO;
+import lombok.Cleanup;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
 
 /**
  * <p>
@@ -15,6 +48,179 @@
  * @since 2025-10-17
  */
 @Service
+@RequiredArgsConstructor(onConstructor_ = {@Lazy})
 public class AssetAdMaterialSporadicSettlementServiceImpl extends ServiceImpl<AssetAdMaterialSporadicSettlementMapper, AssetAdMaterialSporadicSettlement> implements AssetAdMaterialSporadicSettlementService {
+    private final OssService ossService;
+    private final AssetAdMaterialSporadicSettlementInfoService assetAdMaterialSporadicSettlementInfoService;
+    private final ISysUserService sysUserService;
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void importData(MultipartFile file, AssetAdMaterialSporadicSettlementImportDTO dto) {
+        try {
+            ImportParams importParams = new ImportParams();
+            importParams.setTitleRows(0);
+            importParams.setHeadRows(1);
+            @Cleanup
+            InputStream inputStream = file.getInputStream();
+            List<AssetAdMaterialSporadicSettlementImport> list = ExcelImportUtil.importExcel(inputStream, AssetAdMaterialSporadicSettlementImport.class, importParams);
+            validateFields(list);
+            uploadToOss(list);
+            //保存
+            AssetAdMaterialSporadicSettlement assetAdMaterialSporadicSettlement = BeanUtil.copyProperties(dto, AssetAdMaterialSporadicSettlement.class);
+            assetAdMaterialSporadicSettlement.setTotalAmount(calculateTotalAmount(list));
+            assetAdMaterialSporadicSettlement.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
+            assetAdMaterialSporadicSettlement.setDeptId(Integer.parseInt(SecurityUtils.getLoginUser().getUser().getDeptId()));
+            save(assetAdMaterialSporadicSettlement);
+            //保存明细
+            List<AssetAdMaterialSporadicSettlementInfo> assetAdMaterialSporadicSettlementInfos = BeanUtil.copyToList(list, AssetAdMaterialSporadicSettlementInfo.class);
+            assetAdMaterialSporadicSettlementInfos.forEach(item -> item.setAdMaterialSporadicSettlementId(assetAdMaterialSporadicSettlement.getId()));
+            assetAdMaterialSporadicSettlementInfoService.saveBatch(assetAdMaterialSporadicSettlementInfos);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private BigDecimal calculateTotalAmount(List<AssetAdMaterialSporadicSettlementImport> list) {
+        return list.stream().map(item -> BigDecimal.valueOf(item.getQuantity())
+                        .multiply(item.getUnitPrice()).setScale(2, RoundingMode.HALF_UP))
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    private void validateFields(List<AssetAdMaterialSporadicSettlementImport> list) {
+        Optional<AssetAdMaterialSporadicSettlementImport> any = list.stream()
+                .filter(item -> StringUtils.isBlank(item.getAdName())).findAny();
+        if (any.isPresent()) {
+            throw new ServiceException("【名称】不能为空,请检查该列是否填写完整");
+        }
+        Optional<AssetAdMaterialSporadicSettlementImport> quantityOpt = list.stream()
+                .filter(item -> Objects.isNull(item.getQuantity())).findAny();
+        if (quantityOpt.isPresent()) {
+            throw new ServiceException("【数量】不能为空,请检查该列是否填写完整");
+        }
+        Optional<AssetAdMaterialSporadicSettlementImport> priceOpt = list.stream()
+                .filter(item -> Objects.isNull(item.getUnitPrice())).findAny();
+        if (priceOpt.isPresent()) {
+            throw new ServiceException("【单价】不能为空,请检查该列是否填写完整");
+        }
+    }
+    /**
+     * 文件转存
+     * @param list
+     */
+    private void uploadToOss(List<AssetAdMaterialSporadicSettlementImport> list) {
+        //遍历每一条数据
+        for (AssetAdMaterialSporadicSettlementImport settlementImport : list) {
+            if (StringUtils.isNotEmpty(settlementImport.getDesignLegendTemp())) {
+                String ossUrl = getOssUrl(settlementImport.getDesignLegendTemp());
+                settlementImport.setDesignLegend(ossUrl);
+            }
+            if (StringUtils.isNotEmpty(settlementImport.getInstallationLegendTemp())) {
+                String ossUrl = getOssUrl(settlementImport.getInstallationLegendTemp());
+                settlementImport.setInstallationLegend(ossUrl);
+            }
+        }
+        //删除图片缓存
+        for (AssetAdMaterialSporadicSettlementImport settlementImport : list) {
+            if (StringUtils.isNotEmpty(settlementImport.getDesignLegendTemp())) {
+                deleteImageCache(settlementImport.getDesignLegendTemp());
+            }
+            if (StringUtils.isNotEmpty(settlementImport.getInstallationLegendTemp())) {
+                deleteImageCache(settlementImport.getInstallationLegendTemp());
+            }
+        }
+    }
+
+    private String getOssUrl(String filePath) {
+        try {
+            //获取到暂存的文件
+            File tmpFile = new File(filePath);
+            FileInputStream fileInputStream = new FileInputStream(tmpFile);
+            //转换为 multipartFile 类
+            return ossService.uploadByInputStream(fileInputStream);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+    private void deleteImageCache(String filePath) {
+        //获取到暂存的文件
+        File tmpFile = new File(filePath);
+        if (tmpFile.exists() && tmpFile.isFile()) {
+            tmpFile.delete();
+        }
+    }
+
+    @Override
+    public IPage<AssetAdMaterialSporadicSettlementVO> getPageList(AssetAdMaterialSporadicSettlementQuery query) {
+        // 数据权限:超级管理员/资产管理部查看所有数据,其他部门查看当前及下级部门的数据
+        Long userId = SecurityUtils.getUserId();
+        boolean isAdmin = SecurityUtils.isAdmin(userId);
+
+        if (!isAdmin) {
+            try {
+                // 获取当前用户的部门名称
+                String deptName = sysUserService.selectUserById(userId).getDeptName();
+
+                // 非超级管理员且非资产管理部,设置部门权限
+                if (!AssetDeptConstant.ASSET_INVENTORY_DEPT_NAMES.contains(deptName)) {
+                    query.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                }
+            } catch (Exception e) {
+                // 如果获取部门信息失败,默认设置部门权限
+                try {
+                    query.setDeptId(Integer.valueOf(SecurityUtils.getLoginUser().getDeptId()));
+                } catch (Exception ex) {
+                    // ignore parse, leave null if cannot parse
+                }
+            }
+        }
+        // 直接使用Mapper的分页查询方法
+        Page<AssetAdMaterialSporadicSettlementVO> page = new Page<>(query.getPageNum(), query.getPageSize());
+        return baseMapper.getPageList(query);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean add(AssetAdMaterialSporadicSettlementDTO dto) {
+        AssetAdMaterialSporadicSettlement assetAdMaterialSporadicSettlement = BeanUtil.copyProperties(dto, AssetAdMaterialSporadicSettlement.class);
+        assetAdMaterialSporadicSettlement.setCreateBy(SecurityUtils.getLoginUser().getUser().getNickName());
+        assetAdMaterialSporadicSettlement.setDeptId(Integer.parseInt(SecurityUtils.getLoginUser().getUser().getDeptId()));
+        save(assetAdMaterialSporadicSettlement);
+        //保存明细
+        List<AssetAdMaterialSporadicSettlementInfo> assetAdMaterialSporadicSettlementInfos = BeanUtil.copyToList(dto.getInfos(), AssetAdMaterialSporadicSettlementInfo.class);
+        assetAdMaterialSporadicSettlementInfos.forEach(item -> item.setAdMaterialSporadicSettlementId(assetAdMaterialSporadicSettlement.getId()));
+      return assetAdMaterialSporadicSettlementInfoService.saveBatch(assetAdMaterialSporadicSettlementInfos);
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean edit(AssetAdMaterialSporadicSettlementDTO dto) {
+        if (Objects.isNull(dto.getId())) {
+            throw new ServiceException("ID不能为空");
+        }
+        AssetAdMaterialSporadicSettlement assetAdMaterialSporadicSettlement = BeanUtil.copyProperties(dto, AssetAdMaterialSporadicSettlement.class);
+        updateById(assetAdMaterialSporadicSettlement);
+        //删除原有明细
+        assetAdMaterialSporadicSettlementInfoService.removeBySettlementId(dto.getId());
+        //保存明细
+        List<AssetAdMaterialSporadicSettlementInfo> assetAdMaterialSporadicSettlementInfos = BeanUtil.copyToList(dto.getInfos(), AssetAdMaterialSporadicSettlementInfo.class);
+        assetAdMaterialSporadicSettlementInfos.forEach(item -> item.setAdMaterialSporadicSettlementId(assetAdMaterialSporadicSettlement.getId()));
+       return assetAdMaterialSporadicSettlementInfoService.saveBatch(assetAdMaterialSporadicSettlementInfos);
+    }
+
+    @Override
+    public Boolean deleteById(Integer id) {
+        //删除明细
+        assetAdMaterialSporadicSettlementInfoService.removeBySettlementId(id);
+        return removeById(id);
+    }
+
+    @Override
+    public AssetAdMaterialSporadicSettlementDetailVO getDetail(Integer id) {
+        AssetAdMaterialSporadicSettlement assetAdMaterialSporadicSettlement = getById(id);
+        AssetAdMaterialSporadicSettlementDetailVO vo = BeanUtil.copyProperties(assetAdMaterialSporadicSettlement, AssetAdMaterialSporadicSettlementDetailVO.class);
+        vo.setInfos(assetAdMaterialSporadicSettlementInfoService.getBySettlementId(id));
+        return vo;
+    }
 }
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OssServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OssServiceImpl.java
index 3bb8466..0ca8128 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OssServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/OssServiceImpl.java
@@ -93,7 +93,38 @@
             ossClient.shutdown();
         }
     }
-    
+
+    @Override
+    public String uploadByInputStream(InputStream inputStream) {
+        OSS ossClient = null;
+        try {
+            CredentialsProvider credentialsProvider = new DefaultCredentialProvider(OssConfig.ACCESS_KEY_ID, OssConfig.ACCESS_KEY_SECRET);
+            String region = "cn-chengdu";
+            // 创建OSSClient实例。
+            ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();
+            clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);
+            ossClient = OSSClientBuilder.create()
+                    .endpoint(OssConfig.UPLOAD_ENDPOINT)
+                    .credentialsProvider(credentialsProvider)
+                    .clientConfiguration(clientBuilderConfiguration)
+                    .region(region)
+                    .build();
+
+            String fileExt = "png";
+            String fileName = UUID.randomUUID().toString();
+            // 设置文件名
+            String filePathName = generateRelativeStoragePath(OssConfig.FOLDER, fileExt, fileName);
+            // 创建PutObjectRequest对象。
+            PutObjectRequest putObjectRequest = new PutObjectRequest(OssConfig.BUCKET_NAME, filePathName, inputStream);
+            // 创建PutObject请求。
+            PutObjectResult result = ossClient.putObject(putObjectRequest);
+
+            return OssConfig.DOWNLOAD_ENDPOINT + filePathName;
+        } finally {
+            ossClient.shutdown();
+        }
+    }
+
     /**
      * <pre>
      * 获取存储的相对路径
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/ExcelImportValid.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/ExcelImportValid.java
new file mode 100644
index 0000000..9a1a4bc
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/ExcelImportValid.java
@@ -0,0 +1,33 @@
+package com.ruoyi.system.utils;
+
+import com.ruoyi.common.exception.ServiceException;
+import com.ruoyi.system.annotation.ExcelValid;
+
+import java.lang.reflect.Field;
+import java.util.Objects;
+public class ExcelImportValid {
+    /**
+     * Excel导入字段非空校验
+     *
+     * @param object 校验的JavaBean 其属性须有自定义注解
+     */
+    public static void valid(Object object) throws Exception {
+        Field[] fields = object.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            // 设置可访问
+            field.setAccessible(true);
+            // 属性的值
+            Object fieldValue = null;
+            try {
+                fieldValue = field.get(object);
+            } catch (IllegalAccessException e) {
+                throw new ServiceException("导入参数检查失败!");
+            }
+            // 是否包含必填校验注解
+            boolean isRequiredValid = field.isAnnotationPresent(ExcelValid.class);
+            if (isRequiredValid && Objects.isNull(fieldValue)) {
+                throw new ServiceException(field.getAnnotation(ExcelValid.class).message());
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/utils/FastExcelUtil.java b/ruoyi-system/src/main/java/com/ruoyi/system/utils/FastExcelUtil.java
new file mode 100644
index 0000000..52a8f23
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/utils/FastExcelUtil.java
@@ -0,0 +1,63 @@
+package com.ruoyi.system.utils;
+
+import cn.idev.excel.FastExcel;
+import cn.idev.excel.context.AnalysisContext;
+import cn.idev.excel.event.AnalysisEventListener;
+import com.ruoyi.common.exception.ServiceException;
+import lombok.extern.slf4j.Slf4j;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URLEncoder;
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2025/10/22
+ */
+@Slf4j
+public class FastExcelUtil {
+    public static <T> void exportData(HttpServletResponse response, String fileName, String sheetName, Class<T> clazz, List<T> data) {
+        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
+        response.setCharacterEncoding("utf-8");
+        try {
+            fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
+            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
+            FastExcel.write(response.getOutputStream(), clazz)
+                    .sheet(sheetName)
+                    .doWrite(data);
+        } catch (IOException e) {
+            log.error("导出数据异常", e);
+            throw new ServiceException("导出数据异常");
+        }
+    }
+    /**
+     * 读取文件数据,并返回一个包含指定类型数据的列表。
+     *
+     * @param inputStream 文件对象输入流
+     * @param clazz       数据对象的类型
+     * @param <T>         泛型类型,表示数据对象的类型
+     * @return 包含解析后数据对象的列表
+     */
+    public static <T> List<T> readMultipartFile(InputStream inputStream, Class<T> clazz) {
+        return FastExcel.read(inputStream, clazz, new AnalysisEventListener<T>() {
+            @Override
+            public void invoke(Object o, AnalysisContext analysisContext) {
+                Integer rowIndex = analysisContext.readRowHolder().getRowIndex();
+                rowIndex += 1; // 行号从0开始,需要加1
+                try {
+                    // 调用字段校验方法
+                    ExcelImportValid.valid(o);
+                } catch (Exception e) {
+                    throw new ServiceException(String.format("第%d行:%s", rowIndex, e.getMessage()));
+                }
+            }
+
+            @Override
+            public void doAfterAllAnalysed(AnalysisContext analysisContext) {
+
+            }
+        }).sheet().doReadSync(); // 读取 Excel 文件中的第一个工作表
+    }
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetAdMaterialSporadicSettlementDetailVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetAdMaterialSporadicSettlementDetailVO.java
new file mode 100644
index 0000000..20dfc9d
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetAdMaterialSporadicSettlementDetailVO.java
@@ -0,0 +1,21 @@
+package com.ruoyi.system.vo.asset;
+
+import com.ruoyi.system.model.AssetAdMaterialSporadicSettlementInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * @author mitao
+ * @date 2025/10/23
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("广告物料零星结算详情视图对象")
+public class AssetAdMaterialSporadicSettlementDetailVO extends AssetAdMaterialSporadicSettlementVO {
+    @ApiModelProperty("明细列表")
+    private List<AssetAdMaterialSporadicSettlementInfo> infos;
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetAdMaterialSporadicSettlementVO.java b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetAdMaterialSporadicSettlementVO.java
new file mode 100644
index 0000000..9c30ceb
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/vo/asset/AssetAdMaterialSporadicSettlementVO.java
@@ -0,0 +1,37 @@
+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.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author mitao
+ * @date 2025/10/23
+ */
+@Data
+@ApiModel("广告物料零星结算视图对象")
+public class AssetAdMaterialSporadicSettlementVO {
+    @ApiModelProperty(value = "主键")
+    private Integer id;
+
+    @ApiModelProperty(value = "标题")
+    private String title;
+
+    @ApiModelProperty(value = "结算项目")
+    private String settlementProject;
+
+    @ApiModelProperty(value = "结算单位")
+    private String settlementInstitution;
+
+    @ApiModelProperty("合计金额")
+    private BigDecimal totalAmount;
+
+    @ApiModelProperty(value = "创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime createTime;
+
+}
diff --git a/ruoyi-system/src/main/resources/mapper/system/AssetAdMaterialPriceMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AssetAdMaterialPriceMapper.xml
index 77fd44e..c43434e 100644
--- a/ruoyi-system/src/main/resources/mapper/system/AssetAdMaterialPriceMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/AssetAdMaterialPriceMapper.xml
@@ -24,27 +24,27 @@
     <!-- 分页查询 -->
     <select id="getPageList" resultType="com.ruoyi.system.vo.asset.AssetAdMaterialPriceVO">
         SELECT
-            id,
-            material_name,
-            dept_id,
-            unit_price,
-            price_unit,
-            remarks,
-            create_time,
-            create_by,
-            update_time,
-            update_by
+            aamp.id,
+            aamp.material_name,
+            aamp.dept_id,
+            aamp.unit_price,
+            aamp.price_unit,
+            aamp.remarks,
+            aamp.create_time,
+            aamp.create_by,
+            aamp.update_time,
+            aamp.update_by
         FROM asset_ad_material_price aamp LEFT JOIN t_dept td ON aamp.dept_id = td.id
         <where>
-            disabled = 0
+            aamp.disabled = 0
             <if test="query.materialName != null and query.materialName != ''">
-                AND material_name LIKE CONCAT('%', #{query.materialName}, '%')
+                AND aamp.material_name LIKE CONCAT('%', #{query.materialName}, '%')
             </if>
             <if test="query.deptId != null">
-                AND (td.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, od.parent_id))
+                AND (td.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, td.parent_id))
             </if>
         </where>
-        ORDER BY create_time DESC
+        ORDER BY aamp.create_time DESC
     </select>
 
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/AssetAdMaterialSporadicSettlementMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AssetAdMaterialSporadicSettlementMapper.xml
index f962437..bb5f674 100644
--- a/ruoyi-system/src/main/resources/mapper/system/AssetAdMaterialSporadicSettlementMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/AssetAdMaterialSporadicSettlementMapper.xml
@@ -2,4 +2,29 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.system.mapper.AssetAdMaterialSporadicSettlementMapper">
 
+    <select id="getPageList" resultType="com.ruoyi.system.vo.asset.AssetAdMaterialSporadicSettlementVO"
+            parameterType="com.ruoyi.system.query.AssetAdMaterialSporadicSettlementQuery">
+        SELECT aamss.id,
+              aamss.dept_id,
+              aamss.title,
+              aamss.settlement_project,
+              aamss.settlement_institution,
+              aamss.total_amount,
+              aamss.create_time,
+              aamss.create_by,
+              aamss.update_time,
+              aamss.update_by,
+              aamss.disabled
+        FROM asset_ad_material_sporadic_settlement aamss LEFT JOIN t_dept td ON aamss.dept_id = td.id
+        <where>
+            aamss.disabled = 0
+            <if test="query.title != null and query.title != ''">
+                AND aamss.title LIKE CONCAT('%', #{query.title}, '%')
+            </if>
+            <if test="query.deptId != null">
+                AND (td.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, td.parent_id))
+            </if>
+        </where>
+        ORDER BY aamss.create_time DESC
+    </select>
 </mapper>
diff --git a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml b/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
index 5b99324..65c5362 100644
--- a/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
+++ b/ruoyi-system/src/main/resources/mapper/system/AssetMainMapper.xml
@@ -47,7 +47,8 @@
     <!-- 分页查询:审批通过的资产列表(关联审批记录、资产类型与部门) -->
     <select id="selectApprovedAssetPage" resultType="com.ruoyi.system.vo.asset.AssetMainPageVO">
         SELECT
-            am.id AS id,
+            DISTINCT
+            am.id,
             am.asset_code AS assetCode,
             am.asset_name AS assetName,
             at.type_name AS assetTypeName,
@@ -80,7 +81,7 @@
             AND IFNULL(am.is_borrowed, 0) = 0
             AND ( oaa.id IS NULL OR oaa.approval_status != 0 )
             <if test="query != null and query.assetTypeId != null">
-                AND am.asset_type_id = #{query.assetTypeId}
+                AND (am.asset_type_id = #{query.assetTypeId} OR FIND_IN_SET(#{query.assetTypeId},at.parent_id))
             </if>
             <if test="query != null and query.ownershipDeptId != null">
                 AND am.ownership_dept_id = #{query.ownershipDeptId}
@@ -95,11 +96,17 @@
             <if test="query.deptId != null">
                 AND (od.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, od.parent_id))
             </if>
+            <if test="query.useDeptOrLocation!=null and query.useDeptOrLocation!=''">
+                AND ((ud.dept_name LIKE CONCAT('%',#{query.useDeptOrLocation}, '%') AND am.address_type = 0)
+                OR (am.warehouse_name LIKE CONCAT('%',#{query.useDeptOrLocation}, '%') AND am.address_type = 1)
+                OR (am.address LIKE CONCAT('%',#{query.useDeptOrLocation}, '%') AND am.address_type = 2))
+            </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
+        DISTINCT
         am.*,
         at.type_name AS assetTypeName,
         od.dept_name AS ownershipDeptName,
@@ -127,7 +134,7 @@
             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}
+                AND (am.asset_type_id = #{query.assetTypeId} OR FIND_IN_SET(#{query.assetTypeId},at.parent_id))
             </if>
             <if test="query != null and query.ownershipDeptId != null">
                 AND am.ownership_dept_id = #{query.ownershipDeptId}
@@ -142,6 +149,11 @@
             <if test="query.deptId != null">
                 AND (od.id = #{query.deptId} OR FIND_IN_SET(#{query.deptId}, od.parent_id))
             </if>
+            <if test="query.useDeptOrLocation!=null and query.useDeptOrLocation!=''">
+                AND ((ud.dept_name LIKE CONCAT('%',#{query.useDeptOrLocation}, '%') AND am.address_type = 0)
+                OR (am.warehouse_name LIKE CONCAT('%',#{query.useDeptOrLocation}, '%') AND am.address_type = 1)
+                OR (am.address LIKE CONCAT('%',#{query.useDeptOrLocation}, '%') AND am.address_type = 2))
+            </if>
         </where>
         ORDER BY COALESCE(oas.storage_time, DATE(am.create_time)) DESC, am.id DESC
     </select>

--
Gitblit v1.7.1