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: # 登录缓存