From 104ae610d1d7e8dab5fff9abe4a56208941d62d7 Mon Sep 17 00:00:00 2001
From: heheng <475597332@qq.com>
Date: 星期二, 14 十月 2025 09:50:55 +0800
Subject: [PATCH] 修改修复问题及新增功能

---
 multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecord.java                  |    9 
 multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordDetailsMapper.java     |    5 
 multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/StandingBookController.java       |    9 
 multi-system/src/main/java/com/gkhy/exam/system/mapper/InternalKnowledgeMapper.java            |    1 
 multi-system/src/main/java/com/gkhy/exam/system/service/StandingBookService.java               |    4 
 multi-system/src/main/java/com/gkhy/exam/system/service/impl/MaterialServiceImpl.java          |   81 +++++++
 multi-system/src/main/java/com/gkhy/exam/system/mapper/MaterialMapper.java                     |   21 +
 multi-system/src/main/java/com/gkhy/exam/system/domain/StandingBook.java                       |   14 
 multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/WarehousingRecordController.java  |   46 ++++
 multi-system/src/main/java/com/gkhy/exam/system/domain/DTO/StandingBookImportDTO.java          |   50 ++++
 multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecordDetails.java           |   59 +++--
 multi-system/src/main/resources/mapper/system/WarehousingRecordMapper.xml                      |    3 
 multi-system/src/main/java/com/gkhy/exam/system/service/WarehousingRecordService.java          |    2 
 multi-system/src/main/resources/mapper/system/MaterialMapper.xml                               |   19 +
 multi-system/src/main/java/com/gkhy/exam/system/service/impl/StandingBookServiceImpl.java      |  126 +++++++++++
 multi-system/src/main/java/com/gkhy/exam/system/service/impl/WarehousingRecordServiceImpl.java |   36 +++
 multi-system/src/main/java/com/gkhy/exam/system/service/impl/CompanySummaryServiceImpl.java    |    3 
 multi-common/src/main/java/com/gkhy/exam/common/api/ImportResult.java                          |   12 +
 multi-system/src/main/java/com/gkhy/exam/system/controller/MaterialController.java             |   20 +
 multi-system/src/main/java/com/gkhy/exam/system/service/MaterialService.java                   |   26 ++
 multi-system/src/main/java/com/gkhy/exam/system/domain/Material.java                           |   84 +++++++
 multi-system/src/main/resources/mapper/system/WarehousingRecordDetailsMapper.xml               |    9 
 22 files changed, 603 insertions(+), 36 deletions(-)

diff --git a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/StandingBookController.java b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/StandingBookController.java
index c402151..5c20d30 100644
--- a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/StandingBookController.java
+++ b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/StandingBookController.java
@@ -13,6 +13,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * <p>
@@ -60,4 +61,12 @@
         return standingBookService.deletedStandingBook(id);
     }
 
+    @PostMapping("/importStandingBooks")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "companyId", dataType = "int", required = true, value = "companyId"),
+    })
+    public CommonResult importStandingBooks(MultipartFile file,  Long companyId) {
+        return CommonResult.success(standingBookService.importStandingBooks(companyId, file));
+    }
+
 }
diff --git a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/WarehousingRecordController.java b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/WarehousingRecordController.java
index 6b1fb49..1b73148 100644
--- a/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/WarehousingRecordController.java
+++ b/multi-admin/src/main/java/com/gkhy/exam/admin/controller/web/WarehousingRecordController.java
@@ -3,8 +3,10 @@
 
 import com.gkhy.exam.common.annotation.RepeatSubmit;
 import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.Material;
 import com.gkhy.exam.system.domain.OutsourcedUnqualified;
 import com.gkhy.exam.system.domain.WarehousingRecord;
+import com.gkhy.exam.system.service.MaterialService;
 import com.gkhy.exam.system.service.WarehousingRecordService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -29,6 +31,38 @@
     @Autowired
     private WarehousingRecordService warehousingRecordService;
 
