فهرست منبع

agv动态判断后续节点时如果agv托板不可用,增加逻辑主动将空闲agv托板搬运过来,防止agv托板流转死锁

yejian 4 سال پیش
والد
کامیت
be5f7a0c8c
18فایلهای تغییر یافته به همراه267 افزوده شده و 38 حذف شده
  1. 2 0
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/edgeLibrary/dao/StockInfoMapper.java
  2. 2 0
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/edgeLibrary/dao/StorgeMapper.java
  3. 59 2
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/edgeLibrary/service/impl/StorgeServiceImpl.java
  4. 2 1
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/externalApi/service/impl/AgvHikOrderDetailInfoServiceImpl.java
  5. 1 0
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/externalApi/service/impl/AgvHikOrderInfoServiceImpl.java
  6. 1 0
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/externalApi/service/impl/ExternalApiServiceImpl.java
  7. 1 0
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/mq/TaskWorkNode.java
  8. 44 2
      imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/productionResourceCenter/service/impl/RobotNodeServiceImpl.java
  9. 4 0
      imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/edgeLibrary/StockInfoMapper.xml
  10. 3 0
      imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/edgeLibrary/StorgeMapper.xml
  11. 1 1
      imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/productionResourceCenter/ProductionresourcePositionMapper.xml
  12. 53 12
      imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/externalApi/AgvControl.java
  13. 49 11
      imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/externalApi/HikAgvControl.java
  14. 8 0
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/externalApi/entity/AgvHikOrderInfo.java
  15. 7 0
      imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/externalApi/entity/AgvOrderInfo.java
  16. 1 0
      imcs-admin-boot/imcs-common/src/main/java/com/github/zuihou/common/constant/DictionaryKey.java
  17. 27 7
      imcs-admin-boot/imcs-common/src/main/java/com/github/zuihou/common/util/StringUtil.java
  18. 2 2
      imcs-admin-boot/imcs-common/src/main/java/com/github/zuihou/common/util/UniqueKeyGenerator.java

+ 2 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/edgeLibrary/dao/StockInfoMapper.java

@@ -59,4 +59,6 @@ public interface StockInfoMapper extends SuperMapper<StockInfo> {
     String selectMaxNoByProductId(Map queryMap);
     String selectMaxNoByProductId(Map queryMap);
 
 
     List<Long> getAvailableStorge(Map queryMap);
     List<Long> getAvailableStorge(Map queryMap);
+
+    void updateStockInfoByStorgeId(Map updateLockStatusParams);
 }
 }

+ 2 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/edgeLibrary/dao/StorgeMapper.java

@@ -44,4 +44,6 @@ public interface StorgeMapper extends SuperMapper<Storge> {
 
 
 
 
     List<Map>getstorgeByZone(Map map);
     List<Map>getstorgeByZone(Map map);
+
+    void updateLockStatusById(Map updateLockStatusParams);
 }
 }

+ 59 - 2
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/edgeLibrary/service/impl/StorgeServiceImpl.java

@@ -36,6 +36,7 @@ import com.github.zuihou.database.mybatis.conditions.query.LbqWrapper;
 import com.github.zuihou.injection.annonation.InjectionResult;
 import com.github.zuihou.injection.annonation.InjectionResult;
 import com.github.zuihou.utils.BeanPlusUtil;
 import com.github.zuihou.utils.BeanPlusUtil;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -261,6 +262,11 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
         //返回的map
         //返回的map
         Map returnMap = new HashMap();
         Map returnMap = new HashMap();
 
 
+        String tempAgvTaskEndPoint = "";
+        String tempAgvTaskStartPoint = "";
+        Storge tempAgvTaskStartPointStorge = null;
+        Storge tempAgvTaskEndPointStorge = null;
+
         Storge storge = null;
         Storge storge = null;
         String resourceId = null;
         String resourceId = null;
         String jbwCode = "";
         String jbwCode = "";
@@ -270,7 +276,7 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
         map.put("codes",StringUtil.changeIdsArrToSubQueryStr(jbw));
         map.put("codes",StringUtil.changeIdsArrToSubQueryStr(jbw));
         map.put("haveGoods","1");
         map.put("haveGoods","1");
         map.put("findAgvStation","1");
         map.put("findAgvStation","1");
-        List<ProductionresourcePosition>jbwList = productionresourcePositionMapper.getPPList(map);
+        List<ProductionresourcePosition> jbwList = productionresourcePositionMapper.getPPList(map);
         log.info("查找起点接驳位{}",jbwList);
         log.info("查找起点接驳位{}",jbwList);
         if(jbwList!=null&&jbwList.size()>0){
         if(jbwList!=null&&jbwList.size()>0){
 //            //查出当前工件属于产线的托板
 //            //查出当前工件属于产线的托板
@@ -278,9 +284,12 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
             //根据接驳位分组
             //根据接驳位分组
             Map<String,List<ProductionresourcePosition>> jbwMap = jbwList.stream().collect(groupingBy(ProductionresourcePosition::getNo));
             Map<String,List<ProductionresourcePosition>> jbwMap = jbwList.stream().collect(groupingBy(ProductionresourcePosition::getNo));
             List<ProductionresourcePosition> tbList = new ArrayList<>();
             List<ProductionresourcePosition> tbList = new ArrayList<>();
+
             for(String key:jbwMap.keySet()){
             for(String key:jbwMap.keySet()){
                 List<ProductionresourcePosition> list = jbwMap.get(key);
                 List<ProductionresourcePosition> list = jbwMap.get(key);
-                if(list!=null&&list.size()==1){//必须是存放了1个托板
+                // 无托板
+                if(list!=null&&list.size()==1){
+                    // 必须是存放了1个托板
                     ProductionresourcePosition p = list.get(0);
                     ProductionresourcePosition p = list.get(0);
                     if(BizConstant.STOCK_GOODS_TYPE_5.equals(p.getCategory())){
                     if(BizConstant.STOCK_GOODS_TYPE_5.equals(p.getCategory())){
 //                    if(BizConstant.STOCK_GOODS_TYPE_5.equals(p.getCategory())&&plateMap.containsKey(p.getGoodsId())){
 //                    if(BizConstant.STOCK_GOODS_TYPE_5.equals(p.getCategory())&&plateMap.containsKey(p.getGoodsId())){
@@ -290,6 +299,7 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
                     }
                     }
                 }
                 }
             }
             }
+
             //拼凑出托板列表,一起查询提高效率,避免循环查询
             //拼凑出托板列表,一起查询提高效率,避免循环查询
             log.info("查找起点可用接驳位{}",tbList);
             log.info("查找起点可用接驳位{}",tbList);
             if(tbList!=null&&tbList.size()>0){
             if(tbList!=null&&tbList.size()>0){
@@ -321,6 +331,18 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
                     resourceId = position.getResourceId()==null?"":position.getResourceId().toString();
                     resourceId = position.getResourceId()==null?"":position.getResourceId().toString();
                 }
                 }
             }
             }
