소스 검색

杰生重构

home 2 년 전
부모
커밋
44e5a916b5

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

@@ -37,7 +37,7 @@ public class Storage {
     public static String MODULAR_NAME = "storage";
 
     // 需要生成的表名称,多表用,隔开
-    public static String INCLUDE = "stock_correct";
+    public static String INCLUDE = "stock_tag";
 
     // mysql连接
     public static String MYSQL_URL = "rm-wz9f1jcr5466b42415o.mysql.rds.aliyuncs.com:3306";

+ 134 - 0
hx-service-api/storage-api/src/main/java/com/fjhx/entity/stock/StockTag.java

@@ -0,0 +1,134 @@
+package com.fjhx.entity.stock;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 物料库存明细
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-14
+ */
+@Data
+public class StockTag implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "ID", type = IdType.ASSIGN_UUID)
+    private String id;
+
+    /**
+     * 软删除
+     */
+    @TableField("IsDelete")
+    private Boolean IsDelete;
+
+    /**
+     * 创建时间
+     */
+    @TableField("CreatedTime")
+    private Date CreatedTime;
+
+    /**
+     * 修改时间
+     */
+    @TableField("UpdatedTime")
+    private Date UpdatedTime;
+
+    /**
+     * 物料编号
+     */
+    @TableField("MaterialCode")
+    private String MaterialCode;
+
+    /**
+     * 物料数量
+     */
+    @TableField("Quantity")
+    private BigDecimal Quantity;
+
+    /**
+     * 二维码
+     */
+    @TableField("QRCode")
+    private String QRCode;
+
+    /**
+     * RFID码
+     */
+    @TableField("RfidCode")
+    private String RfidCode;
+
+    /**
+     * 入库编号
+     */
+    @TableField("StockInOutBillNo")
+    private String StockInOutBillNo;
+
+    /**
+     * 采购合同单号
+     */
+    @TableField("PurchaseBillNo")
+    private String PurchaseBillNo;
+
+    /**
+     * 已打印
+     */
+    @TableField("HadPrinter")
+    private Boolean HadPrinter;
+
+    /**
+     * 已出货
+     */
+    @TableField("HadShipment")
+    private Boolean HadShipment;
+
+    /**
+     * 采购进度 (枚举定义:0=供应商打码,1=供应商出货,2=到货贴标,3=本厂入库,4=现场回仓)
+     */
+    @TableField("PurchaseProgress")
+    private Integer PurchaseProgress;
+
+    /**
+     * 出货物流Id
+     */
+    @TableField("ExpressId")
+    private String ExpressId;
+
+    /**
+     * 贴标人
+     */
+    @TableField("LabelUserId")
+    private String LabelUserId;
+
+    /**
+     * 序号
+     */
+    @TableField("Number")
+    private Integer Number;
+
+    /**
+     * 批次号
+     */
+    @TableField("BatchNo")
+    private String BatchNo;
+
+    /**
+     * 质检状态 (枚举定义:0=未质检,1=已质检,2=无需质检)
+     */
+    @TableField("QuantityCheckState")
+    private Integer QuantityCheckState;
+
+
+}

+ 17 - 0
hx-service-api/storage-api/src/main/java/com/fjhx/params/stock/StockTagEx.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.stock;
+
+import com.fjhx.entity.stock.StockTag;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 物料库存明细
+ *
+ * @author ${author}
+ * @since 2022-11-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class StockTagEx extends StockTag {
+
+}

+ 17 - 0
hx-service-api/storage-api/src/main/java/com/fjhx/params/stock/StockTagVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.params.stock;
+
+import com.fjhx.entity.stock.StockTag;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 物料库存明细
+ *
+ * @author ${author}
+ * @since 2022-11-14
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class StockTagVo extends StockTag {
+
+}

+ 195 - 5
hx-service/storage/src/main/java/com/fjhx/listener/WebSocketEventListener.java

@@ -1,18 +1,42 @@
 package com.fjhx.listener;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.cron.CronUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fjhx.entity.MessageEntity;