+    @Autowired
+    private MaterialService materialService;
+
+
+    @ApiOperation(value = "物料列表(分页)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10"),
+            @ApiImplicitParam(paramType = "query", name = "companyId", dataType = "int", required = false, value = "公司id"),
+    })
+    @GetMapping("/selectMaterialList")
+    public CommonResult selectMaterialList(Material material){
+        return CommonResult.success(materialService.selectMaterialList(material));
+    }
+
+    @RepeatSubmit
+    @ApiOperation(value = "新增编辑物料")
+    @PostMapping("/saveMaterial")
+    public CommonResult saveMaterial(@RequestBody @Validated Material material){
+        return materialService.saveMaterial(material);
+    }
+
+    @ApiOperation(value = "删除物料")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "id", dataType = "int", required = true, value = "id"),
+    })
+    @GetMapping("/deletedMaterial")
+    public CommonResult deletedMaterial(@RequestParam Long id){
+        return materialService.deletedMaterial(id);
+    }
+
+
     @ApiOperation(value = "出入库记录列表(分页)")
     @ApiImplicitParams({
             @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
@@ -39,6 +73,18 @@
     public CommonResult selectWarehousingRecordList(WarehousingRecord warehousingRecord){
         return CommonResult.success(warehousingRecordService.selectWarehousingRecordList(warehousingRecord));
     }
+
+    @ApiOperation(value = "出入库记录详情列表(分页)")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", name = "pageNum", dataType = "int", required = false, value = "当前页,默认1"),
+            @ApiImplicitParam(paramType = "query", name = "pageSize", dataType = "int", required = false, value = "每页数目,默认10"),
+            @ApiImplicitParam(paramType = "query", name = "companyId", dataType = "int", required = false, value = "公司id"),
+    })
+    @GetMapping("/selectWarehousingRecordDetailList")
+    public CommonResult selectWarehousingRecordDetailList(WarehousingRecord warehousingRecord){
+        return CommonResult.success(warehousingRecordService.selectWarehousingRecordList(warehousingRecord));
+    }
+
     @RepeatSubmit
     @ApiOperation(value = "新增编辑出入库记录")
     @PostMapping("/saveWarehousingRecord")
