|
|
@ -3,37 +3,24 @@ package org.nl.wms.cockpit.service.impl; |
|
|
|
import cn.hutool.core.date.DatePattern; |
|
|
|
import cn.hutool.core.date.DateTime; |
|
|
|
import cn.hutool.core.date.DateUnit; |
|
|
|
import com.alibaba.fastjson.JSON; |
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import lombok.var; |
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
import org.checkerframework.checker.units.qual.A; |
|
|
|
import org.nl.config.thread.ThreadPoolExecutorUtil; |
|
|
|
import org.nl.modules.common.exception.BadRequestException; |
|
|
|
import org.nl.modules.common.utils.enums.IsOrNotEnum; |
|
|
|
import org.nl.modules.common.utils.enums.PointStatusEnum; |
|
|
|
import org.nl.modules.wql.WQL; |
|
|
|
import org.nl.wms.cockpit.service.CockpitService; |
|
|
|
import org.nl.wms.cockpit.service.dto.ProductionStatisticsDto; |
|
|
|
import org.nl.wms.cockpit.service.dto.SchBasePointDto; |
|
|
|
import org.nl.wms.cockpit.service.dto.WorkorderDto; |
|
|
|
import org.nl.wms.cockpit.service.dto.*; |
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
import org.springframework.data.domain.Pageable; |
|
|
|
|
|
|
|
import java.math.BigDecimal; |
|
|
|
import java.util.*; |
|
|
|
import java.util.concurrent.*; |
|
|
|
|
|
|
|
import cn.hutool.core.date.DateUtil; |
|
|
|
import cn.hutool.core.util.IdUtil; |
|
|
|
import com.alibaba.fastjson.JSONArray; |
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
import org.nl.modules.common.utils.SecurityUtils; |
|
|
|
import org.nl.modules.wql.core.bean.ResultBean; |
|
|
|
import org.nl.modules.wql.core.bean.WQLObject; |
|
|
|
import org.nl.modules.wql.util.WqlUtil; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import cn.hutool.core.util.ObjectUtil; |
|
|
|
import org.springframework.util.CollectionUtils; |
|
|
|
|
|
|
|
/** |
|
|
|
* 大屏服务实现 |
|
|
@ -54,37 +41,50 @@ public class CockpitServiceImpl implements CockpitService{ |
|
|
|
@Override |
|
|
|
public ConcurrentHashMap<String,Object> productionStatistics() { |
|
|
|
ThreadPoolExecutor pool = ThreadPoolExecutorUtil.getPoll(); |
|
|
|
ConcurrentHashMap<String,Object> map = new ConcurrentHashMap<>(); |
|
|
|
// 1、获取生产任务列表
|
|
|
|
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)) { |
|
|
|
res = result.toJavaList(WorkorderDto.class); |
|
|
|
res.forEach(r -> { |
|
|
|
r.setCust_name("新余钢铁"); |
|
|
|
if(StringUtils.isNotEmpty(r.getLabel())) { |
|
|
|
r.setLabel(r.getLabel().substring(0, 2)); |
|
|
|
r.setShift_type(r.getLabel().substring(0, 2) + "白班"); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
productionTask.thenAccept((result) -> { |
|
|
|
map.put("productionTask", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
productionTask.thenAccept((result) -> map.put("productionTask", result)).exceptionally((e) -> { |
|
|
|
log.error("获取生产任务列表: {}", e.getMessage(), e); |
|
|
|
map.put("productionTask", ""); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 2、获取原料计划完成情况
|
|
|
|
CompletableFuture<JSONArray> materialTask = CompletableFuture.supplyAsync(() -> WQL.getWO("COCKPIT_PRODUCTION").addParam("flag", "2").process().getResultJSONArray(0), pool); |
|
|
|
materialTask.thenAccept((result) -> { |
|
|
|
map.put("materialTask", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
materialTask.thenAccept((result) -> map.put("materialTask", result)).exceptionally((e) -> { |
|
|
|
log.error("获取原料计划完成情况: {}", e.getMessage(), e); |
|
|
|
map.put("materialTask", ""); |
|
|
|
return null; |
|
|
|
}); |
|
|
|
// 3、获取成品计划完成情况,今日压制量,干燥量,成品量
|
|
|
|
CompletableFuture<JSONArray> finishedTask = CompletableFuture.supplyAsync(() -> WQL.getWO("COCKPIT_PRODUCTION").addParam("flag", "3").process().getResultJSONArray(0), pool); |
|
|
|
finishedTask.thenAccept((result) -> { |
|
|
|
map.put("finishedTask", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
CompletableFuture<List<ProductionStatisticsDto>> finishedTask = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<ProductionStatisticsDto> res = new CopyOnWriteArrayList<>(); |
|
|
|
JSONArray result = WQL.getWO("COCKPIT_PRODUCTION").addParam("flag", "3").process().getResultJSONArray(0); |
|
|
|
if(ObjectUtil.isNotEmpty(result)) { |
|
|
|
res = result.toJavaList(ProductionStatisticsDto.class); |
|
|
|
res.forEach(r -> { |
|
|
|
if(StringUtils.isNotEmpty(r.getWorkorder_procedure())) { |
|
|
|
r.setWorkorder_procedure(Objects.equals(r.getWorkorder_procedure(), "2") ? "今日压制量" : Objects.equals(r.getWorkorder_procedure(), "3") ? "今日干燥量" : "今日成品量"); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
finishedTask.thenAccept((result) -> map.put("finishedTask", result)).exceptionally((e) -> { |
|
|
|
log.error("获取成品计划完成情况: {}", e.getMessage(), e); |
|
|
|
map.put("finishedTask", ""); |
|
|
|
return null; |
|
|
@ -107,7 +107,7 @@ public class CockpitServiceImpl implements CockpitService{ |
|
|
|
@Override |
|
|
|
public ConcurrentHashMap<String,Object> storageMonitor() { |
|
|
|
ThreadPoolExecutor pool = ThreadPoolExecutorUtil.getPoll(); |
|
|
|
ConcurrentHashMap<String,Object> map = new ConcurrentHashMap<>(); |
|
|
|
ConcurrentHashMap<String,Object> map = new ConcurrentHashMap<>(2); |
|
|
|
// 1、获取原料仓储信息
|
|
|
|
CompletableFuture<List<SchBasePointDto>> materialStorage = CompletableFuture.supplyAsync(() -> { |
|
|
|
List<SchBasePointDto> res = new CopyOnWriteArrayList<>(); |
|
|
@ -115,11 +115,12 @@ public class CockpitServiceImpl implements CockpitService{ |
|
|
|
if(ObjectUtil.isNotEmpty(result)) { |
|
|
|
res = result.toJavaList(SchBasePointDto.class); |
|
|
|
res.forEach(schBasePointDto -> { |
|
|
|
//Todo 空盅和强制完成状态相关逻辑待完善
|
|
|
|
//根据入库时间和静置时间判断状态静置状态
|
|
|
|
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); |
|
|
|
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()) { |
|
|
|
schBasePointDto.setStanding_status("静置中"); |
|
|
|
} |
|
|
@ -127,13 +128,15 @@ public class CockpitServiceImpl implements CockpitService{ |
|
|
|
schBasePointDto.setStanding_status("静置完成"); |
|
|
|
} |
|
|
|
} |
|
|
|
//是否满托
|
|
|
|
if(StringUtils.isNotEmpty(schBasePointDto.getIs_full())) { |
|
|
|
schBasePointDto.setIs_full(IsOrNotEnum.getName(schBasePointDto.getIs_full())); |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
materialStorage.thenAccept((result) -> { |
|
|
|
map.put("materialTask", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
materialStorage.thenAccept((result) -> map.put("materialTask", result)).exceptionally((e) -> { |
|
|
|
log.error("获取原料仓储信息: {}", e.getMessage(), e); |
|
|
|
map.put("materialTask", ""); |
|
|
|
return null; |
|
|
@ -147,9 +150,7 @@ public class CockpitServiceImpl implements CockpitService{ |
|
|
|
} |
|
|
|
return res; |
|
|
|
}, pool); |
|
|
|
finishedStorage.thenAccept((result) -> { |
|
|
|
map.put("productionTask", result); |
|
|
|
}).exceptionally((e) -> { |
|
|
|
finishedStorage.thenAccept((result) -> map.put("productionTask", result)).exceptionally((e) -> { |
|
|
|
log.error("获取成品仓储信息: {}", e.getMessage(), e); |
|
|
|
map.put("productionTask", ""); |
|
|
|
return null; |
|
|
@ -167,15 +168,111 @@ public class CockpitServiceImpl implements CockpitService{ |
|
|
|
* 设备监控大屏信息 |
|
|
|
* |
|
|
|
* @author gbx |
|
|
|
* @since 2023/2/27 |
|
|
|
* @since 2023/2/28 |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public ConcurrentHashMap<String,Object> deviceMonitor() { |
|
|
|
public List<DeviceStatusDto> deviceMonitor() { |
|
|
|
List<DeviceStatusDto> res; |
|
|
|
JSONArray result = WQL.getWO("COCKPIT_DEVICE").addParam("flag", "1").process().getResultJSONArray(0); |
|
|
|
if(ObjectUtil.isNotEmpty(result)) { |
|
|
|
res = result.toJavaList(DeviceStatusDto.class); |
|
|
|
//已工作时间
|
|
|
|
res.forEach(r -> { |
|
|
|
//Todo 设备运行时间和图标相关暂为固定值,逻辑待完善
|
|
|
|
//设备运行时间
|
|
|
|
r.setWork_time("3.5 小时"); |
|
|
|
//设备监控图标
|
|
|
|
r.setDevice_url("ylj"); |
|
|
|
//设备运行状态
|
|
|
|
if(StringUtils.isNotEmpty(r.getPoint_status())) { |
|
|
|
r.setPoint_status(PointStatusEnum.getName(r.getPoint_status())); |
|
|
|
} |
|
|
|
}); |
|
|
|
return res; |
|
|
|
} |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 根据point_id获取设备信息 |
|
|
|
* |
|
|
|
* @author gbx |
|
|
|
* @since 2023/3/1 |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public ConcurrentHashMap<String,Object> workshopCondition() { |
|
|
|
public DeviceDetailDto findDeviceById(String id) { |
|
|
|
JSONObject rows = WQL.getWO("COCKPIT_DEVICE").addParam("flag", "2").addParam("point_id", id).process().uniqueResult(0); |
|
|
|
if(ObjectUtil.isNotEmpty(rows)) { |
|
|
|
DeviceDetailDto deviceDetailDto = rows.toJavaObject(DeviceDetailDto.class); |
|
|
|
//Todo 点击设备弹窗临时演示数据,后面需要根据业务逻辑查询
|
|
|
|
deviceDetailDto.setReal_qty("1500 KG"); |
|
|
|
deviceDetailDto.setVehicle_code("L007"); |
|
|
|
deviceDetailDto.setPoint_status("运行中"); |
|
|
|
deviceDetailDto.setPallet_qty("120 托"); |
|
|
|
deviceDetailDto.setMove_first_kiln("30 托"); |
|
|
|
deviceDetailDto.setWork_time("3.5 小时"); |
|
|
|
deviceDetailDto.setMove_second_kiln("30 托"); |
|
|
|
deviceDetailDto.setDevice_url("ylj"); |
|
|
|
deviceDetailDto.setSecond_kiln_qty("0 车"); |
|
|
|
deviceDetailDto.setPresent_kiln_qty("15 车"); |
|
|
|
deviceDetailDto.setVolume("20 车"); |
|
|
|
deviceDetailDto.setReady_lane("60 托"); |
|
|
|
deviceDetailDto.setFirst_kiln_qty("20 车"); |
|
|
|
deviceDetailDto.setMove_second_kiln("20 托"); |
|
|
|
deviceDetailDto.setMechanical_arm_qty("12000 块"); |
|
|
|
deviceDetailDto.setPack_qty("1200"); |
|
|
|
deviceDetailDto.setFinish_pallet_qty("120 个"); |
|
|
|
deviceDetailDto.setMechanical_pallet_qty("120 托"); |
|
|
|
deviceDetailDto.setFinish_pile_qty("12 垛"); |
|
|
|
List<ProductionInfoDto> setMixingList = new ArrayList<>(); |
|
|
|
List<ProductionInfoDto> setCrushingList = new ArrayList<>(); |
|
|
|
setMixingList.add(ProductionInfoDto.builder().productionDetails("混料23.60*0.68").productionQty("1500").weightUnitName("KG").build()); |
|
|
|
setMixingList.add(ProductionInfoDto.builder().productionDetails("混料24.00*0.89").productionQty("800").weightUnitName("KG").build()); |
|
|
|
//混碾机,破碎机本日生产信息
|
|
|
|
deviceDetailDto.setMixingList(setMixingList); |
|
|
|
setCrushingList.add(ProductionInfoDto.builder().productionDetails("压制M29*0.90*5.5-6.5M").productionQty("10000").manufacturer("新余").build()); |
|
|
|
setCrushingList.add(ProductionInfoDto.builder().productionDetails("压制Y22.00*0.80*2.5-3M").productionQty("15000").manufacturer("重钢").build()); |
|
|
|
//压力机,机械手本日生产信息
|
|
|
|
deviceDetailDto.setCrushingList(setCrushingList); |
|
|
|
//窑本日生产信息
|
|
|
|
deviceDetailDto.setMKilnList(setCrushingList); |
|
|
|
return deviceDetailDto; |
|
|
|
} |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 車间情况大屏信息 |
|
|
|
* |
|
|
|
* @author gbx |
|
|
|
* @since 2023/3/1 |
|
|
|
*/ |
|
|
|
@Override |
|
|
|
public Map<String,Object> workshopCondition() { |
|
|
|
//Todo 车间设备情况临时演示数据,后面需要根据业务逻辑查询
|
|
|
|
Map<String,Object> hashMap = new HashMap<>(3); |
|
|
|
//运行情况
|
|
|
|
List<DeviceStatisticsDto> runningStatusList = new ArrayList<>(); |
|
|
|
runningStatusList.add(DeviceStatisticsDto.builder().workorder_procedure("混料").deviceQty(16).faultyDevice(2).build()); |
|
|
|
runningStatusList.add(DeviceStatisticsDto.builder().workorder_procedure("压制").deviceQty(14).faultyDevice(1).build()); |
|
|
|
runningStatusList.add(DeviceStatisticsDto.builder().workorder_procedure("干燥").deviceQty(6).faultyDevice(0).build()); |
|
|
|
runningStatusList.add(DeviceStatisticsDto.builder().workorder_procedure("包装").deviceQty(9).faultyDevice(3).build()); |
|
|
|
//近一个月故障次数
|
|
|
|
List<DeviceStatisticsDto> faultyStatusList = new ArrayList<>(); |
|
|
|
faultyStatusList.add(DeviceStatisticsDto.builder().deviceName("压制机4").faultyFrequency(91).build()); |
|
|
|
faultyStatusList.add(DeviceStatisticsDto.builder().deviceName("压制机9").faultyFrequency(82).build()); |
|
|
|
faultyStatusList.add(DeviceStatisticsDto.builder().deviceName("混料机5").faultyFrequency(71).build()); |
|
|
|
faultyStatusList.add(DeviceStatisticsDto.builder().deviceName("压制机3").faultyFrequency(33).build()); |
|
|
|
//最近5个故障设备
|
|
|
|
List<DeviceStatisticsDto> faultyInfoList = new ArrayList<>(); |
|
|
|
faultyInfoList.add(DeviceStatisticsDto.builder().faultyTime("2023-02-15 11:09:08").deviceCode("YZJ07SL01").deviceName("压制机7").pointStatus("3").build()); |
|
|
|
faultyInfoList.add(DeviceStatisticsDto.builder().faultyTime("2023-02-15 10:24:12").deviceCode("HLJ45W15").deviceName("混料机15").pointStatus("3").build()); |
|
|
|
faultyInfoList.add(DeviceStatisticsDto.builder().faultyTime("2023-02-15 10:01:33").deviceCode("YZJ02XL01").deviceName("压制机2").pointStatus("3").build()); |
|
|
|
faultyInfoList.add(DeviceStatisticsDto.builder().faultyTime("2023-02-14 15:21:31").deviceCode("HLJ02W03").deviceName("混料机3").pointStatus("3").build()); |
|
|
|
faultyInfoList.add(DeviceStatisticsDto.builder().faultyTime("2023-02-14 11:27:24").deviceCode("YZJ0903").deviceName("压制机9").pointStatus("3").build()); |
|
|
|
hashMap.put("runningStatus", runningStatusList); |
|
|
|
hashMap.put("faultyStatus", faultyStatusList); |
|
|
|
hashMap.put("faultyInfo", faultyInfoList); |
|
|
|
return hashMap; |
|
|
|
} |
|
|
|
} |
|
|
|