+import com.fjhx.entity.material.Material;
+import com.fjhx.entity.stock.StockDetail;
+import com.fjhx.entity.stock.StockTag;
+import com.fjhx.event.WebSocketOnCloseEvent;
 import com.fjhx.event.WebSocketOnMessageEvent;
 import com.fjhx.event.WebSocketOnOpenEvent;
+import com.fjhx.material.service.MaterialService;
 import com.fjhx.service.WebSocketServer;
+import com.fjhx.stock.service.StockDetailService;
+import com.fjhx.stock.service.StockTagService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 
+import javax.annotation.PostConstruct;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
 @Slf4j
 @Component
 public class WebSocketEventListener {
 
+    @Autowired
+    private StockTagService stockTagService;
+
+    @Autowired
+    private StockDetailService stockDetailService;
+
+    @Autowired
+    private MaterialService materialService;
+
     /**
      * 上位机userId
      */
@@ -43,6 +67,18 @@ public class WebSocketEventListener {
      */
     final int PUSH_RFID = 3;
 
+    private final Map<String, MessageEntity> map = new ConcurrentHashMap<>();
+
+    /**
+     * 启动定时任务
+     */
+    @PostConstruct
+    public void startCronUtil() {
+        // 支持秒级别定时任务
+        CronUtil.setMatchSecond(true);
+        CronUtil.start();
+    }
+
 
     @EventListener
     public void onMessageListener(WebSocketOnOpenEvent event) {
@@ -51,14 +87,10 @@ public class WebSocketEventListener {
         source.sendMessage(ON_OPEN_TYPE, jsonObject);
     }
 
-
     @EventListener
     public void onMessageListener(WebSocketOnMessageEvent event) {
         WebSocketServer webSocketServer = event.getSource();
         String message = event.getMessage();
-
-        System.err.println(message);
-
         MessageEntity sendEntity = JSONObject.parseObject(message, MessageEntity.class);
 
         Integer type = sendEntity.getType();
@@ -72,11 +104,169 @@ public class WebSocketEventListener {
                 break;
 
             case PUSH_RFID:
-                WebSocketServer.sendInfo(sendEntity.getUserId(), sendEntity.getSessionId(), type, data);
+                businessHandle(sendEntity);
                 break;
         }
 
     }
 
 
+    @EventListener
+    public void onCloseListener(WebSocketOnCloseEvent event) {
+        map.remove(event.getSource().getSessionId());
+    }
+
+
+    /**
+     * 业务处理
+     */
+    private void businessHandle(MessageEntity sendEntity) {
+        JSONObject data = sendEntity.getData();
+
+        switch (data.getInteger("businessType")) {
+            // 入库
+            case 1:
+                warehousing(sendEntity);
+                break;
+            // 出库
+            case 2:
+                issue(sendEntity);
+                break;
+        }
+
+    }
+
+    // 入库锁
+    private final Object warehousingLock = new Object();
+
+    /**
+     * 入库
+     */
+    private void warehousing(MessageEntity sendEntity) {
+        JSONObject data = sendEntity.getData();
+        String rfid = data.getString("rfid");
+        String stockHouseId = data.getString("stockHouseId");
+
+        MessageEntity messageEntity;
+        synchronized (warehousingLock) {
+            messageEntity = this.map.get(sendEntity.getSessionId());
+
+            if (messageEntity == null) {
+                messageEntity = BeanUtil.copyProperties(sendEntity, MessageEntity.class);
+                messageEntity.getData().remove("rfid");
+                messageEntity.getData().put("rfidData", Collections.synchronizedList(new ArrayList<>()));
+
+                CronUtil.schedule(sendEntity.getSessionId(), "*/2 * * * *", () -> {
+                    MessageEntity item = map.get(sendEntity.getSessionId());
+                    WebSocketServer.sendInfo(item.getUserId(), item.getSessionId(), item.getType(), item.getData());
+                });
+
+                this.map.put(sendEntity.getSessionId(), messageEntity);
+            }
+        }
+
+        List<Map<String, Object>> rfidData = (List) messageEntity.getData().get("rfidData");
+
+        StockTag stockTag = stockTagService.getOne(Wrappers.<StockTag>lambdaQuery()
+                .select(StockTag::getMaterialCode, StockTag::getQuantity)
+                .eq(StockTag::getRfidCode, rfid)
+                .eq(StockTag::getIsDelete, 0)
+                .last("limit 1")
+        );
+
+        if (stockTag == null) {
+            return;
+        }
+
+        long count = stockDetailService.count(Wrappers.<StockDetail>lambdaQuery()
+                .eq(StockDetail::getStockhouseid, stockHouseId)
+                .eq(StockDetail::getRfidcode, rfid)
+                .eq(StockDetail::getIsdelete, 0)
+                .last("limit 1")
+        );
+
+        // 在库不查
+        if (count > 0) {
+            return;
+        }
+
+        Material material = materialService.getOne(Wrappers.<Material>lambdaQuery()
+                .eq(Material::getCode, stockTag.getMaterialCode()));
+
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("materialId", material.getId());
+        map.put("materialCode", material.getCode());
+        map.put("materialName", material.getName());
+        map.put("quantity", stockTag.getQuantity());
+        map.put("rfid", rfid);
+        rfidData.add(map);
+    }
+
+    // 出库锁
+    private final Object issueLock = new Object();
+
+    /**
+     * 出库
+     */
+    private void issue(MessageEntity sendEntity) {
+        JSONObject data = sendEntity.getData();
+        String rfid = data.getString("rfid");
+        String stockHouseId = data.getString("stockHouseId");
+
+        MessageEntity messageEntity;
+        synchronized (issueLock) {
+            messageEntity = this.map.get(sendEntity.getSessionId());
+
+            if (messageEntity == null) {
+                messageEntity = BeanUtil.copyProperties(sendEntity, MessageEntity.class);
+                messageEntity.getData().remove("rfid");
+                messageEntity.getData().put("rfidData", Collections.synchronizedList(new ArrayList<>()));
+
+                CronUtil.schedule(sendEntity.getSessionId(), "*/2 * * * *", () -> {
+                    MessageEntity item = map.get(sendEntity.getSessionId());
+                    WebSocketServer.sendInfo(item.getUserId(), item.getSessionId(), item.getType(), item.getData());
+                });
+
+                this.map.put(sendEntity.getSessionId(), messageEntity);
+            }
+        }
+
+        List<Map<String, Object>> rfidData = (List) messageEntity.getData().get("rfidData");
+
+        StockTag stockTag = stockTagService.getOne(Wrappers.<StockTag>lambdaQuery()
+                .select(StockTag::getMaterialCode, StockTag::getQuantity)
+                .eq(StockTag::getRfidCode, rfid)
+                .eq(StockTag::getIsDelete, 0)
+                .last("limit 1")
+        );
+
+        // 没有找到标签信息
+        if (stockTag == null) {
+            return;
+        }
+
+        long count = stockDetailService.count(Wrappers.<StockDetail>lambdaQuery()
+                .eq(StockDetail::getStockhouseid, stockHouseId)
+                .eq(StockDetail::getRfidcode, rfid)
+                .eq(StockDetail::getIsdelete, 0)
+                .last("limit 1")
+        );
+
+        // 不在库
+        if (count == 0) {
+            return;
+        }
+
+        Material material = materialService.getOne(Wrappers.<Material>lambdaQuery()
+                .eq(Material::getCode, stockTag.getMaterialCode()));
+
+        HashMap<String, Object> map = new HashMap<>();
+        map.put("materialId", material.getId());
+        map.put("materialCode", material.getCode());
+        map.put("materialName", material.getName());
+        map.put("quantity", stockTag.getQuantity());
+        map.put("rfid", rfid);
+        rfidData.add(map);
+    }
+
 }

+ 56 - 0
hx-service/storage/src/main/java/com/fjhx/stock/controller/StockTagController.java

@@ -0,0 +1,56 @@
+package com.fjhx.stock.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.springblade.core.tool.api.R;
+import com.fjhx.entity.stock.StockTag;
+import com.fjhx.params.stock.StockTagVo;
+import com.fjhx.stock.service.StockTagService;
+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-14
+ */
+@RestController
+@RequestMapping("/stockTag")
+public class StockTagController {
+
+    @Autowired
+    private StockTagService stockTagService;
+
+    @PostMapping("/page")
+    public R page(@RequestBody Map<String, String> condition){
+        Page<StockTag> result = stockTagService.getPage(condition);
+        return R.success(result);
+    }
+
+    @PostMapping("/add")
+    public R add(@RequestBody StockTagVo stockTagVo){
+        stockTagService.add(stockTagVo);
+        return R.success();
+    }
+
+    @PostMapping("/edit")
+    public R edit(@RequestBody StockTagVo stockTagVo){
+        stockTagService.edit(stockTagVo);
+        return R.success();
+    }
+
+    @PostMapping("/delete")
+    public R delete(@RequestBody StockTagVo stockTagVo){
+        stockTagService.delete(stockTagVo);
+        return R.success();
+    }
+
+}
+

+ 16 - 0
hx-service/storage/src/main/java/com/fjhx/stock/mapper/StockTagMapper.java

@@ -0,0 +1,16 @@
+package com.fjhx.stock.mapper;
+
+import com.fjhx.entity.stock.StockTag;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 物料库存明细 Mapper 接口
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-14
+ */
+public interface StockTagMapper extends BaseMapper<StockTag> {
+
+}

+ 5 - 0
hx-service/storage/src/main/java/com/fjhx/stock/mapper/StockTagMapper.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.stock.mapper.StockTagMapper">
+
+</mapper>

+ 28 - 0
hx-service/storage/src/main/java/com/fjhx/stock/service/StockTagService.java

@@ -0,0 +1,28 @@
+package com.fjhx.stock.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.entity.stock.StockTag;
+import com.fjhx.params.stock.StockTagVo;
+import com.fjhx.base.BaseService;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 物料库存明细 服务类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-14
+ */
+public interface StockTagService extends BaseService<StockTag> {
+
+    Page<StockTag> getPage(Map<String, String> condition);
+
+    void add(StockTagVo stockTagVo);
+
+    void edit(StockTagVo stockTagVo);
+
+    void delete(StockTagVo stockTagVo);
+
+}

+ 54 - 0
hx-service/storage/src/main/java/com/fjhx/stock/service/impl/StockTagServiceImpl.java

@@ -0,0 +1,54 @@
+package com.fjhx.stock.service.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.stock.StockTag;
+import com.fjhx.params.stock.StockTagVo;
+import com.fjhx.stock.mapper.StockTagMapper;
+import com.fjhx.stock.service.StockTagService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 物料库存明细 服务实现类
+ * </p>
+ *
+ * @author ${author}
+ * @since 2022-11-14
+ */
+@Service
+public class StockTagServiceImpl extends ServiceImpl<StockTagMapper, StockTag> implements StockTagService {
+
+    @Override
+    public Page<StockTag> getPage(Map<String, String> condition) {
+
+        QueryWrapper<StockTag> wrapper = Wrappers.query();
+
+        WrapperUtil.init(condition, wrapper)
+                .createTimeDesc();
+
+        Page<StockTag> page = page(condition, wrapper);
+        return page;
+    }
+
+    @Override
+    public void add(StockTagVo stockTagVo) {
+        save(stockTagVo);
+    }
+
+    @Override
+    public void edit(StockTagVo stockTagVo) {
+        updateById(stockTagVo);
+    }
+
+    @Override
+    public void delete(StockTagVo stockTagVo) {
+        removeById(stockTagVo.getId());
+    }
+
+}