diff --git a/multi-common/src/main/java/com/gkhy/exam/common/api/ImportResult.java b/multi-common/src/main/java/com/gkhy/exam/common/api/ImportResult.java
new file mode 100644
index 0000000..7fd1c03
--- /dev/null
+++ b/multi-common/src/main/java/com/gkhy/exam/common/api/ImportResult.java
@@ -0,0 +1,12 @@
+package com.gkhy.exam.common.api;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ImportResult {
+    private Integer successCount;
+    private Integer failCount;
+    private List<String> errorMessages;
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/controller/MaterialController.java b/multi-system/src/main/java/com/gkhy/exam/system/controller/MaterialController.java
new file mode 100644
index 0000000..a56c813
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/controller/MaterialController.java
@@ -0,0 +1,20 @@
+package com.gkhy.exam.system.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author hh
+ * @since 2025-10-11 14:20:49
+ */
+@RestController
+@RequestMapping("/system/material")
+public class MaterialController {
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/DTO/StandingBookImportDTO.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/DTO/StandingBookImportDTO.java
new file mode 100644
index 0000000..3038f51
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/DTO/StandingBookImportDTO.java
@@ -0,0 +1,50 @@
+package com.gkhy.exam.system.domain.DTO;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class StandingBookImportDTO {
+
+    @ExcelProperty("部门")
+    private String deptName;
+
+    @ExcelProperty("名称")
+    private String name;
+
+    @ExcelProperty("型号")
+    private String model;
+
+    @ExcelProperty("责任人/使用人")
+    private String personResponsible;
+
+    @ExcelProperty("设备类型")
+    //1计算机设备2办公自动化设备3外部设备4其他
+    private String deviceType;
+
+    @ExcelProperty("编号")
+    private String number;
+
+    @ExcelProperty("品牌")
+    private String brand;
+
+    @ExcelProperty("密级/类型")
+    private String confidentiality;
+
+    @ExcelProperty("状态")
+    //1.完好2需整改3损坏
+    private String status;
+
+    @ExcelProperty("用途")
+    private String purpose;
+
+    @ExcelProperty("使用地点")
+    private String location;
+
+    @ExcelProperty("使用情况")
+    private String used;
+
+    @ExcelProperty("备注")
+    private String remark;
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/Material.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/Material.java
new file mode 100644
index 0000000..a2cf83f
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/Material.java
@@ -0,0 +1,84 @@
+package com.gkhy.exam.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author hh
+ * @since 2025-10-11 14:20:49
+ */
+@Getter
+@Setter
+@TableName("material")
+@ApiModel(value = "Material对象", description = "")
+public class Material implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("id")
+    private Long id;
+
+    @ApiModelProperty(value = "公司ID", required = true)
+    @TableField("company_id")
+    @NotNull(message = "公司ID不能为空")
+    private Long companyId;
+
+    @ApiModelProperty(value = "名称", required = true)
+    @TableField("material_name")
+    @NotBlank(message = "名称不能为空")
+    private String materialName;
+
+    @ApiModelProperty(value = "单位", required = true)
+    @TableField("material_unit")
+    @NotBlank(message = "单位不能为空")
+    private String materialUnit;
+
+    @ApiModelProperty(value = "规格", required = true)
+    @TableField("specification")
+    @NotBlank(message = "规格不能为空")
+    private String specification;
+
+    @ApiModelProperty("库存量")
+    @TableField("inventory")
+    private Integer inventory;
+
+    @ApiModelProperty("删除标志(0为删除,1删除,默认0)")
+    @TableField("del_flag")
+    private Integer delFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField("create_time")
+    private LocalDateTime createTime;
+
+    @ApiModelProperty("创建人")
+    @TableField("create_by")
+    private String createBy;
+
+    @ApiModelProperty("更新时间")
+    @TableField("update_time")
+    private LocalDateTime updateTime;
+
+    @ApiModelProperty("更新人")
+    @TableField("update_by")
+    private String updateBy;
+
+    @ApiModelProperty("乐观锁")
+    @TableField("version")
+    private Integer version;
+
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/StandingBook.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/StandingBook.java
index 3536986..0e2de71 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/domain/StandingBook.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/StandingBook.java
@@ -47,9 +47,15 @@
     @TableField(exist = false)
     private String deptName;
 
-    @ApiModelProperty("名称型号")
+    @ApiModelProperty("名称")
+    @TableField("name")
+    @NotBlank(message = "名称不能为空")
+    private String name;
+
+
+    @ApiModelProperty("型号")
     @TableField("model")
-    @NotBlank(message = "名称型号不能为空")
+    @NotBlank(message = "型号不能为空")
     private String model;
 
     @ApiModelProperty("责任人/使用人")
@@ -61,7 +67,7 @@
     @TableField(exist = false)
     private String personResponsibleName;
 
-    @ApiModelProperty("设备类型1生成设备2办公自动化设备")
+    @ApiModelProperty("设备类型1计算机设备2办公自动化设备3外部设备4其他")
     @TableField("device_type")
     @NotNull(message = "设备类型不能为空")
     private Integer deviceType;
@@ -79,7 +85,7 @@
     @TableField("confidentiality")
     private String confidentiality;
 
-    @ApiModelProperty("状态1.完好2损坏")
+    @ApiModelProperty("状态1.完好2需整改3损坏")
     @TableField("status")
     private Integer status;
 
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecord.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecord.java
index 11dcfde..2eb0bc2 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecord.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecord.java
@@ -38,6 +38,15 @@
     @NotNull(message = "公司id不能为空")
     private Long companyId;
 
+    @ApiModelProperty(value = "物料id",required = true)
+    @TableField("material_id")
+    @NotNull(message = "物料id不能为空")
+    private Long materialId;
+
+    @ApiModelProperty("库存量")
+    @TableField("inventory")
+    private Integer inventory;
+
     @ApiModelProperty(value = "记录名称",required = true)
     @TableField("record_name")
     @NotNull(message = "记录名称不能为空")
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecordDetails.java b/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecordDetails.java
index 4848deb..301f48f 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecordDetails.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/domain/WarehousingRecordDetails.java
@@ -39,37 +39,46 @@
     @NotNull(message = "登记时间不能为空")
     private LocalDateTime boardingTime;
 
-    @ApiModelProperty("名称")
-    @TableField("name")
-    private String name;
+//    @ApiModelProperty("名称")
+//    @TableField("name")
+//    private String name;
 
-    @ApiModelProperty("入库单位")
-    @TableField("enter_company")
-    private String enterCompany;
+    @ApiModelProperty("单位")
+    @TableField("material_unit")
+    private String materialUnit;
 
-    @ApiModelProperty("入库数量")
-    @TableField("enter_num")
-    private Integer enterNum;
+    @ApiModelProperty("数量")
+    @TableField("num")
+    private Integer num;
 
-    @ApiModelProperty("入库经手人")
-    @TableField("enter_person")
-    private String enterPerson;
+    @ApiModelProperty("记录类型1入库2出库")
+    @TableField("record_type")
+    @NotNull(message = "记录类型不能为空")
+    private Integer recordType;
 
-    @ApiModelProperty("出库单位")
-    @TableField("outbound_company")
-    private String outboundCompany;
+    @ApiModelProperty("规格")
+    @TableField("specification")
+    private String specification;
 
-    @ApiModelProperty("出库数量")
-    @TableField("outbound_num")
-    private Integer outboundNum;
+//    @ApiModelProperty("入库经手人")
+//    @TableField("enter_person")
+//    private String enterPerson;
+//
+//    @ApiModelProperty("出库单位")
+//    @TableField("outbound_company")
+//    private String outboundCompany;
+//
+//    @ApiModelProperty("出库数量")
+//    @TableField("outbound_num")
+//    private Integer outboundNum;
+//
+//    @ApiModelProperty("出库经手人")
+//    @TableField("outbound_person")
+//    private String outboundPerson;
 
-    @ApiModelProperty("出库经手人")
-    @TableField("outbound_person")
-    private String outboundPerson;
-
-    @ApiModelProperty("库存")
-    @TableField("amount")
-    private Integer amount;
+//    @ApiModelProperty("库存")
+//    @TableField("amount")
+//    private Integer amount;
 
     @ApiModelProperty("备注")
     @TableField("remark")
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/InternalKnowledgeMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/InternalKnowledgeMapper.java
index d43b756..114cba2 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/mapper/InternalKnowledgeMapper.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/InternalKnowledgeMapper.java
@@ -1,6 +1,5 @@
 package com.gkhy.exam.system.mapper;
 
-import com.gkhy.exam.system.domain.ExternalKnowledge;
 import com.gkhy.exam.system.domain.InternalKnowledge;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/MaterialMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/MaterialMapper.java
new file mode 100644
index 0000000..7656908
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/MaterialMapper.java
@@ -0,0 +1,21 @@
+package com.gkhy.exam.system.mapper;
+
+import com.gkhy.exam.system.domain.Material;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author hh
+ * @since 2025-10-11 14:20:49
+ */
+@Mapper
+public interface MaterialMapper extends BaseMapper<Material> {
+
+    List<Material> selectMaterialList(Material  material);
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordDetailsMapper.java b/multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordDetailsMapper.java
index ccbfb67..0c4456e 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordDetailsMapper.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/mapper/WarehousingRecordDetailsMapper.java
@@ -1,8 +1,11 @@
 package com.gkhy.exam.system.mapper;
 
+import com.gkhy.exam.system.domain.WarehousingRecord;
 import com.gkhy.exam.system.domain.WarehousingRecordDetails;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
 
 /**
  * <p>
@@ -15,4 +18,6 @@
 @Mapper
 public interface WarehousingRecordDetailsMapper extends BaseMapper<WarehousingRecordDetails> {
 
+
+    List<WarehousingRecordDetails> selectWarehousingRecordDetailList(WarehousingRecord warehousingRecord);
 }
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/MaterialService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/MaterialService.java
new file mode 100644
index 0000000..62d7431
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/MaterialService.java
@@ -0,0 +1,26 @@
+package com.gkhy.exam.system.service;
+
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.system.domain.Material;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.exam.system.domain.WarehousingRecord;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-10-11 14:20:49
+ */
+public interface MaterialService extends IService<Material> {
+
+
+    CommonPage selectMaterialList(Material material);
+
+    CommonResult saveMaterial(Material material);
+
+    CommonResult deletedMaterial(Long id);
+
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/StandingBookService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/StandingBookService.java
index 00e0afa..66eaf27 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/service/StandingBookService.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/StandingBookService.java
@@ -2,9 +2,11 @@
 
 import com.gkhy.exam.common.api.CommonPage;
 import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.common.api.ImportResult;
 import com.gkhy.exam.system.domain.Correction;
 import com.gkhy.exam.system.domain.StandingBook;
 import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * <p>
@@ -22,4 +24,6 @@
     CommonResult updateStandingBook(StandingBook standingBook);
 
     CommonResult deletedStandingBook(Integer id);
+
+    ImportResult importStandingBooks(Long companyId ,MultipartFile file);
 }
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/WarehousingRecordService.java b/multi-system/src/main/java/com/gkhy/exam/system/service/WarehousingRecordService.java
index a2d0bbf..99fa344 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/service/WarehousingRecordService.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/WarehousingRecordService.java
@@ -19,6 +19,8 @@
 
     CommonPage selectWarehousingRecordList(WarehousingRecord warehousingRecord);
 
+    CommonPage selectWarehousingRecordDetailList(WarehousingRecord warehousingRecord);
+
     CommonResult saveWarehousingRecord(WarehousingRecord warehousingRecord);
 
     CommonResult getWarehousingRecord(Long id);
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/CompanySummaryServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/CompanySummaryServiceImpl.java
index 82e47a8..a762b38 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/CompanySummaryServiceImpl.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/CompanySummaryServiceImpl.java
@@ -12,15 +12,12 @@
 import com.gkhy.exam.system.mapper.CompanySummaryMapper;
 import com.gkhy.exam.system.service.CompanySummaryService;
 import com.gkhy.exam.system.service.SysCompanyService;
-import org.apache.poi.schemas.vmldrawing.XmlDocument;
 import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
 import org.apache.poi.xwpf.usermodel.XWPFDocument;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.web.multipart.MultipartFile;
 
-import java.io.FileInputStream;
-import java.io.IOException;
 import java.io.InputStream;
 import java.time.LocalDateTime;
 import java.util.List;
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/MaterialServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/MaterialServiceImpl.java
new file mode 100644
index 0000000..ad942ef
--- /dev/null
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/MaterialServiceImpl.java
@@ -0,0 +1,81 @@
+package com.gkhy.exam.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.gkhy.exam.common.api.CommonPage;
+import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.common.constant.UserConstant;
+import com.gkhy.exam.common.utils.PageUtils;
+import com.gkhy.exam.common.utils.SecurityUtils;
+import com.gkhy.exam.system.domain.Material;
+import com.gkhy.exam.system.domain.WarehousingRecord;
+import com.gkhy.exam.system.mapper.MaterialMapper;
+import com.gkhy.exam.system.service.MaterialService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author hh
+ * @since 2025-10-11 14:20:49
+ */
+@Service
+public class MaterialServiceImpl extends ServiceImpl<MaterialMapper, Material> implements MaterialService {
+
+    @Autowired
+    private MaterialMapper materialMapper;
+
+
+    @Override
+    public CommonPage selectMaterialList(Material material) {
+        PageUtils.startPage();
+        List<Material> materials = materialMapper.selectMaterialList(material);
+        return CommonPage.restPage(materials);
+    }
+
+    @Override
+    public CommonResult saveMaterial(Material material) {
+        LambdaQueryWrapper<Material> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Material::getMaterialName, material.getMaterialName());
+        queryWrapper.eq(Material::getDelFlag, UserConstant.ENABLE);
+        queryWrapper.eq(Material::getCompanyId, material.getCompanyId());
+        queryWrapper.eq(Material::getSpecification, material.getSpecification());
+        if (material.getId() == null){
+            long count =  materialMapper.selectCount(queryWrapper);
+            if (count > 0){
+                return CommonResult.failed("该规格物料已存在");
+            }
+            material.setCreateTime(LocalDateTime.now());
+            material.setCreateBy(SecurityUtils.getUsername());
+            materialMapper.insert(material);
+        }else {
+            queryWrapper.ne(Material::getId, material.getId());
+            long count =  materialMapper.selectCount(queryWrapper);
+            if (count > 0){
+                return CommonResult.failed("该规格物料已存在");
+            }
+            material.setUpdateTime(LocalDateTime.now());
+            material.setUpdateBy(SecurityUtils.getUsername());
+            materialMapper.updateById(material);
+        }
+        return CommonResult.success();
+    }
+
+    @Override
+    public CommonResult deletedMaterial(Long id) {
+        materialMapper.update(new Material(),
+                new LambdaUpdateWrapper<Material>().eq(Material::getId, id)
+                        .set(Material::getDelFlag, UserConstant.DEPT_DISABLE)
+                        .set(Material::getUpdateTime, LocalDateTime.now())
+                        .set(Material::getUpdateBy, SecurityUtils.getUsername()));
+
+        return CommonResult.success("删除成功");
+    }
+}
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/StandingBookServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/StandingBookServiceImpl.java
index 7c0d37c..41c4905 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/StandingBookServiceImpl.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/StandingBookServiceImpl.java
@@ -1,19 +1,35 @@
 package com.gkhy.exam.system.service.impl;
 
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.ExcelReader;
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.read.listener.ReadListener;
+import com.alibaba.excel.read.metadata.ReadSheet;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.gkhy.exam.common.api.CommonPage;
 import com.gkhy.exam.common.api.CommonResult;
+import com.gkhy.exam.common.api.ImportResult;
+import com.gkhy.exam.common.domain.entity.SysDept;
+import com.gkhy.exam.common.domain.entity.SysUser;
 import com.gkhy.exam.common.utils.PageUtils;
 import com.gkhy.exam.common.utils.SecurityUtils;
-import com.gkhy.exam.system.domain.Correction;
+import com.gkhy.exam.system.domain.DTO.StandingBookImportDTO;
 import com.gkhy.exam.system.domain.StandingBook;
+import com.gkhy.exam.system.domain.vo.DeptVo;
 import com.gkhy.exam.system.mapper.StandingBookMapper;
+import com.gkhy.exam.system.mapper.SysDeptMapper;
+import com.gkhy.exam.system.mapper.SysUserMapper;
 import com.gkhy.exam.system.service.StandingBookService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -28,6 +44,13 @@
 
     @Autowired
     private StandingBookMapper standingBookMapper;
+
+    @Autowired
+    private SysDeptMapper sysDeptMapper;
+
+    @Autowired
+
+    private SysUserMapper sysUserMapper;
     @Override
     public CommonPage selectStandingBookList(StandingBook standingBook) {
         PageUtils.startPage();
@@ -71,4 +94,105 @@
         }
         return CommonResult.failed();
     }
+
+    @Override
+    public ImportResult importStandingBooks(Long companyId, MultipartFile file) {
+        ImportResult result = new ImportResult();
+        result.setSuccessCount(0);
+        result.setFailCount(0);
+        result.setErrorMessages(new ArrayList<>());
+
+        SysDept sysDept = new SysDept();
+        sysDept.setCompanyId(companyId);
+        List<DeptVo> deptVos = sysDeptMapper.selectDeptList(sysDept);
+        Map<String, Long> deptNameIdMap = deptVos.stream()
+                .collect(Collectors.toMap(DeptVo::getDeptName, DeptVo::getDeptId));
+
+        LambdaQueryWrapper<SysUser> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysUser::getCompanyId, companyId);
+        queryWrapper.eq(SysUser::getDelFlag, 0);
+        List<SysUser> sysUsers = sysUserMapper.selectList(queryWrapper);
+        Map<String, Long> userNameIdMap = sysUsers.stream()
+                .collect(Collectors.toMap(SysUser::getName, SysUser::getId));
+
+        try {
+            // 使用EasyExcel读取文件
+            ReadListener<StandingBookImportDTO> listener = new ReadListener<StandingBookImportDTO>() {
+                @Override
+                public void invoke(StandingBookImportDTO dto, AnalysisContext context) {
+                    try {
+                        // 转换为实体对象
+                        StandingBook standingBook = new StandingBook();
+                        standingBook.setCompanyId(companyId);
+                        standingBook.setDeptId(deptNameIdMap.get(dto.getDeptName()) == null ? 0L : deptNameIdMap.get(dto.getDeptName()));
+                        standingBook.setName(dto.getName());
+                        standingBook.setModel(dto.getModel());
+                        standingBook.setPersonResponsible(userNameIdMap.get(dto.getPersonResponsible()) == null ? 0L : userNameIdMap.get(dto.getPersonResponsible()));
+                        String deviceType = dto.getDeviceType();
+                        switch (deviceType) {
+                            case "计算机设备":
+                                standingBook.setDeviceType(1);
+                                break;
+                            case "办公自动化设备":
+                                standingBook.setDeviceType(2);
+                                break;
+                            case "外部设备":
+                                standingBook.setDeviceType(3);
+                                break;
+                            default:
+                                standingBook.setDeviceType(4);
+                                break;
+                        }
+                        standingBook.setNumber(dto.getNumber());
+                        standingBook.setBrand(dto.getBrand());
+                        standingBook.setConfidentiality(dto.getConfidentiality());
+                        switch (dto.getStatus()) {
+                            case "完好":
+                                standingBook.setStatus(1);
+                                break;
+                            case "需整改":
+                                standingBook.setStatus(2);
+                                break;
+                            default:
+                                standingBook.setStatus(3);
+                                break;
+                        }
+                        standingBook.setPurpose(dto.getPurpose());
+                        standingBook.setLocation(dto.getLocation());
+                        standingBook.setUsed(dto.getUsed());
+                        standingBook.setRemark(dto.getRemark());
+                        standingBook.setCreateTime(LocalDateTime.now());
+                        standingBook.setCreateBy(SecurityUtils.getUsername());
+                        standingBookMapper.insert(standingBook);
+                        result.setSuccessCount(result.getSuccessCount() + 1);
+                    } catch (Exception e) {
+                        result.getErrorMessages().add("行" + context.readRowHolder().getRowIndex() + "导入失败:" + e.getMessage());
+                        result.setFailCount(result.getFailCount() + 1);
+                    }
+                }
+
+
+
+
+                @Override
+                public void doAfterAllAnalysed(AnalysisContext context) {
+                    // 导入完成后的处理
+                }
+            };
+
+            // 创建读取器
+            ExcelReader excelReader = EasyExcel.read(file.getInputStream(), StandingBookImportDTO.class, listener).build();
+            ReadSheet readSheet = EasyExcel.readSheet(0).build();
+            excelReader.read(readSheet);
+
+        } catch (Exception e) {
+            result.getErrorMessages().add("导入失败:" + e.getMessage());
+        }
+
+        return result;
+    }
+
+
+
+
 }