+        }else{
+            Map storgeParams = new HashMap();
+            storgeParams.put("codes",StringUtil.changeIdsArrToSubQueryStr(jbw));
+            storgeParams.put("freeFlag","1");
+            storgeParams.put("findAgvStation","1");
+            List<ProductionresourcePosition> productionresourcePositions = productionresourcePositionMapper.getPPList(storgeParams);
+
+            if(productionresourcePositions.size() > 0){
+                ProductionresourcePosition productionresourcePosition = productionresourcePositions.get(0);
+                tempAgvTaskEndPoint = productionresourcePosition.getCode();
+                tempAgvTaskEndPointStorge = baseMapper.selectById(productionresourcePosition.getStorgeId());
+            }
         }
         }
 
 
         if(storge!=null){
         if(storge!=null){
@@ -328,6 +350,41 @@ public class StorgeServiceImpl extends SuperCacheServiceImpl<StorgeMapper, Storg
             storge.setResourceNo(jbwCode);
             storge.setResourceNo(jbwCode);
             returnMap.put("jbwCode",jbwCode);
             returnMap.put("jbwCode",jbwCode);
             returnMap.put("resourceId",resourceId);
             returnMap.put("resourceId",resourceId);
+        }else{
+            if(StringUtils.isNotBlank(tempAgvTaskEndPoint)){
+// begin add by yejian on 20220802 for 判断如果接驳位起始不可用时判断是否有可用的空托盘,如果有,先让agv搬运到需放料所在位子
+                // 查找未被锁定并且空的托盘所在位子
+                List<String> includeJbwList = new ArrayList(Arrays.asList(jbw.split(",")));
+                String allJbw = DictionaryKey.YJ_ZONE_JBW.get("allJbw");
+
+                List<String> allJbwList = new ArrayList(Arrays.asList(allJbw.split(",")));
+                allJbwList.removeAll(includeJbwList);
+                Map usableJbwPlateMap =  new HashMap();
+
+                usableJbwPlateMap.put("codes",StringUtil.changeIdsArrToSubQueryStr(allJbwList));
+                usableJbwPlateMap.put("haveGoods","1");
+                usableJbwPlateMap.put("findAgvStation","1");
+                List<ProductionresourcePosition> tempAgvStartList = productionresourcePositionMapper.getPPList(usableJbwPlateMap);
+
+                if(tempAgvStartList.size() > 0){
+                    Map<String,List<ProductionresourcePosition>> tempAgvStartMap = tempAgvStartList.stream().collect(groupingBy(ProductionresourcePosition::getNo));
+                    for(String key:tempAgvStartMap.keySet()){
+                        List<ProductionresourcePosition> list = tempAgvStartMap.get(key);
+                        // 无托板
+                        if(list!=null && list.size()==1 && StringUtils.isBlank(tempAgvTaskStartPoint)){
+                            // 必须是存放了1个托板
+                            tempAgvTaskStartPoint = list.get(0).getCode();
+                            tempAgvTaskStartPointStorge = baseMapper.selectById(list.get(0).getStorgeId());
+                            returnMap.put("tempAgvTaskStartPoint",tempAgvTaskStartPoint);
+                            returnMap.put("tempAgvTaskEndPoint",tempAgvTaskEndPoint);
+                            returnMap.put("tempAgvTaskStartPointStorge",tempAgvTaskStartPointStorge);
+                            returnMap.put("tempAgvTaskEndPointStorge",tempAgvTaskEndPointStorge);
+                        }
+                    }
+                }
+
+            }
+            // end add by yejian on 20220802 for 判断如果接驳位起始不可用时判断是否有可用的空托盘,如果有,先让agv搬运到需放料所在位子
         }
         }
         return returnMap;
         return returnMap;
     }
     }

+ 2 - 1
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/externalApi/service/impl/AgvHikOrderDetailInfoServiceImpl.java

@@ -98,8 +98,9 @@ public class AgvHikOrderDetailInfoServiceImpl extends SuperCacheServiceImpl<AgvH
             headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));
             headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));
 
 
             HttpEntity<String> formEntity = new HttpEntity<String>(jsonObject.toJSONString(),headers);
             HttpEntity<String> formEntity = new HttpEntity<String>(jsonObject.toJSONString(),headers);
-            log.info("agv模拟回参数:{}", jsonObject.toJSONString());
+            log.info("agv模拟回参数:{}", jsonObject.toJSONString());
             String returnData = restTemplate.postForObject(agvCallbackUrl,formEntity, String.class);
             String returnData = restTemplate.postForObject(agvCallbackUrl,formEntity, String.class);
+            log.info("agv模拟回调同步返回:{}", returnData);
         } catch (InterruptedException e) {
         } catch (InterruptedException e) {
             e.printStackTrace();
             e.printStackTrace();
         }
         }

+ 1 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/externalApi/service/impl/AgvHikOrderInfoServiceImpl.java

@@ -150,6 +150,7 @@ public class AgvHikOrderInfoServiceImpl extends SuperCacheServiceImpl<AgvHikOrde
         agvOrderInfo.setTaskNodeId(taskNodeId);
         agvOrderInfo.setTaskNodeId(taskNodeId);
         agvOrderInfo.setTaskCode(taskCode);
         agvOrderInfo.setTaskCode(taskCode);
         agvOrderInfo.setReqTime(reqTime);
         agvOrderInfo.setReqTime(reqTime);
