43 changed files with 992 additions and 109 deletions
@ -0,0 +1,37 @@ |
|||||
|
package org.nl.wms.cockpit.controller; |
||||
|
|
||||
|
import cn.dev33.satoken.annotation.SaIgnore; |
||||
|
import io.swagger.annotations.Api; |
||||
|
import io.swagger.annotations.ApiOperation; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.nl.common.logging.annotation.Log; |
||||
|
import org.nl.wms.cockpit.service.CockpitService; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.http.HttpStatus; |
||||
|
import org.springframework.http.ResponseEntity; |
||||
|
import org.springframework.web.bind.annotation.PostMapping; |
||||
|
import org.springframework.web.bind.annotation.RequestMapping; |
||||
|
import org.springframework.web.bind.annotation.RestController; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 看板 |
||||
|
* @Date: 2023/9/25 |
||||
|
*/ |
||||
|
@Slf4j |
||||
|
@RestController |
||||
|
@Api(tags = "看板接口") |
||||
|
@RequestMapping("/api/cockpit") |
||||
|
@SaIgnore |
||||
|
public class CockPitController { |
||||
|
|
||||
|
@Autowired |
||||
|
private CockpitService cockpitService; |
||||
|
|
||||
|
@PostMapping("/press") |
||||
|
@Log("压制看板") |
||||
|
@ApiOperation("压制看板") |
||||
|
public ResponseEntity<Object> PressedMonitor(){ |
||||
|
return new ResponseEntity<>(cockpitService.PressedMonitor(), HttpStatus.OK); |
||||
|
} |
||||
|
} |
@ -0,0 +1,16 @@ |
|||||
|
package org.nl.wms.cockpit.service; |
||||
|
|
||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 看板 |
||||
|
* @Date: 2023/9/25 |
||||
|
*/ |
||||
|
public interface CockpitService { |
||||
|
/** |
||||
|
* 压制看板 |
||||
|
* @return |
||||
|
*/ |
||||
|
ConcurrentHashMap<String,Object> PressedMonitor(); |
||||
|
} |
@ -0,0 +1,14 @@ |
|||||
|
package org.nl.wms.cockpit.service.dao; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 月生产总值 |
||||
|
* @Date: 2023/9/25 |
||||
|
*/ |
||||
|
@Data |
||||
|
public class PersonnelMonthlyProductionVo { |
||||
|
private String operator; |
||||
|
private String real_qty; |
||||
|
} |
@ -0,0 +1,16 @@ |
|||||
|
package org.nl.wms.cockpit.service.dao; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 当前班次、计划生产、已生产、不合格产品数 |
||||
|
* @Date: 2023/9/25 |
||||
|
*/ |
||||
|
@Data |
||||
|
public class PressProductHeaderVo { |
||||
|
private String plan_qty; |
||||
|
private String real_qty; |
||||
|
private String unqualified_qty; |
||||
|
private String qualified_qty; |
||||
|
} |
@ -0,0 +1,25 @@ |
|||||
|
package org.nl.wms.cockpit.service.dao; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 生产任务 |
||||
|
* @Date: 2023/9/25 |
||||
|
*/ |
||||
|
@Data |
||||
|
public class ProductTaskVo { |
||||
|
private String device; |
||||
|
private String workorder_code; |
||||
|
private String team; |
||||
|
private String material_name; |
||||
|
private String planproducestart_date; |
||||
|
private String plan_qty; |
||||
|
private String real_qty; |
||||
|
private String unqualified_qty; |
||||
|
private String qualified_rate; |
||||
|
private String workorder_status; |
||||
|
private String operator; |
||||
|
private String realproducestart_date; |
||||
|
private String realproduceend_date; |
||||
|
} |
@ -0,0 +1,16 @@ |
|||||
|
package org.nl.wms.cockpit.service.dao; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 当班生产VO |
||||
|
* @Date: 2023/9/25 |
||||
|
*/ |
||||
|
@Data |
||||
|
public class ShiftProductionVo { |
||||
|
private String column_name; |
||||
|
private String qualified_qty; |
||||
|
private String unqualified_qty; |
||||
|
private String total_difference; |
||||
|
} |
@ -0,0 +1,90 @@ |
|||||
|
package org.nl.wms.cockpit.service.impl; |
||||
|
|
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.nl.config.thread.ThreadPoolExecutorUtil; |
||||
|
import org.nl.wms.cockpit.service.CockpitService; |
||||
|
import org.nl.wms.cockpit.service.dao.PersonnelMonthlyProductionVo; |
||||
|
import org.nl.wms.cockpit.service.dao.PressProductHeaderVo; |
||||
|
import org.nl.wms.cockpit.service.dao.ProductTaskVo; |
||||
|
import org.nl.wms.cockpit.service.dao.ShiftProductionVo; |
||||
|
import org.nl.wms.cockpit.service.mapper.CockPitMapper; |
||||
|
import org.nl.wms.util.CommonUtils; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
|
||||
|
import java.util.List; |
||||
|
import java.util.concurrent.CompletableFuture; |
||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||
|
import java.util.concurrent.ThreadPoolExecutor; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: |
||||
|
* @Date: 2023/9/25 |
||||
|
*/ |
||||
|
@Slf4j |
||||
|
@Service |
||||
|
public class CockpitServiceImpl implements CockpitService { |
||||
|
@Autowired |
||||
|
private CockPitMapper cockPitMapper; |
||||
|
@Override |
||||
|
public ConcurrentHashMap<String, Object> PressedMonitor() { |
||||
|
ThreadPoolExecutor pool = ThreadPoolExecutorUtil.getPoll(); |
||||
|
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>(); |
||||
|
// 1、当前班次、计划生产、已生产、不合格产品数
|
||||
|
String dayShift = CommonUtils.getDayShift(); // 白班、晚班
|
||||
|
map.put("DayShift", dayShift); |
||||
|
CompletableFuture<List<PressProductHeaderVo>> listCompletableFuture = CompletableFuture.supplyAsync( |
||||
|
() -> cockPitMapper.getPressProductHeaderList(dayShift), pool); |
||||
|
listCompletableFuture.thenAccept(result -> { |
||||
|
map.put("DayShiftList", result); |
||||
|
}).exceptionally((e) -> { |
||||
|
log.error("获取当班信息: {}", e.getMessage(), e); |
||||
|
map.put("DayShiftList", null); |
||||
|
return null; |
||||
|
}); |
||||
|
// 2、当班生产
|
||||
|
CompletableFuture<List<ShiftProductionVo>> listShiftProductionFuture = CompletableFuture.supplyAsync( |
||||
|
() -> cockPitMapper.getShiftProductionList(dayShift), pool); |
||||
|
listShiftProductionFuture.thenAccept(result -> { |
||||
|
map.put("ShiftProductionList", result); |
||||
|
}).exceptionally((e) -> { |
||||
|
log.error("当班生产: {}", e.getMessage(), e); |
||||
|
map.put("ShiftProductionList", null); |
||||
|
return null; |
||||
|
}); |
||||
|
// 3、人员月生产
|
||||
|
CompletableFuture<List<PersonnelMonthlyProductionVo>> listPersonnelMonthlyProductionFuture = CompletableFuture.supplyAsync( |
||||
|
() -> cockPitMapper.getPersonnelMonthlyProductionList(dayShift), pool); |
||||
|
listPersonnelMonthlyProductionFuture.thenAccept(result -> { |
||||
|
map.put("PersonnelMonthlyProduction", result); |
||||
|
}).exceptionally((e) -> { |
||||
|
log.error("人员月生产: {}", e.getMessage(), e); |
||||
|
map.put("PersonnelMonthlyProduction", null); |
||||
|
return null; |
||||
|
}); |
||||
|
// 4、生产任务
|
||||
|
CompletableFuture<List<ProductTaskVo>> listProductionTaskFuture = CompletableFuture.supplyAsync( |
||||
|
() -> cockPitMapper.getProductionTaskList(), pool); |
||||
|
listProductionTaskFuture.thenAccept(result -> { |
||||
|
map.put("ProductionTask", result); |
||||
|
}).exceptionally((e) -> { |
||||
|
log.error("生产任务: {}", e.getMessage(), e); |
||||
|
map.put("ProductionTask", null); |
||||
|
return null; |
||||
|
}); |
||||
|
// 提交
|
||||
|
CompletableFuture<Void> allQuery = CompletableFuture.allOf( |
||||
|
listCompletableFuture, |
||||
|
listShiftProductionFuture, |
||||
|
listPersonnelMonthlyProductionFuture, |
||||
|
listProductionTaskFuture); |
||||
|
CompletableFuture<ConcurrentHashMap<String, Object>> future |
||||
|
= allQuery.thenApply((result) -> map).exceptionally((e) -> { |
||||
|
log.error(e.getMessage(), e); |
||||
|
return null; |
||||
|
}); |
||||
|
future.join(); |
||||
|
return map; |
||||
|
} |
||||
|
} |
@ -0,0 +1,23 @@ |
|||||
|
package org.nl.wms.cockpit.service.mapper; |
||||
|
|
||||
|
import org.nl.wms.cockpit.service.dao.PersonnelMonthlyProductionVo; |
||||
|
import org.nl.wms.cockpit.service.dao.PressProductHeaderVo; |
||||
|
import org.nl.wms.cockpit.service.dao.ProductTaskVo; |
||||
|
import org.nl.wms.cockpit.service.dao.ShiftProductionVo; |
||||
|
|
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: |
||||
|
* @Date: 2023/9/25 |
||||
|
*/ |
||||
|
public interface CockPitMapper { |
||||
|
List<PressProductHeaderVo> getPressProductHeaderList(String dayShift); |
||||
|
|
||||
|
List<ShiftProductionVo> getShiftProductionList(String dayShift); |
||||
|
|
||||
|
List<PersonnelMonthlyProductionVo> getPersonnelMonthlyProductionList(String dayShift); |
||||
|
|
||||
|
List<ProductTaskVo> getProductionTaskList(); |
||||
|
} |
@ -0,0 +1,65 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
||||
|
<mapper namespace="org.nl.wms.cockpit.service.mapper.CockPitMapper"> |
||||
|
<select id="getPressProductHeaderList" resultType="org.nl.wms.cockpit.service.dao.PressProductHeaderVo"> |
||||
|
SELECT |
||||
|
SUM(w.plan_qty) AS plan_qty, |
||||
|
SUM(w.real_qty) AS real_qty, |
||||
|
SUM(w.qualified_qty) AS qualified_qty, |
||||
|
SUM(w.unqualified_qty) AS unqualified_qty |
||||
|
FROM |
||||
|
pdm_bd_workorder w |
||||
|
WHERE |
||||
|
DATE( w.produce_date ) = CURDATE() AND w.team = #{dayShift}; |
||||
|
</select> |
||||
|
<select id="getShiftProductionList" resultType="org.nl.wms.cockpit.service.dao.ShiftProductionVo"> |
||||
|
SELECT |
||||
|
w.point_name AS column_name, |
||||
|
SUM(w.qualified_qty) AS qualified_qty, |
||||
|
SUM(w.unqualified_qty) AS unqualified_qty, |
||||
|
SUM(w.plan_qty - w.qualified_qty - w.unqualified_qty) AS total_difference |
||||
|
FROM |
||||
|
`pdm_bd_workorder` w |
||||
|
WHERE |
||||
|
DATE( w.produce_date ) = CURDATE() |
||||
|
AND w.team = #{dayShift} |
||||
|
GROUP BY w.point_name |
||||
|
</select> |
||||
|
<select id="getPersonnelMonthlyProductionList" |
||||
|
resultType="org.nl.wms.cockpit.service.dao.PersonnelMonthlyProductionVo"> |
||||
|
SELECT |
||||
|
w.operator, |
||||
|
SUM(w.real_qty) AS real_qty |
||||
|
FROM |
||||
|
`pdm_bd_workorder` w |
||||
|
WHERE DATE_FORMAT(w.produce_date, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m') AND w.team = '白班' |
||||
|
GROUP BY w.operator |
||||
|
</select> |
||||
|
<select id="getProductionTaskList" resultType="org.nl.wms.cockpit.service.dao.ProductTaskVo"> |
||||
|
SELECT |
||||
|
w.point_name AS device, |
||||
|
w.workorder_code, |
||||
|
w.team, |
||||
|
m.material_name, |
||||
|
w.planproducestart_date, |
||||
|
w.plan_qty, |
||||
|
w.real_qty, |
||||
|
w.unqualified_qty, |
||||
|
((w.qualified_qty / w.plan_qty) * 100) AS qualified_rate, |
||||
|
CASE w.workorder_status |
||||
|
WHEN '1' THEN '未生产' |
||||
|
WHEN '2' THEN '已下发' |
||||
|
WHEN '3' THEN '生产中' |
||||
|
WHEN '4' THEN '暂停' |
||||
|
WHEN '5' THEN '完成' |
||||
|
ELSE '' |
||||
|
END AS workorder_status, |
||||
|
w.operator, |
||||
|
IF(LENGTH(w.realproducestart_date)>0,w.realproducestart_date,'-') AS realproducestart_date, |
||||
|
IF(LENGTH(w.realproduceend_date)>0,w.realproduceend_date,'-') AS realproduceend_date |
||||
|
FROM |
||||
|
`pdm_bd_workorder` w |
||||
|
LEFT JOIN md_base_material m ON m.material_id = w.material_id |
||||
|
ORDER BY w.team DESC, w.workorder_status |
||||
|
</select> |
||||
|
</mapper> |
@ -0,0 +1,63 @@ |
|||||
|
package org.nl.wms.ext.mes.autotask; |
||||
|
|
||||
|
import cn.hutool.core.date.DateUtil; |
||||
|
import cn.hutool.core.util.IdUtil; |
||||
|
import lombok.SneakyThrows; |
||||
|
import lombok.extern.slf4j.Slf4j; |
||||
|
import org.nl.system.service.notice.ISysNoticeService; |
||||
|
import org.nl.wms.ext.mes.service.WmsToMesService; |
||||
|
import org.nl.wms.ext.mes.service.dao.mapper.MesRequestMapper; |
||||
|
import org.nl.wms.ext.mes.service.dto.MesGdyInfoWaitDto; |
||||
|
import org.nl.wms.sch.task_manage.GeneralDefinition; |
||||
|
import org.nl.wms.sch.task_manage.enums.NoticeTypeEnum; |
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.core.annotation.Order; |
||||
|
import org.springframework.stereotype.Component; |
||||
|
|
||||
|
import java.util.List; |
||||
|
import java.util.concurrent.atomic.AtomicInteger; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 定时保存待入窑 |
||||
|
* @Date: 2023/9/22 |
||||
|
*/ |
||||
|
|
||||
|
@Slf4j |
||||
|
@Component |
||||
|
@Order(value = 1) |
||||
|
public class AutoSaveWaitGdyInfo { |
||||
|
@Autowired |
||||
|
private WmsToMesService wmsToMesService; |
||||
|
@Autowired |
||||
|
private MesRequestMapper mesRequestMapper; |
||||
|
@Autowired |
||||
|
private ISysNoticeService noticeService; |
||||
|
@SneakyThrows |
||||
|
public void run() { |
||||
|
// 获取滚筒线内数据
|
||||
|
List<MesGdyInfoWaitDto> list = wmsToMesService.getAllWaitIntoGdyInfos(); |
||||
|
AtomicInteger successNum = new AtomicInteger(); |
||||
|
long startTime = System.currentTimeMillis(); |
||||
|
// 存入表中
|
||||
|
list.forEach(mesGdyInfoWaitDto -> { |
||||
|
mesGdyInfoWaitDto.setMSGID(IdUtil.getSnowflake(1,1).nextIdStr()); |
||||
|
mesGdyInfoWaitDto.setSEND_TM(DateUtil.now()); |
||||
|
mesGdyInfoWaitDto.setPRO_SUBUNIT("块"); |
||||
|
mesGdyInfoWaitDto.setCREATE_TM(DateUtil.now()); |
||||
|
mesGdyInfoWaitDto.setOP_FLAG(GeneralDefinition.NO); |
||||
|
// 插入
|
||||
|
try { |
||||
|
mesRequestMapper.insertGdyMaterialWait(mesGdyInfoWaitDto); |
||||
|
successNum.incrementAndGet(); |
||||
|
} catch (Exception e) { |
||||
|
log.error("插入窑前失败的数据: {}", mesGdyInfoWaitDto); |
||||
|
log.error("插入窑前失败的信息:{}", e.getMessage()); |
||||
|
// notice通知
|
||||
|
noticeService.createNotice(e.getMessage(), "窑前数据同步失败" + mesGdyInfoWaitDto.getMSGID(), NoticeTypeEnum.NOTIFICATION.getCode()); |
||||
|
} |
||||
|
}); |
||||
|
long endTime = System.currentTimeMillis(); |
||||
|
log.info("窑前数据有" + list.size() + "条,成功" + successNum.get() + "条, 消耗时长:" + (endTime - startTime) + "ms"); |
||||
|
} |
||||
|
} |
@ -0,0 +1,47 @@ |
|||||
|
package org.nl.wms.ext.mes.service.dto; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 带入窑实体 |
||||
|
* @Date: 2023/9/22 |
||||
|
* 二维码 |
||||
|
* 发送时间 |
||||
|
* 托盘编号 |
||||
|
* 物料编码 |
||||
|
* 物料名称 |
||||
|
* 规格 |
||||
|
* 型号 |
||||
|
* 批次号 |
||||
|
* 压机号 |
||||
|
* 重量 |
||||
|
* 重量单位 |
||||
|
* 数量 |
||||
|
* 数量单位 |
||||
|
* 单位转换率 |
||||
|
* 写入时间 |
||||
|
* 读取标志,0未读取,1已读取 |
||||
|
* 读取时间 |
||||
|
*/ |
||||
|
@Data |
||||
|
public class MesGdyInfoWaitDto { |
||||
|
private String MSGID; |
||||
|
private String SEND_TM; |
||||
|
private String TRAY_NO; |
||||
|
private String FPRODUCT_MATERIAL_ID; |
||||
|
private String FPRODUCT_MATERIAL_NAME; |
||||
|
private String FMATSPEC; |
||||
|
private String FMATMODEL; |
||||
|
private String BATCHNO; |
||||
|
private String PRESSUNIT; |
||||
|
private String PRO_NUM; |
||||
|
private String PRO_UNIT; |
||||
|
private String PRO_SUBNUM; |
||||
|
private String PRO_SUBUNIT; |
||||
|
private String FCONVERTRATE; |
||||
|
private String CREATE_TM; |
||||
|
private String OP_FLAG; |
||||
|
private String OP_TM; |
||||
|
|
||||
|
} |
@ -0,0 +1,18 @@ |
|||||
|
package org.nl.wms.pda.service.dao.dto; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
import java.math.BigDecimal; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 混碾搬运参数 |
||||
|
* @Date: 2023/9/21 |
||||
|
*/ |
||||
|
@Data |
||||
|
public class BlendingMoveDto { |
||||
|
private String vehicle_code; |
||||
|
private String start_point_code; |
||||
|
private String end_point_code; |
||||
|
private BigDecimal material_weight; |
||||
|
} |
@ -0,0 +1,14 @@ |
|||||
|
package org.nl.wms.pda.service.dao.dto; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 强制静置实体 |
||||
|
* @Date: 2023/9/25 |
||||
|
*/ |
||||
|
@Data |
||||
|
public class ForcedRestingDto { |
||||
|
private Integer stand_time; // 静置时间
|
||||
|
private String group_id; // 组盘标识
|
||||
|
} |
@ -0,0 +1,19 @@ |
|||||
|
package org.nl.wms.pda.service.dao.vo; |
||||
|
|
||||
|
import lombok.Data; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 显示静置时间 |
||||
|
* @Date: 2023/9/25 |
||||
|
*/ |
||||
|
@Data |
||||
|
public class StandTimeShowVo { |
||||
|
private String group_id; |
||||
|
private String point_code; |
||||
|
private String device_code; |
||||
|
private Integer standing_time; |
||||
|
private double timeDifferenceMinutes; // 剩余时间
|
||||
|
// 格式化预计完成时间为字符串
|
||||
|
private String estimatedCompletionTimeString; |
||||
|
} |
@ -0,0 +1,57 @@ |
|||||
|
package org.nl.wms.util; |
||||
|
|
||||
|
import java.io.IOException; |
||||
|
import java.sql.Connection; |
||||
|
import java.sql.DriverManager; |
||||
|
import java.sql.SQLException; |
||||
|
import java.util.Arrays; |
||||
|
import java.util.List; |
||||
|
|
||||
|
/** |
||||
|
* @Author: lyd |
||||
|
* @Description: 备份数据库 |
||||
|
* @Date: 2023/9/25 |
||||
|
*/ |
||||
|
public class DatabaseBackup { |
||||
|
public static void main(String[] args) { |
||||
|
String jdbcUrl = "jdbc:mysql://localhost:3306/rtmg_lms"; |
||||
|
String username = "root"; |
||||
|
String password = "12356"; |
||||
|
|
||||
|
try { |
||||
|
Connection connection = DriverManager.getConnection(jdbcUrl, username, password); |
||||
|
// 在这里执行备份操作
|
||||
|
String backupPath = "D:\\backup.sql"; // 备份文件保存的路径
|
||||
|
// 构建备份命令
|
||||
|
List<String> command = Arrays.asList( |
||||
|
"mysqldump", |
||||
|
"--host=localhost", |
||||
|
"--port=3306", |
||||
|
"--user=" + username, |
||||
|
"--password=" + password, |
||||
|
"--result-file=" + backupPath, |
||||
|
"--databases", "rtmg_lms", |
||||
|
"--force" |
||||
|
); |
||||
|
// 执行备份命令
|
||||
|
ProcessBuilder processBuilder = new ProcessBuilder(command); |
||||
|
Process process = processBuilder.start(); |
||||
|
int exitCode = process.waitFor(); |
||||
|
|
||||
|
if (exitCode == 0) { |
||||
|
System.out.println("备份成功!"); |
||||
|
} else { |
||||
|
System.out.println("备份失败!"); |
||||
|
} |
||||
|
connection.close(); |
||||
|
} catch (SQLException e) { |
||||
|
e.printStackTrace(); |
||||
|
} catch (IOException e) { |
||||
|
throw new RuntimeException(e); |
||||
|
} catch (InterruptedException e) { |
||||
|
throw new RuntimeException(e); |
||||
|
} |
||||
|
|
||||
|
} |
||||
|
} |
||||
|
|
Loading…
Reference in new issue