diff --git a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/WarehousingRecordServiceImpl.java b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/WarehousingRecordServiceImpl.java
index 89f254b..c4f48a1 100644
--- a/multi-system/src/main/java/com/gkhy/exam/system/service/impl/WarehousingRecordServiceImpl.java
+++ b/multi-system/src/main/java/com/gkhy/exam/system/service/impl/WarehousingRecordServiceImpl.java
@@ -6,11 +6,14 @@
 import com.gkhy.exam.common.api.CommonPage;
 import com.gkhy.exam.common.api.CommonResult;
 import com.gkhy.exam.common.constant.UserConstant;
+import com.gkhy.exam.common.exception.ApiException;
 import com.gkhy.exam.common.utils.PageUtils;
 import com.gkhy.exam.common.utils.SecurityUtils;
+import com.gkhy.exam.system.domain.Material;
 import com.gkhy.exam.system.domain.OutsourcedUnqualified;
 import com.gkhy.exam.system.domain.WarehousingRecord;
 import com.gkhy.exam.system.domain.WarehousingRecordDetails;
+import com.gkhy.exam.system.mapper.MaterialMapper;
 import com.gkhy.exam.system.mapper.WarehousingRecordDetailsMapper;
 import com.gkhy.exam.system.mapper.WarehousingRecordMapper;
 import com.gkhy.exam.system.service.WarehousingRecordService;
