From f241a39f07acc5d5ede28b4152d74cbb84e4885b Mon Sep 17 00:00:00 2001
From: zhangfeng <1603559716@qq.com>
Date: 星期二, 08 十一月 2022 08:37:36 +0800
Subject: [PATCH] 安全物资和设备管理

---
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialInfo.java                                      |  194 ++
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/IssueReceiptEnum.java                                       |   45 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/MterialDeliveryReq.java                             |   28 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialClassifyInfoRepository.java                |   17 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialClassifyInfoService.java          |   21 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailBO.java                                  |   63 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/SafeMaterialDetailController.java                      |  148 +
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/common/RocketMQTemplateHelper.java                                |   52 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ValidStatusEnum.java                                        |   46 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMatetrialDetailQuery.java                       |   22 
 equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialInfoMapper.xml                                           |   65 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/MaterialClassifyService.java                              |   22 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialAddReq.java                             |   62 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialClassifyInfo.java                              |  131 +
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialModReq.java                             |   69 
 equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialClassifyInfoMapper.xml                                   |   43 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/MaterialClassificationDto.java                     |   35 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialDetailAddReq.java                       |   78 
 safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/database/MyBatisConfigEquipment.java                                        |    7 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailInfo.java                                |  289 +++
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialCountDO.java                                   |   22 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyAddReq.java                     |   23 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialDetailDto.java                         |  215 ++
 safePlatfrom-out-web/src/main/resources/config/application-dev.yaml                                                                         |    7 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ValidTypeEnum.java                                          |   46 
 equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialDetailInfoMapper.xml                                     |  190 ++
 safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/exception/GlobalExceptionHandler.java                                       |   22 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/SafeMaterialController.java                            |   56 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/handler/MyMetaObjectHandler.java                                  |   34 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/MaterialClassifyServiceImpl.java                     |  114 +
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/MaterialDepartmentDto.java                         |   36 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/mq/msg/SafeMaterialMsg.java                                       |   46 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailInfoDO.java                              |  230 ++
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/excepiton/EquipmentException.java                                 |   10 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialClassifyInfoServiceImpl.java |   63 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialInfoRepository.java                        |   27 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/EquipmentResultCodes.java                                   |    6 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialDto.java                               |  126 +
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialDetailInfoService.java            |   45 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java                   |  541 ++++++
 pom.xml                                                                                                                                     |   26 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/SafeMaterialService.java                                  |   26 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/mq/consumer/SafeMaterialConsumer.java                             |   72 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/MaterialClassifyController.java                        |   76 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialClassifyDO.java                                |   22 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialInfoServiceImpl.java         |   80 +
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ConsumableEnum.java                                         |   46 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDO.java                                        |  200 ++
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyModReq.java                     |   34 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyQuery.java                      |   13 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/MterialRandomDeliveryReq.java                       |   38 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialInfoService.java                  |   25 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialDetailInfoServiceImpl.java   |  147 +
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialQuery.java                              |   28 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailCountDO.java                             |   22 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialServiceImpl.java                         |  336 ++++
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialClassifyDto.java                       |   22 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/SafeMaterialDetailService.java                            |   38 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialDetailInfoRepository.java                  |   46 
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialDetailReq.java                          |  111 +
 equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/BaseMaterialDto.java                               |   24 
 61 files changed, 4,728 insertions(+), 0 deletions(-)

diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/common/RocketMQTemplateHelper.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/common/RocketMQTemplateHelper.java
new file mode 100644
index 0000000..31aab69
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/common/RocketMQTemplateHelper.java
@@ -0,0 +1,52 @@
+package com.gkhy.safePlatform.equipment.common;
+
+import org.apache.rocketmq.client.producer.SendResult;
+import org.apache.rocketmq.client.producer.SendStatus;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.support.TransactionSynchronizationAdapter;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
+
+import java.util.Date;
+
+@Component
+public class RocketMQTemplateHelper {
+
+    @Autowired
+    private RocketMQTemplate rocketMQTemplate;
+
+    private Logger logger = LoggerFactory.getLogger(this.getClass());
+
+
+    /**
+     * 事务提交后发送MQ
+     * @param message
+     * @param <T>
+     */
+    public <T> void syncSend(String destination, T message) {
+        // 是否开启事务判断
+        if (TransactionSynchronizationManager.isSynchronizationActive()) {
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
+                @Override
+                public void afterCommit() {
+                    SendResult sendResult = rocketMQTemplate.syncSend(destination, message);
+                    if(sendResult.getSendStatus() != SendStatus.SEND_OK){
+                        logger.info("【安全物资和设备管理】事务提交后才发送MQ的消息发送失败!"+ new Date());
+                    }else{
+                        logger.info("【安全物资和设备管理】消息申请发送rocketMQ消息成功!"+ new Date());
+                    }
+                }
+            });
+        } else {
+            SendResult sendResult = rocketMQTemplate.syncSend(destination, message);
+            if(sendResult.getSendStatus() != SendStatus.SEND_OK){
+                logger.info("【安全物资和设备管理】事务提交后才发送MQ的消息发送失败!"+ new Date());
+            }else{
+                logger.info("【安全物资和设备管理】消息申请发送rocketMQ消息成功!"+ new Date());
+            }
+        }
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/MaterialClassifyController.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/MaterialClassifyController.java
new file mode 100644
index 0000000..ebad542
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/MaterialClassifyController.java
@@ -0,0 +1,76 @@
+package com.gkhy.safePlatform.equipment.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gkhy.safePlatform.commons.co.ContextCacheUser;
+import com.gkhy.safePlatform.commons.vo.ResultVO;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialClassifyAddReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialClassifyModReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialClassifyQuery;
+import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialClassifyDto;
+import com.gkhy.safePlatform.equipment.service.MaterialClassifyService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/equipment/classify")
+public class MaterialClassifyController {
+    @Autowired
+    private MaterialClassifyService materialClassifyService;
+    /**
+     * 列表
+     * @return
+     */
+    @PostMapping(value = "/list")
+    public ResultVO<List<SafeMaterialClassifyDto>> list(Authentication authentication, @RequestBody SafeMaterialClassifyQuery query){
+        ContextCacheUser currentUser = (ContextCacheUser) authentication.getPrincipal();
+        return materialClassifyService.list(query);
+
+    }
+
+    /**
+     * 新增
+     * @return
+     */
+    @PostMapping(value = "save")
+    public ResultVO save(Authentication authentication, @Validated @RequestBody SafeMaterialClassifyAddReq req){
+        ContextCacheUser currentUser = (ContextCacheUser) authentication.getPrincipal();
+        return materialClassifyService.save(currentUser,req);
+    }
+
+    /**
+     * 更新
+     * @return
+     */
+    @PostMapping(value = "update")
+    public ResultVO update(Authentication authentication, @Validated @RequestBody SafeMaterialClassifyModReq req){
+        ContextCacheUser currentUser = (ContextCacheUser) authentication.getPrincipal();
+        return materialClassifyService.update(currentUser,req);
+    }
+
+    /**
+     * 逻辑删除 单条
+     * @return
+     */
+    @PostMapping(value = "delete")
+    public ResultVO delete(Authentication authentication, @RequestBody JSONObject jsonObject){
+        ContextCacheUser currentUser = (ContextCacheUser) authentication.getPrincipal();
+        Long id = jsonObject.getLong("id");
+        return materialClassifyService.delete(id);
+    }
+
+    /**
+     * 查询单条数据
+     */
+    @PostMapping(value = "queryById")
+    public ResultVO<SafeMaterialClassifyDto> queryById(Authentication authentication, @RequestBody JSONObject jsonObject){
+        Long id = jsonObject.getLong("id");
+        return materialClassifyService.queryById(id);
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/SafeMaterialController.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/SafeMaterialController.java
new file mode 100644
index 0000000..558b456
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/SafeMaterialController.java
@@ -0,0 +1,56 @@
+package com.gkhy.safePlatform.equipment.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gkhy.safePlatform.commons.query.PageQuery;
+import com.gkhy.safePlatform.commons.vo.ResultVO;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialAddReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialModReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialQuery;
+import com.gkhy.safePlatform.equipment.service.SafeMaterialService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping(value = "/equipment/safeMaterial")
+public class SafeMaterialController {
+    @Autowired
+    private SafeMaterialService safeMaterialService;
+
+    @PostMapping(value = "save")
+    public ResultVO save(Authentication authentication, @Validated @RequestBody SafeMaterialAddReq req){
+        return safeMaterialService.save(req);
+    }
+    @PostMapping(value = "update")
+    public ResultVO update(Authentication authentication, @Validated @RequestBody SafeMaterialModReq req){
+        return safeMaterialService.update(req);
+    }
+    @PostMapping(value = "delete")
+    public ResultVO delete(Authentication authentication, @RequestBody JSONObject jsonObject){
+        Long id = jsonObject.getLong("id");
+        return safeMaterialService.delete(id);
+    }
+    @PostMapping(value = "queryById")
+    public ResultVO queryById(Authentication authentication, @RequestBody JSONObject jsonObject){
+        Long id = jsonObject.getLong("id");
+        return safeMaterialService.queryById(id);
+    }
+    @PostMapping(value = "list")
+    public ResultVO list(Authentication authentication){
+        return safeMaterialService.list();
+    }
+
+    @PostMapping(value = "page/list")
+    public ResultVO listByPage(Authentication authentication,@RequestBody PageQuery<SafeMaterialQuery> pageQuery){
+        return safeMaterialService.listByPage(pageQuery);
+    }
+    @PostMapping(value = "deleteBatch")
+    public ResultVO deleteBatch(Authentication authentication, @RequestBody Long[] ids){
+        return safeMaterialService.deleteBatch(ids);
+    }
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/SafeMaterialDetailController.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/SafeMaterialDetailController.java
new file mode 100644
index 0000000..0250924
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/controller/SafeMaterialDetailController.java
@@ -0,0 +1,148 @@
+package com.gkhy.safePlatform.equipment.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.gkhy.safePlatform.commons.query.PageQuery;
+import com.gkhy.safePlatform.commons.vo.ResultVO;
+import com.gkhy.safePlatform.commons.vo.SearchResultVO;
+import com.gkhy.safePlatform.equipment.model.dto.req.*;
+import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialDetailDto;
+import com.gkhy.safePlatform.equipment.service.SafeMaterialDetailService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.Authentication;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping(value = "/equipment/smDetail")
+public class SafeMaterialDetailController {
+    @Autowired
+    private SafeMaterialDetailService safeMaterialDetailService;
+    /**
+     * 新增入库
+     * @param authentication
+     * @return
+     */
+    @PostMapping(value = "/save")
+    public ResultVO save(Authentication authentication,@Validated @RequestBody SafeMaterialDetailAddReq req){
+        return safeMaterialDetailService.save(req);
+    }
+    /**
+     * 批量入库
+     */
+    @PostMapping(value = "/saveBatch")
+    public ResultVO saveBatch(Authentication authentication,@Validated @RequestBody SafeMaterialDetailAddReq req){
+        return safeMaterialDetailService.saveBatch(req);
+    }
+    /**
+     * 编辑
+     */
+    @PostMapping(value = "/update")
+    public ResultVO update(Authentication authentication,@Validated @RequestBody SafeMaterialDetailReq req){
+        return safeMaterialDetailService.update(req);
+    }
+    /**
+     * 单独出入库
+     * @param authentication
+     * @return
+     */
+    @PostMapping(value = "/single/delivery0rReceipt")
+    public ResultVO singleDdelivery0rReceipt(Authentication authentication, @Validated @RequestBody SafeMaterialDetailReq req){
+        return safeMaterialDetailService.singleDdelivery0rReceipt(req);
+    }
+
+    /**
+     * 单独出库
+     * @param authentication
+     * @return
+     */
+    @PostMapping(value = "/single/delivery")
+    public ResultVO singleDelivery(Authentication authentication, @Validated @RequestBody SafeMaterialDetailReq req){
+        return safeMaterialDetailService.singleDelivery(req);
+    }
+
+    /**
+     * 单独入库
+     * @param authentication
+     * @return
+     */
+    @PostMapping(value = "/single/receipt")
+    public ResultVO singleReceipt(Authentication authentication,@RequestBody JSONObject jsonObject){
+        Long id = jsonObject.getLong("id");
+        return safeMaterialDetailService.singleReceipt(id);
+    }
+    /**
+     * 批量出库 - 根据ids
+     * @param authentication
+     * @return
+     */
+    @PostMapping(value = "/batch/delivery/ids")
+    public ResultVO deliveryBatchByIds(Authentication authentication, @Validated @RequestBody MterialDeliveryReq req){
+
+        return safeMaterialDetailService.deliveryBatchByIds(req);
+    }
+    /**
+     * 批量出库
+     * @param authentication
+     * @return
+     */
+    @PostMapping(value = "/batch/delivery/random")
+    public ResultVO deliveryBatchRandom(Authentication authentication,@Validated @RequestBody MterialRandomDeliveryReq req){
+        return safeMaterialDetailService.deliveryBatchRandom(req);
+    }
+
+    /**
+     * 批量重新入库
+     */
+    @PostMapping(value = "/batch/receipt")
+    public ResultVO receiptBatch(Authentication authentication, @RequestBody Long[] ids){
+        return safeMaterialDetailService.receiptBatch(ids);
+    }
+    /**
+     * 删除-单条
+     * @param authentication
+     * @return
+     */
+    @PostMapping(value = "/delete")
+    public ResultVO delete(Authentication authentication, @RequestBody JSONObject jsonObject){
+        Long id = jsonObject.getLong("id");
+        return safeMaterialDetailService.delete(id);
+    }
+
+    /**
+     * 批量删除
+     * @param authentication
+     * @return
+     */
+    @PostMapping(value = "/deleteBatch")
+    public ResultVO deleteBatch(Authentication authentication,@RequestBody Long[] ids){
+        return safeMaterialDetailService.deleteBatch(ids);
+    }
+
+
+    /**
+     * 分页查询
+     * @param authentication
+     * @return
+     */
+    @PostMapping(value = "/page/list")
+    public SearchResultVO<List<SafeMaterialDetailDto>> listByPage(Authentication authentication, @RequestBody PageQuery<SafeMatetrialDetailQuery> pageQuery){
+        return safeMaterialDetailService.listByPage(pageQuery);
+    }
+
+    /**
+     * 查询单条数据
+     * @param authentication
+     * @return
+     */
+    @PostMapping(value = "/queryById")
+    public ResultVO queryById(Authentication authentication,@RequestBody JSONObject jsonObject){
+        Long id = jsonObject.getLong("id");
+        return safeMaterialDetailService.queryById(id);
+    }
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialClassifyDO.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialClassifyDO.java
new file mode 100644
index 0000000..f96a877
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialClassifyDO.java
@@ -0,0 +1,22 @@
+package com.gkhy.safePlatform.equipment.entity;
+
+public class SafeMaterialClassifyDO {
+    private Long id;
+    private String materialClassifyName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getMaterialClassifyName() {
+        return materialClassifyName;
+    }
+
+    public void setMaterialClassifyName(String materialClassifyName) {
+        this.materialClassifyName = materialClassifyName;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialClassifyInfo.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialClassifyInfo.java
new file mode 100644
index 0000000..0880f55
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialClassifyInfo.java
@@ -0,0 +1,131 @@
+package com.gkhy.safePlatform.equipment.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@TableName("safe_material_classify")
+public class SafeMaterialClassifyInfo implements Serializable {
+    private static final long serialVersionUID = -6700804265510606854L;
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    /**
+     * 物资分类名称
+     */
+    private String materialClassifyName;
+    /**
+     * 删除标识
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private int delFlag;
+    /**
+     * 创建人id
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private Long createUid;
+    /**
+     * 创建人姓名
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private String createUname;
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    public LocalDateTime createTime;
+
+    /**
+     * 修改人id
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    private Long updateUid;
+    /**
+     * 修改人姓名
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    private String updateUname;
+
+    /**
+     * 修改时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+    public LocalDateTime getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(LocalDateTime createTime) {
+        this.createTime = createTime;
+    }
+
+    public LocalDateTime getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(LocalDateTime updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getMaterialClassifyName() {
+        return materialClassifyName;
+    }
+
+    public void setMaterialClassifyName(String materialClassifyName) {
+        this.materialClassifyName = materialClassifyName;
+    }
+
+    public int getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(int delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    public Long getCreateUid() {
+        return createUid;
+    }
+
+    public void setCreateUid(Long createUid) {
+        this.createUid = createUid;
+    }
+
+    public String getCreateUname() {
+        return createUname;
+    }
+
+    public void setCreateUname(String createUname) {
+        this.createUname = createUname;
+    }
+
+    public Long getUpdateUid() {
+        return updateUid;
+    }
+
+    public void setUpdateUid(Long updateUid) {
+        this.updateUid = updateUid;
+    }
+
+    public String getUpdateUname() {
+        return updateUname;
+    }
+
+    public void setUpdateUname(String updateUname) {
+        this.updateUname = updateUname;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialCountDO.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialCountDO.java
new file mode 100644
index 0000000..a84c101
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialCountDO.java
@@ -0,0 +1,22 @@
+package com.gkhy.safePlatform.equipment.entity;
+
+public class SafeMaterialCountDO {
+    private Long id;
+    private Integer count;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDO.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDO.java
new file mode 100644
index 0000000..1930b44
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDO.java
@@ -0,0 +1,200 @@
+package com.gkhy.safePlatform.equipment.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+public class SafeMaterialDO {
+
+
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 物资序列号  (如果以后id使用雪花算法时候再启用该字段)
+     */
+    private String serialNum;
+    /**
+     * 物资类型id
+     */
+    private Long materialClassifyId;
+
+    private String materialClassifyName;
+    /**
+     * 部门id
+     */
+    private Long depId;
+    /**
+     * 部门名称
+     */
+    private String depName;
+    /**
+     * 物资名称
+     */
+    private String materialName;
+    /**
+     * 是否是耗材(0是, 1否)
+     */
+    private Byte consumable;
+    /**
+     * 删除标识
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private int delFlag;
+    /**
+     * 创建人id
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private Long createUid;
+    /**
+     * 创建人姓名
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private String createUname;
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    public LocalDateTime createTime;
+    /**
+     * 修改人id
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    private Long updateUid;
+    /**
+     * 修改人姓名
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    private String updateUname;
+    /**
+     * 修改时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getSerialNum() {
+        return serialNum;
+    }
+
+    public void setSerialNum(String serialNum) {
+        this.serialNum = serialNum;
+    }
+
+    public Long getMaterialClassifyId() {
+        return materialClassifyId;
+    }
+
+    public void setMaterialClassifyId(Long materialClassifyId) {
+        this.materialClassifyId = materialClassifyId;
+    }
+
+    public Long getDepId() {
+        return depId;
+    }
+
+    public void setDepId(Long depId) {
+        this.depId = depId;
+    }
+
+    public String getDepName() {
+        return depName;
+    }
+
+    public void setDepName(String depName) {
+        this.depName = depName;
+    }
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+
+    public Byte getConsumable() {
+        return consumable;
+    }
+
+    public void setConsumable(Byte consumable) {
+        this.consumable = consumable;
+    }
+
+    public int getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(int delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    public Long getCreateUid() {
+        return createUid;
+    }
+
+    public void setCreateUid(Long createUid) {
+        this.createUid = createUid;
+    }
+
+    public String getCreateUname() {
+        return createUname;
+    }
+
+    public void setCreateUname(String createUname) {
+        this.createUname = createUname;
+    }
+
+    public LocalDateTime getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(LocalDateTime createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getUpdateUid() {
+        return updateUid;
+    }
+
+    public void setUpdateUid(Long updateUid) {
+        this.updateUid = updateUid;
+    }
+
+    public String getUpdateUname() {
+        return updateUname;
+    }
+
+    public void setUpdateUname(String updateUname) {
+        this.updateUname = updateUname;
+    }
+
+    public LocalDateTime getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(LocalDateTime updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getMaterialClassifyName() {
+        return materialClassifyName;
+    }
+
+    public void setMaterialClassifyName(String materialClassifyName) {
+        this.materialClassifyName = materialClassifyName;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailBO.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailBO.java
new file mode 100644
index 0000000..6ad8730
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailBO.java
@@ -0,0 +1,63 @@
+package com.gkhy.safePlatform.equipment.entity;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+public class SafeMaterialDetailBO {
+    private List<Long> ids;
+    private Integer count;
+    private Byte irStatus;
+    private Long claimantId;
+    private String claimantName;
+
+    private LocalDateTime deliveryTime;
+
+    public List<Long> getIds() {
+        return ids;
+    }
+
+    public void setIds(List<Long> ids) {
+        this.ids = ids;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+
+
+    public Byte getIrStatus() {
+        return irStatus;
+    }
+
+    public void setIrStatus(Byte irStatus) {
+        this.irStatus = irStatus;
+    }
+
+    public Long getClaimantId() {
+        return claimantId;
+    }
+
+    public void setClaimantId(Long claimantId) {
+        this.claimantId = claimantId;
+    }
+
+    public String getClaimantName() {
+        return claimantName;
+    }
+
+    public void setClaimantName(String claimantName) {
+        this.claimantName = claimantName;
+    }
+
+    public LocalDateTime getDeliveryTime() {
+        return deliveryTime;
+    }
+
+    public void setDeliveryTime(LocalDateTime deliveryTime) {
+        this.deliveryTime = deliveryTime;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailCountDO.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailCountDO.java
new file mode 100644
index 0000000..bb80a9a
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailCountDO.java
@@ -0,0 +1,22 @@
+package com.gkhy.safePlatform.equipment.entity;
+
+public class SafeMaterialDetailCountDO {
+    private Long smId;
+    private Integer count;
+
+    public Long getSmId() {
+        return smId;
+    }
+
+    public void setSmId(Long smId) {
+        this.smId = smId;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailInfo.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailInfo.java
new file mode 100644
index 0000000..310e2a5
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailInfo.java
@@ -0,0 +1,289 @@
+package com.gkhy.safePlatform.equipment.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+@TableName("safe_material_detail")
+public class SafeMaterialDetailInfo implements Serializable {
+    private static final long serialVersionUID = -3779254000698221155L;
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    /**
+     * 物资名称
+     */
+    private String name;
+    /**
+     * 物资编号
+     */
+    private String materialNo;
+    /**
+     * 物资类型id
+     */
+    private Long materialClassifyId;
+    /**
+     * RFID
+     */
+    private String rfid;
+    /**
+     * 是否是耗材(0是, 1否)
+     */
+    private Byte consumable;
+    /**
+     * 保质期类型
+     */
+    private Byte validType;
+    /**
+     * 保质到期时间
+     */
+    private LocalDateTime validTime;
+    /**
+     * 状态
+     */
+    private Byte validStatus;
+    /**
+     * 出入库状态
+     */
+    private Byte irStatus;
+    /**
+     *  入库时间
+     */
+    private LocalDateTime wareHousingTime;
+    /**
+     * 出库时间
+     */
+    private LocalDateTime deliveryTime;
+    /**
+     * 安全物资字表id
+     */
+    private Long smId;
+    /**
+     * 认领人id
+     */
+    private Long claimantId;
+
+    /**
+     * 认领人姓名
+     */
+    private String claimantName;
+
+    /**
+     * 删除标识
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private int delFlag;
+    /**
+     * 创建人id
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private Long createUid;
+    /**
+     * 创建人姓名
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private String createUname;
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    public LocalDateTime createTime;
+    /**
+     * 修改人id
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    private Long updateUid;
+    /**
+     * 修改人姓名
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    private String updateUname;
+    /**
+     * 修改时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMaterialNo() {
+        return materialNo;
+    }
+
+    public void setMaterialNo(String materialNo) {
+        this.materialNo = materialNo;
+    }
+
+    public Long getMaterialClassifyId() {
+        return materialClassifyId;
+    }
+
+    public void setMaterialClassifyId(Long materialClassifyId) {
+        this.materialClassifyId = materialClassifyId;
+    }
+
+    public String getRfid() {
+        return rfid;
+    }
+
+    public void setRfid(String rfid) {
+        this.rfid = rfid;
+    }
+
+    public Byte getConsumable() {
+        return consumable;
+    }
+
+    public void setConsumable(Byte consumable) {
+        this.consumable = consumable;
+    }
+
+    public Byte getValidType() {
+        return validType;
+    }
+
+    public void setValidType(Byte validType) {
+        this.validType = validType;
+    }
+
+    public LocalDateTime getValidTime() {
+        return validTime;
+    }
+
+    public void setValidTime(LocalDateTime validTime) {
+        this.validTime = validTime;
+    }
+
+    public Byte getValidStatus() {
+        return validStatus;
+    }
+
+    public void setValidStatus(Byte validStatus) {
+        this.validStatus = validStatus;
+    }
+
+    public Byte getIrStatus() {
+        return irStatus;
+    }
+
+    public void setIrStatus(Byte irStatus) {
+        this.irStatus = irStatus;
+    }
+
+    public LocalDateTime getWareHousingTime() {
+        return wareHousingTime;
+    }
+
+    public void setWareHousingTime(LocalDateTime wareHousingTime) {
+        this.wareHousingTime = wareHousingTime;
+    }
+
+    public LocalDateTime getDeliveryTime() {
+        return deliveryTime;
+    }
+
+    public void setDeliveryTime(LocalDateTime deliveryTime) {
+        this.deliveryTime = deliveryTime;
+    }
+
+    public Long getSmId() {
+        return smId;
+    }
+
+    public void setSmId(Long smId) {
+        this.smId = smId;
+    }
+
+    public int getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(int delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    public Long getCreateUid() {
+        return createUid;
+    }
+
+    public void setCreateUid(Long createUid) {
+        this.createUid = createUid;
+    }
+
+    public String getCreateUname() {
+        return createUname;
+    }
+
+    public void setCreateUname(String createUname) {
+        this.createUname = createUname;
+    }
+
+    public LocalDateTime getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(LocalDateTime createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getUpdateUid() {
+        return updateUid;
+    }
+
+    public void setUpdateUid(Long updateUid) {
+        this.updateUid = updateUid;
+    }
+
+    public String getUpdateUname() {
+        return updateUname;
+    }
+
+    public void setUpdateUname(String updateUname) {
+        this.updateUname = updateUname;
+    }
+
+    public LocalDateTime getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(LocalDateTime updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public Long getClaimantId() {
+        return claimantId;
+    }
+
+    public void setClaimantId(Long claimantId) {
+        this.claimantId = claimantId;
+    }
+
+    public String getClaimantName() {
+        return claimantName;
+    }
+
+    public void setClaimantName(String claimantName) {
+        this.claimantName = claimantName;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailInfoDO.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailInfoDO.java
new file mode 100644
index 0000000..f86b007
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialDetailInfoDO.java
@@ -0,0 +1,230 @@
+package com.gkhy.safePlatform.equipment.entity;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalDateTime;
+
+public class SafeMaterialDetailInfoDO {
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 物资名称
+     */
+    private String name;
+    /**
+     * 物资编号
+     */
+    private String materialNo;
+    /**
+     * 物资类型id
+     */
+    private Long materialClassifyId;
+    /**
+     * 物资类型名称
+     */
+    private String materialClassifyName;
+    /**
+     * RFID
+     */
+    private String rfid;
+    /**
+     * 是否是耗材(0是, 1否)
+     */
+    private Byte consumable;
+    /**
+     * 部门名称
+     *
+     */
+    private String depName;
+    /**
+     * 部门id
+     */
+    private Long depId;
+    /**
+     * 保质期类型
+     */
+    private Byte validType;
+    /**
+     * 保质到期时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime validTime;
+    /**
+     * 状态
+     */
+    private Byte validStatus;
+    /**
+     * 出入库状态
+     */
+    private Byte irStatus;
+    /**
+     *  入库时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime wareHousingTime;
+    /**
+     * 出库时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime deliveryTime;
+    /**
+     * 安全物资字表id
+     */
+    private Long smId;
+    /**
+     * 认领人id
+     */
+    private Long claimantId;
+
+    /**
+     * 认领人姓名
+     */
+    private String claimantName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMaterialNo() {
+        return materialNo;
+    }
+
+    public void setMaterialNo(String materialNo) {
+        this.materialNo = materialNo;
+    }
+
+    public Long getMaterialClassifyId() {
+        return materialClassifyId;
+    }
+
+    public void setMaterialClassifyId(Long materialClassifyId) {
+        this.materialClassifyId = materialClassifyId;
+    }
+
+    public String getMaterialClassifyName() {
+        return materialClassifyName;
+    }
+
+    public void setMaterialClassifyName(String materialClassifyName) {
+        this.materialClassifyName = materialClassifyName;
+    }
+
+    public String getRfid() {
+        return rfid;
+    }
+
+    public void setRfid(String rfid) {
+        this.rfid = rfid;
+    }
+
+    public Byte getConsumable() {
+        return consumable;
+    }
+
+    public void setConsumable(Byte consumable) {
+        this.consumable = consumable;
+    }
+
+    public String getDepName() {
+        return depName;
+    }
+
+    public void setDepName(String depName) {
+        this.depName = depName;
+    }
+
+    public Long getDepId() {
+        return depId;
+    }
+
+    public void setDepId(Long depId) {
+        this.depId = depId;
+    }
+
+    public Byte getValidType() {
+        return validType;
+    }
+
+    public void setValidType(Byte validType) {
+        this.validType = validType;
+    }
+
+    public LocalDateTime getValidTime() {
+        return validTime;
+    }
+
+    public void setValidTime(LocalDateTime validTime) {
+        this.validTime = validTime;
+    }
+
+    public Byte getValidStatus() {
+        return validStatus;
+    }
+
+    public void setValidStatus(Byte validStatus) {
+        this.validStatus = validStatus;
+    }
+
+    public Byte getIrStatus() {
+        return irStatus;
+    }
+
+    public void setIrStatus(Byte irStatus) {
+        this.irStatus = irStatus;
+    }
+
+    public LocalDateTime getWareHousingTime() {
+        return wareHousingTime;
+    }
+
+    public void setWareHousingTime(LocalDateTime wareHousingTime) {
+        this.wareHousingTime = wareHousingTime;
+    }
+
+    public LocalDateTime getDeliveryTime() {
+        return deliveryTime;
+    }
+
+    public void setDeliveryTime(LocalDateTime deliveryTime) {
+        this.deliveryTime = deliveryTime;
+    }
+
+    public Long getSmId() {
+        return smId;
+    }
+
+    public void setSmId(Long smId) {
+        this.smId = smId;
+    }
+
+    public Long getClaimantId() {
+        return claimantId;
+    }
+
+    public void setClaimantId(Long claimantId) {
+        this.claimantId = claimantId;
+    }
+
+    public String getClaimantName() {
+        return claimantName;
+    }
+
+    public void setClaimantName(String claimantName) {
+        this.claimantName = claimantName;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialInfo.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialInfo.java
new file mode 100644
index 0000000..b432ae3
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/entity/SafeMaterialInfo.java
@@ -0,0 +1,194 @@
+package com.gkhy.safePlatform.equipment.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+@TableName("safe_material")
+public class SafeMaterialInfo implements Serializable {
+
+    private static final long serialVersionUID = -3147326241995464433L;
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    /**
+     * 物资序列号  (如果以后id使用雪花算法时候再启用该字段)
+     */
+    private String serialNum;
+    /**
+     * 物资类型id
+     */
+    private Long materialClassifyId;
+    /**
+     * 部门id
+     */
+    private Long depId;
+    /**
+     * 部门名称
+     */
+    private String depName;
+    /**
+     * 物资名称
+     */
+    private String materialName;
+    /**
+     * 是否是耗材(0是, 1否)
+     */
+    private Byte consumable;
+    /**
+     * 删除标识
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private int delFlag;
+    /**
+     * 创建人id
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private Long createUid;
+    /**
+     * 创建人姓名
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    private String createUname;
+    /**
+     * 创建时间
+     */
+    @TableField(fill = FieldFill.INSERT) //自动填充的注解
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    public LocalDateTime createTime;
+    /**
+     * 修改人id
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    private Long updateUid;
+    /**
+     * 修改人姓名
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    private String updateUname;
+    /**
+     * 修改时间
+     */
+    @TableField(fill = FieldFill.INSERT_UPDATE) //自动填充的注解
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime updateTime;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getSerialNum() {
+        return serialNum;
+    }
+
+    public void setSerialNum(String serialNum) {
+        this.serialNum = serialNum;
+    }
+
+    public Long getMaterialClassifyId() {
+        return materialClassifyId;
+    }
+
+    public void setMaterialClassifyId(Long materialClassifyId) {
+        this.materialClassifyId = materialClassifyId;
+    }
+
+    public Long getDepId() {
+        return depId;
+    }
+
+    public void setDepId(Long depId) {
+        this.depId = depId;
+    }
+
+    public String getDepName() {
+        return depName;
+    }
+
+    public void setDepName(String depName) {
+        this.depName = depName;
+    }
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+
+    public Byte getConsumable() {
+        return consumable;
+    }
+
+    public void setConsumable(Byte consumable) {
+        this.consumable = consumable;
+    }
+
+    public int getDelFlag() {
+        return delFlag;
+    }
+
+    public void setDelFlag(int delFlag) {
+        this.delFlag = delFlag;
+    }
+
+    public Long getCreateUid() {
+        return createUid;
+    }
+
+    public void setCreateUid(Long createUid) {
+        this.createUid = createUid;
+    }
+
+    public String getCreateUname() {
+        return createUname;
+    }
+
+    public void setCreateUname(String createUname) {
+        this.createUname = createUname;
+    }
+
+    public LocalDateTime getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(LocalDateTime createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getUpdateUid() {
+        return updateUid;
+    }
+
+    public void setUpdateUid(Long updateUid) {
+        this.updateUid = updateUid;
+    }
+
+    public String getUpdateUname() {
+        return updateUname;
+    }
+
+    public void setUpdateUname(String updateUname) {
+        this.updateUname = updateUname;
+    }
+
+    public LocalDateTime getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(LocalDateTime updateTime) {
+        this.updateTime = updateTime;
+    }
+
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ConsumableEnum.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ConsumableEnum.java
new file mode 100644
index 0000000..bcbedcb
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ConsumableEnum.java
@@ -0,0 +1,46 @@
+package com.gkhy.safePlatform.equipment.enums;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum ConsumableEnum {
+    YES((byte) 0, "是"),
+    NO((byte) 1, "否");
+
+    private Byte code;
+    private String value;
+
+    ConsumableEnum(Byte code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+    public Byte getCode() {
+        return code;
+    }
+
+    public void setCode(Byte code) {
+        this.code = code;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    // 转换成为 MAP<Byte, String>, 对外提供查询和遍历功能
+    public static Map<Byte, ConsumableEnum> toMap() {
+        Map<Byte, ConsumableEnum> map = new HashMap();
+        for (ConsumableEnum consumableEnum : ConsumableEnum.values()) {
+            map.put(consumableEnum.getCode(), consumableEnum);
+        }
+        return map;
+    }
+
+    public static ConsumableEnum getByCode(Byte code){
+        return toMap().get(code);
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/EquipmentResultCodes.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/EquipmentResultCodes.java
index e9f115c..5eb0eb2 100644
--- a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/EquipmentResultCodes.java
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/EquipmentResultCodes.java
@@ -10,6 +10,12 @@
 
     KEYPOINT_EQUIPMENT_ENUM_PART_TYPE_NOT_EXIST("K1001","重点设备装置部位分类类型异常"),
 
+    DATA_HAS_BEEN_BOND("E1004","数据已被绑定"),
+    DATA_NOT_EXIST("E1005","数据不存在"),
+    MATERIAL_INVALID("E1006","物资无效"),
+    MATERIAL_OUT_OF_LIBRARY("E1007","物资已出库,不可再次出库"),
+    MATERIAL_IN_THE_LIBRARY("E1007","物资已入库,不可再次入库"),
+
     ERROR("A3000", "未知错误");
 
     private String code;
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/IssueReceiptEnum.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/IssueReceiptEnum.java
new file mode 100644
index 0000000..7347bab
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/IssueReceiptEnum.java
@@ -0,0 +1,45 @@
+package com.gkhy.safePlatform.equipment.enums;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum IssueReceiptEnum {
+    IN_THE_LIBRARY((byte) 0, "在库"),
+    OUT_OF_LIBRARY((byte) 1, "已出库");
+    private Byte code;
+    private String value;
+
+    IssueReceiptEnum(Byte code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+    public Byte getCode() {
+        return code;
+    }
+
+    public void setCode(Byte code) {
+        this.code = code;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    // 转换成为 MAP<Byte, String>, 对外提供查询和遍历功能
+    public static Map<Byte, IssueReceiptEnum> toMap() {
+        Map<Byte, IssueReceiptEnum> map = new HashMap();
+        for (IssueReceiptEnum consumableEnum : IssueReceiptEnum.values()) {
+            map.put(consumableEnum.getCode(), consumableEnum);
+        }
+        return map;
+    }
+
+    public static IssueReceiptEnum getByCode(Byte code){
+        return toMap().get(code);
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ValidStatusEnum.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ValidStatusEnum.java
new file mode 100644
index 0000000..ba6840d
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ValidStatusEnum.java
@@ -0,0 +1,46 @@
+package com.gkhy.safePlatform.equipment.enums;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum ValidStatusEnum {
+    YES((byte) 0, "是"),
+    NO((byte) 1, "否");
+
+    private Byte code;
+    private String value;
+
+    ValidStatusEnum(Byte code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+    public Byte getCode() {
+        return code;
+    }
+
+    public void setCode(Byte code) {
+        this.code = code;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    // 转换成为 MAP<Byte, String>, 对外提供查询和遍历功能
+    public static Map<Byte, ValidStatusEnum> toMap() {
+        Map<Byte, ValidStatusEnum> map = new HashMap();
+        for (ValidStatusEnum consumableEnum : ValidStatusEnum.values()) {
+            map.put(consumableEnum.getCode(), consumableEnum);
+        }
+        return map;
+    }
+
+    public static ValidStatusEnum getByCode(Byte code){
+        return toMap().get(code);
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ValidTypeEnum.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ValidTypeEnum.java
new file mode 100644
index 0000000..e3e5fe8
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/enums/ValidTypeEnum.java
@@ -0,0 +1,46 @@
+package com.gkhy.safePlatform.equipment.enums;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public enum ValidTypeEnum {
+    LONG_TERM((byte) 0, "长期"),
+    SHORT_TERM((byte) 1, "非长期");
+
+    private Byte code;
+    private String value;
+
+    ValidTypeEnum(Byte code, String value) {
+        this.code = code;
+        this.value = value;
+    }
+
+    public Byte getCode() {
+        return code;
+    }
+
+    public void setCode(Byte code) {
+        this.code = code;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    // 转换成为 MAP<Byte, String>, 对外提供查询和遍历功能
+    public static Map<Byte, ValidTypeEnum> toMap() {
+        Map<Byte, ValidTypeEnum> map = new HashMap();
+        for (ValidTypeEnum consumableEnum : ValidTypeEnum.values()) {
+            map.put(consumableEnum.getCode(), consumableEnum);
+        }
+        return map;
+    }
+
+    public static ValidTypeEnum getByCode(Byte code){
+        return toMap().get(code);
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/excepiton/EquipmentException.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/excepiton/EquipmentException.java
index a9ffee4..d8088c8 100644
--- a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/excepiton/EquipmentException.java
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/excepiton/EquipmentException.java
@@ -17,6 +17,11 @@
         this.code = error.getCode();
         this.message = error.getDesc();
     }
+    public EquipmentException(EquipmentResultCodes equipmentResultCodes,String message) {
+        super(message);
+        this.code = equipmentResultCodes.getCode();
+        this.message = message;
+    }
 
     public EquipmentException(String code, String message) {
         super(message);
@@ -29,6 +34,11 @@
         this.code = clientParamIllegal.getCode();
         this.message = clientParamIllegal.getDesc();
     }
+    public EquipmentException(ResultCodes resultCodes,String message) {
+        super(message);
+        this.code = resultCodes.getCode();
+        this.message = message;
+    }
 
     public String getCode() {
         return this.code;
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/handler/MyMetaObjectHandler.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/handler/MyMetaObjectHandler.java
new file mode 100644
index 0000000..1a9d906
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/handler/MyMetaObjectHandler.java
@@ -0,0 +1,34 @@
+package com.gkhy.safePlatform.equipment.handler;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import com.gkhy.safePlatform.commons.co.ContextCacheUser;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+
+@Component
+public class MyMetaObjectHandler implements MetaObjectHandler {
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        ContextCacheUser currentUser = (ContextCacheUser) authentication.getPrincipal();
+        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐使用)
+        this.strictInsertFill(metaObject, "createUid", Long.class, currentUser.getUid());
+        this.strictInsertFill(metaObject, "createUname", String.class, currentUser.getUsername());
+        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
+        this.strictInsertFill(metaObject, "updateUid", Long.class, currentUser.getUid());
+        this.strictInsertFill(metaObject, "updateUname", String.class, currentUser.getUsername());
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+        ContextCacheUser currentUser = (ContextCacheUser) authentication.getPrincipal();
+        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); // 起始版本 3.3.0(推荐)
+        this.strictInsertFill(metaObject, "updateUid", Long.class, currentUser.getUid());
+        this.strictInsertFill(metaObject, "updateUname", String.class, currentUser.getUsername());
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/MterialDeliveryReq.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/MterialDeliveryReq.java
new file mode 100644
index 0000000..bda8a2d
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/MterialDeliveryReq.java
@@ -0,0 +1,28 @@
+package com.gkhy.safePlatform.equipment.model.dto.req;
+
+import javax.validation.constraints.NotNull;
+import java.lang.annotation.Native;
+import java.util.List;
+
+public class MterialDeliveryReq {
+    @NotNull(message = "主键不可为空!")
+    private List<Long> ids;
+    @NotNull(message = "认领人不可为空!")
+    private Long claimantId;
+
+    public List<Long> getIds() {
+        return ids;
+    }
+
+    public void setIds(List<Long> ids) {
+        this.ids = ids;
+    }
+
+    public Long getClaimantId() {
+        return claimantId;
+    }
+
+    public void setClaimantId(Long claimantId) {
+        this.claimantId = claimantId;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/MterialRandomDeliveryReq.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/MterialRandomDeliveryReq.java
new file mode 100644
index 0000000..722fb52
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/MterialRandomDeliveryReq.java
@@ -0,0 +1,38 @@
+package com.gkhy.safePlatform.equipment.model.dto.req;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+public class MterialRandomDeliveryReq {
+    @NotNull(message = "主键不可为空!")
+    private Integer count;
+    @NotNull(message = "认领人不可为空!")
+    private Long claimantId;
+
+    @NotNull(message = "物资主键不可为空!")
+    private Long smId;
+
+    public Long getSmId() {
+        return smId;
+    }
+
+    public void setSmId(Long smId) {
+        this.smId = smId;
+    }
+
+    public Long getClaimantId() {
+        return claimantId;
+    }
+
+    public void setClaimantId(Long claimantId) {
+        this.claimantId = claimantId;
+    }
+
+    public Integer getCount() {
+        return count;
+    }
+
+    public void setCount(Integer count) {
+        this.count = count;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialAddReq.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialAddReq.java
new file mode 100644
index 0000000..1c8641e
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialAddReq.java
@@ -0,0 +1,62 @@
+package com.gkhy.safePlatform.equipment.model.dto.req;
+
+import org.springframework.validation.annotation.Validated;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+public class SafeMaterialAddReq {
+    /**
+     * 物资类型id
+     */
+    @NotNull(message = "物资类型不可为空!")
+    private Long materialClassifyId;
+    /**
+     * 部门id
+     */
+    @NotNull(message = "所属部门不可为空!")
+    private Long depId;
+    /**
+     * 物资名称
+     */
+    @NotBlank(message = "安全物资名称不可为空!")
+    private String materialName;
+    /**
+     * 是否是耗材(0是, 1否)
+     */
+    @NotNull(message = "是否是耗材不可为空!")
+    private Byte consumable;
+
+    public Long getMaterialClassifyId() {
+        return materialClassifyId;
+    }
+
+    public void setMaterialClassifyId(Long materialClassifyId) {
+        this.materialClassifyId = materialClassifyId;
+    }
+
+    public Long getDepId() {
+        return depId;
+    }
+
+    public void setDepId(Long depId) {
+        this.depId = depId;
+    }
+
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+
+    public Byte getConsumable() {
+        return consumable;
+    }
+
+    public void setConsumable(Byte consumable) {
+        this.consumable = consumable;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyAddReq.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyAddReq.java
new file mode 100644
index 0000000..f7e6284
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyAddReq.java
@@ -0,0 +1,23 @@
+package com.gkhy.safePlatform.equipment.model.dto.req;
+
+
+import org.hibernate.validator.constraints.Length;
+import org.jetbrains.annotations.NotNull;
+
+import javax.validation.constraints.NotBlank;
+
+public class SafeMaterialClassifyAddReq {
+    /**
+     * 物资分类名称
+     */
+    @NotBlank(message = "物资名称不可为空")
+    private String materialClassifyName;
+
+    public String getMaterialClassifyName() {
+        return materialClassifyName;
+    }
+
+    public void setMaterialClassifyName(String materialClassifyName) {
+        this.materialClassifyName = materialClassifyName;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyModReq.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyModReq.java
new file mode 100644
index 0000000..33aa411
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyModReq.java
@@ -0,0 +1,34 @@
+package com.gkhy.safePlatform.equipment.model.dto.req;
+
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+public class SafeMaterialClassifyModReq {
+    /**
+     * 主键
+     */
+    @NotNull(message = "主键不可为空")
+    private Long id;
+    /**
+     * 物资分类名称
+     */
+    @NotBlank(message = "物资名称不可为空")
+    private String materialClassifyName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getMaterialClassifyName() {
+        return materialClassifyName;
+    }
+
+    public void setMaterialClassifyName(String materialClassifyName) {
+        this.materialClassifyName = materialClassifyName;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyQuery.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyQuery.java
new file mode 100644
index 0000000..551511c
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialClassifyQuery.java
@@ -0,0 +1,13 @@
+package com.gkhy.safePlatform.equipment.model.dto.req;
+
+public class SafeMaterialClassifyQuery {
+    private String materialClassifyName;
+
+    public String getMaterialClassifyName() {
+        return materialClassifyName;
+    }
+
+    public void setMaterialClassifyName(String materialClassifyName) {
+        this.materialClassifyName = materialClassifyName;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialDetailAddReq.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialDetailAddReq.java
new file mode 100644
index 0000000..001f192
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialDetailAddReq.java
@@ -0,0 +1,78 @@
+package com.gkhy.safePlatform.equipment.model.dto.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+public class SafeMaterialDetailAddReq {
+    @NotNull(message = "物资不可为空!")
+    private Long smId;
+    private String startRfid;
+    private String endRfid;
+    @NotNull(message = "入库数量不可为空!")
+    private Integer wareHousingCount;
+    @NotNull(message = "有效期类型不可为空!")
+    private Byte validType;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime validTime;
+
+    //rfid
+    private String rfid;
+
+    public Long getSmId() {
+        return smId;
+    }
+
+    public void setSmId(Long smId) {
+        this.smId = smId;
+    }
+
+    public String getStartRfid() {
+        return startRfid;
+    }
+
+    public void setStartRfid(String startRfid) {
+        this.startRfid = startRfid;
+    }
+
+    public String getEndRfid() {
+        return endRfid;
+    }
+
+    public void setEndRfid(String endRfid) {
+        this.endRfid = endRfid;
+    }
+
+    public Integer getWareHousingCount() {
+        return wareHousingCount;
+    }
+
+    public void setWareHousingCount(Integer wareHousingCount) {
+        this.wareHousingCount = wareHousingCount;
+    }
+
+    public Byte getValidType() {
+        return validType;
+    }
+
+    public void setValidType(Byte validType) {
+        this.validType = validType;
+    }
+
+    public LocalDateTime getValidTime() {
+        return validTime;
+    }
+
+    public void setValidTime(LocalDateTime validTime) {
+        this.validTime = validTime;
+    }
+
+    public String getRfid() {
+        return rfid;
+    }
+
+    public void setRfid(String rfid) {
+        this.rfid = rfid;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialDetailReq.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialDetailReq.java
new file mode 100644
index 0000000..53467ea
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialDetailReq.java
@@ -0,0 +1,111 @@
+package com.gkhy.safePlatform.equipment.model.dto.req;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import javax.validation.constraints.NotNull;
+import java.time.LocalDateTime;
+
+public class SafeMaterialDetailReq {
+    /**
+     * 主键
+     */
+    @NotNull(message = "主键不可为空!")
+    private Long id;
+
+    /**
+     * 物资类型id
+     */
+    private Long materialClassifyId;
+    /**
+     * RFID
+     */
+    private String rfid;
+
+    /**
+     * 保质期类型
+     */
+    private Byte validType;
+    /**
+     * 保质到期时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime validTime;
+    /**
+     * 出入库状态
+     */
+    private Byte irStatus;
+
+    /**
+     * 安全物资字表id
+     */
+    private Long smId;
+    /**
+     * 认领人id
+     */
+    private Long claimantId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getMaterialClassifyId() {
+        return materialClassifyId;
+    }
+
+    public void setMaterialClassifyId(Long materialClassifyId) {
+        this.materialClassifyId = materialClassifyId;
+    }
+
+    public String getRfid() {
+        return rfid;
+    }
+
+    public void setRfid(String rfid) {
+        this.rfid = rfid;
+    }
+
+    public Byte getValidType() {
+        return validType;
+    }
+
+    public void setValidType(Byte validType) {
+        this.validType = validType;
+    }
+
+    public LocalDateTime getValidTime() {
+        return validTime;
+    }
+
+    public void setValidTime(LocalDateTime validTime) {
+        this.validTime = validTime;
+    }
+
+    public Byte getIrStatus() {
+        return irStatus;
+    }
+
+    public void setIrStatus(Byte irStatus) {
+        this.irStatus = irStatus;
+    }
+
+    public Long getSmId() {
+        return smId;
+    }
+
+    public void setSmId(Long smId) {
+        this.smId = smId;
+    }
+
+    public Long getClaimantId() {
+        return claimantId;
+    }
+
+    public void setClaimantId(Long claimantId) {
+        this.claimantId = claimantId;
+    }
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialModReq.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialModReq.java
new file mode 100644
index 0000000..976cbe3
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialModReq.java
@@ -0,0 +1,69 @@
+package com.gkhy.safePlatform.equipment.model.dto.req;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+public class SafeMaterialModReq {
+    @NotNull(message = "主键不可为空!")
+    private Long id;
+    /**
+     * 物资类型id
+     */
+    @NotNull(message = "物资类型不可为空!")
+    private Long materialClassifyId;
+    /**
+     * 部门id
+     */
+    @NotNull(message = "所属部门不可为空!")
+    private Long depId;
+    /**
+     * 物资名称
+     */
+    @NotBlank(message = "安全物资名称不可为空!")
+    private String materialName;
+    /**
+     * 是否是耗材(0是, 1否)
+     */
+    @NotNull(message = "是否是耗材不可为空!")
+    private Byte consumable;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getMaterialClassifyId() {
+        return materialClassifyId;
+    }
+
+    public void setMaterialClassifyId(Long materialClassifyId) {
+        this.materialClassifyId = materialClassifyId;
+    }
+
+    public Long getDepId() {
+        return depId;
+    }
+
+    public void setDepId(Long depId) {
+        this.depId = depId;
+    }
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+
+    public Byte getConsumable() {
+        return consumable;
+    }
+
+    public void setConsumable(Byte consumable) {
+        this.consumable = consumable;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialQuery.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialQuery.java
new file mode 100644
index 0000000..9d6130f
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMaterialQuery.java
@@ -0,0 +1,28 @@
+package com.gkhy.safePlatform.equipment.model.dto.req;
+
+public class SafeMaterialQuery {
+    /**
+     * 物资类型id
+     */
+    private Long materialClassifyId;
+    /**
+     * 物资名称
+     */
+        private String materialName;
+
+    public Long getMaterialClassifyId() {
+        return materialClassifyId;
+    }
+
+    public void setMaterialClassifyId(Long materialClassifyId) {
+        this.materialClassifyId = materialClassifyId;
+    }
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMatetrialDetailQuery.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMatetrialDetailQuery.java
new file mode 100644
index 0000000..b12d628
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/req/SafeMatetrialDetailQuery.java
@@ -0,0 +1,22 @@
+package com.gkhy.safePlatform.equipment.model.dto.req;
+
+public class SafeMatetrialDetailQuery {
+    private Byte irStatus;
+    private String rfid;
+
+    public Byte getIrStatus() {
+        return irStatus;
+    }
+
+    public void setIrStatus(Byte irStatus) {
+        this.irStatus = irStatus;
+    }
+
+    public String getRfid() {
+        return rfid;
+    }
+
+    public void setRfid(String rfid) {
+        this.rfid = rfid;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/BaseMaterialDto.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/BaseMaterialDto.java
new file mode 100644
index 0000000..86907be
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/BaseMaterialDto.java
@@ -0,0 +1,24 @@
+package com.gkhy.safePlatform.equipment.model.dto.resp;
+
+public class BaseMaterialDto {
+    //物资设备id
+    private Long smId;
+    //物资名称
+    private String materialName;
+
+    public Long getSmId() {
+        return smId;
+    }
+
+    public void setSmId(Long smId) {
+        this.smId = smId;
+    }
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/MaterialClassificationDto.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/MaterialClassificationDto.java
new file mode 100644
index 0000000..f8d57a1
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/MaterialClassificationDto.java
@@ -0,0 +1,35 @@
+package com.gkhy.safePlatform.equipment.model.dto.resp;
+
+import java.util.List;
+
+public class MaterialClassificationDto {
+    //物资类型id
+    private Long materialClassifyId;
+    //物资类型名称
+    private String materialClassifyName;
+    private List<MaterialDepartmentDto> departmentList;
+
+    public Long getMaterialClassifyId() {
+        return materialClassifyId;
+    }
+
+    public void setMaterialClassifyId(Long materialClassifyId) {
+        this.materialClassifyId = materialClassifyId;
+    }
+
+    public String getMaterialClassifyName() {
+        return materialClassifyName;
+    }
+
+    public void setMaterialClassifyName(String materialClassifyName) {
+        this.materialClassifyName = materialClassifyName;
+    }
+
+    public List<MaterialDepartmentDto> getDepartmentList() {
+        return departmentList;
+    }
+
+    public void setDepartmentList(List<MaterialDepartmentDto> departmentList) {
+        this.departmentList = departmentList;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/MaterialDepartmentDto.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/MaterialDepartmentDto.java
new file mode 100644
index 0000000..989d7be
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/MaterialDepartmentDto.java
@@ -0,0 +1,36 @@
+package com.gkhy.safePlatform.equipment.model.dto.resp;
+
+import java.util.List;
+
+public class MaterialDepartmentDto {
+    //部门id
+    private Long depId;
+    //部门名称
+    private String depName;
+    //基础物资设备
+    private List<BaseMaterialDto> baseMaterialList;
+
+    public Long getDepId() {
+        return depId;
+    }
+
+    public void setDepId(Long depId) {
+        this.depId = depId;
+    }
+
+    public String getDepName() {
+        return depName;
+    }
+
+    public void setDepName(String depName) {
+        this.depName = depName;
+    }
+
+    public List<BaseMaterialDto> getBaseMaterialList() {
+        return baseMaterialList;
+    }
+
+    public void setBaseMaterialList(List<BaseMaterialDto> baseMaterialList) {
+        this.baseMaterialList = baseMaterialList;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialClassifyDto.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialClassifyDto.java
new file mode 100644
index 0000000..058fb30
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialClassifyDto.java
@@ -0,0 +1,22 @@
+package com.gkhy.safePlatform.equipment.model.dto.resp;
+
+public class SafeMaterialClassifyDto {
+    private Long id;
+    private String materialClassifyName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getMaterialClassifyName() {
+        return materialClassifyName;
+    }
+
+    public void setMaterialClassifyName(String materialClassifyName) {
+        this.materialClassifyName = materialClassifyName;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialDetailDto.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialDetailDto.java
new file mode 100644
index 0000000..b6478e8
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialDetailDto.java
@@ -0,0 +1,215 @@
+package com.gkhy.safePlatform.equipment.model.dto.resp;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.time.LocalDateTime;
+
+public class SafeMaterialDetailDto {
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 物资名称
+     */
+    private String name;
+    /**
+     * 物资编号
+     */
+    private String materialNo;
+    /**
+     * 物资类型名称
+     */
+    private String materialClassifyName;
+    /**
+     * 部门名称
+     */
+    private String depName;
+    /**
+     * RFID
+     */
+    private String rfid;
+    /**
+     * 耗材类型名称
+     */
+    private String consumableName;
+    /**
+     * 保质期类型
+     */
+    private Byte validType;
+    /**
+     * 保质期类型中文
+     */
+    private String validTypeName;
+    /**
+     * 保质到期时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime validTime;
+    /**
+     * 状态
+     */
+    private Byte validStatus;
+    /**
+     * 有效状态
+     */
+    private String validStatusName;
+    /**
+     * 出入库状态
+     */
+    private Byte irStatus;
+    /**
+     * 出入库状态中文
+     */
+    private String irStatusName;
+    /**
+     *  入库时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime wareHousingTime;
+    /**
+     * 出库时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime deliveryTime;
+
+    /**
+     * 认领人姓名
+     */
+    private String claimantName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getMaterialNo() {
+        return materialNo;
+    }
+
+    public void setMaterialNo(String materialNo) {
+        this.materialNo = materialNo;
+    }
+
+    public String getDepName() {
+        return depName;
+    }
+
+    public void setDepName(String depName) {
+        this.depName = depName;
+    }
+
+    public String getRfid() {
+        return rfid;
+    }
+
+    public void setRfid(String rfid) {
+        this.rfid = rfid;
+    }
+
+    public String getMaterialClassifyName() {
+        return materialClassifyName;
+    }
+
+    public void setMaterialClassifyName(String materialClassifyName) {
+        this.materialClassifyName = materialClassifyName;
+    }
+
+    public String getConsumableName() {
+        return consumableName;
+    }
+
+    public void setConsumableName(String consumableName) {
+        this.consumableName = consumableName;
+    }
+
+    public Byte getValidType() {
+        return validType;
+    }
+
+    public void setValidType(Byte validType) {
+        this.validType = validType;
+    }
+
+    public LocalDateTime getValidTime() {
+        return validTime;
+    }
+
+    public void setValidTime(LocalDateTime validTime) {
+        this.validTime = validTime;
+    }
+
+    public Byte getValidStatus() {
+        return validStatus;
+    }
+
+    public void setValidStatus(Byte validStatus) {
+        this.validStatus = validStatus;
+    }
+
+    public String getValidStatusName() {
+        return validStatusName;
+    }
+
+    public void setValidStatusName(String validStatusName) {
+        this.validStatusName = validStatusName;
+    }
+
+    public Byte getIrStatus() {
+        return irStatus;
+    }
+
+    public void setIrStatus(Byte irStatus) {
+        this.irStatus = irStatus;
+    }
+
+    public String getIrStatusName() {
+        return irStatusName;
+    }
+
+    public void setIrStatusName(String irStatusName) {
+        this.irStatusName = irStatusName;
+    }
+
+    public LocalDateTime getWareHousingTime() {
+        return wareHousingTime;
+    }
+
+    public void setWareHousingTime(LocalDateTime wareHousingTime) {
+        this.wareHousingTime = wareHousingTime;
+    }
+
+    public LocalDateTime getDeliveryTime() {
+        return deliveryTime;
+    }
+
+    public void setDeliveryTime(LocalDateTime deliveryTime) {
+        this.deliveryTime = deliveryTime;
+    }
+
+    public String getClaimantName() {
+        return claimantName;
+    }
+
+    public void setClaimantName(String claimantName) {
+        this.claimantName = claimantName;
+    }
+
+    public String getValidTypeName() {
+        return validTypeName;
+    }
+
+    public void setValidTypeName(String validTypeName) {
+        this.validTypeName = validTypeName;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialDto.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialDto.java
new file mode 100644
index 0000000..4bd30ce
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/model/dto/resp/SafeMaterialDto.java
@@ -0,0 +1,126 @@
+package com.gkhy.safePlatform.equipment.model.dto.resp;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+public class SafeMaterialDto {
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.AUTO)
+    private Long id;
+    /**
+     * 物资序列号  (如果以后id使用雪花算法时候再启用该字段)
+     */
+    private String serialNum;
+    /**
+     * 物资类型id
+     */
+    private Long materialClassifyId;
+
+    private String materialClassifyName;
+    /**
+     * 部门id
+     */
+    private Long depId;
+    /**
+     * 部门名称
+     */
+    private String depName;
+    /**
+     * 物资名称
+     */
+    private String materialName;
+    /**
+     * 是否是耗材(0是, 1否)
+     */
+    private Byte consumable;
+    private String consumableName;
+
+    /**
+     * 有效库存数量
+     */
+    private Integer validStockCount;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getSerialNum() {
+        return serialNum;
+    }
+
+    public void setSerialNum(String serialNum) {
+        this.serialNum = serialNum;
+    }
+
+    public Long getMaterialClassifyId() {
+        return materialClassifyId;
+    }
+
+    public void setMaterialClassifyId(Long materialClassifyId) {
+        this.materialClassifyId = materialClassifyId;
+    }
+
+    public String getMaterialClassifyName() {
+        return materialClassifyName;
+    }
+
+    public void setMaterialClassifyName(String materialClassifyName) {
+        this.materialClassifyName = materialClassifyName;
+    }
+
+    public Long getDepId() {
+        return depId;
+    }
+
+    public void setDepId(Long depId) {
+        this.depId = depId;
+    }
+
+    public String getDepName() {
+        return depName;
+    }
+
+    public void setDepName(String depName) {
+        this.depName = depName;
+    }
+
+    public String getMaterialName() {
+        return materialName;
+    }
+
+    public void setMaterialName(String materialName) {
+        this.materialName = materialName;
+    }
+
+    public Byte getConsumable() {
+        return consumable;
+    }
+
+    public void setConsumable(Byte consumable) {
+        this.consumable = consumable;
+    }
+
+    public String getConsumableName() {
+        return consumableName;
+    }
+
+    public void setConsumableName(String consumableName) {
+        this.consumableName = consumableName;
+    }
+
+    public Integer getValidStockCount() {
+        return validStockCount;
+    }
+
+    public void setValidStockCount(Integer validStockCount) {
+        this.validStockCount = validStockCount;
+    }
+
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/mq/consumer/SafeMaterialConsumer.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/mq/consumer/SafeMaterialConsumer.java
new file mode 100644
index 0000000..e70357a
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/mq/consumer/SafeMaterialConsumer.java
@@ -0,0 +1,72 @@
+package com.gkhy.safePlatform.equipment.mq.consumer;
+
+import com.gkhy.safePlatform.commons.utils.CalcuteDelayLevelUtils;
+import com.gkhy.safePlatform.commons.utils.JsonUtils;
+
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailInfo;
+import com.gkhy.safePlatform.equipment.enums.ValidStatusEnum;
+import com.gkhy.safePlatform.equipment.mq.msg.SafeMaterialMsg;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialDetailInfoService;
+import org.apache.rocketmq.client.producer.SendResult;
+import org.apache.rocketmq.client.producer.SendStatus;
+import org.apache.rocketmq.common.message.MessageExt;
+import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
+import org.apache.rocketmq.spring.core.RocketMQListener;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+
+@Service
+@RocketMQMessageListener(topic = "${rocketmq.topic.safeMaterialTopic}",consumerGroup = "${rocketmq.consumer.safeMaterialGroup}")
+public class SafeMaterialConsumer implements RocketMQListener<MessageExt> {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Value("${rocketmq.topic.safeMaterialTopic}")
+    private String safeMaterialTopic;
+
+    @Autowired
+    private RocketMQTemplate rocketMQTemplate;
+
+    @Autowired
+    private SafeMaterialDetailInfoService safeMaterialDetailInfoService;
+
+
+    @Override
+    @Transactional
+    public void onMessage(MessageExt message) {
+        try{
+            SafeMaterialMsg msg = JsonUtils.parse(new String(message.getBody(), StandardCharsets.UTF_8),SafeMaterialMsg.class);
+            if(null != msg && msg.getId()>0){
+                //当前时间早于目标处理时间前0秒
+                Long relaySeconds = (msg.getValidTime().getTime() - new Date().getTime())/1000;
+                if(relaySeconds>0){
+                    //重发消息,实现连续延时
+                    Message reMsg = MessageBuilder.withPayload(msg).build();
+                    SendResult sendResult = rocketMQTemplate.syncSend(safeMaterialTopic, reMsg, 10000, CalcuteDelayLevelUtils.calcuteDelayLevel(relaySeconds));
+                    if(sendResult.getSendStatus() != SendStatus.SEND_OK){
+                        throw new RuntimeException("【安全物资管理】重发消息失败" + msg.getId()+ "MSG_ID: "+ message.getMsgId());
+                    }
+                }else{//超时
+                    SafeMaterialDetailInfo materialDetailInfo = safeMaterialDetailInfoService.queryById(msg.getId());
+                    if(null != materialDetailInfo){
+                        safeMaterialDetailInfoService.updateValidStatus(msg.getId());
+                        logger.info("物资详细数据id:"+msg.getId()+" 物资过期!");
+
+                    }
+                }
+
+            }
+        }catch (Exception e){
+            logger.error("【安全物资和设备管理】消息消费异常!"+ "MSG_ID: "+ message.getMsgId()+e);
+        }
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/mq/msg/SafeMaterialMsg.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/mq/msg/SafeMaterialMsg.java
new file mode 100644
index 0000000..23b36bf
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/mq/msg/SafeMaterialMsg.java
@@ -0,0 +1,46 @@
+package com.gkhy.safePlatform.equipment.mq.msg;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+public class SafeMaterialMsg {
+    /**
+     * 主键
+     */
+    private Long id ;
+
+    /**
+     * 有效类型
+     */
+    private Byte validStatus;
+    /**
+     * 有效期
+     */
+    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
+    private Date validTime;
+
+    public Byte getValidStatus() {
+        return validStatus;
+    }
+
+    public void setValidStatus(Byte validStatus) {
+        this.validStatus = validStatus;
+    }
+
+    public Date getValidTime() {
+        return validTime;
+    }
+
+    public void setValidTime(Date validTime) {
+        this.validTime = validTime;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialClassifyInfoRepository.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialClassifyInfoRepository.java
new file mode 100644
index 0000000..4e6244f
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialClassifyInfoRepository.java
@@ -0,0 +1,17 @@
+package com.gkhy.safePlatform.equipment.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialClassifyInfo;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SafeMaterialClassifyInfoRepository extends BaseMapper<SafeMaterialClassifyInfo> {
+
+    int save(SafeMaterialClassifyInfo classifyInfo);
+
+    int update(SafeMaterialClassifyInfo classifyInfo);
+
+    SafeMaterialClassifyInfo queryById(@Param("id") Long id);
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialDetailInfoRepository.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialDetailInfoRepository.java
new file mode 100644
index 0000000..4dddeca
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialDetailInfoRepository.java
@@ -0,0 +1,46 @@
+package com.gkhy.safePlatform.equipment.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailBO;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailInfo;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailCountDO;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailInfoDO;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMatetrialDetailQuery;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Repository
+public interface SafeMaterialDetailInfoRepository extends BaseMapper<SafeMaterialDetailInfo> {
+    Integer getTotalCount();
+
+    SafeMaterialDetailInfo queryById(Long id);
+    void updateReceiptStatus(@Param("id") Long id, @Param("status") Byte status,@Param("wareHousingTime") LocalDateTime wareHousingTime);
+
+    List<SafeMaterialDetailInfo> getListByIds(List<Long> ids);
+
+    void updateReceiptStatusByIds(@Param("ids") List<Long> ids, @Param("irStatus") Byte irStatus, @Param("wareHousingTime")LocalDateTime wareHousingTime);
+
+    List<SafeMaterialDetailCountDO> getCountGroupBySmId(@Param("ids") List<Long> ids, @Param("irStatus") Byte irStatus);
+
+    List<SafeMaterialDetailCountDO> getStatisticsValidStock(@Param("smIds") List<Long> smIds,@Param("validStatus") Byte validStatus,@Param("irStatus") Byte irStatus);
+
+    void deleteBatch(Long[] ids);
+
+    void updateDeliveryStatusByIds(@Param("detailBO")SafeMaterialDetailBO detailBO);
+
+    void deliveryBatchRandom(@Param("detailBO")SafeMaterialDetailBO detailBO);
+
+    Integer getValidStockCount(@Param("smId")Long smId, @Param("validStatus")Byte validStatus, @Param("irStatus")Byte irStatus);
+
+    List<SafeMaterialDetailInfoDO> listByCondition(Page<SafeMaterialDetailInfo> page, @Param("query") SafeMatetrialDetailQuery query);
+
+    int getCountBySmIds(@Param("smIds") List<Long> smIds);
+
+    int getCountBySmId(Long smId);
+
+    void updateValidStatus(@Param("id") Long id, @Param("validStatus")Byte validStatus);
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialInfoRepository.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialInfoRepository.java
new file mode 100644
index 0000000..08938b6
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/repository/SafeMaterialInfoRepository.java
@@ -0,0 +1,27 @@
+package com.gkhy.safePlatform.equipment.repository;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDO;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialInfo;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialQuery;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SafeMaterialInfoRepository extends BaseMapper<SafeMaterialInfo> {
+
+    SafeMaterialInfo queryById(Long id);
+
+    int getTotalCount();
+
+    int getCountByClassify(Long classifyId);
+
+    int deleteBatch(List<Long> ids);
+
+    List<SafeMaterialDO> listByConditions(Page<SafeMaterialDO> page, @Param("query") SafeMaterialQuery query);
+
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/MaterialClassifyService.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/MaterialClassifyService.java
new file mode 100644
index 0000000..bc84115
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/MaterialClassifyService.java
@@ -0,0 +1,22 @@
+package com.gkhy.safePlatform.equipment.service;
+
+import com.gkhy.safePlatform.commons.co.ContextCacheUser;
+import com.gkhy.safePlatform.commons.vo.ResultVO;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialClassifyAddReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialClassifyModReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialClassifyQuery;
+import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialClassifyDto;
+
+import java.util.List;
+
+public interface MaterialClassifyService {
+    ResultVO<List<SafeMaterialClassifyDto>> list(SafeMaterialClassifyQuery query);
+
+    ResultVO save(ContextCacheUser currentUser, SafeMaterialClassifyAddReq req);
+
+    ResultVO update(ContextCacheUser currentUser, SafeMaterialClassifyModReq req);
+
+    ResultVO delete(Long id);
+
+    ResultVO<SafeMaterialClassifyDto> queryById(Long id);
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/SafeMaterialDetailService.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/SafeMaterialDetailService.java
new file mode 100644
index 0000000..89985a2
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/SafeMaterialDetailService.java
@@ -0,0 +1,38 @@
+package com.gkhy.safePlatform.equipment.service;
+
+import com.gkhy.safePlatform.commons.query.PageQuery;
+import com.gkhy.safePlatform.commons.vo.ResultVO;
+import com.gkhy.safePlatform.commons.vo.SearchResultVO;
+import com.gkhy.safePlatform.equipment.model.dto.req.*;
+import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialDetailDto;
+
+import java.util.List;
+
+public interface SafeMaterialDetailService {
+    ResultVO save(SafeMaterialDetailAddReq req);
+
+    ResultVO singleDelivery(SafeMaterialDetailReq req);
+
+    ResultVO singleReceipt(Long id);
+
+    ResultVO delete(Long id);
+
+    ResultVO singleDdelivery0rReceipt(SafeMaterialDetailReq req);
+
+    ResultVO saveBatch(SafeMaterialDetailAddReq req);
+
+    ResultVO update(SafeMaterialDetailReq req);
+
+    ResultVO receiptBatch(Long[] ids);
+
+    ResultVO deleteBatch(Long[] ids);
+
+    ResultVO deliveryBatchByIds(MterialDeliveryReq req);
+
+    ResultVO deliveryBatchRandom(MterialRandomDeliveryReq req);
+
+    SearchResultVO<List<SafeMaterialDetailDto>> listByPage(PageQuery<SafeMatetrialDetailQuery> pageQuery);
+
+    ResultVO queryById(Long id);
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/SafeMaterialService.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/SafeMaterialService.java
new file mode 100644
index 0000000..6acc8c0
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/SafeMaterialService.java
@@ -0,0 +1,26 @@
+package com.gkhy.safePlatform.equipment.service;
+
+import com.gkhy.safePlatform.commons.query.PageQuery;
+import com.gkhy.safePlatform.commons.vo.ResultVO;
+import com.gkhy.safePlatform.commons.vo.SearchResultVO;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialAddReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialModReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialQuery;
+import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialDto;
+
+import java.util.List;
+
+public interface SafeMaterialService {
+    ResultVO save(SafeMaterialAddReq req);
+
+    ResultVO update(SafeMaterialModReq req);
+
+    ResultVO queryById(Long id);
+    
+    ResultVO delete(Long id);
+
+    ResultVO deleteBatch(Long[] ids);
+
+    ResultVO list();
+    SearchResultVO<List<SafeMaterialDto>> listByPage(PageQuery<SafeMaterialQuery> pageQuery);
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialClassifyInfoService.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialClassifyInfoService.java
new file mode 100644
index 0000000..ba1af0a
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialClassifyInfoService.java
@@ -0,0 +1,21 @@
+package com.gkhy.safePlatform.equipment.service.baseService;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialClassifyInfo;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialClassifyQuery;
+import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialClassifyDto;
+
+import java.util.List;
+
+public interface SafeMaterialClassifyInfoService extends IService<SafeMaterialClassifyInfo> {
+    SafeMaterialClassifyInfo queryById(Long id);
+
+
+    boolean save(SafeMaterialClassifyInfo classifyInfo);
+
+    int update(SafeMaterialClassifyInfo classifyInfo);
+
+    List<SafeMaterialClassifyInfo> listByCondition(SafeMaterialClassifyQuery query);
+
+    List<SafeMaterialClassifyInfo> getList();
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialDetailInfoService.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialDetailInfoService.java
new file mode 100644
index 0000000..b32d6ce
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialDetailInfoService.java
@@ -0,0 +1,45 @@
+package com.gkhy.safePlatform.equipment.service.baseService;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailBO;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailInfo;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailCountDO;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailInfoDO;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMatetrialDetailQuery;
+
+import java.util.List;
+
+public interface SafeMaterialDetailInfoService extends IService<SafeMaterialDetailInfo> {
+
+    Integer getTotalCount();
+
+    SafeMaterialDetailInfo queryById(Long id);
+
+    void updateReceiptStatus(Long id, Byte status);
+
+    List<SafeMaterialDetailInfo> getListByIds(List<Long> ids);
+
+    void updateReceiptStatusByIds(List<Long> ids, Byte irStatus);
+
+    List<SafeMaterialDetailCountDO> getCountGroupBySmId(List<Long> ids, Byte irStatus);
+
+    List<SafeMaterialDetailCountDO> getStatisticsValidStock(List<Long> smIds);
+
+    void deleteBatch(Long[] ids);
+
+    void updateDeliveryStatusByIds(SafeMaterialDetailBO detailBO);
+
+    void deliveryBatchRandom(SafeMaterialDetailBO detailBO);
+
+
+    Integer getValidStockCount(Long smId);
+
+    List<SafeMaterialDetailInfoDO> listByPage(Page<SafeMaterialDetailInfo> page, SafeMatetrialDetailQuery query);
+
+    int getCountBySmIds(List<Long> smIds);
+
+    int getCountBySmId(Long smId);
+
+    void updateValidStatus(Long id);
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialInfoService.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialInfoService.java
new file mode 100644
index 0000000..c12986a
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/SafeMaterialInfoService.java
@@ -0,0 +1,25 @@
+package com.gkhy.safePlatform.equipment.service.baseService;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDO;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialInfo;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialQuery;
+
+import java.util.List;
+
+public interface SafeMaterialInfoService extends IService<SafeMaterialInfo> {
+    int getTotalCount();
+
+    SafeMaterialInfo queryById(Long id);
+
+    int getCountByClassify(Long classifyId);
+
+    int deleteBatch(List<Long> ids);
+
+    List<SafeMaterialInfo> list();
+
+    List<SafeMaterialDO> listByPage(Page<SafeMaterialDO> page, SafeMaterialQuery query);
+
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialClassifyInfoServiceImpl.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialClassifyInfoServiceImpl.java
new file mode 100644
index 0000000..a5a0d15
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialClassifyInfoServiceImpl.java
@@ -0,0 +1,63 @@
+package com.gkhy.safePlatform.equipment.service.baseService.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.safePlatform.commons.enums.ResultCodes;
+import com.gkhy.safePlatform.commons.utils.StringUtils;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialClassifyInfo;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialInfo;
+import com.gkhy.safePlatform.equipment.excepiton.EquipmentException;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialClassifyQuery;
+import com.gkhy.safePlatform.equipment.repository.SafeMaterialClassifyInfoRepository;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialClassifyInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service("SafeMaterialClassifyInfoService")
+public class SafeMaterialClassifyInfoServiceImpl extends ServiceImpl<SafeMaterialClassifyInfoRepository, SafeMaterialClassifyInfo> implements SafeMaterialClassifyInfoService {
+   @Autowired
+   private SafeMaterialClassifyInfoRepository repository;
+   @Override
+   public boolean save(SafeMaterialClassifyInfo classifyInfo) {
+       boolean flag = true;
+       int i = repository.save(classifyInfo);
+       if(i == 0){
+           flag = false;
+       }
+        return flag;
+   }
+
+    //@Override
+    public int update(SafeMaterialClassifyInfo classifyInfo) {
+       if(classifyInfo.getId() == null){
+           throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+       }
+        int i = repository.update(classifyInfo);
+        return i;
+    }
+
+
+    @Override
+    public SafeMaterialClassifyInfo queryById(Long id) {
+       if(id == null){
+           throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+       }
+        return repository.queryById(id);
+    }
+    @Override
+    public List<SafeMaterialClassifyInfo> listByCondition(SafeMaterialClassifyQuery query){
+        List<SafeMaterialClassifyInfo> list = repository.selectList(new LambdaQueryWrapper<SafeMaterialClassifyInfo>()
+                .eq(SafeMaterialClassifyInfo::getDelFlag, 0)
+                .like(StringUtils.isNotBlank(query.getMaterialClassifyName()), SafeMaterialClassifyInfo::getMaterialClassifyName, query.getMaterialClassifyName())
+        );
+        return list;
+    }
+
+    @Override
+    public List<SafeMaterialClassifyInfo> getList(){
+        List<SafeMaterialClassifyInfo> list = repository.selectList(new LambdaQueryWrapper<SafeMaterialClassifyInfo>());
+        return list;
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialDetailInfoServiceImpl.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialDetailInfoServiceImpl.java
new file mode 100644
index 0000000..1107562
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialDetailInfoServiceImpl.java
@@ -0,0 +1,147 @@
+package com.gkhy.safePlatform.equipment.service.baseService.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.safePlatform.commons.enums.ResultCodes;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailBO;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailInfo;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailCountDO;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailInfoDO;
+import com.gkhy.safePlatform.equipment.enums.IssueReceiptEnum;
+import com.gkhy.safePlatform.equipment.enums.ValidStatusEnum;
+import com.gkhy.safePlatform.equipment.excepiton.EquipmentException;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMatetrialDetailQuery;
+import com.gkhy.safePlatform.equipment.repository.SafeMaterialDetailInfoRepository;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialDetailInfoService;
+import jodd.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service("SafeMaterialDetailInfoService")
+public class SafeMaterialDetailInfoServiceImpl extends ServiceImpl<SafeMaterialDetailInfoRepository, SafeMaterialDetailInfo> implements SafeMaterialDetailInfoService {
+    @Autowired
+    private SafeMaterialDetailInfoRepository repository;
+    @Override
+    public Integer getTotalCount() {
+        return repository.getTotalCount();
+    }
+
+    @Override
+    public SafeMaterialDetailInfo queryById(Long id) {
+        if(null == id){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        return repository.queryById(id);
+    }
+
+    @Override
+    public void updateReceiptStatus(Long id, Byte status) {
+        if(null == id || null == status){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        repository.updateReceiptStatus(id,status,LocalDateTime.now());
+    }
+
+    @Override
+    public List<SafeMaterialDetailInfo> getListByIds(List<Long> ids) {
+        if(CollectionUtils.isEmpty(ids)){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        return repository.getListByIds(ids);
+
+    }
+
+    @Override
+    public void updateReceiptStatusByIds(List<Long> ids, Byte irStatus) {
+        if(CollectionUtils.isEmpty(ids) || null == irStatus){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        repository.updateReceiptStatusByIds(ids,irStatus,LocalDateTime.now());
+    }
+
+    @Override
+    public List<SafeMaterialDetailCountDO> getCountGroupBySmId(List<Long> ids, Byte irStatus) {
+        if(!CollectionUtils.isEmpty(ids) || null == irStatus){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        return repository.getCountGroupBySmId(ids,irStatus);
+    }
+
+    @Override
+    public List<SafeMaterialDetailCountDO> getStatisticsValidStock(List<Long> smIds) {
+        return repository.getStatisticsValidStock(smIds, ValidStatusEnum.YES.getCode(), IssueReceiptEnum.IN_THE_LIBRARY.getCode());
+    }
+
+    @Override
+    public void deleteBatch(Long[] ids) {
+        if(ids.length == 0){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        repository.deleteBatch(ids);
+    }
+
+    @Override
+    public void updateDeliveryStatusByIds(SafeMaterialDetailBO detailBO) {
+        if(CollectionUtils.isEmpty(detailBO.getIds()) || null == detailBO.getClaimantId() || StringUtil.isBlank(detailBO.getClaimantName())){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        detailBO.setIrStatus(IssueReceiptEnum.OUT_OF_LIBRARY.getCode());
+        detailBO.setDeliveryTime(LocalDateTime.now());
+        repository.updateDeliveryStatusByIds(detailBO);
+    }
+
+    @Override
+    public void deliveryBatchRandom(SafeMaterialDetailBO detailBO) {
+        if(null == detailBO.getCount() || null == detailBO.getClaimantId() || StringUtil.isBlank(detailBO.getClaimantName())){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        detailBO.setIrStatus(IssueReceiptEnum.OUT_OF_LIBRARY.getCode());
+        detailBO.setDeliveryTime(LocalDateTime.now());
+        repository.deliveryBatchRandom(detailBO);
+    }
+
+    @Override
+    public Integer getValidStockCount(Long smId) {
+        if(null == smId){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        Integer count = repository.getValidStockCount(smId,ValidStatusEnum.YES.getCode(),IssueReceiptEnum.IN_THE_LIBRARY.getCode());
+        return count;
+    }
+
+    @Override
+    public List<SafeMaterialDetailInfoDO> listByPage(Page<SafeMaterialDetailInfo> page, SafeMatetrialDetailQuery query) {
+
+        return repository.listByCondition(page,query);
+    }
+
+    @Override
+    public int getCountBySmIds(List<Long> smIds) {
+        if(null == smIds || smIds.size() == 0){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        return repository.getCountBySmIds(smIds);
+    }
+
+    @Override
+    public int getCountBySmId(Long smId) {
+        if(null == smId){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        return repository.getCountBySmId(smId);
+    }
+
+    @Override
+    public void updateValidStatus(Long id) {
+        if(null == id){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        repository.updateValidStatus(id,ValidStatusEnum.NO.getCode());
+    }
+
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialInfoServiceImpl.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialInfoServiceImpl.java
new file mode 100644
index 0000000..6c6d4cd
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/baseService/impl/SafeMaterialInfoServiceImpl.java
@@ -0,0 +1,80 @@
+package com.gkhy.safePlatform.equipment.service.baseService.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gkhy.safePlatform.commons.enums.ResultCodes;
+import com.gkhy.safePlatform.commons.utils.StringUtils;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialCountDO;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialDO;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialInfo;
+import com.gkhy.safePlatform.equipment.excepiton.EquipmentException;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialQuery;
+import com.gkhy.safePlatform.equipment.repository.SafeMaterialInfoRepository;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service("SafeMaterialInfoService")
+public class SafeMaterialInfoServiceImpl extends ServiceImpl<SafeMaterialInfoRepository, SafeMaterialInfo> implements SafeMaterialInfoService {
+    @Autowired
+    private SafeMaterialInfoRepository repository;
+    /**
+     * 获取所有数据,包括被删除的
+     * @return
+     */
+    @Override
+    public int getTotalCount() {
+        return repository.getTotalCount();
+    }
+
+    @Override
+    public SafeMaterialInfo queryById(Long id) {
+        if(null == id){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        SafeMaterialInfo safeMaterialInfo = repository.selectOne(new LambdaQueryWrapper<SafeMaterialInfo>()
+                .eq(SafeMaterialInfo::getId, id)
+                .eq(SafeMaterialInfo::getDelFlag, 0)
+        );
+        return safeMaterialInfo;
+    }
+
+    /**
+     * 根据类型统计数据
+     */
+    @Override
+    public int getCountByClassify(Long classifyId){
+        if(null == classifyId){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        return repository.getCountByClassify(classifyId);
+    }
+
+    @Override
+    public int deleteBatch(List<Long> ids) {
+        if(null == ids || ids.size() == 0){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        repository.deleteBatch(ids);
+        return 0;
+    }
+
+    @Override
+    public List<SafeMaterialInfo> list(){
+        List<SafeMaterialInfo> safeMaterialInfos = repository.selectList(new LambdaQueryWrapper<SafeMaterialInfo>()
+                .eq(SafeMaterialInfo::getDelFlag, 0));
+        return safeMaterialInfos;
+
+    }
+
+    @Override
+    public List<SafeMaterialDO> listByPage(Page<SafeMaterialDO> page, SafeMaterialQuery query) {
+        List<SafeMaterialDO> materialInfoList = repository.listByConditions(page, query);
+        return materialInfoList;
+    }
+
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/MaterialClassifyServiceImpl.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/MaterialClassifyServiceImpl.java
new file mode 100644
index 0000000..b71a9eb
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/MaterialClassifyServiceImpl.java
@@ -0,0 +1,114 @@
+package com.gkhy.safePlatform.equipment.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.gkhy.safePlatform.commons.co.ContextCacheUser;
+import com.gkhy.safePlatform.commons.enums.ResultCodes;
+import com.gkhy.safePlatform.commons.utils.StringUtils;
+import com.gkhy.safePlatform.commons.vo.ResultVO;
+import com.gkhy.safePlatform.equipment.entity.SafeMaterialClassifyInfo;
+import com.gkhy.safePlatform.equipment.excepiton.EquipmentException;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialClassifyAddReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialClassifyModReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialClassifyQuery;
+import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialClassifyDto;
+import com.gkhy.safePlatform.equipment.service.MaterialClassifyService;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialClassifyInfoService;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service("MaterialClassifyService")
+public class MaterialClassifyServiceImpl implements MaterialClassifyService {
+    @Autowired
+    private SafeMaterialClassifyInfoService safeMaterialClassifyInfoService;
+    @Autowired
+    private SafeMaterialInfoService safeMaterialInfoService;
+
+    @Override
+    public ResultVO<List<SafeMaterialClassifyDto>> list(SafeMaterialClassifyQuery query) {
+        List<SafeMaterialClassifyInfo> list = safeMaterialClassifyInfoService.listByCondition(query);
+        List<SafeMaterialClassifyDto> respList = new ArrayList<>();
+        if(!CollectionUtils.isEmpty(list)){
+            for(SafeMaterialClassifyInfo classifyInfo : list){
+                SafeMaterialClassifyDto respDTO = new SafeMaterialClassifyDto();
+                respDTO.setId(classifyInfo.getId());
+                respDTO.setMaterialClassifyName(classifyInfo.getMaterialClassifyName());
+                respList.add(respDTO);
+            }
+        }
+        return new ResultVO<>(ResultCodes.OK,respList);
+    }
+
+    @Override
+    public ResultVO save(ContextCacheUser currentUser, SafeMaterialClassifyAddReq req) {
+        ResultVO resultVO = null;
+        SafeMaterialClassifyInfo classifyInfo = new SafeMaterialClassifyInfo();
+        classifyInfo.setMaterialClassifyName(req.getMaterialClassifyName());
+        boolean flag = safeMaterialClassifyInfoService.save(classifyInfo);
+        if (flag){
+            resultVO = new ResultVO(ResultCodes.OK);
+        }else {
+            resultVO = new ResultVO(ResultCodes.SERVER_ADD_ERROR);
+        }
+        return  resultVO;
+    }
+
+    @Override
+    public ResultVO update(ContextCacheUser currentUser, SafeMaterialClassifyModReq req) {
+        ResultVO resultVO = null;
+        if(req.getId() == null){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        SafeMaterialClassifyInfo classifyInfo = new SafeMaterialClassifyInfo();
+        classifyInfo.setMaterialClassifyName(req.getMaterialClassifyName());
+        classifyInfo.setId(req.getId());
+        boolean flag = safeMaterialClassifyInfoService.updateById(classifyInfo);
+        if (flag){
+            resultVO = new ResultVO(ResultCodes.OK);
+        }else {
+            resultVO = new ResultVO(ResultCodes.SERVER_UPDATE_ERROR);
+        }
+        return  resultVO;
+    }
+
+    @Override
+    public ResultVO delete(Long id) {
+        if(id == null){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        ResultVO resultVO = null;
+        //判断是否被绑定
+        int count = safeMaterialInfoService.getCountByClassify(id);
+        if(count > 0){
+            throw new EquipmentException(ResultCodes.SERVER_DEL_ERROR,"该类型已被绑定,不可删除!");
+        }else{
+            //如果没有被绑定,逻辑删除
+            SafeMaterialClassifyInfo classifyInfo = new SafeMaterialClassifyInfo();
+            classifyInfo.setId(id);
+            classifyInfo.setDelFlag(1);
+            boolean flag = safeMaterialClassifyInfoService.updateById(classifyInfo);
+            if (flag){
+                resultVO = new ResultVO(ResultCodes.OK);
+            }else {
+                resultVO = new ResultVO(ResultCodes.SERVER_DEL_ERROR);
+            }
+        }
+        return  resultVO;
+    }
+
+    @Override
+    public ResultVO<SafeMaterialClassifyDto> queryById(Long id) {
+        if(id == null){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        SafeMaterialClassifyInfo classifyInfo = safeMaterialClassifyInfoService.queryById(id);
+        SafeMaterialClassifyDto respDTO = new SafeMaterialClassifyDto();
+        respDTO.setId(classifyInfo.getId());
+        respDTO.setMaterialClassifyName(classifyInfo.getMaterialClassifyName());
+        return new ResultVO<>(ResultCodes.OK,respDTO);
+    }
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java
new file mode 100644
index 0000000..72cc374
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialDetailServiceImpl.java
@@ -0,0 +1,541 @@
+package com.gkhy.safePlatform.equipment.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gkhy.safePlatform.account.rpc.apimodel.AccountUserService;
+import com.gkhy.safePlatform.account.rpc.apimodel.model.resp.UserInfoRPCRespDTO;
+import com.gkhy.safePlatform.commons.enums.ResultCodes;
+import com.gkhy.safePlatform.commons.query.PageQuery;
+import com.gkhy.safePlatform.commons.utils.StringUtils;
+import com.gkhy.safePlatform.commons.vo.ResultVO;
+import com.gkhy.safePlatform.commons.vo.SearchResultVO;
+import com.gkhy.safePlatform.equipment.common.RocketMQTemplateHelper;
+import com.gkhy.safePlatform.equipment.entity.*;
+import com.gkhy.safePlatform.equipment.enums.*;
+import com.gkhy.safePlatform.equipment.excepiton.EquipmentException;
+import com.gkhy.safePlatform.equipment.model.dto.req.*;
+import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialDetailDto;
+import com.gkhy.safePlatform.equipment.mq.msg.SafeMaterialMsg;
+import com.gkhy.safePlatform.equipment.service.SafeMaterialDetailService;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialClassifyInfoService;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialDetailInfoService;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialInfoService;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.apache.rocketmq.spring.core.RocketMQTemplate;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service("SafeMaterialDetailService")
+public class SafeMaterialDetailServiceImpl implements SafeMaterialDetailService {
+    @Autowired
+    private SafeMaterialInfoService safeMaterialInfoService;
+    @Autowired
+    private SafeMaterialDetailInfoService safeMaterialDetailInfoService;
+
+    @Autowired
+    private SafeMaterialClassifyInfoService safeMaterialClassifyInfoService;
+
+    @Value("${rocketmq.topic.safeMaterialTopic}")
+    private String safeMaterialTopic;
+
+    @DubboReference(check = false)
+    private AccountUserService accountUserService;
+
+    @Autowired
+    private RocketMQTemplateHelper rocketMQTemplateHelper;
+
+    @Override
+    public ResultVO save(SafeMaterialDetailAddReq req) {
+        //判断物资是否存在
+        SafeMaterialInfo materialInfo = safeMaterialInfoService.queryById(req.getSmId());
+        if(null == materialInfo){
+            throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"该种物资不存在!");
+        }
+        if(null == ValidTypeEnum.getByCode(req.getValidType())){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"有效期类型不合法!");
+        }
+        if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null == req.getValidTime()){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"有效期时间不可为空!");
+        }
+        //获取数据量
+        Integer totalCount = safeMaterialDetailInfoService.getTotalCount();
+        List<SafeMaterialDetailInfo> list = new ArrayList<>();
+
+        //RFID起始不为空计算一下
+        if(StringUtils.isNotBlank(req.getStartRfid()) && StringUtils.isNotBlank(req.getEndRfid())){
+            int start = 0;
+            int end = 0;
+            String prefix = "";
+            try{
+                prefix = req.getStartRfid().substring(0,req.getStartRfid().length()-8);
+                start = Integer.parseInt(req.getStartRfid().substring(req.getStartRfid().length()-8));
+                end = Integer.parseInt(req.getEndRfid().substring(req.getEndRfid().length()-8));
+            }catch (Exception e){
+                throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"起始RFID不合法!");
+            }
+            if((end-start+1) != req.getWareHousingCount()){
+                throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"RFID起始和入库数量不能对应!");
+            }
+            for(int i = 0;i < req.getWareHousingCount();i++){
+                String countStr = String.valueOf(start+i);
+                String rfid = "0000000".substring(0,(8 - countStr.length()))+countStr;
+                SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
+                materialDetailInfo.setId(IdUtil.getSnowflake(0,0).nextId());
+                materialDetailInfo.setMaterialClassifyId(materialInfo.getMaterialClassifyId());
+                materialDetailInfo.setName(materialInfo.getMaterialName()+"(ID"+materialInfo.getId()+")");
+                materialDetailInfo.setSmId(req.getSmId());
+                materialDetailInfo.setConsumable(materialInfo.getConsumable());
+                materialDetailInfo.setValidType(req.getValidType());
+                if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode())){
+                    materialDetailInfo.setValidTime(req.getValidTime());
+                }
+                materialDetailInfo.setValidStatus(ValidStatusEnum.YES.getCode());
+                materialDetailInfo.setIrStatus(IssueReceiptEnum.IN_THE_LIBRARY.getCode());
+                materialDetailInfo.setWareHousingTime(LocalDateTime.now());
+                materialDetailInfo.setRfid(prefix+rfid);
+                materialDetailInfo.setMaterialNo(generateMaterialNo(totalCount+i));
+                list.add(materialDetailInfo);
+            }
+        }else{
+            //不分配FRID
+            for(int i = 0;i < req.getWareHousingCount();i++){
+                SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
+                materialDetailInfo.setId(IdUtil.getSnowflake(0,0).nextId());
+                materialDetailInfo.setMaterialClassifyId(materialInfo.getMaterialClassifyId());
+                materialDetailInfo.setName(materialInfo.getMaterialName()+"(ID"+materialInfo.getId()+")");
+                materialDetailInfo.setSmId(req.getSmId());
+                materialDetailInfo.setConsumable(materialInfo.getConsumable());
+                materialDetailInfo.setValidType(req.getValidType());
+                if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode())){
+                    materialDetailInfo.setValidTime(req.getValidTime());
+                }
+                materialDetailInfo.setValidStatus(ValidStatusEnum.YES.getCode());
+                materialDetailInfo.setIrStatus(IssueReceiptEnum.IN_THE_LIBRARY.getCode());
+                materialDetailInfo.setWareHousingTime(LocalDateTime.now());
+                materialDetailInfo.setMaterialNo(generateMaterialNo(totalCount+i));
+                list.add(materialDetailInfo);
+            }
+        }
+
+        //批量入库
+        safeMaterialDetailInfoService.saveBatch(list);
+
+        //发送消息
+        if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
+            for(SafeMaterialDetailInfo materialDetailInfo:list){
+                SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
+                safeMaterialMsg.setId(materialDetailInfo.getId());
+                safeMaterialMsg.setValidTime(conversionTimeType(materialDetailInfo.getValidTime()));
+                rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+            }
+        }
+        return new ResultVO<>(ResultCodes.OK);
+    }
+
+    /**
+     * 批量入库
+     * @param req
+     * @return
+     */
+    @Override
+    public ResultVO saveBatch(SafeMaterialDetailAddReq req) {
+        //判断物资是否存在
+        SafeMaterialInfo materialInfo = safeMaterialInfoService.queryById(req.getSmId());
+        if(null == materialInfo){
+            throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"该种物资不存在!");
+        }
+        if(null == ValidTypeEnum.getByCode(req.getValidType())){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"有效期类型不合法!");
+        }
+        if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null == req.getValidTime()){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"有效期时间不可为空!");
+        }
+        //获取数据量
+        Integer totalCount = safeMaterialDetailInfoService.getTotalCount();
+        List<SafeMaterialDetailInfo> list = new ArrayList<>();
+
+        for(int i = 0;i < req.getWareHousingCount();i++){
+            SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
+            materialDetailInfo.setId(IdUtil.getSnowflake(0,0).nextId());
+            materialDetailInfo.setMaterialClassifyId(materialInfo.getMaterialClassifyId());
+            materialDetailInfo.setName(materialInfo.getMaterialName()+"(ID"+materialInfo.getId()+")");
+            materialDetailInfo.setSmId(req.getSmId());
+            materialDetailInfo.setConsumable(materialInfo.getConsumable());
+            materialDetailInfo.setValidType(req.getValidType());
+            if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode())){
+                materialDetailInfo.setValidTime(req.getValidTime());
+            }
+            materialDetailInfo.setValidStatus(ValidStatusEnum.YES.getCode());
+            materialDetailInfo.setIrStatus(IssueReceiptEnum.IN_THE_LIBRARY.getCode());
+            materialDetailInfo.setWareHousingTime(LocalDateTime.now());
+            materialDetailInfo.setRfid(req.getRfid());
+            materialDetailInfo.setMaterialNo(generateMaterialNo(totalCount+i));
+            list.add(materialDetailInfo);
+        }
+        //批量入库
+        safeMaterialDetailInfoService.saveBatch(list);
+        //发送消息
+        if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
+            for(SafeMaterialDetailInfo materialDetailInfo:list){
+                //发送消息
+                SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
+                safeMaterialMsg.setId(materialInfo.getId());
+                safeMaterialMsg.setValidTime(conversionTimeType(materialDetailInfo.getValidTime()));
+                rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+            }
+        }
+        return new ResultVO<>(ResultCodes.OK);
+    }
+
+    /**
+     * 编辑
+     * @param req
+     * @return
+     */
+    @Transactional
+    @Override
+    public ResultVO update(SafeMaterialDetailReq req) {
+        //获取该条数据
+        SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(req.getId());
+        if(null == vo){
+            throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST);
+        }
+        //有效类型不为空
+        if(null != req.getValidType()){
+            if(null == ValidTypeEnum.getByCode(req.getValidType())){
+                throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"有效期类型不合法!");
+            }else{
+                if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null == req.getValidTime()){
+                    throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"有效期时间不可为空!");
+                }
+            }
+        }
+        //填充数据
+        SafeMaterialDetailInfo safeMaterialDetailInfo = new SafeMaterialDetailInfo();
+        safeMaterialDetailInfo.setId(req.getId());
+        safeMaterialDetailInfo.setRfid(req.getRfid());
+        safeMaterialDetailInfo.setSmId(req.getSmId());
+        safeMaterialDetailInfo.setValidType(req.getValidType());
+        safeMaterialDetailInfo.setValidTime(req.getValidTime());
+        //修改
+        safeMaterialDetailInfoService.updateById(safeMaterialDetailInfo);
+        //如果是非常期
+        if(req.getValidType().equals(ValidTypeEnum.SHORT_TERM.getCode()) && null != req.getValidTime()){
+            //发送消息
+            SafeMaterialMsg safeMaterialMsg = new SafeMaterialMsg();
+            safeMaterialMsg.setId(req.getId());
+            safeMaterialMsg.setValidTime(conversionTimeType(req.getValidTime()));
+            rocketMQTemplateHelper.syncSend(safeMaterialTopic,safeMaterialMsg);
+        }
+        return new ResultVO(ResultCodes.OK);
+    }
+
+    /**
+     * 批量-重新入库
+     * @param ids
+     * @return
+     */
+    @Override
+    public ResultVO receiptBatch(Long[] ids) {
+        if (ids.length == 0) {
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        List<Long> idList = new ArrayList<>();
+        Collections.addAll(idList,ids);
+        //验证
+        List<SafeMaterialDetailInfo> list = safeMaterialDetailInfoService.getListByIds(idList);
+        List<SafeMaterialDetailInfo> selectList = list
+                .stream()
+                .filter(item -> item.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode()))
+                .collect(Collectors.toList());
+        if(selectList.size() != ids.length){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"已入库物资不可重复入库!");
+        }
+        //修改为入库状态
+        safeMaterialDetailInfoService.updateReceiptStatusByIds(idList,IssueReceiptEnum.IN_THE_LIBRARY.getCode());
+        return new ResultVO(ResultCodes.OK);
+    }
+
+    /**
+     * 逻辑删除 -批量删除
+     * @param
+     * @return
+     */
+    @Override
+    public ResultVO deleteBatch(Long[] ids) {
+        if (ids.length == 0) {
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        safeMaterialDetailInfoService.deleteBatch(ids);
+        return new ResultVO(ResultCodes.OK);
+    }
+
+    /**
+     * 批量出库 - 根据ids
+     * @param req
+     * @return
+     */
+    @Override
+    public ResultVO deliveryBatchByIds(MterialDeliveryReq req) {
+        //获取认领人信息
+        UserInfoRPCRespDTO userInfo = getUserInfo(req.getClaimantId());
+        //验证
+        List<SafeMaterialDetailInfo> list = safeMaterialDetailInfoService.getListByIds(req.getIds());
+        List<SafeMaterialDetailInfo> selectList = list
+                .stream()
+                .filter(item -> item.getIrStatus().equals(IssueReceiptEnum.IN_THE_LIBRARY.getCode()) && item.getValidStatus().equals(ValidStatusEnum.YES.getCode()))
+                .collect(Collectors.toList());
+        if(selectList.size() != req.getIds().size()){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"已出库物资或无效物资,不可出库!");
+        }
+        SafeMaterialDetailBO detailBO = new SafeMaterialDetailBO();
+        detailBO.setIds(req.getIds());
+        detailBO.setClaimantName(userInfo.getUsername());
+        detailBO.setClaimantId(req.getClaimantId());
+        safeMaterialDetailInfoService.updateDeliveryStatusByIds(detailBO);
+        return new ResultVO(ResultCodes.OK);
+    }
+
+    @Override
+    public ResultVO deliveryBatchRandom(MterialRandomDeliveryReq req) {
+        UserInfoRPCRespDTO userInfo = getUserInfo(req.getClaimantId());
+        //获取有效数量
+        Integer validStockCount = safeMaterialDetailInfoService.getValidStockCount(req.getSmId());
+        if(req.getCount() > validStockCount){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"出库数量不可大于有效库存数量!");
+        }
+
+        SafeMaterialDetailBO detailBO = new SafeMaterialDetailBO();
+        detailBO.setCount(req.getCount());
+        detailBO.setClaimantName(userInfo.getUsername());
+        detailBO.setClaimantId(req.getClaimantId());
+        safeMaterialDetailInfoService.deliveryBatchRandom(detailBO);
+        return new ResultVO(ResultCodes.OK);
+    }
+
+    @Override
+    public SearchResultVO<List<SafeMaterialDetailDto>> listByPage(PageQuery<SafeMatetrialDetailQuery> pageQuery) {
+        Page<SafeMaterialDetailInfo> page = new Page(pageQuery.getPageIndex(),pageQuery.getPageSize());
+        List<SafeMaterialDetailInfoDO> safeMaterialDetailInfoDOS = safeMaterialDetailInfoService.listByPage(page, pageQuery.getSearchParams());
+        List<SafeMaterialDetailDto> detailDtoList = new ArrayList<>();
+        for(SafeMaterialDetailInfoDO materialDetailInfoDO : safeMaterialDetailInfoDOS){
+            SafeMaterialDetailDto materialDetailDto = new SafeMaterialDetailDto();
+            BeanUtils.copyProperties(materialDetailInfoDO,materialDetailDto);
+            materialDetailDto.setConsumableName(ConsumableEnum.getByCode(materialDetailInfoDO.getConsumable()).getValue());
+            materialDetailDto.setValidStatusName(ValidStatusEnum.getByCode(materialDetailInfoDO.getValidStatus()).getValue());
+            materialDetailDto.setValidTypeName(ValidTypeEnum.getByCode(materialDetailInfoDO.getValidType()).getValue());
+            materialDetailDto.setIrStatusName(IssueReceiptEnum.getByCode(materialDetailInfoDO.getIrStatus()).getValue());
+
+            detailDtoList.add(materialDetailDto);
+        }
+        return new SearchResultVO<>(true, page.getCurrent(),page.getSize(), page.getPages(),page.getTotal(),detailDtoList,ResultCodes.OK);
+    }
+
+    @Override
+    public ResultVO queryById(Long id) {
+        if(null == id){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        SafeMaterialDetailInfo materialDetailInfo = safeMaterialDetailInfoService.queryById(id);
+        SafeMaterialDetailDto detailDto = new SafeMaterialDetailDto();
+        if(materialDetailInfo != null){
+            SafeMaterialInfo materialInfo = safeMaterialInfoService.queryById(materialDetailInfo.getSmId());
+            SafeMaterialClassifyInfo classifyInfo = safeMaterialClassifyInfoService.queryById(materialDetailInfo.getMaterialClassifyId());
+            BeanUtils.copyProperties(materialDetailInfo,detailDto);
+            detailDto.setConsumableName(ConsumableEnum.getByCode(materialDetailInfo.getConsumable()).getValue());
+            detailDto.setValidStatusName(ValidStatusEnum.getByCode(materialDetailInfo.getValidStatus()).getValue());
+            detailDto.setValidTypeName(ValidTypeEnum.getByCode(materialDetailInfo.getValidType()).getValue());
+            detailDto.setIrStatusName(IssueReceiptEnum.getByCode(materialDetailInfo.getIrStatus()).getValue());
+            if(materialInfo != null){
+              detailDto.setDepName(materialInfo.getDepName());
+            }
+            if(classifyInfo != null){
+                detailDto.setMaterialClassifyName(classifyInfo.getMaterialClassifyName());
+            }
+
+        }
+        return new ResultVO(ResultCodes.OK,detailDto);
+    }
+
+    /**
+     * 单条-出库
+     * @param req
+     * @return
+     */
+    @Override
+    public ResultVO singleDelivery(SafeMaterialDetailReq req) {
+        //获取该条数据
+        SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(req.getId());
+        if(null == vo){
+            throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST);
+        }
+        if(vo.getValidStatus().equals(ValidStatusEnum.NO.getCode())){
+            throw new EquipmentException(EquipmentResultCodes.MATERIAL_INVALID,"无效物资不可出库");
+        }
+        if(vo.getIrStatus().equals(IssueReceiptEnum.OUT_OF_LIBRARY.getCode())){
+            throw new EquipmentException(EquipmentResultCodes.MATERIAL_OUT_OF_LIBRARY);
+        }
+        //检查认领人
+        UserInfoRPCRespDTO userInfo = getUserInfo(req.getClaimantId());
+        SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
+        materialDetailInfo.setId(req.getId());
+        materialDetailInfo.setIrStatus(IssueReceiptEnum.OUT_OF_LIBRARY.getCode());
+        materialDetailInfo.setClaimantId(req.getClaimantId());
+        materialDetailInfo.setClaimantName(userInfo.getUsername());
+        materialDetailInfo.setDeliveryTime(LocalDateTime.now());
+        //修改出入库状态为出库
+        safeMaterialDetailInfoService.updateById(materialDetailInfo);
+        return new ResultVO<>(ResultCodes.OK);
+    }
+
+    /**
+     * 单条-重新入库
+     * @param id
+     * @return
+     */
+
+    @Override
+    public ResultVO singleReceipt(Long id) {
+        if(null == id){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        //获取该条数据
+        SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(id);
+        if(null == vo){
+            throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST);
+        }
+        if(vo.getIrStatus().equals(IssueReceiptEnum.IN_THE_LIBRARY.getCode())){
+            throw new EquipmentException(EquipmentResultCodes.MATERIAL_IN_THE_LIBRARY);
+        }
+        //修改出入库状态为入库
+        safeMaterialDetailInfoService.updateReceiptStatus(id,IssueReceiptEnum.IN_THE_LIBRARY.getCode());
+        return new ResultVO<>(ResultCodes.OK);
+    }
+
+    @Override
+    public ResultVO singleDdelivery0rReceipt(SafeMaterialDetailReq req) {
+        if(null == IssueReceiptEnum.getByCode(req.getIrStatus())){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"物资状态不合法");
+        }
+
+        //获取该条数据
+        SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(req.getId());
+        if(null == vo){
+            throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST);
+        }
+        if(null == IssueReceiptEnum.getByCode(req.getIrStatus())){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"出入库状态不合法");
+        }
+
+        if(IssueReceiptEnum.IN_THE_LIBRARY.getCode().equals(req.getIrStatus())){
+            //重新入库
+            if(vo.getIrStatus().equals(req.getIrStatus())){
+                throw new EquipmentException(EquipmentResultCodes.MATERIAL_IN_THE_LIBRARY);
+            }
+
+            //修改出入库状态为入库
+            safeMaterialDetailInfoService.updateReceiptStatus(req.getId(), req.getIrStatus());
+        }else{
+            //出库
+            if(vo.getValidStatus().equals(ValidStatusEnum.NO.getCode())){
+                throw new EquipmentException(EquipmentResultCodes.MATERIAL_INVALID,"无效物资不可出库");
+            }
+            if(vo.getIrStatus().equals(req.getIrStatus())){
+                throw new EquipmentException(EquipmentResultCodes.MATERIAL_OUT_OF_LIBRARY);
+            }
+            if(null == req.getClaimantId()){
+                throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL,"认领人不可为空!");
+            }
+            //检查认领人
+            UserInfoRPCRespDTO userInfo = getUserInfo(req.getClaimantId());
+            //出库
+            SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
+            materialDetailInfo.setId(req.getId());
+            materialDetailInfo.setIrStatus(req.getIrStatus());
+            materialDetailInfo.setClaimantId(req.getClaimantId());
+            materialDetailInfo.setClaimantName(userInfo.getUsername());
+            materialDetailInfo.setDeliveryTime(LocalDateTime.now());
+            //修改出入库状态为入库
+            safeMaterialDetailInfoService.updateById(materialDetailInfo);
+        }
+        return new ResultVO<>(ResultCodes.OK);
+    }
+
+
+
+    /**
+     * 逻辑删除 -单条
+     * @param
+     * @return
+     */
+    public ResultVO delete(Long id){
+        if(null == id){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        //获取该条数据
+        SafeMaterialDetailInfo vo = safeMaterialDetailInfoService.queryById(id);
+        if(null == vo){
+            throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST);
+        }
+        SafeMaterialDetailInfo materialDetailInfo = new SafeMaterialDetailInfo();
+        materialDetailInfo.setId(id);
+        materialDetailInfo.setDelFlag(1);
+        //删除一条数据
+        safeMaterialDetailInfoService.updateById(materialDetailInfo);
+
+        return new ResultVO<>(ResultCodes.OK);
+    }
+
+
+
+
+
+
+    private UserInfoRPCRespDTO getUserInfo(Long uid) {
+        UserInfoRPCRespDTO userInfo = new UserInfoRPCRespDTO();
+        ResultVO<UserInfoRPCRespDTO> rpcResult = accountUserService.getUserInfoByUid(uid);
+        if (rpcResult != null && rpcResult.getCode().equals(ResultCodes.OK.getCode())) {
+            if (rpcResult.getData() != null) {
+                userInfo = (UserInfoRPCRespDTO) rpcResult.getData();
+            }else {
+                throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"认领人员不存在!");
+            }
+        } else {
+            throw new EquipmentException(ResultCodes.RPC_RESULT_NULL);
+        }
+        return userInfo;
+    }
+
+    private String generateMaterialNo(int count){
+        if(count < 0){
+            return null;
+        }
+        String serialCode = null;
+        if(count >= 10000){
+            serialCode = "" + (count+1);
+        }else if(count >=0){
+            String countStr = String.valueOf(count+1);
+            serialCode = "10000".substring(0,(5 - countStr.length()))+countStr;
+        }
+        return serialCode;
+    }
+    private Date conversionTimeType(LocalDateTime localDateTime){
+        ZoneId zoneId = ZoneId.systemDefault();
+        ZonedDateTime zdt = localDateTime.atZone(zoneId);
+        Date date = Date.from(zdt.toInstant());
+        return date;
+    }
+
+}
diff --git a/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialServiceImpl.java b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialServiceImpl.java
new file mode 100644
index 0000000..b2405da
--- /dev/null
+++ b/equipment/equipment-service/src/main/java/com/gkhy/safePlatform/equipment/service/impl/SafeMaterialServiceImpl.java
@@ -0,0 +1,336 @@
+package com.gkhy.safePlatform.equipment.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.gkhy.safePlatform.account.rpc.apimodel.AccountDepartmentService;
+import com.gkhy.safePlatform.account.rpc.apimodel.model.resp.DepInfoRPCRespDTO;
+import com.gkhy.safePlatform.account.rpc.apimodel.model.resp.DepRPCRespDTO;
+import com.gkhy.safePlatform.commons.enums.ResultCodes;
+import com.gkhy.safePlatform.commons.query.PageQuery;
+import com.gkhy.safePlatform.commons.vo.ResultVO;
+import com.gkhy.safePlatform.commons.vo.SearchResultVO;
+import com.gkhy.safePlatform.equipment.entity.*;
+import com.gkhy.safePlatform.equipment.enums.ConsumableEnum;
+import com.gkhy.safePlatform.equipment.enums.EquipmentResultCodes;
+import com.gkhy.safePlatform.equipment.excepiton.EquipmentException;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialAddReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialModReq;
+import com.gkhy.safePlatform.equipment.model.dto.req.SafeMaterialQuery;
+import com.gkhy.safePlatform.equipment.model.dto.resp.BaseMaterialDto;
+import com.gkhy.safePlatform.equipment.model.dto.resp.MaterialClassificationDto;
+import com.gkhy.safePlatform.equipment.model.dto.resp.MaterialDepartmentDto;
+import com.gkhy.safePlatform.equipment.model.dto.resp.SafeMaterialDto;
+import com.gkhy.safePlatform.equipment.repository.SafeMaterialDetailInfoRepository;
+import com.gkhy.safePlatform.equipment.service.SafeMaterialService;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialClassifyInfoService;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialDetailInfoService;
+import com.gkhy.safePlatform.equipment.service.baseService.SafeMaterialInfoService;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.parameters.P;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service("SafeMaterialService")
+public class SafeMaterialServiceImpl implements SafeMaterialService {
+    @Autowired
+    private SafeMaterialInfoService safeMaterialInfoService;
+    @DubboReference(check = false)
+    private AccountDepartmentService accountDepartmentService;
+    @Autowired
+    private SafeMaterialClassifyInfoService safeMaterialClassifyInfoService;
+    @Autowired
+    private SafeMaterialDetailInfoService safeMaterialDetailInfoService;
+
+    @Override
+    public ResultVO save(SafeMaterialAddReq req) {
+        ResultVO resultVO = null;
+        //获取部门信息
+        DepInfoRPCRespDTO depInfo = getDepInfoByDepId(req.getDepId());
+
+        if(null == ConsumableEnum.getByCode(req.getConsumable())){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"耗材类型不合法!");
+        }
+        //获取物资类型
+        SafeMaterialClassifyInfo classifyInfo = safeMaterialClassifyInfoService.queryById(req.getMaterialClassifyId());
+        if(null == classifyInfo){
+            throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"物资类型不存在!");
+        }
+        //获取数量
+        int safeMaterialTotalCount = safeMaterialInfoService.getTotalCount();
+        SafeMaterialInfo safeMaterialInfo = new SafeMaterialInfo();
+        BeanUtils.copyProperties(req,safeMaterialInfo);
+        safeMaterialInfo.setDepName(depInfo.getDepName());
+        safeMaterialInfo.setSerialNum(this.generateSerialNum(safeMaterialTotalCount));
+        //插入
+        boolean flag = safeMaterialInfoService.save(safeMaterialInfo);
+        if(flag){
+            resultVO = new ResultVO(ResultCodes.OK);
+        }else {
+            resultVO = new ResultVO(ResultCodes.SERVER_ADD_ERROR);
+        }
+
+        return resultVO;
+    }
+
+    @Override
+    public ResultVO update(SafeMaterialModReq req) {
+        ResultVO resultVO = null;
+        //获取部门信息
+        DepInfoRPCRespDTO depInfo = getDepInfoByDepId(req.getDepId());
+
+        if(null == ConsumableEnum.getByCode(req.getConsumable())){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_ILLEGAL,"耗材类型不合法!");
+        }
+        //获取物资类型
+        SafeMaterialClassifyInfo classifyInfo = safeMaterialClassifyInfoService.queryById(req.getMaterialClassifyId());
+        if(null == classifyInfo){
+            throw new EquipmentException(EquipmentResultCodes.DATA_NOT_EXIST,"物资类型不存在!");
+        }
+        SafeMaterialInfo safeMaterialInfo = new SafeMaterialInfo();
+        BeanUtils.copyProperties(req,safeMaterialInfo);
+        safeMaterialInfo.setDepName(depInfo.getDepName());
+        //跟新
+        boolean flag = safeMaterialInfoService.updateById(safeMaterialInfo);
+        if(flag){
+            resultVO = new ResultVO(ResultCodes.OK);
+        }else {
+            resultVO = new ResultVO(ResultCodes.SERVER_UPDATE_ERROR);
+        }
+
+        return resultVO;
+    }
+
+    @Override
+    public ResultVO queryById(Long id) {
+        if(null == id){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        SafeMaterialInfo safeMaterialInfo = safeMaterialInfoService.queryById(id);
+        SafeMaterialDto safeMaterialDto = new SafeMaterialDto();
+        if(null != safeMaterialInfo){
+            SafeMaterialClassifyInfo classifyInfo = safeMaterialClassifyInfoService.queryById(safeMaterialInfo.getMaterialClassifyId());
+            Integer validStockCount = safeMaterialDetailInfoService.getValidStockCount(safeMaterialInfo.getId());
+            BeanUtils.copyProperties(safeMaterialInfo,safeMaterialDto);
+            safeMaterialDto.setConsumable(ConsumableEnum.getByCode(safeMaterialInfo.getConsumable()).getCode());
+            if(null != classifyInfo){
+                safeMaterialDto.setMaterialClassifyName(classifyInfo.getMaterialClassifyName());
+            }
+            safeMaterialDto.setValidStockCount(validStockCount);
+
+        }
+        return new ResultVO(ResultCodes.OK,safeMaterialDto);
+    }
+
+    public ResultVO delete(Long id) {
+        ResultVO resultVO = null;
+        //删除之前检查详表中是否还有该物物资数据
+        int count = safeMaterialDetailInfoService.getCountBySmId(id);
+        if(count > 0){
+            throw new EquipmentException(EquipmentResultCodes.DATA_HAS_BEEN_BOND,"该种物资已被绑定物资详情数据,不可删除!");
+        }
+        SafeMaterialInfo materialInfo = new SafeMaterialInfo();
+        materialInfo.setId(id);
+        materialInfo.setDelFlag(1);
+        boolean flag = safeMaterialInfoService.updateById(materialInfo);
+        if(flag){
+            resultVO = new ResultVO(ResultCodes.OK);
+        }else{
+            resultVO = new ResultVO(ResultCodes.SERVER_DEL_ERROR);
+        }
+        return resultVO;
+    }
+
+    @Override
+    public ResultVO deleteBatch(Long[] ids) {
+        if(ids.length == 0){
+            throw new EquipmentException(ResultCodes.CLIENT_PARAM_NULL);
+        }
+        List<Long> idList = Arrays.asList(ids);
+        int count = safeMaterialDetailInfoService.getCountBySmIds(idList);
+        //判断是否绑定具体安全物资数据
+        if(count > 0){
+            throw new EquipmentException(EquipmentResultCodes.DATA_HAS_BEEN_BOND,"物资已被绑定物资详情数据,不可删除!");
+        }
+        safeMaterialInfoService.deleteBatch(idList);
+        return new ResultVO(ResultCodes.OK);
+    }
+
+    /**
+     * 获取列表
+     * @return
+     */
+    @Override
+    public ResultVO list() {
+        //获取所有数据
+        List<SafeMaterialInfo> materialInfoList = safeMaterialInfoService.list();
+        //获取所有部门
+        List<DepRPCRespDTO> depInfoList = getDepInfoList();
+        //获取所有物资类型
+        List<SafeMaterialClassifyInfo> classifyInfoList = safeMaterialClassifyInfoService.getList();
+        //循环物资分类
+        List<MaterialClassificationDto> classificationDtoList = new ArrayList<>();
+        for (SafeMaterialClassifyInfo classifyInfo:classifyInfoList){
+            MaterialClassificationDto classificationDto = new MaterialClassificationDto();
+            classificationDto.setMaterialClassifyId(classifyInfo.getId());
+            classificationDto.setMaterialClassifyName(classifyInfo.getMaterialClassifyName());
+            //循环部门
+            List<MaterialDepartmentDto> departmentDtoList = new ArrayList<>();
+            for (DepRPCRespDTO dep:depInfoList){
+                //过滤出物资数据
+                List<SafeMaterialInfo> selectMaterialList = materialInfoList
+                        .stream()
+                        .filter(item -> classifyInfo.getId().equals(item.getMaterialClassifyId()) && dep.getDepId().equals(item.getDepId()))
+                        .collect(Collectors.toList());
+                if(selectMaterialList.size()>0){
+                    //填充部门数据
+                    MaterialDepartmentDto departmentDto = new MaterialDepartmentDto();
+                    departmentDto.setDepId(dep.getDepId());
+                    departmentDto.setDepName(dep.getDepName());
+
+                    List<BaseMaterialDto> baseMaterialDtoList = new ArrayList<>();
+                    //循环物资
+                    for (SafeMaterialInfo materialInfo:selectMaterialList){
+                        //填充基础物资数据
+                        BaseMaterialDto baseMaterialDto = new BaseMaterialDto();
+                        baseMaterialDto.setMaterialName(materialInfo.getMaterialName());
+                        baseMaterialDto.setSmId(materialInfo.getId());
+                        baseMaterialDtoList.add(baseMaterialDto);
+                    }
+                    departmentDto.setBaseMaterialList(baseMaterialDtoList);
+                    departmentDtoList.add(departmentDto);
+                }
+                //子集部门
+                if(!CollectionUtils.isEmpty(dep.getChildren())){
+                    this.recursiveDep(dep.getChildren(),departmentDtoList,materialInfoList,classifyInfo.getId());
+                }
+            }
+            classificationDto.setDepartmentList(departmentDtoList);
+            classificationDtoList.add(classificationDto);
+        }
+
+        return new ResultVO(ResultCodes.OK,classificationDtoList);
+    }
+    private void recursiveDep(List<DepRPCRespDTO> depList,List<MaterialDepartmentDto> departmentDtoList,List<SafeMaterialInfo> materialInfoList,Long classifyId){
+        for(DepRPCRespDTO dep:depList){
+            //过滤出物资数据
+            List<SafeMaterialInfo> selectMaterialList = materialInfoList
+                    .stream()
+                    .filter(item -> classifyId.equals(item.getMaterialClassifyId()) && dep.getDepId().equals(item.getDepId()))
+                    .collect(Collectors.toList());
+            if(selectMaterialList.size()>0){
+                //填充部门数据
+                MaterialDepartmentDto departmentDto = new MaterialDepartmentDto();
+                departmentDto.setDepId(dep.getDepId());
+                departmentDto.setDepName(dep.getDepName());
+
+                List<BaseMaterialDto> baseMaterialDtoList = new ArrayList<>();
+                //循环物资
+                for (SafeMaterialInfo materialInfo:selectMaterialList){
+                    //填充基础物资数据
+                    BaseMaterialDto baseMaterialDto = new BaseMaterialDto();
+                    baseMaterialDto.setMaterialName(materialInfo.getMaterialName());
+                    baseMaterialDto.setSmId(materialInfo.getId());
+                    baseMaterialDtoList.add(baseMaterialDto);
+                }
+                departmentDto.setBaseMaterialList(baseMaterialDtoList);
+                departmentDtoList.add(departmentDto);
+            }
+            //子集
+            if(!CollectionUtils.isEmpty(dep.getChildren())){
+                this.recursiveDep(dep.getChildren(),departmentDtoList,materialInfoList,classifyId);
+            }
+        }
+    }
+    @Override
+    public SearchResultVO<List<SafeMaterialDto>> listByPage(PageQuery<SafeMaterialQuery> pageQuery) {
+        Page<SafeMaterialDO> page= new Page(pageQuery.getPageIndex(),pageQuery.getPageSize());
+        List<SafeMaterialDO> materialInfoList = safeMaterialInfoService.listByPage(page, pageQuery.getSearchParams());
+        List<Long> materialIdList = new ArrayList<>();
+        List<SafeMaterialDetailCountDO> statisticsList = new ArrayList<>();
+        if(materialInfoList.size()>0){
+            materialIdList = materialInfoList.stream().map(SafeMaterialDO::getId).collect(Collectors.toList());
+        }
+        if(materialIdList.size()>0){
+           statisticsList = safeMaterialDetailInfoService.getStatisticsValidStock(materialIdList);
+        }
+        List<SafeMaterialDto> materialDtoList = new ArrayList<>();
+        for (SafeMaterialDO materialDO:materialInfoList){
+            SafeMaterialDto materialDto = new SafeMaterialDto();
+            BeanUtils.copyProperties(materialDO,materialDto);
+            materialDto.setConsumableName(ConsumableEnum.getByCode(materialDO.getConsumable()).getValue());
+            //过滤出当前物资详细
+            List<SafeMaterialDetailCountDO> selectList = statisticsList
+                    .stream()
+                    .filter(item -> item.getSmId().equals(materialDO.getId()))
+                    .collect(Collectors.toList());
+            if(selectList.size()>0){
+                materialDto.setValidStockCount(selectList.get(0).getCount());
+            }else{
+                materialDto.setValidStockCount(0);
+            }
+            materialDtoList.add(materialDto);
+        }
+        return new SearchResultVO<>(
+                true,
+                page.getCurrent(),
+                page.getSize(),
+                page.getPages(),
+                page.getTotal(),
+                materialDtoList,ResultCodes.OK);
+
+
+    }
+    private DepInfoRPCRespDTO getDepInfoByDepId(Long deptId) {
+        DepInfoRPCRespDTO dep = new DepInfoRPCRespDTO();
+        ResultVO<DepInfoRPCRespDTO> rpcResult = accountDepartmentService.getDepInfoByDepId(deptId);
+        if (rpcResult != null && rpcResult.getCode().equals(ResultCodes.OK.getCode())) {
+            if (rpcResult.getData() != null) {
+                dep = (DepInfoRPCRespDTO) rpcResult.getData();
+            }else {
+                throw new EquipmentException(ResultCodes.CLIENT_DEP_NOT_EXIST);
+            }
+        } else {
+            throw new EquipmentException(ResultCodes.RPC_RESULT_NULL);
+        }
+        return dep;
+    }
+    private List<DepRPCRespDTO> getDepInfoList() {
+        List<DepRPCRespDTO> depInfoList = new ArrayList<>();
+        ResultVO<List<DepRPCRespDTO>> rpcResult = accountDepartmentService.depList();
+        if (rpcResult != null && rpcResult.getCode().equals(ResultCodes.OK.getCode())) {
+            if (rpcResult.getData() != null) {
+                depInfoList = (List<DepRPCRespDTO>) rpcResult.getData();
+            }else{
+                throw new EquipmentException(ResultCodes.CLIENT_DEP_NOT_EXIST);
+            }
+        } else {
+            throw new EquipmentException(ResultCodes.CLIENT_DEP_NOT_EXIST);
+        }
+        return depInfoList;
+    }
+
+    private String generateSerialNum(int count){
+        if(count < 0){
+            return null;
+        }
+        String code = null;
+        String prefix = "ID-";
+        String serialCode = null;
+        if(count >= 10000){
+            serialCode = "" + (count+1);
+        }else if(count >=0){
+            String countStr = String.valueOf(count+1);
+            serialCode = "00000".substring(0,(5 - countStr.length()))+countStr;
+        }
+        if(serialCode != null && !serialCode.isEmpty()){
+            code = prefix+serialCode;
+        }
+        return code;
+    }
+}
diff --git a/equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialClassifyInfoMapper.xml b/equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialClassifyInfoMapper.xml
new file mode 100644
index 0000000..e76027d
--- /dev/null
+++ b/equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialClassifyInfoMapper.xml
@@ -0,0 +1,43 @@
+<?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.safePlatform.equipment.repository.SafeMaterialClassifyInfoRepository">
+
+    <resultMap type="com.gkhy.safePlatform.equipment.entity.SafeMaterialClassifyDO" id="materialClassifyResult">
+        <id column="id" property="id" jdbcType="BIGINT"/>
+        <result column="material_classify_name" property="materialClassifyName"/>
+    </resultMap>
+    <!--新增-->
+    <insert id="save" parameterType="com.gkhy.safePlatform.equipment.entity.SafeMaterialClassifyInfo">
+        insert into safe_material_classify (id,material_classify_name,del_flag,create_time,create_uid,create_uname,update_time,update_uid,update_uname) values (#{id},#{materialClassifyName},#{delFlag},#{createTime},#{createUid},#{createUname},#{updateTime},#{updateUid},#{updateUname})
+    </insert>
+    <!--更新-->
+    <update id="update" parameterType="com.gkhy.safePlatform.equipment.entity.SafeMaterialClassifyInfo">
+        update safe_material_classify
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="materialClassifyName != null and materialClassifyName != ''">
+                material_classify_name = #{materialClassifyName}
+            </if>
+        </trim>
+        where id = #{id}
+    </update>
+    <!--逻辑删除-->
+    <update id="delete">
+        update safe_material_classify set del_fag = 1 where id = #{id}
+    </update>
+    <!--查询单条数据-->
+    <select id="queryById" resultType="com.gkhy.safePlatform.equipment.entity.SafeMaterialClassifyInfo">
+        select id,material_classify_name,create_time,create_uid,create_uname,update_time,update_uid,update_uname from safe_material_classify where id = #{id} and del_flag = 0;
+    </select>
+    <select id="listByContion" resultType="com.gkhy.safePlatform.equipment.entity.SafeMaterialClassifyInfo">
+        select id,
+               material_classify_name
+        from safe_material_classify
+        where del_flag = 0
+        <if test="mateialClassifyName != null and materialClassifyName != ''">
+           and instr(material_classify_name,#{materialClassifyName}) > 0
+        </if>
+    </select>
+
+</mapper>
diff --git a/equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialDetailInfoMapper.xml b/equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialDetailInfoMapper.xml
new file mode 100644
index 0000000..b79af4a
--- /dev/null
+++ b/equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialDetailInfoMapper.xml
@@ -0,0 +1,190 @@
+<?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.safePlatform.equipment.repository.SafeMaterialDetailInfoRepository">
+
+    <resultMap type="com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailInfo" id="materialDetailResult">
+        <id column="id" property="id" jdbcType="BIGINT"/>
+        <result column="name" property="name" jdbcType="VARCHAR"/>
+        <result column="material_no" property="materialNo" jdbcType="VARCHAR"/>
+        <result column="material_classify_id" property="materialClassifyId" jdbcType="BIGINT"/>
+        <result column="rfid" property="rfid" jdbcType="VARCHAR"/>
+        <result column="consumable" property="consumable" jdbcType="TINYINT"/>
+        <result column="valid_type" property="validType" jdbcType="TINYINT"/>
+        <result column="valid_time" property="validTime" jdbcType="TIMESTAMP"/>
+        <result column="valid_status" property="validStatus" jdbcType="TINYINT"/>
+        <result column="ir_status" property="irStatus" jdbcType="TINYINT"/>
+        <result column="ware_housing_time" property="wareHousingTime" jdbcType="TIMESTAMP"/>
+        <result column="delivery_time" property="deliveryTime" jdbcType="TIMESTAMP"/>
+        <result column="sm_id" property="smId" jdbcType="BIGINT"/>
+        <result column="claimant_id" property="claimantId" jdbcType="BIGINT"/>
+        <result column="claimant_name" property="claimantName" jdbcType="VARCHAR"/>
+        <result column="del_flag" property="delFlag" jdbcType="INTEGER"/>
+        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
+        <result column="create_uid" property="createUid" jdbcType="BIGINT"/>
+        <result column="create_uname" property="createUname" jdbcType="VARCHAR"/>
+        <result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
+        <result column="update_uid" property="updateUid" jdbcType="BIGINT"/>
+        <result column="update_uname" property="updateUname" jdbcType="VARCHAR"/>
+    </resultMap>
+
+    <select id="getTotalCount" resultType="java.lang.Integer">
+        select count(1) from safe_material_detail
+    </select>
+    <select id="queryById" resultMap="materialDetailResult">
+        select id,
+               name,
+               material_no,
+               material_classify_id,
+               rfid,
+               consumable,
+               valid_type,
+               valid_time,
+               valid_status,
+               ir_status,
+               ware_housing_time,
+               ware_housing_time,
+               delivery_time,
+               sm_id,
+               claimant_id,
+               claimant_name
+        from safe_material_detail where del_flag = 0 and id = #{id}
+    </select>
+    <update id="updateReceiptStatus" >
+        update safe_material_detail
+        set ir_status = #{status},
+            ware_housing_time = #{wareHousingTime},
+            claimant_id = null,
+            claimant_name = null
+        where id = #{id}
+    </update>
+    <select id="getListByIds" resultMap="materialDetailResult">
+        select id,name,material_no,material_classify_id,rfid,consumable,valid_type,valid_time,valid_status,ir_status,ware_housing_time,ware_housing_time,delivery_time,sm_id,claimant_id,claimant_name
+               from safe_material_detail
+               where del_flag = 0
+                 and id in
+                <foreach collection="ids" item="id" separator="," open="(" close=")">
+                    #{id}
+                </foreach>
+    </select>
+    <update id="updateReceiptStatusByIds" >
+        update safe_material_detail
+        set ir_status = #{irStatus},
+            ware_housing_time = #{wareHousingTime},
+            claimant_id = null,
+            claimant_name = null where id in
+        <foreach collection="ids" item="id" separator="," open="(" close=")">
+            #{id}
+        </foreach>
+    </update>
+    <select id="getCountGroupBySmId" resultType="com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailCountDO">
+        select smId,count(*)
+        from safe_material_detail
+        where del_flag = 0
+          and ir_status = #{irStatus}
+          and id in
+        <foreach collection="ids" item="id" separator="," open="(" close=")">
+            #{id}
+        </foreach>
+        group by smId
+    </select>
+    <select id="getStatisticsValidStock" resultType="com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailCountDO">
+        select count(1) as count,
+               sm_id
+        from safe_material_detail
+        where del_flag = 0
+            and valid_status = #{validStatus}
+            and ir_status = #{irStatus}
+            and sm_id in
+            <foreach collection="smIds" item="smId" open="(" close=")" separator=",">
+                #{smId}
+            </foreach>
+        GROUP BY
+            sm_id
+    </select>
+    <!--批量删除-->
+    <update id="deleteBatch">
+        update safe_material_detail set del_flag = 1 where id in
+        <foreach collection="ids" item="id" open="(" close=")" separator=",">
+            #{id}
+        </foreach>
+    </update>
+    <!--批量出库-根据ids-->
+    <update id="updateDeliveryStatusByIds" >
+        update safe_material_detail
+        set ir_status = #{detailBO.irStatus},
+            claimant_id = #{detailBO.claimantId},
+            claimant_name = #{detailBO.claimantName},
+            delivery_time = #{detailBO.deliveryTime}
+        where id in
+        <foreach collection="detailBO.ids" item="id" separator="," open="(" close=")">
+            #{id}
+        </foreach>
+    </update>
+    <!--批量出库-随机-->
+    <update id="deliveryBatchRandom" >
+        update safe_material_detail
+        set ir_status = #{detailBO.irStatus},
+            claimant_id = #{detailBO.claimantId},
+            claimant_name = #{detailBO.claimantName},
+            delivery_time = #{detailBO.deliveryTime}
+        where id in
+              (select t.id from (select id from safe_material_detail where ir_status = 0 and valid_status = 0 and del_flag = 0 ORDER BY ware_housing_time asc LIMIT #{detailBO.count}) t
+              )
+    </update>
+
+    <select id="getValidStockCount" resultType="java.lang.Integer">
+      select count(1)
+      from safe_material_detail
+      where del_flag = 0
+        and valid_status = #{validStatus}
+        and ir_status = #{irStatus}
+        and sm_id = #{smId}
+    </select>
+    <select id="listByCondition" resultType="com.gkhy.safePlatform.equipment.entity.SafeMaterialDetailInfoDO">
+        select sd.id,
+               sd.name,
+               sd.material_no,
+               sd.material_classify_id,
+               sd.rfid,
+               sd.consumable,
+               sd.valid_type,
+               sd.valid_time,
+               sd.valid_status,
+               sd.ir_status,
+               sd.ware_housing_time,
+               sd.claimant_name,
+               sd.delivery_time,
+               sm.dep_id,
+               sm.dep_name,
+               sc.material_classify_name
+        from safe_material_detail sd
+                 INNER JOIN safe_material_classify sc on sd.material_classify_id = sc.id
+                 INNER JOIN safe_material sm on sd.sm_id = sm.id
+        where sd.del_flag = 0
+        <if test="query.rfid != null and query.rfid != '' ">
+            and sd.rfid = #{query.rfid}
+        </if>
+        <if test="query.irStatus != null and query.irStatus != '' or query.irStatus == 0">
+            and sd.ir_status = #{query.irStatus}
+        </if>
+        ORDER BY sd.create_time desc
+    </select>
+
+    <!--根据smId统计数量-->
+    <select id="getCountBySmId" resultType="java.lang.Integer">
+        select count(1) from safe_material_detail where del_flag = 0 and sm_id = #{smId}
+    </select>
+    <!--根据smIds统计数量-->
+    <select id="getCountBySmIds" resultType="java.lang.Integer">
+        select count(1) from safe_material_detail where del_flag = 0 and sm_id in
+        <foreach collection="smIds" item="smId" open="(" close=")" separator=",">
+            #{smId}
+        </foreach>
+    </select>
+
+    <update id="updateValidStatus" >
+        update safe_material_detail set valid_status = #{validStatus} where id = #{id}
+    </update>
+</mapper>
diff --git a/equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialInfoMapper.xml b/equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialInfoMapper.xml
new file mode 100644
index 0000000..cd3cfd2
--- /dev/null
+++ b/equipment/equipment-service/src/main/resources/config/mapper/equipment/SafeMaterialInfoMapper.xml
@@ -0,0 +1,65 @@
+<?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.safePlatform.equipment.repository.SafeMaterialInfoRepository">
+
+    <resultMap type="com.gkhy.safePlatform.equipment.entity.SafeMaterialInfo" id="materialResult">
+        <id column="id" property="id" jdbcType="BIGINT"/>
+        <result column="serial_num" property="serialNum" jdbcType="VARCHAR"/>
+        <result column="material_classify_id" property="materialClassifyId" jdbcType="BIGINT"/>
+        <result column="dep_id" property="depId" jdbcType="BIGINT"/>
+        <result column="dep_name" property="depName" jdbcType="VARCHAR"/>
+        <result column="material_name" property="materilaName" jdbcType="VARCHAR"/>
+        <result column="consumable" property="consumable" jdbcType="TINYINT"/>
+        <result column="del_flag" property="delFlag" jdbcType="INTEGER"/>
+        <result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
+        <result column="create_uid" property="createUid" jdbcType="BIGINT"/>
+        <result column="create_uname" property="createUname" jdbcType="VARCHAR"/>
+        <result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
+        <result column="update_uid" property="updateUid" jdbcType="BIGINT"/>
+        <result column="update_uname" property="updateUname" jdbcType="VARCHAR"/>
+    </resultMap>
+    <!--查询单条数据-->
+    <select id="queryById" resultMap="materialResult">
+        select id,serial_num,material_classify_id,dep_id,dep_name,material_name,consumable,del_flag,create_time,create_uid,create_uname,update_time,update_uid,update_uname from safe_material where id = #{id} and del_flag = 0;
+    </select>
+    <!--查询所有数量-->
+    <select id="getTotalCount" resultType="java.lang.Integer">
+        select count(1) from safe_material;
+    </select>
+    <!--根据类型统计数量-->
+    <select id="getCountByClassify" resultType="java.lang.Integer">
+        select count(1) from safe_material where del_flag = 0 and material_classify_id = #{classifyId}
+    </select>
+    <update id="deleteBatch">
+        update safe_material set del_flag = 1 where id in
+        <foreach collection="ids" item="id" separator="," open="(" close=")" >
+            #{id}
+        </foreach>
+    </update>
+    <!--条件查询-->
+    <select id="listByConditions" resultType="com.gkhy.safePlatform.equipment.entity.SafeMaterialDO">
+        select m.id,
+               m.serial_num,
+               m.material_classify_id,
+               m.dep_id,
+               m.dep_name,
+               m.material_name,
+               m.consumable,
+               c.material_classify_name
+        from safe_material m
+        inner join safe_material_classify c
+        on m.material_classify_id = c.id
+        where m.del_flag = 0
+        <if test="query.materialName != null and query.materialName != '' ">
+            and instr(m.material_name,#{query.materialName})>0
+        </if>
+        <if test="query.materialClassifyId != null">
+            and m.material_classify_id = #{query.materialClassifyId}
+        </if>
+        order by m.create_time desc
+    </select>
+
+
+</mapper>
diff --git a/pom.xml b/pom.xml
index 5dd6e01..c7db91e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,7 @@
         <jta.starter.version>2.7.1</jta.starter.version>
         <commons.utils.version>1.9.4</commons.utils.version>
         <redission.version>3.17.4</redission.version>
+        <rocketmq.starter.version>2.2.2</rocketmq.starter.version>
     </properties>
 
     <dependencyManagement>
@@ -144,6 +145,18 @@
                 <groupId>org.redisson</groupId>
                 <artifactId>redisson-spring-boot-starter</artifactId>
                 <version>${redission.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>org.apache.rocketmq</groupId>
+                <artifactId>rocketmq-spring-boot</artifactId>
+                <version>${rocketmq.starter.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>cn.hutool</groupId>
+                <artifactId>hutool-all</artifactId>
+                <version>5.8.5</version>
             </dependency>
 
         </dependencies>
@@ -264,6 +277,19 @@
             <artifactId>account-rpc-api</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.rocketmq</groupId>
+            <artifactId>rocketmq-spring-boot</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/database/MyBatisConfigEquipment.java b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/database/MyBatisConfigEquipment.java
index 0237202..c58fb65 100644
--- a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/database/MyBatisConfigEquipment.java
+++ b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/database/MyBatisConfigEquipment.java
@@ -2,8 +2,10 @@
 
 import com.alibaba.druid.pool.DruidDataSource;
 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
+import com.baomidou.mybatisplus.core.config.GlobalConfig;
 import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
 import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
+import com.gkhy.safePlatform.equipment.handler.MyMetaObjectHandler;
 import org.apache.ibatis.plugin.Interceptor;
 import org.apache.ibatis.session.SqlSessionFactory;
 import org.mybatis.spring.SqlSessionTemplate;
@@ -63,6 +65,11 @@
         //设置分页插件
         Interceptor[] plugins = {mybatisPlusInterceptor};
         factoryBean.setPlugins(plugins);
+
+        GlobalConfig globalConfig = new GlobalConfig();
+        globalConfig.setMetaObjectHandler(new MyMetaObjectHandler());
+        factoryBean.setGlobalConfig(globalConfig);
+
         return factoryBean.getObject();
     }
 
diff --git a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/exception/GlobalExceptionHandler.java b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/exception/GlobalExceptionHandler.java
index 56d1879..cce9141 100644
--- a/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/exception/GlobalExceptionHandler.java
+++ b/safePlatfrom-out-web/src/main/java/com/gkhy/safePlatform/config/exception/GlobalExceptionHandler.java
@@ -6,12 +6,14 @@
 import com.gkhy.safePlatform.commons.exception.BusinessException;
 import com.gkhy.safePlatform.commons.vo.ResultVO;
 import com.gkhy.safePlatform.emergency.excepiton.EmergencyException;
+import com.gkhy.safePlatform.equipment.excepiton.EquipmentException;
 import com.gkhy.safePlatform.incidentManage.exception.AccidentException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.security.access.AccessDeniedException;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.annotation.ControllerAdvice;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
@@ -38,6 +40,15 @@
     @ResponseBody
     @ExceptionHandler(value = EmergencyException.class)
     public ResultVO AHandler(EmergencyException e) {
+        logger.warn(e.getMessage());
+        return new ResultVO(e.getCode(),e.getMessage());
+    }
+    /**
+     * 设备自定义异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = EquipmentException.class)
+    public ResultVO AHandler(EquipmentException e) {
         logger.warn(e.getMessage());
         return new ResultVO(e.getCode(),e.getMessage());
     }
@@ -115,4 +126,15 @@
         return resultVO;
 //        return new ResultVO(ResultCodes.SERVER_ERROR);
     }
+    /**
+     * 处理入参异常
+     * @param e
+     * @return
+     */
+    @ResponseBody
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    public ResultVO handleMethodArgumentNotValidException(MethodArgumentNotValidException e){
+        logger.warn(e.getBindingResult().getFieldError().getDefaultMessage());
+        return new ResultVO(ResultCodes.SERVER_PARAM_NULL.getCode(),e.getBindingResult().getFieldError().getDefaultMessage());
+    }
 }
diff --git a/safePlatfrom-out-web/src/main/resources/config/application-dev.yaml b/safePlatfrom-out-web/src/main/resources/config/application-dev.yaml
index 1f344b6..5e825ae 100644
--- a/safePlatfrom-out-web/src/main/resources/config/application-dev.yaml
+++ b/safePlatfrom-out-web/src/main/resources/config/application-dev.yaml
@@ -74,6 +74,10 @@
 mybatis-plus:
   configuration:
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  global-config:
+    db-config:
+      logic-delete-value: 1
+      logic-not-delete-value: 0
 
 dubbo:
   registry:
@@ -112,8 +116,11 @@
     sendMessageTimeout: 300000
   consumer:
     group: gkhy-safeplatform-out-dev
+    safeMaterialGroup: gkhy-safeplatform-out-safeMaterialConsumer
   topic:
     demoTopic: gkhy-safeplatform-topic-demo
+    safeMaterialTopic: gkhy-safeplatform-out-safeMaterialTopic
+
 
 minio:
   endPoint: 192.168.0.52

--
Gitblit v1.9.2