diff --git a/mes/hd/nladmin-system/pom.xml b/mes/hd/nladmin-system/pom.xml
index 195ae1e6..b273c00b 100644
--- a/mes/hd/nladmin-system/pom.xml
+++ b/mes/hd/nladmin-system/pom.xml
@@ -43,7 +43,12 @@
jansi
1.9
-
+
+
+ org.redisson
+ redisson-spring-boot-starter
+ 3.16.4
+
cn.dev33
diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/StatusEnum.java b/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/StatusEnum.java
index 25b2a826..c8f49e5c 100644
--- a/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/StatusEnum.java
+++ b/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/StatusEnum.java
@@ -20,12 +20,12 @@ public enum StatusEnum {
//锁状态
LOCK_OFF("0","否",""),
LOCK_ON("1","是",""),
- //缓存线载具状态00-空位、01-绿色空箱、02-黄色满箱、03-红色异常、04不显示
- CACHE_VEL_NULL("00","空位",""),
- CACHE_VEL_EMT("01","绿色空箱",""),
- CACHE_VEL_FULL("02","黄色满箱",""),
- CACHE_VEL_ERR("03","红色异常",""),
- CACHE_VEL_DIS("04","04不显示",""),
+ //缓存线载具状态 1-空位、2-绿色空箱、3-黄色满箱、4-红色异常、5不显示
+ CACHE_VEL_NULL("1","空位",""),
+ CACHE_VEL_EMT("2","绿色空箱",""),
+ CACHE_VEL_FULL("3","黄色满箱",""),
+ CACHE_VEL_ERR("4","红色异常",""),
+ CACHE_VEL_DIS("5","不显示",""),
//任务状态
TASK_CREATE("1","生成",""),
TASK_START_P("2","起点确认",""),
diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/WorkerOrderEnum.java b/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/WorkerOrderEnum.java
index 6af9d1b3..11186bd7 100644
--- a/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/WorkerOrderEnum.java
+++ b/mes/hd/nladmin-system/src/main/java/org/nl/common/enums/WorkerOrderEnum.java
@@ -6,12 +6,13 @@ package org.nl.common.enums;
* @Date: 2023/3/16
*/
public enum WorkerOrderEnum {
- // 1-创建、2-下发、3-生产中、4-暂停、5-完成
+ // 1-创建、2-下发、3-生产中、4-暂停、5-完成 6-强制完成
CREATE("创建", "1"),
SEND("下发", "2"),
PRODUCTING("生产中", "3"),
STOP("暂停", "4"),
COMPLETE("完成", "5"),
+ FORCE_COMPLETE("强制完成", "6"),
// 1-PC创建、2-Excel导入
PCINTO("PC创建", "1"),
EXCELINTO("EXCEL导入", "2"),
diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/common/handler/LockProcess.java b/mes/hd/nladmin-system/src/main/java/org/nl/common/handler/LockProcess.java
new file mode 100644
index 00000000..5876e830
--- /dev/null
+++ b/mes/hd/nladmin-system/src/main/java/org/nl/common/handler/LockProcess.java
@@ -0,0 +1,7 @@
+package org.nl.common.handler;
+
+@FunctionalInterface
+public
+interface LockProcess {
+ void process();
+}
diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/common/utils/RedissonUtils.java b/mes/hd/nladmin-system/src/main/java/org/nl/common/utils/RedissonUtils.java
new file mode 100644
index 00000000..1e4415ac
--- /dev/null
+++ b/mes/hd/nladmin-system/src/main/java/org/nl/common/utils/RedissonUtils.java
@@ -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();
+ }
+ }
+ }
+}
diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java b/mes/hd/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java
index ae0b2ec5..d5aaa6a3 100644
--- a/mes/hd/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java
+++ b/mes/hd/nladmin-system/src/main/java/org/nl/config/DataBaseConfig.java
@@ -15,7 +15,7 @@ import javax.sql.DataSource;
import java.sql.DriverManager;
import java.sql.SQLException;
-@Configuration
+//@Configuration
@Slf4j
public class DataBaseConfig {
@Value("${erp.oracle.enabled}")
diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java
index b84309f4..befd05ed 100644
--- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java
+++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java
@@ -20,7 +20,7 @@ import org.nl.wms.pda.service.CacheLineHandService;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.service.TaskService;
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.http.HttpStatus;
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+"'");
}
//更新缓存线及缓存线载具表对应关系
- cacheLineHandService.cacheLineMaterSync();
+ cacheLineHandService.cacheLineMaterSync(param.getString("cacheline_code"));
}
@Override
diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/dto/CachelineVehileMaterialDto.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/dto/CachelineVehileMaterialDto.java
index 5e871d72..fcdbb903 100644
--- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/dto/CachelineVehileMaterialDto.java
+++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/dto/CachelineVehileMaterialDto.java
@@ -14,7 +14,7 @@ public class CachelineVehileMaterialDto implements Serializable{
/**
* 载具库存标识
*/
- private String vehmaterial_uuid;
+ private String vehmaterial_id;
/**
* 缓存线位置编码
*/
diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/CacheLineHandService.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/CacheLineHandService.java
index dd87e229..cccbdc5d 100644
--- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/CacheLineHandService.java
+++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/CacheLineHandService.java
@@ -112,7 +112,7 @@ public interface CacheLineHandService{
* @author gbx
* @date 2023/3/24
*/
- JSONArray cacheLineMaterSync(JSONObject );
+ void cacheLineMaterSync(String cachelineCode);
/**
* 缓存线料箱条码查询料箱信息
diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/CacheLineHandServiceImpl.java b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/CacheLineHandServiceImpl.java
index ecf10344..7801fe4c 100644
--- a/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/CacheLineHandServiceImpl.java
+++ b/mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/CacheLineHandServiceImpl.java
@@ -2,20 +2,18 @@ package org.nl.wms.pda.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;
import org.nl.common.enums.StatusEnum;
-import org.nl.common.utils.AcsUtil;
-import org.nl.common.utils.LocalCache;
-import org.nl.common.utils.MapOf;
-import org.nl.common.utils.SecurityUtils;
+import org.nl.common.handler.LockProcess;
+import org.nl.common.utils.*;
import org.nl.config.thread.ThreadPoolExecutorUtil;
import org.nl.modules.common.exception.BadRequestException;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
+import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -171,26 +170,37 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
}
@Override
- public JSONArray cacheLineMaterSync() {
- WQLObject positionTab = WQLObject.getWQLObject("sch_cacheline_position");
- JSONArray positionArr = positionTab.query("is_delete = '0'").getResultJSONArray(0);
- // 缓存线位置表
- List positionList = positionArr.toJavaList(CachelineVehileMaterialDto.class);
- WQLObject ivtTab = WQLObject.getWQLObject("sch_cacheline_vehilematerial");
- JSONArray ivtArr = ivtTab.query("is_delete = '0'").getResultJSONArray(0);
- // 缓存线载具物料表
- List ivtList = ivtArr.toJavaList(CachelineVehileMaterialDto.class);
- //取缓存线位置表多出来的物料
- List 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 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 缓存线位置表多出来的物料处理
+ @Async
+ public void cacheLineMaterSync(String cachelineCode) {
+ if (StringUtils.isEmpty(cachelineCode)){
+ return;
}
- if(CollectionUtil.isNotEmpty(resultLists)) {
- //TODO 载具物料表多出来的物料处理
- }
- return null;
+ RedissonUtils.lock(() -> {
+ WQLObject positionTab = WQLObject.getWQLObject("sch_cacheline_position");
+ WQLObject ivtTab = WQLObject.getWQLObject("sch_cacheline_vehilematerial");
+
+ JSONArray positionArr = positionTab.query("cacheline_code = '"+cachelineCode+"'").getResultJSONArray(0);
+ if (positionArr.size() == 0){
+ log.warn("CacheLineHandServiceImpl#cacheLineMaterSync");
+ return;
+ }
+ // 缓存线位置表
+ Set cacheLineVehiles = positionArr.stream().map(a -> ((JSONObject) a).getString("vehicle_code")).collect(Collectors.toSet());
+ JSONArray ivtArr = ivtTab.query("cacheline_code = '"+cachelineCode+"'").getResultJSONArray(0);
+ Set relationVehiles = ivtArr.stream().map(a -> ((JSONObject) a).getString("vehicle_code")).collect(Collectors.toSet());
+ Collection cacheLineVehilesSub = CollectionUtils.subtract(cacheLineVehiles, relationVehiles);
+ Collection 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 + "'");
// 物料信息
HashMap 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("cacheLine_code", wcsdevice_code);
json.put("material_uuid", meObj.getString("material_id"));
@@ -346,7 +356,7 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
//2.先删除料箱的所有关联信息,包括物料,工序,生产区域
ivtTab.delete("vehicle_code = '" + vehicle_code + "'");
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("cacheLine_code", wcsdevice_code);
json.put("vehicle_status", "01");
@@ -406,7 +416,7 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
}
// 3.入空箱子
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("cacheLine_code", cacheLine_code);
afterIvt.put("vehicle_status", "01");
@@ -578,7 +588,7 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
HashMap json = new HashMap<>();
json.put("vehicle_code", vehicle_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());
// 入满箱扫码异常
if("1".equals(inOut_type)) {
diff --git a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/sch.xls b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/sch.xls
index c0a32fa8..76abde1e 100644
Binary files a/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/sch.xls and b/mes/hd/nladmin-system/src/main/java/org/nl/wms/sch/wql/sch.xls differ
diff --git a/mes/hd/nladmin-system/src/main/resources/config/application-dev.yml b/mes/hd/nladmin-system/src/main/resources/config/application-dev.yml
index c3d14591..1e901c3b 100644
--- a/mes/hd/nladmin-system/src/main/resources/config/application-dev.yml
+++ b/mes/hd/nladmin-system/src/main/resources/config/application-dev.yml
@@ -73,6 +73,16 @@ spring:
password: ${REDIS_PWD:}
#连接超时时间
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:
# 登录缓存