@@ -37,17 +40,33 @@
     private WarehousingRecordMapper warehousingRecordMapper;
     @Autowired
     private WarehousingRecordDetailsMapper warehousingRecordDetailsMapper;
+    @Autowired
+    private MaterialMapper materialMapper;
 
     @Override
     public CommonPage selectWarehousingRecordList(WarehousingRecord warehousingRecord) {
         PageUtils.startPage();
         List<WarehousingRecord> warehousingRecords = warehousingRecordMapper.selectWarehousingRecordList(warehousingRecord);
+        warehousingRecords.stream().forEach(item -> {
+            List<WarehousingRecordDetails> de = warehousingRecordDetailsMapper.selectList(
+                    new LambdaQueryWrapper<>(WarehousingRecordDetails.class).eq(WarehousingRecordDetails::getRecordId, item.getId())
+                            .eq(WarehousingRecordDetails::getDelFlag, UserConstant.ENABLE).orderByAsc(WarehousingRecordDetails::getCreateTime));
+            item.setWarehousingRecordDetails(de);
+        });
+        return CommonPage.restPage(warehousingRecords);
+    }
+
+    @Override
+    public CommonPage selectWarehousingRecordDetailList(WarehousingRecord warehousingRecord) {
+        PageUtils.startPage();
+        List<WarehousingRecordDetails> warehousingRecords = warehousingRecordDetailsMapper.selectWarehousingRecordDetailList(warehousingRecord);
         return CommonPage.restPage(warehousingRecords);
     }
 
     @Override
     @Transactional
     public CommonResult saveWarehousingRecord(WarehousingRecord warehousingRecord) {
+
         List<WarehousingRecordDetails> warehousingRecordDetails = warehousingRecord.getWarehousingRecordDetails();
         if (ObjectUtil.isEmpty(warehousingRecordDetails)){
             return CommonResult.validateFailed("请选择入库记录详情");
@@ -64,12 +83,19 @@
             i = warehousingRecordMapper.updateById(warehousingRecord);
         }
         if (i > 0){
-          batchSave(warehousingRecord.getId(), warehousingRecordDetails,warehousingRecord.getDelDetails());
+          batchSave(warehousingRecord.getId(), warehousingRecordDetails,warehousingRecord.getDelDetails(),warehousingRecord.getMaterialId(),warehousingRecord.getInventory());
         }
+
+
         return CommonResult.success();
     }
 