+        agvOrderInfo.setAgvTaskType(data.get("agvTaskType").toString());
         baseMapper.insert(agvOrderInfo);
         baseMapper.insert(agvOrderInfo);
 
 
         // 组装出入库申请详情数据入库,方便后续回调时数据记录及比对
         // 组装出入库申请详情数据入库,方便后续回调时数据记录及比对

+ 1 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/externalApi/service/impl/ExternalApiServiceImpl.java

@@ -421,6 +421,7 @@ public class ExternalApiServiceImpl implements ExternalApiService {
                 agvOrderInfo.setTaskId(taskId);
                 agvOrderInfo.setTaskId(taskId);
                 agvOrderInfo.setTaskNodeId(taskNodeId);
                 agvOrderInfo.setTaskNodeId(taskNodeId);
                 agvOrderInfo.setRepeatActionType(0);
                 agvOrderInfo.setRepeatActionType(0);
+                agvOrderInfo.setAgvTaskType(String.valueOf(param.get("agvTaskType")));
                 agvOrderInfoService.save(agvOrderInfo);
                 agvOrderInfoService.save(agvOrderInfo);
 
 
                 // 组装出入库申请详情数据入库,方便后续回调时数据记录及比对
                 // 组装出入库申请详情数据入库,方便后续回调时数据记录及比对

+ 1 - 0
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/mq/TaskWorkNode.java

@@ -348,6 +348,7 @@ public class TaskWorkNode {
                                 agvData.put("goal", conMap.get("goal"));
                                 agvData.put("goal", conMap.get("goal"));
                                 agvData.put("taskId", tTask.getId().toString());
                                 agvData.put("taskId", tTask.getId().toString());
                                 agvData.put("taskNodeId", taskNode.getId().toString());
                                 agvData.put("taskNodeId", taskNode.getId().toString());
+                                agvData.put("agvTaskType", "0");
                                 String jsonParam = getRequestParam(conMap);
                                 String jsonParam = getRequestParam(conMap);
                                 JSONObject agvParam = new JSONObject();
                                 JSONObject agvParam = new JSONObject();
                                 agvParam.putAll(agvData);
                                 agvParam.putAll(agvData);

+ 44 - 2
imcs-admin-boot/imcs-business-biz/src/main/java/com/github/zuihou/business/productionResourceCenter/service/impl/RobotNodeServiceImpl.java

@@ -2,7 +2,9 @@ package com.github.zuihou.business.productionResourceCenter.service.impl;
 
 
 
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
+import com.github.zuihou.base.R;
 import com.github.zuihou.business.DemoLine.DemoCacheKey;
 import com.github.zuihou.business.DemoLine.DemoCacheKey;
 import com.github.zuihou.business.DemoLine.DemoLineConstant;
 import com.github.zuihou.business.DemoLine.DemoLineConstant;
 import com.github.zuihou.business.DemoLine.YunjianConstant;
 import com.github.zuihou.business.DemoLine.YunjianConstant;
@@ -11,6 +13,8 @@ import com.github.zuihou.business.edgeLibrary.dao.StorgeMapper;
 import com.github.zuihou.business.edgeLibrary.entity.StockInfo;
 import com.github.zuihou.business.edgeLibrary.entity.StockInfo;
 import com.github.zuihou.business.edgeLibrary.entity.Storge;
 import com.github.zuihou.business.edgeLibrary.entity.Storge;
 import com.github.zuihou.business.edgeLibrary.service.StorgeService;
 import com.github.zuihou.business.edgeLibrary.service.StorgeService;
+import com.github.zuihou.business.externalApi.service.AgvHikOrderInfoService;
+import com.github.zuihou.business.externalApi.service.ExternalApiService;
 import com.github.zuihou.business.operationManagementCenter.dao.TTaskMapper;
 import com.github.zuihou.business.operationManagementCenter.dao.TTaskMapper;
 import com.github.zuihou.business.operationManagementCenter.entity.TTask;
 import com.github.zuihou.business.operationManagementCenter.entity.TTask;
 import com.github.zuihou.business.operationManagementCenter.entity.TWorkpiece;
 import com.github.zuihou.business.operationManagementCenter.entity.TWorkpiece;
@@ -32,12 +36,15 @@ import com.github.zuihou.business.productionResourceCenter.service.ZZoneProducti
 import com.github.zuihou.business.productionResourceCenter.service.ZZoneService;
 import com.github.zuihou.business.productionResourceCenter.service.ZZoneService;
 import com.github.zuihou.business.util.MsgUtil;
 import com.github.zuihou.business.util.MsgUtil;
 import com.github.zuihou.common.constant.BizConstant;
 import com.github.zuihou.common.constant.BizConstant;
+import com.github.zuihou.common.constant.CacheKey;
 import com.github.zuihou.common.constant.DictionaryKey;
 import com.github.zuihou.common.constant.DictionaryKey;
 import com.github.zuihou.common.constant.ParameterKey;
 import com.github.zuihou.common.constant.ParameterKey;
 import com.github.zuihou.common.util.StringUtil;
 import com.github.zuihou.common.util.StringUtil;
+import com.github.zuihou.common.util.UniqueKeyGenerator;
 import com.github.zuihou.database.mybatis.conditions.Wraps;
 import com.github.zuihou.database.mybatis.conditions.Wraps;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Maps;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
@@ -101,6 +108,12 @@ public class RobotNodeServiceImpl implements NodeOperationService {
     @Autowired
     @Autowired
     private BomProcedureTrayService procedureTrayService;
     private BomProcedureTrayService procedureTrayService;
 
 
+    @Autowired
+    private ExternalApiService externalApiService;
+
+    @Autowired
+    private AgvHikOrderInfoService agvHikOrderInfoService;
+
     private Map<String, Object> map = Maps.newHashMap();
     private Map<String, Object> map = Maps.newHashMap();
 
 
     private String ZK_ip_zlzx = "192.168.170.61";
     private String ZK_ip_zlzx = "192.168.170.61";
@@ -199,7 +212,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
         String assembleZoneKey = zoneName + "-" + bomzZone.getNo();
         String assembleZoneKey = zoneName + "-" + bomzZone.getNo();
         String assembleZoneXbkNo =  DictionaryKey.YJ_ZONE_XBK.get(assembleZoneKey);
         String assembleZoneXbkNo =  DictionaryKey.YJ_ZONE_XBK.get(assembleZoneKey);
 
 
-        String bomZoneXbkNo =  DictionaryKey.YJ_ZONE_XBK.get(zoneName);
+        String bomZoneXbkNo =  DictionaryKey.YJ_ZONE_XBK.get(bomzZone.getName());
 
 
         // 查找产品装配平台可用的线边库数量,进线加工数量最多等于线边库库位数量,防止极端情况产线不能运行时人工将工件都暂存线边库
         // 查找产品装配平台可用的线边库数量,进线加工数量最多等于线边库库位数量,防止极端情况产线不能运行时人工将工件都暂存线边库
         // 装配线边库数量,启用并且无料的库位
         // 装配线边库数量,启用并且无料的库位
@@ -650,7 +663,7 @@ public class RobotNodeServiceImpl implements NodeOperationService {
         Long resourceId = taskNode.getTargetResourceId();
         Long resourceId = taskNode.getTargetResourceId();
         String xbkFlag = "";
         String xbkFlag = "";
 
 
-        if("1".equals(findAgvFlag)){//需要提前锁定下个接驳位
+        if("1".equals(findAgvFlag)){ //需要提前锁定下个接驳位
             // begin modify by yejian on 20220513 for agv动态查找满足抽检一个工序需多次调度agv问题
             // begin modify by yejian on 20220513 for agv动态查找满足抽检一个工序需多次调度agv问题
             // 先找到处理节点下一节点agv起点地址
             // 先找到处理节点下一节点agv起点地址
 
 
@@ -703,6 +716,35 @@ public class RobotNodeServiceImpl implements NodeOperationService {
                 returnMap.put("targetxbk","0");
                 returnMap.put("targetxbk","0");
 
 
             }else{//需要放到线边库
             }else{//需要放到线边库
+                // begin add by yejian on 20220802 for 调度空托盘流转
+                String tempAgvTaskStartPoint = map.get("tempAgvTaskStartPoint") == null?null:(String)map.get("tempAgvTaskStartPoint");
+                String tempAgvTaskEndPoint = map.get("tempAgvTaskEndPoint") == null?null:(String)map.get("tempAgvTaskEndPoint");
+                Storge tempAgvTaskStartPointStorge = map.get("tempAgvTaskStartPointStorge") == null?null:(Storge)map.get("tempAgvTaskStartPointStorge");
+                Storge tempAgvTaskEndPointStorge = map.get("tempAgvTaskEndPointStorge") == null?null:(Storge)map.get("tempAgvTaskEndPointStorge");
+                if(StringUtils.isNotBlank(tempAgvTaskStartPoint) && StringUtils.isNotBlank(tempAgvTaskEndPoint)){
+                    // 锁定起点终点接驳位
+                    Map agvData = new HashMap();
+                    String agvTaskNodeId = UniqueKeyGenerator.getUniqueKeyStartWithTimestamp(17);
+                    agvData.put("start", tempAgvTaskStartPoint);
+                    agvData.put("goal", tempAgvTaskEndPoint);
+                    agvData.put("taskId", agvTaskNodeId);
+                    agvData.put("taskNodeId", agvTaskNodeId );
+                    // 0:节点自动调度 1:节点资源不可用人工调度
+                    agvData.put("agvTaskType", "1");
+                    JSONObject agvParam = new JSONObject();
+                    agvParam.putAll(agvData);
+                    String zoneType = (null == msgUtil.redis_get(ParameterKey.PARAMETERS)? "": ((Map<String,String>)msgUtil.redis_get(ParameterKey.PARAMETERS)).get(ParameterKey.ZONE_TYPE).toString());
+                    storgeService.lockStorge(tempAgvTaskStartPointStorge, Long.valueOf(agvTaskNodeId));
+                    storgeService.lockStorge(tempAgvTaskEndPointStorge, Long.valueOf(agvTaskNodeId));
+                    if(zoneType.equals(ParameterKey.ZONE_SFX)){
+                        agvData.put("transferType","agv");
+                        R addAgvTask = externalApiService.processTransferJob(agvData);
+                    }else{
+                        R addHikTask = agvHikOrderInfoService.addHikTask(agvData);
+                    }
+                }
+                // end add by yejian on 20220802 for 调度空托盘流转
+
                 xbkFlag = "1";
                 xbkFlag = "1";
             }
             }
 
 

+ 4 - 0
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/edgeLibrary/StockInfoMapper.xml

@@ -202,4 +202,8 @@
         AND ippp.status = '0'
         AND ippp.status = '0'
         ORDER BY ippp.storge_id
         ORDER BY ippp.storge_id
     </select>
     </select>
+
+    <update id="updateStockInfoByStorgeId">
+        UPDATE imcs_s_stock_info SET storge_id = #{agvEndStorgeId} WHERE storge_id = #{agvStartStorgeId};
+    </update>
 </mapper>
 </mapper>

+ 3 - 0
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/edgeLibrary/StorgeMapper.xml

@@ -108,5 +108,8 @@
         </if>
         </if>
     </select>
     </select>
 
 
+    <update id="updateLockStatusById">
+        UPDATE imcs_s_storge SET lock_status = '1' WHERE lock_status = '0' and (id = #{agvStartStorgeId} or id = #{agvEndStorgeId});
+    </update>
 
 
 </mapper>
 </mapper>

+ 1 - 1
imcs-admin-boot/imcs-business-biz/src/main/resources/mapper_business/base/productionResourceCenter/ProductionresourcePositionMapper.xml

@@ -57,7 +57,7 @@
         </if>
         </if>
         where 1=1 AND p.status = '0'
         where 1=1 AND p.status = '0'
         <if test="haveGoods != null and haveGoods != ''">
         <if test="haveGoods != null and haveGoods != ''">
-            and i.storge_id is not null
+            and i.storge_id is not null and s.lock_status = '1'
         </if>
         </if>
         <if test="fitTrayType != null and fitTrayType != ''">
         <if test="fitTrayType != null and fitTrayType != ''">
             and s.fit_tray_type = #{fitTrayType}
             and s.fit_tray_type = #{fitTrayType}

+ 53 - 12
imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/externalApi/AgvControl.java

@@ -5,16 +5,25 @@ import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.github.zuihou.authority.service.common.ParameterService;
 import com.github.zuihou.authority.service.common.ParameterService;
 import com.github.zuihou.base.R;
 import com.github.zuihou.base.R;
+import com.github.zuihou.business.edgeLibrary.dao.StockInfoMapper;
+import com.github.zuihou.business.edgeLibrary.dao.StorgeMapper;
+import com.github.zuihou.business.edgeLibrary.entity.StockInfo;
+import com.github.zuihou.business.edgeLibrary.service.StorgeService;
 import com.github.zuihou.business.externalApi.entity.AgvOrderDetailInfo;
 import com.github.zuihou.business.externalApi.entity.AgvOrderDetailInfo;
 import com.github.zuihou.business.externalApi.entity.AgvOrderInfo;
 import com.github.zuihou.business.externalApi.entity.AgvOrderInfo;
 import com.github.zuihou.business.externalApi.service.AgvOrderDetailInfoService;
 import com.github.zuihou.business.externalApi.service.AgvOrderDetailInfoService;
 import com.github.zuihou.business.externalApi.service.AgvOrderInfoService;
 import com.github.zuihou.business.externalApi.service.AgvOrderInfoService;
 import com.github.zuihou.business.externalApi.service.ExternalApiService;
 import com.github.zuihou.business.externalApi.service.ExternalApiService;
+import com.github.zuihou.business.productionResourceCenter.dao.ProductionresourceBizMapper;
+import com.github.zuihou.business.productionResourceCenter.dao.ProductionresourcePositionMapper;
+import com.github.zuihou.business.productionResourceCenter.entity.Productionresource;
+import com.github.zuihou.business.productionResourceCenter.entity.ProductionresourcePosition;
 import com.github.zuihou.common.constant.ParameterKey;
 import com.github.zuihou.common.constant.ParameterKey;
 import com.github.zuihou.common.enums.AgvActionEnum;
 import com.github.zuihou.common.enums.AgvActionEnum;
 import com.github.zuihou.common.enums.AgvLocationRelationEnum;
 import com.github.zuihou.common.enums.AgvLocationRelationEnum;
 import com.github.zuihou.common.util.StringUtil;
 import com.github.zuihou.common.util.StringUtil;
 import com.github.zuihou.context.BaseContextHandler;
 import com.github.zuihou.context.BaseContextHandler;
+import com.github.zuihou.database.mybatis.conditions.Wraps;
 import com.github.zuihou.database.mybatis.conditions.query.LbqWrapper;
 import com.github.zuihou.database.mybatis.conditions.query.LbqWrapper;
 import com.github.zuihou.log.annotation.SysLog;
 import com.github.zuihou.log.annotation.SysLog;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
@@ -34,6 +43,7 @@ import org.springframework.web.client.RestTemplate;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.util.Calendar;
 import java.util.Calendar;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 
 
 /**
 /**
@@ -64,6 +74,16 @@ public class AgvControl {
     private AgvOrderInfoService agvOrderInfoService;
     private AgvOrderInfoService agvOrderInfoService;
     @Autowired
     @Autowired
     private ExternalApiService externalApiService;
     private ExternalApiService externalApiService;
+    @Autowired
+    private StorgeService storgeService;
+    @Autowired
+    private ProductionresourceBizMapper productionresourceBizMapper;
+    @Autowired
+    private ProductionresourcePositionMapper productionresourcePositionMapper;
+    @Autowired
+    private StorgeMapper storgeMapper;
+    @Autowired
+    private StockInfoMapper stockInfoMapper;
 
 
     @ApiOperation(value = "agv任务完成回调", notes = "agv任务完成回调")
     @ApiOperation(value = "agv任务完成回调", notes = "agv任务完成回调")
     @PostMapping("/agvDoneResult")
     @PostMapping("/agvDoneResult")
@@ -124,20 +144,41 @@ public class AgvControl {
                 // 指令下发出库完成后回调调度完成后续任务
                 // 指令下发出库完成后回调调度完成后续任务
                 // 从redis里面获取上次出库任务 任务号-任务结点号
                 // 从redis里面获取上次出库任务 任务号-任务结点号
 //                return R.success();
 //                return R.success();
+                // 判断是自动化节点条件满足的agv任务还是条件不满足驱动的托盘移动
+                if("0".equals(agvOrderInfo.getAgvTaskType())){
+                    autoNodeTaskInfoObj.put("code","1");
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));
 
 
-                autoNodeTaskInfoObj.put("code","1");
-                HttpHeaders headers = new HttpHeaders();
-                headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));
-
-                HttpEntity<String> formEntity = new HttpEntity<String>(autoNodeTaskInfoObj.toJSONString(),headers);
-                String taskNodeCallbackUrl = parameterService.getValue(ParameterKey.TASKNODECALLBACKURL, null);
-                int sendCount = 0;
-                // 解析回调结果
-                boolean flag = repeatSend(taskNodeCallbackUrl,formEntity,sendCount);
-                if(flag){
-                    return R.success();
+                    HttpEntity<String> formEntity = new HttpEntity<String>(autoNodeTaskInfoObj.toJSONString(),headers);
+                    String taskNodeCallbackUrl = parameterService.getValue(ParameterKey.TASKNODECALLBACKURL, null);
+                    int sendCount = 0;
+                    // 解析回调结果
+                    boolean flag = repeatSend(taskNodeCallbackUrl,formEntity,sendCount);
+                    if(flag){
+                        return R.success();
+                    }else{
+                        // TODO 记录告警日志方便电子看板或者其他地方展示系统通讯异常
+                        return R.success();
+                    }
                 }else{
                 }else{
-                    // TODO 记录告警日志方便电子看板或者其他地方展示系统通讯异常
+                    // 更新托板库位信息
+                    String agvStartCode = agvOrderInfo.getStart();
+                    String agvEndCode = agvOrderInfo.getGoal();
+
+                    Productionresource agvStartResource = productionresourceBizMapper.selectOne(Wraps.<Productionresource>lbQ().eq(Productionresource::getCode,agvStartCode));
+                    Productionresource agvEndResource = productionresourceBizMapper.selectOne(Wraps.<Productionresource>lbQ().eq(Productionresource::getCode,agvEndCode));
+                    ProductionresourcePosition agvStartResourcePosition = productionresourcePositionMapper.selectOne(Wraps.<ProductionresourcePosition>lbQ().eq(ProductionresourcePosition::getResourceId,agvStartResource.getId()));
+                    ProductionresourcePosition agvEndResourcePosition = productionresourcePositionMapper.selectOne(Wraps.<ProductionresourcePosition>lbQ().eq(ProductionresourcePosition::getResourceId,agvEndResource.getId()));
+
+                    // 解锁预占锁定
+                    Map updateLockStatusParams =  new HashMap();
+                    updateLockStatusParams.put("agvStartStorgeId", agvStartResourcePosition.getStorgeId());
+                    updateLockStatusParams.put("agvEndStorgeId", agvEndResourcePosition.getStorgeId());
+                    storgeMapper.updateLockStatusById(updateLockStatusParams);
+
+                    // 更新库位信息
+                    stockInfoMapper.updateStockInfoByStorgeId(updateLockStatusParams);
                     return R.success();
                     return R.success();
                 }
                 }
             }else{
             }else{

+ 49 - 11
imcs-admin-boot/imcs-business-controller/src/main/java/com/github/zuihou/business/controller/externalApi/HikAgvControl.java

@@ -9,6 +9,8 @@ import com.github.zuihou.authority.service.common.ParameterService;
 import com.github.zuihou.base.R;
 import com.github.zuihou.base.R;
 import com.github.zuihou.base.controller.SuperController;
 import com.github.zuihou.base.controller.SuperController;
 import com.github.zuihou.base.request.PageParams;
 import com.github.zuihou.base.request.PageParams;
+import com.github.zuihou.business.edgeLibrary.dao.StockInfoMapper;
+import com.github.zuihou.business.edgeLibrary.dao.StorgeMapper;
 import com.github.zuihou.business.externalApi.dto.*;
 import com.github.zuihou.business.externalApi.dto.*;
 import com.github.zuihou.business.externalApi.entity.AgvHikOrderDetailInfo;
 import com.github.zuihou.business.externalApi.entity.AgvHikOrderDetailInfo;
 import com.github.zuihou.business.externalApi.entity.AgvHikOrderInfo;
 import com.github.zuihou.business.externalApi.entity.AgvHikOrderInfo;
@@ -17,12 +19,17 @@ import com.github.zuihou.business.externalApi.entity.AgvOrderInfo;
 import com.github.zuihou.business.externalApi.service.*;
 import com.github.zuihou.business.externalApi.service.*;
 import com.github.zuihou.business.operationManagementCenter.dto.TTaskPageDTO;
 import com.github.zuihou.business.operationManagementCenter.dto.TTaskPageDTO;
 import com.github.zuihou.business.operationManagementCenter.entity.TTask;
 import com.github.zuihou.business.operationManagementCenter.entity.TTask;
+import com.github.zuihou.business.productionResourceCenter.dao.ProductionresourceBizMapper;
+import com.github.zuihou.business.productionResourceCenter.dao.ProductionresourcePositionMapper;
+import com.github.zuihou.business.productionResourceCenter.entity.Productionresource;
+import com.github.zuihou.business.productionResourceCenter.entity.ProductionresourcePosition;
 import com.github.zuihou.common.constant.HikR;
 import com.github.zuihou.common.constant.HikR;
 import com.github.zuihou.common.constant.ParameterKey;
 import com.github.zuihou.common.constant.ParameterKey;
 import com.github.zuihou.common.enums.AgvActionEnum;
 import com.github.zuihou.common.enums.AgvActionEnum;
 import com.github.zuihou.common.enums.AgvLocationRelationEnum;
 import com.github.zuihou.common.enums.AgvLocationRelationEnum;
 import com.github.zuihou.common.util.StringUtil;
 import com.github.zuihou.common.util.StringUtil;
 import com.github.zuihou.context.BaseContextHandler;
 import com.github.zuihou.context.BaseContextHandler;
+import com.github.zuihou.database.mybatis.conditions.Wraps;
 import com.github.zuihou.database.mybatis.conditions.query.LbqWrapper;
 import com.github.zuihou.database.mybatis.conditions.query.LbqWrapper;
 import com.github.zuihou.database.mybatis.conditions.query.QueryWrap;
 import com.github.zuihou.database.mybatis.conditions.query.QueryWrap;
 import com.github.zuihou.log.annotation.SysLog;
 import com.github.zuihou.log.annotation.SysLog;
@@ -43,6 +50,7 @@ import org.springframework.web.client.RestTemplate;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import java.util.Calendar;
 import java.util.Calendar;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Map;
 
 
 /**
 /**
@@ -72,6 +80,15 @@ public class HikAgvControl extends SuperController<AgvHikOrderInfoService, Long,
     @Autowired
     @Autowired
     private AgvHikOrderInfoService agvHikOrderInfoService;
     private AgvHikOrderInfoService agvHikOrderInfoService;
 
 
+    @Autowired
+    private ProductionresourceBizMapper productionresourceBizMapper;
+    @Autowired
+    private ProductionresourcePositionMapper productionresourcePositionMapper;
+    @Autowired
+    private StorgeMapper storgeMapper;
+    @Autowired
+    private StockInfoMapper stockInfoMapper;
+
     @Override
     @Override
     public void query(PageParams<AgvHikOrderInfoPageDTO> params, IPage<AgvHikOrderInfo> page, Long defSize) {
     public void query(PageParams<AgvHikOrderInfoPageDTO> params, IPage<AgvHikOrderInfo> page, Long defSize) {
         AgvHikOrderInfoPageDTO data = params.getModel();
         AgvHikOrderInfoPageDTO data = params.getModel();
@@ -144,19 +161,40 @@ public class HikAgvControl extends SuperController<AgvHikOrderInfoService, Long,
                 // 从redis里面获取上次出库任务 任务号-任务结点号
                 // 从redis里面获取上次出库任务 任务号-任务结点号
 //                return R.success();
 //                return R.success();
 
 
-                autoNodeTaskInfoObj.put("code","1");
-                HttpHeaders headers = new HttpHeaders();
-                headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));
+                if("0".equals(agvHikOrderInfo.getAgvTaskType())){
+                    autoNodeTaskInfoObj.put("code","1");
+                    HttpHeaders headers = new HttpHeaders();
+                    headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8"));
 
 
-                HttpEntity<String> formEntity = new HttpEntity<String>(autoNodeTaskInfoObj.toJSONString(),headers);
-                String taskNodeCallbackUrl = parameterService.getValue(ParameterKey.TASKNODECALLBACKURL, null);
-                int sendCount = 0;
-                // 解析回调结果
-                boolean flag = repeatSend(taskNodeCallbackUrl,formEntity,sendCount);
-                if(flag){
-                    return HikR.success().setReqCode(agvHikOrderDetailInfo.getReqCode());
+                    HttpEntity<String> formEntity = new HttpEntity<String>(autoNodeTaskInfoObj.toJSONString(),headers);
+                    String taskNodeCallbackUrl = parameterService.getValue(ParameterKey.TASKNODECALLBACKURL, null);
+                    int sendCount = 0;
+                    // 解析回调结果
+                    boolean flag = repeatSend(taskNodeCallbackUrl,formEntity,sendCount);
+                    if(flag){
+                        return HikR.success().setReqCode(agvHikOrderDetailInfo.getReqCode());
+                    }else{
+                        // TODO 记录告警日志方便电子看板或者其他地方展示系统通讯异常
+                        return HikR.success().setReqCode(agvHikOrderDetailInfo.getReqCode());
+                    }
                 }else{
                 }else{
-                    // TODO 记录告警日志方便电子看板或者其他地方展示系统通讯异常
+// 更新托板库位信息
+                    String agvStartCode = agvHikOrderInfo.getStart();
+                    String agvEndCode = agvHikOrderInfo.getGoal();
+
+                    Productionresource agvStartResource = productionresourceBizMapper.selectOne(Wraps.<Productionresource>lbQ().eq(Productionresource::getCode,agvStartCode));
+                    Productionresource agvEndResource = productionresourceBizMapper.selectOne(Wraps.<Productionresource>lbQ().eq(Productionresource::getCode,agvEndCode));
+                    ProductionresourcePosition agvStartResourcePosition = productionresourcePositionMapper.selectOne(Wraps.<ProductionresourcePosition>lbQ().eq(ProductionresourcePosition::getResourceId,agvStartResource.getId()));
+                    ProductionresourcePosition agvEndResourcePosition = productionresourcePositionMapper.selectOne(Wraps.<ProductionresourcePosition>lbQ().eq(ProductionresourcePosition::getResourceId,agvEndResource.getId()));
+
+                    // 解锁预占锁定
+                    Map updateLockStatusParams =  new HashMap();
+                    updateLockStatusParams.put("agvStartStorgeId", agvStartResourcePosition.getStorgeId());
+                    updateLockStatusParams.put("agvEndStorgeId", agvEndResourcePosition.getStorgeId());
+                    storgeMapper.updateLockStatusById(updateLockStatusParams);
+
+                    // 更新库位信息
+                    stockInfoMapper.updateStockInfoByStorgeId(updateLockStatusParams);
                     return HikR.success().setReqCode(agvHikOrderDetailInfo.getReqCode());
                     return HikR.success().setReqCode(agvHikOrderDetailInfo.getReqCode());
                 }
                 }
             }else{
             }else{

+ 8 - 0
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/externalApi/entity/AgvHikOrderInfo.java

@@ -139,6 +139,14 @@ public class AgvHikOrderInfo extends Entity<Long> {
     @TableField("repeat_action_type")
     @TableField("repeat_action_type")
     private int repeatActionType;
     private int repeatActionType;
 
 
+    /**
+     *  agv重做动作号
+     */
+    @ApiModelProperty(value = "0:节点自动调度 1:节点资源不可用人工调度位" )
+    @TableField("agv_task_type")
+    private String agvTaskType;
+
+
     @ApiModelProperty(value = "父agv任务点")
     @ApiModelProperty(value = "父agv任务点")
     @TableField(exist = false)
     @TableField(exist = false)
     private String completeTime;
     private String completeTime;

+ 7 - 0
imcs-admin-boot/imcs-business-entity/src/main/java/com/github/zuihou/business/externalApi/entity/AgvOrderInfo.java

@@ -95,5 +95,12 @@ public class AgvOrderInfo extends Entity<Long> {
     @TableField("repeat_action_type")
     @TableField("repeat_action_type")
     private int repeatActionType;
     private int repeatActionType;
 
 
+    /**
+     *  agv重做动作号
+     */
+    @ApiModelProperty(value = "0:节点自动调度 1:节点资源不可用人工调度位" )
+    @TableField("agv_task_type")
+    private String agvTaskType;
+
 
 
 }
 }

+ 1 - 0
imcs-admin-boot/imcs-common/src/main/java/com/github/zuihou/common/constant/DictionaryKey.java

@@ -147,6 +147,7 @@ public interface DictionaryKey {
             put("智能生产保障系统", "BZ_361,BZ_362,BZ_363");
             put("智能生产保障系统", "BZ_361,BZ_362,BZ_363");
             put("框体类加工单元", "KT_121,KT_122");
             put("框体类加工单元", "KT_121,KT_122");
             put("舱体类加工单元", "CT_121,CT_122");
             put("舱体类加工单元", "CT_121,CT_122");
+            put("allJbw", "BZ_361,BZ_362,BZ_363,KT_121,KT_122,CT_121,CT_122");
 
 
             // 示范线配置
             // 示范线配置
 //            put("质量中心", "R3,R4");
 //            put("质量中心", "R3,R4");

+ 27 - 7
imcs-admin-boot/imcs-common/src/main/java/com/github/zuihou/common/util/StringUtil.java

@@ -1,5 +1,6 @@
 package com.github.zuihou.common.util;
 package com.github.zuihou.common.util;
 
 
+import cn.hutool.core.collection.CollectionUtil;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.ClassPathResource;
 
 
 import java.io.BufferedReader;
 import java.io.BufferedReader;
@@ -95,7 +96,7 @@ public class StringUtil {
 	/**
 	/**
 	 * 将数组中的字符串转换成可供子查询的字符串,格式: '1','2','3','4'.
 	 * 将数组中的字符串转换成可供子查询的字符串,格式: '1','2','3','4'.
 	 *
 	 *
-	 * @param ids
+	 * @param id
 	 * @return 指定格式的字符串
 	 * @return 指定格式的字符串
 	 * @author weidong
 	 * @author weidong
 	 */
 	 */
@@ -114,10 +115,32 @@ public class StringUtil {
 		}
 		}
 		return tempStr;
 		return tempStr;
 	}
 	}
+
+	/**
+	 * 将数组中的字符串转换成可供子查询的字符串,格式: '1','2','3','4'.
+	 *
+	 * @param resourceNos
+	 * @return 指定格式的字符串
+	 * @author weidong
+	 */
+	public static final String changeIdsArrToSubQueryStr(List<String> resourceNos) {
+		String tempStr = "";
+		if (CollectionUtil.isEmpty(resourceNos)) {
+			return "''";
+		}
+		for (int i = 0; i < resourceNos.size(); i++) {
+			if (i != resourceNos.size() - 1) { // 需要加,
+				tempStr = tempStr + "'" + resourceNos.get(i) + "',";
+			} else {
+				tempStr = tempStr + "'" + resourceNos.get(i) + "'";
+			}
+		}
+		return tempStr;
+	}
 	/**
 	/**
      * 将数组中的字符串转换成可供子查询的字符串,格式: 1;2;3;4
      * 将数组中的字符串转换成可供子查询的字符串,格式: 1;2;3;4
      *
      *
-     * @param ids
+     * @param id
      * @return 指定格式的字符串
      * @return 指定格式的字符串
      * @author weidong
      * @author weidong
      */
      */
@@ -187,7 +210,7 @@ public class StringUtil {
 	/**
 	/**
      * 将集合中的字符串转换成可供子查询的字符串,格式: '1','2','3','4'
      * 将集合中的字符串转换成可供子查询的字符串,格式: '1','2','3','4'
      *
      *
-     * @param idsLst 存放ID的集合
+     * @param set 存放ID的集合
      * @return 指定格式的字符串
      * @return 指定格式的字符串
      * @author weidong
      * @author weidong
      */
      */
@@ -238,7 +261,7 @@ public class StringUtil {
 	/**
 	/**
 	 * 判断字符串数组是否为空或NULL.
 	 * 判断字符串数组是否为空或NULL.
 	 *
 	 *
-	 * @param str
+	 * @param arr
 	 * @author weidong
 	 * @author weidong
 	 */
 	 */
 	public static boolean isStrArrEmpty(String[] arr) {
 	public static boolean isStrArrEmpty(String[] arr) {
@@ -411,7 +434,6 @@ public class StringUtil {
 	/**
 	/**
 	 * 获取XML头文件.
 	 * 获取XML头文件.
 	 *
 	 *
-	 * @param args
 	 */
 	 */
 	public static String getXmlHeader() {
 	public static String getXmlHeader() {
 		return "<?xml version=\"1.0\" encoding=\"GBK\"?>";
 		return "<?xml version=\"1.0\" encoding=\"GBK\"?>";
@@ -434,7 +456,6 @@ public class StringUtil {
 
 
 	/**
 	/**
 	 * 随机生成3位随机数.
 	 * 随机生成3位随机数.
-	 * @param weidong
 	 */
 	 */
 	public static String generateThreeNumber() throws Exception {
 	public static String generateThreeNumber() throws Exception {
 		int random = new java.util.Random().nextInt(100);
 		int random = new java.util.Random().nextInt(100);
@@ -459,7 +480,6 @@ public class StringUtil {
 	/**
 	/**
 	 * 生成六位数字的随机数.
 	 * 生成六位数字的随机数.
 	 *
 	 *
-	 * @param args
 	 */
 	 */
 	public static String generateSixValidateCode() {
 	public static String generateSixValidateCode() {
 		int sixNum = new java.util.Random().nextInt(1000000);
 		int sixNum = new java.util.Random().nextInt(1000000);

+ 2 - 2
imcs-admin-boot/imcs-common/src/main/java/com/github/zuihou/common/util/UniqueKeyGenerator.java

@@ -24,7 +24,7 @@ public class UniqueKeyGenerator {
         return uuidSbBuffer.toString();
         return uuidSbBuffer.toString();
     }
     }
 
 
-    public static String getUniqueKeyStartWithTimestamp(int length){
+    public static synchronized String getUniqueKeyStartWithTimestamp(int length){
         try{
         try{
             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
             SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
             String timestampStr = sdf.format(new Date());
             String timestampStr = sdf.format(new Date());
@@ -38,7 +38,7 @@ public class UniqueKeyGenerator {
         return getUniqueKey(length);
         return getUniqueKey(length);
     }
     }
 
 
-    public synchronized static String getUniqueKeyStartWithTimestamp(){
+    public static String getUniqueKeyStartWithTimestamp(){
         return getUniqueKeyStartWithTimestamp(32);
         return getUniqueKeyStartWithTimestamp(32);
     }
     }
 }
 }