Browse Source

杰生迭代

home 2 years ago
parent
commit
e70f7b7b64

+ 1 - 1
hx-common/code-generator/src/main/java/com/fjhx/modular/StorageRestructure.java

@@ -12,7 +12,7 @@ public class StorageRestructure {
         CodeGenerator.MODULAR_NAME = "storage-restructure";
         CodeGenerator.MODULAR_NAME = "storage-restructure";
 
 
         // 需要生成的表名称,多表用,隔开
         // 需要生成的表名称,多表用,隔开
-        CodeGenerator.INCLUDE = "check";
+        CodeGenerator.INCLUDE = "check_detail";
 
 
         // mysql连接
         // mysql连接
         CodeGenerator.MYSQL_URL = "36.134.91.96:17330";
         CodeGenerator.MYSQL_URL = "36.134.91.96:17330";

+ 6 - 0
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/base/StorageBaseService.java

@@ -2,6 +2,7 @@ package com.fjhx.base;
 
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -10,6 +11,7 @@ import com.fjhx.utils.PageUtil;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.secure.utils.AuthUtil;
 
 
 import java.util.*;
 import java.util.*;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 
 
@@ -68,6 +70,10 @@ public interface StorageBaseService<T> extends IService<T> {
         return lambdaQuery().eq(column, val).list();
         return lambdaQuery().eq(column, val).list();
     }
     }
 
 
+    default List<T> list(Consumer<LambdaQueryWrapper<T>> consumer) {
+        return list(Wrappers.<T>lambdaQuery().func(consumer));
+    }
+
     /**
     /**
      * 条件查询
      * 条件查询
      */
      */

+ 0 - 1
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/constants/RabbitConstant.java

