Browse Source

rev: 修改设备监控大屏

master
李永德 2 years ago
parent
commit
0ae1452882
  1. 4
      lms/nladmin-system/src/main/java/org/nl/wms/cockpit/rest/CockpitController.java
  2. 3
      lms/nladmin-system/src/main/java/org/nl/wms/cockpit/service/CockpitService.java
  3. 79
      lms/nladmin-system/src/main/java/org/nl/wms/cockpit/service/impl/CockpitServiceImpl.java
  4. 36
      lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/DeviceEnum.java

4
lms/nladmin-system/src/main/java/org/nl/wms/cockpit/rest/CockpitController.java

@ -22,6 +22,8 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
/**
* 大屏数据1
@ -82,7 +84,7 @@ public class CockpitController{
@PostMapping("/deviceMonitor")
@Log("设备监控")
@ApiOperation("设备监控")
public CommonResult<List<DeviceInfoDto>> deviceMonitor() {
public CommonResult<ConcurrentHashMap<String,List<DeviceInfoDto>>> deviceMonitor() {
return RestBusinessTemplate.execute(cockpitService::deviceMonitor);
}

3
lms/nladmin-system/src/main/java/org/nl/wms/cockpit/service/CockpitService.java

@ -8,6 +8,7 @@ import org.nl.wms.cockpit.service.dto.SchBasePointDto;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;
/**
* 大屏服务接口1
@ -43,7 +44,7 @@ public interface CockpitService{
*
* @return 返回结果集
*/
List<DeviceInfoDto> deviceMonitor();
ConcurrentHashMap<String,List<DeviceInfoDto>> deviceMonitor();
/**
* 根据point_id获取设备信息

79
lms/nladmin-system/src/main/java/org/nl/wms/cockpit/service/impl/CockpitServiceImpl.java

@ -22,10 +22,7 @@ import java.math.BigDecimal;
import java.time.Duration;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.*;
/**
* 大屏服务实现1
@ -36,7 +33,7 @@ import java.util.concurrent.ThreadPoolExecutor;
@Service
@RequiredArgsConstructor
@Slf4j
public class CockpitServiceImpl implements CockpitService{
public class CockpitServiceImpl implements CockpitService {
/**
* 生产统计大屏
@ -45,14 +42,14 @@ public class CockpitServiceImpl implements CockpitService{
* @since 2023/2/27
*/
@Override
public ConcurrentHashMap<String,Object> productionStatistics() {
public ConcurrentHashMap<String, Object> productionStatistics() {
ThreadPoolExecutor pool = ThreadPoolExecutorUtil.getPoll();
ConcurrentHashMap<String,Object> map = new ConcurrentHashMap<>(3);
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>(3);
// 1、获取生产任务列表
CompletableFuture<List<WorkorderDto>> productionTask = CompletableFuture.supplyAsync(() -> {
List<WorkorderDto> res = new CopyOnWriteArrayList<>();
JSONArray result = WQL.getWO("COCKPIT_PRODUCTION").addParam("flag", "1").process().getResultJSONArray(0);
if(ObjectUtil.isNotEmpty(result)) {
if (ObjectUtil.isNotEmpty(result)) {
res = result.toJavaList(WorkorderDto.class);
// res.forEach(r -> {
// r.setCust_name("新余钢铁");
@ -94,7 +91,7 @@ public class CockpitServiceImpl implements CockpitService{
finishedTask.thenAccept((result) -> {
List<ProductionStatisticsDto> planRes = new CopyOnWriteArrayList<>();
List<ProductionStatisticsDto> finishedRes = new CopyOnWriteArrayList<>();
if(ObjectUtil.isNotEmpty(result)) {
if (ObjectUtil.isNotEmpty(result)) {
//成品计划完成情况,应前端要求分开两个一样的数据结果,简化调用数据采集
planRes = result.toJavaList(ProductionStatisticsDto.class);
setResultComplete(planRes);
@ -111,7 +108,7 @@ public class CockpitServiceImpl implements CockpitService{
return null;
});
CompletableFuture<Void> allQuery = CompletableFuture.allOf(productionTask, materialTask, finishedTask);
CompletableFuture<ConcurrentHashMap<String,Object>> future = allQuery.thenApply((result) -> map).exceptionally((e) -> {
CompletableFuture<ConcurrentHashMap<String, Object>> future = allQuery.thenApply((result) -> map).exceptionally((e) -> {
log.error(e.getMessage(), e);
return null;
});
@ -126,22 +123,22 @@ public class CockpitServiceImpl implements CockpitService{
* @since 2023/2/27
*/
@Override
public ConcurrentHashMap<String,Object> storageMonitor() {
public ConcurrentHashMap<String, Object> storageMonitor() {
ThreadPoolExecutor pool = ThreadPoolExecutorUtil.getPoll();
ConcurrentHashMap<String,Object> map = new ConcurrentHashMap<>(2);
ConcurrentHashMap<String, Object> map = new ConcurrentHashMap<>(2);
// 1、获取原料仓储信息
CompletableFuture<List<SchBasePointDto>> materialStorage = CompletableFuture.supplyAsync(() -> {
List<SchBasePointDto> res = new CopyOnWriteArrayList<>();
// 查找所有困料货架
JSONArray result = WQL.getWO("COCKPIT_STORAGE").addParam("flag", "1").process().getResultJSONArray(0);
if(ObjectUtil.isNotEmpty(result)) {
if (ObjectUtil.isNotEmpty(result)) {
res = result.toJavaList(SchBasePointDto.class);
res.forEach(schBasePointDto -> {
//Todo 空盅和强制完成状态相关逻辑待完善
//根据入库时间和静置时间判断静置状态
getStandingStatus(schBasePointDto);
//是否满托
if(StringUtils.isNotEmpty(schBasePointDto.getIs_full())) {
if (StringUtils.isNotEmpty(schBasePointDto.getIs_full())) {
schBasePointDto.setIs_full(IsOrNotEnum.getName(schBasePointDto.getIs_full()));
}
});
@ -163,7 +160,7 @@ public class CockpitServiceImpl implements CockpitService{
CompletableFuture<List<SchBasePointDto>> finishedStorage = CompletableFuture.supplyAsync(() -> {
List<SchBasePointDto> res = new CopyOnWriteArrayList<>();
JSONArray result = WQL.getWO("COCKPIT_STORAGE").addParam("flag", "2").process().getResultJSONArray(0);
if(ObjectUtil.isNotEmpty(result)) {
if (ObjectUtil.isNotEmpty(result)) {
res = result.toJavaList(SchBasePointDto.class);
}
return res;
@ -180,7 +177,7 @@ public class CockpitServiceImpl implements CockpitService{
return null;
});
CompletableFuture<Void> allQuery = CompletableFuture.allOf(materialStorage, finishedStorage);
CompletableFuture<ConcurrentHashMap<String,Object>> future = allQuery.thenApply((result) -> map).exceptionally((e) -> {
CompletableFuture<ConcurrentHashMap<String, Object>> future = allQuery.thenApply((result) -> map).exceptionally((e) -> {
log.error(e.getMessage(), e);
return null;
});
@ -195,9 +192,9 @@ public class CockpitServiceImpl implements CockpitService{
* @since 2023/3/1
*/
@Override
public SchBasePointDto findStorageById(Map<String,String> id) {
public SchBasePointDto findStorageById(Map<String, String> id) {
JSONObject rows = WQL.getWO("COCKPIT_STORAGE").addParam("flag", "3").addParam("point_id", id.get("id")).process().uniqueResult(0);
if(ObjectUtil.isNotEmpty(rows)) {
if (ObjectUtil.isNotEmpty(rows)) {
SchBasePointDto res = rows.toJavaObject(SchBasePointDto.class);
getStandingStatus(res);
return res;
@ -212,9 +209,9 @@ public class CockpitServiceImpl implements CockpitService{
* @since 2023/2/28
*/
@Override
public List<DeviceInfoDto> deviceMonitor() {
public ConcurrentHashMap<String, List<DeviceInfoDto>> deviceMonitor() {
List<DeviceInfoDto> res;
ConcurrentHashMap<String,List<DeviceInfoDto>> map = new ConcurrentHashMap<>();
ConcurrentHashMap<String, List<DeviceInfoDto>> map = new ConcurrentHashMap<>();
JSONArray result = WQL.getWO("COCKPIT_DEVICE")
.addParam("flag", "3")
.process()
@ -224,15 +221,32 @@ public class CockpitServiceImpl implements CockpitService{
return null;
}
JSONArray data = ObjectUtil.isNotEmpty(
devicesStatus.getJSONArray("data"))?devicesStatus.getJSONArray("data"):result;
if(ObjectUtil.isNotEmpty(data)) {
devicesStatus.getJSONArray("data")) ? devicesStatus.getJSONArray("data") : result;
// 初始画数据
for (int i = 1; i <= 13; i++) {
DeviceEnum deviceEnum = DeviceEnum.getByModel(String.valueOf(i));
if (ObjectUtil.isEmpty(map.get(deviceEnum.getKeyName()))) {
List<DeviceInfoDto> de = new ArrayList<>();
map.put(deviceEnum.getKeyName(), de);
}
}
if (ObjectUtil.isNotEmpty(data)) {
res = data.toJavaList(DeviceInfoDto.class);
res.forEach(d -> {
DeviceEnum deviceEnum = DeviceEnum.get(d.getDevice_model(), d.getDevice_code());
DeviceEnum deviceEnum = DeviceEnum.getByModel(d.getDevice_model());
// 添加图片名字
d.setDevice_url(deviceEnum.getPictureName());
// 分类链表
if (ObjectUtil.isEmpty(map.get(deviceEnum.getKeyName()))) {
List<DeviceInfoDto> de = new ArrayList<>();
de.add(d);
map.put(deviceEnum.getKeyName(), de);
} else {
map.get(deviceEnum.getKeyName()).add(d);
map.put(deviceEnum.getKeyName(), map.get(deviceEnum.getKeyName()));
}
});
return res;
return map;
}
return null;
}
@ -244,9 +258,9 @@ public class CockpitServiceImpl implements CockpitService{
* @since 2023/3/1
*/
@Override
public DeviceDetailDto findDeviceById(Map<String,String> id) {
public DeviceDetailDto findDeviceById(Map<String, String> id) {
JSONObject rows = WQL.getWO("COCKPIT_DEVICE").addParam("flag", "2").addParam("point_id", id.get("id")).process().uniqueResult(0);
if(ObjectUtil.isNotEmpty(rows)) {
if (ObjectUtil.isNotEmpty(rows)) {
DeviceDetailDto deviceDetailDto = rows.toJavaObject(DeviceDetailDto.class);
//Todo 点击设备弹窗临时演示数据,后面需要根据业务逻辑查询
deviceDetailDto.setReal_qty("1500");
@ -292,9 +306,9 @@ public class CockpitServiceImpl implements CockpitService{
* @since 2023/3/1
*/
@Override
public Map<String,Object> workshopCondition() {
public Map<String, Object> workshopCondition() {
//Todo 车间设备情况临时演示数据,后面需要根据业务逻辑查询
Map<String,Object> hashMap = new HashMap<>(3);
Map<String, Object> hashMap = new HashMap<>(3);
//运行情况
List<DeviceStatisticsDto> runningStatusList = new ArrayList<>();
runningStatusList.add(DeviceStatisticsDto.builder().workorder_procedure("混料").deviceQty(16).faultyDevice(2).build());
@ -335,7 +349,7 @@ public class CockpitServiceImpl implements CockpitService{
}
// 检查 2、3、4 标签值是否全部存在,如果有缺失则创建新的 ProductionStatisticsDto 对象并添加到 result 列表中
for (int i = 2; i <= 4; i++) {
if (!existingLabels.contains(i+"")) {
if (!existingLabels.contains(i + "")) {
result.add(ProductionStatisticsDto
.builder()
.workorder_procedure(ProductionStatisticsEnum.getName(String.valueOf(i)))
@ -373,14 +387,13 @@ public class CockpitServiceImpl implements CockpitService{
* 判断静置状态
*/
private void getStandingStatus(SchBasePointDto schBasePointDto) {
if(StringUtils.isNotBlank(schBasePointDto.getInstorage_time()) && null != schBasePointDto.getStanding_time()) {
if (StringUtils.isNotBlank(schBasePointDto.getInstorage_time()) && null != schBasePointDto.getStanding_time()) {
DateTime nowTime = DateUtil.parse(DateUtil.now(), DatePattern.NORM_DATETIME_FORMAT);
DateTime inStorageTime = DateUtil.parse(schBasePointDto.getInstorage_time(), DatePattern.NORM_DATETIME_FORMAT);
long minute = DateUtil.between(nowTime, inStorageTime, DateUnit.MINUTE);
if(minute < schBasePointDto.getStanding_time().longValue()) {
if (minute < schBasePointDto.getStanding_time().longValue()) {
schBasePointDto.setStanding_status("静置中");
}
else{
} else {
schBasePointDto.setStanding_status("静置完成");
}
if (schBasePointDto.getPoint_status().equals(PointEnum.POINT_STATUS_EMPTY_POSITION.getCode())) {

36
lms/nladmin-system/src/main/java/org/nl/wms/sch/manage/DeviceEnum.java

@ -8,18 +8,19 @@ import cn.hutool.core.util.StrUtil;
* @Date: 2023/3/9
*/
public enum DeviceEnum {
HLJ("1", "混料机", "HLJ", "HLJ"),
HLJ_S("2", "高速混料机", "HLJ_S", "HLJ_S"),
YZJ("3", "压机", "YZJ", "YZJ"),
YZJ_S("4", "液压机", "YZJ_S", "YZJ_S"), //
FJJXS("5", "分拣机械手", "FJJXS", "FJJXS"),
CPX("6", "拆盘线", "CPX", "CPX"),
BZX("6", "包装线", "BZX", "BZX"),
YAO("7", "窑设备", "YAO", "YAO"),
DPJ("8", "叠盘架", "DPJ", "DPJ"),
CPJ("9", "拆盘架", "CPJ", "CPJ"),
MDJXS("10", "码垛机械手", "MDJXS", "MDJXS"),
RGV("11", "RGV", "RGV", "RGV");
HLJ_S("1", "高速混料机", "HLJ", "HLJ_S"),
HLJ("2", "混料机", "HLJ", "HLJ"),
YZJ_S("3", "液压机", "YZJ", "YZJ_S"), //
YZJ("4", "压机", "YZJ", "YZJ"),
MDJXS("5", "码垛机械手", "MDJXS", "MDJXS"),
RYHJ("6", "入窑桁架", "YAO", "RYHJ"),
YAO("7", "窑", "YAO", "YAO"),
CYHJ("8", "出窑桁架", "YAO", "CYHJ"),
FJCDJXS("9", "分拣拆垛机械手", "FJJXS", "FJCDJXS"),
FJMDJXS("10", "分拣码垛机械手", "FJJXS", "FJMDJXS"),
RGV("11", "RGV", "BZX", "RGV"),
BZJ("12", "包装机", "BZX", "BZJ"),
DTJ("13", "叠托机", "BZX", "DTJ");
private final String model;
private final String name;
@ -35,7 +36,16 @@ public enum DeviceEnum {
public static DeviceEnum get(String model, String code) {
for (DeviceEnum deviceEnum : DeviceEnum.values()) {
if (code.equals(BZX.pictureName)) return BZX;
if (code.equals(BZJ.pictureName)) return BZJ;
if (StrUtil.equals(deviceEnum.model, model)) {
return deviceEnum;
}
}
return null;
}
public static DeviceEnum getByModel(String model) {
for (DeviceEnum deviceEnum : DeviceEnum.values()) {
if (StrUtil.equals(deviceEnum.model, model)) {
return deviceEnum;
}

Loading…
Cancel
Save