add:redisson:缓存线载具同步功能
This commit is contained in:
@@ -43,7 +43,12 @@
|
|||||||
<artifactId>jansi</artifactId>
|
<artifactId>jansi</artifactId>
|
||||||
<version>1.9</version>
|
<version>1.9</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<!--redisson-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.redisson</groupId>
|
||||||
|
<artifactId>redisson-spring-boot-starter</artifactId>
|
||||||
|
<version>3.16.4</version>
|
||||||
|
</dependency>
|
||||||
<!--登录相关-->
|
<!--登录相关-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>cn.dev33</groupId>
|
<groupId>cn.dev33</groupId>
|
||||||
|
|||||||
@@ -20,12 +20,12 @@ public enum StatusEnum {
|
|||||||
//锁状态
|
//锁状态
|
||||||
LOCK_OFF("0","否",""),
|
LOCK_OFF("0","否",""),
|
||||||
LOCK_ON("1","是",""),
|
LOCK_ON("1","是",""),
|
||||||
//缓存线载具状态00-空位、01-绿色空箱、02-黄色满箱、03-红色异常、04不显示
|
//缓存线载具状态 1-空位、2-绿色空箱、3-黄色满箱、4-红色异常、5不显示
|
||||||
CACHE_VEL_NULL("00","空位",""),
|
CACHE_VEL_NULL("1","空位",""),
|
||||||
CACHE_VEL_EMT("01","绿色空箱",""),
|
CACHE_VEL_EMT("2","绿色空箱",""),
|
||||||
CACHE_VEL_FULL("02","黄色满箱",""),
|
CACHE_VEL_FULL("3","黄色满箱",""),
|
||||||
CACHE_VEL_ERR("03","红色异常",""),
|
CACHE_VEL_ERR("4","红色异常",""),
|
||||||
CACHE_VEL_DIS("04","04不显示",""),
|
CACHE_VEL_DIS("5","不显示",""),
|
||||||
//任务状态
|
//任务状态
|
||||||
TASK_CREATE("1","生成",""),
|
TASK_CREATE("1","生成",""),
|
||||||
TASK_START_P("2","起点确认",""),
|
TASK_START_P("2","起点确认",""),
|
||||||
|
|||||||
@@ -6,12 +6,13 @@ package org.nl.common.enums;
|
|||||||
* @Date: 2023/3/16
|
* @Date: 2023/3/16
|
||||||
*/
|
*/
|
||||||
public enum WorkerOrderEnum {
|
public enum WorkerOrderEnum {
|
||||||
// 1-创建、2-下发、3-生产中、4-暂停、5-完成
|
// 1-创建、2-下发、3-生产中、4-暂停、5-完成 6-强制完成
|
||||||
CREATE("创建", "1"),
|
CREATE("创建", "1"),
|
||||||
SEND("下发", "2"),
|
SEND("下发", "2"),
|
||||||
PRODUCTING("生产中", "3"),
|
PRODUCTING("生产中", "3"),
|
||||||
STOP("暂停", "4"),
|
STOP("暂停", "4"),
|
||||||
COMPLETE("完成", "5"),
|
COMPLETE("完成", "5"),
|
||||||
|
FORCE_COMPLETE("强制完成", "6"),
|
||||||
// 1-PC创建、2-Excel导入
|
// 1-PC创建、2-Excel导入
|
||||||
PCINTO("PC创建", "1"),
|
PCINTO("PC创建", "1"),
|
||||||
EXCELINTO("EXCEL导入", "2"),
|
EXCELINTO("EXCEL导入", "2"),
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package org.nl.common.handler;
|
||||||
|
|
||||||
|
@FunctionalInterface
|
||||||
|
public
|
||||||
|
interface LockProcess {
|
||||||
|
void process();
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
package org.nl.common.utils;
|
||||||
|
|
||||||
|
import lombok.SneakyThrows;
|
||||||
|
import org.nl.common.handler.LockProcess;
|
||||||
|
import org.nl.modules.wql.util.SpringContextHolder;
|
||||||
|
import org.redisson.api.RLock;
|
||||||
|
import org.redisson.api.RedissonClient;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @author ZZQ
|
||||||
|
* @Date 2023/3/27 10:30
|
||||||
|
*/
|
||||||
|
public class RedissonUtils {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param process 业务代码
|
||||||
|
* @param key
|
||||||
|
* @param seconds 尝试获取锁的等待时间,允许为空
|
||||||
|
*/
|
||||||
|
@SneakyThrows
|
||||||
|
public static void lock(LockProcess process, String key, Integer seconds){
|
||||||
|
RedissonClient redissonClient = SpringContextHolder.getBean(RedissonClient.class);
|
||||||
|
RLock lock = redissonClient.getLock(key);
|
||||||
|
boolean isLock;
|
||||||
|
if (seconds == null){
|
||||||
|
isLock = lock.tryLock();
|
||||||
|
}else {
|
||||||
|
isLock = lock.tryLock(seconds, TimeUnit.SECONDS);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
if (isLock){
|
||||||
|
process.process();
|
||||||
|
}
|
||||||
|
}finally {
|
||||||
|
if (isLock){
|
||||||
|
lock.unlock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -15,7 +15,7 @@ import javax.sql.DataSource;
|
|||||||
import java.sql.DriverManager;
|
import java.sql.DriverManager;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
|
|
||||||
@Configuration
|
//@Configuration
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class DataBaseConfig {
|
public class DataBaseConfig {
|
||||||
@Value("${erp.oracle.enabled}")
|
@Value("${erp.oracle.enabled}")
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ import org.nl.wms.pda.service.CacheLineHandService;
|
|||||||
import org.nl.wms.sch.manage.TaskStatusEnum;
|
import org.nl.wms.sch.manage.TaskStatusEnum;
|
||||||
import org.nl.wms.sch.service.TaskService;
|
import org.nl.wms.sch.service.TaskService;
|
||||||
import org.nl.wms.sch.service.dto.TaskDto;
|
import org.nl.wms.sch.service.dto.TaskDto;
|
||||||
|
import org.nl.wms.ext.acs.service.AcsToWmsService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@@ -274,7 +274,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
|
|||||||
positionTab.update(MapOf.of("position_code",s[0],"Vehicle_code",s[1]),"cacheline_code = '"+cachelineCode+"'");
|
positionTab.update(MapOf.of("position_code",s[0],"Vehicle_code",s[1]),"cacheline_code = '"+cachelineCode+"'");
|
||||||
}
|
}
|
||||||
//更新缓存线及缓存线载具表对应关系
|
//更新缓存线及缓存线载具表对应关系
|
||||||
cacheLineHandService.cacheLineMaterSync();
|
cacheLineHandService.cacheLineMaterSync(param.getString("cacheline_code"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ public class CachelineVehileMaterialDto implements Serializable{
|
|||||||
/**
|
/**
|
||||||
* 载具库存标识
|
* 载具库存标识
|
||||||
*/
|
*/
|
||||||
private String vehmaterial_uuid;
|
private String vehmaterial_id;
|
||||||
/**
|
/**
|
||||||
* 缓存线位置编码
|
* 缓存线位置编码
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ public interface CacheLineHandService{
|
|||||||
* @author gbx
|
* @author gbx
|
||||||
* @date 2023/3/24
|
* @date 2023/3/24
|
||||||
*/
|
*/
|
||||||
JSONArray cacheLineMaterSync(JSONObject );
|
void cacheLineMaterSync(String cachelineCode);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 缓存线料箱条码查询料箱信息
|
* 缓存线料箱条码查询料箱信息
|
||||||
|
|||||||
@@ -2,20 +2,18 @@ package org.nl.wms.pda.service.impl;
|
|||||||
|
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.date.DateUtil;
|
||||||
import cn.hutool.core.util.IdUtil;
|
|
||||||
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.NumberUtil;
|
||||||
import cn.hutool.core.util.ObjectUtil;
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.nl.common.enums.StatusEnum;
|
import org.nl.common.enums.StatusEnum;
|
||||||
import org.nl.common.utils.AcsUtil;
|
import org.nl.common.handler.LockProcess;
|
||||||
import org.nl.common.utils.LocalCache;
|
import org.nl.common.utils.*;
|
||||||
import org.nl.common.utils.MapOf;
|
|
||||||
import org.nl.common.utils.SecurityUtils;
|
|
||||||
import org.nl.config.thread.ThreadPoolExecutorUtil;
|
import org.nl.config.thread.ThreadPoolExecutorUtil;
|
||||||
import org.nl.modules.common.exception.BadRequestException;
|
import org.nl.modules.common.exception.BadRequestException;
|
||||||
import org.nl.modules.common.utils.RedisUtils;
|
import org.nl.modules.common.utils.RedisUtils;
|
||||||
@@ -28,6 +26,7 @@ import org.nl.wms.sch.service.impl.TaskServiceImpl;
|
|||||||
import org.nl.wms.sch.tasks.SpeMachineryTask;
|
import org.nl.wms.sch.tasks.SpeMachineryTask;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
|
import org.springframework.scheduling.annotation.Async;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
@@ -171,26 +170,37 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public JSONArray cacheLineMaterSync() {
|
@Async
|
||||||
WQLObject positionTab = WQLObject.getWQLObject("sch_cacheline_position");
|
public void cacheLineMaterSync(String cachelineCode) {
|
||||||
JSONArray positionArr = positionTab.query("is_delete = '0'").getResultJSONArray(0);
|
if (StringUtils.isEmpty(cachelineCode)){
|
||||||
// 缓存线位置表
|
return;
|
||||||
List<CachelineVehileMaterialDto> positionList = positionArr.toJavaList(CachelineVehileMaterialDto.class);
|
|
||||||
WQLObject ivtTab = WQLObject.getWQLObject("sch_cacheline_vehilematerial");
|
|
||||||
JSONArray ivtArr = ivtTab.query("is_delete = '0'").getResultJSONArray(0);
|
|
||||||
// 缓存线载具物料表
|
|
||||||
List<CachelineVehileMaterialDto> ivtList = ivtArr.toJavaList(CachelineVehileMaterialDto.class);
|
|
||||||
//取缓存线位置表多出来的物料
|
|
||||||
List<CachelineVehileMaterialDto> resultList = positionList.stream().filter(p -> !ivtList.stream().map(e -> e.getPosition_code() + "&" + e.getVehicle_code()).collect(Collectors.toList()).contains(p.getPosition_code() + "&" + p.getVehicle_code())).collect(Collectors.toList());
|
|
||||||
//取载具物料表多出来的物料
|
|
||||||
List<CachelineVehileMaterialDto> resultLists = ivtList.stream().filter(i -> !positionList.stream().map(e -> e.getPosition_code() + "&" + e.getVehicle_code()).collect(Collectors.toList()).contains(i.getPosition_code() + "&" + i.getVehicle_code())).collect(Collectors.toList());
|
|
||||||
if(CollectionUtil.isNotEmpty(resultList)) {
|
|
||||||
//TODO 缓存线位置表多出来的物料处理
|
|
||||||
}
|
}
|
||||||
if(CollectionUtil.isNotEmpty(resultLists)) {
|
RedissonUtils.lock(() -> {
|
||||||
//TODO 载具物料表多出来的物料处理
|
WQLObject positionTab = WQLObject.getWQLObject("sch_cacheline_position");
|
||||||
}
|
WQLObject ivtTab = WQLObject.getWQLObject("sch_cacheline_vehilematerial");
|
||||||
return null;
|
|
||||||
|
JSONArray positionArr = positionTab.query("cacheline_code = '"+cachelineCode+"'").getResultJSONArray(0);
|
||||||
|
if (positionArr.size() == 0){
|
||||||
|
log.warn("CacheLineHandServiceImpl#cacheLineMaterSync");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 缓存线位置表
|
||||||
|
Set<String> cacheLineVehiles = positionArr.stream().map(a -> ((JSONObject) a).getString("vehicle_code")).collect(Collectors.toSet());
|
||||||
|
JSONArray ivtArr = ivtTab.query("cacheline_code = '"+cachelineCode+"'").getResultJSONArray(0);
|
||||||
|
Set<String> relationVehiles = ivtArr.stream().map(a -> ((JSONObject) a).getString("vehicle_code")).collect(Collectors.toSet());
|
||||||
|
Collection<String> cacheLineVehilesSub = CollectionUtils.subtract(cacheLineVehiles, relationVehiles);
|
||||||
|
Collection<String> relationVehilesSub = CollectionUtils.subtract(relationVehiles, cacheLineVehiles);
|
||||||
|
if (!CollectionUtils.isEmpty(relationVehilesSub)){
|
||||||
|
String sql = relationVehilesSub.stream().collect(Collectors.joining("','"));
|
||||||
|
ivtTab.delete("cacheline_code = '"+cachelineCode+"' and vehicle_code in ('"+sql+"')");
|
||||||
|
}
|
||||||
|
if (!CollectionUtils.isEmpty(cacheLineVehilesSub)){
|
||||||
|
for (String vehileCode : cacheLineVehilesSub) {
|
||||||
|
ivtTab.insert(MapOf.of("vehmaterial_id", IdUtil.getStringId(),"vehicle_code",vehileCode,"vehicle_status", StatusEnum.CACHE_VEL_ERR.getCode()
|
||||||
|
,"cacheline_code",cachelineCode,"err_type",StatusEnum.STATUS_TRUE.getCode()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},cachelineCode,3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -303,7 +313,7 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
|
|||||||
ivtTab.delete("vehicle_code = '" + vehicle_code + "'");
|
ivtTab.delete("vehicle_code = '" + vehicle_code + "'");
|
||||||
// 物料信息
|
// 物料信息
|
||||||
HashMap<String,String> json = new HashMap<>();
|
HashMap<String,String> json = new HashMap<>();
|
||||||
json.put("vehmaterial_uuid", IdUtil.getSnowflake(1, 1).nextIdStr());
|
json.put("vehmaterial_id", IdUtil.getStringId());
|
||||||
json.put("vehicle_code", vehicle_code);
|
json.put("vehicle_code", vehicle_code);
|
||||||
json.put("cacheLine_code", wcsdevice_code);
|
json.put("cacheLine_code", wcsdevice_code);
|
||||||
json.put("material_uuid", meObj.getString("material_id"));
|
json.put("material_uuid", meObj.getString("material_id"));
|
||||||
@@ -346,7 +356,7 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
|
|||||||
//2.先删除料箱的所有关联信息,包括物料,工序,生产区域
|
//2.先删除料箱的所有关联信息,包括物料,工序,生产区域
|
||||||
ivtTab.delete("vehicle_code = '" + vehicle_code + "'");
|
ivtTab.delete("vehicle_code = '" + vehicle_code + "'");
|
||||||
JSONObject json = new JSONObject();
|
JSONObject json = new JSONObject();
|
||||||
json.put("vehmaterial_uuid", IdUtil.getSnowflake(1, 1).nextIdStr());
|
json.put("vehmaterial_id", IdUtil.getStringId());
|
||||||
json.put("vehicle_code", vehicle_code);
|
json.put("vehicle_code", vehicle_code);
|
||||||
json.put("cacheLine_code", wcsdevice_code);
|
json.put("cacheLine_code", wcsdevice_code);
|
||||||
json.put("vehicle_status", "01");
|
json.put("vehicle_status", "01");
|
||||||
@@ -406,7 +416,7 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
|
|||||||
}
|
}
|
||||||
// 3.入空箱子
|
// 3.入空箱子
|
||||||
JSONObject afterIvt = new JSONObject();
|
JSONObject afterIvt = new JSONObject();
|
||||||
afterIvt.put("vehmaterial_uuid", IdUtil.getSnowflake(1, 1).nextIdStr());
|
afterIvt.put("vehmaterial_id", IdUtil.getStringId());
|
||||||
afterIvt.put("vehicle_code", vehicle_code);
|
afterIvt.put("vehicle_code", vehicle_code);
|
||||||
afterIvt.put("cacheLine_code", cacheLine_code);
|
afterIvt.put("cacheLine_code", cacheLine_code);
|
||||||
afterIvt.put("vehicle_status", "01");
|
afterIvt.put("vehicle_status", "01");
|
||||||
@@ -578,7 +588,7 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
|
|||||||
HashMap<String,String> json = new HashMap<>();
|
HashMap<String,String> json = new HashMap<>();
|
||||||
json.put("vehicle_code", vehicle_code);
|
json.put("vehicle_code", vehicle_code);
|
||||||
json.put("cacheLine_code", position_code);
|
json.put("cacheLine_code", position_code);
|
||||||
json.put("vehmaterial_uuid", IdUtil.getSnowflake(1, 1).nextIdStr());
|
json.put("vehmaterial_id", IdUtil.getStringId());
|
||||||
json.put("create_time", DateUtil.now());
|
json.put("create_time", DateUtil.now());
|
||||||
// 入满箱扫码异常
|
// 入满箱扫码异常
|
||||||
if("1".equals(inOut_type)) {
|
if("1".equals(inOut_type)) {
|
||||||
|
|||||||
Binary file not shown.
@@ -73,6 +73,16 @@ spring:
|
|||||||
password: ${REDIS_PWD:}
|
password: ${REDIS_PWD:}
|
||||||
#连接超时时间
|
#连接超时时间
|
||||||
timeout: 5000
|
timeout: 5000
|
||||||
|
redisson:
|
||||||
|
config: |
|
||||||
|
threads: 4
|
||||||
|
nettyThreads: 4
|
||||||
|
singleServerConfig:
|
||||||
|
connectionMinimumIdleSize: 8
|
||||||
|
connectionPoolSize: 8
|
||||||
|
address: redis://127.0.0.1:6379
|
||||||
|
idleConnectionTimeout: 10000
|
||||||
|
timeout: 3000
|
||||||
# 登录相关配置
|
# 登录相关配置
|
||||||
login:
|
login:
|
||||||
# 登录缓存
|
# 登录缓存
|
||||||
|
|||||||
Reference in New Issue
Block a user