Explorar o código

Merge branch 'master' of http://123.57.213.14:3001/zgzt/dosb-sys-java

guoqiang hai 2 meses
pai
achega
b3d61f26f8

+ 23 - 23
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/billetActual/util/ScheduleUtils.java

@@ -74,27 +74,27 @@ public class ScheduleUtils {
         }
     }
 
-    public static void main(String[] args) {
-        String[] data = {
-                "1 丙", "2 甲", "3 乙", "4 丙", "5 甲", "6 乙", "7 丙", "8 甲", "9 乙", "10 丙",
-                "11 甲", "12 乙", "13 丁", "14 丙", "15 甲", "16 丁", "17 丙", "18 甲", "19 丁", "20 丙",
-                "21 甲", "22 丁", "23 丙", "24 甲", "25 乙", "26 丁", "27 丙", "28 乙", "29 丁", "30 丙",
-                "31 乙", "32 丁", "33 丙", "34 乙", "35 丁", "36 丙", "37 甲", "38 乙", "39 丁", "40 甲",
-                "41 乙", "42 丁", "43 甲", "44 乙", "45 丁", "46 甲", "47 乙", "48 丁"
-        };
-
-        int currentUniqueShiftId = 16;
-        String currentShift = "丁";
-
-        ShiftInfo nextShiftInfo = ScheduleUtils.findNextShift(data, currentUniqueShiftId, currentShift);
-        if (nextShiftInfo == null) {
-            log.info("{}{}", "获取到下个班组信息为空!", new Date() + "自动化交班失败!");
-            return;
-        }
-
-        // 班组
-        String nextShiftGroupName = nextShiftInfo.getShift();
-        int nextUniqueShiftId = nextShiftInfo.getId();
-        String finalNextShiftGroupVal = ShiftGroupEnum.getCodeByName(nextShiftGroupName);
-    }
+//    public static void main(String[] args) {
+//        String[] data = {
+//                "1 丙", "2 甲", "3 乙", "4 丙", "5 甲", "6 乙", "7 丙", "8 甲", "9 乙", "10 丙",
+//                "11 甲", "12 乙", "13 丁", "14 丙", "15 甲", "16 丁", "17 丙", "18 甲", "19 丁", "20 丙",
+//                "21 甲", "22 丁", "23 丙", "24 甲", "25 乙", "26 丁", "27 丙", "28 乙", "29 丁", "30 丙",
+//                "31 乙", "32 丁", "33 丙", "34 乙", "35 丁", "36 丙", "37 甲", "38 乙", "39 丁", "40 甲",
+//                "41 乙", "42 丁", "43 甲", "44 乙", "45 丁", "46 甲", "47 乙", "48 丁"
+//        };
+//
+//        int currentUniqueShiftId = 16;
+//        String currentShift = "丁";
+//
+//        ShiftInfo nextShiftInfo = ScheduleUtils.findNextShift(data, currentUniqueShiftId, currentShift);
+//        if (nextShiftInfo == null) {
+//            log.info("{}{}", "获取到下个班组信息为空!", new Date() + "自动化交班失败!");
+//            return;
+//        }
+//
+//        // 班组
+//        String nextShiftGroupName = nextShiftInfo.getShift();
+//        int nextUniqueShiftId = nextShiftInfo.getId();
+//        String finalNextShiftGroupVal = ShiftGroupEnum.getCodeByName(nextShiftGroupName);
+//    }
 }

+ 8 - 0
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/push/utils/MqttClientCallback.java

@@ -254,6 +254,14 @@ public class MqttClientCallback implements MqttCallback, MqttCallbackExtended{
                         log.info("{}{}", "mqtt处理6号机自动化交班消息出错: ", e.getMessage());
                     }
                     return;
+                case SYN_STACKING_CLEARLOCATION:
+                    try {
+                        JSONObject jsonObject = JSON.parseObject(payload);
+                        stackingAndLoadingVehiclesService.stackingClearLocation(jsonObject);
+                    } catch (Exception e) {
+                        log.info("{}{}", "mqtt处理堆垛位置清空异常: ", e.getMessage());
+                    }
+                    return;
                 default:
                     break;
             }

+ 34 - 0
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/push/utils/MqttClientUtil.java

