hfxc226 2 anos atrás
pai
commit
ac8fbc20c5

+ 1 - 1
platform-dao/src/main/java/com/platform/dao/dto/sqarepartmanage/SparePartInfoDTO.java

@@ -46,7 +46,7 @@ public class SparePartInfoDTO extends BaseDTO implements Serializable {
      */
     private Integer warnStatus;
     /**
-     * 类型主键
+     * 状态列表,用于查询
      */
     private List<Integer> warnStatusList;
     /**

+ 22 - 0
platform-dao/src/main/java/com/platform/dao/dto/store/SpareStoreDTO.java

@@ -45,10 +45,32 @@ public class SpareStoreDTO extends BaseDTO implements Serializable {
      * 预设采购价
      */
     private BigDecimal initPurchasePrice;
+
+    /**
+     * 预警状态:1:待处理,2询价中,3采购中,4已结束
+     */
+    private Integer warnStatus;
+    /**
+     * 状态列表,用于查询
+     */
+    private List<Integer> warnStatusList;
+    /**
+     * 最高库存
+     */
+    private BigDecimal maxStock;
+    /**
+     * 最低库存
+     */
+    private BigDecimal minStock;
     /**
      * 期初成本价
      */
     private BigDecimal initPrice;
+    /**
+     * 查找库存小于最低库存的
+     */
+    @Transient
+    private Boolean searchMinStockWarn;
     /**
      * 图片
      */

+ 13 - 0
platform-dao/src/main/java/com/platform/dao/entity/store/SpareStore.java

@@ -42,6 +42,19 @@ public class SpareStore implements Serializable {
      * 数量
      */
     private BigDecimal num;
+
+    /**
+     * 预警状态:1:待处理,2询价中,3采购中,4已结束
+     */
+    private Integer warnStatus;
+    /**
+     * 最高库存
+     */
+    private BigDecimal maxStock;
+    /**
+     * 最低库存
+     */
+    private BigDecimal minStock;
     /**
      * 图片:备件基础信息中的图片
      */

+ 2 - 2
platform-dao/src/main/java/com/platform/dao/enums/WorkplaceBacklogDetailTypeEnum.java

@@ -103,8 +103,8 @@ public enum WorkplaceBacklogDetailTypeEnum {
      * 采购验收提醒-物资
      */
     PURCHASE_WUZI_MESSAGE(502, "询价审批结果提醒"),
-    CHECK_SPARE_WARN(1000, "备件不足提醒");
-
+    SPARE_MIN_WARN(400, "备件不足提醒"),
+    SPARE_STORE_MIN_WARN(401, "仓库备件不足提醒");
     private Integer value;
 
     private final String description;

+ 6 - 1
platform-dao/src/main/java/com/platform/dao/enums/WorkplaceBacklogTypeEnum.java

@@ -75,7 +75,12 @@ public enum WorkplaceBacklogTypeEnum {
     /**
      * 6个月内保养备件不足提醒
      */
-    CHECK_SPARE_WARN(400) ;
+    SPARE_MIN_WARN(400) ,
+
+    /**
+     * 仓库最低库存提醒
+     */
+    SPARE_STORE_MIN_WARN(401) ;
     private Integer value;
 
 }

+ 9 - 15
platform-dao/src/main/java/com/platform/dao/vo/query/store/SpareStoreVO.java

@@ -2,17 +2,12 @@ package com.platform.dao.vo.query.store;
 
 import com.platform.common.bean.BaseVO;
 import lombok.Data;
-
-import com.platform.common.bean.BaseDTO;
-import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
 
-import javax.validation.constraints.*;
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.time.LocalDate;
 
 /**
  * @Description 备件库存VO结果类
@@ -26,10 +21,17 @@ import java.time.LocalDate;
 public class SpareStoreVO extends BaseVO implements Serializable {
 
     /**
-     * 预警状态:1:待处理,2询价中,3采购中,0正常
+     * 最低库存预警状态:1:待处理,2询价中,3采购中,0正常
      */
     private Integer warnStatus;
-
+    /**
+     * 最高库存
+     */
+    private BigDecimal maxStock;
+    /**
+     * 最低库存
+     */
+    private BigDecimal minStock;
     /**
      * 保养预警状态:1:待处理,2询价中,3采购中,0正常
      */
@@ -96,14 +98,6 @@ public class SpareStoreVO extends BaseVO implements Serializable {
      * 数量
      */
     private BigDecimal num;
-    /**
-     * 最低库存
-     */
-    private BigDecimal minStock;
-    /**
-     * 最高库存
-     */
-    private BigDecimal maxStock;
     /**
      * 库存数量
      */

+ 43 - 5
platform-dao/src/main/resources/mapper/store/SpareStoreMapper.xml

@@ -16,6 +16,9 @@
                                      sparestore.sort,
                                      sparestore.del_flag,
                                      sparestore.remark,
+sparestore.warn_status,
+sparestore.max_stock,
+sparestore.min_stock,
                                      sparestore.created_user_id,
                                      sparestore.created_user_name,
                                      sparestore.update_user_id,
@@ -37,7 +40,10 @@
                                      sparestore.sort,
                                      sparestore.del_flag,
                                      sparestore.remark,
-                                                                                                                                                                                                                                                                                                </sql>
+sparestore.warn_status,
+sparestore.max_stock,
+sparestore.min_stock
+    </sql>
     <sql id="List_Condition">
         <if test="id != null and id != ''">
             and sparestore.id = #{id}
@@ -51,6 +57,15 @@
         <if test="num != null">
             and sparestore.num > #{num}
         </if>
+        <if test="warnStatus != null and warnStatus != ''">
+            AND sparestore.warn_status = #{warnStatus}
+        </if>
+        <if test="warnStatusList != null and warnStatusList.size > 0">
+            AND sparestore.warn_status in
+            <foreach item="item" index="index" collection="warnStatusList" open="(" close=")" separator=",">
+                #{item}
+            </foreach>
+        </if>
         <if test="sort != null">
             and sparestore.sort = #{sort}
         </if>
@@ -111,21 +126,23 @@
         info.NO,
         info.NAME,
         info.unit,
-        info.min_stock,
         info.type_id,
-        info.max_stock,
         info.warn_status,
         info.forecast_status,
         info.init_no AS initNo,
         info.ggxh,
         info.initial_value as price,
-        FIRST.totalStock
+        FIRST.totalStock,
+        FIRST.minStock,
+        FIRST.maxStock
         FROM
         t_spare_part_info info
         LEFT JOIN
         (
         SELECT
         sparestore.spare_id,
+        sparestore.min_stock maxStock,
+        sparestore.max_stock minStock,
         SUM( num ) AS totalStock
         FROM
         t_spare_store sparestore
@@ -136,6 +153,12 @@
                     #{item}
                 </foreach>
             </if>
+            <if test="warnStatusList != null and warnStatusList.size > 0">
+                AND warn_status in
+                <foreach item="item" index="index" collection="warnStatusList" open="(" close=")" separator=",">
+                    #{item}
+                </foreach>
+            </if>
         </where>
         GROUP BY
         sparestore.spare_id
@@ -144,6 +167,9 @@
         <if test="typeId != null and typeId != ''">
             and info.type_id = #{typeId}
         </if>
+        <if test="minStock != null">
+            and FIRST.totalStock > #{typeId}
+        </if>
         <if test="keyword != null and keyword != ''">
             AND ( info.name like concat('%',#{keyword},'%') or
             info.ggxh like concat('%',#{keyword},'%'))
@@ -176,6 +202,12 @@
                     #{item}
                 </foreach>
             </if>
+            <if test="searchMinStockWarn">
+                AND sparestore.min_stock is not null
+            </if>
+            <if test="searchMinStockWarn">
+                AND sparestore.warn_status = 0
+            </if>
             <if test="typeId != null and typeId != ''">
                 and spareinfo.type_id = #{typeId}
             </if>
@@ -215,8 +247,14 @@
             <if test="isSpecial != null">
                 and spareinfo.is_special = #{isSpecial}
             </if>
-
+            <if test="warnStatus != null">
+                AND spareinfo.warn_status = #{warnStatus}
+            </if>
         </where>
+        group by sparestore.id
+        <if test="searchMinStockWarn">
+            HAVING sparestore.min_stock > SUM( spareStore.num )
+        </if>
     </select>
     <select id="selectDetail" parameterType="com.platform.dao.dto.store.SpareStoreDTO"
             resultType="com.platform.dao.vo.query.store.SpareStoreVO">

+ 116 - 117
platform-rest/src/main/java/com/platform/rest/controller/store/SpareStoreController.java

@@ -42,61 +42,61 @@ import javax.servlet.http.HttpServletResponse;
 @AllArgsConstructor
 @RequestMapping("/store/spare-stores")
 public class SpareStoreController {
-  private final StoreMapper storeMapper;
-
-  private final  SpareStoreService spareStoreService;
-
-  /**
-   * 通过id查询单条记录
-   *
-   * @param id 主键
-   * @return R
-   */
-  @GetMapping("/{id}")
-  public R<SpareStoreVO> getById(@PathVariable("id") String id) throws IOException {
-      return new R<>(spareStoreService.getDetail(id));
-  }
-
-  /**
-   * 新增记录
-   *
-   * @param spareStoreDTO 备件库存DTO
-   * @return R
-   */
-  @SysLog("新增备件库存")
-  @PostMapping
-  @PreAuthorize("@pms.hasPermission('store-spare-stores-add')")
-  public R save(@Validated({AddGroup.class}) @RequestBody SpareStoreDTO spareStoreDTO) {
-      return new R<>(spareStoreService.saveModelByDTO(spareStoreDTO));
-  }
-
-  /**
-   * 修改记录
-   *
-   * @param spareStoreDTO 备件库存DTO
-   * @return R
-   */
-  @SysLog("修改备件库存")
-  @PutMapping("/{id}")
-  @PreAuthorize("@pms.hasPermission('store-spare-stores-edit')")
-  public R update(@PathVariable("id") String id, @Validated({UpdateGroup.class}) @RequestBody SpareStoreDTO spareStoreDTO) {
-      spareStoreService.modModelByDTO(spareStoreDTO);
-      return new R<>();
-  }
-
-  /**
-   * 通过id删除一条记录
-   *
-   * @param id 主键
-   * @return R
-   */
-  @SysLog("删除备件库存")
-  @DeleteMapping("/{id}")
-  @PreAuthorize("@pms.hasPermission('store-spare-stores-del')")
-  public R removeById(@PathVariable String id){
-    spareStoreService.deleteByPrimaryKey(id);
-    return new R<>();
-  }
+    private final StoreMapper storeMapper;
+
+    private final SpareStoreService spareStoreService;
+
+    /**
+     * 通过id查询单条记录
+     *
+     * @param id 主键
+     * @return R
+     */
+    @GetMapping("/{id}")
+    public R<SpareStoreVO> getById(@PathVariable("id") String id) throws IOException {
+        return new R<>(spareStoreService.getDetail(id));
+    }
+
+    /**
+     * 新增记录
+     *
+     * @param spareStoreDTO 备件库存DTO
+     * @return R
+     */
+    @SysLog("新增备件库存")
+    @PostMapping
+    @PreAuthorize("@pms.hasPermission('store-spare-stores-add')")
+    public R save(@Validated({AddGroup.class}) @RequestBody SpareStoreDTO spareStoreDTO) {
+        return new R<>(spareStoreService.saveModelByDTO(spareStoreDTO));
+    }
+
+    /**
+     * 修改记录
+     *
+     * @param spareStoreDTO 备件库存DTO
+     * @return R
+     */
+    @SysLog("修改备件库存")
+    @PutMapping("/{id}")
+    @PreAuthorize("@pms.hasPermission('store-spare-stores-edit')")
+    public R update(@PathVariable("id") String id, @Validated({UpdateGroup.class}) @RequestBody SpareStoreDTO spareStoreDTO) {
+        spareStoreService.modModelByDTO(spareStoreDTO);
+        return new R<>();
+    }
+
+    /**
+     * 通过id删除一条记录
+     *
+     * @param id 主键
+     * @return R
+     */
+    @SysLog("删除备件库存")
+    @DeleteMapping("/{id}")
+    @PreAuthorize("@pms.hasPermission('store-spare-stores-del')")
+    public R removeById(@PathVariable String id) {
+        spareStoreService.deleteByPrimaryKey(id);
+        return new R<>();
+    }
 
     /**
      * 批量记录
@@ -107,44 +107,43 @@ public class SpareStoreController {
     @SysLog("批量删除备件库存")
     @DeleteMapping("")
     @PreAuthorize("@pms.hasPermission('store-spare-stores-del')")
-    public R removeIds(@RequestBody List<String> ids){
+    public R removeIds(@RequestBody List<String> ids) {
         spareStoreService.batchDelete(ids);
         return new R<>();
     }
 
-  /**
-   * 获取分页
-   *
-   * @param pageNum 当前页码
-   * @param pageSize 每页条数
-   * @param spareStoreDTO 备件库存DTO
-   * @return R
-   */
-  @GetMapping("/page")
-  public R<AbstractPageResultBean<SpareStoreVO>> query(SpareStoreDTO spareStoreDTO, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "20") int pageSize) {
-      // 备件库存
-      /**Map<String,List> formMap = SpareStoreTest.getList();
-      List<SpareStore> inList = formMap.get("in");
-      List<SparePartInfo>  partList = SpareInfo.getList();
-      for(SpareStore form:inList){
-          for(SparePartInfo part:partList){
-              if(form.getSpareId().equals(part.getNo())){
-                  form.setSpareId(part.getId());
-                  spareStoreService.saveModel(form);
-                  break;
-              }
-          }
-      }*/
-      return new R<>(spareStoreService.selectPageList(spareStoreDTO, pageNum, pageSize));
-  }
-
+    /**
+     * 获取分页
+     *
+     * @param pageNum       当前页码
+     * @param pageSize      每页条数
+     * @param spareStoreDTO 备件库存DTO
+     * @return R
+     */
+    @GetMapping("/page")
+    public R<AbstractPageResultBean<SpareStoreVO>> query(SpareStoreDTO spareStoreDTO, @RequestParam(defaultValue = "1") int pageNum, @RequestParam(defaultValue = "20") int pageSize) {
+        // 备件库存
+        /**Map<String,List> formMap = SpareStoreTest.getList();
+         List<SpareStore> inList = formMap.get("in");
+         List<SparePartInfo>  partList = SpareInfo.getList();
+         for(SpareStore form:inList){
+         for(SparePartInfo part:partList){
+         if(form.getSpareId().equals(part.getNo())){
+         form.setSpareId(part.getId());
+         spareStoreService.saveModel(form);
+         break;
+         }
+         }
+         }*/
+        return new R<>(spareStoreService.selectPageList(spareStoreDTO, pageNum, pageSize));
+    }
 
     /**
      * 获取项目部仓库汇总分页
      * 统计某个分公司下某个项目部的总仓库库存,这个就是各个仓库累加的结果
      *
-     * @param pageNum 当前页码
-     * @param pageSize 每页条数
+     * @param pageNum       当前页码
+     * @param pageSize      每页条数
      * @param spareStoreDTO 备件库存DTO
      * @return R
      */
@@ -153,46 +152,46 @@ public class SpareStoreController {
         return new R<>(spareStoreService.selectTotalStockPageInfo(spareStoreDTO, pageNum, pageSize));
     }
 
-  /**
-   * 获取列表
-   *
-   * @param spareStoreDTO 备件库存DTO
-   * @return R
-   */
-  @GetMapping("")
-  public R query(SpareStoreDTO spareStoreDTO) {
-      return new R<>(spareStoreService.getListByDTO(spareStoreDTO));
-  }
-
-  /**
+    /**
+     * 获取列表
+     *
+     * @param spareStoreDTO 备件库存DTO
+     * @return R
+     */
+    @GetMapping("")
+    public R query(SpareStoreDTO spareStoreDTO) {
+        return new R<>(spareStoreService.getListByDTO(spareStoreDTO));
+    }
+
+    /**
      * 备件库存导出
      * 导出某个仓库下面的仓库数量,单价、总价
-     *  需要先选定仓库
+     * 需要先选定仓库
+     *
      * @param spareStoreDTO 备件库存DTO
      * @return R
      */
-  @GetMapping("/export")
-  @SysLog("仓库备件库存导出")
-  public void export(HttpServletResponse response, SpareStoreDTO spareStoreDTO) {
-    List<SpareStoreVO> list = spareStoreService.getListByDTO(spareStoreDTO);
-    String storeName = "仓库";
-    if(!CollectionUtils.isEmpty(list)){
-        storeName = list.get(0).getStoreName();
+    @GetMapping("/export")
+    @SysLog("仓库备件库存导出")
+    public void export(HttpServletResponse response, SpareStoreDTO spareStoreDTO) {
+        List<SpareStoreVO> list = spareStoreService.getListByDTO(spareStoreDTO);
+        String storeName = "仓库";
+        if (!CollectionUtils.isEmpty(list)) {
+            storeName = list.get(0).getStoreName();
+        }
+        ExcelUtil.exportResponseDict(response, ExportSpareStoreVO.class, BeanConverterUtil.copyListProperties(list, ExportSpareStoreVO.class), storeName + "-备件库存导出");
     }
-    ExcelUtil.exportResponseDict(response, ExportSpareStoreVO.class, BeanConverterUtil.copyListProperties(list, ExportSpareStoreVO.class), storeName +"-备件库存导出");
-  }
-
 
 
-  @GetMapping("/spareInfo")
-  public R getSpareInfoVO(String id) {
-    SpareStoreInfoVO spareStoreInfoVO=spareStoreService.getAllSpareStoreInfoVO(id);
-    spareStoreInfoVO.setStoreId(id);
-    Store store=new Store();
-    store.setId(id);
-    Store store1=storeMapper.selectByPrimaryKey(store);
-    spareStoreInfoVO.setStoreName(store1.getName());
-    return new R(spareStoreInfoVO);
-  }
+    @GetMapping("/spareInfo")
+    public R getSpareInfoVO(String id) {
+        SpareStoreInfoVO spareStoreInfoVO = spareStoreService.getAllSpareStoreInfoVO(id);
+        spareStoreInfoVO.setStoreId(id);
+        Store store = new Store();
+        store.setId(id);
+        Store store1 = storeMapper.selectByPrimaryKey(store);
+        spareStoreInfoVO.setStoreName(store1.getName());
+        return new R(spareStoreInfoVO);
+    }
 
 }

+ 28 - 0
platform-rest/src/main/java/com/platform/rest/task/SpareStoreTask.java

@@ -0,0 +1,28 @@
+package com.platform.rest.task;
+
+import com.platform.service.sqarepartmanage.SparePartInfoService;
+import com.platform.service.store.SpareStoreService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description 仓库备件最低库存预警
+ * @Author liuyu
+ * @Date 2020-05-09 16:40:01
+ * @Version Copyright (c) 2020,北京乾元坤和科技有限公司 All rights reserved.
+ */
+@Slf4j
+@Component("spareStoreTask")
+@AllArgsConstructor
+public class SpareStoreTask {
+    private SpareStoreService spareStoreService;
+
+    /**
+     * 最低库存预警判定
+     */
+    public void genMinStockWarn () {
+        spareStoreService.genMinStockWarn();
+    }
+
+}

+ 1 - 1
platform-service/src/main/java/com/platform/service/check/impl/CheckStandardServiceImpl.java

@@ -672,7 +672,7 @@ public class CheckStandardServiceImpl extends BaseServiceImpl<CheckStandardMappe
             List<String> mails = users.stream().map(item -> item.getEmail()).collect(Collectors.toList());
             StringBuffer context = new StringBuffer();
             tasks.forEach(item -> context.append(item.toString()));
-            SpringContextHolder.publishEvent(new WorkplaceBacklogEvent(WorkplaceBacklogTypeEnum.CHECK_SPARE_WARN.getValue(), WorkplaceBacklogDetailTypeEnum.CHECK_SPARE_WARN.getValue(),
+            SpringContextHolder.publishEvent(new WorkplaceBacklogEvent(WorkplaceBacklogTypeEnum.SPARE_MIN_WARN.getValue(), WorkplaceBacklogDetailTypeEnum.SPARE_MIN_WARN.getValue(),
                     null, MessageTemplateUtil.getSpareWarnNotic(month, context.toString(), tasks.size()),
                     null, userIds, mails));
         }

+ 2 - 2
platform-service/src/main/java/com/platform/service/sqarepartmanage/impl/SparePartInfoServiceImpl.java

@@ -162,7 +162,7 @@ public class SparePartInfoServiceImpl extends BaseServiceImpl<SparePartInfoMappe
             String url = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.URL_SPARE_MIN_STOCK_WARN.name());
             if (StringUtils.isNotBlank(email)) {
                 // 通过给邮件人员
-                SpringContextHolder.publishEvent(new WorkplaceBacklogEvent(WorkplaceBacklogTypeEnum.CHECK_SPARE_WARN.getValue(), WorkplaceBacklogDetailTypeEnum.CHECK_SPARE_WARN.getValue(),
+                SpringContextHolder.publishEvent(new WorkplaceBacklogEvent(WorkplaceBacklogTypeEnum.SPARE_MIN_WARN.getValue(), WorkplaceBacklogDetailTypeEnum.SPARE_MIN_WARN.getValue(),
                         null, MessageTemplateUtil.getSpareMinStockWarnNotice(domain + url, sparePartInfos.size()),
                         null, null, Arrays.asList(email)));
             }
@@ -218,7 +218,7 @@ public class SparePartInfoServiceImpl extends BaseServiceImpl<SparePartInfoMappe
                     String url = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.URL_SPARE_CHECK_STOCK_WARN.name());
                     if (StringUtils.isNotBlank(email)) {
                         // 通过给邮件人员
-                        SpringContextHolder.publishEvent(new WorkplaceBacklogEvent(WorkplaceBacklogTypeEnum.CHECK_SPARE_WARN.getValue(), WorkplaceBacklogDetailTypeEnum.CHECK_SPARE_WARN.getValue(),
+                        SpringContextHolder.publishEvent(new WorkplaceBacklogEvent(WorkplaceBacklogTypeEnum.SPARE_MIN_WARN.getValue(), WorkplaceBacklogDetailTypeEnum.SPARE_MIN_WARN.getValue(),
                                 null, MessageTemplateUtil.getSpareCheckStockWarnNotice(domain + url, voList.size()),
                                 null, null, Arrays.asList(email)));
                     }

+ 2 - 8
platform-service/src/main/java/com/platform/service/store/SpareStoreService.java

@@ -46,14 +46,7 @@ public interface SpareStoreService extends IBaseService<SpareStore, SpareStoreDT
      * @return
      */
     AbstractPageResultBean<SpareStoreVO> selectTotalStockPageInfo(SpareStoreDTO record, int pageNum, int pageSize);
-    List<SpareStoreVO> selectTotalStock(SpareStoreDTO record);
-    /**
-     * 查询单个备件的库存
-     *
-     * @param record
-     * @return
-     */
-    SpareStoreVO selectOneTotalStock(SpareStoreDTO record);
+
     /**
      * 查看详情
      * @param id
@@ -80,4 +73,5 @@ public interface SpareStoreService extends IBaseService<SpareStore, SpareStoreDT
  public SpareStoreInfoVO getAllSpareStoreInfoVO(String storeId);
 
 
+ void genMinStockWarn();
 }

+ 49 - 28
platform-service/src/main/java/com/platform/service/store/impl/SpareStoreServiceImpl.java

@@ -6,13 +6,11 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.github.pagehelper.PageHelper;
 import com.platform.common.bean.AbstractPageResultBean;
+import com.platform.common.cache.ConfigCache;
 import com.platform.common.constant.CommonConstants;
 import com.platform.common.enums.DataFilterTypeEnum;
 import com.platform.common.exception.BusinessException;
-import com.platform.common.util.BeanConverterUtil;
-import com.platform.common.util.BeanUtils;
-import com.platform.common.util.IdGeneratorUtils;
-import com.platform.common.util.StringUtils;
+import com.platform.common.util.*;
 import com.platform.dao.bean.MyPage;
 import com.platform.dao.bean.MyVOPage;
 import com.platform.dao.dto.sb.SbModelSpareBomDTO;
@@ -22,10 +20,14 @@ import com.platform.dao.dto.store.InStoreFormDTO;
 import com.platform.dao.dto.store.OutStoreFormDTO;
 import com.platform.dao.dto.store.SpareStoreDTO;
 import com.platform.dao.dto.store.StoreDTO;
+import com.platform.dao.entity.sqarepartmanage.SparePartInfo;
 import com.platform.dao.entity.sqarepartmanage.SpareType;
 import com.platform.dao.entity.store.SpareStore;
 import com.platform.dao.entity.store.Store;
 import com.platform.dao.enums.StoreLevelEnum;
+import com.platform.dao.enums.SysConfigEnum;
+import com.platform.dao.enums.WorkplaceBacklogDetailTypeEnum;
+import com.platform.dao.enums.WorkplaceBacklogTypeEnum;
 import com.platform.dao.mapper.sqarepartmanage.SparePartInfoMapper;
 import com.platform.dao.mapper.sqarepartmanage.SparePartUsedMapper;
 import com.platform.dao.mapper.sqarepartmanage.SpareTypeMapper;
@@ -33,6 +35,7 @@ import com.platform.dao.mapper.store.InStoreFormMapper;
 import com.platform.dao.mapper.store.OutStoreFormMapper;
 import com.platform.dao.mapper.store.SpareStoreMapper;
 import com.platform.dao.mapper.store.StoreMapper;
+import com.platform.dao.util.MessageTemplateUtil;
 import com.platform.dao.vo.query.sparepartmanage.SparePartInfoVO;
 import com.platform.dao.vo.query.store.*;
 import com.platform.dao.vo.sb.SbModelSpareBomVO;
@@ -40,6 +43,7 @@ import com.platform.dao.vo.spare.SparePartUsedVO;
 import com.platform.dao.vo.spare.SpareStoreInfoVO;
 import com.platform.dao.vo.spare.SpareTypeVO;
 import com.platform.service.base.impl.BaseServiceImpl;
+import com.platform.service.event.WorkplaceBacklogEvent;
 import com.platform.service.sb.SbModelSpareBomService;
 import com.platform.service.sqarepartmanage.SpareTypeService;
 import com.platform.service.store.SpareStoreService;
@@ -50,6 +54,7 @@ import com.platform.service.util.CodeFileUtils;
 import lombok.AllArgsConstructor;
 import org.springframework.core.env.Environment;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.multipart.MultipartFile;
 import tk.mybatis.mapper.weekend.Weekend;
@@ -58,6 +63,7 @@ import tk.mybatis.mapper.weekend.WeekendCriteria;
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
@@ -267,35 +273,11 @@ public class SpareStoreServiceImpl extends BaseServiceImpl<SpareStoreMapper, Spa
         return new MyPage(mapper.selectTotalStock(record));
     }
 
-    @Override
-    public List<SpareStoreVO> selectTotalStock(SpareStoreDTO record) {
-        return mapper.selectTotalStock(record);
-    }
-
     @Override
     public List<SpareStoreVO> getListByDTO(SpareStoreDTO sparePartInfoDTO) {
         return mapper.selectList(sparePartInfoDTO);
     }
 
-    /**
-     * 查询某个备件的库存
-     * 如果不传递筛选条件,则查询该备件整个集团的库存
-     * @param record
-     *          spareId 备件id
-     *          useCompany 所属分公司
-     *          useProject 所属项目部
-     *          userId 所属用户
-     * @return
-     */
-    @Override
-    public SpareStoreVO selectOneTotalStock(SpareStoreDTO record) {
-        List<SpareStoreVO> list = mapper.selectTotalStock(record);
-        if(!CollectionUtils.isEmpty(list)) {
-            return list.get(0);
-        }else{
-            return null;
-        }
-    }
 
     @Override
     public void updateQrCode(SpareStoreDTO model) {
@@ -393,7 +375,46 @@ public class SpareStoreServiceImpl extends BaseServiceImpl<SpareStoreMapper, Spa
         return getSpareStoreInfoVO(storeId,null);
     };
 
+    /**
+     * 定时扫描是否备件小于最低库存
+     *
+     * 1:增加warnStatus状态
+     * 增加warnStatus的枚举类型
+     * 2:每周定时扫描warnStatus为正常的,判断他的最低库存是否正常,有异常的交给人工来判定。并发送邮件通知
+     * 3:扫描的时候,是扫描总库存,有可能仓库里面的备件不在同一个库存。
+     * <p>
+     * 4:增加预警菜单,查出来所有异常的列表
+     * 5:增加人工干预,可以改变每条的状态。
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void genMinStockWarn() {
+        SpareStoreDTO record = new SpareStoreDTO();
+        record.setSearchMinStockWarn(true);
+        // 查找超过最低库存的备件
+        List<SpareStoreVO> spareStoreVOList = mapper.selectList(record);
+        List<SpareStore> sparePartInfos = new ArrayList<>();
+        for (SpareStoreVO sparePartInfoVO : spareStoreVOList) {
+            SpareStore spareStore = new SpareStore();
+            spareStore.setId(sparePartInfoVO.getId());
+            spareStore.setWarnStatus(1);
+            sparePartInfos.add(spareStore);
+            mapper.updateByPrimaryKeySelective(spareStore);
+        }
 
+        if (!CollectionUtils.isEmpty(sparePartInfos)) {
+            // 发送邮件通知
+            String email = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.SPARE_WARN_EMAIL.name());
+            String domain = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.SYSTEM_DOMAIN.name());
+            String url = ConfigCache.getLabelByValueAllowNull(SysConfigEnum.URL_SPARE_MIN_STOCK_WARN.name());
+            if (StringUtils.isNotBlank(email)) {
+                // 通过给邮件人员
+                SpringContextHolder.publishEvent(new WorkplaceBacklogEvent(WorkplaceBacklogTypeEnum.SPARE_STORE_MIN_WARN.getValue(), WorkplaceBacklogDetailTypeEnum.SPARE_STORE_MIN_WARN.getValue(),
+                        null, MessageTemplateUtil.getSpareMinStockWarnNotice(domain + url, sparePartInfos.size()),
+                        null, null, Arrays.asList(email)));
+            }
+        }
+    }