-    private void batchSave(Long id, List<WarehousingRecordDetails> warehousingRecordDetails,List<Long> delDetails) {
+    private void batchSave(Long id, List<WarehousingRecordDetails> warehousingRecordDetails,List<Long> delDetails,Long materialId,int inventory) {
+
+        Material material = materialMapper.selectById(materialId);
+        if (ObjectUtil.isEmpty(material)){
+            throw new ApiException("物料不存在");
+        }
         warehousingRecordDetails.stream().filter(item -> item.getId() == null).forEach(item -> {
             item.setRecordId(id);
             item.setCreateTime(LocalDateTime.now());
@@ -90,6 +116,12 @@
                             .set(WarehousingRecordDetails::getUpdateBy, SecurityUtils.getUsername()));
         }
 
+        materialMapper.update(new Material(),
+                new LambdaUpdateWrapper<Material>().eq(Material::getId, materialId)
+                        .set(Material::getInventory, inventory)
+                        .set(Material::getUpdateTime, LocalDateTime.now())
+                        .set(Material::getUpdateBy, SecurityUtils.getUsername()));
+
     }
 
     @Override
diff --git a/multi-system/src/main/resources/mapper/system/MaterialMapper.xml b/multi-system/src/main/resources/mapper/system/MaterialMapper.xml
new file mode 100644
index 0000000..e95e6b0
--- /dev/null
+++ b/multi-system/src/main/resources/mapper/system/MaterialMapper.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gkhy.exam.system.mapper.MaterialMapper">
+
+    <select id="selectMaterialList" parameterType="com.gkhy.exam.system.domain.Material" resultType="com.gkhy.exam.system.domain.Material">
+        select * from material where del_flag = 0
+        <if test="materialName != null">
+            and material_name like concat('%',#{materialName},'%')
+        </if>
+        <if test="materialUnit != null">
+            and material_unit like concat('%',#{materialUnit},'%')
+        </if>
+        <if test="inventory != null">
+            and inventory = #{inventory}
+        </if>
+        order by update_time desc
+    </select>
+
+</mapper>
diff --git a/multi-system/src/main/resources/mapper/system/WarehousingRecordDetailsMapper.xml b/multi-system/src/main/resources/mapper/system/WarehousingRecordDetailsMapper.xml
index 666339e..56f32b7 100644
--- a/multi-system/src/main/resources/mapper/system/WarehousingRecordDetailsMapper.xml
+++ b/multi-system/src/main/resources/mapper/system/WarehousingRecordDetailsMapper.xml
@@ -2,4 +2,13 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.gkhy.exam.system.mapper.WarehousingRecordDetailsMapper">
 
+
+    <select id="selectWarehousingRecordDetailList" resultType="com.gkhy.exam.system.domain.WarehousingRecordDetails" parameterType="com.gkhy.exam.system.domain.WarehousingRecord">
+
+        select a.* from warehousing_record_details a
+            left join warehousing_record b on a.record_id = b.id
+        where del_flag = 0  and b.del_flag = 0
+
+    </select>
+
 </mapper>
diff --git a/multi-system/src/main/resources/mapper/system/WarehousingRecordMapper.xml b/multi-system/src/main/resources/mapper/system/WarehousingRecordMapper.xml
index 83e45a5..b75a728 100644
--- a/multi-system/src/main/resources/mapper/system/WarehousingRecordMapper.xml
+++ b/multi-system/src/main/resources/mapper/system/WarehousingRecordMapper.xml
@@ -9,6 +9,9 @@
         <if test="companyId != null">
             and company_id = #{companyId}
         </if>
+        <if test="materialId != null">
+            and material_id = #{materialId}
+        </if>
         order by create_time desc
     </select>
 </mapper>

--
Gitblit v1.9.2