@@ -14,7 +14,10 @@ import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
 import org.springframework.stereotype.Component;
 
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 @Slf4j
@@ -217,4 +220,35 @@ public class MqttClientUtil implements ApplicationRunner {
         }
     }
 
+    public void pushCData(ConfigMqttMapper configMqttMapper, Map<String, Object> map, String topicInfo){
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        map.put("time",formatter.format(new Date()));
+        ConfigMqtt configMqtt = configMqttMapper.selectOne(new LambdaQueryWrapper<ConfigMqtt>().like(ConfigMqtt::getTopic,topicInfo).eq(ConfigMqtt::getPushOrSub,"0"));
+        MqttClient mqttClient = null;
+        try {
+            mqttClient = getMqttClient(configMqtt);
+        } catch (MqttException e) {
+            e.printStackTrace();
+        }
+        MqttTopic topic = mqttClient.getTopic(topicInfo);
+        MqttMessage message = new MqttMessage();
+        message.setPayload(JSON.toJSON(map).toString().getBytes());
+        message.setQos(0);
+        message.setRetained(true);
+        if (null == topic) {
+            log.error("topic is not exist");
+        }else{
+            MqttDeliveryToken token;//Delivery:配送
+            synchronized (topic) {//注意:这里一定要同步,否则,在多线程publish的情况下,线程会发生死锁,分析见文章最后补充
+                try {
+                    token = topic.publish(message);//也是发送到执行队列中,等待执行线程执行,将消息发送到消息中间件
+                    token.waitForCompletion(1000L);
+                } catch (MqttPersistenceException e) {
+                    e.printStackTrace();
+                } catch (MqttException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
 }

+ 10 - 1
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/push/utils/TopicType.java

@@ -57,7 +57,16 @@ public enum TopicType {
     /**
      * 6号机自动化交班
      */
-    SYN_BILLET_SIX_CHANGESHIFT("syn/billet/changeSixShift");
+    SYN_BILLET_SIX_CHANGESHIFT("syn/billet/changeSixShift"),
+
+    /**
+     * 堆垛位置清空
+     */
+    SYN_STACKING_CLEARLOCATION("syn/stacking/clearLocation"),
+    /**
+     * 坯号回传
+     */
+    SYN_STACKING_PASSBACK("syn/stacking/passback");
 
     private String topicValue;
 

+ 2 - 0
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/stackingAndLoadingVehicles/service/IStackingAndLoadingVehiclesService.java

@@ -21,4 +21,6 @@ public interface IStackingAndLoadingVehiclesService extends IService<StackingAnd
     void autoSaveStackLoading(JSONObject jsonObject);
 
     void autoDepartStackLoading(JSONObject jsonObject);
+
+    void stackingClearLocation(JSONObject jsonObject);
 }

+ 141 - 10
zgzt-sys-java/jeecg-module-conn/src/main/java/org/jeecg/modules/stackingAndLoadingVehicles/service/impl/StackingAndLoadingVehiclesServiceImpl.java

@@ -26,8 +26,12 @@ import org.jeecg.modules.billetHotsendConfig.entity.BilletHotsendTypeConfig;
 import org.jeecg.modules.billetHotsendConfig.service.IBilletHotsendTypeConfigService;
 import org.jeecg.modules.billetLiftingBill.entity.BilletLiftingBill;
 import org.jeecg.modules.billetLiftingBill.service.IBilletLiftingBillService;
+import org.jeecg.modules.connConfig.configMqtt.mapper.ConfigMqttMapper;
 import org.jeecg.modules.operateLog.entity.OperateLog;
 import org.jeecg.modules.operateLog.service.IOperateLogService;
+import org.jeecg.modules.push.utils.MqttClientCallback;
+import org.jeecg.modules.push.utils.MqttClientUtil;
+import org.jeecg.modules.push.utils.TopicType;
 import org.jeecg.modules.rollClubThree.entity.RollClubThree;
 import org.jeecg.modules.rollClubThree.entity.RollClubThreeDetails;
 import org.jeecg.modules.rollClubThree.service.IRollClubThreeDetailsService;
@@ -123,6 +127,9 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
     private IBilletLiftingBillService billetLiftingBillService;
     @Autowired
     private IOperateLogService operateLogService;
+    @Autowired
+    private ConfigMqttMapper configMqttMapper;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -407,13 +414,12 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
         }
         loadingParams.setStorageBill(isStorageBill);
 
-        log.info("{}{}", "自动化堆垛装车保存钢坯装运单数据:", JSON.toJSON(isStorageBill));
+        log.info("{}{}", "自动化堆垛装车保存StorageBill数据:", JSON.toJSON(isStorageBill));
 
         StorageBill storageBill = loadingParams.getStorageBill();
 
         // 轧钢外运保存时,先判断装运单中的目的地ID是否为1024,如果为1024、明细暂存临时表billet_auto_tmp
         if ("1024".equals(isStorageBill.getTypeConfigId())){
-            log.info("{}{}", "C端自动化堆垛外运未知目的地坯号集合:", allBilletNos);
             loadingParams.setBelongTable("billet_auto_tmp");
             loadingParams.setBilletHotsendTypeConfigId("1024");
             loadingParams.setDestinationTable("billet_auto_tmp");
@@ -432,7 +438,6 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
             loadingParams.setBelongTable(billetHotsendTypeConfigInfo.getBelongTable());
             loadingParams.setBilletHotsendTypeConfigId(billetHotsendTypeConfigInfo.getId());
         }
-        log.info("{}{}", "自动化堆垛装车保存公共容器数据:", JSON.toJSON(loadingParams.getStackingAndLoadingVehiclesList()));
 
         log.info("{}{}", "自动化堆垛装车保存热送单数据:", JSON.toJSON(billetHotsend));
 
@@ -491,7 +496,7 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
         billetBasicInfoService.saveOrUpdateBatch(billetBasicInfoList);
 
         if ("billet_auto_tmp".equals(loadingParams.getBelongTable())){
-            log.info("{}{}", "C端自动化堆垛保存去未知目的地装运单信息:", JSON.toJSON(storageBill));
+            log.info("{}{}", "C端自动化堆垛保存临时表成功,坯号集合:", allBilletNos);
             return;
         }
         // 取最新的第一条钢坯信息
@@ -501,16 +506,43 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
         storageBill.setAmountTotal((oConvertUtils.isNotEmpty(storageBill.getAmountTotal()) ? storageBill.getAmountTotal() : 0) + loadingParams.getStackingAndLoadingVehiclesList().size() * 4);
         storageBill.setDestination(loadingParams.getDestination());
         storageBill.setTypeConfigId(loadingParams.getDestinationId());
-        List<String> stringList = billetBasicInfoList.stream().map(BilletBasicInfo::getAssemblyNumber).filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber)).collect(Collectors.toList());
-        if(oConvertUtils.listIsNotEmpty(stringList)) {
-            String distinctAssemblyNumber = billetBasicInfoList.stream()
-                    .map(BilletBasicInfo::getAssemblyNumber)
-                    .filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber))
-                    .distinct().collect(Collectors.joining(","));
+
+        // 下垛时,有目的,定尺维护
+        List<Integer> sizeIntList = billetBasicInfoList.stream().map(BilletBasicInfo::getLength).filter(oConvertUtils::isNotEmpty).collect(Collectors.toList());
+        List<String> sizeStrList = sizeIntList.stream().map(String::valueOf).collect(Collectors.toList());
+        if(oConvertUtils.listIsNotEmpty(sizeStrList)) {
+            String distinctSizeStr = sizeIntList.stream()
+                    .distinct()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(","));
+            String finalSizeStr = Optional.ofNullable(storageBill.getSize())
+                    .filter(oConvertUtils::isNotEmpty)
+                    .map(s -> s + "," + distinctSizeStr)
+                    .orElse(distinctSizeStr);
+            // 对 finalSizeStr 再次去重
+            String[] sizeArray = finalSizeStr.split(",");
+            Set<String> uniqueSizes = Arrays.stream(sizeArray)
+                    .filter(s -> s != null && !s.isEmpty())
+                    .collect(Collectors.toCollection(HashSet::new));
+            finalSizeStr = String.join(",", uniqueSizes);
+            storageBill.setSize(finalSizeStr);
+        }
+
+        // 下垛时,有目的,组批号维护
+        List<String> assemblyNumberList = billetBasicInfoList.stream().map(BilletBasicInfo::getAssemblyNumber).filter(assemblyNumber -> oConvertUtils.isNotEmpty(assemblyNumber)).collect(Collectors.toList());
+        if(oConvertUtils.listIsNotEmpty(assemblyNumberList)) {
+            String distinctAssemblyNumber = assemblyNumberList.stream().distinct().collect(Collectors.joining(","));
             String finalAssemblyNumber = Optional.ofNullable(storageBill.getAssemblyNumber())
                     .filter(oConvertUtils::isNotEmpty)
                     .map(s -> s + "," + distinctAssemblyNumber)
                     .orElse(distinctAssemblyNumber);
+
+            // 对 finalAssemblyNumber 再次去重
+            String[] assemblyNumberArray = finalAssemblyNumber.split(",");
+            Set<String> uniqueAssemblyNumbers = Arrays.stream(assemblyNumberArray)
+                    .filter(s -> s != null && !s.isEmpty())
+                    .collect(Collectors.toCollection(HashSet::new));
+            finalAssemblyNumber = String.join(",", uniqueAssemblyNumbers);
             storageBill.setAssemblyNumber(finalAssemblyNumber);
         }
         storageBillService.updateById(storageBill);