@@ -11,7 +11,6 @@ public interface RabbitConstant {
      * 指令路由器
      * 指令路由器
      */
      */
     String INSTRUCTIONS_ROUTING_KEY = "instructions_routingKey";
     String INSTRUCTIONS_ROUTING_KEY = "instructions_routingKey";
-    
 
 
     /**
     /**
      * rfid数据队列
      * rfid数据队列

+ 4 - 9
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/entity/check/Check.java

@@ -42,15 +42,15 @@ public class Check extends StorageBaseEntity {
     /**
     /**
      * 人工盘点结果 (0异常,1正常)
      * 人工盘点结果 (0异常,1正常)
      */
      */
-    private Integer peopleCheckResut;
+    private Integer peopleCheckResult;
 
 
     /**
     /**
-     * 审批状态(0待审批,1审批中,2已审批,3已驳回,4已撤回)
+     * 发起人id
      */
      */
-    private Integer flowStatus;
+    private Long taskUserId;
 
 
     /**
     /**
-     * 操作人
+     * 操作人id
      */
      */
     private Long operUserId;
     private Long operUserId;
 
 
@@ -70,11 +70,6 @@ public class Check extends StorageBaseEntity {
     private Date endTime;
     private Date endTime;
 
 
     /**
     /**
-     * 任务执行最小时间
-     */
-    private Date runMinTime;
-
-    /**
      * 逻辑删除 0未删除 1已删除
      * 逻辑删除 0未删除 1已删除
      */
      */
     @TableField(fill = FieldFill.INSERT)
     @TableField(fill = FieldFill.INSERT)

+ 113 - 0
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/entity/check/CheckDetail.java

@@ -0,0 +1,113 @@
+package com.fjhx.entity.check;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.Version;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.fjhx.base.StorageBaseEntity;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 盘点明细
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CheckDetail extends StorageBaseEntity {
+
+
+    /**
+     * 盘点id
+     */
+    private Long checkId;
+
+    /**
+     * 物料id
+     */
+    private Long materialId;
+
+    /**
+     * 库存数量
+     */
+    private BigDecimal stockQuantity;
+
+    /**
+     * 库存卷数
+     */
+    private Integer stockCount;
+
+    /**
+     * 人工盘点卷数
+     */
+    private Integer checkCount;
+
+    /**
+     * 人工盘点数量
+     */
+    private BigDecimal checkQuantity;
+
+    /**
+     * 扫描卷数
+     */
+    private Integer scanCount;
+
+    /**
+     * 扫描数量
+     */
+    private BigDecimal scanQuantity;
+
+    /**
+     * 手动输入卷数
+     */
+    private Integer handCount;
+
+    /**
+     * 是否完成人工盘点
+     */
+    private Integer completeCheck;
+
+    /**
+     * 审批状态(0待审批,1审批中,2已审批,3已驳回,4已撤回)
+     */
+    private Integer flowStatus;
+
+    /**
+     * 仓库id
+     */
+    private Long stockHouseId;
+
+    /**
+     * 库位id
+     */
+    private Long stockAreaId;
+
+    /**
+     * 盘点时间
+     */
+    private Date checkTime;
+
+    /**
+     * 审核时间
+     */
+    private Date approvalTime;
+
+    /**
+     * 逻辑删除 0未删除 1已删除
+     */
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer delFlag;
+
+    private String oldId;
+
+
+}

+ 17 - 0
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/params/check/CheckDetailEx.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.check;
+
+import com.fjhx.entity.check.CheckDetail;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 盘点明细
+ *
+ * @author ${author}
+ * @since 2022-11-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CheckDetailEx extends CheckDetail {
+
+}

+ 17 - 0
hx-service-api/storage-restructure-api/src/main/java/com/fjhx/params/check/CheckDetailVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.check;
+
+import com.fjhx.entity.check.CheckDetail;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 盘点明细
+ *
+ * @author ${author}
+ * @since 2022-11-03
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class CheckDetailVo extends CheckDetail {
+
+}

+ 56 - 0
hx-service/storage-restructure/src/main/java/com/fjhx/controller/check/CheckDetailController.java

@@ -0,0 +1,56 @@
+package com.fjhx.controller.check;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springblade.core.tool.api.R;
+import com.fjhx.entity.check.CheckDetail;
+import com.fjhx.params.check.CheckDetailVo;
+import com.fjhx.service.check.CheckDetailService;
+import org.springframework.beans.factory.annotation.Autowired;
+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.Map;
+
+/**
+ * <p>
+ * 盘点明细 前端控制器
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-03
+ */
+@RestController
+@RequestMapping("/checkDetail")
+public class CheckDetailController {
+
+    @Autowired
+    private CheckDetailService checkDetailService;
+
+    @PostMapping("/page")
+    public R page(@RequestBody Map<String, String> condition){
+        Page<CheckDetail> result = checkDetailService.getPage(condition);
+        return R.success(result);
+    }
+
+    @PostMapping("/add")
+    public R add(@RequestBody CheckDetailVo checkDetailVo){
+        checkDetailService.add(checkDetailVo);
+        return R.success();
+    }
+
+    @PostMapping("/edit")
+    public R edit(@RequestBody CheckDetailVo checkDetailVo){
+        checkDetailService.edit(checkDetailVo);
+        return R.success();
+    }
+
+    @PostMapping("/delete")
+    public R delete(@RequestBody CheckDetailVo checkDetailVo){
+        checkDetailService.delete(checkDetailVo);
+        return R.success();
+    }
+
+}
+

+ 8 - 1
hx-service/storage-restructure/src/main/java/com/fjhx/listener/WebSocketEventListener.java

@@ -1,11 +1,13 @@
 package com.fjhx.listener;
 package com.fjhx.listener;
 
 
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.fjhx.constants.WebSocketConstant;
 import com.fjhx.constants.WebSocketConstant;
 import com.fjhx.entity.MessageEntity;
 import com.fjhx.entity.MessageEntity;
 import com.fjhx.event.WebSocketOnMessageEvent;
 import com.fjhx.event.WebSocketOnMessageEvent;
 import com.fjhx.event.WebSocketOnOpenEvent;
 import com.fjhx.event.WebSocketOnOpenEvent;
 import com.fjhx.service.WebSocketServer;
 import com.fjhx.service.WebSocketServer;
+import com.fjhx.service.check.impl.CheckServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.event.EventListener;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
@@ -50,7 +52,12 @@ public class WebSocketEventListener {
                 break;
                 break;
 
 
             case WebSocketConstant.PUSH_RFID:
             case WebSocketConstant.PUSH_RFID:
-                WebSocketServer.sendInfo(sendEntity.getUserId(), sendEntity.getSessionId(), type, data);
+
+                if (ObjectUtil.equals(data.get("flag"), "automaticCheck")) {
+                    CheckServiceImpl.RFID_LIST.add(data.getString("rfid"));
+                } else {
+                    WebSocketServer.sendInfo(sendEntity.getUserId(), sendEntity.getSessionId(), type, data);
+                }
                 break;
                 break;
 
 
         }
         }

+ 16 - 0
hx-service/storage-restructure/src/main/java/com/fjhx/mapper/check/CheckDetailMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.mapper.check;
+
+import com.fjhx.entity.check.CheckDetail;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 盘点明细 Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-03
+ */
+public interface CheckDetailMapper extends BaseMapper<CheckDetail> {
+
+}

+ 5 - 0
hx-service/storage-restructure/src/main/java/com/fjhx/mapper/check/CheckDetailMapper.xml

@@ -0,0 +1,5 @@
+<?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.fjhx.mapper.check.CheckDetailMapper">
+
+</mapper>

+ 28 - 0
hx-service/storage-restructure/src/main/java/com/fjhx/service/check/CheckDetailService.java

@@ -0,0 +1,28 @@
+package com.fjhx.service.check;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.entity.check.CheckDetail;
+import com.fjhx.params.check.CheckDetailVo;
+import com.fjhx.base.StorageBaseService;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 盘点明细 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-03
+ */
+public interface CheckDetailService extends StorageBaseService<CheckDetail> {
+
+    Page<CheckDetail> getPage(Map<String, String> condition);
+
+    void add(CheckDetailVo checkDetailVo);
+
+    void edit(CheckDetailVo checkDetailVo);
+
+    void delete(CheckDetailVo checkDetailVo);
+
+}

+ 54 - 0
hx-service/storage-restructure/src/main/java/com/fjhx/service/check/impl/CheckDetailServiceImpl.java

@@ -0,0 +1,54 @@
+package com.fjhx.service.check.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.utils.WrapperUtil;
+import com.fjhx.entity.check.CheckDetail;
+import com.fjhx.params.check.CheckDetailVo;
+import com.fjhx.mapper.check.CheckDetailMapper;
+import com.fjhx.service.check.CheckDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 盘点明细 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-03
+ */
+@Service
+public class CheckDetailServiceImpl extends ServiceImpl<CheckDetailMapper, CheckDetail> implements CheckDetailService {
+
+    @Override
+    public Page<CheckDetail> getPage(Map<String, String> condition) {
+
+        QueryWrapper<CheckDetail> wrapper = Wrappers.query();
+
+        WrapperUtil.init(condition, wrapper)
+                .createTimeDesc();
+
+        Page<CheckDetail> page = page(condition, wrapper);
+        return page;
+    }
+
+    @Override
+    public void add(CheckDetailVo checkDetailVo) {
+        save(checkDetailVo);
+    }
+
+    @Override
+    public void edit(CheckDetailVo checkDetailVo) {
+        updateById(checkDetailVo);
+    }
+
+    @Override
+    public void delete(CheckDetailVo checkDetailVo) {
+        removeById(checkDetailVo.getId());
+    }
+
+}

+ 139 - 7
hx-service/storage-restructure/src/main/java/com/fjhx/service/check/impl/CheckServiceImpl.java

@@ -1,23 +1,33 @@
 package com.fjhx.service.check.impl;
 package com.fjhx.service.check.impl;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.constants.HouseConstant;
 import com.fjhx.constants.HouseConstant;
 import com.fjhx.constants.StatusConstant;
 import com.fjhx.constants.StatusConstant;
+import com.fjhx.constants.WebSocketConstant;
 import com.fjhx.entity.check.Check;
 import com.fjhx.entity.check.Check;
+import com.fjhx.entity.check.CheckDetail;
+import com.fjhx.entity.stock.Stock;
 import com.fjhx.entity.water.WaterTag;
 import com.fjhx.entity.water.WaterTag;
 import com.fjhx.mapper.check.CheckMapper;
 import com.fjhx.mapper.check.CheckMapper;
 import com.fjhx.params.check.CheckVo;
 import com.fjhx.params.check.CheckVo;
+import com.fjhx.service.WebSocketServer;
+import com.fjhx.service.check.CheckDetailService;
 import com.fjhx.service.check.CheckService;
 import com.fjhx.service.check.CheckService;
+import com.fjhx.service.stock.StockService;
 import com.fjhx.service.water.WaterTagService;
 import com.fjhx.service.water.WaterTagService;
 import com.fjhx.utils.WrapperUtil;
 import com.fjhx.utils.WrapperUtil;
+import org.springblade.core.tool.utils.ThreadUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 
-import java.util.List;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -30,9 +40,20 @@ import java.util.Map;
 @Service
 @Service
 public class CheckServiceImpl extends ServiceImpl<CheckMapper, Check> implements CheckService {
 public class CheckServiceImpl extends ServiceImpl<CheckMapper, Check> implements CheckService {
 
 
+    /**
+     * 上位机读取的rfid
+     */
+    public static final List<String> RFID_LIST = Collections.synchronizedList(new ArrayList<>());
+
     @Autowired
     @Autowired
     private WaterTagService waterTagService;
     private WaterTagService waterTagService;
 
 
+    @Autowired
+    private StockService stockService;
+
+    @Autowired
+    private CheckDetailService checkDetailService;
+
     @Override
     @Override
     public Page<Check> getPage(Map<String, String> condition) {
     public Page<Check> getPage(Map<String, String> condition) {
 
 
@@ -60,19 +81,130 @@ public class CheckServiceImpl extends ServiceImpl<CheckMapper, Check> implements
         removeById(checkVo.getId());
         removeById(checkVo.getId());
     }
     }
 
 
+    @Transactional(rollbackFor = Exception.class)
     @Override
     @Override
-    public void automaticCheck() {
+    public synchronized void automaticCheck() {
+
+        JSONObject data = new JSONObject();
+        data.put("instructions", "test");
+        data.put("type", 2);
+        data.put("flag", "automaticCheck");
+
+        WebSocketServer.sendInfo(WebSocketConstant.WEB_STOCK_PROGRAM, WebSocketConstant.OPERATING_UPPER_COMPUTER, data);
+
+        ThreadUtil.sleep(1000 * 60 * 10);
+
+        data.clear();
+        data.put("type", 9);
+        WebSocketServer.sendInfo(WebSocketConstant.WEB_STOCK_PROGRAM, WebSocketConstant.OPERATING_UPPER_COMPUTER, data);
+
+        // 获取在库标签
+        List<WaterTag> list = getInHouseWaterTag();
+
+        List<String> rfidList = RFID_LIST.stream().distinct().collect(Collectors.toList());
+        RFID_LIST.clear();
 
 
-        List<WaterTag> list = waterTagService.list(Wrappers.<WaterTag>lambdaQuery()
-                .eq(WaterTag::getStockHouseId, HouseConstant.FOURTH_FLOOR_ID)
+        // 异常物料id
+        List<Long> errorMaterialId = getErrorMaterialId(list, rfidList);
+
+        // 保存盘点结果
+        Long checkId = savaCheck(errorMaterialId);
+
+        // 保存盘点结果明细
+        savaCheckDetailList(errorMaterialId, checkId);
+
+    }
+
+    /**
+     * 获取在库标签
+     */
+    private List<WaterTag> getInHouseWaterTag() {
+        return waterTagService.list(Wrappers.<WaterTag>lambdaQuery()
+                .eq(WaterTag::getStockHouseId, HouseConstant.GROUND_FLOOR_ID)
                 .eq(WaterTag::getInHouse, StatusConstant.YES)
                 .eq(WaterTag::getInHouse, StatusConstant.YES)
                 .eq(WaterTag::getUseStatus, StatusConstant.YES)
                 .eq(WaterTag::getUseStatus, StatusConstant.YES)
         );
         );
+    }
 
 
+    /**
+     * 获取异常物料id
+     */
+    private List<Long> getErrorMaterialId(List<WaterTag> list, List<String> rfidList) {
+        // 异常物料id
+        HashSet<Long> errorMaterialIdList = new HashSet<>();
+
+        // 在库存,但没有扫描到rfid
+        for (WaterTag waterTag : list) {
+            String rfidCode = waterTag.getRfidCode();
+            if (rfidList.contains(rfidCode)) {
+                rfidList.remove(rfidCode);
+            } else {
+                errorMaterialIdList.add(waterTag.getMaterialId());
+            }
+        }
+
+        // 不在库存,但扫描到rfid
+        errorMaterialIdList.addAll(
+                waterTagService.list(Wrappers.<WaterTag>lambdaQuery()
+                                .select(WaterTag::getMaterialId)
+                                .in(WaterTag::getRfidCode, rfidList)
+                                .eq(WaterTag::getUseStatus, StatusConstant.YES))
+                        .stream().map(WaterTag::getMaterialId)
+                        .collect(Collectors.toSet()));
+
+        return new ArrayList<>(errorMaterialIdList);
+    }
 
 
+    /**
+     * 保存盘点结果
+     */
+    private Long savaCheck(List<Long> errorMaterialId) {
+        Check check = new Check();
+        check.setCheckResult(errorMaterialId.size() == 0 ? 1 : 0);
+        check.setType(1);
+        check.setStatus(0);
+        check.setStockHouseId(HouseConstant.GROUND_FLOOR_ID);
+        check.setBeginTime(new Date());
+        save(check);
+        return check.getId();
+    }
 
 
-
-
+    /**
+     * 保存盘点结果明细
+     */
+    private void savaCheckDetailList(List<Long> errorMaterialId, Long checkId) {
+
+        // 库存信息
+        List<Stock> stockList = stockService.list(q -> q.in(Stock::getMaterialId, errorMaterialId));
+        // 库存信息map
+        Map<Long, Stock> stockMap = stockList.stream().collect(Collectors.toMap(
+                Stock::getMaterialId,
+                item -> item,
+                (v1, v2) -> v1
+        ));
+
+        // 盘点结果明细列表
+        List<CheckDetail> checkDetailList = errorMaterialId.stream().map(materialId -> {
+            CheckDetail checkDetail = new CheckDetail();
+            checkDetail.setCheckId(checkId);
+            checkDetail.setMaterialId(materialId);
+
+            Stock stock = stockMap.get(materialId);
+            if (stock == null) {
+                checkDetail.setStockQuantity(BigDecimal.ZERO);
+                checkDetail.setStockCount(0);
+            } else {
+                checkDetail.setStockQuantity(stock.getQuantity());
+                checkDetail.setStockCount(stock.getNumber());
+            }
+            checkDetail.setCompleteCheck(StatusConstant.NO);
+            checkDetail.setStockHouseId(HouseConstant.GROUND_FLOOR_ID);
+
+
+            return checkDetail;
+        }).collect(Collectors.toList());
+
+        checkDetailService.saveBatch(checkDetailList);
     }
     }
 
 
 }
 }