From 6e096fbd194de05e24ab9472d30228fa1f68f465 Mon Sep 17 00:00:00 2001 From: zhangzhiqiang Date: Mon, 27 Mar 2023 11:00:13 +0800 Subject: [PATCH] =?UTF-8?q?add:redisson=EF=BC=9A=E7=BC=93=E5=AD=98?= =?UTF-8?q?=E7=BA=BF=E8=BD=BD=E5=85=B7=E5=90=8C=E6=AD=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mes/hd/nladmin-system/pom.xml | 7 +- .../java/org/nl/common/enums/StatusEnum.java | 12 ++-- .../org/nl/common/enums/WorkerOrderEnum.java | 3 +- .../org/nl/common/handler/LockProcess.java | 7 ++ .../org/nl/common/utils/RedissonUtils.java | 42 +++++++++++ .../java/org/nl/config/DataBaseConfig.java | 2 +- .../acs/service/impl/AcsToWmsServiceImpl.java | 4 +- .../pda/dto/CachelineVehileMaterialDto.java | 2 +- .../wms/pda/service/CacheLineHandService.java | 2 +- .../impl/CacheLineHandServiceImpl.java | 66 ++++++++++-------- .../src/main/java/org/nl/wms/sch/wql/sch.xls | Bin 186368 -> 183808 bytes .../main/resources/config/application-dev.yml | 10 +++ 12 files changed, 116 insertions(+), 41 deletions(-) create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/common/handler/LockProcess.java create mode 100644 mes/hd/nladmin-system/src/main/java/org/nl/common/utils/RedissonUtils.java 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 c0a32fa8e1e157b47a6fb93a7e3f8a92c8a2d7a1..76abde1e6f1905de81af97f2d691c0427f9e5162 100644 GIT binary patch delta 33472 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 delta 35030 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 ToQ=;p`0T>x+{`t{Q|JC)Py|(l 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: # 登录缓存