@@ -748,6 +780,83 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
         log.info("{}{}", "自动化堆垛发车操作成功", billetNoLists);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void stackingClearLocation(JSONObject jsonObject) {
+        String ccmNo = jsonObject.getString("ccmNo");// 铸机号
+        String billetHotsendTypeConfigId = jsonObject.getString("billetHotsendTypeConfigId");
+        String layer = jsonObject.getString("layer");
+        String address = jsonObject.getString("address");
+        // 判断layer和address为空时直接返回
+        if (oConvertUtils.isEmpty(layer) || oConvertUtils.isEmpty(address)){
+            log.info("{}{}", "layer和address为空,自动化堆垛清空位置失败!", jsonObject);
+            return;
+        }
+        // 根据以上信息查询堆垛容器信息
+        LambdaQueryWrapper<StackingAndLoadingVehicles> queryWrapper = new LambdaQueryWrapper();
+        queryWrapper.eq(StackingAndLoadingVehicles::getCcmNo, ccmNo)
+                .eq(StackingAndLoadingVehicles::getLayer, layer)
+                .eq(StackingAndLoadingVehicles::getAddress, address)
+                .eq(StackingAndLoadingVehicles::getTypeConfigId, billetHotsendTypeConfigId);
+        List<StackingAndLoadingVehicles> stackingAndLoadingVehiclesList = baseMapper.selectList(queryWrapper);
+        if (oConvertUtils.listIsEmpty(stackingAndLoadingVehiclesList)){
+            log.info("{}{}", "自动化堆垛清空位置失败!", jsonObject);
+            return;
+        }
+        StackingAndLoadingVehicles stackingAndLoadingVehicles = stackingAndLoadingVehiclesList.stream().findFirst().orElse(null);
+        if (stackingAndLoadingVehicles == null || oConvertUtils.isEmpty(stackingAndLoadingVehicles.getBilletNos())){
+            log.info("{}{}", "该位置坯号集为空,自动化堆垛清空位置失败!", jsonObject);
+            return;
+        }
+        // 根据逗号隔开的坯号集,查询钢坯基础信息
+        String[] billetNosparts = stackingAndLoadingVehicles.getBilletNos().split(",");
+        LambdaQueryWrapper<BilletBasicInfo> queryWrapper1 = new LambdaQueryWrapper<>();
+            queryWrapper1.eq(BilletBasicInfo::getCcmNo, ccmNo);
+            queryWrapper1.in(BilletBasicInfo::getBilletNo, Arrays.asList(billetNosparts));
+        List<BilletBasicInfo> billetBasicInfoList = billetBasicInfoService.list(queryWrapper1);
+        if (oConvertUtils.listIsEmpty(billetBasicInfoList)){
+            log.info("{}{}", "钢坯基础信息为空,自动化堆垛清空位置失败!", jsonObject);
+            return;
+        }
+        // 更新钢坯基础信息 钢坯基础信息所属表、配置ID赋值
+        billetBasicInfoList.forEach(x ->{
+            x.setBelongTable(null);
+            x.setBhtcId(null);
+        });
+        // 使用 updateBatchById 方法进行批量更新
+        billetBasicInfoService.updateBatchById(billetBasicInfoList);
+
+        BilletBasicInfo billetBasicInfo = billetBasicInfoList.stream().findFirst().orElse(null);
+        // 根据ccmNo、billetBasicInfo中的heatNo、shiftgroup、shift查询热送传递单
+        LambdaQueryWrapper<BilletHotsend> queryWrapper2 = new LambdaQueryWrapper();
+        queryWrapper2.eq(BilletHotsend::getHeatNo, billetBasicInfo.getHeatNo())
+                .eq(BilletHotsend::getShift, billetBasicInfo.getShift())
+                .eq(BilletHotsend::getCcmNo, billetBasicInfo.getCcmNo())
+                .eq(BilletHotsend::getShiftGroup, billetBasicInfo.getShiftGroup());
+        BilletHotsend billetHotsend = billetHotsendBaseService.getOne(queryWrapper2);
+        if (oConvertUtils.isEmpty(billetHotsend)){
+            log.info("{}{}", "钢坯热送传递单为空,C端自动化堆垛清空位置失败", jsonObject);
+            throw new RuntimeException("钢坯热送传递单为空,C端自动化堆垛清空位置事务回滚!");
+        }
+        billetHotsend.setStackNum(Math.max(0, billetHotsend.getStackNum() - billetBasicInfoList.size()));
+        billetHotsend.setUpdateTime(new Date());
+        billetHotsendBaseService.updateById(billetHotsend);
+
+        // 发送坯号结果到mqtt
+        String billetNoLists = String.join(",", billetBasicInfoList.stream().map(BilletBasicInfo::getBilletNo).collect(Collectors.toList()));
+        try {
+            Map<String, Object> mapSendInfo = new HashMap<>();
+            mapSendInfo.put("ccmNo", ccmNo);// 铸机号
+            mapSendInfo.put("billetNos", billetNoLists);// 铸机号
+            mapSendInfo.put("clearLocationTime", DateUtils.date2Str(new Date(), DateUtils.datetimeFormat.get()));
+            MqttClientUtil mqttClientUtilBe = new MqttClientUtil();
+            mqttClientUtilBe.pushCData(configMqttMapper, mapSendInfo, TopicType.SYN_STACKING_PASSBACK.getTopicValue());
+            log.info("自动化位置清空后坯号回传,发送MQTT成功: {}", mapSendInfo);
+        } catch (Exception e) {
+            log.error("自动化位置清空后坯号回传,发送MQTT异常!", e);
+        }
+    }
+
 
     /**
      * 堆垛保存、堆垛发车公共处理
@@ -1239,6 +1348,28 @@ public class StackingAndLoadingVehiclesServiceImpl extends ServiceImpl<StackingA
         }
     }
 
+    /**
+     *  初始化堆垛公共容器
+     * @param stackingAndLoadingVehiclesList
+     */
+    private void batchUpdateStackingAndLoadingVehicles(List<StackingAndLoadingVehicles> stackingAndLoadingVehiclesList) {
+        List<String> ids = stackingAndLoadingVehiclesList.stream().map(StackingAndLoadingVehicles::getId).collect(Collectors.toList());
+        // 创建更新包装器
+        LambdaUpdateWrapper<StackingAndLoadingVehicles> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.in(StackingAndLoadingVehicles::getId, ids)
+                .set(StackingAndLoadingVehicles::getBilletNos, null)
+                .set(StackingAndLoadingVehicles::getSpec, null)
+                .set(StackingAndLoadingVehicles::getSteel, null)
+                .set(StackingAndLoadingVehicles::getSize, null)
+                .set(StackingAndLoadingVehicles::getShift, null)
+                .set(StackingAndLoadingVehicles::getHeatNo, null)
+                .set(StackingAndLoadingVehicles::getCreateDate, null)
+                .set(StackingAndLoadingVehicles::getShiftGroup, null)
+                .set(StackingAndLoadingVehicles::getUpdateTime, new Date());
+        // 执行批量更新
+        stackingAndLoadingVehiclesMapper.update(null, updateWrapper);
+    }
+
     /**
      * 封装BilletAutoException对象的方法
      *